From d3226a9296f60e46d7633f75d34dc54604decfe9 Mon Sep 17 00:00:00 2001 From: youyihj Date: Wed, 20 Mar 2024 13:54:06 +0800 Subject: [PATCH 1/3] chore: migrate to configanytime --- build.gradle | 3 ++- .../ink/ikx/rt/api/mods/tconstruct/IBook.java | 9 +++++++++ .../vanilla/AttributeModificationListeners.java | 11 +++++++++++ .../RandomTweakerClassTransformer.java | 9 ++++++--- .../AttunementAltarMethodReflections.java | 10 ++-------- ...AbstractMaterialSectionTransformerHooks.java | 17 ++++++++--------- .../ikx/rt/impl/internal/config/RTConfig.java | 10 ++++++++++ 7 files changed, 48 insertions(+), 21 deletions(-) diff --git a/build.gradle b/build.gradle index 9f22f32e..6b2d29d4 100644 --- a/build.gradle +++ b/build.gradle @@ -124,9 +124,10 @@ dependencies { if (project.use_mixins.toBoolean()) { implementation 'zone.rong:mixinbooter:7.1' } + implementation 'com.cleanroommc:configanytime:2.0' implementation files('libs/CraftTweaker2-MC1120-Mod-JEI-1.12-4.1.20.670-deobf.jar') - implementation(files('libs/ProbeZS-1.18.1.jar')) + // implementation(files('libs/ProbeZS-1.18.1.jar')) implementation rfg.deobf("curse.maven:Baubles-227083:2518667") implementation rfg.deobf("curse.maven:zenutil-401178:4796427-sources-4796428") diff --git a/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java b/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java index cd0b83f1..bf0483ee 100644 --- a/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java +++ b/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java @@ -1,11 +1,13 @@ package ink.ikx.rt.api.mods.tconstruct; +import com.google.common.base.Preconditions; import crafttweaker.CraftTweakerAPI; import crafttweaker.IAction; import crafttweaker.annotations.ModOnly; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; import ink.ikx.rt.Main; +import ink.ikx.rt.impl.internal.config.RTConfig; import ink.ikx.rt.impl.mods.crafttweaker.RTRegister; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; @@ -23,19 +25,26 @@ public abstract class IBook { @ZenMethod public static void addHiddenMaterial(String material) { + checkConfig(); CraftTweakerAPI.apply(new AddHiddenMaterialAction(material)); } @ZenMethod public static void changeMaterialItem(String material, IItemStack item) { + checkConfig(); CraftTweakerAPI.apply(new ChangeMaterialItem(material, item)); } @ZenMethod public static void setMaterialPriority(String material, int priority) { + checkConfig(); CraftTweakerAPI.apply(new SetMaterialPriority(material, priority)); } + private static void checkConfig() { + Preconditions.checkArgument(RTConfig.Tconstruct.iconModification, "Please change Tconstruct iconModification config to true."); + } + public static class AddHiddenMaterialAction implements IAction { private final String material; diff --git a/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java b/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java index f3d45ea3..3475093d 100644 --- a/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java +++ b/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java @@ -6,6 +6,7 @@ import crafttweaker.api.entity.attribute.IEntityAttributeModifier; import crafttweaker.api.item.IIngredient; import crafttweaker.util.IEventHandler; +import ink.ikx.rt.impl.internal.config.RTConfig; import ink.ikx.rt.impl.mods.crafttweaker.RTRegister; import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenExpansion; @@ -63,5 +64,15 @@ public void apply() { public String describe() { return ""; } + + @Override + public boolean validate() { + return RTConfig.RandomTweaker.itemAttributeModification; + } + + @Override + public String describeInvalid() { + return "Please change itemAttributeModification config to true"; + } } } diff --git a/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java b/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java index dfd5392d..2d907e88 100644 --- a/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java +++ b/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java @@ -3,6 +3,7 @@ import ink.ikx.rt.classTransforms.mods.astralsorcery.ASMTileAttunementAltar; import ink.ikx.rt.classTransforms.mods.tconstruct.ASMAbstractMaterialSectionTransformer; import ink.ikx.rt.classTransforms.vanilla.ASMItemStack; +import ink.ikx.rt.impl.internal.config.RTConfig; import net.minecraft.launchwrapper.IClassTransformer; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; @@ -51,19 +52,21 @@ protected static byte[] tryGetAsmResult( @Override public byte[] transform(String name, String transformedName, byte[] basicClass) { - if (transformedName.equals("hellfirepvp.astralsorcery.common.tile.TileAttunementAltar")) { + if (transformedName.startsWith("ink.ikx.rt")) + return basicClass; + if (RTConfig.Astralsorcery.attunementModification && "hellfirepvp.astralsorcery.common.tile.TileAttunementAltar".equals(transformedName)) { LOGGER.info("transforming class {} ({})", transformedName, name); ClassWriter classWriter = createClassWriter(false); ASMTileAttunementAltar asm = new ASMTileAttunementAltar(ASM5, classWriter); return tryGetAsmResult("astral sorcery", transformedName, basicClass, asm, classWriter); } - if (transformedName.equals("slimeknights.tconstruct.library.book.sectiontransformer.AbstractMaterialSectionTransformer")) { + if (RTConfig.Tconstruct.iconModification && "slimeknights.tconstruct.library.book.sectiontransformer.AbstractMaterialSectionTransformer".equals(transformedName)) { LOGGER.info("transforming class {} ({})", transformedName, name); ClassWriter classWriter = createClassWriter(false); ASMAbstractMaterialSectionTransformer asm = new ASMAbstractMaterialSectionTransformer(ASM5, classWriter); return tryGetAsmResult("tinkers construct", transformedName, basicClass, asm, classWriter); } - if (transformedName.equals("net.minecraft.item.ItemStack")) { + if (RTConfig.RandomTweaker.itemAttributeModification && "net.minecraft.item.ItemStack".equals(transformedName)) { LOGGER.info("transforming class {} ({})", transformedName, name); ClassWriter classWriter = createDefaultClassWriter(false); ASMItemStack asm = new ASMItemStack(ASM5, classWriter, name); diff --git a/src/main/java/ink/ikx/rt/classTransforms/mods/astralsorcery/AttunementAltarMethodReflections.java b/src/main/java/ink/ikx/rt/classTransforms/mods/astralsorcery/AttunementAltarMethodReflections.java index 0999f632..14ae1927 100644 --- a/src/main/java/ink/ikx/rt/classTransforms/mods/astralsorcery/AttunementAltarMethodReflections.java +++ b/src/main/java/ink/ikx/rt/classTransforms/mods/astralsorcery/AttunementAltarMethodReflections.java @@ -22,7 +22,7 @@ public class AttunementAltarMethodReflections { public static void onAttunementStart(Entity entity, IConstellation constellation) { - if (!RTConfig.Astralsorcery.attunementModification || entity == null) { + if (entity == null) { return; } AttunementStartEvent event = new AttunementStartEvent(entity, entity.getEntityWorld(), constellation); @@ -30,9 +30,6 @@ public static void onAttunementStart(Entity entity, IConstellation constellation } public static void onCraftingFinish(ItemStack itemStack, EntityItem original, IConstellation constellation) { - if (!RTConfig.Astralsorcery.attunementModification) { - return; - } World world = original.getEntityWorld(); for (CustomAttunementRecipe recipe : CustomAttunementRecipe.allRecipes) { if (recipe.canDoRecipe(constellation, original.getItem())) { @@ -89,9 +86,6 @@ private static void resetMotion(EntityItem item) { } public static boolean haveRecipe(IConstellation constellation, ItemStack itemStack) { - if (!RTConfig.Astralsorcery.attunementModification) { - return false; - } for (CustomAttunementRecipe recipe : CustomAttunementRecipe.allRecipes) { if (recipe.canDoRecipe(constellation, itemStack)) { return true; @@ -130,7 +124,7 @@ public static void applyCrystalProperties(ItemStack itemStack, CrystalProperties } public static boolean logicPatch(boolean A, boolean B, boolean C) { - return RTConfig.Astralsorcery.attunementModification && ((A && B) || C); + return ((A && B) || C); } public static Item getTunedItemVariant(Item item, EntityItem itemStack, IConstellation constellation) { diff --git a/src/main/java/ink/ikx/rt/classTransforms/mods/tconstruct/AbstractMaterialSectionTransformerHooks.java b/src/main/java/ink/ikx/rt/classTransforms/mods/tconstruct/AbstractMaterialSectionTransformerHooks.java index 5978b4cd..d231299f 100644 --- a/src/main/java/ink/ikx/rt/classTransforms/mods/tconstruct/AbstractMaterialSectionTransformerHooks.java +++ b/src/main/java/ink/ikx/rt/classTransforms/mods/tconstruct/AbstractMaterialSectionTransformerHooks.java @@ -16,26 +16,25 @@ public class AbstractMaterialSectionTransformerHooks { public static boolean isMaterialInHiddenItems(Material material) { - return RTConfig.Tconstruct.iconModification && Main.HIDDEN_MATERIAL_LIST.contains(material.getIdentifier()); + return Main.HIDDEN_MATERIAL_LIST.contains(material.getIdentifier()); } public static boolean isMaterialInShowItemMap(Material material) { - return RTConfig.Tconstruct.iconModification && Main.MATERIAL_SHOW_ITEM_MAP.containsKey(material.getIdentifier()); + return Main.MATERIAL_SHOW_ITEM_MAP.containsKey(material.getIdentifier()); } public static ElementItem createElementItem(Material material) { ItemStack stack = Main.MATERIAL_SHOW_ITEM_MAP.get(material.getIdentifier()); - LogManager.getLogger().info("Create ElementItem for " + material.getIdentifier() + "->" + CraftTweakerMC.getIItemStack(stack).toString()); + LogManager.getLogger() + .info("Create ElementItem for " + material.getIdentifier() + "->" + CraftTweakerMC.getIItemStack(stack).toString()); return new ElementItem(0, 0, 1.0F, stack); } public static List sortMaterialList(List materialList) { - if (RTConfig.Tconstruct.iconModification) { - return materialList.stream() - .sorted(Comparator.comparing(m -> Main.MATERIAL_PRIORITY_MAP.getOrDefault(m.getIdentifier(), 0))) - .collect(Collectors.toList()); - } - return materialList; + return materialList.stream() + .sorted(Comparator.comparing(m -> Main.MATERIAL_PRIORITY_MAP.getOrDefault(m.getIdentifier(), 0))) + .collect(Collectors.toList()); + } } diff --git a/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java b/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java index f752949b..8a75cff2 100644 --- a/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java +++ b/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java @@ -1,5 +1,6 @@ package ink.ikx.rt.impl.internal.config; +import com.cleanroommc.configanytime.ConfigAnytime; import ink.ikx.rt.Main; import net.minecraftforge.common.config.Config; import net.minecraftforge.common.config.Config.Comment; @@ -37,6 +38,10 @@ public static class RandomTweaker { @Comment("If true, Allow CrT to manipulate the file \"rt.properties\". [default: false]") public boolean Prop = false; + @RequiresMcRestart + @Comment({"If true, Allow CrT to modify item attribute modifiers. [default: false]"}) + public boolean itemAttributeModification = false; + } public static class Thaumcraft { @@ -90,4 +95,9 @@ public static class FTBUltimine { } + + static { + ConfigAnytime.register(RTConfig.class); + } + } From 0f121ceb5a824254ad316cc07b086185a7db6d11 Mon Sep 17 00:00:00 2001 From: youyihj Date: Wed, 20 Mar 2024 13:58:15 +0800 Subject: [PATCH 2/3] fix: wrong config default value desc --- src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java b/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java index 8a75cff2..95d12d52 100644 --- a/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java +++ b/src/main/java/ink/ikx/rt/impl/internal/config/RTConfig.java @@ -70,11 +70,11 @@ public static class Botania { public boolean OrechidModified = false; @RequiresMcRestart - @Comment("How much the interval of each work of Orechid.[Valid only for modified results | default: 700]") + @Comment("How much the interval of each work of Orechid.[Valid only for modified results | default: 20]") public int OrechidDelay = 20; @RequiresMcRestart - @Comment("How much mana is consumed per work of Orechid.[Valid only for modified results | default: 20]") + @Comment("How much mana is consumed per work of Orechid.[Valid only for modified results | default: 700]") public int OrechidCost = 700; @RequiresMcRestart From ad3ef0835ab03d48e6f58b8b9c4ae7f254e407fa Mon Sep 17 00:00:00 2001 From: superhelo Date: Sun, 24 Mar 2024 01:31:42 +0800 Subject: [PATCH 3/3] fix(tconstruct, asm): Add import statement --- .../ink/ikx/rt/api/mods/botania/ICocoon.java | 85 ++++++++-------- .../event/CTAlfPortalDroppedEvent.java | 7 +- .../mods/botania/render/IBotaniaFXHelper.java | 23 +---- .../ink/ikx/rt/api/mods/tconstruct/IBook.java | 3 +- .../AttributeModificationListeners.java | 3 + .../RandomTweakerClassTransformer.java | 3 +- .../mods/botania/cocoon/IMixinTileCocoon.java | 6 +- .../rt/impl/mods/botania/cocoon/MCCocoon.java | 98 +++++-------------- .../rt/mixins/botania/MixinBlockCocoon.java | 21 ++-- .../rt/mixins/botania/MixinTileCocoon.java | 84 ++++++++-------- 10 files changed, 125 insertions(+), 208 deletions(-) diff --git a/src/main/java/ink/ikx/rt/api/mods/botania/ICocoon.java b/src/main/java/ink/ikx/rt/api/mods/botania/ICocoon.java index 8db2bfd6..eed0b2d0 100644 --- a/src/main/java/ink/ikx/rt/api/mods/botania/ICocoon.java +++ b/src/main/java/ink/ikx/rt/api/mods/botania/ICocoon.java @@ -2,7 +2,6 @@ import com.google.common.collect.Maps; import crafttweaker.CraftTweakerAPI; -import youyihj.zenutils.api.zenscript.SidedZenRegister; import crafttweaker.api.entity.IEntityDefinition; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; @@ -10,11 +9,6 @@ import ink.ikx.rt.api.mods.botania.function.DynamicSpawnTable; import ink.ikx.rt.api.mods.botania.function.ICocoonTileEntity; import ink.ikx.rt.impl.mods.botania.cocoon.MCCocoon; - -import java.util.Map; -import java.util.Objects; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.registry.EntityEntry; @@ -22,78 +16,79 @@ import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenMethod; +import youyihj.zenutils.api.zenscript.SidedZenRegister; +import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; @SidedZenRegister(modDeps = "botania") @ZenClass("mods.randomtweaker.botania.ICocoon") -public abstract class ICocoon { +public interface ICocoon { - @Nullable @ZenMethod - public static ICocoon registerSpawn(@Nonnull String name, IItemStack stack, Map spawnTab, @Optional DynamicSpawnTable dynamicSpawnTab) { - ICocoon cocoon; - if (!Main.CUSTOM_COCOONS_SPAWN.containsKey(name)) { - Map tab = Maps.newHashMap(); - spawnTab.forEach((entity, probably) -> { - if (Objects.nonNull(entity)) { - if (entity.getInternal() instanceof EntityEntry) { - tab.put((EntityEntry) entity.getInternal(), probably); - } else { - CraftTweakerAPI.logError("The internal type of " + entity.getId() + " is not EntityEntry!"); - } - } - }); - - cocoon = MCCocoon.create(name, CraftTweakerMC.getItemStack(stack), tab, dynamicSpawnTab); + static ICocoon registerSpawn(@Nonnull String name, IItemStack stack, Map spawnTab, @Optional DynamicSpawnTable dynamicSpawnTab) { + Map tab = convertToEntityEntry(spawnTab); + ICocoon cocoon = MCCocoon.create(name, CraftTweakerMC.getItemStack(stack), tab, dynamicSpawnTab); - if (Objects.isNull(cocoon)) { - CraftTweakerAPI.logError("Registering " + name + " failed"); - return null; - } - } else { - cocoon = getInstanceByName(name); - - if (Objects.nonNull(dynamicSpawnTab)) { - cocoon.setDynamicSpawnTable(dynamicSpawnTab); - } + if (cocoon == null) { + CraftTweakerAPI.logError("Registering " + name + " failed"); + return null; } - Main.CUSTOM_COCOONS_SPAWN.put(name, cocoon); return cocoon; } @Nullable @ZenMethod - public static ICocoon getInstanceByStack(IItemStack stack) { + static ICocoon getSpawnWhenEmpty() { + return Main.CUSTOM_COCOONS_SPAWN.get("default"); + } + + @Nullable + @ZenMethod + static ICocoon getInstanceByStack(IItemStack stack) { return getInstanceByStack(CraftTweakerMC.getItemStack(stack)); } @ZenMethod - public static ICocoon getInstanceByName(String name) { + static ICocoon getInstanceByName(String name) { return Main.CUSTOM_COCOONS_SPAWN.get(name); } @Nullable - public static ICocoon getInstanceByStack(ItemStack stack) { + static ICocoon getInstanceByStack(ItemStack stack) { return Main.CUSTOM_COCOONS_SPAWN.values().stream().filter(cocoon -> cocoon.match(stack)).findFirst().orElse(null); } - public abstract ItemStack getStack(); + static Map convertToEntityEntry(Map originalMap) { + Map tab = Maps.newHashMap(); + originalMap.forEach((entity, probably) -> { + if (entity != null) { + if (entity.getInternal() instanceof EntityEntry) { + tab.put((EntityEntry) entity.getInternal(), probably); + } else { + CraftTweakerAPI.logError("The internal type of " + entity.getId() + " is not EntityEntry!"); + } + } + }); + return tab; + } - public abstract boolean match(ItemStack stack); + ItemStack getStack(); - public abstract DynamicSpawnTable getDynamicSpawnTable(); + boolean match(ItemStack stack); - public abstract Map getSpawnTab(); + DynamicSpawnTable getDynamicSpawnTable(); - public abstract void setDynamicSpawnTable(DynamicSpawnTable dynamicSpawn); + Map getSpawnTab(); - public abstract double getProbablyByEntity(EntityEntry entity); + double getProbabilityByEntity(EntityEntry entity); - public abstract String getDynamicResult(ItemStack stack, EntityPlayer player, ICocoonTileEntity tile); + String getDynamicResult(ItemStack stack, EntityPlayer player, ICocoonTileEntity tile); @ZenMethod @ZenGetter("name") - public abstract String getName(); + String getName(); } diff --git a/src/main/java/ink/ikx/rt/api/mods/botania/event/CTAlfPortalDroppedEvent.java b/src/main/java/ink/ikx/rt/api/mods/botania/event/CTAlfPortalDroppedEvent.java index 3aed3da6..828ae476 100644 --- a/src/main/java/ink/ikx/rt/api/mods/botania/event/CTAlfPortalDroppedEvent.java +++ b/src/main/java/ink/ikx/rt/api/mods/botania/event/CTAlfPortalDroppedEvent.java @@ -1,6 +1,5 @@ package ink.ikx.rt.api.mods.botania.event; -import youyihj.zenutils.api.zenscript.SidedZenRegister; import crafttweaker.api.entity.IEntityItem; import crafttweaker.api.event.IEventCancelable; import crafttweaker.api.item.IItemStack; @@ -8,14 +7,13 @@ import ink.ikx.rt.api.mods.botania.ITileAlfPortal; import ink.ikx.rt.impl.internal.utils.InternalUtils; import ink.ikx.rt.impl.mods.botania.event.AlfPortalDroppedEvent; - import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenGetter; import stanhebben.zenscript.annotations.ZenMethod; import stanhebben.zenscript.annotations.ZenSetter; +import youyihj.zenutils.api.zenscript.SidedZenRegister; import java.util.Arrays; -import java.util.Objects; import java.util.stream.Collectors; @@ -51,9 +49,6 @@ public void addOutput(IItemStack output) { @ZenMethod public void setOutput(IItemStack[] output) { - if (Objects.isNull(output)) { - return; - } event.setOutput(Arrays.stream(CraftTweakerMC.getItemStacks(output)).collect(Collectors.toList())); } diff --git a/src/main/java/ink/ikx/rt/api/mods/botania/render/IBotaniaFXHelper.java b/src/main/java/ink/ikx/rt/api/mods/botania/render/IBotaniaFXHelper.java index bf2b3786..9af1c2f6 100644 --- a/src/main/java/ink/ikx/rt/api/mods/botania/render/IBotaniaFXHelper.java +++ b/src/main/java/ink/ikx/rt/api/mods/botania/render/IBotaniaFXHelper.java @@ -1,36 +1,15 @@ package ink.ikx.rt.api.mods.botania.render; -import youyihj.zenutils.api.zenscript.SidedZenRegister; - import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; import vazkii.botania.common.Botania; +import youyihj.zenutils.api.zenscript.SidedZenRegister; @SidedZenRegister(modDeps = "botania") @ZenClass("mods.randomtweaker.botania.IBotaniaFXHelper") public abstract class IBotaniaFXHelper { - @ZenMethod - public static void setWispFXDistanceLimit(boolean limit) { - Botania.proxy.setWispFXDistanceLimit(limit); - } - - @ZenMethod - public static void setWispFXDepthTest(boolean depth) { - Botania.proxy.setWispFXDepthTest(depth); - } - - @ZenMethod - public static void setSparkleFXNoClip(boolean noclip) { - Botania.proxy.setSparkleFXNoClip(noclip); - } - - @ZenMethod - public static void setSparkleFXCorrupt(boolean corrupt) { - Botania.proxy.setSparkleFXCorrupt(corrupt); - } - @ZenMethod public static void sparkleFX(double x, double y, double z, float r, float g, float b, float size, int m) { sparkleFX(x, y, z, r, g, b, size, m, false); diff --git a/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java b/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java index 6a007844..5b556346 100644 --- a/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java +++ b/src/main/java/ink/ikx/rt/api/mods/tconstruct/IBook.java @@ -3,12 +3,13 @@ import com.google.common.base.Preconditions; import crafttweaker.CraftTweakerAPI; import crafttweaker.IAction; -import youyihj.zenutils.api.zenscript.SidedZenRegister; import crafttweaker.api.item.IItemStack; import crafttweaker.api.minecraft.CraftTweakerMC; import ink.ikx.rt.Main; +import ink.ikx.rt.impl.internal.config.RTConfig; import stanhebben.zenscript.annotations.ZenClass; import stanhebben.zenscript.annotations.ZenMethod; +import youyihj.zenutils.api.zenscript.SidedZenRegister; /** * Created by IntelliJ IDEA. diff --git a/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java b/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java index 82a01804..e1889c22 100644 --- a/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java +++ b/src/main/java/ink/ikx/rt/api/vanilla/AttributeModificationListeners.java @@ -6,6 +6,7 @@ import crafttweaker.api.entity.attribute.IEntityAttributeModifier; import crafttweaker.api.item.IIngredient; import crafttweaker.util.IEventHandler; +import ink.ikx.rt.impl.internal.config.RTConfig; import stanhebben.zenscript.annotations.Optional; import stanhebben.zenscript.annotations.ZenExpansion; import stanhebben.zenscript.annotations.ZenMethod; @@ -72,5 +73,7 @@ public boolean validate() { public String describeInvalid() { return "Please change itemAttributeModification config to true"; } + } + } diff --git a/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java b/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java index 2d907e88..45e49faf 100644 --- a/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java +++ b/src/main/java/ink/ikx/rt/classTransforms/RandomTweakerClassTransformer.java @@ -5,6 +5,7 @@ import ink.ikx.rt.classTransforms.vanilla.ASMItemStack; import ink.ikx.rt.impl.internal.config.RTConfig; import net.minecraft.launchwrapper.IClassTransformer; +import net.minecraftforge.fml.relauncher.FMLLaunchHandler; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,7 +19,7 @@ public class RandomTweakerClassTransformer implements IClassTransformer { private static final Logger LOGGER = LogManager.getLogger(); - private static final boolean debug = true; + private static final boolean debug = FMLLaunchHandler.isDeobfuscatedEnvironment(); protected static ClassWriter createClassWriter(@SuppressWarnings("SameParameterValue") boolean debug) { return new RandomTweakerClassWriter(debug ? 0 : ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); diff --git a/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/IMixinTileCocoon.java b/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/IMixinTileCocoon.java index 6005def3..1d9f270f 100644 --- a/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/IMixinTileCocoon.java +++ b/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/IMixinTileCocoon.java @@ -7,10 +7,10 @@ public interface IMixinTileCocoon { - int getMapSize(); + int randomTweaker$getMapSize(); - int getAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player); + int randomTweaker$getAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player); - void setAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player, int amount); + void randomTweaker$setAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player, int amount); } diff --git a/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/MCCocoon.java b/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/MCCocoon.java index d5faa893..13fe4e6c 100644 --- a/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/MCCocoon.java +++ b/src/main/java/ink/ikx/rt/impl/mods/botania/cocoon/MCCocoon.java @@ -7,76 +7,55 @@ import ink.ikx.rt.api.mods.botania.function.DynamicSpawnTable; import ink.ikx.rt.api.mods.botania.function.ICocoonTileEntity; import ink.ikx.rt.impl.internal.utils.InternalUtils; -import java.util.Map; -import java.util.Objects; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraftforge.fml.common.registry.EntityEntry; -public class MCCocoon extends ICocoon { +import java.util.Map; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public class MCCocoon implements ICocoon { private final String name; private final ItemStack giveStack; private final Map spawnTab; - private DynamicSpawnTable dynamicSpawn = null; + private final DynamicSpawnTable dynamicSpawn; - private MCCocoon(String name, ItemStack giveStack, Map spawnTab) { + private MCCocoon(String name, ItemStack giveStack, Map spawnTab, DynamicSpawnTable dynamicSpawn) { this.name = name; this.spawnTab = spawnTab; this.giveStack = giveStack; + this.dynamicSpawn = dynamicSpawn; } - public static ICocoon create(@Nonnull String name, @Nonnull ItemStack giveStack, @Nonnull Map spawnTab) { - if (check(name, giveStack, spawnTab)) { - return new MCCocoon(name, giveStack, spawnTab); - } - return null; + public static ICocoon create(@Nonnull String name, ItemStack giveStack, @Nonnull Map spawnTab) { + return create(name, giveStack, spawnTab, (stack, player, tile) -> name); } public static ICocoon create(@Nonnull String name, @Nonnull ItemStack giveStack, @Nonnull Map spawnTab, DynamicSpawnTable dynamicSpawn) { - ICocoon cocoon = create(name, giveStack, spawnTab); - - if (Objects.nonNull(cocoon) && Objects.nonNull(dynamicSpawn)) { - cocoon.setDynamicSpawnTable(dynamicSpawn); + if (check(name, spawnTab)) { + return new MCCocoon(name, giveStack, spawnTab, dynamicSpawn); } - - return cocoon; + return null; } - private static boolean check(String name, ItemStack stack, Map spawnTab) { - double sumResult = 0.0f; + private static boolean check(String name, Map spawnTab) { if (Main.CUSTOM_COCOONS_SPAWN.containsKey(name)) { - CraftTweakerAPI.logWarning("The name must be unique!"); - return false; - } - - if (stack.isEmpty()) { - CraftTweakerAPI.logError("The stack cannot be empty!"); + CraftTweakerAPI.logError("The name must be unique!"); return false; } for (EntityEntry entity : spawnTab.keySet()) { - if (Objects.isNull(entity)) { + if (entity == null) { CraftTweakerAPI.logError("The entity cannot be null!", new IllegalArgumentException()); return false; } - - double probably = spawnTab.get(entity); - - if(probably <= 0.0f) { - CraftTweakerAPI.logError("Probably less than 0!", new IllegalArgumentException()); - return false; - } - - sumResult += probably; - } - - if (sumResult > 1.0f) { - CraftTweakerAPI.logError("Probably over 1!", new IllegalArgumentException()); - return false; + if (spawnTab.get(entity) <= 0.0f) { + CraftTweakerAPI.logError("Probability less than 0!", new IllegalArgumentException()); + return false; + } } return true; @@ -97,26 +76,21 @@ public DynamicSpawnTable getDynamicSpawnTable() { } @Override - public double getProbablyByEntity(EntityEntry entity) { + public double getProbabilityByEntity(EntityEntry entity) { return spawnTab.get(entity); } - @Override - public void setDynamicSpawnTable(DynamicSpawnTable dynamicSpawn) { - this.dynamicSpawn = dynamicSpawn; - } - public boolean match(ItemStack stack) { return InternalUtils.areItemStacksEqual(this.giveStack, stack); } @Override public String getDynamicResult(ItemStack stack, EntityPlayer player, ICocoonTileEntity tile) { - return Objects.nonNull(this.dynamicSpawn) ? this.dynamicSpawn.call( + return this.dynamicSpawn.call( CraftTweakerMC.getIItemStack(stack), CraftTweakerMC.getIPlayer(player), tile - ) : this.name; + ); } @Override @@ -124,30 +98,4 @@ public String getName() { return this.name; } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - ICocoon that = (ICocoon) o; - boolean areTheSameAsMap = spawnTab.entrySet().stream().allMatch((entry) -> - that.getSpawnTab().containsKey(entry.getKey()) && that.getProbablyByEntity(entry.getKey()) == entry.getValue()); - - return this.spawnTab.size() == that.getSpawnTab().size() && this.match(that.getStack()) && areTheSameAsMap; - } - - @Override - public int hashCode() { - int hash = 7; - hash = 41 * hash + giveStack.getItem().hashCode(); - hash = 41 * hash + giveStack.getItemDamage(); - hash = 41 * hash + (Objects.nonNull(giveStack.getTagCompound()) ? giveStack.getTagCompound().hashCode() : 0); - - return hash; - } - } diff --git a/src/main/java/ink/ikx/rt/mixins/botania/MixinBlockCocoon.java b/src/main/java/ink/ikx/rt/mixins/botania/MixinBlockCocoon.java index a4f0824f..4ca970c4 100644 --- a/src/main/java/ink/ikx/rt/mixins/botania/MixinBlockCocoon.java +++ b/src/main/java/ink/ikx/rt/mixins/botania/MixinBlockCocoon.java @@ -1,6 +1,5 @@ package ink.ikx.rt.mixins.botania; -import ink.ikx.rt.Main; import ink.ikx.rt.impl.mods.botania.cocoon.IMixinTileCocoon; import net.minecraft.block.state.IBlockState; import net.minecraft.entity.player.EntityPlayer; @@ -14,6 +13,7 @@ import net.minecraft.world.World; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; @@ -25,15 +25,16 @@ public abstract class MixinBlockCocoon { @Inject(method = "onBlockActivated", at = @At(value = "HEAD"), cancellable = true, remap = true) private void injectOnBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing s, float xs, float ys, float zs, CallbackInfoReturnable cir) { - logic(world, pos, player.getHeldItem(hand), player.capabilities.isCreativeMode, player, cir); + randomTweaker$logic(world, pos, player.getHeldItem(hand), player.capabilities.isCreativeMode, player, cir); } @Inject(method = "addStack", at = @At(value = "HEAD"), cancellable = true) private void injectAddStack(World world, BlockPos pos, ItemStack stack, boolean creative, CallbackInfoReturnable cir) { - logic(world, pos, stack, creative, null, cir); + randomTweaker$logic(world, pos, stack, creative, null, cir); } - private void logic(World world, BlockPos pos, ItemStack stack, boolean creative, EntityPlayer player, CallbackInfoReturnable cir) { + @Unique + private void randomTweaker$logic(World world, BlockPos pos, ItemStack stack, boolean creative, EntityPlayer player, CallbackInfoReturnable cir) { Item item = stack.getItem(); TileEntity cocoon = world.getTileEntity(pos); if (!(cocoon instanceof IMixinTileCocoon) || item == Items.EMERALD || item == Items.CHORUS_FRUIT) { @@ -41,21 +42,15 @@ private void logic(World world, BlockPos pos, ItemStack stack, boolean creative, } IMixinTileCocoon mixinCocoon = ((IMixinTileCocoon) cocoon); - if (mixinCocoon.getMapSize() >= 16) { - return; - } - - boolean isStackInMap = Main.CUSTOM_COCOONS_SPAWN.values().stream().anyMatch(cocoonx -> cocoonx.match(stack)); - - if (!world.isRemote && isStackInMap) { - int amount = mixinCocoon.getAmount(world, pos, stack, player); + if (!world.isRemote && !stack.isEmpty()) { + int amount = mixinCocoon.randomTweaker$getAmount(world, pos, stack, player); if (amount >= 20) { cir.setReturnValue(false); return; } - mixinCocoon.setAmount(world, pos, stack, player, amount + 1); + mixinCocoon.randomTweaker$setAmount(world, pos, stack, player, amount + 1); if (!creative) { stack.shrink(1); diff --git a/src/main/java/ink/ikx/rt/mixins/botania/MixinTileCocoon.java b/src/main/java/ink/ikx/rt/mixins/botania/MixinTileCocoon.java index 5610f8c1..bdfc7532 100644 --- a/src/main/java/ink/ikx/rt/mixins/botania/MixinTileCocoon.java +++ b/src/main/java/ink/ikx/rt/mixins/botania/MixinTileCocoon.java @@ -1,6 +1,5 @@ package ink.ikx.rt.mixins.botania; -import com.google.common.collect.Maps; import crafttweaker.CraftTweakerAPI; import crafttweaker.api.data.DataMap; import crafttweaker.api.data.IData; @@ -11,11 +10,6 @@ import ink.ikx.rt.api.mods.botania.ICocoon; import ink.ikx.rt.api.mods.botania.function.ICocoonTileEntity; import ink.ikx.rt.impl.mods.botania.cocoon.IMixinTileCocoon; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; -import javax.annotation.Nullable; import net.minecraft.entity.Entity; import net.minecraft.entity.EntityAgeable; import net.minecraft.entity.EntityLiving; @@ -27,23 +21,31 @@ import net.minecraftforge.fml.common.registry.EntityEntry; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import vazkii.botania.common.block.tile.TileCocoon; import vazkii.botania.common.block.tile.TileMod; +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Optional; + @Pseudo @Mixin(value = TileCocoon.class, remap = false) public abstract class MixinTileCocoon extends TileMod implements IMixinTileCocoon, ICocoonTileEntity { + @Unique private static final String CUSTOM_TAB = "CustomTab"; - private final Map customMap = Maps.newHashMap(); + @Unique + private final Map randomTweaker$customMap = new HashMap<>(); @Override - public int getMapSize() { - return customMap.size(); + public int randomTweaker$getMapSize() { + return randomTweaker$customMap.size(); } @Override @@ -72,32 +74,33 @@ public IBlockPos getIBlockPos() { } @Override - public int getAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player) { - return this.getDynamicResult(stack, player).map(customMap::get).orElse(0); + public int randomTweaker$getAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player) { + return this.randomTweaker$getDynamicResult(stack, player).map(randomTweaker$customMap::get).orElse(0); } @Override - public void setAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player, int amount) { - this.getDynamicResult(stack, player).ifPresent(nameIn -> this.customMap.put(nameIn, amount)); + public void randomTweaker$setAmount(World world, BlockPos pos, ItemStack stack, EntityPlayer player, int amount) { + this.randomTweaker$getDynamicResult(stack, player).ifPresent(name -> this.randomTweaker$customMap.put(name, amount)); } - private Optional getDynamicResult(ItemStack stack, EntityPlayer player) { + @Unique + private Optional randomTweaker$getDynamicResult(ItemStack stack, EntityPlayer player) { ICocoon cocoon = ICocoon.getInstanceByStack(stack); - if (Objects.nonNull(cocoon)) { - return Optional.of(cocoon.getDynamicResult(stack, player, this)); + if (cocoon != null) { + return Optional.ofNullable(cocoon.getDynamicResult(stack, player, this)); } return Optional.empty(); } - @Nullable - private String getTabName() { + @Unique + private String randomTweaker$getTabName() { String name = null; - for (Entry entry : customMap.entrySet()) { - if (Objects.isNull(name)) { + for (Entry entry : randomTweaker$customMap.entrySet()) { + if (name == null) { name = entry.getKey(); - } else if (entry.getValue() > customMap.get(name)) { + } else if (entry.getValue() > randomTweaker$customMap.get(name)) { name = entry.getKey(); } } @@ -105,7 +108,8 @@ private String getTabName() { return name; } - private void spawnEntityLiving(EntityLiving entityLiving) { + @Unique + private void randomTweaker$spawnEntityLiving(EntityLiving entityLiving) { entityLiving.setPosition(pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5); if (entityLiving instanceof EntityAgeable) { ((EntityAgeable) entityLiving).setGrowingAge(-24000); @@ -119,7 +123,7 @@ private void spawnEntityLiving(EntityLiving entityLiving) { private void injectReadPacketNBT(NBTTagCompound cmp, CallbackInfo ci) { NBTTagCompound data = cmp.getCompoundTag(CUSTOM_TAB); data.getKeySet().forEach(name -> - this.customMap.put(name, data.getInteger(name))); + this.randomTweaker$customMap.put(name, data.getInteger(name))); } @Inject(method = "writePacketNBT", at = @At(value = "HEAD")) @@ -128,30 +132,26 @@ private void injectWritePacketNBT(NBTTagCompound cmp, CallbackInfo ci) { cmp.setTag(CUSTOM_TAB, new NBTTagCompound()); } - customMap.forEach((name, amount) -> cmp.getCompoundTag(CUSTOM_TAB).setInteger(name, amount)); + randomTweaker$customMap.forEach((name, amount) -> cmp.getCompoundTag(CUSTOM_TAB).setInteger(name, amount)); } @Inject(method = "hatch", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/EntityLiving;setPosition(DDD)V", remap = true), cancellable = true) private void injectHatch(CallbackInfo ci) { - String name = this.getTabName(); - ICocoon cocoon = ICocoon.getInstanceByName(name); - - if (Objects.isNull(cocoon)) { - CraftTweakerAPI.logWarning("[RandomTweaker] cocoon is null"); - return; - } - - for (EntityEntry entityEntry : cocoon.getSpawnTab().keySet()) { - double probably = cocoon.getProbablyByEntity(entityEntry); - if (Math.random() < probably) { - Entity entity = entityEntry.newInstance(this.world); - if (entity instanceof EntityLiving) { - this.spawnEntityLiving((EntityLiving) entity); - ci.cancel(); - break; + ICocoon cocoon = ICocoon.getInstanceByName(this.randomTweaker$getTabName()); + + if (cocoon != null) { + for (EntityEntry entityEntry : cocoon.getSpawnTab().keySet()) { + double probability = cocoon.getProbabilityByEntity(entityEntry); + if (Math.random() < probability) { + Entity entity = entityEntry.newInstance(this.world); + if (entity instanceof EntityLiving) { + this.randomTweaker$spawnEntityLiving((EntityLiving) entity); + ci.cancel(); + break; + } + + CraftTweakerAPI.logWarning(entity.getName() + " doesn't extend EntityLiving"); } - - CraftTweakerAPI.logWarning(entity.getName() + " does not extend EntityLiving"); } } }