diff --git a/dependencies.gradle b/dependencies.gradle index 836ea62c..b4101f27 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -28,7 +28,7 @@ dependencies { transformedModCompileOnly("com.github.GTNewHorizons:Railcraft:9.15.14:dev") { exclude group: "thaumcraft", module: "Thaumcraft" } transformedModCompileOnly("com.github.GTNewHorizons:TinkersConstruct:1.12.9-GTNH:dev") transformedModCompileOnly(rfg.deobf("curse.maven:bibliocraft-228027:2423369")) - transformedModCompileOnly("curse.maven:biomes-o-plenty-220318:2499612") + transformedModCompileOnly(rfg.deobf("curse.maven:biomes-o-plenty-220318:2499612")) transformedModCompileOnly("curse.maven:cofh-core-69162:2388751") transformedModCompileOnly("curse.maven:minefactory-reloaded-66672:2277486") transformedModCompileOnly(rfg.deobf('curse.maven:damage-indicators-mod-59489:2692129')) diff --git a/src/main/java/com/mitchej123/hodgepodge/Hodgepodge.java b/src/main/java/com/mitchej123/hodgepodge/Hodgepodge.java index 3fd5dbab..4afd6ed8 100644 --- a/src/main/java/com/mitchej123/hodgepodge/Hodgepodge.java +++ b/src/main/java/com/mitchej123/hodgepodge/Hodgepodge.java @@ -4,16 +4,20 @@ import com.mitchej123.hodgepodge.client.HodgepodgeClient; import com.mitchej123.hodgepodge.commands.DebugCommand; +import com.mitchej123.hodgepodge.config.TweaksConfig; import com.mitchej123.hodgepodge.net.NetworkHandler; import com.mitchej123.hodgepodge.util.AnchorAlarm; +import com.mitchej123.hodgepodge.util.StatHandler; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.ICrashCallable; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.Mod.EventHandler; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLModIdMappingEvent; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; +import cpw.mods.fml.common.event.FMLServerStartedEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.network.NetworkCheckHandler; import cpw.mods.fml.common.versioning.ArtifactVersion; @@ -90,6 +94,20 @@ public void onServerStarting(FMLServerStartingEvent aEvent) { EVENT_HANDLER.setAidTriggerDisabled(false); } + @EventHandler + public void onServerStarted(FMLServerStartedEvent event) { + if (TweaksConfig.addModEntityStats) { + StatHandler.addEntityStats(); + } + } + + @EventHandler + public void onModIdMapping(FMLModIdMappingEvent event) { + if (TweaksConfig.addModItemStats) { + StatHandler.remap(event.remappedIds); + } + } + /** * Block any clients older than 2.5.36 from joining servers to ensure the fastBlockPlacingDisableServerSide setting * is respected diff --git a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java index 3552bc31..c7dc3165 100644 --- a/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java +++ b/src/main/java/com/mitchej123/hodgepodge/commands/DebugCommand.java @@ -40,9 +40,8 @@ private void printHelp(ICommandSender sender) { "\"randomNbt [bytes]\" - adds a random byte array of the given size to the held item")); } - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public List addTabCompletionOptions(ICommandSender sender, String[] ss) { + public List addTabCompletionOptions(ICommandSender sender, String[] ss) { List l = new ArrayList<>(); String test = ss.length == 0 ? "" : ss[0].trim(); if (ss.length == 0 || ss.length == 1 diff --git a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java index 11ffc738..c8f69086 100644 --- a/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java +++ b/src/main/java/com/mitchej123/hodgepodge/config/TweaksConfig.java @@ -158,6 +158,25 @@ public class TweaksConfig { @Config.RequiresMcRestart public static boolean unbindKeybindsByDefault; + @Config.Comment("Adds non-vanilla blocks/items to the statistics") + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean addModItemStats; + + @Config.Comment("Adds non-vanilla entities to the statistics") + @Config.DefaultBoolean(true) + @Config.RequiresMcRestart + public static boolean addModEntityStats; + + @Config.Comment("No stats will be registered for these enties (e.g. because another mod already adds them)") + @Config.DefaultStringList({ "Mob", "Monster" }) + @Config.RequiresMcRestart + public static String[] entityStatsExclusions; + + @Config.Comment("Sort Mob stats lexicographically (Requires addModEntityStats)") + @Config.DefaultBoolean(true) + public static boolean sortEntityStats; + // Automagy @Config.Comment("Implement container for thirsty tank") diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java index c0964adf..c01aed89 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/Mixins.java @@ -200,8 +200,8 @@ public enum Mixins { FIX_BOGUS_INTEGRATED_SERVER_NPE(new Builder("Fix bogus FMLProxyPacket NPEs on integrated server crashes") .setPhase(Phase.EARLY).setSide(Side.BOTH) .addMixinClasses( - "forge.MixinFMLProxyPacket", - "forge.MixinNetworkDispatcher", + "fml.MixinFMLProxyPacket", + "fml.MixinNetworkDispatcher", "minecraft.NetworkManagerAccessor") .setApplyIf(() -> FixesConfig.fixBogusIntegratedServerNPEs).addTargetedMod(TargetedMod.VANILLA)), @@ -277,7 +277,7 @@ public enum Mixins { .setPhase(Phase.EARLY).addTargetedMod(TargetedMod.VANILLA).setApplyIf(() -> TweaksConfig.enhanceNightVision) .addMixinClasses("minecraft.MixinEntityRenderer_EnhanceNightVision")), OPTIMIZE_ASMDATATABLE_INDEX(new Builder("Optimize ASM DataTable Index").setPhase(Phase.EARLY).setSide(Side.BOTH) - .addMixinClasses("forge.MixinASMDataTable").setApplyIf(() -> SpeedupsConfig.optimizeASMDataTable) + .addMixinClasses("fml.MixinASMDataTable").setApplyIf(() -> SpeedupsConfig.optimizeASMDataTable) .addTargetedMod(TargetedMod.VANILLA)), SQUASH_BED_ERROR_MESSAGE(new Builder("Stop \"You can only sleep at night\" message filling the chat") .addMixinClasses("minecraft.MixinNetHandlerPlayClient").addTargetedMod(TargetedMod.VANILLA) @@ -297,7 +297,7 @@ public enum Mixins { .addMixinClasses("forge.MixinGuiIngameForge_CrosshairInvertColors").setSide(Side.CLIENT) .setApplyIf(() -> TweaksConfig.dontInvertCrosshairColor).addTargetedMod(TargetedMod.VANILLA)), FIX_OPENGUIHANDLER_WINDOWID(new Builder("Fix OpenGuiHandler").setPhase(Phase.EARLY).setSide(Side.BOTH) - .addMixinClasses("forge.MixinOpenGuiHandler").setApplyIf(() -> FixesConfig.fixForgeOpenGuiHandlerWindowId) + .addMixinClasses("fml.MixinOpenGuiHandler").setApplyIf(() -> FixesConfig.fixForgeOpenGuiHandlerWindowId) .addTargetedMod(TargetedMod.VANILLA)), FIX_KEYBIND_CONFLICTS(new Builder("Trigger all conflicting keybinds").setPhase(Phase.EARLY).setSide(Side.CLIENT) .addMixinClasses("minecraft.MixinKeyBinding", "minecraft.MixinMinecraft_UpdateKeys") @@ -398,6 +398,19 @@ public enum Mixins { .addMixinClasses("minecraft.MixinMinecraft_FixDuplicateSounds") .setApplyIf(() -> FixesConfig.fixDuplicateSounds)), + ADD_MOD_ITEM_STATS(new Builder("Add stats for modded items").addMixinClasses("fml.MixinGameRegistry") + .addTargetedMod(TargetedMod.VANILLA).setApplyIf(() -> TweaksConfig.addModItemStats).setPhase(Phase.EARLY) + .setSide(Side.BOTH)), + + ADD_MOD_ENTITY_STATS(new Builder("Add stats for modded entities").addMixinClasses("minecraft.MixinStatList") + .addTargetedMod(TargetedMod.VANILLA).setApplyIf(() -> TweaksConfig.addModEntityStats).setPhase(Phase.EARLY) + .setSide(Side.BOTH)), + + ADD_MOD_ENTITY_STATS_CLIENT(new Builder("Add stats for modded entities (client side)") + .addMixinClasses("minecraft.MixinStatsMobsList", "minecraft.MixinStatsBlock", "minecraft.MixinStatsItem") + .addTargetedMod(TargetedMod.VANILLA).setApplyIf(() -> TweaksConfig.addModEntityStats).setPhase(Phase.EARLY) + .setSide(Side.CLIENT)), + FIX_SLASH_COMMAND( new Builder("Fix forge command handler not checking for a / and also not running commands with any case") .setPhase(Phase.EARLY).setSide(Side.CLIENT).addTargetedMod(TargetedMod.VANILLA) @@ -453,10 +466,10 @@ public enum Mixins { "ic2.MixinIC2ArmorSolarHelmet", "ic2.MixinIC2ArmorStaticBoots") .setApplyIf(() -> FixesConfig.fixIc2ArmorLag).addTargetedMod(TargetedMod.IC2)), - IC2_RESOURCE_PACK_TRANSLATION_FIX(new Builder("IC2 Resource Pack Translation Fix").setPhase(Phase.EARLY) - .setSide(Side.CLIENT) - .addMixinClasses("forge.MixinLanguageRegistry", "forge.MixinFMLClientHandler", "ic2.MixinLocalization") - .setApplyIf(() -> FixesConfig.fixIc2ResourcePackTranslation).addTargetedMod(TargetedMod.IC2)), + IC2_RESOURCE_PACK_TRANSLATION_FIX( + new Builder("IC2 Resource Pack Translation Fix").setPhase(Phase.EARLY).setSide(Side.CLIENT) + .addMixinClasses("fml.MixinLanguageRegistry", "fml.MixinFMLClientHandler", "ic2.MixinLocalization") + .setApplyIf(() -> FixesConfig.fixIc2ResourcePackTranslation).addTargetedMod(TargetedMod.IC2)), // Disable update checkers BIBLIOCRAFT_UPDATE_CHECK(new Builder("Yeet Bibliocraft Update Check").setPhase(Phase.LATE).setSide(Side.CLIENT) diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinASMDataTable.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinASMDataTable.java similarity index 97% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinASMDataTable.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinASMDataTable.java index 3aaaa7ba..86445a84 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinASMDataTable.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinASMDataTable.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import java.io.File; import java.util.HashMap; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLClientHandler.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLClientHandler.java similarity index 94% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLClientHandler.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLClientHandler.java index 441d9b87..ec8aff01 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLClientHandler.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLClientHandler.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLProxyPacket.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLProxyPacket.java similarity index 98% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLProxyPacket.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLProxyPacket.java index 92429c35..2f5f2eea 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinFMLProxyPacket.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinFMLProxyPacket.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import net.minecraft.network.Packet; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinGameRegistry.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinGameRegistry.java new file mode 100644 index 00000000..3d27206a --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinGameRegistry.java @@ -0,0 +1,69 @@ +package com.mitchej123.hodgepodge.mixins.early.fml; + +import net.minecraft.block.Block; +import net.minecraft.item.Item; +import net.minecraft.item.ItemBlock; +import net.minecraft.stats.StatCrafting; +import net.minecraft.stats.StatList; +import net.minecraft.util.ChatComponentTranslation; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.mitchej123.hodgepodge.util.ChatComponentItemTranslation; + +import cpw.mods.fml.common.registry.GameRegistry; + +@Mixin(GameRegistry.class) +public class MixinGameRegistry { + + @ModifyExpressionValue( + at = @At( + target = "Lcpw/mods/fml/common/registry/GameData;registerItem(Lnet/minecraft/item/Item;Ljava/lang/String;)I", + value = "INVOKE"), + method = "registerBlock(Lnet/minecraft/block/Block;Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Object;)Lnet/minecraft/block/Block;", + remap = false) + private static int hodgepodge$registerBlockStats(int itemId, Block block, Class itemclass, + String name, Object[] itemCtorArgs, @Local ItemBlock i) { + if (block.getEnableStats()) { + StatCrafting statMine = hodgepodge$createAndRegisterStat("stat.mineBlock", i); + StatList.mineBlockStatArray[itemId] = statMine; + StatList.objectMineStats.add(statMine); + } + StatList.objectUseStats[itemId] = hodgepodge$createAndRegisterStat("stat.useItem", i); + StatList.objectCraftStats[itemId] = hodgepodge$createAndRegisterStat("stat.craftItem", i); + return itemId; + } + + @ModifyExpressionValue( + at = @At( + target = "Lcpw/mods/fml/common/registry/GameData;registerItem(Lnet/minecraft/item/Item;Ljava/lang/String;)I", + value = "INVOKE"), + method = "registerItem(Lnet/minecraft/item/Item;Ljava/lang/String;Ljava/lang/String;)Lnet/minecraft/item/Item;", + remap = false) + private static int hodgepodge$registerItemStats(int itemId, Item item, String name, String modId) { + if (item.isDamageable()) { + StatList.objectBreakStats[itemId] = hodgepodge$createAndRegisterStat("stat.breakItem", item); + } + StatCrafting statCraft = hodgepodge$createAndRegisterStat("stat.useItem", item); + StatList.objectUseStats[itemId] = statCraft; + if (!(item instanceof ItemBlock)) { + StatList.itemStats.add(statCraft); + } + StatList.objectCraftStats[itemId] = hodgepodge$createAndRegisterStat("stat.craftItem", item); + return itemId; + } + + @Unique + private static StatCrafting hodgepodge$createAndRegisterStat(String key, Item item) { + StatCrafting stat = new StatCrafting( + key + ".autogen." + item.delegate.name(), + new ChatComponentTranslation(key, new ChatComponentItemTranslation(item)), + item); + stat.registerStat(); + return stat; + } +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinLanguageRegistry.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinLanguageRegistry.java similarity index 98% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinLanguageRegistry.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinLanguageRegistry.java index cc4a14b6..315f56b4 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinLanguageRegistry.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinLanguageRegistry.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import java.io.File; import java.io.IOException; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinNetworkDispatcher.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinNetworkDispatcher.java similarity index 97% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinNetworkDispatcher.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinNetworkDispatcher.java index e13df981..e1c163dc 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinNetworkDispatcher.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinNetworkDispatcher.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import java.lang.ref.WeakReference; diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinOpenGuiHandler.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinOpenGuiHandler.java similarity index 96% rename from src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinOpenGuiHandler.java rename to src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinOpenGuiHandler.java index 568be96f..26ecfdeb 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinOpenGuiHandler.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/fml/MixinOpenGuiHandler.java @@ -1,4 +1,4 @@ -package com.mitchej123.hodgepodge.mixins.early.forge; +package com.mitchej123.hodgepodge.mixins.early.fml; import static org.objectweb.asm.Opcodes.PUTFIELD; @@ -21,7 +21,7 @@ import cpw.mods.fml.common.network.internal.OpenGuiHandler; import io.netty.channel.SimpleChannelInboundHandler; -@Mixin(value = { OpenGuiHandler.class }) +@Mixin(value = OpenGuiHandler.class) public abstract class MixinOpenGuiHandler extends SimpleChannelInboundHandler { /* diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinGuiIngameForge_CrosshairInvertColors.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinGuiIngameForge_CrosshairInvertColors.java index f4c7070b..ccfe0197 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinGuiIngameForge_CrosshairInvertColors.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/forge/MixinGuiIngameForge_CrosshairInvertColors.java @@ -5,7 +5,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; @Mixin(GuiIngameForge.class) public class MixinGuiIngameForge_CrosshairInvertColors { diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/ic2/MixinLocalization.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/ic2/MixinLocalization.java index 8ac496a6..77ae812f 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/ic2/MixinLocalization.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/ic2/MixinLocalization.java @@ -8,6 +8,9 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import com.mitchej123.hodgepodge.mixins.early.fml.MixinLanguageRegistry; +import com.mitchej123.hodgepodge.mixins.hooks.IC2ResourcePack; + import cpw.mods.fml.common.registry.LanguageRegistry; import ic2.core.init.Localization; @@ -17,8 +20,8 @@ public class MixinLocalization { /** * Translations are delegated to vanilla lang system * - * @see com.mitchej123.hodgepodge.mixins.early.forge.MixinLanguageRegistry - * @see com.mitchej123.hodgepodge.mixins.hooks.IC2ResourcePack + * @see MixinLanguageRegistry + * @see IC2ResourcePack */ @Redirect( method = "postInit", @@ -32,8 +35,8 @@ public class MixinLocalization { /** * @author miozune * @reason Translations are delegated to vanilla lang system - * @see com.mitchej123.hodgepodge.mixins.early.forge.MixinLanguageRegistry - * @see com.mitchej123.hodgepodge.mixins.hooks.IC2ResourcePack + * @see MixinLanguageRegistry + * @see IC2ResourcePack */ @Overwrite(remap = false) protected static Map getStringTranslateMap() { diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityLivingBase_HidePotionParticles.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityLivingBase_HidePotionParticles.java index 8e991899..9aab2216 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityLivingBase_HidePotionParticles.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityLivingBase_HidePotionParticles.java @@ -7,7 +7,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; import com.mitchej123.hodgepodge.config.TweaksConfig; /** diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityPlayerMP.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityPlayerMP.java index 19366271..0684a411 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityPlayerMP.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinEntityPlayerMP.java @@ -36,7 +36,6 @@ public abstract class MixinEntityPlayerMP extends EntityLivingBase { ServersideAttributeMap oldAttributeMap = (ServersideAttributeMap) oldPlayer.getAttributeMap(); // Grab the watched attributes - @SuppressWarnings("unchecked") Collection watchedAttribs = oldAttributeMap.getWatchedAttributes(); if (!watchedAttribs.isEmpty()) { @@ -64,7 +63,6 @@ public abstract class MixinEntityPlayerMP extends EntityLivingBase { } // Helper method based on 1.12 - @SuppressWarnings("unchecked") @Unique private Collection getModifiers(ModifiableAttributeInstance attr) { Set toReturn = Sets.newHashSet(); diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiContainerCreative.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiContainerCreative.java index f8a6dd98..31955b17 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiContainerCreative.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiContainerCreative.java @@ -15,7 +15,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; @Mixin(GuiContainerCreative.class) public abstract class MixinGuiContainerCreative extends GuiContainer { diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiNewChat_TransparentChat.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiNewChat_TransparentChat.java index de5d2138..1f32d198 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiNewChat_TransparentChat.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinGuiNewChat_TransparentChat.java @@ -6,7 +6,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import com.llamalad7.mixinextras.injector.WrapWithCondition; +import com.llamalad7.mixinextras.injector.v2.WrapWithCondition; @Mixin(GuiNewChat.class) public abstract class MixinGuiNewChat_TransparentChat { diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinServerConfigurationManager.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinServerConfigurationManager.java index 26b99610..111a298a 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinServerConfigurationManager.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinServerConfigurationManager.java @@ -29,7 +29,6 @@ public class MixinServerConfigurationManager { private void hodgepodge$sendEntityProperties(EntityPlayerMP player, int dimension, Teleporter teleporter, CallbackInfo ci) { ServersideAttributeMap attributeMap = (ServersideAttributeMap) player.getAttributeMap(); - @SuppressWarnings("unchecked") Collection watchedAttribs = attributeMap.getWatchedAttributes(); if (!watchedAttribs.isEmpty()) { player.playerNetServerHandler diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatList.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatList.java new file mode 100644 index 00000000..0fede5c2 --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatList.java @@ -0,0 +1,29 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft; + +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.stats.StatList; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.mitchej123.hodgepodge.util.StatHandler; +import com.mitchej123.hodgepodge.util.StatHandler.EntityInfo; + +@Mixin(StatList.class) +public class MixinStatList { + + @ModifyExpressionValue( + at = @At( + target = "Lnet/minecraft/entity/EntityList;getStringFromID(I)Ljava/lang/String;", + value = "INVOKE"), + method = { "func_151182_a", "func_151176_b" }) // these methods create and register the stats for + // killing/being killed by the specified entity + private static String hodgepodge$getEntityName(String original, EntityEggInfo info) { + if (info instanceof EntityInfo) { + return StatHandler.currentEntityName; + } + return original; + } + +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsBlock.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsBlock.java new file mode 100644 index 00000000..051c838b --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsBlock.java @@ -0,0 +1,41 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft; + +import net.minecraft.stats.StatBase; +import net.minecraft.stats.StatCrafting; + +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mitchej123.hodgepodge.util.StatHandler; + +@Mixin(targets = "net.minecraft.client.gui.achievement.GuiStats$StatsBlock") +public class MixinStatsBlock { + + @Redirect( + at = @At( + args = "array=get", + opcode = Opcodes.GETSTATIC, + target = "Lnet/minecraft/stats/StatList;objectUseStats:[Lnet/minecraft/stats/StatBase;", + value = "FIELD"), + expect = 2, + method = "") + private StatBase hodgepodge$preventUseAIOOBE(StatBase[] array, int index, @Local StatCrafting statcrafting) { + return StatHandler.checkBounds(array, index, statcrafting); + } + + @Redirect( + at = @At( + args = "array=get", + opcode = Opcodes.GETSTATIC, + target = "Lnet/minecraft/stats/StatList;objectCraftStats:[Lnet/minecraft/stats/StatBase;", + value = "FIELD"), + expect = 2, + method = "") + private StatBase hodgepodge$preventCraftAIOOBE(StatBase[] array, int index, @Local StatCrafting statcrafting) { + return StatHandler.checkBounds(array, index, statcrafting); + } + +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsItem.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsItem.java new file mode 100644 index 00000000..4d259af8 --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsItem.java @@ -0,0 +1,41 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft; + +import net.minecraft.stats.StatBase; +import net.minecraft.stats.StatCrafting; + +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import com.llamalad7.mixinextras.sugar.Local; +import com.mitchej123.hodgepodge.util.StatHandler; + +@Mixin(targets = "net.minecraft.client.gui.achievement.GuiStats$StatsItem") +public class MixinStatsItem { + + @Redirect( + at = @At( + args = "array=get", + opcode = Opcodes.GETSTATIC, + target = "Lnet/minecraft/stats/StatList;objectBreakStats:[Lnet/minecraft/stats/StatBase;", + value = "FIELD"), + expect = 2, + method = "") + private StatBase hodgepodge$preventBreakAIOOBE(StatBase[] array, int index, @Local StatCrafting statcrafting) { + return StatHandler.checkBounds(array, index, statcrafting); + } + + @Redirect( + at = @At( + args = "array=get", + opcode = Opcodes.GETSTATIC, + target = "Lnet/minecraft/stats/StatList;objectCraftStats:[Lnet/minecraft/stats/StatBase;", + value = "FIELD"), + expect = 2, + method = "") + private StatBase hodgepodge$preventCraftAIOOBE(StatBase[] array, int index, @Local StatCrafting statcrafting) { + return StatHandler.checkBounds(array, index, statcrafting); + } + +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsMobsList.java b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsMobsList.java new file mode 100644 index 00000000..000ce8a0 --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/early/minecraft/MixinStatsMobsList.java @@ -0,0 +1,87 @@ +package com.mitchej123.hodgepodge.mixins.early.minecraft; + +import java.util.Comparator; +import java.util.List; + +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.stats.StatFileWriter; +import net.minecraft.util.StatCollector; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.sugar.Local; +import com.mitchej123.hodgepodge.config.TweaksConfig; +import com.mitchej123.hodgepodge.util.StatHandler; +import com.mitchej123.hodgepodge.util.StatHandler.EntityInfo; + +import cpw.mods.fml.client.FMLClientHandler; + +@Mixin(targets = "net.minecraft.client.gui.achievement.GuiStats$StatsMobsList") +public class MixinStatsMobsList { + + // This List contains all instances of EntityEggInfo for which the stats should be displayed. The order in which + // they are displayed is determined by the List's order + @Shadow + private @Final List field_148222_l; + + @Inject(at = @At("TAIL"), method = "") + private void hodgepodge$addModdedEntities(CallbackInfo ci) { + StatFileWriter stats = FMLClientHandler.instance().getClientPlayerEntity().getStatFileWriter(); + for (EntityEggInfo info : StatHandler.ADDITIONAL_ENTITY_EGGS.values()) { + // Is either the killed Entity or killed by Entity stat non-zero? + // NOTE: StatFileWriter.writeStat() actually reads the stat (writing is done with + // StatFileWriter.func_150873_a()) + if (stats.writeStat(info.field_151512_d) > 0 || stats.writeStat(info.field_151513_e) > 0) { + this.field_148222_l.add(info); + } + } + if (TweaksConfig.sortEntityStats) { + this.field_148222_l.sort(new Comparator<>() { + + @Override + public int compare(EntityEggInfo o1, EntityEggInfo o2) { + if (o1 == null) { + if (o2 == null) { + return 0; + } + return -1; + } + if (o2 == null) { + return 1; + } + String name1 = "entity." + getName(o1) + ".name"; + String name2 = "entity." + getName(o2) + ".name"; + return StatCollector.translateToLocal(name1) + .compareToIgnoreCase(StatCollector.translateToLocal(name2)); + } + + private static String getName(EntityEggInfo eei) { + if (eei instanceof EntityInfo info) { + return info.name; + } else { + return EntityList.getStringFromID(eei.spawnedID); + } + } + }); + } + } + + @ModifyExpressionValue( + at = @At( + target = "Lnet/minecraft/entity/EntityList;getStringFromID(I)Ljava/lang/String;", + value = "INVOKE"), + method = "drawSlot") + private static String hodgepodge$getEntityName(String original, @Local EntityEggInfo entityegginfo) { + if (entityegginfo instanceof EntityInfo info) { + return info.name; + } + return original; + } +} diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/hooks/IC2ResourcePack.java b/src/main/java/com/mitchej123/hodgepodge/mixins/hooks/IC2ResourcePack.java index 2bfd3574..b796c974 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/hooks/IC2ResourcePack.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/hooks/IC2ResourcePack.java @@ -47,9 +47,8 @@ public boolean resourceExists(ResourceLocation rl) { return zipFile.getEntry(locationToName(rl)) != null || fallbackResourcePack.resourceExists(rl); } - @SuppressWarnings("rawtypes") @Override - public Set getResourceDomains() { + public Set getResourceDomains() { return ImmutableSet.of("ic2", "minecraft"); } diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/late/morpheus/MixinMorpheusWakePlayers.java b/src/main/java/com/mitchej123/hodgepodge/mixins/late/morpheus/MixinMorpheusWakePlayers.java index 0b556baf..f469b1f0 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/late/morpheus/MixinMorpheusWakePlayers.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/late/morpheus/MixinMorpheusWakePlayers.java @@ -17,8 +17,7 @@ public class MixinMorpheusWakePlayers { at = @At( value = "INVOKE", target = "Lnet/minecraft/world/WorldProvider;resetRainAndThunder()V", - shift = At.Shift.BEFORE, - remap = true)) + shift = At.Shift.BEFORE)) private void hodgepodge$fixWakePlayers(World world, CallbackInfo c) { if (!(world instanceof WorldServer worldServer)) return; worldServer.wakeAllPlayers(); diff --git a/src/main/java/com/mitchej123/hodgepodge/mixins/late/projecte/MixinObjHandler.java b/src/main/java/com/mitchej123/hodgepodge/mixins/late/projecte/MixinObjHandler.java index e05245c9..636be881 100644 --- a/src/main/java/com/mitchej123/hodgepodge/mixins/late/projecte/MixinObjHandler.java +++ b/src/main/java/com/mitchej123/hodgepodge/mixins/late/projecte/MixinObjHandler.java @@ -15,7 +15,6 @@ @Mixin(ObjHandler.class) public class MixinObjHandler { - @SuppressWarnings("unchecked") @Redirect( method = "registerPhiloStoneSmelting", at = @At( diff --git a/src/main/java/com/mitchej123/hodgepodge/util/ChatComponentItemTranslation.java b/src/main/java/com/mitchej123/hodgepodge/util/ChatComponentItemTranslation.java new file mode 100644 index 00000000..6bde08ed --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/util/ChatComponentItemTranslation.java @@ -0,0 +1,60 @@ +package com.mitchej123.hodgepodge.util; + +import java.util.Locale; +import java.util.regex.Pattern; + +import net.minecraft.item.Item; +import net.minecraft.util.ChatComponentStyle; +import net.minecraft.util.IChatComponent; +import net.minecraft.util.StatCollector; + +public class ChatComponentItemTranslation extends ChatComponentStyle { + + private static final Pattern FORMATTING_CODE_PATTERN = Pattern.compile("(?i)\u00a7[0-9A-FK-OR]"); + + private final Item item; + + public ChatComponentItemTranslation(Item item) { + this.item = item; + } + + @Override + public String getUnformattedTextForChat() { + String unlocalizedName = this.item.getUnlocalizedName() + ".name"; + String localizedName = StatCollector.translateToLocal(unlocalizedName); + StringBuilder sb = new StringBuilder(getTextWithoutFormattingCodes(localizedName)); + for (IChatComponent sibling : this.getSiblings()) { + sb.append(sibling.getUnformattedTextForChat()); + } + return sb.toString(); + } + + @Override + public IChatComponent createCopy() { + ChatComponentItemTranslation component = new ChatComponentItemTranslation(this.item); + for (IChatComponent sibling : this.getSiblings()) { + component.appendSibling(sibling.createCopy()); + } + return component; + } + + @Override + public int hashCode() { + return 31 * super.hashCode() + this.item.hashCode(); + } + + @Override + public String toString() { + return String.format( + Locale.ROOT, + "TranslatableItemComponent{item=%s, siblings=%s, style=%s}", + this.item.delegate.name(), + this.getSiblings(), + this.getChatStyle()); + } + + private static String getTextWithoutFormattingCodes(String text) { + return text == null ? null : FORMATTING_CODE_PATTERN.matcher(text).replaceAll(""); + } + +} diff --git a/src/main/java/com/mitchej123/hodgepodge/util/StatHandler.java b/src/main/java/com/mitchej123/hodgepodge/util/StatHandler.java new file mode 100644 index 00000000..c39b589b --- /dev/null +++ b/src/main/java/com/mitchej123/hodgepodge/util/StatHandler.java @@ -0,0 +1,194 @@ +package com.mitchej123.hodgepodge.util; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import net.minecraft.entity.Entity; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityList.EntityEggInfo; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.Item; +import net.minecraft.stats.StatBase; +import net.minecraft.stats.StatCrafting; +import net.minecraft.stats.StatList; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.entity.living.LivingDeathEvent; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Sets; +import com.mitchej123.hodgepodge.Common; +import com.mitchej123.hodgepodge.config.TweaksConfig; + +import cpw.mods.fml.common.Loader; +import cpw.mods.fml.common.event.FMLModIdMappingEvent.ModRemapping; +import cpw.mods.fml.common.event.FMLModIdMappingEvent.RemapTarget; +import cpw.mods.fml.common.eventhandler.EventPriority; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; + +public class StatHandler { + + public static final Map, EntityEggInfo> ADDITIONAL_ENTITY_EGGS = new HashMap<>(); + public static String currentEntityName; + + // stat arrays mapped to the frozen ids + private static final StatBase[] STATS_MINE = new StatBase[StatList.mineBlockStatArray.length]; + private static final StatBase[] STATS_CRAFT = new StatBase[StatList.objectCraftStats.length]; + private static final StatBase[] STATS_USE = new StatBase[StatList.objectUseStats.length]; + private static final StatBase[] STATS_BREAK = new StatBase[StatList.objectBreakStats.length]; + private static boolean initFrozenStats = true; + + public static void remap(ImmutableList remappedIds) { + if (initFrozenStats) { + // init stat arrays mapped to the frozen ids + arraycopy(StatList.mineBlockStatArray, STATS_MINE); + arraycopy(StatList.objectCraftStats, STATS_CRAFT); + arraycopy(StatList.objectUseStats, STATS_USE); + arraycopy(StatList.objectBreakStats, STATS_BREAK); + initFrozenStats = false; + } + + if (remappedIds.isEmpty()) { + // we are reverting to frozen ids + arraycopy(STATS_MINE, StatList.mineBlockStatArray); + arraycopy(STATS_CRAFT, StatList.objectCraftStats); + arraycopy(STATS_USE, StatList.objectUseStats); + arraycopy(STATS_BREAK, StatList.objectBreakStats); + return; + } + + final StatBase[] statsMine = StatList.mineBlockStatArray.clone(); + final StatBase[] statsCraft = StatList.objectCraftStats.clone(); + final StatBase[] statsUse = StatList.objectUseStats.clone(); + final StatBase[] statsBreak = StatList.objectBreakStats.clone(); + + // remap the stats with changed id + for (ModRemapping remapping : remappedIds) { + if (remapping.remapTarget == RemapTarget.BLOCK) { + continue; + } + final int newId = remapping.newId; + final int oldId = remapping.oldId; + + if (newId < 4096 && oldId < 4096) { + statsMine[newId] = StatList.mineBlockStatArray[oldId]; + } else if (newId < 4096 ^ oldId < 4096) { + // 0 - 4095 -> blocks + // 4096+ -> items + // switching domains is unexpected + Common.log.warn("Unexpected remap: oldID={}, newId={}, tag={}", oldId, newId, remapping.tag); + } + statsCraft[newId] = StatList.objectCraftStats[oldId]; + statsUse[newId] = StatList.objectUseStats[oldId]; + statsBreak[newId] = StatList.objectBreakStats[oldId]; + } + arraycopy(statsMine, StatList.mineBlockStatArray); + arraycopy(statsCraft, StatList.objectCraftStats); + arraycopy(statsUse, StatList.objectUseStats); + arraycopy(statsBreak, StatList.objectBreakStats); + } + + @SuppressWarnings("unchecked") + public static void addEntityStats() { + if (!ADDITIONAL_ENTITY_EGGS.isEmpty()) { + // only populate map once - we don't want duplicate stats + return; + } + + Set excludedEntities = Sets.newHashSet(TweaksConfig.entityStatsExclusions); + if (Loader.isModLoaded("NotEnoughItems")) { + excludedEntities.add("SnowMan"); + excludedEntities.add("VillagerGolem"); + } + + for (Entry, String> e : EntityList.classToStringMapping.entrySet()) { + Class clazz = e.getKey(); + if (!EntityLivingBase.class.isAssignableFrom(clazz)) { + // only entities extending EntityLivingBase can be killed/can kill the player + continue; + } + + currentEntityName = e.getValue(); + if (excludedEntities.contains(currentEntityName)) { + continue; + } + + // func_151177_a = getOneShotStat + if (StatList.func_151177_a("stat.killEntity." + currentEntityName) != null + || StatList.func_151177_a("stat.entityKilledBy." + currentEntityName) != null) { + continue; + } + + ADDITIONAL_ENTITY_EGGS.put( + clazz, + new EntityInfo((int) EntityList.classToIDMapping.getOrDefault(clazz, 256), currentEntityName)); + } + + currentEntityName = null; + MinecraftForge.EVENT_BUS.register(new StatHandler()); + } + + @SubscribeEvent(priority = EventPriority.LOWEST) + public void onLivingDeathEvent(LivingDeathEvent event) { + if (event.entityLiving instanceof EntityPlayerMP player) { + // the player was killed + EntityLivingBase attackingEntity = player.func_94060_bK(); + if (attackingEntity == null) { + return; + } + EntityEggInfo info = ADDITIONAL_ENTITY_EGGS.get(attackingEntity.getClass()); + if (info == null) { + return; + } + player.addStat(info.field_151513_e, 1); // "killed by entity" stat + return; + } + if (event.source.getEntity() instanceof EntityPlayer player) { + // the player made a kill + EntityEggInfo info = ADDITIONAL_ENTITY_EGGS.get(event.entityLiving.getClass()); + if (info == null) { + return; + } + player.addStat(info.field_151512_d, 1); // "kill entity" stat + + } + } + + public static StatBase checkBounds(StatBase[] array, int index, StatCrafting statcrafting) { + if (index < 0 || index >= array.length) { + Item item = statcrafting.func_150959_a(); + String name = item == null ? "null" : item.delegate.name(); + if (index == -1) { + Common.log.warn( + "Caught out-of-bounds item ID {} for stat {} of item {}", + index, + statcrafting.statId, + name); + Common.log + .info("You can ignore this warning if {} is not installed on the server!", name.split(":")[0]); + return null; + } + Common.log + .error("Caught out-of-bounds item ID {} for stat {} of item {}", index, statcrafting.statId, name); + return null; + } + return array[index]; + } + + private static void arraycopy(T[] src, T[] dest) { + System.arraycopy(src, 0, dest, 0, src.length); + } + + public static class EntityInfo extends EntityEggInfo { + + public final String name; + + public EntityInfo(int id, String name) { + super(id, 0, 0); + this.name = name; + } + } +} diff --git a/src/main/resources/META-INF/hodgepodge_at.cfg b/src/main/resources/META-INF/hodgepodge_at.cfg index f4b6dd17..f1bc32a1 100644 --- a/src/main/resources/META-INF/hodgepodge_at.cfg +++ b/src/main/resources/META-INF/hodgepodge_at.cfg @@ -19,4 +19,5 @@ public net.minecraft.client.resources.AbstractResourcePack field_110597_b # reso public net.minecraft.client.resources.FallbackResourceManager field_110540_a # resourcePacks public net.minecraft.client.resources.FileResourcePack field_110600_d # resourcePackZipFile public net.minecraft.client.resources.SimpleReloadableResourceManager field_110548_a # domainResourceManagers +public net.minecraft.entity.EntityList field_75624_e # classToIDMapping public net.minecraft.world.WorldServer func_73053_d()V # wakeAllPlayers() diff --git a/src/main/resources/assets/hodgepodge/lang/en_US.lang b/src/main/resources/assets/hodgepodge/lang/en_US.lang index 29ece70d..d7c271f6 100644 --- a/src/main/resources/assets/hodgepodge/lang/en_US.lang +++ b/src/main/resources/assets/hodgepodge/lang/en_US.lang @@ -1,4 +1,22 @@ key.hodgepodge.category=Hodgepodge key.fastBlockPlacing.desc=Fast Block Placing key.fastBlockPlacing.enabled=§fFast Block Placing §aEnabled -key.fastBlockPlacing.disabled=§fFast Block Placing §cDisabled \ No newline at end of file +key.fastBlockPlacing.disabled=§fFast Block Placing §cDisabled + +tile.dirt.name=Dirt +tile.sapling.name=Sapling +tile.sand.name=Sand +tile.flower1.name=Flower +tile.flower2.name=Flower +tile.stoneSlab.name=Slab +tile.monsterStoneEgg.name=Stone Monster Egg +tile.woodSlab.name=Slab +tile.cobbleWall.name=Wall +tile.quartzBlock.name=Quartz Block +tile.clayHardenedStained.name=Stained Clay +tile.woolCarpet.name=Carpet +tile.doublePlant.name=Large Plant + +item.dyePowder.name=Dye +item.skull.name=Skull +item.fish.name=Fish