2026-03-15 07:11:43 +02:00
# AGENTS.md — CustomNPC-Plus
## ⚠️ AGENT CONTEXT — Read First
**All documents below this line are created BY and FOR agents operating on this codebase.**
This is the master architecture reference. Before any work:
1. Read `.AGENTS/SESSION_MEMORY.md` — strategic vision, roadmap, critical decisions
2026-03-15 08:57:42 +02:00
2. Skim `.AGENTS/FORBIDDEN_PRACTICES.md` — architectural guardrails (NEVER violate these)
3. Reference `.AGENTS/MC_COUPLING_ANALYSIS.md` — what's MC-dependent, migration priority
2026-03-15 07:11:43 +02:00
**If working on multi-version porting** , also read:
- `.AGENTS/MULTI_VERSION_RESEARCH.md` — real-world strategies, tools, pitfalls
- `.AGENTS/BUILD_SYSTEM.md` — Gradle architecture, version-specific build requirements
2026-03-15 08:57:42 +02:00
- `.AGENTS/MIGRATION_ROADMAP.md` — phased migration plan with milestones
2026-03-15 07:11:43 +02:00
2026-03-15 08:57:42 +02:00
-**IMPORTANT** ALWAYS CHECK OUT `.AGENTS/SESSION_MEMORY.md` WHEN WORKING ON MIGRATING/UPPORTING THIS PROJECT TO LATER MINECRAFT VERSIONS.
2026-03-15 07:11:43 +02:00
---
## What This Is
Minecraft 1.7.10 Forge mod. NPC customization, AI, quests, abilities, scripting (JS/Java), economy.
~2,170 source files. Entry: `CustomNpcs.java` (`@Mod` ). Packages: `noppes.npcs.*` , `kamkeel.npcs.*` .
## Module Structure
| Module | Path | Purpose | MC Dependencies |
|---|---|---|---|
| **platform-api** | `platform-api/` | Interfaces only (`PlatformService` , `NBTFactory` , `INBTCompound` ) | None |
| **core** | `core/` | MC-free game logic: controllers, data classes, enums, utils | None (depends on platform-api) |
| **mc1710** (root) | `src/main/java/` | MC 1.7.10 implementations: entities, GUI, packets, wrappers | Full Forge/MC |
| **gradle-plugins** | `gradle-plugins/` | TypeScript `.d.ts` generator from Java API sources | Gradle only |
| **API** (submodule) | `src/api/java/` | Scripting API interfaces (`IPlayer` , `ICustomNpc` , `IWorld` , etc.) | Git submodule — run `./gradlew updateAPI` |
**Dependency flow:** `platform-api` ← `core` ← `mc1710 (root src)`
## Architecture Pattern
- **Split-package shadow**: Core class in `core/` + mc1710 version in `src/main/java/` same package. mc1710 shadows core at compile time (adds `implements IFaction` , SyncController calls, MC-specific methods).
- **Platform abstraction**: `PlatformServiceHolder.get()` → `PlatformService` impl registered at mod init.
- **NBT wrapping**: `NBTTagCompound` → `INBTCompound` , `new NBTTagCompound()` → `NBT.compound()` .
2026-03-15 08:57:42 +02:00
- **Entity wrapping**: `EntityPlayer` → `IPlayer` (platform-api), mc1710 provides `PlayerWrapper` .
2026-03-15 07:11:43 +02:00
## Subsystem Location Map
| Subsystem | Primary Path(s) | Key Files |
|---|---|---|
| **NPC Entities** | `src/.../noppes/npcs/entity/` | `EntityNPCInterface.java` , `EntityCustomNpc.java` |
| **NPC Data** | `src/.../noppes/npcs/Data*.java` | `DataAI` , `DataDisplay` , `DataStats` , `DataAbilities` , `DataAdvanced` |
| **AI System** | `src/.../noppes/npcs/ai/` | 28 AI tasks (`EntityAI*.java` ), `CombatHandler` , `pathfinder/` , `selector/` , `target/` |
| **Quest System** | `src/.../noppes/npcs/quests/` | `QuestItem` , `QuestKill` , `QuestLocation` , `QuestDialog` , `QuestManual` |
| **Quest Controller** | `src/.../noppes/npcs/controllers/` | `QuestController.java` , `PlayerQuestController.java` |
| **Dialog System** | `src/.../noppes/npcs/controllers/` | `DialogController.java` + data in `controllers/data/` |
| **Faction System** | `core/.../noppes/npcs/controllers/` | `FactionController.java` , `Faction.java` (migrated to core) |
| **Ability System** | `src/.../kamkeel/npcs/controllers/` | `AbilityController.java` , `EnergyController.java` , `TelegraphController.java` |
| **Ability Entities** | `src/.../kamkeel/npcs/entity/` | `EntityAbility*.java` , `EntityEnergy*.java` (13 entity types) |
| **Scripting Engine** | `src/.../noppes/npcs/controllers/` | `ScriptController.java` , `ScriptContainer.java` , `ScriptHookController.java` |
| **Scripting Wrappers** | `src/.../noppes/npcs/scripted/` | `ScriptWorld` , `ScriptBlock` , `NpcAPI` , `event/` , `entity/` , `item/` , `gui/` |
| **Economy/Auction** | `src/.../noppes/npcs/controllers/` | `AuctionController.java` , `MarketRegistry.java` |
| **Roles & Jobs** | `src/.../noppes/npcs/roles/` | `RoleTrader` , `RoleBank` , `RoleFollower` , `JobGuard` , `JobBard` , etc. |
| **Profile System** | `src/.../kamkeel/npcs/controllers/` | `ProfileController.java` |
| **Animation** | `src/.../noppes/npcs/controllers/` | `AnimationController.java` |
| **Commands** | `src/.../kamkeel/npcs/command/` | Hierarchical `/kam` system. `CommandKamkeel.java` is root. |
| **Config** | `src/.../noppes/npcs/config/` | `ConfigMain` , `ConfigClient` , `ConfigScript` , `ConfigMarket` , `ConfigEnergy` , etc. |
| **Blocks** | `src/.../noppes/npcs/blocks/` | 34 block types + `tiles/` |
| **Items** | `src/.../noppes/npcs/items/` | Weapons, linked items, scripted items |
| **Networking** | `src/.../kamkeel/npcs/network/` | `PacketHandler.java` + `SyncController.java` |
| **Mixins** | `src/.../noppes/npcs/mixin/` | Forge/MC mixins |
| **Client** | `src/.../noppes/npcs/client/` + `src/.../kamkeel/npcs/client/` | GUI, rendering, overlays |
| **Compat** | `src/.../noppes/npcs/compat/` | Cross-mod compatibility |
| **TypeScript Gen** | `gradle-plugins/src/` | Gradle plugin: Java API → `.d.ts` definitions |
## Core Migration Status
2026-03-15 08:57:42 +02:00
- **188 files** abstracted to `core/` + `platform-api/` out of ~1,810 total
2026-03-15 07:11:43 +02:00
- Migrated: Faction, Magic, Transport, Tag, GlobalData controllers + 60+ data classes
2026-03-15 08:57:42 +02:00
- See `SESSION_MEMORY.md` for migration roadmap and current strategy
2026-03-15 07:11:43 +02:00
## NEVER / DO NOT Rules
1. **NEVER touch script system for migration** — `ScriptHandler` , `ScriptContainer` , all `I*Script*` interfaces, Action framework. Deeply coupled, not yet planned.
2. **NEVER touch Ability.java or ability type classes for migration** — 30+ MC imports, deeply coupled to Entity/World/DamageSource.
3. **NEVER touch entity classes for migration** — extend MC Entity directly, must stay platform-side.
4. **NEVER touch recipe system for migration** — `RecipeCarpentry` extends `ShapedRecipes` , `RecipeController` uses `CraftingManager` .
5. **NEVER import MC classes in `core/` or `platform-api/`** — use platform interfaces only.
6. **NEVER import wrapper classes in `core/`** — only interfaces from `platform-api/` .
2026-03-15 08:57:42 +02:00
7. **Platform interface naming** : Use the existing scripting API names as-is (`IPlayer` , `IEntity` , `IItemStack` , `IWorld` ). Do NOT create semantically duplicate interfaces.
2026-03-15 07:11:43 +02:00
8. **MC1710 wrapper naming** : `[Thing]Wrapper` — no `MC1710` prefix.
2026-03-15 08:57:42 +02:00
9. **Scripting API** (`IPlayer` , `IEntity` , `ICustomNpc` ) is being **merged into platform-api** — same package (`noppes.npcs.api.*` ), stripped of MC type parameters. The MC-free versions live in `platform-api/` , version-specific extensions live in each version leaf's shadow. See `SESSION_MEMORY.md` Phase 0B/0C for the migration plan.
2026-03-15 07:11:43 +02:00
10. **Split-package rule** : When a class exists in both `core/` and `src/main/java/` with same package, mc1710 version shadows core. Never break this contract.
## Build & Run
```bash
# First-time setup (pulls API submodule)
./gradlew updateAPI
# Build (includes TypeScript .d.ts generation)
./gradlew build
# Build without mixin embedding
./gradlew buildNoMixin
# Run game
./gradlew runClient
./gradlew runServer
# Run without Nashorn scripting engine
./gradlew runClientNoNashorn
./gradlew runServerNoNashorn
# Generate TypeScript definitions only
./gradlew generateTypeScriptDefinitions
# IDE setup (IntelliJ)
./gradlew genIntellijRuns
# Then add args: --tweakClass org.spongepowered.asm.launch.MixinTweaker --mixin customnpcs.mixins.json
```
**Build system** : GTNH Convention plugin + RetroFuturaGradle. Java 8 target (core/platform-api), Java 8 compile with JDK 8 (mc1710).
## Convention Summary
- Two root packages: `noppes.npcs.*` (original), `kamkeel.npcs.*` (additions)
- Controllers are singletons in `controllers/` packages — instantiated at server start
- Data classes use NBT serialization (`readNBT` /`writeNBT` pattern with `INBTCompound` )
- Commands: hierarchical under `/kam` — each subcommand is a `CommandKamkeelBase` subclass
- Script hooks: 154+ events across NPC, Player, Block, Item, Quest, Dialog, Ability, Auction, Animation
- Config: separate config classes per domain (`ConfigMain` , `ConfigScript` , `ConfigMarket` , etc.)
- Async saves: `CustomNPCsThreader` thread pool for controller persistence
- API submodule: `src/api/java/` — must `git submodule update --init --recursive` before build
## Key Reference Files
- `SESSION_MEMORY.md` — **Multi-version porting strategy** , owner's vision, corrected architecture, research synthesis
- `MULTI_VERSION_RESEARCH.md` — External research: real multi-version mod repos, build tools, preprocessor details
- `MC_COUPLING_ANALYSIS.md` — Quantified MC-dependency breakdown by subsystem (1,424 files analyzed)
- `FORBIDDEN_PRACTICES.md` — Anti-patterns, deprecated components, architectural guardrails
2026-03-15 08:57:42 +02:00
- `MIGRATION_ROADMAP.md` — Phased migration plan with milestones
- `BUILD_SYSTEM.md` — Gradle architecture, version-specific build requirements
2026-03-15 07:11:43 +02:00
- `CHANGELOG.md` — Version history
- `todo.txt` — Pending tasks
- `dts-patches/` — Manual patches applied to generated TypeScript definitions