# No-code content authoring > ๐Ÿ“น **Demos:** [creating quests & achievements](https://makertube.net/w/uSGJ2MHEFjSSKxMiJBJ6Y5) ยท [creating mobs, weapons & ammo](https://makertube.net/w/tyn8JEMG3CaMbTXid8osdU) ยท [creating an item + gatherable](https://makertube.net/w/mCneurjoY3Av6yi48VsGQE) ยท [hunting, butchering & loot bags](https://makertube.net/w/oVJwYUhCKxA2ZvgvocdhwZ) The engine ships **zero** items, resources, or recipes โ€” your game supplies them. You can do this two ways, and they coexist: 1. **From code** โ€” `SurvivorCore.Items.register{โ€ฆ}`, `SurvivorCore.Resources.register{โ€ฆ}`, `SurvivorCore.Recipes.register{โ€ฆ}` before `start()` (see the demo `Boot.server.luau`). 2. **No-code, as instances** โ€” author content in the place and the engine loads it at `start()`. The **admin plugin's Content widget** writes exactly this for you. ## The `SurvivorCoreContent` folder At `start()`, the engine reads `ReplicatedStorage.SurvivorCoreContent` and registers any defs found: ``` ReplicatedStorage โ””โ”€ SurvivorCoreContent โ”œโ”€ Items (Folder) โ”‚ โ””โ”€ berry (Configuration) โ† child Name = item id โ”‚ โ€ข name = "Wild Berries" โ† attributes = def fields โ”‚ โ€ข stack = 20 โ”‚ โ€ข weight = 0.05 โ”‚ โ€ข category = "consumable" โ”œโ”€ Weapons (Folder) โ† items with category="weapon" (loaded into the Items registry) โ”‚ โ””โ”€ wood_club (Configuration) โ”‚ โ€ข category = "weapon" โ”‚ โ€ข toolType = "club" (lets the hotbar equip it) โ”‚ โ€ข weaponKind = "melee" ("melee" | "bow") โ”‚ โ€ข weaponDamage = 20 โ”œโ”€ Arrows (Folder) โ† items with category="ammo" (loaded into the Items registry) โ”‚ โ””โ”€ heavy_arrow (Configuration) โ”‚ โ€ข category = "ammo" โ”‚ โ€ข ammoDamage = 1.4 (ร— the bow's damage) โ”‚ โ€ข ammoDrop = 2 (ร— gravity = the curve) โ”‚ โ€ข ammoRange = 140 โ”œโ”€ Resources (Folder) โ”‚ โ””โ”€ berry_bush (Configuration) โ”‚ โ€ข item = "berry" โ”‚ โ€ข hp = 4 โ”‚ โ€ข requireTool = "" (blank = bare-hand) โ”‚ โ€ข yieldMin = 1 โ”‚ โ€ข yieldMax = 3 โ”œโ”€ Mobs (Folder) โ”‚ โ””โ”€ husk (Configuration) โ”‚ โ€ข faction = "hostile" ("hostile" | "passive" | "neutral") โ”‚ โ€ข health = 60 โ”‚ โ€ข aggroRange = 40 โ”‚ โ€ข carcassItem = "raw_meat" (hunting: blank = no carcass; see docs/mobs.md) โ”‚ โ€ข carcassTool = "knife" โ”œโ”€ Quests (Folder) โ† flat single-objective quests (normalized at load) โ”‚ โ””โ”€ gather_reeds (Configuration) โ”‚ โ€ข name = "Gather Reeds" โ”‚ โ€ข objectiveType = "gather" ("gather" | "craft" | "kill" | "use") โ”‚ โ€ข objectiveTarget = "reed" โ”‚ โ€ข objectiveCount = 3 โ”‚ โ€ข rewardItem = "berry" โ”‚ โ€ข rewardCount = 2 โ”‚ โ€ข autoStart = true โ”œโ”€ Achievements (Folder) โ† flat counter + threshold defs โ”‚ โ””โ”€ husk_slayer (Configuration) โ”‚ โ€ข name = "Husk Slayer" โ”‚ โ€ข counter = "kills_husk" (see docs/achievements.md for the counter catalogue) โ”‚ โ€ข threshold = 3 โ”œโ”€ Tools (Folder) โ† Tool templates the hotbar equips (named by item id) โ”œโ”€ MobModels (Folder) โ† rigged mob templates Mobs.spawn clones (named by mob id) โ”œโ”€ Carcasses (Folder) โ† carcass models spawned on mob death (named by mob id) โ””โ”€ LootBag (Model/Part) โ† the death loot-bag look (optional; placeholder otherwise) ``` Each child's **Name is the id**; its **attributes are the def fields** ([`Registry.loadFromFolder`](../src/foundation/Registry.luau) copies them verbatim). This is the same instance-config pattern the survival stats use. ## The admin plugin Content widget Open Studio โ†’ the **SurvivorCore** toolbar โ†’ **Content**. Seven builders: - **Items** โ€” create an item by id, then set Name / Max stack / Weight / Category / Tool type / Icon / Description. - **Weapons** โ€” create a weapon by id, then set Kind (melee/bow) / Damage / Range / Cooldown, plus bow Draw time / Arrow speed / Max range / Ammo item. (Weapons are items with `category = "weapon"`; they live in their own folder so this editor never collides with the Items editor.) **+ Tool model** drops a starter `Tool` (a Handle carrying the weapon's `ToolType`/`WeaponKind`) into the world so you can build the held look on it; move the finished Tool under `SurvivorCoreContent.Tools` (named by the weapon id) and the hotbar clones it when the weapon is equipped. - **Arrows / Ammo** โ€” create an arrow type by id, then set Damage ร— / Drop (curve) ร— / Max range / Speed ร— / Carry weight. A bow's *Ammo item* points at one of these. (Arrows are items with `category = "ammo"`, in their own folder โ€” see [combat.md](combat.md).) - **Gatherables** โ€” create a resource by id, then set Yields item / HP (gathers) / Tool required / Yield min / Yield max. **+ Add to World** drops a tagged `Gatherable` node. - **Mobs** โ€” create a mob type by id, then set Faction / Health / Speeds / Aggro / Leash / Attack. **+ Add to World** drops a tagged `Mob` placeholder rig (swap in your own model later). - **Quests** โ€” create a quest by id, then set Name / Description / Objective (type, target, count) / Reward (item, count) / Auto-start / Requires / Turn in. **+ Quest giver** drops a tagged `QuestGiver` post offering it (see [quests.md](quests.md)). Multi-objective chains stay code-authored, like recipes. - **Achievements** โ€” create an achievement by key, then set Name / Description / Counter / Threshold / Icon โ€” counters are the engine's auto-derived progression counters (see [achievements.md](achievements.md)). Each edit is one Studio **undo** step. Behind the scenes it creates/edits the `SurvivorCoreContent` instances above, so pressing Play registers your content with no code. ## Overrides โ€” tune code-registered defs without code The authoring folders above can't touch a def that was registered **from code** (the engine's loader skips already-registered ids โ€” code wins). The **`Overrides`** folder can: ```text SurvivorCoreContent/ โ””โ”€ Overrides (Folder) โ† mirrors the category folders above โ””โ”€ Items (Folder) โ””โ”€ berry (Configuration) โ† name of a CODE-registered def โ€ข name = "Sweet Berries" (ONLY the fields you change) โ€ข stack = 99 ``` At `start()` the engine **field-merges** each override's attributes onto the registered def โ€” before components bind and before the client data caches publish, so tooltips/recipes/gatherables all see the merged values. Rules: - **Deltas-only**: an override carries only the attributes it changes; anything absent inherits the code value. Deleting the override restores the pristine code def on the next Play. - The **id can't be renamed** by an override, and an id matching **no registered def warns in Output on Play** (`override 'x' matches no registered def`) โ€” your typo backstop. - **Quest caveat**: a code-registered quest with nested objective/reward tables ignores the flat `objective*`/`reward*` override fields (name/description/autoStart/requires/turnIn still merge). Overrides of no-code quests merge fully. The admin plugin's category pages author these for you (**+ Override**, blue pill, blank = inherit) โ€” see [admin-plugin.md](admin-plugin.md). ## Binding a world object A creator builds any mesh, tags it **`Gatherable`** (CollectionService), and sets a `Resource` attribute to a resource id (e.g. `"berry_bush"`). The node inherits item/HP/tool/yield from the def. See [harvesting.md](harvesting.md) for the full attribute list and the per-type **reaction** hooks (shake / fell / etc.). For creatures, tag a rigged Model (Humanoid + PrimaryPart) **`Mob`** and set `MobType` to a mob id (e.g. `"husk"`); it inherits faction/health/speed/ranges from the def. See [mobs.md](mobs.md) and [combat.md](combat.md). ## Tools For a tool item, set `toolType` (e.g. `"axe"`) and `category = "tool"`. To give it a custom look, place a `Tool` named by the item id under `SurvivorCoreContent.Tools`; otherwise the engine equips a plain default. Trees etc. require the matching `RequireTool`.