diff --git a/.AGENTS/MIGRATION_EXECUTION_PLAN.md b/.AGENTS/MIGRATION_EXECUTION_PLAN.md new file mode 100644 index 000000000..7d034dfc5 --- /dev/null +++ b/.AGENTS/MIGRATION_EXECUTION_PLAN.md @@ -0,0 +1,871 @@ +# MIGRATION EXECUTION PLAN — Core Extraction Wave 1 + +> **Created:** 2026-03-16 +> **Status:** PLANNING (not yet executing) +> **Scope:** Whitelisted packages → core/ via the migration toolchain +> **Data Sources:** `mc_type_classifications_original.json` (37 curated types), `all_methods_export.json` (member data), `mc_usage_index.json` (usage index) + +--- + +## Executive Summary + +This plan extracts ~250 files from 8 whitelisted mc1710 packages into `core/`, replacing all MC/Forge type references with platform-api abstractions. It is the **first full-scale use of the migration toolchain** and is structured into 4 sequential phases: + +| Phase | What | Tool | Output | +|-------|------|------|--------| +| **1** | Create PA abstractions for all MC types used in scope | `pa_batch.py` | ~20 new PA files in `platform-api/` | +| **2** | Copy whitelisted files to core/ | `Copy-Recursive.ps1` | ~150 new files in `core/` | +| **3** | Replace MC types with PA abstractions in core/ | `Symbol-Swap`, `Static-Transform`, `Nuke-Imports` | All MC imports eliminated from core/ | +| **4** | Verify, diagnose, stabilize | `Build-Report`, `migration-diff` | Clean `:core:compileJava` build | + +**Estimated new tool development before execution:** 1 new Python script (`generate_pa_manifest.py`) + +--- + +## 0. Current State Snapshot + +### Already Migrated (DO NOT re-copy) + +| Location | Count | Contents | +|----------|-------|----------| +| `platform-api/` | 239 files | Entity interfaces (IPlayer, IEntity, etc.), handlers, events, abilities, NBT, overlays, GUI, roles, scoreboard | +| `core/` | 141 files | 8 controllers (Faction, Transport, Tag, Magic, GlobalData, CategoryManager, APIRegistry, ServerTagMap), 30+ data classes, 40+ enums/constants, 6 utils, network enums | + +### Whitelisted Migration Scope (mc1710 → core/) + +| Package | Files in mc1710 | Already in core/ | Net New | +|---------|----------------|-----------------|---------| +| `kamkeel/npcs/controllers/` (+ data/) | 89 | ~14 (ability data/enums/profile/telegraph) | ~75 | +| `noppes/npcs/controllers/` (+ data/) | 98 | 38 (8 controllers + 30 data classes) | ~60 | +| `noppes/npcs/quests/` | 6 | 0 | 6 | +| `noppes/npcs/roles/` | 24 | 0 | 24 | +| `noppes/npcs/constants/` | 8 | 40 (most already migrated) | ~3 | +| `noppes/npcs/util/` | 10 (3 MC-free) | 6 | ~4 | +| `noppes/npcs/config/` | 15 | 0 | 15 | +| `kamkeel/npcs/network/` | 100+ | 9 (enums only) | **0** (all MC-dependent, skip) | +| **TOTAL** | **~350** | **~107** | **~187** | + +### What's NOT in scope (explicitly excluded) + +- `containers/`, `guis/`, `gui/`, `fx/` — Client GUI code +- `key/`, `model/`, `renderer/` — Client rendering +- Proxies, Event Handlers — Platform-specific lifecycle +- `kamkeel/npcs/network/` packets — All MC-dependent (100+ files) +- Ability type classes (extend MC Entity) — Stay in mc1710 +- Script system — Deeply coupled, not planned + +--- + +## 1. MC Type Classification Registry + +### Authoritative Source: `mc_type_classifications_original.json` + +This is the **hand-curated** classification of all 400 MC types. The auto-generated `classification_results.json` has inflated counts (46 INTERFACE vs 15, 95 SERVICE vs 12) because it lacks human judgment. **Always use the original.** + +| Category | Count | Action | +|----------|-------|--------| +| EXISTING | 11 | Symbol-Swap ready — PA interfaces exist | +| INTERFACE | 15 | Need new PA interface files | +| SERVICE | 12 | Need PlatformService method additions | +| TRANSFORM | 10 | Need Static-Transform regex + support classes | +| SUPPRESS | 352 | Never abstract — code stays in mc1710 | + +### 1A. EXISTING Types (11) — Symbol-Swap Ready + +These already have PA abstractions. Just run Symbol-Swap. + +| MC Type | PA Type | PA Package | Imports | +|---------|---------|------------|---------| +| `NBTTagCompound` | `INbt` | `noppes.npcs.api` | 593 | +| `EntityPlayer` | `IPlayer` | `noppes.npcs.api.entity` | 551 | +| `EntityPlayerMP` | `IPlayer` | `noppes.npcs.api.entity` | 304 | +| `Entity` | `IEntity` | `noppes.npcs.api.entity` | 262 | +| `ItemStack` | `IItemStack` | `noppes.npcs.api.item` | 228 | +| `EntityLivingBase` | `IEntityLivingBase` | `noppes.npcs.api.entity` | 201 | +| `World` | `IWorld` | `noppes.npcs.api` | 172 | +| `NBTTagList` | `INbtList` | `noppes.npcs.api` | 111 | +| `DamageSource` | `IDamageSource` | `noppes.npcs.api` | 36 | +| `WorldServer` | `IWorld` | `noppes.npcs.api` | 18 | +| `EntityLiving` | `IEntityLiving` | `noppes.npcs.api.entity` | 18 | + +### 1B. INTERFACE Types (15) — Need PA Creation + +New PA interfaces to create in `platform-api/`. Package rule: `net.minecraft.X` → `common.minecraft.X`, `net.minecraftforge.X` → `common.minecraftforge.X`, `cpw.mods.X` → `common.minecraftforge.X`. + +| MC Type | PA Name | New Package | Imports | Priority for Scope | +|---------|---------|-------------|---------|-------------------| +| `ResourceLocation` | `IResourceLocation` | `common.minecraft.util` | 145 | **HIGH** — controllers, config | +| `ICommandSender` | `ICommandSender` | `common.minecraft.command` | 47 | **HIGH** — controllers | +| `ChatComponentText` | `ITextComponent` | `common.minecraft.util` | 20 | **HIGH** — controllers (messages) | +| `ChatComponentTranslation` | `ITextComponent` | `common.minecraft.util` | 24 | **HIGH** — controllers (messages) | +| `IChatComponent` | `ITextComponent` | `common.minecraft.util` | 10 | **HIGH** — base type | +| `NBTBase` | `INbtBase` | `common.minecraft.nbt` | 13 | **HIGH** — data classes | +| `Configuration` | `IConfiguration` | `common.minecraftforge.common.config` | 9 | **HIGH** — config system | +| `Property` | `IConfigProperty` | `common.minecraftforge.common.config` | 7 | **HIGH** — config system | +| `AxisAlignedBB` | `IBoundingBox` | `common.minecraft.util` | 59 | **MEDIUM** — some controllers | +| `Vec3` | `IVector3` | `common.minecraft.util` | 43 | **MEDIUM** — some controllers | +| `MovingObjectPosition` | `IRayTraceResult` | `common.minecraft.util` | 15 | **LOW** — mostly abilities | +| `ChatStyle` | `ITextStyle` | `common.minecraft.util` | 3 | **LOW** — text formatting | +| `Potion` | `IPotionType` | `common.minecraft.potion` | 7 | **MEDIUM** — effects system | +| `PotionEffect` | `IPotionEffect` | `common.minecraft.potion` | 6 | **MEDIUM** — effects system | +| `Explosion` | `IExplosion` | `common.minecraft.world` | 3 | **LOW** — abilities only | + +**Filtering required**: Run `type-usage --scope` on each to confirm they're actually used in the whitelisted packages before creating PAs. Types with LOW scope relevance may be deferred. + +### 1C. SERVICE Types (12) — PlatformService Method Additions + +These are static utilities. Their methods get added to `PlatformService` (or `NBTIO`). No separate files needed — just interface method additions. + +| MC Type | Routes To | Imports | Key Methods | Scope Relevance | +|---------|-----------|---------|-------------|-----------------| +| `StatCollector` | `PlatformService` | 106 | `translateToLocal()`, `translateToLocalFormatted()` | **HIGH** | +| `Item` | `PlatformService` | 72 | `getItemById()`, `getIdFromItem()` | **MEDIUM** | +| `MinecraftServer` | `PlatformService` | 26 | `getServer()`, `isDedicatedServer()`, `worldServerForDimension()` | **HIGH** | +| `EntityList` | `PlatformService` | 25 | `getEntityString()`, `createEntityByName()` | **MEDIUM** | +| `FMLCommonHandler` | `PlatformService` | 25 | `getSide()`, `getEffectiveSide()` | **HIGH** | +| `CompressedStreamTools` | `NBTIO` | 24 | `readCompressed()`, `writeCompressed()` | **HIGH** | +| `CommandBase` | `PlatformService` | 14 | `parseDouble()`, `parseInt()` | **LOW** | +| `Loader` | `PlatformService` | 11 | `isModLoaded()` | **HIGH** | +| `I18n` | `PlatformService` | 9 | `format()` | **LOW** (client) | +| `DimensionManager` | `PlatformService` | 2 | `getWorld()` | **LOW** | +| `PlayerSelector` | `PlatformService` | 2 | `matchPlayers()` | **LOW** | +| `NBTUtil` | `NBTIO` | 1 | GameProfile NBT | **LOW** | + +### 1D. TRANSFORM Types (10) — Static-Transform Patterns + +These get handled by regex replacement. Some need support classes created in `core/`. + +| MC Type | Transform Target | Imports | Support Class Needed | +|---------|-----------------|---------|---------------------| +| `Side` + `SideOnly` | `@ClientOnly`/`@ServerOnly` | 800 | Already exist in platform-api | +| `MathHelper` | `ValueUtil.*` / `Math.*` | 98 | `ValueUtil` already in core/ | +| `EnumChatFormatting` | `TextFormatting.*` | 19 | **YES** — `TextFormatting` enum in core/ | +| `Constants` (Forge NBT) | `NbtConstants.*` | 9 | **YES** — `NbtConstants` class in core/ | +| `CommandException` | Same name, new package | 31 | **YES** — `CommandException` in platform-api | +| `SharedMonsterAttributes` | `Attributes.*` | 10 | **YES** — `Attributes` constants in core/ | +| `EnumFacing` | `Direction.*` | 3 | **YES** — `Direction` enum in core/ | +| `ChunkCoordinates` | `BlockPos`/inline | 4 | Uses existing `IPos` | +| `EnumAction` | `ItemAction.*` | 11 | **YES** — `ItemAction` enum in core/ | + +**Support classes to create (6):** TextFormatting, NbtConstants, CommandException, Attributes, Direction, ItemAction + +--- + +## 2. Phase 1 — PA Abstraction Creation + +### Goal +Create ALL required PA interfaces and support classes BEFORE copying any files. This ensures Symbol-Swap has targets. + +### Step 1.1: Scope Verification (NEW TOOL) + +Before creating PAs, verify which INTERFACE/SERVICE types are actually used in the whitelisted packages. This prevents creating unused abstractions. + +```bash +# For each INTERFACE type, check if it's used in scope +python tools/migration/analyze.py type-usage ResourceLocation --scope noppes/npcs/controllers/ --json +python tools/migration/analyze.py type-usage ResourceLocation --scope noppes/npcs/config/ --json +python tools/migration/analyze.py type-usage ResourceLocation --scope noppes/npcs/roles/ --json +# ... repeat for all types × all packages +``` + +**⚠️ TOOLING GAP:** This is manual and slow. We need `generate_pa_manifest.py` (see Section 6). + +### Step 1.2: Create INTERFACE PA Files + +Single `pa_batch.py` manifest with ALL INTERFACE PA files. Package mapping: +- `net.minecraft.*` → `common.minecraft.*` +- `net.minecraftforge.*` → `common.minecraftforge.*` +- `cpw.mods.*` → `common.minecraftforge.*` + +**Root:** `platform-api/src/main/java` + +**Manifest structure (example entries):** +```json +{ + "root": "platform-api/src/main/java", + "files": [ + { + "content": "package common.minecraft.util;\n\npublic interface IResourceLocation {\n String getResourceDomain();\n String getResourcePath();\n String toString();\n}\n" + }, + { + "content": "package common.minecraft.util;\n\npublic interface ITextComponent {\n String getText();\n String getFormattedText();\n String getUnformattedText();\n ITextComponent appendSibling(ITextComponent sibling);\n ITextComponent setChatStyle(ITextStyle style);\n}\n" + }, + { + "content": "package common.minecraft.nbt;\n\npublic interface INbtBase {\n byte getId();\n INbtBase copy();\n}\n" + }, + { + "content": "package common.minecraftforge.common.config;\n\npublic interface IConfiguration {\n IConfigProperty get(String category, String key, String defaultValue, String comment);\n IConfigProperty get(String category, String key, int defaultValue, String comment);\n IConfigProperty get(String category, String key, boolean defaultValue, String comment);\n IConfigProperty get(String category, String key, double defaultValue, String comment);\n void save();\n void load();\n boolean hasKey(String category, String key);\n boolean hasCategory(String category);\n}\n" + } + ] +} +``` + +**Method content source:** `all_methods_export.json` — this file has EVERY method/field/static for each MC type with usage counts. The manifest generator reads this to include only methods with usage > 0. + +### Step 1.3: Add SERVICE Methods to PlatformService + +For SERVICE types, we add methods to the existing `PlatformService` interface. Use `pa_editor.py` to insert method declarations. + +**Methods to add to `kamkeel/npcs/platform/PlatformService.java`:** + +```java +// StatCollector (106 imports) +String translateToLocal(String key); +String translateToLocalFormatted(String key, Object... args); + +// MinecraftServer (26 imports) +boolean isDedicatedServer(); // may already exist +Object getServer(); +IWorld getWorldForDimension(int dimensionId); + +// FMLCommonHandler (25 imports) +boolean isPhysicalClient(); // already exists +boolean isLogicalClient(); + +// Loader (11 imports) +boolean isModLoaded(String modId); + +// Item registry (72 imports) +IItemStack getItemById(int id); +int getIdFromItem(IItemStack item); + +// EntityList (25 imports) +String getEntityRegistryName(IEntity entity); +IEntity createEntityByName(String name, IWorld world); +``` + +**Methods to add to `noppes/npcs/platform/nbt/NBTIO.java`:** + +```java +// CompressedStreamTools (24 imports) — may already exist +INbt readCompressed(java.io.InputStream stream); +void writeCompressed(INbt nbt, java.io.OutputStream stream); +``` + +### Step 1.4: Create TRANSFORM Support Classes + +These go into `core/src/main/java/` (they're platform-independent). + +```json +{ + "root": "core/src/main/java", + "files": [ + { + "content": "package noppes.npcs.constants;\n\npublic class TextFormatting {\n public static final String BLACK = \"\\u00a70\";\n public static final String DARK_BLUE = \"\\u00a71\";\n public static final String DARK_GREEN = \"\\u00a72\";\n public static final String DARK_AQUA = \"\\u00a73\";\n public static final String DARK_RED = \"\\u00a74\";\n public static final String DARK_PURPLE = \"\\u00a75\";\n public static final String GOLD = \"\\u00a76\";\n public static final String GRAY = \"\\u00a77\";\n public static final String DARK_GRAY = \"\\u00a78\";\n public static final String BLUE = \"\\u00a79\";\n public static final String GREEN = \"\\u00a7a\";\n public static final String AQUA = \"\\u00a7b\";\n public static final String RED = \"\\u00a7c\";\n public static final String LIGHT_PURPLE = \"\\u00a7d\";\n public static final String YELLOW = \"\\u00a7e\";\n public static final String WHITE = \"\\u00a7f\";\n public static final String OBFUSCATED = \"\\u00a7k\";\n public static final String BOLD = \"\\u00a7l\";\n public static final String STRIKETHROUGH = \"\\u00a7m\";\n public static final String UNDERLINE = \"\\u00a7n\";\n public static final String ITALIC = \"\\u00a7o\";\n public static final String RESET = \"\\u00a7r\";\n}\n" + }, + { + "content": "package noppes.npcs.constants;\n\npublic class NbtConstants {\n public static final int TAG_END = 0;\n public static final int TAG_BYTE = 1;\n public static final int TAG_SHORT = 2;\n public static final int TAG_INT = 3;\n public static final int TAG_LONG = 4;\n public static final int TAG_FLOAT = 5;\n public static final int TAG_DOUBLE = 6;\n public static final int TAG_BYTE_ARRAY = 7;\n public static final int TAG_STRING = 8;\n public static final int TAG_LIST = 9;\n public static final int TAG_COMPOUND = 10;\n public static final int TAG_INT_ARRAY = 11;\n}\n" + } + ] +} +``` + +Additional support classes: `CommandException`, `Attributes`, `Direction`, `ItemAction` — all simple enums/classes with no MC dependencies. + +### Step 1.5: Execution Sequence + +``` +1. Write PA INTERFACE manifest → pa_batch.py --dry-run → pa_batch.py --force +2. Edit PlatformService with SERVICE methods → pa_editor.py --force +3. Write TRANSFORM support class manifest → pa_batch.py --force +4. Verify: ls platform-api/src/main/java/common/ — confirm structure +``` + +--- + +## 3. Phase 2 — Core File Copy + +### Goal +Copy all files from whitelisted mc1710 packages to core/, following import dependencies within scope. + +### Step 2.1: Build the Sources List + +Every `.java` file in the whitelisted packages that is NOT already in core/. + +**Initial Sources** (explicit files to copy — the roots of the recursion): + +```powershell +# noppes/npcs/controllers/ — files NOT already in core/ +$controllerSources = @( + 'noppes/npcs/controllers/QuestController.java', + 'noppes/npcs/controllers/PlayerQuestController.java', + 'noppes/npcs/controllers/PlayerDataController.java', + 'noppes/npcs/controllers/DialogController.java', + 'noppes/npcs/controllers/LinkedItemController.java', + 'noppes/npcs/controllers/LinkedNpcController.java', + 'noppes/npcs/controllers/PartyController.java', + 'noppes/npcs/controllers/AuctionController.java', + 'noppes/npcs/controllers/CustomEffectController.java', + 'noppes/npcs/controllers/CustomGuiController.java', + 'noppes/npcs/controllers/BankController.java', + 'noppes/npcs/controllers/ChunkController.java', + 'noppes/npcs/controllers/RecipeController.java', + 'noppes/npcs/controllers/SpawnController.java', + 'noppes/npcs/controllers/ServerCloneController.java', + 'noppes/npcs/controllers/ScriptController.java', + 'noppes/npcs/controllers/ScriptHookController.java', + 'noppes/npcs/controllers/AnimationController.java', + 'noppes/npcs/controllers/MarketRegistry.java', + 'noppes/npcs/controllers/HookDefinition.java' + # ... + ALL data/* files not already in core/ +) + +# noppes/npcs/quests/ — all 6 files +$questSources = @( + 'noppes/npcs/quests/QuestItem.java', + 'noppes/npcs/quests/QuestKill.java', + 'noppes/npcs/quests/QuestLocation.java', + 'noppes/npcs/quests/QuestDialog.java', + 'noppes/npcs/quests/QuestManual.java', + 'noppes/npcs/quests/QuestInterface.java' +) + +# noppes/npcs/roles/ — all 24 files +$roleSources = @( + 'noppes/npcs/roles/RoleTrader.java', + 'noppes/npcs/roles/RoleBank.java', + 'noppes/npcs/roles/RoleFollower.java', + 'noppes/npcs/roles/RoleCompanion.java', + # ... all 24 files +) + +# noppes/npcs/config/ — all 15 files +$configSources = @( + 'noppes/npcs/config/ConfigMain.java', + 'noppes/npcs/config/ConfigClient.java', + 'noppes/npcs/config/ConfigScript.java', + 'noppes/npcs/config/ConfigMarket.java', + 'noppes/npcs/config/ConfigEnergy.java', + 'noppes/npcs/config/ConfigItem.java', + 'noppes/npcs/config/ConfigDebug.java', + 'noppes/npcs/config/ConfigExperimental.java', + 'noppes/npcs/config/ConfigMixin.java', + 'noppes/npcs/config/LoadConfiguration.java', + 'noppes/npcs/config/StringCache.java', + 'noppes/npcs/config/GlyphCache.java', + 'noppes/npcs/config/legacy/LegacyLoader.java', + 'noppes/npcs/config/legacy/LegacyConfig.java', + 'noppes/npcs/config/legacy/ConfigProp.java' +) + +# MC-free util files only +$utilSources = @( + 'noppes/npcs/util/GameProfileAlt.java', + 'noppes/npcs/util/JsonException.java', + 'noppes/npcs/util/ScriptToStringHelper.java' +) + +# kamkeel/npcs/controllers/ — files NOT already in core/ +$kamkeelSources = @( + 'kamkeel/npcs/controllers/AbilityController.java', + 'kamkeel/npcs/controllers/EnergyController.java', + 'kamkeel/npcs/controllers/ProfileController.java', + 'kamkeel/npcs/controllers/AttributeController.java', + 'kamkeel/npcs/controllers/TelegraphController.java', + 'kamkeel/npcs/controllers/SyncController.java' + # ... + data/* files not already in core/ +) +``` + +### Step 2.2: AllowPaths & AllowRecursePaths + +```powershell +$AllowPaths = @( + 'noppes/npcs/controllers/', + 'noppes/npcs/quests/', + 'noppes/npcs/roles/', + 'noppes/npcs/constants/', + 'noppes/npcs/util/', + 'noppes/npcs/config/', + 'kamkeel/npcs/controllers/', + 'kamkeel/npcs/util/', + 'kamkeel/npcs/config/' +) + +# Only recurse into these — prevent explosion into entity/client/network +$AllowRecursePaths = @( + 'noppes/npcs/controllers/', + 'noppes/npcs/quests/', + 'noppes/npcs/roles/', + 'noppes/npcs/constants/', + 'noppes/npcs/config/', + 'kamkeel/npcs/controllers/' +) +# util/ is in AllowPaths but NOT AllowRecursePaths — files get copied but imports aren't chased +``` + +### Step 2.3: Execute + +**IMPORTANT:** `McRoot` defaults to `mc1710/src/main/java` but current code lives at `src/main/java`. Override required. + +```powershell +Copy-Recursive ` + -Sources ($controllerSources + $questSources + $roleSources + $configSources + $utilSources + $kamkeelSources) ` + -AllowPaths $AllowPaths ` + -AllowRecursePaths $AllowRecursePaths ` + -McRoot 'src/main/java' +``` + +**Expected output:** ~150-187 files copied to `core/src/main/java/`. + +### Step 2.4: What Copy-Recursive Will Skip + +Files already in core/ will be reported as EXISTS (not re-copied). Files outside AllowPaths will be reported as SKIPPED. This is correct behavior. + +--- + +## 4. Phase 3 — Symbol Replacement + +### Goal +Replace every MC/Forge type reference in core/ with PA abstractions. + +### Step 3.1: Nuke-Imports (first) + +Remove all MC/Forge/platform-specific imports from core/. + +```powershell +Nuke-Imports -Directory 'core/src/main/java' -ForbiddenPrefixes @( + 'net.minecraft.', + 'cpw.mods.', + 'net.minecraftforge.', + 'noppes.npcs.entity.', + 'noppes.npcs.client.', + 'noppes.npcs.mixin.', + 'kamkeel.npcs.network.', + 'kamkeel.npcs.entity.', + 'noppes.npcs.containers.', + 'noppes.npcs.scripted.', + 'noppes.npcs.janino.', + 'noppes.npcs.wrapper.', + 'noppes.npcs.blocks.', + 'noppes.npcs.items.', + 'noppes.npcs.ai.' +) +``` + +### Step 3.2: Symbol-Swap — EXISTING Types (11) + +```powershell +Symbol-Swap -Directory 'core/src/main/java' -Swaps @( + @('NBTTagCompound', 'INbt', 'net.minecraft.nbt.NBTTagCompound', 'noppes.npcs.api.INbt'), + @('NBTTagList', 'INbtList', 'net.minecraft.nbt.NBTTagList', 'noppes.npcs.api.INbtList'), + @('EntityPlayer', 'IPlayer', 'net.minecraft.entity.player.EntityPlayer', 'noppes.npcs.api.entity.IPlayer'), + @('EntityPlayerMP', 'IPlayer', 'net.minecraft.entity.player.EntityPlayerMP', 'noppes.npcs.api.entity.IPlayer'), + @('Entity', 'IEntity', 'net.minecraft.entity.Entity', 'noppes.npcs.api.entity.IEntity'), + @('ItemStack', 'IItemStack', 'net.minecraft.item.ItemStack', 'noppes.npcs.api.item.IItemStack'), + @('EntityLivingBase', 'IEntityLivingBase', 'net.minecraft.entity.EntityLivingBase', 'noppes.npcs.api.entity.IEntityLivingBase'), + @('World', 'IWorld', 'net.minecraft.world.World', 'noppes.npcs.api.IWorld'), + @('WorldServer', 'IWorld', 'net.minecraft.world.WorldServer', 'noppes.npcs.api.IWorld'), + @('DamageSource', 'IDamageSource', 'net.minecraft.util.DamageSource', 'noppes.npcs.api.IDamageSource'), + @('EntityLiving', 'IEntityLiving', 'net.minecraft.entity.EntityLiving', 'noppes.npcs.api.entity.IEntityLiving') +) +``` + +### Step 3.3: Symbol-Swap — NEW INTERFACE Types + +```powershell +Symbol-Swap -Directory 'core/src/main/java' -Swaps @( + @('ResourceLocation', 'IResourceLocation', 'net.minecraft.util.ResourceLocation', 'common.minecraft.util.IResourceLocation'), + @('ICommandSender', 'ICommandSender', 'net.minecraft.command.ICommandSender', 'common.minecraft.command.ICommandSender'), + @('ChatComponentText', 'ITextComponent', 'net.minecraft.util.ChatComponentText', 'common.minecraft.util.ITextComponent'), + @('ChatComponentTranslation', 'ITextComponent', 'net.minecraft.util.ChatComponentTranslation', 'common.minecraft.util.ITextComponent'), + @('IChatComponent', 'ITextComponent', 'net.minecraft.util.IChatComponent', 'common.minecraft.util.ITextComponent'), + @('ChatStyle', 'ITextStyle', 'net.minecraft.util.ChatStyle', 'common.minecraft.util.ITextStyle'), + @('NBTBase', 'INbtBase', 'net.minecraft.nbt.NBTBase', 'common.minecraft.nbt.INbtBase'), + @('Configuration', 'IConfiguration', 'net.minecraftforge.common.config.Configuration', 'common.minecraftforge.common.config.IConfiguration'), + @('Property', 'IConfigProperty', 'net.minecraftforge.common.config.Property', 'common.minecraftforge.common.config.IConfigProperty'), + @('AxisAlignedBB', 'IBoundingBox', 'net.minecraft.util.AxisAlignedBB', 'common.minecraft.util.IBoundingBox'), + @('Vec3', 'IVector3', 'net.minecraft.util.Vec3', 'common.minecraft.util.IVector3'), + @('MovingObjectPosition', 'IRayTraceResult', 'net.minecraft.util.MovingObjectPosition', 'common.minecraft.util.IRayTraceResult'), + @('Potion', 'IPotionType', 'net.minecraft.potion.Potion', 'common.minecraft.potion.IPotionType'), + @('PotionEffect', 'IPotionEffect', 'net.minecraft.potion.PotionEffect', 'common.minecraft.potion.IPotionEffect'), + @('Explosion', 'IExplosion', 'net.minecraft.world.Explosion', 'common.minecraft.world.IExplosion') +) +``` + +### Step 3.4: Static-Transform — SERVICE Rerouting + +```powershell +Static-Transform -Directory 'core/src/main/java' -Transforms @( + # NBT constructors + @('new\s+NBTTagCompound\s*\(\)', 'NBT.compound()'), + @('new\s+NBTTagList\s*\(\)', 'NBT.list()'), + + # CompressedStreamTools → NBTIO + @('CompressedStreamTools\.readCompressed\s*\(([^)]+)\)', 'NBTIO.readCompressed($1)'), + @('CompressedStreamTools\.writeCompressed\s*\(([^,]+),\s*([^)]+)\)', 'NBTIO.writeCompressed($1, $2)'), + + # StatCollector → PlatformServiceHolder + @('StatCollector\.translateToLocal\s*\(([^)]+)\)', 'PlatformServiceHolder.get().translateToLocal($1)'), + @('StatCollector\.translateToLocalFormatted\s*\(([^)]+)\)', 'PlatformServiceHolder.get().translateToLocalFormatted($1)'), + + # MinecraftServer + @('MinecraftServer\.getServer\s*\(\)', 'PlatformServiceHolder.get().getServer()'), + + # FMLCommonHandler + @('FMLCommonHandler\.instance\(\)\.getSide\(\)\s*==\s*Side\.CLIENT', 'PlatformServiceHolder.get().isPhysicalClient()'), + @('FMLCommonHandler\.instance\(\)\.getEffectiveSide\(\)\s*==\s*Side\.CLIENT', 'PlatformServiceHolder.get().isLogicalClient()'), + + # Loader + @('Loader\.isModLoaded\s*\(([^)]+)\)', 'PlatformServiceHolder.get().isModLoaded($1)'), + + # MathHelper + @('MathHelper\.clamp_int\s*\(', 'ValueUtil.clampInt('), + @('MathHelper\.clamp_float\s*\(', 'ValueUtil.clampFloat('), + @('MathHelper\.clamp_double\s*\(', 'ValueUtil.clampDouble('), + @('MathHelper\.sqrt_double\s*\(', 'Math.sqrt('), + @('MathHelper\.sqrt_float\s*\(', '(float)Math.sqrt('), + @('MathHelper\.floor_double\s*\(', 'ValueUtil.floorDouble('), + @('MathHelper\.floor_float\s*\(', 'ValueUtil.floorFloat('), + @('MathHelper\.sin\s*\(', '(float)Math.sin('), + @('MathHelper\.cos\s*\(', '(float)Math.cos('), + @('MathHelper\.abs\s*\(', 'Math.abs('), + + # EnumChatFormatting + @('EnumChatFormatting\.', 'TextFormatting.'), + + # Constants.NBT + @('Constants\.NBT\.', 'NbtConstants.'), + + # SharedMonsterAttributes + @('SharedMonsterAttributes\.maxHealth', 'Attributes.MAX_HEALTH'), + @('SharedMonsterAttributes\.movementSpeed', 'Attributes.MOVEMENT_SPEED'), + @('SharedMonsterAttributes\.attackDamage', 'Attributes.ATTACK_DAMAGE'), + @('SharedMonsterAttributes\.followRange', 'Attributes.FOLLOW_RANGE'), + @('SharedMonsterAttributes\.knockbackResistance', 'Attributes.KNOCKBACK_RESISTANCE'), + + # Annotations + @('@SideOnly\s*\(\s*Side\.CLIENT\s*\)', '@ClientOnly'), + @('@SideOnly\s*\(\s*Side\.SERVER\s*\)', '@ServerOnly') +) +``` + +### Step 3.5: Generate-Stubs + +Classes that will be referenced but aren't in scope. These are TEMPORARY placeholders. + +```powershell +Generate-Stubs -Stubs @( + @{ pkg='noppes.npcs'; name='CustomNpcs'; type='class'; + body=' public static java.io.File Dir = new java.io.File("."); + public static int DefaultInteractLine = 0; + public static java.util.logging.Logger logger;' }, + @{ pkg='noppes.npcs'; name='EventHooks'; type='class'; + body=' // STUB - event dispatch stays in mc1710' }, + @{ pkg='noppes.npcs'; name='LogWriter'; type='class'; + body=' public static void info(String msg) {} + public static void warn(String msg) {} + public static void error(String msg) {} + public static void error(String msg, Throwable e) {}' }, + @{ pkg='noppes.npcs.controllers'; name='SyncController'; type='class'; + body=' // STUB - sync stays in mc1710' }, + @{ pkg='noppes.npcs.entity'; name='EntityNPCInterface'; type='class'; + body=' // STUB - entity stays in mc1710' } +) +``` + +### Step 3.6: Dedupe-Imports + +```powershell +Dedupe-Imports -Directory 'core/src/main/java' +``` + +### Step 3.7: All-in-One Wave Script + +**All steps 3.1–3.6 go into a single `.ps1` file:** + +``` +tools/migration/wave1_core_extraction.ps1 +``` + +Execute: +```bash +powershell -ExecutionPolicy Bypass -File "tools/migration/wave1_core_extraction.ps1" +``` + +--- + +## 5. Phase 4 — Verification & Stabilization + +### Goal +Get `:core:compileJava` to pass. Diagnose and fix all errors categorically. + +### Step 4.1: Initial Build-Report + +```powershell +Build-Report -GradleTask ':core:compileJava' -MaxSamples 10 +``` + +**Expected error categories and fixes:** + +| Category | Likely Cause | Fix | +|----------|-------------|-----| +| `MISSING_PACKAGE` | Leftover MC import Nuke-Imports missed | Re-run Nuke with expanded prefixes | +| `MISSING_CLASS` | Transitive dep not in scope | Generate-Stubs | +| `MISSING_METHOD` | PA interface missing method | Add method to PA interface via pa_editor | +| `TYPE_MISMATCH` | Wrong PA type used | Check Symbol-Swap mapping | +| `BAD_ARGS` | Method signature changed | Static-Transform or manual fix | +| `ABSTRACT_VIOLATION` | Class implements MC interface | Remove `implements` or stub | + +### Step 4.2: Batch migration-diff + +Run `migration-diff` on ALL copied files to verify completeness: + +```bash +# For each migrated file: +python tools/migration/analyze.py migration-diff \ + --old src/main/java/noppes/npcs/controllers/QuestController.java \ + --new core/src/main/java/noppes/npcs/controllers/QuestController.java \ + --json +``` + +**⚠️ TOOLING GAP:** No batch migration-diff exists. Need to script a loop or build `batch_migration_diff.py`. + +### Step 4.3: Store Diagnostic Cache + +All outputs cached in JSON for easy navigation: + +```bash +# Build report +python tools/migration/analyze.py coverage-report --json > tools/migration/_wave1_coverage.json + +# All migration-diff results +python tools/migration/_batch_migration_diff.py --output tools/migration/_wave1_diffs.json +``` + +### Step 4.4: Fix Cycle + +``` +WHILE build fails: + 1. Build-Report → categorize errors + 2. MISSING_PACKAGE → Nuke-Imports (add new prefixes) + 3. MISSING_CLASS → Generate-Stubs OR Create-And-Propagate (if PA needed) + 4. MISSING_METHOD → pa_editor (add to PA) OR Static-Transform (rename) + 5. TYPE_MISMATCH → Symbol-Swap (fix mapping) OR manual cast + 6. Dedupe-Imports + 7. Build-Report → verify error count dropped +``` + +### Step 4.5: Final Verification + +```bash +# Build must pass +./gradlew :core:compileJava + +# Coverage should improve significantly +python tools/migration/analyze.py coverage-report --detailed + +# mc1710 build must also still pass +./gradlew build +``` + +--- + +## 6. Missing Tools — Build Before Execution + +### 6A. `generate_pa_manifest.py` (HIGH PRIORITY) + +**Purpose:** Bridge the gap between analysis data → executable pa_batch manifest. + +**Input:** +- `mc_type_classifications_original.json` — which types need PAs +- `all_methods_export.json` — what methods each type has +- `mc_usage_index.json` — which files use which types +- Package scope filter — list of package prefixes to restrict to + +**Output:** +- `pa_batch` manifest JSON with complete Java interface/class content +- Swap table (old → new symbol mappings) for Symbol-Swap +- Static-Transform pattern list for SERVICE types + +**Key behavior:** +1. Read classifications, filter to INTERFACE types +2. For each INTERFACE type, filter to types used in specified packages (via usage index) +3. For each filtered type, read methods from `all_methods_export.json` +4. Generate Java interface content with correct package mapping: + - `net.minecraft.X` → `common.minecraft.X` + - `net.minecraftforge.X` → `common.minecraftforge.X` + - `cpw.mods.X` → `common.minecraftforge.X` +5. Output pa_batch manifest JSON + +**Estimated development time:** 2-3 hours + +**Why this is critical:** Without it, composing the manifest for ~15-20 PA interfaces is manual and error-prone. Each interface needs the RIGHT methods (from all_methods_export), the RIGHT package, and the RIGHT imports. This tool automates the entire process. + +### 6B. `batch_migration_diff.py` (MEDIUM PRIORITY) + +**Purpose:** Run `migration-diff` on ALL migrated files in one command, output unified JSON. + +**Input:** +- Source root (mc1710 path) +- Target root (core path) +- List of migrated file paths (or auto-discover by comparing directories) + +**Output:** +- JSON with per-file PASS/WARN/FAIL verdicts +- Aggregate statistics +- Cached for agent navigation + +**Estimated development time:** 1-2 hours + +### 6C. `generate_wave_script.py` (LOW PRIORITY — nice to have) + +**Purpose:** Auto-generate the complete `.ps1` wave script from classification data. + +**Input:** +- Type classifications +- Package scope +- Phase parameters + +**Output:** +- Complete `.ps1` file with Copy-Recursive + Nuke + Swap + Transform + Stubs + Dedupe + Build + +**Estimated development time:** 2-3 hours + +**Why low priority:** The wave script can be composed manually from the plan. Automation saves time on FUTURE waves but is not blocking for Wave 1. + +--- + +## 7. Execution Checklist + +### Pre-Flight + +- [ ] **Tool development:** Build `generate_pa_manifest.py` +- [ ] **Scope verification:** Run `type-usage` for each INTERFACE/SERVICE type against whitelisted packages +- [ ] **Confirm existing PAs:** Verify all 11 EXISTING types have complete PA interfaces (run `surface-miner --compare-existing`) +- [ ] **Git clean state:** Ensure working tree is clean before starting + +### Phase 1 Execution + +- [ ] Generate PA manifest via `generate_pa_manifest.py` +- [ ] Dry-run: `pa_batch.py manifest.json --dry-run` +- [ ] Create PAs: `pa_batch.py manifest.json --force` +- [ ] Edit PlatformService with SERVICE methods: `pa_editor.py` +- [ ] Create TRANSFORM support classes: `pa_batch.py` +- [ ] Verify: `ls platform-api/src/main/java/common/` + +### Phase 2 Execution + +- [ ] Write wave script with Copy-Recursive params +- [ ] Execute: Copy ~150-187 files to core/ +- [ ] Verify: count files in core/ (should increase by ~150) + +### Phase 3 Execution + +- [ ] Execute wave script (Nuke + Swap + Transform + Stubs + Dedupe) +- [ ] Initial Build-Report + +### Phase 4 Execution + +- [ ] Fix cycle until `:core:compileJava` passes +- [ ] Run batch migration-diff +- [ ] Store diagnostic cache +- [ ] Run `coverage-report` — measure improvement +- [ ] Verify mc1710 build still passes: `./gradlew build` +- [ ] **Human commits** (agent does NOT commit) + +--- + +## 8. Risk Assessment + +| Risk | Impact | Mitigation | +|------|--------|------------| +| Script system files copied (deeply MC-coupled) | Build explosion | AllowRecursePaths prevents recursion into script packages | +| Symbol-Swap replaces too aggressively (e.g., `Entity` → `IEntity` in non-type contexts) | Broken code | Word-boundary regex in Symbol-Swap handles this. Verify with migration-diff. | +| Some controllers have too many MC deps to clean up | Phase 3 stalls | Generate-Stubs for anything not in scope. Fix cycle handles residuals. | +| Config system needs Forge Configuration deeply | Config files can't compile | IConfiguration PA must match Forge API surface closely. Use surface-miner to verify. | +| Role/Quest files reference EntityNPCInterface | Missing stubs | Generate-Stubs for EntityNPCInterface. Core version is a placeholder. | +| Copy-Recursive pulls in too many transitive deps | Scope explosion | AllowPaths + AllowRecursePaths constrain the recursion tightly | + +--- + +## 9. Success Criteria + +| Metric | Before | Target | +|--------|--------|--------| +| Files in core/ | 141 | ~290-330 | +| PA type coverage (types with abstractions) | 11/400 (2.8%) | ~30/400 (7.5%) | +| PA import coverage (imports to abstracted types) | 37.1% | ~55-60% | +| `:core:compileJava` | PASS | PASS | +| `:build` (mc1710) | PASS | PASS | + +--- + +## Appendix A: Complete Swap Table + +This is the full `-Swaps` parameter for Symbol-Swap, combining EXISTING + new INTERFACE types. + +```powershell +$AllSwaps = @( + # === EXISTING (11) === + @('NBTTagCompound', 'INbt', 'net.minecraft.nbt.NBTTagCompound', 'noppes.npcs.api.INbt'), + @('NBTTagList', 'INbtList', 'net.minecraft.nbt.NBTTagList', 'noppes.npcs.api.INbtList'), + @('EntityPlayer', 'IPlayer', 'net.minecraft.entity.player.EntityPlayer', 'noppes.npcs.api.entity.IPlayer'), + @('EntityPlayerMP', 'IPlayer', 'net.minecraft.entity.player.EntityPlayerMP', 'noppes.npcs.api.entity.IPlayer'), + @('Entity', 'IEntity', 'net.minecraft.entity.Entity', 'noppes.npcs.api.entity.IEntity'), + @('ItemStack', 'IItemStack', 'net.minecraft.item.ItemStack', 'noppes.npcs.api.item.IItemStack'), + @('EntityLivingBase', 'IEntityLivingBase', 'net.minecraft.entity.EntityLivingBase', 'noppes.npcs.api.entity.IEntityLivingBase'), + @('World', 'IWorld', 'net.minecraft.world.World', 'noppes.npcs.api.IWorld'), + @('WorldServer', 'IWorld', 'net.minecraft.world.WorldServer', 'noppes.npcs.api.IWorld'), + @('DamageSource', 'IDamageSource', 'net.minecraft.util.DamageSource', 'noppes.npcs.api.IDamageSource'), + @('EntityLiving', 'IEntityLiving', 'net.minecraft.entity.EntityLiving', 'noppes.npcs.api.entity.IEntityLiving'), + + # === NEW INTERFACE (15) === + @('ResourceLocation', 'IResourceLocation', 'net.minecraft.util.ResourceLocation', 'common.minecraft.util.IResourceLocation'), + @('ICommandSender', 'ICommandSender', 'net.minecraft.command.ICommandSender', 'common.minecraft.command.ICommandSender'), + @('ChatComponentText', 'ITextComponent', 'net.minecraft.util.ChatComponentText', 'common.minecraft.util.ITextComponent'), + @('ChatComponentTranslation', 'ITextComponent', 'net.minecraft.util.ChatComponentTranslation', 'common.minecraft.util.ITextComponent'), + @('IChatComponent', 'ITextComponent', 'net.minecraft.util.IChatComponent', 'common.minecraft.util.ITextComponent'), + @('ChatStyle', 'ITextStyle', 'net.minecraft.util.ChatStyle', 'common.minecraft.util.ITextStyle'), + @('NBTBase', 'INbtBase', 'net.minecraft.nbt.NBTBase', 'common.minecraft.nbt.INbtBase'), + @('Configuration', 'IConfiguration', 'net.minecraftforge.common.config.Configuration', 'common.minecraftforge.common.config.IConfiguration'), + @('Property', 'IConfigProperty', 'net.minecraftforge.common.config.Property', 'common.minecraftforge.common.config.IConfigProperty'), + @('AxisAlignedBB', 'IBoundingBox', 'net.minecraft.util.AxisAlignedBB', 'common.minecraft.util.IBoundingBox'), + @('Vec3', 'IVector3', 'net.minecraft.util.Vec3', 'common.minecraft.util.IVector3'), + @('MovingObjectPosition', 'IRayTraceResult', 'net.minecraft.util.MovingObjectPosition', 'common.minecraft.util.IRayTraceResult'), + @('Potion', 'IPotionType', 'net.minecraft.potion.Potion', 'common.minecraft.potion.IPotionType'), + @('PotionEffect', 'IPotionEffect', 'net.minecraft.potion.PotionEffect', 'common.minecraft.potion.IPotionEffect'), + @('Explosion', 'IExplosion', 'net.minecraft.world.Explosion', 'common.minecraft.world.IExplosion') +) +``` + +## Appendix B: Static-Transform Registry + +Complete list from Section 4, Step 3.4. All patterns use .NET regex syntax for PowerShell. + +## Appendix C: File Inventory by Package + +### Files to copy (not already in core/) + +**noppes/npcs/controllers/** (estimated ~60 new): +- QuestController, PlayerQuestController, PlayerDataController, DialogController +- LinkedItemController, LinkedNpcController, PartyController, AuctionController +- CustomEffectController, CustomGuiController, BankController, ChunkController +- RecipeController, SpawnController, ServerCloneController, AnimationController +- ScriptController, ScriptHookController, MarketRegistry, HookDefinition +- + ~40 data/* classes (Quest, Dialog, PlayerData, etc.) + +**noppes/npcs/quests/** (6 new): +- QuestItem, QuestKill, QuestLocation, QuestDialog, QuestManual, QuestInterface + +**noppes/npcs/roles/** (24 new): +- RoleTrader, RoleBank, RoleFollower, RoleCompanion, RoleTransporter, RolePostman +- RoleMount, RoleInterface, RoleInnkeeper, RoleAuctioneer +- JobBard, JobGuard, JobHealer, JobSpawner, JobItemGiver, JobFollower, JobConversation, JobChunkLoader, JobInterface +- companion/* (5 files) + +**noppes/npcs/config/** (15 new): +- ConfigMain, ConfigClient, ConfigScript, ConfigMarket, ConfigEnergy, ConfigItem +- ConfigDebug, ConfigExperimental, ConfigMixin, LoadConfiguration, StringCache, GlyphCache +- legacy/* (3 files) + +**noppes/npcs/util/** (3 new MC-free): +- GameProfileAlt, JsonException, ScriptToStringHelper + +**kamkeel/npcs/controllers/** (estimated ~75 new): +- AbilityController, EnergyController, ProfileController, AttributeController +- TelegraphController, SyncController +- + ~69 data/* classes (abilities, ability types, conditions, etc.) + +**noppes/npcs/constants/** (~3 new): +- ScriptContext, EnumPotionType, EnumNotificationType (others already in core/) diff --git a/tools/migration/_batch_diffs.json b/tools/migration/_batch_diffs.json new file mode 100644 index 000000000..76f951ec1 --- /dev/null +++ b/tools/migration/_batch_diffs.json @@ -0,0 +1,3010 @@ +{ + "_meta": { + "generated": "2026-03-16T01:18:34.138209+00:00", + "mc_root": "mc1710/src/main/java", + "core_root": "core/src/main/java", + "classifications_source": "tools/migration/mc_type_mappings.json", + "total_files_in_core": 140, + "files_with_counterpart": 32, + "files_without_counterpart": 108, + "passed": 18, + "warned": 6, + "failed": 8 + }, + "results": [ + { + "relative_path": "kamkeel/npcs/controllers/data/ability/conditions/ConditionFilter.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/controllers/data/ability/conditions/ConditionFilter.java", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/conditions/ConditionFilter.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyAnchorData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyAnchorData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyBarrierData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyBarrierData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyChargingData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyChargingData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyCombatData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyCombatData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyDisplayData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyDisplayData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyHomingData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyHomingData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyLifespanData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyLifespanData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyLightningData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyLightningData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/energy/EnergyPanelData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/energy/EnergyPanelData.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/data/ProjectileData.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/controllers/data/ability/data/ProjectileData.java", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/data/ProjectileData.java", + "verdict": "WARN", + "verdict_reason": "2 body diff(s)", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 2, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [ + { + "name": "readNBT", + "signature": "void readNBT(NBTTagCompound nbt)", + "similarity_ratio": 0.824, + "diff_line_count": 3, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,6 @@", + " {", + "- anchor.readNBT(new NBTWrapper(nbt));", + "+ // OLD: anchor.readNBT(new NBTWrapper(nbt));", + "+ anchor.readNBT(nbt);", + " colorOverride = nbt.getBoolean(\"colorOverride\");", + " if (colorOverride) {", + " innerColor = nbt.getInteger(\"overrideInnerColor\");" + ] + }, + { + "name": "writeNBT", + "signature": "void writeNBT(NBTTagCompound nbt)", + "similarity_ratio": 0.824, + "diff_line_count": 3, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,6 @@", + " {", + "- anchor.writeNBT(new NBTWrapper(nbt));", + "+ // OLD: anchor.writeNBT(new NBTWrapper(nbt));", + "+ anchor.writeNBT(nbt);", + " nbt.setBoolean(\"colorOverride\", colorOverride);", + " if (colorOverride) {", + " nbt.setInteger(\"overrideInnerColor\", innerColor);" + ] + } + ] + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/AbilityPhase.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/AbilityPhase.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/AnchorPoint.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/AnchorPoint.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/HitType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/HitType.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/InvulnerableMode.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/InvulnerableMode.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/LockMode.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/LockMode.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/RotationMode.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/RotationMode.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/TargetFilter.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/TargetFilter.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/TargetingMode.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/TargetingMode.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/ability/enums/UserType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/ability/enums/UserType.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/attribute/AttributeDefinition.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/attribute/AttributeDefinition.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/attribute/AttributeValueType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/attribute/AttributeValueType.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/attribute/PlayerAttribute.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/attribute/PlayerAttribute.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/attribute/PlayerAttributeMap.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/attribute/PlayerAttributeMap.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/profile/EnumProfileOperation.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/profile/EnumProfileOperation.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/profile/ProfileInfoEntry.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/profile/ProfileInfoEntry.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/profile/ProfileOperation.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/controllers/data/profile/ProfileOperation.java", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/profile/ProfileOperation.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/controllers/data/profile/Slot.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/controllers/data/profile/Slot.java", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/profile/Slot.java", + "verdict": "WARN", + "verdict_reason": "2 body diff(s)", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 2, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [ + { + "name": "fromNBT", + "signature": "Slot fromNBT(int id, NBTTagCompound slotNBT)", + "similarity_ratio": 0.812, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -6,10 +6,10 @@", + " slot.setLastLoaded(lastLoaded);", + " slot.setTemporary(temporary);", + " if (slotNBT.hasKey(\"Components\")) {", + "- INbt compCompound = slotNBT.getCompoundTag(\"Components\");", + "- Set keys = compCompound.func_150296_c();", + "+ INbt compCompound = slotNBT.getCompound(\"Components\");", + "+ Set keys = compCompound.getKeySet();" + ] + }, + { + "name": "toNBT", + "signature": "NBTTagCompound toNBT()", + "similarity_ratio": 0.667, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbt slotNBT = new INbt();", + "+ INbt slotNBT = NBT.compound();", + " slotNBT.setString(\"Name\", name);", + " slotNBT.setLong(\"LastLoaded\", lastLoaded);", + " slotNBT.setBoolean(\"Temporary\", temporary);", + "- INbt compCompound = new INbt();" + ] + } + ] + }, + { + "relative_path": "kamkeel/npcs/controllers/data/telegraph/Telegraph.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/telegraph/Telegraph.java" + }, + { + "relative_path": "kamkeel/npcs/controllers/data/telegraph/TelegraphType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/controllers/data/telegraph/TelegraphType.java" + }, + { + "relative_path": "kamkeel/npcs/developer/Developer.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/developer/Developer.java", + "new_file": "core/src/main/java/kamkeel/npcs/developer/Developer.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumChannelType.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumChannelType.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumChannelType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumConfigOperation.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumConfigOperation.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumConfigOperation.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumDataPacket.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java", + "verdict": "WARN", + "verdict_reason": "1 unmigrated type(s)", + "unmigrated_count": 1, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [ + { + "mc_name": "Explosion", + "pa_name": "IExplosion", + "lines": [ + 80 + ], + "in_import": false + } + ], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumItemPacketType.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumItemPacketType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumPlayerPacket.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumPlayerPacket.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumPlayerPacket.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumRequestPacket.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumSoundOperation.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumSoundOperation.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumSoundOperation.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumSyncAction.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumSyncAction.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumSyncAction.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/network/enums/EnumSyncType.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/network/enums/EnumSyncType.java", + "new_file": "core/src/main/java/kamkeel/npcs/network/enums/EnumSyncType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/util/CNPCDebug.java", + "old_file": "mc1710/src/main/java/kamkeel/npcs/util/CNPCDebug.java", + "new_file": "core/src/main/java/kamkeel/npcs/util/CNPCDebug.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "kamkeel/npcs/util/FileNameHelper.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/util/FileNameHelper.java" + }, + { + "relative_path": "kamkeel/npcs/util/TextSplitter.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/kamkeel/npcs/util/TextSplitter.java" + }, + { + "relative_path": "noppes/npcs/constants/AiMutex.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/AiMutex.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAnimation.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAnimation.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAnimationPart.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAnimationPart.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAuctionPage.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAuctionPage.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAuctionSort.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAuctionSort.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAvailabilityDialog.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAvailabilityDialog.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAvailabilityFaction.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAvailabilityFaction.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAvailabilityFactionType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAvailabilityFactionType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumAvailabilityQuest.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumAvailabilityQuest.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumBannerVariant.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumBannerVariant.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumBardInstrument.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumBardInstrument.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumCategoryType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumCategoryType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumCombatPolicy.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumCombatPolicy.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumCompanionJobs.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumCompanionJobs.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumCompanionStage.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumCompanionStage.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumDayTime.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumDayTime.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumDiagramLayout.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumDiagramLayout.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumGuiType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumGuiType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumJobType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumJobType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumMovingType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumMovingType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumNavType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumNavType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumNpcToolMaterial.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumNpcToolMaterial.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumOptionType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumOptionType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumParticleType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumParticleType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumPartyExchange.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumPartyExchange.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumPartyObjectives.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumPartyObjectives.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumPartyRequirements.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumPartyRequirements.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumPlayerData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumPlayerData.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumPlayerPacket.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumProfileSync.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumProfileSync.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumQuestCompletion.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumQuestCompletion.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumQuestRepeat.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumQuestRepeat.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumQuestType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumQuestType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumRoleType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumRoleType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumScriptType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumScriptType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumScrollData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumScrollData.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumStandingType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumStandingType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumStockReset.java", + "old_file": "mc1710/src/main/java/noppes/npcs/constants/EnumStockReset.java", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumStockReset.java", + "verdict": "WARN", + "verdict_reason": "2 body diff(s)", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 2, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [ + { + "name": "getDisplayName", + "signature": "String getDisplayName()", + "similarity_ratio": 0.667, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,3 +1,3 @@", + " {", + "- return StatCollector.translateToLocal(langKey);", + "+ return langKey;", + " }" + ] + }, + { + "name": "getDisplayNames", + "signature": "String[] getDisplayNames()", + "similarity_ratio": 0.875, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -2,7 +2,7 @@", + " EnumStockReset[] values = values();", + " String[] names = new String[values.length];", + " for (int i = 0; i < values.length; i++) {", + "- names[i] = values[i].getDisplayName();", + "+ names[i] = values[i].langKey;", + " }", + " return names;" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/constants/EnumTextureType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumTextureType.java" + }, + { + "relative_path": "noppes/npcs/constants/EnumTradeSlotType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/EnumTradeSlotType.java" + }, + { + "relative_path": "noppes/npcs/constants/MarkType.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/MarkType.java" + }, + { + "relative_path": "noppes/npcs/constants/NBTTypes.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/constants/NBTTypes.java" + }, + { + "relative_path": "noppes/npcs/controllers/APIRegistry.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/APIRegistry.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/APIRegistry.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/controllers/CategoryManager.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/CategoryManager.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/CategoryManager.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/controllers/data/AbilityHotbarData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/AbilityHotbarData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/AuctionFilter.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/AuctionFilter.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Category.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Category.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/CloneFolder.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/CloneFolder.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/DialogColorData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/DialogColorData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/DialogImage.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/DialogImage.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/EffectKey.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/EffectKey.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Faction.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/data/Faction.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Faction.java", + "verdict": "FAIL", + "verdict_reason": "4 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 4, + "semantic_diffs_count": 2, + "unmigrated": [ + { + "mc_name": "EntityPlayer", + "pa_name": "IPlayer", + "lines": [ + 81, + 82, + 83, + 87, + 88, + 89 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "isAggressiveToNpc", + "signature": "boolean isAggressiveToNpc(EntityNPCInterface entity)", + "line": 97 + }, + { + "name": "isAggressiveToPlayer", + "signature": "boolean isAggressiveToPlayer(IPlayer player)", + "line": 217 + }, + { + "name": "isFriendlyToPlayer", + "signature": "boolean isFriendlyToPlayer(IPlayer player)", + "line": 209 + }, + { + "name": "isNeutralToPlayer", + "signature": "boolean isNeutralToPlayer(IPlayer player)", + "line": 213 + } + ], + "semantic_body_diffs": [ + { + "name": "getEnemyFactions", + "signature": "IFaction[] getEnemyFactions()", + "similarity_ratio": 0.625, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,9 +1,7 @@", + " {", + "- ArrayList enemyFactions = new ArrayList<>();", + "-", + "+ ArrayList enemyFactions = new ArrayList<>();", + " for (int id : this.attackFactions) {", + " enemyFactions.add(FactionController.getInstance().get(id));", + " }" + ] + }, + { + "name": "writeNBT", + "signature": "void writeNBT(NBTTagCompound compound)", + "similarity_ratio": 0.933, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -11,5 +11,5 @@", + " compound.setBoolean(\"GetsAttacked\", getsAttacked);", + " compound.setBoolean(\"IsPassive\", isPassive);", + " ", + "- compound.setTag(\"AttackFactions\", NBTTags.nbtIntegerSet(attackFactions));", + "+ compound.setTagList(\"AttackFactions\", NBTTags.nbtIntegerSet(attackFactions));", + " }" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/data/Frame.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Frame.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/FramePart.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/FramePart.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/HitboxData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/HitboxData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/InnDoorData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/InnDoorData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/ItemDisplayData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/ItemDisplayData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Line.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Line.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Lines.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Lines.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Magic.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/data/Magic.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Magic.java", + "verdict": "FAIL", + "verdict_reason": "2 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 2, + "semantic_diffs_count": 2, + "unmigrated": [ + { + "mc_name": "ItemStack", + "pa_name": "IItemStack", + "lines": [ + 18, + 19, + 47, + 51, + 81, + 84, + 88, + 89 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "getItem", + "signature": "ItemStack getItem()", + "line": 144 + }, + { + "name": "setItem", + "signature": "void setItem(ItemStack item)", + "line": 135 + } + ], + "semantic_body_diffs": [ + { + "name": "readNBT", + "signature": "void readNBT(NBTTagCompound compound)", + "similarity_ratio": 0.655, + "diff_line_count": 19, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -6,21 +6,18 @@", + " ", + " type = EnumTextureType.values()[compound.getInteger(\"Type\")];", + " iconTexture = compound.getString(\"IconTexture\");", + "- if (type == EnumTextureType.ITEM && !iconTexture.isEmpty()) {", + "- String[] parts = iconTexture.split(\":\");", + "- if (parts.length == 2) {", + "- String modID = parts[0];" + ] + }, + { + "name": "writeNBT", + "signature": "void writeNBT(NBTTagCompound compound)", + "similarity_ratio": 0.511, + "diff_line_count": 23, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -5,22 +5,17 @@", + " compound.setInteger(\"Color\", color);", + " compound.setString(\"IconTexture\", iconTexture);", + " compound.setInteger(\"Type\", type.ordinal());", + "- INbtList interactionsList = new INbtList();", + "+ INbtList interactionsList = NBT.list();", + " for (Map.Entry entry : interactions.entrySet()) {", + "- INbt interactionTag = new INbt();" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/data/MagicAssociation.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/MagicAssociation.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/MagicCycle.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/MagicCycle.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/MagicData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/MagicData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/MagicEntry.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/MagicEntry.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/PartyOptions.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/PartyOptions.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/PlayerDialogData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/PlayerDialogData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/PlayerEffect.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/data/PlayerEffect.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/PlayerEffect.java", + "verdict": "WARN", + "verdict_reason": "1 unmigrated type(s), 2 body diff(s)", + "unmigrated_count": 1, + "missing_methods_count": 0, + "semantic_diffs_count": 2, + "unmigrated": [ + { + "mc_name": "EntityPlayer", + "pa_name": "IPlayer", + "lines": [ + 71, + 74 + ], + "in_import": false + } + ], + "missing_methods": [], + "semantic_body_diffs": [ + { + "name": "getName", + "signature": "String getName()", + "similarity_ratio": 0.4, + "diff_line_count": 9, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,8 @@", + " {", + "- CustomEffect effect = CustomEffectController.getInstance().get(this.id, this.index);", + "- if (effect != null)", + "- return effect.getName();", + "-", + "+ // TODO: Requires CustomEffectController - implement via callback or platform service", + "+ // OLD CODE:" + ] + }, + { + "name": "performEffect", + "signature": "void performEffect(IPlayer player)", + "similarity_ratio": 0.211, + "diff_line_count": 15, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,12 @@", + " {", + "- if (player != null && player.getMCEntity() != null && player.getMCEntity() instanceof IPlayer) {", + "- CustomEffect effect = CustomEffectController.getInstance().get(this.id, this.index);", + "- if (effect != null)", + "- effect.onTick((IPlayer) player.getMCEntity(), this);", + "- }", + "+ // Base implementation is a no-op. mc1710 shadow overrides to use" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/data/PlayerEffectData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/PlayerEffectData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/PlayerTransportData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/PlayerTransportData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/ProfileOptions.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/ProfileOptions.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/SkinOverlay.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/SkinOverlay.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/Tag.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/Tag.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/TagMap.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/TagMap.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/TintData.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/TintData.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/TraderStock.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/TraderStock.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/TransportCategory.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/TransportCategory.java" + }, + { + "relative_path": "noppes/npcs/controllers/data/TransportLocation.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/controllers/data/TransportLocation.java" + }, + { + "relative_path": "noppes/npcs/controllers/FactionController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/FactionController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/FactionController.java", + "verdict": "FAIL", + "verdict_reason": "1 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 1, + "semantic_diffs_count": 7, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 157 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "loadFactions", + "signature": "void loadFactions(DataInputStream stream)", + "line": 83 + } + ], + "semantic_body_diffs": [ + { + "name": "delete", + "signature": "IFaction delete(int id)", + "similarity_ratio": 0.848, + "diff_line_count": 5, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,14 @@", + " {", + " if (id >= 0 && this.factions.size() > 1) {", + "- Faction faction = (Faction) this.factions.remove(id);", + "+ Faction faction = this.factions.remove(id);", + " saveFactions();", + " if (faction == null) {", + " return null;" + ] + }, + { + "name": "getNBT", + "signature": "NBTTagCompound getNBT()", + "similarity_ratio": 0.615, + "diff_line_count": 10, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,13 @@", + " {", + "- INbtList list = new INbtList();", + "+ INbtList list = NBT.list();", + " for (int slot : factions.keySet()) {", + " Faction faction = factions.get(slot);", + "- INbt nbtfactions = new INbt();", + "+ INbt nbtfactions = NBT.compound();" + ] + }, + { + "name": "list", + "signature": "List list()", + "similarity_ratio": 0.667, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,3 +1,3 @@", + " {", + "- return new ArrayList(this.factions.values());", + "+ return new ArrayList(this.factions.values());", + " }" + ] + }, + { + "name": "load", + "signature": "void load()", + "similarity_ratio": 0.966, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " factions = new HashMap();", + " lastUsedID = 0;", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " if (saveDir == null) {", + " return;" + ] + }, + { + "name": "loadFactionsFile", + "signature": "void loadFactionsFile(File file)", + "similarity_ratio": 0.333, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,7 @@", + " {", + "- DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "- loadFactions(var1);", + "- var1.close();", + "+ // OLD: DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "+ // OLD: loadFactions(var1);", + "+ // OLD: var1.close();" + ] + }, + { + "name": "saveFaction", + "signature": "void saveFaction(Faction faction)", + "similarity_ratio": 0.829, + "diff_line_count": 7, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -13,8 +13,9 @@", + " factions.remove(faction.id);", + " factions.put(faction.id, faction);", + " ", + "- INbt facCompound = new INbt();", + "- faction.writeNBT(facCompound);", + "- SyncController.syncUpdate(EnumSyncType.FACTION, -1, facCompound);", + "+ // TODO: mc1710 version also calls:" + ] + }, + { + "name": "saveFactions", + "signature": "void saveFactions()", + "similarity_ratio": 0.826, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,10 +1,11 @@", + " {", + " try {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " File file = new File(saveDir, \"factions.dat_new\");", + " File file1 = new File(saveDir, \"factions.dat_old\");", + " File file2 = new File(saveDir, \"factions.dat\");" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/GlobalDataController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/GlobalDataController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/GlobalDataController.java", + "verdict": "WARN", + "verdict_reason": "1 unmigrated type(s), 3 body diff(s)", + "unmigrated_count": 1, + "missing_methods_count": 0, + "semantic_diffs_count": 3, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 41, + 54 + ], + "in_import": false + } + ], + "missing_methods": [], + "semantic_body_diffs": [ + { + "name": "load", + "signature": "void load()", + "similarity_ratio": 0.947, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,5 @@", + " {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " try {", + " File file = new File(saveDir, \"global.dat\");", + " if (file.exists()) {" + ] + }, + { + "name": "loadData", + "signature": "void loadData(File file)", + "similarity_ratio": 0.4, + "diff_line_count": 9, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,8 @@", + " {", + "- INbt nbttagcompound1;", + "- try (FileInputStream fis = new FileInputStream(file)) {", + "- nbttagcompound1 = CompressedStreamTools.readCompressed(fis);", + "- }", + "+ // OLD: INbt nbttagcompound1;", + "+ // OLD: try (FileInputStream fis = new FileInputStream(file)) {" + ] + }, + { + "name": "saveData", + "signature": "void saveData()", + "similarity_ratio": 0.862, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,15 +1,17 @@", + " {", + " customNPCThread.execute(() -> {", + " try {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " ", + "- INbt nbttagcompound = new INbt();" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/MagicController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/MagicController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/MagicController.java", + "verdict": "FAIL", + "verdict_reason": "1 missing method(s)", + "unmigrated_count": 2, + "missing_methods_count": 1, + "semantic_diffs_count": 8, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 272, + 340 + ], + "in_import": false + }, + { + "mc_name": "ItemStack", + "pa_name": "IItemStack", + "lines": [ + 78, + 81, + 82, + 83, + 84, + 85, + 86, + 87, + 88, + 89 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "loadMagic", + "signature": "void loadMagic(DataInputStream stream)", + "line": 198 + } + ], + "semantic_body_diffs": [ + { + "name": "getNBT", + "signature": "NBTTagCompound getNBT()", + "similarity_ratio": 0.488, + "diff_line_count": 21, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,20 +1,21 @@", + " {", + "- INbtList magicList = new INbtList();", + "+ INbtList magicList = NBT.list();", + " for (Magic mag : magics.values()) {", + "- INbt magCompound = new INbt();", + "+ INbt magCompound = NBT.compound();", + " mag.writeNBT(magCompound);" + ] + }, + { + "name": "load", + "signature": "void load()", + "similarity_ratio": 0.327, + "diff_line_count": 107, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -5,7 +5,7 @@", + " lastUsedCycleID = 0;", + " lastUsedMagicID = 0;", + " ", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " if (saveDir == null) return;", + " try {" + ] + }, + { + "name": "loadMagicFile", + "signature": "void loadMagicFile(File file)", + "similarity_ratio": 0.25, + "diff_line_count": 12, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,9 @@", + " {", + "- DataInputStream stream = new DataInputStream(", + "- new BufferedInputStream(new GZIPInputStream(new FileInputStream(file)))", + "- );", + "- loadMagic(stream);", + "- stream.close();", + "+ // OLD: DataInputStream stream = new DataInputStream(" + ] + }, + { + "name": "removeCycle", + "signature": "void removeCycle(int categoryId)", + "similarity_ratio": 0.8, + "diff_line_count": 3, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,8 @@", + " {", + " if (cycles.containsKey(categoryId)) {", + " cycles.remove(categoryId);", + "- SyncController.syncRemove(EnumSyncType.MAGIC_CYCLE, categoryId);", + "+ // TODO: mc1710 version also calls:", + "+ // OLD: SyncController.syncRemove(EnumSyncType.MAGIC_CYCLE, categoryId);", + " saveMagicData();" + ] + }, + { + "name": "removeMagic", + "signature": "void removeMagic(int magicID)", + "similarity_ratio": 0.8, + "diff_line_count": 3, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,8 @@", + " {", + " if (magics.containsKey(magicID)) {", + " magics.remove(magicID);", + "- SyncController.syncRemove(EnumSyncType.MAGIC, magicID);", + "+ // TODO: mc1710 version also calls:", + "+ // OLD: SyncController.syncRemove(EnumSyncType.MAGIC, magicID);", + " saveMagicData();" + ] + }, + { + "name": "saveCycle", + "signature": "void saveCycle(MagicCycle cycle)", + "similarity_ratio": 0.789, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -11,9 +11,9 @@", + " }", + " cycles.put(cycle.id, cycle);", + " ", + "- INbt cycleCompound = new INbt();", + "- cycle.writeNBT(new NBTWrapper(cycleCompound));", + "- SyncController.syncUpdate(EnumSyncType.MAGIC_CYCLE, -1, cycleCompound);", + "-" + ] + }, + { + "name": "saveMagic", + "signature": "void saveMagic(Magic mag)", + "similarity_ratio": 0.789, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -11,9 +11,9 @@", + " }", + " magics.put(mag.id, mag);", + " ", + "- INbt magicCompound = new INbt();", + "- mag.writeNBT(magicCompound);", + "- SyncController.syncUpdate(EnumSyncType.MAGIC, -1, magicCompound);", + "-" + ] + }, + { + "name": "saveMagicData", + "signature": "void saveMagicData()", + "similarity_ratio": 0.8, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,10 +1,11 @@", + " {", + " try {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " File fileNew = new File(saveDir, \"magic.dat_new\");", + " File fileOld = new File(saveDir, \"magic.dat_old\");", + " File fileCurrent = new File(saveDir, \"magic.dat\");" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/ServerTagMapController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/ServerTagMapController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/ServerTagMapController.java", + "verdict": "FAIL", + "verdict_reason": "1 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 1, + "semantic_diffs_count": 3, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 58 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "loadTagMaps", + "signature": "void loadTagMaps(DataInputStream stream)", + "line": 71 + } + ], + "semantic_body_diffs": [ + { + "name": "getDir", + "signature": "File getDir()", + "similarity_ratio": 0.833, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,5 @@", + " {", + "- File dir = new File(CustomNpcs.getWorldSaveDirectory(), \"clones\");", + "+ File dir = new File(PlatformServiceHolder.get().getWorldSaveDirectory(), \"clones\");", + " if (!dir.exists())", + " dir.mkdir();", + " return dir;" + ] + }, + { + "name": "loadTagMapFile", + "signature": "void loadTagMapFile(File file)", + "similarity_ratio": 0.308, + "diff_line_count": 9, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,8 @@", + " {", + "- DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "- loadTagMaps(var1);", + "- var1.close();", + "+ // OLD: DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "+ // OLD: INbt nbtCompound = CompressedStreamTools.read(var1);", + "+ // OLD: this.tagMap.readNBT(new NBTWrapper(nbtCompound));" + ] + }, + { + "name": "saveTagMap", + "signature": "void saveTagMap(TagMap tagMap)", + "similarity_ratio": 0.893, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -9,7 +9,8 @@", + " File file = new File(saveDir, \"___tagmap.dat_new\");", + " File file1 = new File(saveDir, \"___tagmap.dat_old\");", + " File file2 = new File(saveDir, \"___tagmap.dat\");", + "- CompressedStreamTools.writeCompressed(((NBTWrapper) tagMap.writeNBT()).getMCTag(), new FileOutputStream(file));", + "+ // OLD: CompressedStreamTools.writeCompressed(((NBTWrapper) tagMap.writeNBT()).getMCTag(), new FileOutputStream(file));", + "+ PlatformServiceHolder.get().writeCompressedNBT(tagMap.writeNBT(), file);", + " if (file1.exists()) {" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/TagController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/TagController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/TagController.java", + "verdict": "FAIL", + "verdict_reason": "2 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 2, + "semantic_diffs_count": 9, + "unmigrated": [ + { + "mc_name": "EntityPlayerMP", + "pa_name": "IPlayer", + "lines": [ + 26 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "loadTags", + "signature": "void loadTags(DataInputStream stream)", + "line": 85 + }, + { + "name": "sendCategoryTagMap", + "signature": "void sendCategoryTagMap(EntityPlayerMP player, HashMap> itemTags)", + "line": 289 + } + ], + "semantic_body_diffs": [ + { + "name": "TagController", + "signature": "TagController()", + "similarity_ratio": 0.625, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -2,10 +2,4 @@", + " instance = this;", + " tags = new HashMap();", + " loadTags();", + "-//\t\tif(tags.isEmpty()){", + "-//\t\t\t// TO-DO", + "-//\t\t\ttags.put(0,new Faction(0,\"Friendly\", 0x00DD00, 2000));", + "-//\t\t\ttags.put(1,new Faction(1,\"Neutral\", 0xF2DD00, 1000));" + ] + }, + { + "name": "delete", + "signature": "ITag delete(int id)", + "similarity_ratio": 0.933, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,6 +1,6 @@", + " {", + " if (id >= 0 && this.tags.size() > 1) {", + "- Tag tag = (Tag) this.tags.remove(id);", + "+ Tag tag = this.tags.remove(id);", + " saveTags();", + " if (tag == null) {", + " return null;" + ] + }, + { + "name": "getNBT", + "signature": "NBTTagCompound getNBT()", + "similarity_ratio": 0.519, + "diff_line_count": 13, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,14 @@", + " {", + "- INbtList list = new INbtList();", + "+ INbtList list = NBT.list();", + " for (int slot : tags.keySet()) {", + " Tag tag = tags.get(slot);", + "- INbt nbtfactions = new INbt();", + "- tag.writeNBT(new NBTWrapper(nbtfactions));" + ] + }, + { + "name": "list", + "signature": "List list()", + "similarity_ratio": 0.667, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,3 +1,3 @@", + " {", + "- return new ArrayList(this.tags.values());", + "+ return new ArrayList(this.tags.values());", + " }" + ] + }, + { + "name": "loadTags", + "signature": "void loadTags()", + "similarity_ratio": 0.93, + "diff_line_count": 3, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,6 +1,5 @@", + " {", + "-", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " if (saveDir == null) {", + " return;", + " }" + ] + }, + { + "name": "loadTagsFile", + "signature": "void loadTagsFile(File file)", + "similarity_ratio": 0.333, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,7 @@", + " {", + "- DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "- loadTags(var1);", + "- var1.close();", + "+ // OLD: DataInputStream var1 = new DataInputStream(new BufferedInputStream(new GZIPInputStream(new FileInputStream(file))));", + "+ // OLD: loadTags(var1);", + "+ // OLD: var1.close();" + ] + }, + { + "name": "readTagUUIDs", + "signature": "HashSet readTagUUIDs(NBTTagCompound compound, String key)", + "similarity_ratio": 0.833, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -2,9 +2,9 @@", + " HashSet uuids = new HashSet<>();", + " if (compound.hasKey(key)) {", + " INbtList list = compound.getTagList(key, 8);", + "- for (int i = 0; i < list.tagCount(); i++) {", + "+ for (int i = 0; i < list.size(); i++) {", + " try {", + "- uuids.add(UUID.fromString(list.getStringTagAt(i)));" + ] + }, + { + "name": "saveTags", + "signature": "void saveTags()", + "similarity_ratio": 0.826, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,10 +1,11 @@", + " {", + " try {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " File file = new File(saveDir, \"tags.dat_new\");", + " File file1 = new File(saveDir, \"tags.dat_old\");", + " File file2 = new File(saveDir, \"tags.dat\");" + ] + }, + { + "name": "writeTagUUIDs", + "signature": "void writeTagUUIDs(NBTTagCompound compound, String key, HashSet tagUUIDs)", + "similarity_ratio": 0.667, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,9 +1,9 @@", + " {", + " if (tagUUIDs != null && !tagUUIDs.isEmpty()) {", + "- INbtList list = new INbtList();", + "+ INbtList list = NBT.list();", + " for (UUID uuid : tagUUIDs) {", + "- list.appendTag(new NBTTagString(uuid.toString()));", + "+ list.addString(uuid.toString());" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/controllers/TransportController.java", + "old_file": "mc1710/src/main/java/noppes/npcs/controllers/TransportController.java", + "new_file": "core/src/main/java/noppes/npcs/controllers/TransportController.java", + "verdict": "FAIL", + "verdict_reason": "1 missing method(s)", + "unmigrated_count": 1, + "missing_methods_count": 1, + "semantic_diffs_count": 6, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 22, + 67 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "saveLocation", + "signature": "TransportLocation saveLocation(int categoryId, NBTTagCompound compound, EntityNPCInterface npc)", + "line": 257 + } + ], + "semantic_body_diffs": [ + { + "name": "categories", + "signature": "ITransportCategory[] categories()", + "similarity_ratio": 0.667, + "diff_line_count": 2, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,3 +1,3 @@", + " {", + "- return (new ArrayList<>(categories.values())).toArray(new ITransportCategory[0]);", + "+ return new ArrayList<>(categories.values()).toArray(new TransportCategory[0]);", + " }" + ] + }, + { + "name": "getCategory", + "signature": "ITransportCategory getCategory(String title)", + "similarity_ratio": 0.632, + "diff_line_count": 7, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,8 @@", + " {", + "- TransportCategory category = null;", + " for (TransportCategory c : categories.values()) {", + " if (c.title.equals(title)) {", + "- category = c;", + "- break;", + "+ return c;" + ] + }, + { + "name": "getNBT", + "signature": "NBTTagCompound getNBT()", + "similarity_ratio": 0.5, + "diff_line_count": 12, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList list = new INbtList();", + "+ INbtList list = NBT.list();", + " for (TransportCategory category : categories.values()) {", + "- INbt compound = new INbt();", + "- category.writeNBT(new NBTWrapper(compound));", + "- list.appendTag(compound);" + ] + }, + { + "name": "loadCategories", + "signature": "void loadCategories()", + "similarity_ratio": 0.864, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,5 +1,5 @@", + " {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " if (saveDir == null)", + " return;", + " try {", + "@@ -8,7 +8,7 @@" + ] + }, + { + "name": "loadCategories", + "signature": "void loadCategories(File file)", + "similarity_ratio": 0.692, + "diff_line_count": 16, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,19 +1,21 @@", + " {", + " HashMap locations = new HashMap();", + " HashMap categories = new HashMap();", + "- INbt nbttagcompound1;", + "- try (FileInputStream fis = new FileInputStream(file)) {", + "- nbttagcompound1 = CompressedStreamTools.readCompressed(fis);", + "- }" + ] + }, + { + "name": "saveCategories", + "signature": "void saveCategories()", + "similarity_ratio": 0.826, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,10 +1,11 @@", + " {", + " try {", + "- File saveDir = CustomNpcs.getWorldSaveDirectory();", + "+ File saveDir = PlatformServiceHolder.get().getWorldSaveDirectory();", + " File file = new File(saveDir, \"transport.dat_new\");", + " File file1 = new File(saveDir, \"transport.dat_old\");", + " File file2 = new File(saveDir, \"transport.dat\");" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/core/CoreConfig.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/core/CoreConfig.java" + }, + { + "relative_path": "noppes/npcs/core/NBT.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/core/NBT.java" + }, + { + "relative_path": "noppes/npcs/core/package-info.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/core/package-info.java" + }, + { + "relative_path": "noppes/npcs/NBTTags.java", + "old_file": "mc1710/src/main/java/noppes/npcs/NBTTags.java", + "new_file": "core/src/main/java/noppes/npcs/NBTTags.java", + "verdict": "FAIL", + "verdict_reason": "9 missing method(s)", + "unmigrated_count": 3, + "missing_methods_count": 9, + "semantic_diffs_count": 36, + "unmigrated": [ + { + "mc_name": "NBTTagCompound", + "pa_name": "INbt", + "lines": [ + 515, + 517 + ], + "in_import": false + }, + { + "mc_name": "ItemStack", + "pa_name": "IItemStack", + "lines": [ + 20, + 39, + 42, + 43 + ], + "in_import": false + }, + { + "mc_name": "NBTTagList", + "pa_name": "INbtList", + "lines": [ + 40, + 41, + 428, + 516, + 518, + 521 + ], + "in_import": false + } + ], + "missing_methods": [ + { + "name": "GetScript", + "signature": "List GetScript(NBTTagCompound compound, IScriptHandler handler)", + "line": 555 + }, + { + "name": "GetScriptOld", + "signature": "List GetScriptOld(NBTTagList list, IScriptHandler handler)", + "line": 543 + }, + { + "name": "NBTScript", + "signature": "NBTTagList NBTScript(List scripts)", + "line": 567 + }, + { + "name": "getIntAt", + "signature": "int getIntAt(NBTTagList tagList, int index)", + "line": 578 + }, + { + "name": "getItemStackArray", + "signature": "ItemStack[] getItemStackArray(NBTTagList tagList)", + "line": 51 + }, + { + "name": "getItemStackList", + "signature": "HashMap getItemStackList(NBTTagList tagList)", + "line": 37 + }, + { + "name": "nbtDoubleList", + "signature": "NBTTagList nbtDoubleList(?... ?)", + "line": 488 + }, + { + "name": "nbtItemStackArray", + "signature": "NBTTagList nbtItemStackArray(ItemStack[] inventory)", + "line": 304 + }, + { + "name": "nbtItemStackList", + "signature": "NBTTagList nbtItemStackList(HashMap inventory)", + "line": 286 + } + ], + "semantic_body_diffs": [ + { + "name": "GetLongStringMap", + "signature": "TreeMap GetLongStringMap(NBTTagList tagList)", + "similarity_ratio": 0.6, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,9 +1,9 @@", + " {", + "- TreeMap list = new TreeMap();", + "+ TreeMap list = new TreeMap<>();", + " ", + "- for (int i = 0; i < tagList.tagCount(); ++i) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "- list.put(Long.valueOf(nbttagcompound.getLong(\"Long\")), nbttagcompound.getString(\"String\"));" + ] + }, + { + "name": "NBTLongStringMap", + "signature": "NBTTagList NBTLongStringMap(Map map)", + "similarity_ratio": 0.606, + "diff_line_count": 13, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,16 +1,13 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (map == null) {", + " return nbttaglist;", + " } else {", + "- Iterator var2 = map.keySet().iterator();" + ] + }, + { + "name": "NBTMerge", + "signature": "NBTTagCompound NBTMerge(NBTTagCompound data, NBTTagCompound merge)", + "similarity_ratio": 0.385, + "diff_line_count": 16, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,15 @@", + " {", + "- INbt compound = (INbt) data.copy();", + "- Set names = merge.func_150296_c();", + "+ INbt compound = data.copy();", + "+ Set names = merge.getKeySet();", + " for (String name : names) {", + "- INbtBase base = merge.getTag(name);" + ] + }, + { + "name": "getBooleanList", + "signature": "HashMap getBooleanList(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getBoolean(\"Boolean\"));" + ] + }, + { + "name": "getIntegerArraySet", + "signature": "ArrayList getIntegerArraySet(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " ArrayList set = new ArrayList();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt compound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt compound = tagList.getCompound(i);", + " set.add(compound.getIntArray(\"Array\"));" + ] + }, + { + "name": "getIntegerByteMap", + "signature": "HashMap getIntegerByteMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getByte(\"Byte\"));" + ] + }, + { + "name": "getIntegerDoubleMap", + "signature": "HashMap getIntegerDoubleMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getDouble(\"Double\"));" + ] + }, + { + "name": "getIntegerFloatMap", + "signature": "HashMap getIntegerFloatMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getFloat(\"Float\"));" + ] + }, + { + "name": "getIntegerIntegerMap", + "signature": "HashMap getIntegerIntegerMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getInteger(\"Integer\"));" + ] + }, + { + "name": "getIntegerLongMap", + "signature": "HashMap getIntegerLongMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getLong(\"Long\"));" + ] + }, + { + "name": "getIntegerSet", + "signature": "HashSet getIntegerSet(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashSet list = new HashSet();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.add(nbttagcompound.getInteger(\"Integer\"));" + ] + }, + { + "name": "getIntegerStringMap", + "signature": "HashMap getIntegerStringMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getInteger(\"Slot\"), nbttagcompound.getString(\"Value\"));" + ] + }, + { + "name": "getStringArray", + "signature": "String[] getStringArray(NBTTagList tagList, int size)", + "similarity_ratio": 0.8, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " String[] arr = new String[size];", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " String line = nbttagcompound.getString(\"Value\");" + ] + }, + { + "name": "getStringIntegerArrayMap", + "signature": "HashMap getStringIntegerArrayMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getString(\"Slot\"), nbttagcompound.getIntArray(\"Value\"));" + ] + }, + { + "name": "getStringIntegerArrayMap", + "signature": "HashMap getStringIntegerArrayMap(NBTTagList tagList, int arrayLength)", + "similarity_ratio": 0.8, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " int[] a = nbttagcompound.getIntArray(\"Value\");" + ] + }, + { + "name": "getStringIntegerMap", + "signature": "HashMap getStringIntegerMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getString(\"Slot\"), nbttagcompound.getInteger(\"Value\"));" + ] + }, + { + "name": "getStringList", + "signature": "List getStringList(NBTTagList tagList)", + "similarity_ratio": 0.778, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " List list = new ArrayList();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " String line = nbttagcompound.getString(\"Line\");" + ] + }, + { + "name": "getStringSet", + "signature": "HashSet getStringSet(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashSet list = new HashSet<>();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.add(nbttagcompound.getString(\"String\"));" + ] + }, + { + "name": "getStringStringMap", + "signature": "HashMap getStringStringMap(NBTTagList tagList)", + "similarity_ratio": 0.75, + "diff_line_count": 4, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,7 +1,7 @@", + " {", + " HashMap list = new HashMap();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ for (int i = 0; i < tagList.size(); i++) {", + "+ INbt nbttagcompound = tagList.getCompound(i);", + " list.put(nbttagcompound.getString(\"Slot\"), nbttagcompound.getString(\"Value\"));" + ] + }, + { + "name": "getVectorMap", + "signature": "HashMap> getVectorMap(NBTTagList tagList)", + "similarity_ratio": 0.733, + "diff_line_count": 8, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,11 @@", + " {", + " HashMap> map = new HashMap>();", + "- for (int i = 0; i < tagList.tagCount(); i++) {", + "+ for (int i = 0; i < tagList.size(); i++) {", + " Vector values = new Vector();", + "- INbt nbttagcompound = tagList.getCompoundTagAt(i);", + "+ INbt nbttagcompound = tagList.getCompound(i);" + ] + }, + { + "name": "nbtBooleanList", + "signature": "NBTTagList nbtBooleanList(HashMap updatedSlots)", + "similarity_ratio": 0.786, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,14 +1,14 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (updatedSlots == null)", + " return nbttaglist;", + " HashMap inventory2 = updatedSlots;", + " for (Integer slot : inventory2.keySet()) {" + ] + }, + { + "name": "nbtIntegerArraySet", + "signature": "NBTTagList nbtIntegerArraySet(List set)", + "similarity_ratio": 0.727, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,11 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (set == null)", + " return nbttaglist;", + " for (int[] arr : set) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerByteMap", + "signature": "NBTTagList nbtIntegerByteMap(Map lines)", + "similarity_ratio": 0.75, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (lines == null)", + " return nbttaglist;", + " for (int slot : lines.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerDoubleMap", + "signature": "NBTTagList nbtIntegerDoubleMap(Map lines)", + "similarity_ratio": 0.75, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (lines == null)", + " return nbttaglist;", + " for (int slot : lines.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerFloatMap", + "signature": "NBTTagList nbtIntegerFloatMap(Map lines)", + "similarity_ratio": 0.75, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (lines == null)", + " return nbttaglist;", + " for (int slot : lines.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerIntegerMap", + "signature": "NBTTagList nbtIntegerIntegerMap(Map lines)", + "similarity_ratio": 0.75, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (lines == null)", + " return nbttaglist;", + " for (int slot : lines.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerLongMap", + "signature": "NBTTagList nbtIntegerLongMap(Map lines)", + "similarity_ratio": 0.75, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,12 +1,12 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (lines == null)", + " return nbttaglist;", + " for (int slot : lines.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerSet", + "signature": "NBTTagList nbtIntegerSet(HashSet set)", + "similarity_ratio": 0.727, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,11 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (set == null)", + " return nbttaglist;", + " for (int slot : set) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtIntegerStringMap", + "signature": "NBTBase nbtIntegerStringMap(HashMap map)", + "similarity_ratio": 0.769, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,13 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (map == null)", + " return nbttaglist;", + " for (int slot : map.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtStringArray", + "signature": "NBTTagList nbtStringArray(String[] list)", + "similarity_ratio": 0.786, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,14 +1,14 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (list == null)", + " return nbttaglist;", + " for (int i = 0; i < list.length; i++) {", + " if (list[i] == null)" + ] + }, + { + "name": "nbtStringIntegerArrayMap", + "signature": "NBTTagList nbtStringIntegerArrayMap(Map map)", + "similarity_ratio": 0.769, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,13 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (map == null)", + " return nbttaglist;", + " for (String slot : map.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtStringIntegerMap", + "signature": "NBTTagList nbtStringIntegerMap(Map map)", + "similarity_ratio": 0.769, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,13 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (map == null)", + " return nbttaglist;", + " for (String slot : map.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtStringList", + "signature": "NBTTagList nbtStringList(List list)", + "similarity_ratio": 0.667, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,9 +1,9 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " for (String s : list) {", + "- INbt nbttagcompound = new INbt();", + "+ INbt nbttagcompound = NBT.compound();", + " nbttagcompound.setString(\"Line\", s);" + ] + }, + { + "name": "nbtStringSet", + "signature": "NBTTagList nbtStringSet(HashSet collection)", + "similarity_ratio": 0.727, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,11 +1,11 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (collection == null)", + " return nbttaglist;", + " for (String slot : collection) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtStringStringMap", + "signature": "NBTTagList nbtStringStringMap(Map map)", + "similarity_ratio": 0.769, + "diff_line_count": 6, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,13 +1,13 @@", + " {", + "- INbtList nbttaglist = new INbtList();", + "+ INbtList nbttaglist = NBT.list();", + " if (map == null)", + " return nbttaglist;", + " for (String slot : map.keySet()) {", + "- INbt nbttagcompound = new INbt();" + ] + }, + { + "name": "nbtVectorMap", + "signature": "NBTTagList nbtVectorMap(Map> map)", + "similarity_ratio": 0.611, + "diff_line_count": 14, + "diff_preview": [ + "--- old (normalized)", + "+++ new (normalized)", + "@@ -1,18 +1,18 @@", + " {", + "- INbtList list = new INbtList();", + "+ INbtList list = NBT.list();", + " if (map == null)", + " return list;", + " for (String key : map.keySet()) {", + "- INbt compound = new INbt();" + ] + } + ] + }, + { + "relative_path": "noppes/npcs/scripted/constants/AnimationType.java", + "old_file": "mc1710/src/main/java/noppes/npcs/scripted/constants/AnimationType.java", + "new_file": "core/src/main/java/noppes/npcs/scripted/constants/AnimationType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/scripted/constants/EntityType.java", + "old_file": "mc1710/src/main/java/noppes/npcs/scripted/constants/EntityType.java", + "new_file": "core/src/main/java/noppes/npcs/scripted/constants/EntityType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/scripted/constants/JobType.java", + "old_file": "mc1710/src/main/java/noppes/npcs/scripted/constants/JobType.java", + "new_file": "core/src/main/java/noppes/npcs/scripted/constants/JobType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/scripted/constants/RoleType.java", + "old_file": "mc1710/src/main/java/noppes/npcs/scripted/constants/RoleType.java", + "new_file": "core/src/main/java/noppes/npcs/scripted/constants/RoleType.java", + "verdict": "PASS", + "verdict_reason": "all methods present, no unmigrated types, no body drift", + "unmigrated_count": 0, + "missing_methods_count": 0, + "semantic_diffs_count": 0, + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [] + }, + { + "relative_path": "noppes/npcs/util/CacheHashMap.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/CacheHashMap.java" + }, + { + "relative_path": "noppes/npcs/util/CustomNPCsThreader.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/CustomNPCsThreader.java" + }, + { + "relative_path": "noppes/npcs/util/LRUHashMap.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/LRUHashMap.java" + }, + { + "relative_path": "noppes/npcs/util/MillisTimer.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/MillisTimer.java" + }, + { + "relative_path": "noppes/npcs/util/SizeOfObjectUtil.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/SizeOfObjectUtil.java" + }, + { + "relative_path": "noppes/npcs/util/ValueUtil.java", + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": "core/src/main/java/noppes/npcs/util/ValueUtil.java" + } + ], + "summary": { + "PASS": [ + "kamkeel/npcs/controllers/data/ability/conditions/ConditionFilter.java", + "kamkeel/npcs/controllers/data/profile/ProfileOperation.java", + "kamkeel/npcs/developer/Developer.java", + "kamkeel/npcs/network/enums/EnumChannelType.java", + "kamkeel/npcs/network/enums/EnumConfigOperation.java", + "kamkeel/npcs/network/enums/EnumItemPacketType.java", + "kamkeel/npcs/network/enums/EnumPlayerPacket.java", + "kamkeel/npcs/network/enums/EnumRequestPacket.java", + "kamkeel/npcs/network/enums/EnumSoundOperation.java", + "kamkeel/npcs/network/enums/EnumSyncAction.java", + "kamkeel/npcs/network/enums/EnumSyncType.java", + "kamkeel/npcs/util/CNPCDebug.java", + "noppes/npcs/controllers/APIRegistry.java", + "noppes/npcs/controllers/CategoryManager.java", + "noppes/npcs/scripted/constants/AnimationType.java", + "noppes/npcs/scripted/constants/EntityType.java", + "noppes/npcs/scripted/constants/JobType.java", + "noppes/npcs/scripted/constants/RoleType.java" + ], + "WARN": [ + "kamkeel/npcs/controllers/data/ability/data/ProjectileData.java", + "kamkeel/npcs/controllers/data/profile/Slot.java", + "kamkeel/npcs/network/enums/EnumDataPacket.java", + "noppes/npcs/constants/EnumStockReset.java", + "noppes/npcs/controllers/data/PlayerEffect.java", + "noppes/npcs/controllers/GlobalDataController.java" + ], + "FAIL": [ + "noppes/npcs/controllers/data/Faction.java", + "noppes/npcs/controllers/data/Magic.java", + "noppes/npcs/controllers/FactionController.java", + "noppes/npcs/controllers/MagicController.java", + "noppes/npcs/controllers/ServerTagMapController.java", + "noppes/npcs/controllers/TagController.java", + "noppes/npcs/controllers/TransportController.java", + "noppes/npcs/NBTTags.java" + ], + "NO_COUNTERPART": [ + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyAnchorData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyBarrierData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyChargingData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyCombatData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyDisplayData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyHomingData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyLifespanData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyLightningData.java", + "kamkeel/npcs/controllers/data/ability/data/energy/EnergyPanelData.java", + "kamkeel/npcs/controllers/data/ability/enums/AbilityPhase.java", + "kamkeel/npcs/controllers/data/ability/enums/AnchorPoint.java", + "kamkeel/npcs/controllers/data/ability/enums/HitType.java", + "kamkeel/npcs/controllers/data/ability/enums/InvulnerableMode.java", + "kamkeel/npcs/controllers/data/ability/enums/LockMode.java", + "kamkeel/npcs/controllers/data/ability/enums/RotationMode.java", + "kamkeel/npcs/controllers/data/ability/enums/TargetFilter.java", + "kamkeel/npcs/controllers/data/ability/enums/TargetingMode.java", + "kamkeel/npcs/controllers/data/ability/enums/UserType.java", + "kamkeel/npcs/controllers/data/attribute/AttributeDefinition.java", + "kamkeel/npcs/controllers/data/attribute/AttributeValueType.java", + "kamkeel/npcs/controllers/data/attribute/PlayerAttribute.java", + "kamkeel/npcs/controllers/data/attribute/PlayerAttributeMap.java", + "kamkeel/npcs/controllers/data/profile/EnumProfileOperation.java", + "kamkeel/npcs/controllers/data/profile/ProfileInfoEntry.java", + "kamkeel/npcs/controllers/data/telegraph/Telegraph.java", + "kamkeel/npcs/controllers/data/telegraph/TelegraphType.java", + "kamkeel/npcs/util/FileNameHelper.java", + "kamkeel/npcs/util/TextSplitter.java", + "noppes/npcs/constants/AiMutex.java", + "noppes/npcs/constants/EnumAnimation.java", + "noppes/npcs/constants/EnumAnimationPart.java", + "noppes/npcs/constants/EnumAuctionPage.java", + "noppes/npcs/constants/EnumAuctionSort.java", + "noppes/npcs/constants/EnumAvailabilityDialog.java", + "noppes/npcs/constants/EnumAvailabilityFaction.java", + "noppes/npcs/constants/EnumAvailabilityFactionType.java", + "noppes/npcs/constants/EnumAvailabilityQuest.java", + "noppes/npcs/constants/EnumBannerVariant.java", + "noppes/npcs/constants/EnumBardInstrument.java", + "noppes/npcs/constants/EnumCategoryType.java", + "noppes/npcs/constants/EnumCombatPolicy.java", + "noppes/npcs/constants/EnumCompanionJobs.java", + "noppes/npcs/constants/EnumCompanionStage.java", + "noppes/npcs/constants/EnumDayTime.java", + "noppes/npcs/constants/EnumDiagramLayout.java", + "noppes/npcs/constants/EnumGuiType.java", + "noppes/npcs/constants/EnumJobType.java", + "noppes/npcs/constants/EnumMovingType.java", + "noppes/npcs/constants/EnumNavType.java", + "noppes/npcs/constants/EnumNpcToolMaterial.java", + "noppes/npcs/constants/EnumOptionType.java", + "noppes/npcs/constants/EnumParticleType.java", + "noppes/npcs/constants/EnumPartyExchange.java", + "noppes/npcs/constants/EnumPartyObjectives.java", + "noppes/npcs/constants/EnumPartyRequirements.java", + "noppes/npcs/constants/EnumPlayerData.java", + "noppes/npcs/constants/EnumPlayerPacket.java", + "noppes/npcs/constants/EnumProfileSync.java", + "noppes/npcs/constants/EnumQuestCompletion.java", + "noppes/npcs/constants/EnumQuestRepeat.java", + "noppes/npcs/constants/EnumQuestType.java", + "noppes/npcs/constants/EnumRoleType.java", + "noppes/npcs/constants/EnumScriptType.java", + "noppes/npcs/constants/EnumScrollData.java", + "noppes/npcs/constants/EnumStandingType.java", + "noppes/npcs/constants/EnumTextureType.java", + "noppes/npcs/constants/EnumTradeSlotType.java", + "noppes/npcs/constants/MarkType.java", + "noppes/npcs/constants/NBTTypes.java", + "noppes/npcs/controllers/data/AbilityHotbarData.java", + "noppes/npcs/controllers/data/AuctionFilter.java", + "noppes/npcs/controllers/data/Category.java", + "noppes/npcs/controllers/data/CloneFolder.java", + "noppes/npcs/controllers/data/DialogColorData.java", + "noppes/npcs/controllers/data/DialogImage.java", + "noppes/npcs/controllers/data/EffectKey.java", + "noppes/npcs/controllers/data/Frame.java", + "noppes/npcs/controllers/data/FramePart.java", + "noppes/npcs/controllers/data/HitboxData.java", + "noppes/npcs/controllers/data/InnDoorData.java", + "noppes/npcs/controllers/data/ItemDisplayData.java", + "noppes/npcs/controllers/data/Line.java", + "noppes/npcs/controllers/data/Lines.java", + "noppes/npcs/controllers/data/MagicAssociation.java", + "noppes/npcs/controllers/data/MagicCycle.java", + "noppes/npcs/controllers/data/MagicData.java", + "noppes/npcs/controllers/data/MagicEntry.java", + "noppes/npcs/controllers/data/PartyOptions.java", + "noppes/npcs/controllers/data/PlayerDialogData.java", + "noppes/npcs/controllers/data/PlayerEffectData.java", + "noppes/npcs/controllers/data/PlayerTransportData.java", + "noppes/npcs/controllers/data/ProfileOptions.java", + "noppes/npcs/controllers/data/SkinOverlay.java", + "noppes/npcs/controllers/data/Tag.java", + "noppes/npcs/controllers/data/TagMap.java", + "noppes/npcs/controllers/data/TintData.java", + "noppes/npcs/controllers/data/TraderStock.java", + "noppes/npcs/controllers/data/TransportCategory.java", + "noppes/npcs/controllers/data/TransportLocation.java", + "noppes/npcs/core/CoreConfig.java", + "noppes/npcs/core/NBT.java", + "noppes/npcs/core/package-info.java", + "noppes/npcs/util/CacheHashMap.java", + "noppes/npcs/util/CustomNPCsThreader.java", + "noppes/npcs/util/LRUHashMap.java", + "noppes/npcs/util/MillisTimer.java", + "noppes/npcs/util/SizeOfObjectUtil.java", + "noppes/npcs/util/ValueUtil.java" + ] + } +} \ No newline at end of file diff --git a/tools/migration/_test_wave.ps1 b/tools/migration/_test_wave.ps1 new file mode 100644 index 000000000..c9fdc801e --- /dev/null +++ b/tools/migration/_test_wave.ps1 @@ -0,0 +1,141 @@ +# ============================================================ +# Wave Migration Script +# Generated by generate_wave_script.py on 2026-03-16 +# Source: tools/migration/mc_type_mappings.json +# ============================================================ + +. (Join-Path $PSScriptRoot 'Copy-Recursive.ps1') +. (Join-Path $PSScriptRoot 'Nuke-Imports.ps1') +. (Join-Path $PSScriptRoot 'Symbol-Swap.ps1') +. (Join-Path $PSScriptRoot 'Static-Transform.ps1') +. (Join-Path $PSScriptRoot 'Generate-Stubs.ps1') +. (Join-Path $PSScriptRoot 'Dedupe-Imports.ps1') +. (Join-Path $PSScriptRoot 'Build-Report.ps1') + +# ============================================================ +# STEP 2: Nuke MC imports +# ============================================================ +Nuke-Imports -Directory 'core/src/main/java' -ForbiddenPrefixes @( + 'net.minecraft.', + 'cpw.mods.', + 'net.minecraftforge.', + 'noppes.npcs.entity.', + 'noppes.npcs.client.', + 'noppes.npcs.mixin.', + 'kamkeel.npcs.network.', + 'kamkeel.npcs.entity.', + 'noppes.npcs.containers.', + 'noppes.npcs.scripted.', + 'noppes.npcs.janino.', + 'noppes.npcs.wrapper.', + 'noppes.npcs.blocks.', + 'noppes.npcs.items.', + 'noppes.npcs.ai.' +) + +# ============================================================ +# STEP 3: Symbol-Swap — replace MC types with PA abstractions +# ============================================================ +Symbol-Swap -Directory 'core/src/main/java' -Swaps @( + @('NBTTagCompound', 'INbt', 'net.minecraft.nbt.NBTTagCompound', 'noppes.npcs.api.INbt'), + @('EntityPlayer', 'IPlayer', 'net.minecraft.entity.player.EntityPlayer', 'noppes.npcs.api.entity.IPlayer'), + @('EntityPlayerMP', 'IPlayer', 'net.minecraft.entity.player.EntityPlayerMP', 'noppes.npcs.api.entity.IPlayer'), + @('Entity', 'IEntity', 'net.minecraft.entity.Entity', 'noppes.npcs.api.entity.IEntity'), + @('ItemStack', 'IItemStack', 'net.minecraft.item.ItemStack', 'noppes.npcs.api.item.IItemStack'), + @('EntityLivingBase', 'IEntityLivingBase', 'net.minecraft.entity.EntityLivingBase', 'noppes.npcs.api.entity.IEntityLivingBase'), + @('World', 'IWorld', 'net.minecraft.world.World', 'noppes.npcs.api.IWorld'), + @('NBTTagList', 'INbtList', 'net.minecraft.nbt.NBTTagList', 'noppes.npcs.api.INbtList'), + @('DamageSource', 'IDamageSource', 'net.minecraft.util.DamageSource', 'noppes.npcs.api.IDamageSource'), + @('WorldServer', 'IWorld', 'net.minecraft.world.WorldServer', 'noppes.npcs.api.IWorld'), + @('EntityLiving', 'IEntityLiving', 'net.minecraft.entity.EntityLiving', 'noppes.npcs.api.entity.IEntityLiving'), + @('ResourceLocation', 'IResourceLocation', 'net.minecraft.util.ResourceLocation', 'noppes.npcs.api.IResourceLocation'), + @('AxisAlignedBB', 'IBoundingBox', 'net.minecraft.util.AxisAlignedBB', 'noppes.npcs.api.IBoundingBox'), + @('ICommandSender', 'ICommandSender', 'net.minecraft.command.ICommandSender', 'noppes.npcs.api.ICommandSender'), + @('Vec3', 'IVector3', 'net.minecraft.util.Vec3', 'noppes.npcs.api.IVector3'), + @('ChatComponentText', 'ITextComponent', 'net.minecraft.util.ChatComponentText', 'noppes.npcs.api.ITextComponent'), + @('ChatComponentTranslation', 'ITextComponent', 'net.minecraft.util.ChatComponentTranslation', 'noppes.npcs.api.ITextComponent'), + @('IChatComponent', 'ITextComponent', 'net.minecraft.util.IChatComponent', 'noppes.npcs.api.ITextComponent'), + @('ChatStyle', 'ITextStyle', 'net.minecraft.util.ChatStyle', 'noppes.npcs.api.ITextStyle'), + @('MovingObjectPosition', 'IRayTraceResult', 'net.minecraft.util.MovingObjectPosition', 'noppes.npcs.api.IRayTraceResult'), + @('NBTBase', 'INbtBase', 'net.minecraft.nbt.NBTBase', 'noppes.npcs.api.INbtBase'), + @('Potion', 'IPotionType', 'net.minecraft.potion.Potion', 'noppes.npcs.api.IPotionType'), + @('PotionEffect', 'IPotionEffect', 'net.minecraft.potion.PotionEffect', 'noppes.npcs.api.IPotionEffect'), + @('Explosion', 'IExplosion', 'net.minecraft.world.Explosion', 'noppes.npcs.api.IExplosion'), + @('Configuration', 'IForgeConfig', 'net.minecraftforge.common.config.Configuration', 'noppes.npcs.api.IForgeConfig'), + @('Property', 'IConfigProperty', 'net.minecraftforge.common.config.Property', 'noppes.npcs.api.IConfigProperty') +) + +# ============================================================ +# STEP 4: Static-Transform — regex rewrites +# ============================================================ +Static-Transform -Directory 'core/src/main/java' -Transforms @( + @('@SideOnly\s*\(\s*Side\.CLIENT\s*\)', '@ClientOnly'), + @('@SideOnly\s*\(\s*Side\.SERVER\s*\)', '@ServerOnly'), + @('Side\.CLIENT', 'PlatformSide.CLIENT'), + @('Side\.SERVER', 'PlatformSide.SERVER'), + @('MathHelper\.clamp_int\s*\(', 'ValueUtil.clampInt('), + @('MathHelper\.clamp_float\s*\(', 'ValueUtil.clampFloat('), + @('MathHelper\.clamp_double\s*\(', 'ValueUtil.clampDouble('), + @('MathHelper\.sqrt_double\s*\(', 'Math.sqrt('), + @('MathHelper\.sqrt_float\s*\(', '(float)Math.sqrt('), + @('MathHelper\.floor_double\s*\(', 'ValueUtil.floorDouble('), + @('MathHelper\.floor_float\s*\(', 'ValueUtil.floorFloat('), + @('MathHelper\.sin\s*\(', '(float)Math.sin('), + @('MathHelper\.cos\s*\(', '(float)Math.cos('), + @('MathHelper\.abs\s*\(', 'Math.abs('), + @('MathHelper\.ceiling_double_int\s*\(', 'ValueUtil.ceilToInt('), + @('MathHelper\.ceiling_float_int\s*\(', 'ValueUtil.ceilToInt('), + @('EnumChatFormatting\.', 'TextFormatting.'), + @('EnumFacing\.', 'Direction.'), + @('SharedMonsterAttributes\.maxHealth', 'Attributes.MAX_HEALTH'), + @('SharedMonsterAttributes\.movementSpeed', 'Attributes.MOVEMENT_SPEED'), + @('SharedMonsterAttributes\.attackDamage', 'Attributes.ATTACK_DAMAGE'), + @('SharedMonsterAttributes\.followRange', 'Attributes.FOLLOW_RANGE'), + @('SharedMonsterAttributes\.knockbackResistance', 'Attributes.KNOCKBACK_RESISTANCE'), + @('Constants\.NBT\.TAG_COMPOUND', 'NbtConstants.TAG_COMPOUND'), + @('Constants\.NBT\.TAG_STRING', 'NbtConstants.TAG_STRING'), + @('Constants\.NBT\.TAG_LIST', 'NbtConstants.TAG_LIST'), + @('Constants\.NBT\.TAG_INT', 'NbtConstants.TAG_INT'), + @('Constants\.NBT\.TAG_DOUBLE', 'NbtConstants.TAG_DOUBLE'), + @('Constants\.NBT\.TAG_BYTE', 'NbtConstants.TAG_BYTE'), + @('Constants\.NBT\.TAG_FLOAT', 'NbtConstants.TAG_FLOAT'), + @('Constants\.NBT\.TAG_LONG', 'NbtConstants.TAG_LONG'), + @('Constants\.NBT\.TAG_SHORT', 'NbtConstants.TAG_SHORT'), + @('Constants\.NBT\.TAG_INT_ARRAY', 'NbtConstants.TAG_INT_ARRAY'), + @('Constants\.NBT\.TAG_BYTE_ARRAY', 'NbtConstants.TAG_BYTE_ARRAY'), + @('net\.minecraft\.command\.CommandException', 'noppes.npcs.api.CommandException'), + @('new CommandException\(', 'new CommandException('), + @('new ChunkCoordinates\(([^,]+),\s*([^,]+),\s*([^)]+)\)', 'new BlockPos($1, $2, $3)'), + @('\.posX\b', '.getX()'), + @('\.posY\b', '.getY()'), + @('\.posZ\b', '.getZ()'), + @('EnumAction\.', 'ItemAction.') +) + +# ============================================================ +# STEP 5: Generate stubs for missing dependencies +# ============================================================ +Generate-Stubs -Stubs @( + @{ pkg='noppes.npcs'; name='CustomNpcs'; type='class'; + body=' public static java.io.File Dir = new java.io.File("."); + public static int DefaultInteractLine = 0;' }, + @{ pkg='noppes.npcs'; name='EventHooks'; type='class'; + body=' // STUB - event dispatch stays in mc1710' }, + @{ pkg='noppes.npcs'; name='LogWriter'; type='class'; + body=' public static void info(String msg) {} + public static void warn(String msg) {} + public static void error(String msg) {} + public static void error(String msg, Throwable e) {}' }, + @{ pkg='noppes.npcs.controllers'; name='SyncController'; type='class'; + body=' // STUB - sync stays in mc1710' } +) + +# ============================================================ +# STEP 6: Deduplicate imports +# ============================================================ +Dedupe-Imports -Directory 'core/src/main/java' + +# ============================================================ +# STEP 7: Build and report +# ============================================================ +Build-Report -GradleTask ':core:compileJava' diff --git a/tools/migration/analyze.py b/tools/migration/analyze.py index f7781beae..a85c87171 100644 --- a/tools/migration/analyze.py +++ b/tools/migration/analyze.py @@ -16,6 +16,7 @@ Subcommands: coverage-report Migration coverage analysis (P3) classify Classify MC type for migration strategy (P0) classify-all Classify ALL MC types in index and output as JSON (P0) + generate-mappings Generate mc_type_mappings.json from curated classifications Usage: python analyze.py query-type EntityPlayer @@ -2251,6 +2252,204 @@ def add_migration_diff_args(subparsers): p.set_defaults(func=cmd_migration_diff) +# ============================================================ +# generate-mappings: Build mc_type_mappings.json from curated classifications +# ============================================================ + + +def cmd_generate_mappings(args): + """Read mc_type_classifications_original.json and produce mc_type_mappings.json.""" + project_root = ( + Path(args.project_root) if args.project_root else auto_detect_project_root() + ) + + cls_path = Path(args.classifications) + if not cls_path.is_absolute(): + cls_path = project_root / args.classifications + if not cls_path.exists(): + print(f"ERROR: Classifications file not found: {cls_path}", file=sys.stderr) + return 1 + + with open(cls_path, "r", encoding="utf-8") as f: + cls_data = json.load(f) + + types = cls_data.get("types", {}) + allowed_categories = None + if args.category: + allowed_categories = set(c.upper() for c in args.category) + + mappings = {} + category_counts = defaultdict(int) + + for type_name, info in types.items(): + if type_name.startswith("__"): + continue + + category = info.get("category", "") + if not category: + continue + + if allowed_categories and category not in allowed_categories: + continue + + category_counts[category] += 1 + imports = info.get("imports", 0) + fqn = info.get("fqn", "") + + if category == "EXISTING": + pa_name = info.get("pa", "") + pa_package = info.get("package", "") + pa_fqn = f"{pa_package}.{pa_name}" if pa_package and pa_name else "" + entry = { + "fqn": fqn, + "category": category, + "pa_name": pa_name, + "pa_package": pa_package, + "pa_fqn": pa_fqn, + "imports": imports, + "swap": [type_name, pa_name, fqn, pa_fqn], + } + + elif category == "INTERFACE": + pa_name = info.get("pa", "") + pa_package = info.get("package", "") + pa_fqn = f"{pa_package}.{pa_name}" if pa_package and pa_name else "" + entry = { + "fqn": fqn, + "category": category, + "pa_name": pa_name, + "pa_package": pa_package, + "pa_fqn": pa_fqn, + "imports": imports, + "swap": [type_name, pa_name, fqn, pa_fqn], + } + if "methods" in info: + entry["methods"] = info["methods"] + if "constructors" in info: + entry["constructors"] = info["constructors"] + + elif category == "SERVICE": + entry = { + "fqn": fqn, + "category": category, + "service_target": info.get("service", ""), + "imports": imports, + "methods": info.get("methods", {}), + "swap": None, + } + + elif category == "TRANSFORM": + entry = { + "fqn": fqn, + "category": category, + "patterns": info.get("patterns", []), + "imports": imports, + "swap": None, + } + + elif category == "SUPPRESS": + entry = { + "fqn": fqn, + "category": category, + "reason": info.get("reason", ""), + "imports": imports, + "swap": None, + } + + else: + entry = { + "fqn": fqn, + "category": category, + "imports": imports, + "swap": None, + } + + mappings[type_name] = entry + + timestamp = datetime.now(timezone.utc).isoformat() + total_types = len(mappings) + + cat_order = ["EXISTING", "INTERFACE", "SERVICE", "TRANSFORM", "SUPPRESS"] + categories_summary = {} + for cat in cat_order: + if category_counts.get(cat, 0) > 0: + categories_summary[cat] = category_counts[cat] + for cat, count in sorted(category_counts.items()): + if cat not in categories_summary and count > 0: + categories_summary[cat] = count + + output = { + "_meta": { + "generated": timestamp, + "source": cls_path.name, + "total_types": total_types, + "categories": categories_summary, + }, + "mappings": mappings, + } + + if args.json_output: + json.dump(output, sys.stdout, indent=2, ensure_ascii=True) + print() + else: + output_path = Path(args.output) + if not output_path.is_absolute(): + output_path = project_root / args.output + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w", encoding="utf-8") as f: + json.dump(output, f, indent=2, ensure_ascii=False) + f.write("\n") + + print() + print("=" * 80) + print("GENERATE MAPPINGS") + print("=" * 80) + print(f" Source: {cls_path.name}") + print(f" Total types: {total_types}") + print() + print(" CATEGORY BREAKDOWN:") + for cat in cat_order: + count = categories_summary.get(cat, 0) + if count > 0: + print(f" {cat:<14}{count:>4} types") + print() + print(f" Output written: {output_path}") + print("=" * 80) + print() + + return 0 + + +def add_generate_mappings_args(subparsers): + p = subparsers.add_parser( + "generate-mappings", + help="Generate mc_type_mappings.json from curated classifications", + ) + p.add_argument( + "--output", + default="tools/migration/mc_type_mappings.json", + help="Output JSON file path (default: tools/migration/mc_type_mappings.json)", + ) + p.add_argument( + "--classifications", + default="tools/migration/mc_type_classifications_original.json", + help="Path to source classifications JSON (relative to project root)", + ) + p.add_argument( + "--json", + dest="json_output", + action="store_true", + help="Print output to stdout as JSON instead of writing to file", + ) + p.add_argument( + "--category", + nargs="+", + help="Filter to specific categories (e.g. EXISTING INTERFACE)", + ) + p.add_argument("--project-root", help="Project root (auto-detected if omitted)") + p.set_defaults(func=cmd_generate_mappings) + + # ============================================================ # Main CLI # ============================================================ @@ -2274,6 +2473,7 @@ def main(): add_coverage_report_args(subparsers) add_classify_args(subparsers) add_classify_all_args(subparsers) + add_generate_mappings_args(subparsers) args = parser.parse_args() diff --git a/tools/migration/batch_migration_diff.py b/tools/migration/batch_migration_diff.py new file mode 100644 index 000000000..25840a819 --- /dev/null +++ b/tools/migration/batch_migration_diff.py @@ -0,0 +1,488 @@ +""" +batch_migration_diff.py — Batch Migration Diff +================================================ + +Runs migration-diff logic on ALL migrated files in core/ and produces +one unified JSON with every file's verdict (PASS/WARN/FAIL/NO_COUNTERPART). + +Usage: + python tools/migration/batch_migration_diff.py + python tools/migration/batch_migration_diff.py --json + python tools/migration/batch_migration_diff.py --output tools/migration/_batch_diffs.json + python tools/migration/batch_migration_diff.py --mc-root src/main/java --core-root core/src/main/java + python tools/migration/batch_migration_diff.py --classifications tools/migration/mc_type_classifications_original.json + python tools/migration/batch_migration_diff.py --project-root /path/to/project +""" + +import sys +import os +import json +import argparse +import difflib +import re +from pathlib import Path +from datetime import datetime, timezone + +# Add script directory to path so we can import analyze.py and pa_rules.py +SCRIPT_DIR = Path(__file__).resolve().parent +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + + +def auto_detect_project_root(): + """Auto-detect project root from script location (tools/migration/ -> root).""" + return SCRIPT_DIR.parent.parent + + +def _try_import_analyze(): + """Try to import functions from analyze.py. Returns a dict of functions or None.""" + try: + from analyze import ( + setup_treesitter_parser, + _load_classifications, + _extract_method_bodies, + _normalized_signature_key, + normalize_text, + _scan_unmigrated_types, + ) + + return { + "setup_treesitter_parser": setup_treesitter_parser, + "_load_classifications": _load_classifications, + "_extract_method_bodies": _extract_method_bodies, + "_normalized_signature_key": _normalized_signature_key, + "normalize_text": normalize_text, + "_scan_unmigrated_types": _scan_unmigrated_types, + } + except ImportError as e: + print(f"WARNING: Could not import from analyze.py: {e}", file=sys.stderr) + return None + + +def _normalize_classifications(data): + """Normalize both mc_type_mappings.json and mc_type_classifications_original.json formats.""" + types = data.get("types") or data.get("mappings") or {} + normalized = {} + for type_name, info in types.items(): + if type_name.startswith("_"): + normalized[type_name] = info + continue + entry = dict(info) + if "pa_name" in entry and "pa" not in entry: + entry["pa"] = entry["pa_name"] + if "pa_package" in entry and "package" not in entry: + entry["package"] = entry["pa_package"] + if "service_name" in entry and "service" not in entry: + entry["service"] = entry["service_name"] + normalized[type_name] = entry + return normalized + + +def _load_classifications_fallback(project_root, classifications_path): + cls_file = Path(project_root) / classifications_path + if not cls_file.exists(): + raise FileNotFoundError(f"Classifications file not found: {cls_file}") + with open(cls_file, "r", encoding="utf-8") as f: + data = json.load(f) + return _normalize_classifications(data) + + +def _scan_unmigrated_types_fallback(file_text, classifications): + """Scan file text for MC type names that should have been replaced. Standalone fallback.""" + results = [] + lines = file_text.split("\n") + for type_name, info in classifications.items(): + if type_name.startswith("_"): + continue + category = info.get("category", "") + if category not in ("EXISTING", "INTERFACE", "SERVICE"): + continue + pa_name = info.get("pa") or info.get("service") + if not pa_name: + continue + if len(type_name) < 4: + continue + pattern = re.compile(r"\b" + re.escape(type_name) + r"\b") + found_lines = [] + has_import = False + for i, line in enumerate(lines, 1): + if pattern.search(line): + if line.strip().startswith("import "): + has_import = True + found_lines.append(i) + if found_lines: + results.append( + { + "mc_name": type_name, + "pa_name": pa_name, + "lines": found_lines, + "in_import": has_import, + } + ) + return results + + +def _resolve_classifications_path(args): + """Resolve which classifications file to use.""" + if args.classifications: + return args.classifications + # Prefer mc_type_mappings.json if it exists + project_root = ( + Path(args.project_root) if args.project_root else auto_detect_project_root() + ) + mappings_path = project_root / "tools" / "migration" / "mc_type_mappings.json" + if mappings_path.exists(): + return "tools/migration/mc_type_mappings.json" + # Fallback to original classifications + original_path = ( + project_root / "tools" / "migration" / "mc_type_classifications_original.json" + ) + if original_path.exists(): + return "tools/migration/mc_type_classifications_original.json" + # Default + return "tools/migration/mc_type_classifications.json" + + +def run_single_diff(old_file, new_file, parser, classifications, analyze_fns): + """ + Run migration-diff logic on a single file pair. + Returns a result dict with verdict, unmigrated, missing_methods, semantic_body_diffs. + """ + result = { + "unmigrated": [], + "missing_methods": [], + "semantic_body_diffs": [], + } + + # Step 1: Scan for unmigrated types in new file + new_text = new_file.read_text(encoding="utf-8", errors="replace") + if analyze_fns: + unmigrated = analyze_fns["_scan_unmigrated_types"](new_text, classifications) + else: + unmigrated = _scan_unmigrated_types_fallback(new_text, classifications) + result["unmigrated"] = unmigrated + + # Step 2 & 3: Method-level analysis (requires tree-sitter) + if parser is not None and analyze_fns: + try: + _extract = analyze_fns["_extract_method_bodies"] + _norm_key = analyze_fns["_normalized_signature_key"] + _norm_text = analyze_fns["normalize_text"] + + old_methods, _ = _extract(old_file, parser) + new_methods, _ = _extract(new_file, parser) + + # Build maps by normalized key + old_method_map = {} + for m in old_methods: + key = _norm_key(m, classifications) + old_method_map[key] = m + + new_method_map = {} + for m in new_methods: + key = _norm_key(m, classifications) + new_method_map[key] = m + + old_keys = set(old_method_map.keys()) + new_keys = set(new_method_map.keys()) + + # Missing methods + for key in sorted(old_keys - new_keys): + m = old_method_map[key] + result["missing_methods"].append( + { + "name": m["name"], + "signature": m["signature_text"], + "line": m["line"], + } + ) + + # Semantic body diffs + common_keys = old_keys & new_keys + for key in sorted(common_keys): + old_m = old_method_map[key] + new_m = new_method_map[key] + + old_body = old_m.get("body") + new_body = new_m.get("body") + if old_body is None or new_body is None: + continue + + norm_old = _norm_text(old_body, classifications) + norm_new = _norm_text(new_body, classifications) + + norm_old_lines = norm_old.strip().splitlines() + norm_new_lines = norm_new.strip().splitlines() + + matcher = difflib.SequenceMatcher(None, norm_old_lines, norm_new_lines) + ratio = matcher.ratio() + + diff_lines = list( + difflib.unified_diff( + norm_old_lines, + norm_new_lines, + fromfile="old (normalized)", + tofile="new (normalized)", + lineterm="", + ) + ) + change_lines = [ + l + for l in diff_lines + if (l.startswith("+") or l.startswith("-")) + and not l.startswith("+++") + and not l.startswith("---") + ] + + if ratio < 0.85 or len(change_lines) > 0: + result["semantic_body_diffs"].append( + { + "name": old_m["name"], + "signature": old_m["signature_text"], + "similarity_ratio": round(ratio, 3), + "diff_line_count": len(change_lines), + "diff_preview": diff_lines[:10], + } + ) + except Exception as e: + result["note"] = f"tree-sitter analysis error: {str(e)}" + else: + result["note"] = "tree-sitter not available" + + # Verdict + if result["missing_methods"]: + result["verdict"] = "FAIL" + result["verdict_reason"] = f"{len(result['missing_methods'])} missing method(s)" + elif result["unmigrated"] or result["semantic_body_diffs"]: + parts = [] + if result["unmigrated"]: + parts.append(f"{len(result['unmigrated'])} unmigrated type(s)") + if result["semantic_body_diffs"]: + parts.append(f"{len(result['semantic_body_diffs'])} body diff(s)") + result["verdict"] = "WARN" + result["verdict_reason"] = ", ".join(parts) + else: + result["verdict"] = "PASS" + result["verdict_reason"] = ( + "all methods present, no unmigrated types, no body drift" + ) + + return result + + +def main(): + parser = argparse.ArgumentParser( + description="Batch migration-diff: run migration-diff on ALL core/ files" + ) + parser.add_argument( + "--mc-root", + default="src/main/java", + help="MC 1.7.10 source root (default: src/main/java)", + ) + parser.add_argument( + "--core-root", + default="core/src/main/java", + help="Core source root (default: core/src/main/java)", + ) + parser.add_argument( + "--classifications", + help="Path to classifications JSON (relative to project root)", + ) + parser.add_argument( + "--output", + default="tools/migration/_batch_diffs.json", + help="Output JSON file path (relative to project root)", + ) + parser.add_argument( + "--json", + dest="json_output", + action="store_true", + help="Print JSON to stdout instead of human-readable output", + ) + parser.add_argument( + "--project-root", + help="Project root (auto-detected if omitted)", + ) + + args = parser.parse_args() + + project_root = ( + Path(args.project_root) if args.project_root else auto_detect_project_root() + ) + + # Resolve classifications path + classifications_path = _resolve_classifications_path(args) + + # Try to import from analyze.py + analyze_fns = _try_import_analyze() + + # Load classifications + if analyze_fns: + try: + classifications = analyze_fns["_load_classifications"]( + project_root, classifications_path + ) + if not classifications: + classifications = _load_classifications_fallback( + project_root, classifications_path + ) + except (FileNotFoundError, KeyError): + classifications = _load_classifications_fallback( + project_root, classifications_path + ) + else: + classifications = _load_classifications_fallback( + project_root, classifications_path + ) + + # Setup tree-sitter parser + ts_parser = None + if analyze_fns: + try: + ts_parser, _ = analyze_fns["setup_treesitter_parser"]() + except Exception: + pass + + # Enumerate all .java files in core-root + core_root = project_root / args.core_root + mc_root = project_root / args.mc_root + + if not core_root.exists(): + print(f"ERROR: Core root not found: {core_root}", file=sys.stderr) + return 1 + + core_files = sorted(core_root.rglob("*.java")) + total_files = len(core_files) + + results = [] + summary = {"PASS": [], "WARN": [], "FAIL": [], "NO_COUNTERPART": []} + files_with_counterpart = 0 + files_without_counterpart = 0 + + for core_file in core_files: + rel_path = core_file.relative_to(core_root) + # Normalize to forward slashes for consistency + rel_path_str = str(rel_path).replace("\\", "/") + + mc_file = mc_root / rel_path + + if mc_file.exists(): + files_with_counterpart += 1 + diff_result = run_single_diff( + mc_file, core_file, ts_parser, classifications, analyze_fns + ) + + entry = { + "relative_path": rel_path_str, + "old_file": str(Path(args.mc_root) / rel_path).replace("\\", "/"), + "new_file": str(Path(args.core_root) / rel_path).replace("\\", "/"), + "verdict": diff_result["verdict"], + "verdict_reason": diff_result["verdict_reason"], + "unmigrated_count": len(diff_result["unmigrated"]), + "missing_methods_count": len(diff_result["missing_methods"]), + "semantic_diffs_count": len(diff_result["semantic_body_diffs"]), + "unmigrated": diff_result["unmigrated"], + "missing_methods": diff_result["missing_methods"], + "semantic_body_diffs": diff_result["semantic_body_diffs"], + } + if "note" in diff_result: + entry["note"] = diff_result["note"] + + results.append(entry) + summary[diff_result["verdict"]].append(rel_path_str) + else: + files_without_counterpart += 1 + entry = { + "relative_path": rel_path_str, + "verdict": "NO_COUNTERPART", + "verdict_reason": "No mc1710 original found", + "new_file": str(Path(args.core_root) / rel_path).replace("\\", "/"), + } + results.append(entry) + summary["NO_COUNTERPART"].append(rel_path_str) + + # Build output + output = { + "_meta": { + "generated": datetime.now(timezone.utc).isoformat(), + "mc_root": args.mc_root, + "core_root": args.core_root, + "classifications_source": classifications_path, + "total_files_in_core": total_files, + "files_with_counterpart": files_with_counterpart, + "files_without_counterpart": files_without_counterpart, + "passed": len(summary["PASS"]), + "warned": len(summary["WARN"]), + "failed": len(summary["FAIL"]), + }, + "results": results, + "summary": summary, + } + + if args.json_output: + json.dump(output, sys.stdout, indent=2) + print() + return 0 + + # Human-readable output + print() + print(f"Batch Migration Diff — {total_files} core files analyzed") + print(f" With counterpart: {files_with_counterpart}") + print(f" Without counterpart: {files_without_counterpart}") + print() + print(f" PASS: {len(summary['PASS']):>4}") + print(f" WARN: {len(summary['WARN']):>4}") + print(f" FAIL: {len(summary['FAIL']):>4}") + print() + + if summary["FAIL"]: + print("FAILED FILES:") + for rel in summary["FAIL"]: + entry = next(r for r in results if r["relative_path"] == rel) + print(f" {rel}") + if entry.get("missing_methods"): + methods = ", ".join(m["name"] for m in entry["missing_methods"]) + print( + f" - {len(entry['missing_methods'])} missing methods: {methods}" + ) + if entry.get("unmigrated"): + types = ", ".join(u["mc_name"] for u in entry["unmigrated"]) + print(f" - {len(entry['unmigrated'])} unmigrated types: {types}") + print() + + if summary["WARN"]: + shown = min(5, len(summary["WARN"])) + print(f"WARNED FILES (showing first {shown}):") + for rel in summary["WARN"][:shown]: + entry = next(r for r in results if r["relative_path"] == rel) + parts = [] + if entry.get("semantic_body_diffs"): + sims = [ + str(round(d["similarity_ratio"] * 100)) + "%" + for d in entry["semantic_body_diffs"] + ] + parts.append( + f"{len(entry['semantic_body_diffs'])} body diffs (similarity: {', '.join(sims)})" + ) + if entry.get("unmigrated"): + parts.append(f"{len(entry['unmigrated'])} unmigrated types") + print(f" {rel}") + for part in parts: + print(f" ~ {part}") + if len(summary["WARN"]) > shown: + print(f" ... and {len(summary['WARN']) - shown} more") + print() + + # Write JSON output file + output_path = project_root / args.output + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w", encoding="utf-8") as f: + json.dump(output, f, indent=2) + print(f"Results written to: {args.output}") + print() + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/migration/generate_pa_manifest.py b/tools/migration/generate_pa_manifest.py new file mode 100644 index 000000000..bc6bed679 --- /dev/null +++ b/tools/migration/generate_pa_manifest.py @@ -0,0 +1,385 @@ +""" +generate_pa_manifest.py — Generate PA Interface Manifest + Swap Table +===================================================================== + +Generates a pa_batch.py-compatible manifest JSON for creating PA interface +files in platform-api/, plus a swap table for Symbol-Swap. + +Usage: + python tools/migration/generate_pa_manifest.py + python tools/migration/generate_pa_manifest.py --category INTERFACE + python tools/migration/generate_pa_manifest.py --category INTERFACE EXISTING + python tools/migration/generate_pa_manifest.py --output tools/migration/_pa_manifest.json + python tools/migration/generate_pa_manifest.py --swap-output tools/migration/_swap_table.json + python tools/migration/generate_pa_manifest.py --json + python tools/migration/generate_pa_manifest.py --dry-run +""" + +import sys +import json +import argparse +from pathlib import Path +from datetime import datetime, timezone + +SCRIPT_DIR = Path(__file__).resolve().parent +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + +from pa_rules import ( + resolve_param_type, + should_exclude_method, + resolve_obfuscated_method, + get_interface_package, + NAMING, + EXISTING_MAPPINGS, + TRANSFORM_PATTERNS, + SERVICE_ROUTING, +) + + +def auto_detect_project_root(): + return SCRIPT_DIR.parent.parent + + +def _normalize_classifications(data): + """Normalize both mc_type_mappings.json and mc_type_classifications_original.json formats.""" + types = data.get("types") or data.get("mappings") or {} + normalized = {} + for type_name, info in types.items(): + if type_name.startswith("_"): + normalized[type_name] = info + continue + entry = dict(info) + if "pa_name" in entry and "pa" not in entry: + entry["pa"] = entry["pa_name"] + if "pa_package" in entry and "package" not in entry: + entry["package"] = entry["pa_package"] + if "service_name" in entry and "service" not in entry: + entry["service"] = entry["service_name"] + normalized[type_name] = entry + return normalized + + +def _load_classifications_data(project_root, mappings_path=None): + if mappings_path: + p = Path(mappings_path) + if not p.is_absolute(): + p = project_root / mappings_path + if p.exists(): + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + return _normalize_classifications(data), str(p.name) + for candidate in [ + "tools/migration/mc_type_mappings.json", + "tools/migration/mc_type_classifications_original.json", + ]: + p = project_root / candidate + if p.exists(): + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + return _normalize_classifications(data), candidate + raise FileNotFoundError("No classifications file found") + + +def _load_methods_export(project_root, methods_path=None): + """Load all_methods_export.json for usage counts.""" + if methods_path: + p = Path(methods_path) + if not p.is_absolute(): + p = project_root / methods_path + else: + p = project_root / "tools" / "migration" / "all_methods_export.json" + if not p.exists(): + return {} + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + lookup = {} + for t in data.get("types", []): + lookup[t["shortName"]] = t + return lookup + + +def _infer_return_type(method_name): + """Infer return type from Java naming conventions.""" + if method_name.startswith("get"): + return "Object" + if method_name.startswith("is") or method_name.startswith("has"): + return "boolean" + if ( + method_name.startswith("set") + or method_name.startswith("add") + or method_name.startswith("remove") + ): + return "void" + return "void" + + +def _get_usage_count(method_name, methods_export_entry): + """Look up usage count for a method from the export data.""" + if not methods_export_entry: + return 0 + for m in methods_export_entry.get("methods", []): + if m["name"] == method_name: + return m["count"] + for m in methods_export_entry.get("static_methods", []): + if m["name"] == method_name: + return m["count"] + return 0 + + +def _generate_interface_content(type_name, info, methods_export_entry): + """Generate Java interface source code for a PA interface.""" + pa_name = info.get("pa", NAMING.get(type_name, f"I{type_name}")) + fqn = info.get("fqn", "") + pkg = info.get("package", get_interface_package(pa_name)) + + raw_methods = info.get("methods", []) + + filtered_methods = [] + for m in raw_methods: + method_name = m if isinstance(m, str) else m.get("name", m) + if should_exclude_method(method_name): + continue + resolved_name = resolve_obfuscated_method(method_name) + if resolved_name != method_name and should_exclude_method(resolved_name): + continue + filtered_methods.append(resolved_name) + + seen = set() + unique_methods = [] + for m in filtered_methods: + if m not in seen: + seen.add(m) + unique_methods.append(m) + + lines = [] + lines.append(f"package {pkg};") + lines.append("") + lines.append("/**") + lines.append(f" * Platform abstraction for {fqn}.") + lines.append(f" * MC 1.7.10: {type_name}") + lines.append(f" * Generated by generate_pa_manifest.py") + lines.append(" */") + lines.append(f"public interface {pa_name} {{") + + for method_name in unique_methods: + usage = _get_usage_count(method_name, methods_export_entry) + ret_type = _infer_return_type(method_name) + usage_note = f" — used {usage} times" if usage > 0 else "" + lines.append(f" /** {method_name}{usage_note} */") + lines.append(f" {ret_type} {method_name}();") + + lines.append("}") + lines.append("") + + return "\n".join(lines), pa_name, pkg + + +def _build_swap_entry(type_name, info): + """Build a swap tuple [old_name, new_name, old_fqn, new_fqn].""" + pa_name = info.get("pa", NAMING.get(type_name, f"I{type_name}")) + fqn = info.get("fqn", "") + pkg = info.get("package", get_interface_package(pa_name)) + new_fqn = f"{pkg}.{pa_name}" + return [type_name, pa_name, fqn, new_fqn] + + +def _build_transform_entries(classifications): + """Build transform entries from TRANSFORM-category types.""" + transforms = [] + for type_name, info in classifications.items(): + if type_name.startswith("_"): + continue + if info.get("category") != "TRANSFORM": + continue + patterns = info.get("patterns", []) + for pat in patterns: + if len(pat) >= 2: + transforms.append(pat) + + for svc_name, routing in SERVICE_ROUTING.items(): + if routing.get("service") == "NBTIO": + pass + + return transforms + + +def _format_powershell_swaps(swaps): + """Format swaps as a PowerShell array string.""" + lines = ["$AllSwaps = @("] + for i, swap in enumerate(swaps): + comma = "," if i < len(swaps) - 1 else "" + lines.append( + f" @('{swap[0]}', '{swap[1]}', '{swap[2]}', '{swap[3]}'){comma}" + ) + lines.append(")") + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + description="Generate PA interface manifest and swap table" + ) + parser.add_argument( + "--mappings", + help="Path to mc_type_mappings.json or classifications JSON", + ) + parser.add_argument( + "--methods", + default=None, + help="Path to all_methods_export.json", + ) + parser.add_argument( + "--category", + nargs="+", + default=["INTERFACE"], + help="Categories to include (default: INTERFACE)", + ) + parser.add_argument( + "--output", + default="tools/migration/_pa_manifest.json", + help="Output manifest JSON path (relative to project root)", + ) + parser.add_argument( + "--swap-output", + default="tools/migration/_swap_table.json", + help="Output swap table JSON path (relative to project root)", + ) + parser.add_argument( + "--json", + dest="json_output", + action="store_true", + help="Print manifest to stdout as JSON", + ) + parser.add_argument( + "--dry-run", + action="store_true", + help="Show what would be generated without writing files", + ) + parser.add_argument( + "--project-root", + help="Project root (auto-detected if omitted)", + ) + + args = parser.parse_args() + project_root = ( + Path(args.project_root) if args.project_root else auto_detect_project_root() + ) + requested_categories = set(c.upper() for c in args.category) + + types, cls_source = _load_classifications_data(project_root, args.mappings) + + methods_export = _load_methods_export(project_root, args.methods) + + manifest_files = [] + all_swaps = [] + generated_count = 0 + + for type_name, info in types.items(): + if type_name.startswith("_"): + continue + category = info.get("category", "") + if category not in requested_categories: + continue + + pa_name = info.get("pa") or info.get("service") + if not pa_name: + pa_name = NAMING.get(type_name, f"I{type_name}") + + if category in ("EXISTING", "INTERFACE"): + swap = _build_swap_entry(type_name, info) + if swap not in all_swaps: + all_swaps.append(swap) + + if category == "INTERFACE" and info.get("methods"): + export_entry = methods_export.get(type_name) + content, gen_pa_name, pkg = _generate_interface_content( + type_name, info, export_entry + ) + manifest_files.append({"content": content}) + generated_count += 1 + + manifest = { + "root": "platform-api/src/main/java", + "files": manifest_files, + } + + all_transforms = _build_transform_entries(types) + + swap_table = { + "_meta": { + "generated": datetime.now(timezone.utc).isoformat(), + "source": cls_source, + "total_swaps": len(all_swaps), + "total_transforms": len(all_transforms), + }, + "swaps": all_swaps, + "transforms": all_transforms, + "powershell_swaps": _format_powershell_swaps(all_swaps), + } + + if args.json_output: + json.dump(manifest, sys.stdout, indent=2) + print() + return 0 + + if args.dry_run: + print() + print(f"PA Manifest Generator — DRY RUN") + print(f" Source: {cls_source}") + print(f" Categories: {', '.join(sorted(requested_categories))}") + print(f" Interfaces to generate: {generated_count}") + print(f" Swap entries: {len(all_swaps)}") + print(f" Transform entries: {len(all_transforms)}") + print() + if manifest_files: + print("INTERFACES:") + for f in manifest_files: + content = f["content"] + first_line = next( + ( + l + for l in content.split("\n") + if l.startswith("public interface") + ), + "?", + ) + pkg_line = next( + (l for l in content.split("\n") if l.startswith("package ")), "?" + ) + print(f" {pkg_line.rstrip(';')} / {first_line.rstrip(' {')}") + print() + if all_swaps: + print("SWAPS:") + for s in all_swaps[:10]: + print(f" {s[0]:30s} -> {s[1]:20s} ({s[2]} -> {s[3]})") + if len(all_swaps) > 10: + print(f" ... and {len(all_swaps) - 10} more") + print() + return 0 + + manifest_path = project_root / args.output + manifest_path.parent.mkdir(parents=True, exist_ok=True) + with open(manifest_path, "w", encoding="utf-8") as f: + json.dump(manifest, f, indent=2) + + swap_path = project_root / args.swap_output + swap_path.parent.mkdir(parents=True, exist_ok=True) + with open(swap_path, "w", encoding="utf-8") as f: + json.dump(swap_table, f, indent=2) + + print() + print(f"PA Manifest Generator — {generated_count} interfaces generated") + print(f" Source: {cls_source}") + print(f" Categories: {', '.join(sorted(requested_categories))}") + print(f" Manifest written to: {args.output}") + print(f" Swap table written to: {args.swap_output}") + print(f" Swap entries: {len(all_swaps)}") + print(f" Transform entries: {len(all_transforms)}") + print() + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/migration/generate_wave_script.py b/tools/migration/generate_wave_script.py new file mode 100644 index 000000000..40de2dbd7 --- /dev/null +++ b/tools/migration/generate_wave_script.py @@ -0,0 +1,416 @@ +""" +generate_wave_script.py — Generate a complete .ps1 migration wave script +======================================================================== + +Reads mc_type_classifications_original.json (or mc_type_mappings.json) and +generates a ready-to-run PowerShell migration wave script. + +Usage: + python tools/migration/generate_wave_script.py + python tools/migration/generate_wave_script.py --sources noppes/npcs/controllers/QuestController.java + python tools/migration/generate_wave_script.py --sources-file tools/migration/_wave_sources.txt + python tools/migration/generate_wave_script.py --allow-paths "noppes/npcs/controllers/,noppes/npcs/quests/" + python tools/migration/generate_wave_script.py --output tools/migration/_wave.ps1 +""" + +import sys +import json +import argparse +from pathlib import Path +from datetime import datetime, timezone + +SCRIPT_DIR = Path(__file__).resolve().parent +if str(SCRIPT_DIR) not in sys.path: + sys.path.insert(0, str(SCRIPT_DIR)) + +from pa_rules import ( + NAMING, + EXISTING_MAPPINGS, + get_interface_package, + SERVICE_ROUTING, +) + +STANDARD_FORBIDDEN_PREFIXES = [ + "net.minecraft.", + "cpw.mods.", + "net.minecraftforge.", + "noppes.npcs.entity.", + "noppes.npcs.client.", + "noppes.npcs.mixin.", + "kamkeel.npcs.network.", + "kamkeel.npcs.entity.", + "noppes.npcs.containers.", + "noppes.npcs.scripted.", + "noppes.npcs.janino.", + "noppes.npcs.wrapper.", + "noppes.npcs.blocks.", + "noppes.npcs.items.", + "noppes.npcs.ai.", +] + +DEFAULT_STUBS = [ + { + "pkg": "noppes.npcs", + "name": "CustomNpcs", + "type": "class", + "body": ' public static java.io.File Dir = new java.io.File(".");\n public static int DefaultInteractLine = 0;', + }, + { + "pkg": "noppes.npcs", + "name": "EventHooks", + "type": "class", + "body": " // STUB - event dispatch stays in mc1710", + }, + { + "pkg": "noppes.npcs", + "name": "LogWriter", + "type": "class", + "body": " public static void info(String msg) {}\n public static void warn(String msg) {}\n public static void error(String msg) {}\n public static void error(String msg, Throwable e) {}", + }, + { + "pkg": "noppes.npcs.controllers", + "name": "SyncController", + "type": "class", + "body": " // STUB - sync stays in mc1710", + }, +] + + +def auto_detect_project_root(): + return SCRIPT_DIR.parent.parent + + +def _normalize_classifications(data): + types = data.get("types") or data.get("mappings") or {} + normalized = {} + for type_name, info in types.items(): + if type_name.startswith("_"): + normalized[type_name] = info + continue + entry = dict(info) + if "pa_name" in entry and "pa" not in entry: + entry["pa"] = entry["pa_name"] + if "pa_package" in entry and "package" not in entry: + entry["package"] = entry["pa_package"] + if "service_name" in entry and "service" not in entry: + entry["service"] = entry["service_name"] + normalized[type_name] = entry + return normalized + + +def _load_classifications_data(project_root, mappings_path=None): + if mappings_path: + p = Path(mappings_path) + if not p.is_absolute(): + p = project_root / mappings_path + if p.exists(): + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + return _normalize_classifications(data), str(p.name) + for candidate in [ + "tools/migration/mc_type_mappings.json", + "tools/migration/mc_type_classifications_original.json", + ]: + p = project_root / candidate + if p.exists(): + with open(p, "r", encoding="utf-8") as f: + data = json.load(f) + return _normalize_classifications(data), candidate + raise FileNotFoundError("No classifications file found") + + +def _build_all_swaps(types): + """Build swap entries from EXISTING + INTERFACE categories.""" + swaps = [] + seen = set() + for type_name, info in types.items(): + if type_name.startswith("_"): + continue + category = info.get("category", "") + if category not in ("EXISTING", "INTERFACE"): + continue + pa_name = info.get("pa") + if not pa_name: + pa_name = NAMING.get(type_name, f"I{type_name}") + fqn = info.get("fqn", "") + pkg = info.get("package", get_interface_package(pa_name)) + new_fqn = f"{pkg}.{pa_name}" + key = (type_name, fqn) + if key not in seen: + seen.add(key) + swaps.append((type_name, pa_name, fqn, new_fqn)) + return swaps + + +def _build_all_transforms(types): + """Build transform entries from TRANSFORM category + SERVICE static-transform patterns.""" + transforms = [] + for type_name, info in types.items(): + if type_name.startswith("_"): + continue + if info.get("category") != "TRANSFORM": + continue + for pat in info.get("patterns", []): + if len(pat) >= 2: + transforms.append((pat[0], pat[1])) + return transforms + + +def _ps_array_literal(items, indent=" "): + """Format a list of strings as a PowerShell @() array literal.""" + if not items: + return "@()" + lines = ["@("] + for i, item in enumerate(items): + comma = "," if i < len(items) - 1 else "" + lines.append(f"{indent} '{item}'{comma}") + lines.append(f"{indent})") + return "\n".join(lines) + + +def _ps_swap_array(swaps, indent=" "): + """Format swap entries as a PowerShell @(@(...), @(...)) array.""" + if not swaps: + return "@()" + lines = ["@("] + for i, (old, new, old_fqn, new_fqn) in enumerate(swaps): + comma = "," if i < len(swaps) - 1 else "" + lines.append( + f"{indent} @('{old}', '{new}', '{old_fqn}', '{new_fqn}'){comma}" + ) + lines.append(f"{indent})") + return "\n".join(lines) + + +def _ps_transform_array(transforms, indent=" "): + """Format transform entries as a PowerShell @(@(...), @(...)) array.""" + if not transforms: + return "@()" + lines = ["@("] + for i, (pattern, replacement) in enumerate(transforms): + comma = "," if i < len(transforms) - 1 else "" + lines.append(f"{indent} @('{pattern}', '{replacement}'){comma}") + lines.append(f"{indent})") + return "\n".join(lines) + + +def _ps_stubs_array(stubs, indent=" "): + """Format stubs as a PowerShell @(@{...}, @{...}) array.""" + if not stubs: + return "@()" + lines = ["@("] + for i, stub in enumerate(stubs): + comma = "," if i < len(stubs) - 1 else "" + body_escaped = stub["body"].replace("'", "''") + lines.append( + f"{indent} @{{ pkg='{stub['pkg']}'; name='{stub['name']}'; type='{stub['type']}';" + ) + lines.append(f"{indent} body='{body_escaped}' }}{comma}") + lines.append(f"{indent})") + return "\n".join(lines) + + +def generate_script( + sources, + allow_paths, + allow_recurse_paths, + mc_root, + swaps, + transforms, + stubs, + forbidden_prefixes, + cls_source, +): + now = datetime.now(timezone.utc).strftime("%Y-%m-%d") + separator = "# " + "=" * 60 + + sources_arr = _ps_array_literal(sources, " ") + allow_paths_arr = _ps_array_literal(allow_paths, " ") if allow_paths else None + allow_recurse_arr = ( + _ps_array_literal(allow_recurse_paths, " ") if allow_recurse_paths else None + ) + forbidden_arr = _ps_array_literal(forbidden_prefixes, "") + swaps_arr = _ps_swap_array(swaps, "") + transforms_arr = _ps_transform_array(transforms, "") + stubs_arr = _ps_stubs_array(stubs, "") + + lines = [] + + lines.append(separator) + lines.append(f"# Wave Migration Script") + lines.append(f"# Generated by generate_wave_script.py on {now}") + lines.append(f"# Source: {cls_source}") + lines.append(separator) + lines.append("") + lines.append(". (Join-Path $PSScriptRoot 'Copy-Recursive.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Nuke-Imports.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Symbol-Swap.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Static-Transform.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Generate-Stubs.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Dedupe-Imports.ps1')") + lines.append(". (Join-Path $PSScriptRoot 'Build-Report.ps1')") + lines.append("") + + if sources: + lines.append(separator) + lines.append("# STEP 1: Copy files from mc1710 to core") + lines.append(separator) + copy_cmd = "Copy-Recursive `\n" + copy_cmd += f" -Sources {sources_arr} `\n" + if allow_paths_arr: + copy_cmd += f" -AllowPaths {allow_paths_arr} `\n" + if allow_recurse_arr: + copy_cmd += f" -AllowRecursePaths {allow_recurse_arr} `\n" + copy_cmd += f" -McRoot '{mc_root}'" + lines.append(copy_cmd) + lines.append("") + + lines.append(separator) + lines.append("# STEP 2: Nuke MC imports") + lines.append(separator) + lines.append( + f"Nuke-Imports -Directory 'core/src/main/java' -ForbiddenPrefixes {forbidden_arr}" + ) + lines.append("") + + lines.append(separator) + lines.append("# STEP 3: Symbol-Swap — replace MC types with PA abstractions") + lines.append(separator) + lines.append(f"Symbol-Swap -Directory 'core/src/main/java' -Swaps {swaps_arr}") + lines.append("") + + if transforms: + lines.append(separator) + lines.append("# STEP 4: Static-Transform — regex rewrites") + lines.append(separator) + lines.append( + f"Static-Transform -Directory 'core/src/main/java' -Transforms {transforms_arr}" + ) + lines.append("") + + lines.append(separator) + lines.append("# STEP 5: Generate stubs for missing dependencies") + lines.append(separator) + lines.append(f"Generate-Stubs -Stubs {stubs_arr}") + lines.append("") + + lines.append(separator) + lines.append("# STEP 6: Deduplicate imports") + lines.append(separator) + lines.append("Dedupe-Imports -Directory 'core/src/main/java'") + lines.append("") + + lines.append(separator) + lines.append("# STEP 7: Build and report") + lines.append(separator) + lines.append("Build-Report -GradleTask ':core:compileJava'") + lines.append("") + + return "\n".join(lines) + + +def main(): + parser = argparse.ArgumentParser( + description="Generate a complete .ps1 migration wave script" + ) + parser.add_argument( + "--mappings", + help="Path to mc_type_mappings.json or classifications JSON", + ) + parser.add_argument( + "--sources", + nargs="*", + default=[], + help="Java source files to migrate (relative to mc-root)", + ) + parser.add_argument( + "--sources-file", + help="Text file with one source path per line", + ) + parser.add_argument( + "--allow-paths", + help="Comma-separated AllowPaths prefixes", + ) + parser.add_argument( + "--allow-recurse-paths", + help="Comma-separated AllowRecursePaths prefixes", + ) + parser.add_argument( + "--mc-root", + default="src/main/java", + help="MC source root (default: src/main/java)", + ) + parser.add_argument( + "--output", + default="tools/migration/_wave.ps1", + help="Output .ps1 file path (relative to project root)", + ) + parser.add_argument( + "--project-root", + help="Project root (auto-detected if omitted)", + ) + + args = parser.parse_args() + project_root = ( + Path(args.project_root) if args.project_root else auto_detect_project_root() + ) + + types, cls_source = _load_classifications_data(project_root, args.mappings) + + sources = list(args.sources) + if args.sources_file: + sf = Path(args.sources_file) + if not sf.is_absolute(): + sf = project_root / args.sources_file + if sf.exists(): + with open(sf, "r", encoding="utf-8") as f: + for line in f: + line = line.strip() + if line and not line.startswith("#"): + sources.append(line) + + allow_paths = None + if args.allow_paths: + allow_paths = [p.strip() for p in args.allow_paths.split(",") if p.strip()] + + allow_recurse_paths = None + if args.allow_recurse_paths: + allow_recurse_paths = [ + p.strip() for p in args.allow_recurse_paths.split(",") if p.strip() + ] + + swaps = _build_all_swaps(types) + transforms = _build_all_transforms(types) + + script_content = generate_script( + sources=sources, + allow_paths=allow_paths, + allow_recurse_paths=allow_recurse_paths, + mc_root=args.mc_root, + swaps=swaps, + transforms=transforms, + stubs=DEFAULT_STUBS, + forbidden_prefixes=STANDARD_FORBIDDEN_PREFIXES, + cls_source=cls_source, + ) + + output_path = project_root / args.output + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w", encoding="utf-8", newline="\n") as f: + f.write(script_content) + + print() + print(f"Wave Script Generator") + print(f" Source: {cls_source}") + print(f" Sources: {len(sources)} files") + print(f" Swaps: {len(swaps)} entries") + print(f" Transforms: {len(transforms)} patterns") + print(f" Stubs: {len(DEFAULT_STUBS)} entries") + print(f" Written to: {args.output}") + print() + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tools/migration/mc_type_mappings.json b/tools/migration/mc_type_mappings.json new file mode 100644 index 000000000..6f6ae543d --- /dev/null +++ b/tools/migration/mc_type_mappings.json @@ -0,0 +1,3289 @@ +{ + "_meta": { + "generated": "2026-03-16T01:06:48.204317+00:00", + "source": "mc_type_classifications_original.json", + "total_types": 394, + "categories": { + "EXISTING": 11, + "INTERFACE": 15, + "SERVICE": 12, + "TRANSFORM": 10, + "SUPPRESS": 346 + } + }, + "mappings": { + "NBTTagCompound": { + "fqn": "net.minecraft.nbt.NBTTagCompound", + "category": "EXISTING", + "pa_name": "INbt", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.INbt", + "imports": 593, + "swap": [ + "NBTTagCompound", + "INbt", + "net.minecraft.nbt.NBTTagCompound", + "noppes.npcs.api.INbt" + ] + }, + "EntityPlayer": { + "fqn": "net.minecraft.entity.player.EntityPlayer", + "category": "EXISTING", + "pa_name": "IPlayer", + "pa_package": "noppes.npcs.api.entity", + "pa_fqn": "noppes.npcs.api.entity.IPlayer", + "imports": 551, + "swap": [ + "EntityPlayer", + "IPlayer", + "net.minecraft.entity.player.EntityPlayer", + "noppes.npcs.api.entity.IPlayer" + ] + }, + "EntityPlayerMP": { + "fqn": "net.minecraft.entity.player.EntityPlayerMP", + "category": "EXISTING", + "pa_name": "IPlayer", + "pa_package": "noppes.npcs.api.entity", + "pa_fqn": "noppes.npcs.api.entity.IPlayer", + "imports": 304, + "swap": [ + "EntityPlayerMP", + "IPlayer", + "net.minecraft.entity.player.EntityPlayerMP", + "noppes.npcs.api.entity.IPlayer" + ] + }, + "Entity": { + "fqn": "net.minecraft.entity.Entity", + "category": "EXISTING", + "pa_name": "IEntity", + "pa_package": "noppes.npcs.api.entity", + "pa_fqn": "noppes.npcs.api.entity.IEntity", + "imports": 262, + "swap": [ + "Entity", + "IEntity", + "net.minecraft.entity.Entity", + "noppes.npcs.api.entity.IEntity" + ] + }, + "ItemStack": { + "fqn": "net.minecraft.item.ItemStack", + "category": "EXISTING", + "pa_name": "IItemStack", + "pa_package": "noppes.npcs.api.item", + "pa_fqn": "noppes.npcs.api.item.IItemStack", + "imports": 228, + "swap": [ + "ItemStack", + "IItemStack", + "net.minecraft.item.ItemStack", + "noppes.npcs.api.item.IItemStack" + ] + }, + "EntityLivingBase": { + "fqn": "net.minecraft.entity.EntityLivingBase", + "category": "EXISTING", + "pa_name": "IEntityLivingBase", + "pa_package": "noppes.npcs.api.entity", + "pa_fqn": "noppes.npcs.api.entity.IEntityLivingBase", + "imports": 201, + "swap": [ + "EntityLivingBase", + "IEntityLivingBase", + "net.minecraft.entity.EntityLivingBase", + "noppes.npcs.api.entity.IEntityLivingBase" + ] + }, + "World": { + "fqn": "net.minecraft.world.World", + "category": "EXISTING", + "pa_name": "IWorld", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IWorld", + "imports": 172, + "swap": [ + "World", + "IWorld", + "net.minecraft.world.World", + "noppes.npcs.api.IWorld" + ] + }, + "NBTTagList": { + "fqn": "net.minecraft.nbt.NBTTagList", + "category": "EXISTING", + "pa_name": "INbtList", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.INbtList", + "imports": 111, + "swap": [ + "NBTTagList", + "INbtList", + "net.minecraft.nbt.NBTTagList", + "noppes.npcs.api.INbtList" + ] + }, + "DamageSource": { + "fqn": "net.minecraft.util.DamageSource", + "category": "EXISTING", + "pa_name": "IDamageSource", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IDamageSource", + "imports": 36, + "swap": [ + "DamageSource", + "IDamageSource", + "net.minecraft.util.DamageSource", + "noppes.npcs.api.IDamageSource" + ] + }, + "WorldServer": { + "fqn": "net.minecraft.world.WorldServer", + "category": "EXISTING", + "pa_name": "IWorld", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IWorld", + "imports": 18, + "swap": [ + "WorldServer", + "IWorld", + "net.minecraft.world.WorldServer", + "noppes.npcs.api.IWorld" + ] + }, + "EntityLiving": { + "fqn": "net.minecraft.entity.EntityLiving", + "category": "EXISTING", + "pa_name": "IEntityLiving", + "pa_package": "noppes.npcs.api.entity", + "pa_fqn": "noppes.npcs.api.entity.IEntityLiving", + "imports": 18, + "swap": [ + "EntityLiving", + "IEntityLiving", + "net.minecraft.entity.EntityLiving", + "noppes.npcs.api.entity.IEntityLiving" + ] + }, + "ResourceLocation": { + "fqn": "net.minecraft.util.ResourceLocation", + "category": "INTERFACE", + "pa_name": "IResourceLocation", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IResourceLocation", + "imports": 145, + "swap": [ + "ResourceLocation", + "IResourceLocation", + "net.minecraft.util.ResourceLocation", + "noppes.npcs.api.IResourceLocation" + ], + "methods": [ + "getResourceDomain", + "getResourcePath", + "toString" + ], + "constructors": [ + "IResourceLocation.of(String domain, String path)", + "IResourceLocation.of(String combined)" + ] + }, + "AxisAlignedBB": { + "fqn": "net.minecraft.util.AxisAlignedBB", + "category": "INTERFACE", + "pa_name": "IBoundingBox", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IBoundingBox", + "imports": 59, + "swap": [ + "AxisAlignedBB", + "IBoundingBox", + "net.minecraft.util.AxisAlignedBB", + "noppes.npcs.api.IBoundingBox" + ], + "methods": [ + "getMinX", + "getMinY", + "getMinZ", + "getMaxX", + "getMaxY", + "getMaxZ", + "expand", + "offset", + "intersectsWith", + "isVecInside" + ] + }, + "ICommandSender": { + "fqn": "net.minecraft.command.ICommandSender", + "category": "INTERFACE", + "pa_name": "ICommandSender", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.ICommandSender", + "imports": 47, + "swap": [ + "ICommandSender", + "ICommandSender", + "net.minecraft.command.ICommandSender", + "noppes.npcs.api.ICommandSender" + ], + "methods": [ + "getCommandSenderName", + "addChatMessage", + "canCommandSenderUseCommand", + "getEntityWorld", + "getCommandSenderPosition" + ] + }, + "Vec3": { + "fqn": "net.minecraft.util.Vec3", + "category": "INTERFACE", + "pa_name": "IVector3", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IVector3", + "imports": 43, + "swap": [ + "Vec3", + "IVector3", + "net.minecraft.util.Vec3", + "noppes.npcs.api.IVector3" + ], + "methods": [ + "getX", + "getY", + "getZ", + "add", + "subtract", + "normalize", + "distanceTo", + "lengthVector", + "crossProduct", + "dotProduct" + ] + }, + "ChatComponentText": { + "fqn": "net.minecraft.util.ChatComponentText", + "category": "INTERFACE", + "pa_name": "ITextComponent", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.ITextComponent", + "imports": 20, + "swap": [ + "ChatComponentText", + "ITextComponent", + "net.minecraft.util.ChatComponentText", + "noppes.npcs.api.ITextComponent" + ], + "methods": [ + "getText", + "setChatStyle", + "appendSibling", + "getFormattedText", + "getUnformattedText" + ] + }, + "ChatComponentTranslation": { + "fqn": "net.minecraft.util.ChatComponentTranslation", + "category": "INTERFACE", + "pa_name": "ITextComponent", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.ITextComponent", + "imports": 24, + "swap": [ + "ChatComponentTranslation", + "ITextComponent", + "net.minecraft.util.ChatComponentTranslation", + "noppes.npcs.api.ITextComponent" + ], + "methods": [ + "getKey", + "getFormatArgs" + ] + }, + "IChatComponent": { + "fqn": "net.minecraft.util.IChatComponent", + "category": "INTERFACE", + "pa_name": "ITextComponent", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.ITextComponent", + "imports": 10, + "swap": [ + "IChatComponent", + "ITextComponent", + "net.minecraft.util.IChatComponent", + "noppes.npcs.api.ITextComponent" + ], + "methods": [ + "getFormattedText", + "getUnformattedText", + "appendSibling", + "setChatStyle", + "getChatStyle" + ] + }, + "ChatStyle": { + "fqn": "net.minecraft.util.ChatStyle", + "category": "INTERFACE", + "pa_name": "ITextStyle", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.ITextStyle", + "imports": 3, + "swap": [ + "ChatStyle", + "ITextStyle", + "net.minecraft.util.ChatStyle", + "noppes.npcs.api.ITextStyle" + ], + "methods": [ + "setColor", + "setBold", + "setItalic", + "setUnderlined", + "setStrikethrough", + "setObfuscated" + ] + }, + "MovingObjectPosition": { + "fqn": "net.minecraft.util.MovingObjectPosition", + "category": "INTERFACE", + "pa_name": "IRayTraceResult", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IRayTraceResult", + "imports": 15, + "swap": [ + "MovingObjectPosition", + "IRayTraceResult", + "net.minecraft.util.MovingObjectPosition", + "noppes.npcs.api.IRayTraceResult" + ], + "methods": [ + "getType", + "getBlockPos", + "getEntity", + "getHitVec", + "getSideHit" + ] + }, + "NBTBase": { + "fqn": "net.minecraft.nbt.NBTBase", + "category": "INTERFACE", + "pa_name": "INbtBase", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.INbtBase", + "imports": 13, + "swap": [ + "NBTBase", + "INbtBase", + "net.minecraft.nbt.NBTBase", + "noppes.npcs.api.INbtBase" + ], + "methods": [ + "getId", + "copy" + ] + }, + "Potion": { + "fqn": "net.minecraft.potion.Potion", + "category": "INTERFACE", + "pa_name": "IPotionType", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IPotionType", + "imports": 7, + "swap": [ + "Potion", + "IPotionType", + "net.minecraft.potion.Potion", + "noppes.npcs.api.IPotionType" + ], + "methods": [ + "getId", + "getName", + "isBadEffect", + "isInstant", + "getStatusIconIndex" + ] + }, + "PotionEffect": { + "fqn": "net.minecraft.potion.PotionEffect", + "category": "INTERFACE", + "pa_name": "IPotionEffect", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IPotionEffect", + "imports": 6, + "swap": [ + "PotionEffect", + "IPotionEffect", + "net.minecraft.potion.PotionEffect", + "noppes.npcs.api.IPotionEffect" + ], + "methods": [ + "getPotionID", + "getDuration", + "getAmplifier", + "getIsAmbient", + "getIsShowParticles" + ] + }, + "Explosion": { + "fqn": "net.minecraft.world.Explosion", + "category": "INTERFACE", + "pa_name": "IExplosion", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IExplosion", + "imports": 3, + "swap": [ + "Explosion", + "IExplosion", + "net.minecraft.world.Explosion", + "noppes.npcs.api.IExplosion" + ], + "methods": [ + "getExplosivePlacedBy", + "getPosition" + ] + }, + "Configuration": { + "fqn": "net.minecraftforge.common.config.Configuration", + "category": "INTERFACE", + "pa_name": "IForgeConfig", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IForgeConfig", + "imports": 9, + "swap": [ + "Configuration", + "IForgeConfig", + "net.minecraftforge.common.config.Configuration", + "noppes.npcs.api.IForgeConfig" + ], + "methods": [ + "get", + "getCategory", + "save", + "load", + "hasKey", + "hasCategory" + ] + }, + "Property": { + "fqn": "net.minecraftforge.common.config.Property", + "category": "INTERFACE", + "pa_name": "IConfigProperty", + "pa_package": "noppes.npcs.api", + "pa_fqn": "noppes.npcs.api.IConfigProperty", + "imports": 7, + "swap": [ + "Property", + "IConfigProperty", + "net.minecraftforge.common.config.Property", + "noppes.npcs.api.IConfigProperty" + ], + "methods": [ + "getString", + "getInt", + "getDouble", + "getBoolean", + "getStringList", + "set", + "setComment" + ] + }, + "StatCollector": { + "fqn": "net.minecraft.util.StatCollector", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 106, + "methods": { + "translateToLocal(String key)": "Server-side translation. Returns localized string.", + "translateToLocalFormatted(String key, Object... args)": "Server-side formatted translation." + }, + "swap": null + }, + "Item": { + "fqn": "net.minecraft.item.Item", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 72, + "methods": { + "getItemById(int id)": "Registry lookup: ID → Item. Returns IItemStack or Object.", + "getIdFromItem(Item item)": "Reverse registry lookup: Item → ID." + }, + "swap": null + }, + "MinecraftServer": { + "fqn": "net.minecraft.server.MinecraftServer", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 26, + "methods": { + "getServer()": "Static singleton accessor. 1.7: MinecraftServer.getServer(), 1.16+: different access.", + "isDedicatedServer()": "Server type check.", + "worldServerForDimension(int dim)": "Get world by dimension ID. Returns IWorld.", + "getConfigurationManager()": "Get player list manager." + }, + "swap": null + }, + "EntityList": { + "fqn": "net.minecraft.entity.EntityList", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 25, + "methods": { + "getEntityString(Entity e)": "Get entity's registry name string.", + "createEntityByName(String name, World world)": "Spawn entity by registry name." + }, + "swap": null + }, + "FMLCommonHandler": { + "fqn": "cpw.mods.fml.common.FMLCommonHandler", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 25, + "methods": { + "instance().getSide()": "Get physical side (CLIENT/SERVER). Already covered by PlatformService.isPhysicalClient().", + "instance().getEffectiveSide()": "Get logical side (CLIENT/SERVER)." + }, + "swap": null + }, + "CompressedStreamTools": { + "fqn": "net.minecraft.nbt.CompressedStreamTools", + "category": "SERVICE", + "service_target": "NBTIO", + "imports": 24, + "methods": { + "readCompressed(InputStream)": "Read compressed NBT from stream. Returns INbt.", + "writeCompressed(NBTTagCompound, OutputStream)": "Write compressed NBT to stream." + }, + "swap": null + }, + "CommandBase": { + "fqn": "net.minecraft.command.CommandBase", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 14, + "methods": { + "parseDouble(String)": "Parse double from command arg.", + "parseInt(String)": "Parse int from command arg.", + "getListOfStringsMatchingLastWord(String[], String...)": "Tab completion helper." + }, + "swap": null + }, + "Loader": { + "fqn": "cpw.mods.fml.common.Loader", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 11, + "methods": { + "isModLoaded(String modid)": "Check if a mod is loaded." + }, + "swap": null + }, + "I18n": { + "fqn": "net.minecraft.client.resources.I18n", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 9, + "methods": { + "format(String key, Object... args)": "Client-side translation with formatting." + }, + "swap": null + }, + "DimensionManager": { + "fqn": "net.minecraftforge.common.DimensionManager", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 2, + "methods": { + "getWorld(int dimensionId)": "Get world by dimension ID. Returns IWorld.", + "getIDs()": "Get all registered dimension IDs." + }, + "swap": null + }, + "PlayerSelector": { + "fqn": "net.minecraft.command.PlayerSelector", + "category": "SERVICE", + "service_target": "PlatformService", + "imports": 2, + "methods": { + "matchPlayers(ICommandSender, String)": "Parse @p/@a/@r selectors. Returns List." + }, + "swap": null + }, + "NBTUtil": { + "fqn": "net.minecraft.nbt.NBTUtil", + "category": "SERVICE", + "service_target": "NBTIO", + "imports": 1, + "methods": { + "func_152459_a(NBTTagCompound, GameProfile)": "Write GameProfile to NBT.", + "func_152458_a(NBTTagCompound)": "Read GameProfile from NBT." + }, + "swap": null + }, + "Side": { + "fqn": "cpw.mods.fml.relauncher.Side", + "category": "TRANSFORM", + "patterns": [ + [ + "@SideOnly\\s*\\(\\s*Side\\.CLIENT\\s*\\)", + "@ClientOnly" + ], + [ + "@SideOnly\\s*\\(\\s*Side\\.SERVER\\s*\\)", + "@ServerOnly" + ], + [ + "Side\\.CLIENT", + "PlatformSide.CLIENT" + ], + [ + "Side\\.SERVER", + "PlatformSide.SERVER" + ] + ], + "imports": 405, + "swap": null + }, + "SideOnly": { + "fqn": "cpw.mods.fml.relauncher.SideOnly", + "category": "TRANSFORM", + "patterns": [], + "imports": 395, + "swap": null + }, + "MathHelper": { + "fqn": "net.minecraft.util.MathHelper", + "category": "TRANSFORM", + "patterns": [ + [ + "MathHelper\\.clamp_int\\s*\\(", + "ValueUtil.clampInt(" + ], + [ + "MathHelper\\.clamp_float\\s*\\(", + "ValueUtil.clampFloat(" + ], + [ + "MathHelper\\.clamp_double\\s*\\(", + "ValueUtil.clampDouble(" + ], + [ + "MathHelper\\.sqrt_double\\s*\\(", + "Math.sqrt(" + ], + [ + "MathHelper\\.sqrt_float\\s*\\(", + "(float)Math.sqrt(" + ], + [ + "MathHelper\\.floor_double\\s*\\(", + "ValueUtil.floorDouble(" + ], + [ + "MathHelper\\.floor_float\\s*\\(", + "ValueUtil.floorFloat(" + ], + [ + "MathHelper\\.sin\\s*\\(", + "(float)Math.sin(" + ], + [ + "MathHelper\\.cos\\s*\\(", + "(float)Math.cos(" + ], + [ + "MathHelper\\.abs\\s*\\(", + "Math.abs(" + ], + [ + "MathHelper\\.ceiling_double_int\\s*\\(", + "ValueUtil.ceilToInt(" + ], + [ + "MathHelper\\.ceiling_float_int\\s*\\(", + "ValueUtil.ceilToInt(" + ] + ], + "imports": 98, + "swap": null + }, + "EnumChatFormatting": { + "fqn": "net.minecraft.util.EnumChatFormatting", + "category": "TRANSFORM", + "patterns": [ + [ + "EnumChatFormatting\\.", + "TextFormatting." + ] + ], + "imports": 19, + "swap": null + }, + "EnumFacing": { + "fqn": "net.minecraft.util.EnumFacing", + "category": "TRANSFORM", + "patterns": [ + [ + "EnumFacing\\.", + "Direction." + ] + ], + "imports": 3, + "swap": null + }, + "SharedMonsterAttributes": { + "fqn": "net.minecraft.entity.SharedMonsterAttributes", + "category": "TRANSFORM", + "patterns": [ + [ + "SharedMonsterAttributes\\.maxHealth", + "Attributes.MAX_HEALTH" + ], + [ + "SharedMonsterAttributes\\.movementSpeed", + "Attributes.MOVEMENT_SPEED" + ], + [ + "SharedMonsterAttributes\\.attackDamage", + "Attributes.ATTACK_DAMAGE" + ], + [ + "SharedMonsterAttributes\\.followRange", + "Attributes.FOLLOW_RANGE" + ], + [ + "SharedMonsterAttributes\\.knockbackResistance", + "Attributes.KNOCKBACK_RESISTANCE" + ] + ], + "imports": 10, + "swap": null + }, + "Constants": { + "fqn": "net.minecraftforge.common.util.Constants", + "category": "TRANSFORM", + "patterns": [ + [ + "Constants\\.NBT\\.TAG_COMPOUND", + "NbtConstants.TAG_COMPOUND" + ], + [ + "Constants\\.NBT\\.TAG_STRING", + "NbtConstants.TAG_STRING" + ], + [ + "Constants\\.NBT\\.TAG_LIST", + "NbtConstants.TAG_LIST" + ], + [ + "Constants\\.NBT\\.TAG_INT", + "NbtConstants.TAG_INT" + ], + [ + "Constants\\.NBT\\.TAG_DOUBLE", + "NbtConstants.TAG_DOUBLE" + ], + [ + "Constants\\.NBT\\.TAG_BYTE", + "NbtConstants.TAG_BYTE" + ], + [ + "Constants\\.NBT\\.TAG_FLOAT", + "NbtConstants.TAG_FLOAT" + ], + [ + "Constants\\.NBT\\.TAG_LONG", + "NbtConstants.TAG_LONG" + ], + [ + "Constants\\.NBT\\.TAG_SHORT", + "NbtConstants.TAG_SHORT" + ], + [ + "Constants\\.NBT\\.TAG_INT_ARRAY", + "NbtConstants.TAG_INT_ARRAY" + ], + [ + "Constants\\.NBT\\.TAG_BYTE_ARRAY", + "NbtConstants.TAG_BYTE_ARRAY" + ] + ], + "imports": 9, + "swap": null + }, + "CommandException": { + "fqn": "net.minecraft.command.CommandException", + "category": "TRANSFORM", + "patterns": [ + [ + "net\\.minecraft\\.command\\.CommandException", + "noppes.npcs.api.CommandException" + ], + [ + "new CommandException\\(", + "new CommandException(" + ] + ], + "imports": 31, + "swap": null + }, + "ChunkCoordinates": { + "fqn": "net.minecraft.util.ChunkCoordinates", + "category": "TRANSFORM", + "patterns": [ + [ + "new ChunkCoordinates\\(([^,]+),\\s*([^,]+),\\s*([^)]+)\\)", + "new BlockPos($1, $2, $3)" + ], + [ + "\\.posX\\b", + ".getX()" + ], + [ + "\\.posY\\b", + ".getY()" + ], + [ + "\\.posZ\\b", + ".getZ()" + ] + ], + "imports": 4, + "swap": null + }, + "EnumAction": { + "fqn": "net.minecraft.item.EnumAction", + "category": "TRANSFORM", + "patterns": [ + [ + "EnumAction\\.", + "ItemAction." + ] + ], + "imports": 11, + "swap": null + }, + "GuiButton": { + "fqn": "net.minecraft.client.gui.GuiButton", + "category": "SUPPRESS", + "reason": "client", + "imports": 218, + "swap": null + }, + "Minecraft": { + "fqn": "net.minecraft.client.Minecraft", + "category": "SUPPRESS", + "reason": "client", + "imports": 180, + "swap": null + }, + "ModelRenderer": { + "fqn": "net.minecraft.client.model.ModelRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 122, + "swap": null + }, + "ModelBase": { + "fqn": "net.minecraft.client.model.ModelBase", + "category": "SUPPRESS", + "reason": "client", + "imports": 102, + "swap": null + }, + "Block": { + "fqn": "net.minecraft.block.Block", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 84, + "swap": null + }, + "TileEntity": { + "fqn": "net.minecraft.tileentity.TileEntity", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 78, + "swap": null + }, + "GuiScreen": { + "fqn": "net.minecraft.client.gui.GuiScreen", + "category": "SUPPRESS", + "reason": "client", + "imports": 70, + "swap": null + }, + "Tessellator": { + "fqn": "net.minecraft.client.renderer.Tessellator", + "category": "SUPPRESS", + "reason": "client", + "imports": 46, + "swap": null + }, + "Slot": { + "fqn": "net.minecraft.inventory.Slot", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 42, + "swap": null + }, + "RenderHelper": { + "fqn": "net.minecraft.client.renderer.RenderHelper", + "category": "SUPPRESS", + "reason": "client", + "imports": 40, + "swap": null + }, + "OpenGlHelper": { + "fqn": "net.minecraft.client.renderer.OpenGlHelper", + "category": "SUPPRESS", + "reason": "client", + "imports": 39, + "swap": null + }, + "TextureManager": { + "fqn": "net.minecraft.client.renderer.texture.TextureManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 38, + "swap": null + }, + "FontRenderer": { + "fqn": "net.minecraft.client.gui.FontRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 38, + "swap": null + }, + "NBTTagString": { + "fqn": "net.minecraft.nbt.NBTTagString", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 35, + "swap": null + }, + "IIcon": { + "fqn": "net.minecraft.util.IIcon", + "category": "SUPPRESS", + "reason": "client", + "imports": 35, + "swap": null + }, + "RenderBlocks": { + "fqn": "net.minecraft.client.renderer.RenderBlocks", + "category": "SUPPRESS", + "reason": "client", + "imports": 35, + "swap": null + }, + "RenderManager": { + "fqn": "net.minecraft.client.renderer.entity.RenderManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 33, + "swap": null + }, + "ModelBox": { + "fqn": "net.minecraft.client.model.ModelBox", + "category": "SUPPRESS", + "reason": "client", + "imports": 32, + "swap": null + }, + "IInventory": { + "fqn": "net.minecraft.inventory.IInventory", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 30, + "swap": null + }, + "IBlockAccess": { + "fqn": "net.minecraft.world.IBlockAccess", + "category": "SUPPRESS", + "reason": "client", + "imports": 30, + "swap": null + }, + "RenderingRegistry": { + "fqn": "cpw.mods.fml.client.registry.RenderingRegistry", + "category": "SUPPRESS", + "reason": "client", + "imports": 28, + "swap": null + }, + "EntityAIBase": { + "fqn": "net.minecraft.entity.ai.EntityAIBase", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 27, + "swap": null + }, + "ScaledResolution": { + "fqn": "net.minecraft.client.gui.ScaledResolution", + "category": "SUPPRESS", + "reason": "client", + "imports": 26, + "swap": null + }, + "IIconRegister": { + "fqn": "net.minecraft.client.renderer.texture.IIconRegister", + "category": "SUPPRESS", + "reason": "client", + "imports": 26, + "swap": null + }, + "Container": { + "fqn": "net.minecraft.inventory.Container", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 25, + "swap": null + }, + "CreativeTabs": { + "fqn": "net.minecraft.creativetab.CreativeTabs", + "category": "SUPPRESS", + "reason": "registration", + "imports": 25, + "swap": null + }, + "Material": { + "fqn": "net.minecraft.block.material.Material", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 24, + "swap": null + }, + "GuiYesNo": { + "fqn": "net.minecraft.client.gui.GuiYesNo", + "category": "SUPPRESS", + "reason": "client", + "imports": 22, + "swap": null + }, + "Gui": { + "fqn": "net.minecraft.client.gui.Gui", + "category": "SUPPRESS", + "reason": "client", + "imports": 22, + "swap": null + }, + "GuiYesNoCallback": { + "fqn": "net.minecraft.client.gui.GuiYesNoCallback", + "category": "SUPPRESS", + "reason": "client", + "imports": 21, + "swap": null + }, + "ItemBlock": { + "fqn": "net.minecraft.item.ItemBlock", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 19, + "swap": null + }, + "Cancelable": { + "fqn": "cpw.mods.fml.common.eventhandler.Cancelable", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 19, + "swap": null + }, + "GameRegistry": { + "fqn": "cpw.mods.fml.common.registry.GameRegistry", + "category": "SUPPRESS", + "reason": "registration", + "imports": 18, + "swap": null + }, + "Event": { + "fqn": "cpw.mods.fml.common.eventhandler.Event", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 17, + "swap": null + }, + "BlockContainer": { + "fqn": "net.minecraft.block.BlockContainer", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 16, + "swap": null + }, + "ModelBiped": { + "fqn": "net.minecraft.client.model.ModelBiped", + "category": "SUPPRESS", + "reason": "client", + "imports": 16, + "swap": null + }, + "SubscribeEvent": { + "fqn": "cpw.mods.fml.common.eventhandler.SubscribeEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 15, + "swap": null + }, + "EntityItem": { + "fqn": "net.minecraft.entity.item.EntityItem", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 15, + "swap": null + }, + "ItemArmor": { + "fqn": "net.minecraft.item.ItemArmor", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 13, + "swap": null + }, + "IItemRenderer": { + "fqn": "net.minecraftforge.client.IItemRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 11, + "swap": null + }, + "IResource": { + "fqn": "net.minecraft.client.resources.IResource", + "category": "SUPPRESS", + "reason": "client", + "imports": 11, + "swap": null + }, + "BlockPos": { + "fqn": "net.minecraft.util.math.BlockPos", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 10, + "swap": null + }, + "Render": { + "fqn": "net.minecraft.client.renderer.entity.Render", + "category": "SUPPRESS", + "reason": "client", + "imports": 8, + "swap": null + }, + "ItemRenderer": { + "fqn": "net.minecraft.client.renderer.ItemRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 8, + "swap": null + }, + "MinecraftForge": { + "fqn": "net.minecraftforge.common.MinecraftForge", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 8, + "swap": null + }, + "RenderItem": { + "fqn": "net.minecraft.client.renderer.entity.RenderItem", + "category": "SUPPRESS", + "reason": "client", + "imports": 8, + "swap": null + }, + "EntityMob": { + "fqn": "net.minecraft.entity.monster.EntityMob", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 7, + "swap": null + }, + "EntityCreature": { + "fqn": "net.minecraft.entity.EntityCreature", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 7, + "swap": null + }, + "EntityAnimal": { + "fqn": "net.minecraft.entity.passive.EntityAnimal", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 7, + "swap": null + }, + "EntityTameable": { + "fqn": "net.minecraft.entity.passive.EntityTameable", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 7, + "swap": null + }, + "RendererLivingEntity": { + "fqn": "net.minecraft.client.renderer.entity.RendererLivingEntity", + "category": "SUPPRESS", + "reason": "client", + "imports": 7, + "swap": null + }, + "ISimpleBlockRenderingHandler": { + "fqn": "cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler", + "category": "SUPPRESS", + "reason": "client", + "imports": 7, + "swap": null + }, + "EntityClientPlayerMP": { + "fqn": "net.minecraft.client.entity.EntityClientPlayerMP", + "category": "SUPPRESS", + "reason": "client", + "imports": 7, + "swap": null + }, + "InventoryBasic": { + "fqn": "net.minecraft.inventory.InventoryBasic", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 7, + "swap": null + }, + "Packet": { + "fqn": "net.minecraft.network.Packet", + "category": "SUPPRESS", + "reason": "networking", + "imports": 7, + "swap": null + }, + "Enchantment": { + "fqn": "net.minecraft.enchantment.Enchantment", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 2, + "swap": null + }, + "MerchantRecipeList": { + "fqn": "net.minecraft.village.MerchantRecipeList", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 6, + "swap": null + }, + "MerchantRecipe": { + "fqn": "net.minecraft.village.MerchantRecipe", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "ObfuscationReflectionHelper": { + "fqn": "cpw.mods.fml.common.ObfuscationReflectionHelper", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 6, + "swap": null + }, + "EntityVillager": { + "fqn": "net.minecraft.entity.passive.EntityVillager", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 6, + "swap": null + }, + "FakePlayer": { + "fqn": "net.minecraftforge.common.util.FakePlayer", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 6, + "swap": null + }, + "IEntitySelector": { + "fqn": "net.minecraft.command.IEntitySelector", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 6, + "swap": null + }, + "S35PacketUpdateTileEntity": { + "fqn": "net.minecraft.network.play.server.S35PacketUpdateTileEntity", + "category": "SUPPRESS", + "reason": "networking", + "imports": 6, + "swap": null + }, + "ChatAllowedCharacters": { + "fqn": "net.minecraft.util.ChatAllowedCharacters", + "category": "SUPPRESS", + "reason": "client", + "imports": 6, + "swap": null + }, + "TickEvent": { + "fqn": "cpw.mods.fml.common.gameevent.TickEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 6, + "swap": null + }, + "TextureMap": { + "fqn": "net.minecraft.client.renderer.texture.TextureMap", + "category": "SUPPRESS", + "reason": "client", + "imports": 6, + "swap": null + }, + "NBTTagFloat": { + "fqn": "net.minecraft.nbt.NBTTagFloat", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 6, + "swap": null + }, + "EntityXPOrb": { + "fqn": "net.minecraft.entity.item.EntityXPOrb", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 5, + "swap": null + }, + "Achievement": { + "fqn": "net.minecraft.stats.Achievement", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 5, + "swap": null + }, + "BlockColored": { + "fqn": "net.minecraft.block.BlockColored", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 5, + "swap": null + }, + "ModContainer": { + "fqn": "cpw.mods.fml.common.ModContainer", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 5, + "swap": null + }, + "EntityThrowable": { + "fqn": "net.minecraft.entity.projectile.EntityThrowable", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 5, + "swap": null + }, + "EntityFX": { + "fqn": "net.minecraft.client.particle.EntityFX", + "category": "SUPPRESS", + "reason": "client", + "imports": 5, + "swap": null + }, + "FMLProxyPacket": { + "fqn": "cpw.mods.fml.common.network.internal.FMLProxyPacket", + "category": "SUPPRESS", + "reason": "networking", + "imports": 5, + "swap": null + }, + "PathEntity": { + "fqn": "net.minecraft.pathfinding.PathEntity", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 5, + "swap": null + }, + "TileEntitySpecialRenderer": { + "fqn": "net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 5, + "swap": null + }, + "Blocks": { + "fqn": "net.minecraft.init.Blocks", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 47, + "swap": null + }, + "Items": { + "fqn": "net.minecraft.init.Items", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 29, + "swap": null + }, + "EnumCreatureAttribute": { + "fqn": "net.minecraft.entity.EnumCreatureAttribute", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 4, + "swap": null + }, + "PlayerEvent": { + "fqn": "cpw.mods.fml.common.gameevent.PlayerEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 4, + "swap": null + }, + "IResourceManager": { + "fqn": "net.minecraft.client.resources.IResourceManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 4, + "swap": null + }, + "PositionedSoundRecord": { + "fqn": "net.minecraft.client.audio.PositionedSoundRecord", + "category": "SUPPRESS", + "reason": "client", + "imports": 4, + "swap": null + }, + "NPCRendererHelper": { + "fqn": "net.minecraft.client.renderer.entity.NPCRendererHelper", + "category": "SUPPRESS", + "reason": "client", + "imports": 4, + "swap": null + }, + "GLAllocation": { + "fqn": "net.minecraft.client.renderer.GLAllocation", + "category": "SUPPRESS", + "reason": "client", + "imports": 4, + "swap": null + }, + "EntityDragon": { + "fqn": "net.minecraft.entity.boss.EntityDragon", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 4, + "swap": null + }, + "EntityArrow": { + "fqn": "net.minecraft.entity.projectile.EntityArrow", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 4, + "swap": null + }, + "ItemTooltipEvent": { + "fqn": "net.minecraftforge.event.entity.player.ItemTooltipEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 4, + "swap": null + }, + "NetworkManager": { + "fqn": "net.minecraft.network.NetworkManager", + "category": "SUPPRESS", + "reason": "networking", + "imports": 4, + "swap": null + }, + "EntitySheep": { + "fqn": "net.minecraft.entity.passive.EntitySheep", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 4, + "swap": null + }, + "NBTTagByte": { + "fqn": "net.minecraft.nbt.NBTTagByte", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 4, + "swap": null + }, + "ItemBow": { + "fqn": "net.minecraft.item.ItemBow", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 4, + "swap": null + }, + "NBTTagIntArray": { + "fqn": "net.minecraft.nbt.NBTTagIntArray", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 4, + "swap": null + }, + "WorldEvent": { + "fqn": "net.minecraftforge.event.world.WorldEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 4, + "swap": null + }, + "PacketBuffer": { + "fqn": "net.minecraft.network.PacketBuffer", + "category": "SUPPRESS", + "reason": "networking", + "imports": 4, + "swap": null + }, + "EntityAITarget": { + "fqn": "net.minecraft.entity.ai.EntityAITarget", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 4, + "swap": null + }, + "GuiContainer": { + "fqn": "net.minecraft.client.gui.inventory.GuiContainer", + "category": "SUPPRESS", + "reason": "client", + "imports": 4, + "swap": null + }, + "InventoryCrafting": { + "fqn": "net.minecraft.inventory.InventoryCrafting", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 4, + "swap": null + }, + "AttributeModifier": { + "fqn": "net.minecraft.entity.ai.attributes.AttributeModifier", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 3, + "swap": null + }, + "SoundHandler": { + "fqn": "net.minecraft.client.audio.SoundHandler", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "RenderBiped": { + "fqn": "net.minecraft.client.renderer.entity.RenderBiped", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "ItemEditableBook": { + "fqn": "net.minecraft.item.ItemEditableBook", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 3, + "swap": null + }, + "ItemWritableBook": { + "fqn": "net.minecraft.item.ItemWritableBook", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 3, + "swap": null + }, + "ForgeHooksClient": { + "fqn": "net.minecraftforge.client.ForgeHooksClient", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "MinecraftForgeClient": { + "fqn": "net.minecraftforge.client.MinecraftForgeClient", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "ForgeChunkManager": { + "fqn": "net.minecraftforge.common.ForgeChunkManager", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 3, + "swap": null + }, + "BiomeGenBase": { + "fqn": "net.minecraft.world.biome.BiomeGenBase", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 3, + "swap": null + }, + "LivingEvent": { + "fqn": "net.minecraftforge.event.entity.living.LivingEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 3, + "swap": null + }, + "EntityInteractEvent": { + "fqn": "net.minecraftforge.event.entity.player.EntityInteractEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 3, + "swap": null + }, + "PlayerInteractEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerInteractEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 3, + "swap": null + }, + "SimpleReloadableResourceManager": { + "fqn": "net.minecraft.client.resources.SimpleReloadableResourceManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "KeyBinding": { + "fqn": "net.minecraft.client.settings.KeyBinding", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "ICrafting": { + "fqn": "net.minecraft.inventory.ICrafting", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 3, + "swap": null + }, + "ItemFood": { + "fqn": "net.minecraft.item.ItemFood", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 3, + "swap": null + }, + "PathNavigate": { + "fqn": "net.minecraft.pathfinding.PathNavigate", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 3, + "swap": null + }, + "PathPoint": { + "fqn": "net.minecraft.pathfinding.PathPoint", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 3, + "swap": null + }, + "AbstractClientPlayer": { + "fqn": "net.minecraft.client.entity.AbstractClientPlayer", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "GuiTextField": { + "fqn": "net.minecraft.client.gui.GuiTextField", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "InventoryPlayer": { + "fqn": "net.minecraft.entity.player.InventoryPlayer", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 3, + "swap": null + }, + "EntityRenderer": { + "fqn": "net.minecraft.client.renderer.EntityRenderer", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "RenderPlayer": { + "fqn": "net.minecraft.client.renderer.entity.RenderPlayer", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "BlockIce": { + "fqn": "net.minecraft.block.BlockIce", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 3, + "swap": null + }, + "BlockLeavesBase": { + "fqn": "net.minecraft.block.BlockLeavesBase", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 3, + "swap": null + }, + "BlockVine": { + "fqn": "net.minecraft.block.BlockVine", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 3, + "swap": null + }, + "EntityHorse": { + "fqn": "net.minecraft.entity.passive.EntityHorse", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 3, + "swap": null + }, + "RenderWorldLastEvent": { + "fqn": "net.minecraftforge.client.event.RenderWorldLastEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "IEntityAdditionalSpawnData": { + "fqn": "cpw.mods.fml.common.registry.IEntityAdditionalSpawnData", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 3, + "swap": null + }, + "FMLNetworkEvent": { + "fqn": "cpw.mods.fml.common.network.FMLNetworkEvent", + "category": "SUPPRESS", + "reason": "networking", + "imports": 3, + "swap": null + }, + "ArmorMaterial": { + "fqn": "net.minecraft.item.ItemArmor.ArmorMaterial", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 3, + "swap": null + }, + "EntityEvent": { + "fqn": "net.minecraftforge.event.entity.EntityEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 3, + "swap": null + }, + "EntityDamageSource": { + "fqn": "net.minecraft.util.EntityDamageSource", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 3, + "swap": null + }, + "ChunkCoordIntPair": { + "fqn": "net.minecraft.world.ChunkCoordIntPair", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 3, + "swap": null + }, + "EventPriority": { + "fqn": "cpw.mods.fml.common.eventhandler.EventPriority", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 3, + "swap": null + }, + "GuiScreenEvent": { + "fqn": "net.minecraftforge.client.event.GuiScreenEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 3, + "swap": null + }, + "IExtendedEntityProperties": { + "fqn": "net.minecraftforge.common.IExtendedEntityProperties", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 3, + "swap": null + }, + "ItemSword": { + "fqn": "net.minecraft.item.ItemSword", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 3, + "swap": null + }, + "NBTTagDouble": { + "fqn": "net.minecraft.nbt.NBTTagDouble", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 9, + "swap": null + }, + "NBTTagInt": { + "fqn": "net.minecraft.nbt.NBTTagInt", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 8, + "swap": null + }, + "IAttributeInstance": { + "fqn": "net.minecraft.entity.ai.attributes.IAttributeInstance", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "BlockEvent": { + "fqn": "net.minecraftforge.event.world.BlockEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "ResourcePackRepository": { + "fqn": "net.minecraft.client.resources.ResourcePackRepository", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "Ticket": { + "fqn": "net.minecraftforge.common.ForgeChunkManager.Ticket", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 2, + "swap": null + }, + "ScoreObjective": { + "fqn": "net.minecraft.scoreboard.ScoreObjective", + "category": "SUPPRESS", + "reason": "scoreboard-internal", + "imports": 2, + "swap": null + }, + "ScorePlayerTeam": { + "fqn": "net.minecraft.scoreboard.ScorePlayerTeam", + "category": "SUPPRESS", + "reason": "scoreboard-internal", + "imports": 2, + "swap": null + }, + "Scoreboard": { + "fqn": "net.minecraft.scoreboard.Scoreboard", + "category": "SUPPRESS", + "reason": "scoreboard-internal", + "imports": 2, + "swap": null + }, + "NetworkRegistry": { + "fqn": "cpw.mods.fml.common.network.NetworkRegistry", + "category": "SUPPRESS", + "reason": "registration", + "imports": 2, + "swap": null + }, + "EntityRegistry": { + "fqn": "cpw.mods.fml.common.registry.EntityRegistry", + "category": "SUPPRESS", + "reason": "registration", + "imports": 2, + "swap": null + }, + "IResourcePack": { + "fqn": "net.minecraft.client.resources.IResourcePack", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "CraftingManager": { + "fqn": "net.minecraft.item.crafting.CraftingManager", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 2, + "swap": null + }, + "GameSettings": { + "fqn": "net.minecraft.client.settings.GameSettings", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "TextureUtil": { + "fqn": "net.minecraft.client.renderer.texture.TextureUtil", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "EnumHelper": { + "fqn": "net.minecraftforge.common.util.EnumHelper", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 2, + "swap": null + }, + "OreDictionary": { + "fqn": "net.minecraftforge.oredict.OreDictionary", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 2, + "swap": null + }, + "EnchantmentHelper": { + "fqn": "net.minecraft.enchantment.EnchantmentHelper", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 2, + "swap": null + }, + "Chunk": { + "fqn": "net.minecraft.world.chunk.Chunk", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 2, + "swap": null + }, + "EntityJoinWorldEvent": { + "fqn": "net.minecraftforge.event.entity.EntityJoinWorldEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "ItemTossEvent": { + "fqn": "net.minecraftforge.event.entity.item.ItemTossEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "PlayerUseItemEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerUseItemEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "LivingAttackEvent": { + "fqn": "net.minecraftforge.event.entity.living.LivingAttackEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "LivingHurtEvent": { + "fqn": "net.minecraftforge.event.entity.living.LivingHurtEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "IRangedAttackMob": { + "fqn": "net.minecraft.entity.IRangedAttackMob", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 2, + "swap": null + }, + "NPCResourceHelper": { + "fqn": "net.minecraft.client.resources.NPCResourceHelper", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "ActiveRenderInfo": { + "fqn": "net.minecraft.client.renderer.ActiveRenderInfo", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "IMerchant": { + "fqn": "net.minecraft.entity.IMerchant", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "BiomeDictionary": { + "fqn": "net.minecraftforge.common.BiomeDictionary", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 2, + "swap": null + }, + "InventoryCraftResult": { + "fqn": "net.minecraft.inventory.InventoryCraftResult", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 2, + "swap": null + }, + "WeightedRandom": { + "fqn": "net.minecraft.util.WeightedRandom", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 2, + "swap": null + }, + "EntityGhast": { + "fqn": "net.minecraft.entity.monster.EntityGhast", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "S12PacketEntityVelocity": { + "fqn": "net.minecraft.network.play.server.S12PacketEntityVelocity", + "category": "SUPPRESS", + "reason": "networking", + "imports": 2, + "swap": null + }, + "EntityPlayerSP": { + "fqn": "net.minecraft.client.entity.EntityPlayerSP", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "ItemRenderType": { + "fqn": "net.minecraftforge.client.IItemRenderer.ItemRenderType", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "EnumCreatureType": { + "fqn": "net.minecraft.entity.EnumCreatureType", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "ChunkDataEvent": { + "fqn": "net.minecraftforge.event.world.ChunkDataEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "ChunkEvent": { + "fqn": "net.minecraftforge.event.world.ChunkEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "ChunkWatchEvent": { + "fqn": "net.minecraftforge.event.world.ChunkWatchEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "ContainerPlayer": { + "fqn": "net.minecraft.inventory.ContainerPlayer", + "category": "SUPPRESS", + "reason": "inventory", + "imports": 2, + "swap": null + }, + "LivingDeathEvent": { + "fqn": "net.minecraftforge.event.entity.living.LivingDeathEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "Phase": { + "fqn": "cpw.mods.fml.common.gameevent.TickEvent.Phase", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 2, + "swap": null + }, + "EntityMoveHelper": { + "fqn": "net.minecraft.entity.ai.EntityMoveHelper", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 2, + "swap": null + }, + "EnumSkyBlock": { + "fqn": "net.minecraft.world.EnumSkyBlock", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 2, + "swap": null + }, + "AbstractResourcePack": { + "fqn": "net.minecraft.client.resources.AbstractResourcePack", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "FallbackResourceManager": { + "fqn": "net.minecraft.client.resources.FallbackResourceManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "RenderLivingEvent": { + "fqn": "net.minecraftforge.client.event.RenderLivingEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "RenderPlayerEvent": { + "fqn": "net.minecraftforge.client.event.RenderPlayerEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "EntityPortalFX": { + "fqn": "net.minecraft.client.particle.EntityPortalFX", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "SkinManager": { + "fqn": "net.minecraft.client.resources.SkinManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 2, + "swap": null + }, + "EntityEnderman": { + "fqn": "net.minecraft.entity.monster.EntityEnderman", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "EntityCreeper": { + "fqn": "net.minecraft.entity.monster.EntityCreeper", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "IMob": { + "fqn": "net.minecraft.entity.monster.IMob", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "INpc": { + "fqn": "net.minecraft.entity.INpc", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "EntityFishHook": { + "fqn": "net.minecraft.entity.projectile.EntityFishHook", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 2, + "swap": null + }, + "NBTPrimitive": { + "fqn": "net.minecraft.nbt.NBTBase.NBTPrimitive", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 2, + "swap": null + }, + "FMLEventChannel": { + "fqn": "cpw.mods.fml.common.network.FMLEventChannel", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "IBlockSource": { + "fqn": "net.minecraft.dispenser.IBlockSource", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "CommandBlockLogic": { + "fqn": "net.minecraft.command.server.CommandBlockLogic", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "IntHashMap": { + "fqn": "net.minecraft.util.math.IntHashMap", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "WorldProvider": { + "fqn": "net.minecraft.world.WorldProvider", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "BlockDispenser": { + "fqn": "net.minecraft.block.BlockDispenser", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "FMLServerAboutToStartEvent": { + "fqn": "cpw.mods.fml.common.event.FMLServerAboutToStartEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "StringUtils": { + "fqn": "net.minecraft.util.StringUtils", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "MobSpawnerBaseLogic": { + "fqn": "net.minecraft.tileentity.MobSpawnerBaseLogic", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "TileEntityCommandBlock": { + "fqn": "net.minecraft.tileentity.TileEntityCommandBlock", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "TileEntityMobSpawner": { + "fqn": "net.minecraft.tileentity.TileEntityMobSpawner", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "ForgeHooks": { + "fqn": "net.minecraftforge.common.ForgeHooks", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "LivingFallEvent": { + "fqn": "net.minecraftforge.event.entity.living.LivingFallEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerDropsEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerDropsEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "EntityEnderPearl": { + "fqn": "net.minecraft.entity.item.EntityEnderPearl", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "ITickable": { + "fqn": "net.minecraft.client.renderer.texture.ITickable", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "MouseEvent": { + "fqn": "net.minecraftforge.client.event.MouseEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ClientRegistry": { + "fqn": "cpw.mods.fml.client.registry.ClientRegistry", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "IImageBuffer": { + "fqn": "net.minecraft.client.renderer.IImageBuffer", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "Util": { + "fqn": "net.minecraft.util.Util", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "ReflectionHelper": { + "fqn": "cpw.mods.fml.relauncher.ReflectionHelper", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "SoundRegistry": { + "fqn": "net.minecraft.client.audio.SoundRegistry", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "TexturedQuad": { + "fqn": "net.minecraft.client.model.TexturedQuad", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "BossStatus": { + "fqn": "net.minecraft.entity.boss.BossStatus", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ItemPotion": { + "fqn": "net.minecraft.item.ItemPotion", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "PotionHelper": { + "fqn": "net.minecraft.potion.PotionHelper", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "ModelBook": { + "fqn": "net.minecraft.client.model.ModelBook", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "NPCEntityHelper": { + "fqn": "net.minecraft.entity.NPCEntityHelper", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "FMLLaunchHandler": { + "fqn": "cpw.mods.fml.relauncher.FMLLaunchHandler", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "StatList": { + "fqn": "net.minecraft.stats.StatList", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "WorldSettings": { + "fqn": "net.minecraft.world.WorldSettings", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "Score": { + "fqn": "net.minecraft.scoreboard.Score", + "category": "SUPPRESS", + "reason": "scoreboard-internal", + "imports": 1, + "swap": null + }, + "FMLClientHandler": { + "fqn": "cpw.mods.fml.client.FMLClientHandler", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "PlayerNotFoundException": { + "fqn": "net.minecraft.command.PlayerNotFoundException", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "NetHandlerPlayServer": { + "fqn": "net.minecraft.network.NetHandlerPlayServer", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "GuiAchievement": { + "fqn": "net.minecraft.client.gui.achievement.GuiAchievement", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "NBTSizeTracker": { + "fqn": "net.minecraft.nbt.NBTSizeTracker", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 1, + "swap": null + }, + "IGuiHandler": { + "fqn": "cpw.mods.fml.common.network.IGuiHandler", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "BehaviorDefaultDispenseItem": { + "fqn": "net.minecraft.dispenser.BehaviorDefaultDispenseItem", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "ToolMaterial": { + "fqn": "net.minecraft.item.Item.ToolMaterial", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "ItemFlintAndSteel": { + "fqn": "net.minecraft.item.ItemFlintAndSteel", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "Mod": { + "fqn": "cpw.mods.fml.common.Mod", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "EventHandler": { + "fqn": "cpw.mods.fml.common.Mod.EventHandler", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "SidedProxy": { + "fqn": "cpw.mods.fml.common.SidedProxy", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "FMLLoadCompleteEvent": { + "fqn": "cpw.mods.fml.common.event.FMLLoadCompleteEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FMLServerStartedEvent": { + "fqn": "cpw.mods.fml.common.event.FMLServerStartedEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FMLServerStoppedEvent": { + "fqn": "cpw.mods.fml.common.event.FMLServerStoppedEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FMLInitializationEvent": { + "fqn": "cpw.mods.fml.common.event.FMLInitializationEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FMLPreInitializationEvent": { + "fqn": "cpw.mods.fml.common.event.FMLPreInitializationEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FMLServerStartingEvent": { + "fqn": "cpw.mods.fml.common.event.FMLServerStartingEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "ForgeEventFactory": { + "fqn": "net.minecraftforge.event.ForgeEventFactory", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "Teleporter": { + "fqn": "net.minecraft.world.Teleporter", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "LoaderState": { + "fqn": "cpw.mods.fml.common.LoaderState", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "EntityDamageSourceIndirect": { + "fqn": "net.minecraft.util.EntityDamageSourceIndirect", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "Result": { + "fqn": "cpw.mods.fml.common.eventhandler.Event.Result", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "ChunkPosition": { + "fqn": "net.minecraft.world.ChunkPosition", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "AnvilRepairEvent": { + "fqn": "net.minecraftforge.event.entity.player.AnvilRepairEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerDestroyItemEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerDestroyItemEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "EntityStruckByLightningEvent": { + "fqn": "net.minecraftforge.event.entity.EntityStruckByLightningEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlaySoundAtEntityEvent": { + "fqn": "net.minecraftforge.event.entity.PlaySoundAtEntityEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "AchievementEvent": { + "fqn": "net.minecraftforge.event.entity.player.AchievementEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "ArrowLooseEvent": { + "fqn": "net.minecraftforge.event.entity.player.ArrowLooseEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "ArrowNockEvent": { + "fqn": "net.minecraftforge.event.entity.player.ArrowNockEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "BonemealEvent": { + "fqn": "net.minecraftforge.event.entity.player.BonemealEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "FillBucketEvent": { + "fqn": "net.minecraftforge.event.entity.player.FillBucketEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerOpenContainerEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerOpenContainerEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerPickupXpEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerPickupXpEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerSleepInBedEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerSleepInBedEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PlayerWakeUpEvent": { + "fqn": "net.minecraftforge.event.entity.player.PlayerWakeUpEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "UseHoeEvent": { + "fqn": "net.minecraftforge.event.entity.player.UseHoeEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "PopulateChunkEvent": { + "fqn": "net.minecraftforge.event.terraingen.PopulateChunkEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "EntityAIDoorInteract": { + "fqn": "net.minecraft.entity.ai.EntityAIDoorInteract", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "BlockDoor": { + "fqn": "net.minecraft.block.BlockDoor", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "BlockFence": { + "fqn": "net.minecraft.block.BlockFence", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "BlockFenceGate": { + "fqn": "net.minecraft.block.BlockFenceGate", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "BlockRailBase": { + "fqn": "net.minecraft.block.BlockRailBase", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "BlockWall": { + "fqn": "net.minecraft.block.BlockWall", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "ChunkCache": { + "fqn": "net.minecraft.world.ChunkCache", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "EntityAINearestAttackableTarget": { + "fqn": "net.minecraft.entity.ai.EntityAINearestAttackableTarget", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "BlockBreakable": { + "fqn": "net.minecraft.block.BlockBreakable", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "ForgeDirection": { + "fqn": "net.minecraftforge.common.util.ForgeDirection", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "RenderGameOverlayEvent": { + "fqn": "net.minecraftforge.client.event.RenderGameOverlayEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "RenderHandEvent": { + "fqn": "net.minecraftforge.client.event.RenderHandEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "EntityFlameFX": { + "fqn": "net.minecraft.client.particle.EntityFlameFX", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "EntitySmokeFX": { + "fqn": "net.minecraft.client.particle.EntitySmokeFX", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "IReloadableResourceManager": { + "fqn": "net.minecraft.client.resources.IReloadableResourceManager", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ReportedException": { + "fqn": "net.minecraft.util.ReportedException", + "category": "SUPPRESS", + "reason": "debug", + "imports": 1, + "swap": null + }, + "ClientCommandHandler": { + "fqn": "net.minecraftforge.client.ClientCommandHandler", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "FolderResourcePack": { + "fqn": "net.minecraft.client.resources.FolderResourcePack", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "IResourceManagerReloadListener": { + "fqn": "net.minecraft.client.resources.IResourceManagerReloadListener", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "EntityChicken": { + "fqn": "net.minecraft.entity.passive.EntityChicken", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "SimpleTexture": { + "fqn": "net.minecraft.client.renderer.texture.SimpleTexture", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "InputEvent": { + "fqn": "cpw.mods.fml.common.gameevent.InputEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ClickEvent": { + "fqn": "net.minecraft.event.ClickEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ISound": { + "fqn": "net.minecraft.client.audio.ISound", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ITickableSound": { + "fqn": "net.minecraft.client.audio.ITickableSound", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "MovingSound": { + "fqn": "net.minecraft.client.audio.MovingSound", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "EntityConstructing": { + "fqn": "net.minecraftforge.event.entity.EntityEvent.EntityConstructing", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "C17PacketCustomPayload": { + "fqn": "net.minecraft.network.play.client.C17PacketCustomPayload", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "ShaderGroup": { + "fqn": "net.minecraft.client.shader.ShaderGroup", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "GuiOpenEvent": { + "fqn": "net.minecraftforge.client.event.GuiOpenEvent", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "GuiConfirmOpenLink": { + "fqn": "net.minecraft.client.gui.GuiConfirmOpenLink", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "DefaultResourcePack": { + "fqn": "net.minecraft.client.resources.DefaultResourcePack", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ITextureObject": { + "fqn": "net.minecraft.client.renderer.texture.ITextureObject", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "PositionTextureVertex": { + "fqn": "net.minecraft.client.model.PositionTextureVertex", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ImageBufferDownload": { + "fqn": "net.minecraft.client.renderer.ImageBufferDownload", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ItemRendererHelper": { + "fqn": "net.minecraftforge.client.IItemRenderer.ItemRendererHelper", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "SlotCrafting": { + "fqn": "net.minecraft.inventory.SlotCrafting", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 1, + "swap": null + }, + "S2FPacketSetSlot": { + "fqn": "net.minecraft.network.play.server.S2FPacketSetSlot", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "LoadingCallback": { + "fqn": "net.minecraftforge.common.ForgeChunkManager.LoadingCallback", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "EnumEnchantmentType": { + "fqn": "net.minecraft.enchantment.EnumEnchantmentType", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "EntityAIAttackOnCollide": { + "fqn": "net.minecraft.entity.ai.EntityAIAttackOnCollide", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EntityAIHurtByTarget": { + "fqn": "net.minecraft.entity.ai.EntityAIHurtByTarget", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EntityAIOpenDoor": { + "fqn": "net.minecraft.entity.ai.EntityAIOpenDoor", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EntityAIRestrictSun": { + "fqn": "net.minecraft.entity.ai.EntityAIRestrictSun", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EntityAISwimming": { + "fqn": "net.minecraft.entity.ai.EntityAISwimming", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EntityAITaskEntry": { + "fqn": "net.minecraft.entity.ai.EntityAITasks.EntityAITaskEntry", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "IBossDisplayData": { + "fqn": "net.minecraft.entity.boss.IBossDisplayData", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "EntityZombie": { + "fqn": "net.minecraft.entity.monster.EntityZombie", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "EntityBat": { + "fqn": "net.minecraft.entity.passive.EntityBat", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "S0BPacketAnimation": { + "fqn": "net.minecraft.network.play.server.S0BPacketAnimation", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "ServerChatEvent": { + "fqn": "net.minecraftforge.event.ServerChatEvent", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + }, + "S27PacketExplosion": { + "fqn": "net.minecraft.network.play.server.S27PacketExplosion", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "MovingObjectType": { + "fqn": "net.minecraft.util.MovingObjectPosition.MovingObjectType", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "EntitySkeleton": { + "fqn": "net.minecraft.entity.monster.EntitySkeleton", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "S04PacketEntityEquipment": { + "fqn": "net.minecraft.network.play.server.S04PacketEntityEquipment", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "ItemColored": { + "fqn": "net.minecraft.item.ItemColored", + "category": "SUPPRESS", + "reason": "item-internal", + "imports": 1, + "swap": null + }, + "FMLMessage": { + "fqn": "cpw.mods.fml.common.network.internal.FMLMessage", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "EntityTrackerEntry": { + "fqn": "net.minecraft.entity.EntityTrackerEntry", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "EnumDifficulty": { + "fqn": "net.minecraft.world.EnumDifficulty", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "CommandHandler": { + "fqn": "net.minecraft.command.CommandHandler", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "Vec3i": { + "fqn": "net.minecraft.util.Vec3i", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "BlockAir": { + "fqn": "net.minecraft.block.BlockAir", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "EntityLightningBolt": { + "fqn": "net.minecraft.entity.effect.EntityLightningBolt", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "TileEntitySign": { + "fqn": "net.minecraft.tileentity.TileEntitySign", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "BlockSnapshot": { + "fqn": "net.minecraftforge.common.util.BlockSnapshot", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "StatBase": { + "fqn": "net.minecraft.stats.StatBase", + "category": "SUPPRESS", + "reason": "forge-internal", + "imports": 1, + "swap": null + }, + "IPlantable": { + "fqn": "net.minecraftforge.common.IPlantable", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "IScoreObjectiveCriteria": { + "fqn": "net.minecraft.scoreboard.IScoreObjectiveCriteria", + "category": "SUPPRESS", + "reason": "scoreboard-internal", + "imports": 1, + "swap": null + }, + "NBTTagByteArray": { + "fqn": "net.minecraft.nbt.NBTTagByteArray", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 1, + "swap": null + }, + "NBTTagLong": { + "fqn": "net.minecraft.nbt.NBTTagLong", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 1, + "swap": null + }, + "NBTTagShort": { + "fqn": "net.minecraft.nbt.NBTTagShort", + "category": "SUPPRESS", + "reason": "nbt-subtype", + "imports": 1, + "swap": null + }, + "IWorldAccess": { + "fqn": "net.minecraft.world.IWorldAccess", + "category": "SUPPRESS", + "reason": "world-internal", + "imports": 1, + "swap": null + }, + "GuiInventory": { + "fqn": "net.minecraft.client.gui.inventory.GuiInventory", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "C0DPacketCloseWindow": { + "fqn": "net.minecraft.network.play.client.C0DPacketCloseWindow", + "category": "SUPPRESS", + "reason": "networking", + "imports": 1, + "swap": null + }, + "PathFinder": { + "fqn": "net.minecraft.pathfinding.PathFinder", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "MapColor": { + "fqn": "net.minecraft.block.material.MapColor", + "category": "SUPPRESS", + "reason": "block-internal", + "imports": 1, + "swap": null + }, + "RenderGlobal": { + "fqn": "net.minecraft.client.renderer.RenderGlobal", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "IRecipe": { + "fqn": "net.minecraft.item.crafting.IRecipe", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 1, + "swap": null + }, + "GuiSlot": { + "fqn": "net.minecraft.client.gui.GuiSlot", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "RenderLiving": { + "fqn": "net.minecraft.client.renderer.entity.RenderLiving", + "category": "SUPPRESS", + "reason": "client", + "imports": 1, + "swap": null + }, + "ShapedRecipes": { + "fqn": "net.minecraft.item.crafting.ShapedRecipes", + "category": "SUPPRESS", + "reason": "recipe-system", + "imports": 1, + "swap": null + }, + "DataWatcher": { + "fqn": "net.minecraft.entity.DataWatcher", + "category": "SUPPRESS", + "reason": "entity-hierarchy", + "imports": 1, + "swap": null + }, + "EntityAITasks": { + "fqn": "net.minecraft.entity.ai.EntityAITasks", + "category": "SUPPRESS", + "reason": "entity-ai", + "imports": 1, + "swap": null + }, + "EventBus": { + "fqn": "cpw.mods.fml.common.eventhandler.EventBus", + "category": "SUPPRESS", + "reason": "event-system", + "imports": 1, + "swap": null + } + } +}