# Custom Ore Gem - Developer Guide for Agents

This repository is a Minecraft **NeoForge 1.21.1** mod created with **MCreator**. Agents must follow these strict guidelines to ensure build stability and code preservation.

## 1. Build & Test Commands

Use the Gradle wrapper for all operations. Ensure you are using Java 21 (NeoForge 1.21.1 requirement).

- **Build Mod:**
  ```bash
  ./gradlew build
  ```
  - Generates the mod JAR in `build/libs/`.
  - Always run this after making changes to verify compilation.

- **Run Client:**
  ```bash
  ./gradlew runClient
  ```

- **Run Server:**
  ```bash
  ./gradlew runServer
  ```

- **Run Data Generation:**
  ```bash
  ./gradlew runData
  ```
  - This generates resources (blockstates, models, loot tables) into `src/generated/resources`.

- **Run All Tests:**
  ```bash
  ./gradlew test
  ```

- **Run Single Test Class:**
  ```bash
  ./gradlew test --tests "net.mcreator.customoregen.OresCommandTest"
  ```

- **Run Single Test Method:**
  ```bash
  ./gradlew test --tests "net.mcreator.customoregen.OresCommandTest.testCommandRegistration_ShouldRegisterOresCommand"
  ```

- **Clean Project:**
  ```bash
  ./gradlew clean
  ```

## 2. MCreator & Code Preservation

**CRITICAL:** This project is partially generated by MCreator.
- **Generated Files:** Many files in `src/main/java` are regenerated on every build or MCreator export.
- **User Code Blocks:** You **MUST** only edit code within designated user code blocks in these files.
  ```java
  // Start of user code block [block_name]
  // ... YOUR CODE HERE ...
  // End of user code block [block_name]
  ```
  - If a file does not have these blocks, assume it is **UNSAFE** to edit unless you created it yourself.

- **Safe Files:**
  - Files strictly created by you (e.g., in `src/test/java`).
  - New utility classes or event handlers not managed by MCreator.
  
- **Do NOT** directly modify the following unless inside a user block:
  - `CustomOreGenModBlocks.java`
  - `CustomOreGenModItems.java`
  - `CustomOreGenModTabs.java`
  - Any file in `net.mcreator.customoregen.procedures` (unless explicitly safe).

## 3. Code Style & Conventions

### Formatting
- **Indentation:**
  - **Source Code (`src/main`):** Use **TABS** (default MCreator style).
  - **Tests (`src/test`):** Use **4 SPACES** (typical for JUnit tests).
  - **Consistency:** Always check the current file's indentation before editing.
- **Encoding:** UTF-8.

### Naming
- **Classes:** PascalCase (e.g., `CustomOreGenMod`).
- **Methods:** camelCase (e.g., `queueServerWork`).
- **Constants:** UPPER_SNAKE_CASE (e.g., `MODID`, `COLD_BIOMES_TAG`).
- **Fields:** camelCase (e.g., `workQueue`, `oreGenConfig`).
- **Packages:** `net.mcreator.customoregen` (lowercase).

### Imports
- Group imports in this specific order:
  1. Java/Standard Libraries (`java.*`, `javax.*`)
  2. Third-party Libraries (e.g., `org.apache.logging.log4j.*`)
  3. Minecraft/NeoForge (`net.minecraft.*`, `net.neoforged.*`)
  4. Project Classes (`net.mcreator.customoregen.*`)
- Avoid `import *` unless there are many imports from the same package (e.g., `java.util.*` is acceptable if heavily used, but explicit imports are preferred for clarity).

### Logging
- Use `LogManager.getLogger(Class.class)` for loggers.
- Field name: `LOGGER`.
- Log levels: Use `debug` for dev info, `info` for general status, `error` for exceptions.

## 4. Architecture & Patterns

- **Framework:** NeoForge 1.21.1 (Java 21).
- **Registries:** Use `DeferredRegister` for all registries (Blocks, Items, Tabs, SoundEvents).
  - Example: `public static final DeferredRegister.Blocks REGISTRY = DeferredRegister.createBlocks(CustomOreGenMod.MODID);`

- **Event Bus:**
  - The `@Mod` class registers the `IEventBus`.
  - Use `@SubscribeEvent` for event handling.
  - Event handlers often reside in `net.mcreator.customoregen.event` or static inner classes annotated with `@EventBusSubscriber`.

- **Configuration:**
  - Located in `net.mcreator.customoregen.config.ModConfigs`.
  - Uses `ModConfig.Type.COMMON` built with `ModConfigSpec`.
  - Access configs via the public static fields (e.g., `ModConfigs.ORE_GEN.shardDiamondOreCount.get()`).

- **Commands:**
  - Registered via `RegisterCommandsEvent`.
  - Use Brigadier (`CommandDispatcher`, `CommandContext`).
  - See `OresCommand.java` for the reference implementation.

## 5. Testing Guidelines

- **Framework:** JUnit 5 (Jupiter) + Mockito.
- **Location:** `src/test/java`.
- **Mocking Strategy:**
  - Since a full Minecraft environment is not available in unit tests, you **MUST** mock Minecraft classes.
  - Use `@ExtendWith(MockitoExtension.class)`.
  - Mock critical classes: `@Mock ServerPlayer player`, `@Mock Level level`, `@Mock BlockPos pos`.
  - Stub methods: `when(level.getBiome(pos)).thenReturn(biomeHolder);`.
- **Assertions:** Use `org.junit.jupiter.api.Assertions` (e.g., `assertEquals`, `assertDoesNotThrow`).

## 6. Common Tasks

- **Adding a New Ore:**
  1. Create Block & Item (MCreator/Manual).
  2. Add JSONs: Loot Table, Configured Feature, Placed Feature, Biome Modifier.
  3. Register in `CustomOreGenModBlocks` and `CustomOreGenModItems`.
  4. Update `OresCommand.java` lists (e.g., `COLD_ORES`, `HOT_ORES`) to make it discoverable.
  5. Update `OreBreakEventHandler.java` if it has custom drops logic.
  6. Add to `ModConfigs.java` for generation parameters (vein size, count, etc.).

- **Modifying Logic:**
  - Check `procedures/` for game logic (often MCreator generated).
  - Check `event/` for event-driven logic.
  - Always verify if logic changes need a corresponding test update.

## 7. Safety & Verification

- **Backups:** If you are unsure about MCreator regeneration, backup the file before editing.
- **Verification:**
  - Always run `./gradlew build` after changes to ensure no compilation errors.
  - If you touch config files, ensure `ModConfigsTest` still passes.
  - If you touch commands, ensure `OresCommandTest` still passes.

## 8. Directory Structure
```
src/
├── main/
│   ├── java/net/mcreator/customoregen/
│   │   ├── block/       # Block definitions
│   │   ├── config/      # Configuration classes
│   │   ├── event/       # Event handlers
│   │   ├── init/        # Registration (Blocks, Items, Tabs)
│   │   ├── item/        # Item definitions
│   │   └── procedures/  # Game logic procedures
│   └── resources/       # Assets and data (textures, models, lang)
└── test/
    └── java/net/mcreator/customoregen/  # Unit tests
```
