diff options
Diffstat (limited to 'src/main/java/kubatech/config/OverridesConfig.java')
-rw-r--r-- | src/main/java/kubatech/config/OverridesConfig.java | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/src/main/java/kubatech/config/OverridesConfig.java b/src/main/java/kubatech/config/OverridesConfig.java new file mode 100644 index 0000000000..9c1ca6170c --- /dev/null +++ b/src/main/java/kubatech/config/OverridesConfig.java @@ -0,0 +1,212 @@ +package kubatech.config; + +import com.dreammaster.main.MainRegistry; +import com.dreammaster.modcustomdrops.CustomDrops; +import com.google.common.io.Files; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import cpw.mods.fml.common.registry.GameRegistry; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import java.io.File; +import java.io.Reader; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.util.*; +import kubatech.Tags; +import kubatech.api.ConstructableItemStack; +import kubatech.api.LoaderReference; +import kubatech.api.mobhandler.MobDrop; +import kubatech.api.utils.GSONUtils; +import kubatech.api.utils.ReflectionHelper; +import net.minecraft.entity.EntityList; +import net.minecraft.entity.EntityLiving; +import net.minecraft.init.Items; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.JsonToNBT; +import net.minecraft.nbt.NBTTagCompound; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; + +public class OverridesConfig { + + private static final Logger LOG = LogManager.getLogger(Tags.MODID + "[Config-Overrides]"); + + public static class MobDropSimplified { + @GSONUtils.SkipGSON + ItemStack stack; + + ConstructableItemStack reconstructableStack; + MobDrop.DropType type; + + private MobDropSimplified() {} + + public MobDropSimplified(ItemStack stack, MobDrop.DropType type) { + reconstructableStack = new ConstructableItemStack(stack); + this.type = type; + } + + public void reconstructStack() { + stack = reconstructableStack.construct(); + } + + public boolean isMatching(MobDrop drop) { + return reconstructableStack.isSame(drop.reconstructableStack, true); + } + + private static final ByteBuf BufHelper = Unpooled.buffer(); + + public void writeToByteBuf(ByteBuf byteBuf) { + BufHelper.clear(); + reconstructableStack.writeToByteBuf(BufHelper); + BufHelper.writeInt(type.ordinal()); + byteBuf.writeInt(BufHelper.readableBytes()); + byteBuf.writeBytes(BufHelper); + } + + public static MobDropSimplified readFromByteBuf(ByteBuf byteBuf) { + MobDropSimplified mobDropSimplified = new MobDropSimplified(); + int size = byteBuf.readInt(); + mobDropSimplified.reconstructableStack = ConstructableItemStack.readFromByteBuf(byteBuf); + mobDropSimplified.type = MobDrop.DropType.get(byteBuf.readInt()); + mobDropSimplified.reconstructStack(); + return mobDropSimplified; + } + } + + public static class MobOverride { + public boolean removeAll = false; + public List<MobDrop> additions = new ArrayList<>(); + public List<MobDropSimplified> removals = new ArrayList<>(); + + private static final ByteBuf BufHelper = Unpooled.buffer(); + + public void writeToByteBuf(ByteBuf byteBuf) { + BufHelper.clear(); + BufHelper.writeBoolean(removeAll); + BufHelper.writeInt(additions.size()); + additions.forEach(drop -> drop.writeToByteBuf(BufHelper)); + BufHelper.writeInt(removals.size()); + removals.forEach(drop -> drop.writeToByteBuf(BufHelper)); + byteBuf.writeInt(BufHelper.readableBytes()); + byteBuf.writeBytes(BufHelper); + } + + public static MobOverride readFromByteBuf(ByteBuf byteBuf) { + int size = byteBuf.readInt(); + MobOverride mobOverride = new MobOverride(); + mobOverride.removeAll = byteBuf.readBoolean(); + int additionssize = byteBuf.readInt(); + for (int i = 0; i < additionssize; i++) mobOverride.additions.add(MobDrop.readFromByteBuf(byteBuf)); + int removalssize = byteBuf.readInt(); + for (int i = 0; i < removalssize; i++) mobOverride.removals.add(MobDropSimplified.readFromByteBuf(byteBuf)); + return mobOverride; + } + } + + public static Map<String, MobOverride> overrides = new HashMap<>(); + private static File overrideFile = null; + + private static final Gson gson = GSONUtils.GSON_BUILDER_PRETTY.create(); + + @SuppressWarnings("UnstableApiUsage") + public static void LoadConfig() { + LOG.info("Loading Config"); + if (overrideFile == null) overrideFile = Config.getConfigFile("MobOverrides.cfg"); + if (!overrideFile.exists()) writeExampleFile(); + Reader reader = null; + try { + reader = Files.newReader(overrideFile, StandardCharsets.UTF_8); + overrides = gson.fromJson(reader, new TypeToken<Map<String, MobOverride>>() {}.getType()); + overrides.remove("ExampleMob"); + if (LoaderReference.GTNHCoreMod) { + LOG.info("Detected GTNH Core Mod, parsing custom drops from there."); + CustomDrops coredrops = + ReflectionHelper.getField(MainRegistry.Module_CustomDrops, "_mCustomDrops", null); + if (coredrops != null) { + @SuppressWarnings("unchecked") + ArrayList<CustomDrops.CustomDrop> customdrops = (ArrayList<CustomDrops.CustomDrop>) + ((ArrayList<CustomDrops.CustomDrop>) coredrops.getCustomDrops()).clone(); + for (CustomDrops.CustomDrop customdrop : customdrops) { + try { + Class<?> eclass = Class.forName(customdrop.getEntityName()); + if (!EntityLiving.class.isAssignableFrom(eclass)) continue; + String ename = (String) EntityList.classToStringMapping.get(eclass); + if (ename == null) continue; + MobOverride override = overrides.computeIfAbsent(ename, k -> new MobOverride()); + for (CustomDrops.CustomDrop.Drop drop : customdrop.getDrops()) { + String[] parts = drop.getItemName().split(":"); + ItemStack stack = GameRegistry.findItemStack(parts[0], parts[1], 1); + if (stack == null) continue; + if (parts.length > 2) stack.setItemDamage(Integer.parseInt(parts[2])); + String pNBT = ReflectionHelper.getField(drop, "mTag", null); + if (pNBT != null && !pNBT.isEmpty()) { + try { + stack.stackTagCompound = (NBTTagCompound) JsonToNBT.func_150315_a(pNBT); + } catch (Exception ignored) { + } + } + int chance = drop.getChance() * 100; + int amount = drop.getAmount(); + if (drop.getIsRandomAmount()) { + // average chance formula + // chance *= ((((amount * (amount + 1d)) / 2d)) + 1d) / (amount + 1d); + chance *= (2d + (amount * amount) + amount) / (2d * (amount + 1d)); + amount = 1; + if (chance > 10000) { + int div = (int) Math.ceil(chance / 10000d); + amount *= div; + chance /= div; + } + } + stack.stackSize = amount; + // Drops from coremod are player only + override.additions.add( + new MobDrop(stack, MobDrop.DropType.Normal, chance, null, null, false, true)); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + if (reader != null) + try { + reader.close(); + } catch (Exception ignored) { + } + } + } + + @SuppressWarnings("UnstableApiUsage") + private static void writeExampleFile() { + LOG.info("No config has been detected, writing an example one"); + Writer writer = null; + try { + writer = Files.newWriter(overrideFile, StandardCharsets.UTF_8); + Map<String, MobOverride> example = new HashMap<>(1); + MobOverride ex1 = new MobOverride(); + ex1.removals.add(new MobDropSimplified(new ItemStack(Items.rotten_flesh, 1), MobDrop.DropType.Normal)); + HashMap<Integer, Integer> exdamages = new HashMap<>(3); + exdamages.put(1, 1); + exdamages.put(2, 5); + exdamages.put(3, 10); + ex1.additions.add(new MobDrop( + new ItemStack(Items.diamond_sword), MobDrop.DropType.Rare, 500, 20, exdamages, true, false)); + example.put("ExampleMob", ex1); + gson.toJson(example, writer); + writer.flush(); + } catch (Exception ex) { + ex.printStackTrace(); + } finally { + if (writer != null) + try { + writer.close(); + } catch (Exception ignored) { + } + } + } +} |