Replaces the buggy per-character Trade ProximityPrompt — which rendered over
your OWN head (no per-viewer exclusion) — with a TCE-ported interact window.
Walk up to another player → an "[E] Interact" badge floats over THEIR head →
press E / tap → a window shows their name + survival stats and an action list.
Targeting is a client-side nearest-OTHER-player scan (self skipped in the loop,
with hysteresis to stop flicker), so the affordance can never point at you —
the reported bug is fixed by construction.
Extensible: SurvivorCore.Interact.addAction{ id, label, order?, enabled?,
onActivate } — Trade is registered as the first built-in action and just fires
the existing (server-validated) TradeRequest remote, so the invite/Accept flow
is unchanged. Cursor is freed while the window is open; the window auto-closes
on walk-away / target-leaves / death / trade-start.
- src/client/PlayerInteract.luau (new): scan + billboard + window + action registry
- src/systems/Trade.luau: delete the per-character prompt block (keep Died abort)
- src/init.luau: boot PlayerInteract, expose SurvivorCore.Interact
- src/shared/UiConfig.luau: UI.Keybinds.Interact = "E"
- docs/interact.md (new), docs/trading.md, CHANGELOG (Unreleased)
Ported from The Counter Earth's PlayerInspectService/InspectController.
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.8.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.
- Player trading — walk up, offer items, both confirm: a server-authoritative, dupe-proof face-to-face swap (nothing moves until both agree, then atomically).
- SurvivorCore Studio (no-code admin plugin) — one floating window with sidebar + search: tune every engine config section (movement, combat, mobs, loot bags, UI theme colors & fonts, …) as locked deltas that survive engine updates; create items, weapons, ammo, mobs, quests and achievements from forms; override code-registered content field-by-field; drop any of it 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.8.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