- Beacon: LootBagDropped fired the same frame the bag was created, so the Instance reference arrived as nil on the client (not yet replicated) and the owner beacon silently never appeared. The fire is now delayed 0.5s. - Dead looting: collect() never verified the collector was alive, so a corpse lying next to its own bag could scoop everything back before respawning. The server now rejects dead collectors (isAlive gate, Harvesting pattern). Live verification note: the running Studio session executed stale bytecode (old collect granted loot to a dead player even though the new source was synced) — verified source-in-place; behavior verification needs a Studio restart, which CI/release artifacts are unaffected by. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
SurvivorCore
A batteries-included, creator-extensible survival game engine for Roblox.
🌐 Website · 📖 Docs · 📹 Demo · ⬇ Releases
Status: v0.5.0 — pre-release. The core survival loop is in and working; the engine is being grown toward v1.0 and APIs may still shift. Production-tested in The Counter Earth.
What it is
SurvivorCore gives you the mechanics of a survival game — without dictating your content. You bring the items, world and art; the engine wires up the behavior, the UI, and the no-code authoring tools. If you know Roblox Studio, you can build a survival game.
- Survival stats & HUD — health, energy, hunger, thirst, fatigue, blood, poison; ticking, draining, and biting back, on a clean restyleable HUD.
- Inventory, hotbar & crafting — slots + carry-weight, a 9-slot hotbar, equipment, and hand crafting in a tabbed, drag-and-drop menu — server-authoritative.
- Gathering — tag any mesh
Gatherable: hold-E or tool-swing, per-hit yields, and reaction hooks (a reed sways; a tree fells and leaves a stump). - Combat — melee & bow — click to swing, or aim a bow and loose arrows that arc under real
weight. One server-validated
combat:hit/combat:killschema. - Mobs & AI — a shared FSM substrate: hostile mobs chase & attack, passive animals flee.
Behavior is data — a mob's
factionpicks the profile. - Quests & achievements — event-driven goals: quest chains with objectives, rewards and quest-giver NPCs, plus milestone achievements with toasts — both tracked automatically from what players already do (gather, craft, fight).
- Hunting & loot bags — slain animals leave butcherable carcasses (knife required, real yields); player death drops everything into a lootable bag with a countdown — get back to it before it's gone.
- No-code admin plugin — create items, weapons, ammo and mobs from a Studio form (damage, range, arrow curve, weight, aggro, leash) and drop them into the world. No scripting.
Everything is content-free by design, server-authoritative, and restyleable — the UI is real Instances driven by attributes, and every default is overridable.
Quickstart
local SurvivorCore = require(ReplicatedStorage.SurvivorCore)
-- register content from code (or author it no-code in the admin plugin)
SurvivorCore.Items.register({ id = "berry", name = "Wild Berries", stack = 20 })
SurvivorCore.Mobs.register({ id = "husk", faction = "hostile", health = 60 })
SurvivorCore.start() -- boots stats, inventory, gathering, crafting, combat, mobs…
The built-in HUD loader calls SurvivorCore.startClient() for you.
Install — drop SurvivorCore.rbxm from a Release
into ReplicatedStorage, or add it via Wally:
# wally.toml
[dependencies]
SurvivorCore = "temujincalidius/survivorcore@0.5.0"
Working from source? Clone and rojo serve the demo.project.json place.
Creator-owned, no code
Build any mesh, tag it with a component, set attributes — no engine-side definition needed:
| Tag | Set | It becomes |
|---|---|---|
Gatherable |
Resource = "oak_tree" |
a harvestable node (item/HP/tool/yield from the def) |
Mob |
MobType = "husk" |
a creature that runs the AI FSM |
For game-specific flourish (a tree that physically fells, a custom death effect), hook the engine lifecycle instead of forking it:
SurvivorCore.Gather.onReaction("oak_tree", "depleted", function(ctx) fellTrunk(ctx.instance) end)
SurvivorCore.Hooks.on("combat:kill", function(ctx) awardXp(ctx.attacker) end)
The admin plugin turns all of this into Studio forms — see docs/admin-plugin.md and docs/content-authoring.md.
Docs
Architecture · Survival stats + HUD · Inventory · Harvesting · Crafting · Combat · Mobs & AI · Quests · Achievements · Loot bags · No-code content · Admin plugin · Design language · Extending
Project layout
src/
init.luau -- SurvivorCore root: .start() / .startClient() + the public API
foundation/ -- Config, Assets, EventBridge, Hooks, Reactions, Registry
registries/ -- Items, Recipes, Resources, Stats, Mobs, …
components/ -- creator-facing tag/attribute components (Gatherable, Mob)
systems/ -- Inventory, Harvesting, Crafting, Combat, Mobs, SurvivalStats…
client/ -- HUD + UI binders, combat/harvest input
plugin/ -- the Studio admin plugin (separate Rojo tree)
demo/ -- a runnable demo place that consumes the engine
site/ -- the landing page (deployed to GitHub Pages)
docs/ -- documentation
Sponsor
SurvivorCore is free and open source. If it's useful — or you just want to help the engine grow — support development via GitHub Sponsors. 💛
License
MIT © 2026 Samuel Lison