From 830aa335beda244bb5199e2cbcfd9072d1570066 Mon Sep 17 00:00:00 2001 From: Tec Date: Sat, 13 Jul 2019 23:02:46 +0200 Subject: Cleanup chunk data tick handler --- .../java/com/github/technus/tectech/TecTech.java | 18 +++--- .../tectech/mechanics/anomaly/AnomalyHandler.java | 2 +- .../mechanics/chunkData/ChunkDataHandler.java | 71 +++++++++++++++++++++- .../mechanics/chunkData/ChunkMetaDataHandler.java | 6 +- .../github/technus/tectech/proxy/ClientProxy.java | 18 ------ .../github/technus/tectech/proxy/CommonProxy.java | 19 ------ 6 files changed, 84 insertions(+), 50 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java index 5383b9cf62..0e6e5ecf5c 100644 --- a/src/main/java/com/github/technus/tectech/TecTech.java +++ b/src/main/java/com/github/technus/tectech/TecTech.java @@ -9,17 +9,16 @@ import com.github.technus.tectech.mechanics.chunkData.ChunkDataHandler; import com.github.technus.tectech.mechanics.elementalMatter.core.commands.GiveEM; import com.github.technus.tectech.mechanics.elementalMatter.core.commands.ListEM; import com.github.technus.tectech.proxy.CommonProxy; +import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.SidedProxy; -import cpw.mods.fml.common.event.FMLInitializationEvent; -import cpw.mods.fml.common.event.FMLPostInitializationEvent; -import cpw.mods.fml.common.event.FMLPreInitializationEvent; -import cpw.mods.fml.common.event.FMLServerStartingEvent; +import cpw.mods.fml.common.event.*; import eu.usrv.yamcore.auxiliary.IngameErrorLog; import eu.usrv.yamcore.auxiliary.LogHelper; import gregtech.GT_Mod; import gregtech.common.GT_Proxy; +import net.minecraftforge.common.MinecraftForge; import java.lang.reflect.Field; import java.lang.reflect.Modifier; @@ -80,6 +79,11 @@ public class TecTech { moduleAdminErrorLogs = new IngameErrorLog(); } + chunkDataHandler=new ChunkDataHandler(); + chunkDataHandler.registerChunkMetaDataHandler(anomalyHandler=new AnomalyHandler()); + FMLCommonHandler.instance().bus().register(chunkDataHandler); + MinecraftForge.EVENT_BUS.register(chunkDataHandler); + MainLoader.preLoad(); } @@ -184,8 +188,6 @@ public class TecTech { @Mod.EventHandler public void PostLoad(FMLPostInitializationEvent PostEvent) { MainLoader.postLoad(); - chunkDataHandler=new ChunkDataHandler(); - chunkDataHandler.registerChunkMetaDataHandler(anomalyHandler=new AnomalyHandler()); } @Mod.EventHandler @@ -199,7 +201,7 @@ public class TecTech { } @Mod.EventHandler - public void onServerStarting(FMLServerStartingEvent aEvent) { - chunkDataHandler.onServerStarting(); + public void onServerAboutToStart(FMLServerAboutToStartEvent aEvent) { + chunkDataHandler.clearData(); } } diff --git a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java index 29d3ff663a..c5060c8709 100644 --- a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java +++ b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java @@ -27,7 +27,7 @@ public class AnomalyHandler implements ChunkMetaDataHandler { } @Override - public void TickData(HashMap data, TickEvent.ServerTickEvent event) { + public void tickServer(HashMap data, TickEvent.ServerTickEvent event) { } } diff --git a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java index 8dc60248ef..f0a1c5488c 100644 --- a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java +++ b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java @@ -1,5 +1,6 @@ package com.github.technus.tectech.mechanics.chunkData; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; import cpw.mods.fml.common.gameevent.TickEvent; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkCoordIntPair; @@ -14,7 +15,13 @@ public class ChunkDataHandler { private final HashMap> dimensionWiseChunkData=new HashMap<>(); private final HashMap> dimensionWiseMetaChunkData=new HashMap<>(); private final HashMap metaDataHandlerHashMap =new HashMap<>(); + private final ArrayList serverHandlers=new ArrayList<>(); + private final ArrayList clientHandlers=new ArrayList<>(); + private final ArrayList worldHandlers=new ArrayList<>(); + private final ArrayList playerHandlers=new ArrayList<>(); + private final ArrayList renderHandlers=new ArrayList<>(); + @SubscribeEvent public void handleChunkSaveEvent(ChunkDataEvent.Save event) { HashMap dimensionData=dimensionWiseChunkData.get(event.world.provider.dimensionId); NBTChunk chunkData =dimensionData!=null?dimensionData.get(event.getChunk().getChunkCoordIntPair()):null; @@ -26,6 +33,7 @@ public class ChunkDataHandler { } } + @SubscribeEvent public void handleChunkLoadEvent(ChunkDataEvent.Load event) { NBTTagCompound loadedTag=event.getData().getCompoundTag(BASE_TAG_NAME); if(loadedTag.hasNoTags()){ @@ -69,11 +77,48 @@ public class ChunkDataHandler { } } - public void tickData(TickEvent.ServerTickEvent event){ - dimensionWiseMetaChunkData.forEach((k, v) -> metaDataHandlerHashMap.get(k).TickData(v, event)); + @SubscribeEvent + public void onClientTickEvent(TickEvent.ClientTickEvent aEvent) { + clientHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickClient( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), + aEvent)); } - public void onServerStarting() { + @SubscribeEvent + public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { + serverHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickServer( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), + aEvent)); + } + + @SubscribeEvent + public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { + worldHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickWorld( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), + aEvent)); + } + + @SubscribeEvent + public void onPlayerTickEvent(TickEvent.PlayerTickEvent aEvent) { + playerHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickPlayer( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), + aEvent)); + } + + @SubscribeEvent + public void onRenderTickEvent(TickEvent.RenderTickEvent aEvent) { + renderHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickRender( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), + aEvent)); + } + + + public void clearData() { dimensionWiseChunkData.clear(); dimensionWiseMetaChunkData.forEach((k,v)->v.clear()); } @@ -81,6 +126,26 @@ public class ChunkDataHandler { public void registerChunkMetaDataHandler(ChunkMetaDataHandler handler){ metaDataHandlerHashMap.put(handler.getTagName(),handler); dimensionWiseMetaChunkData.put(handler.getTagName(),new HashMap<>()); + try { + Class clazz=handler.getClass(); + if(clazz.getMethod("tickClient", HashMap.class, TickEvent.ClientTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + clientHandlers.add(handler); + } + if(clazz.getMethod("tickServer", HashMap.class, TickEvent.ServerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + serverHandlers.add(handler); + } + if(clazz.getMethod("tickWorld", HashMap.class, TickEvent.WorldTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + worldHandlers.add(handler); + } + if(clazz.getMethod("tickPlayer", HashMap.class, TickEvent.PlayerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + playerHandlers.add(handler); + } + if(clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + renderHandlers.add(handler); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException("Cannot register event handlers!"); + } } public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, World world, Chunk chunk){ diff --git a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java index 420f24f46d..e16f19b681 100644 --- a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java +++ b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java @@ -9,6 +9,10 @@ public interface ChunkMetaDataHandler { String getTagName(); void mergeData(NBTTagCompound target, NBTTagCompound loadedData); NBTTagCompound createData(); - void TickData(HashMap data, TickEvent.ServerTickEvent event); + default void tickClient(HashMap data, TickEvent.ClientTickEvent aEvent){} + default void tickServer(HashMap data, TickEvent.ServerTickEvent event){} + default void tickWorld(HashMap data, TickEvent.WorldTickEvent aEvent){} + default void tickPlayer(HashMap data, TickEvent.PlayerTickEvent aEvent){} + default void tickRender(HashMap data, TickEvent.RenderTickEvent aEvent){} } diff --git a/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java index 8299f815e0..255cf56e96 100644 --- a/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java +++ b/src/main/java/com/github/technus/tectech/proxy/ClientProxy.java @@ -11,8 +11,6 @@ import com.github.technus.tectech.thing.block.QuantumStuffRender; import cpw.mods.fml.client.FMLClientHandler; import cpw.mods.fml.client.registry.RenderingRegistry; import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import net.minecraft.block.Block; import net.minecraft.client.Minecraft; @@ -25,7 +23,6 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.event.world.ChunkDataEvent; import org.lwjgl.opengl.GL11; public class ClientProxy extends CommonProxy { @@ -141,19 +138,4 @@ public class ClientProxy extends CommonProxy { public void renderAABB(AxisAlignedBB box) { renderAABB(Minecraft.getMinecraft().theWorld,box); } - - @SubscribeEvent - public void handleChunkSaveEvent(ChunkDataEvent.Save event) { - super.handleChunkSaveEvent(event); - } - - @SubscribeEvent - public void handleChunkLoadEvent(ChunkDataEvent.Load event) { - super.handleChunkLoadEvent(event); - } - - @SubscribeEvent - public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { - super.onServerTickEvent(aEvent); - } } diff --git a/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java b/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java index 31b1b1824c..598a8b148f 100644 --- a/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java +++ b/src/main/java/com/github/technus/tectech/proxy/CommonProxy.java @@ -1,8 +1,5 @@ package com.github.technus.tectech.proxy; -import com.github.technus.tectech.TecTech; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; import cpw.mods.fml.common.network.IGuiHandler; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import net.minecraft.block.Block; @@ -12,7 +9,6 @@ import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.ChatComponentText; import net.minecraft.world.World; import net.minecraft.world.WorldServer; -import net.minecraftforge.event.world.ChunkDataEvent; public class CommonProxy implements IGuiHandler { public void registerRenderInfo() {} @@ -85,19 +81,4 @@ public class CommonProxy implements IGuiHandler { } return false; } - - @SubscribeEvent - public void handleChunkSaveEvent(ChunkDataEvent.Save event) { - TecTech.chunkDataHandler.handleChunkSaveEvent(event); - } - - @SubscribeEvent - public void handleChunkLoadEvent(ChunkDataEvent.Load event) { - TecTech.chunkDataHandler.handleChunkLoadEvent(event); - } - - @SubscribeEvent - public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { - TecTech.chunkDataHandler.tickData(aEvent); - } } -- cgit From e522d6463b002731ecb656dcdcf39e2773f33aa7 Mon Sep 17 00:00:00 2001 From: Tec Date: Sun, 14 Jul 2019 09:17:57 +0200 Subject: Implement data syncing --- .../java/com/github/technus/tectech/TecTech.java | 6 +- src/main/java/com/github/technus/tectech/Util.java | 7 + .../tectech/chunkData/ChunkDataHandler.java | 318 +++++++++++++++++++++ .../tectech/chunkData/ChunkMetaDataHandler.java | 27 ++ .../tectech/loader/network/ChunkDataMessage.java | 101 +++++++ .../tectech/loader/network/NetworkDispatcher.java | 2 + .../tectech/mechanics/anomaly/AnomalyHandler.java | 53 +++- .../mechanics/chunkData/ChunkDataHandler.java | 291 ------------------- .../mechanics/chunkData/ChunkMetaDataHandler.java | 18 -- 9 files changed, 507 insertions(+), 316 deletions(-) create mode 100644 src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java create mode 100644 src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java create mode 100644 src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java delete mode 100644 src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java delete mode 100644 src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java (limited to 'src/main/java') diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java index 0e6e5ecf5c..cfe8662a21 100644 --- a/src/main/java/com/github/technus/tectech/TecTech.java +++ b/src/main/java/com/github/technus/tectech/TecTech.java @@ -5,7 +5,7 @@ import com.github.technus.tectech.loader.TecTechConfig; import com.github.technus.tectech.mechanics.ConvertFloat; import com.github.technus.tectech.mechanics.ConvertInteger; import com.github.technus.tectech.mechanics.anomaly.AnomalyHandler; -import com.github.technus.tectech.mechanics.chunkData.ChunkDataHandler; +import com.github.technus.tectech.chunkData.ChunkDataHandler; import com.github.technus.tectech.mechanics.elementalMatter.core.commands.GiveEM; import com.github.technus.tectech.mechanics.elementalMatter.core.commands.ListEM; import com.github.technus.tectech.proxy.CommonProxy; @@ -94,10 +94,10 @@ public class TecTech { if(configTecTech.DISABLE_MATERIAL_LOADING_FFS){ try { - Field field= GT_Proxy.class.getDeclaredField("mEvents"); - field.setAccessible(true); Field modifiersField = Field.class.getDeclaredField( "modifiers" ); modifiersField.setAccessible( true ); + Field field= GT_Proxy.class.getDeclaredField("mEvents"); + field.setAccessible(true); modifiersField.setInt( field, field.getModifiers() & ~Modifier.FINAL ); field.set(GT_Mod.gregtechproxy, new Collection() { @Override diff --git a/src/main/java/com/github/technus/tectech/Util.java b/src/main/java/com/github/technus/tectech/Util.java index e333e70137..7746d8dd41 100644 --- a/src/main/java/com/github/technus/tectech/Util.java +++ b/src/main/java/com/github/technus/tectech/Util.java @@ -20,6 +20,7 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.ChunkCoordIntPair; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import org.apache.commons.lang3.StringUtils; @@ -1450,4 +1451,10 @@ public final class Util { } return Double.toString(value); } + + public static boolean checkChunkExist(World world, ChunkCoordIntPair chunk){ + int x=chunk.getCenterXPos(); + int z=chunk.getCenterZPosition(); + return world.checkChunksExist(x, 0, z, x, 0, z); + } } diff --git a/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java new file mode 100644 index 0000000000..cd6002e7fc --- /dev/null +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java @@ -0,0 +1,318 @@ +package com.github.technus.tectech.chunkData; + +import cpw.mods.fml.common.FMLCommonHandler; +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.ChunkEvent; + +import java.util.*; + +public class ChunkDataHandler { + private final String BASE_TAG_NAME ="TecTechData"; + private final HashMap> dimensionWiseChunkData=new HashMap<>(); + private final HashMap> dimensionWiseMetaChunkData=new HashMap<>(); + private final HashMap metaDataHandlerHashMap =new HashMap<>(); + private final ArrayList serverHandlers=new ArrayList<>(); + private final ArrayList worldHandlers=new ArrayList<>(); + private final ArrayList playerHandlers=new ArrayList<>(); + @SideOnly(Side.CLIENT) + private final ArrayList clientHandlers=new ArrayList<>(); + @SideOnly(Side.CLIENT) + private final ArrayList renderHandlers=new ArrayList<>(); + @SideOnly(Side.CLIENT) + private final ArrayList clientSyncHandlers =new ArrayList<>(); + + @SideOnly(Side.SERVER) + @SubscribeEvent + public void handleChunkSaveEvent(ChunkDataEvent.Save event) { + HashMap dimensionData = dimensionWiseChunkData.get(event.world.provider.dimensionId); + NBTChunk chunkData = dimensionData != null ? dimensionData.get(event.getChunk().getChunkCoordIntPair()) : null; + if (chunkData == null) { + event.getData().removeTag(BASE_TAG_NAME); + } else { + chunkData.isLoaded = true; + event.getData().setTag(BASE_TAG_NAME, chunkData.data); + } + } + + @SideOnly(Side.SERVER) + @SubscribeEvent + public void handleChunkLoadEvent(ChunkDataEvent.Load event) { + NBTTagCompound loadedTag = event.getData().getCompoundTag(BASE_TAG_NAME); + if (loadedTag.hasNoTags()) { + return; + } + int dimId = event.world.provider.dimensionId; + HashMap dimensionMemory = + dimensionWiseChunkData.computeIfAbsent(dimId, this::createDimensionData); + ChunkCoordIntPair chunkCoordIntPair = event.getChunk().getChunkCoordIntPair(); + Set loadedKeys = loadedTag.func_150296_c(); + NBTChunk chunkMemory = dimensionMemory.get(chunkCoordIntPair); + if (chunkMemory == null) { + chunkMemory = new NBTChunk(loadedTag, true); + dimensionMemory.put(chunkCoordIntPair, chunkMemory); + for (String s : loadedKeys) { + dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair, loadedTag.getCompoundTag(s)); + } + } else if (!chunkMemory.isLoaded) { + chunkMemory.isLoaded = true; + + Set tagsDuplicated = new HashSet(loadedKeys); + tagsDuplicated.retainAll(chunkMemory.data.func_150296_c()); + + if (tagsDuplicated.isEmpty()) { + for (String s : loadedKeys) { + NBTTagCompound tag = loadedTag.getCompoundTag(s); + chunkMemory.data.setTag(s, tag); + dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair, tag); + } + } else { + for (String s : loadedKeys) { + NBTTagCompound memory = chunkMemory.data.getCompoundTag(s); + if (tagsDuplicated.contains(s)) { + metaDataHandlerHashMap.get(s).mergeData(memory, loadedTag.getCompoundTag(s)); + } else { + chunkMemory.data.setTag(s, loadedTag.getCompoundTag(s)); + dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair, memory); + } + } + } + } + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onLoadChunk(ChunkEvent.Load aEvent){ + clientSyncHandlers.forEach(chunkMetaDataHandler -> chunkMetaDataHandler.requestData(aEvent)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onUnLoadChunk(ChunkEvent.Unload aEvent){ + clientSyncHandlers.forEach(chunkMetaDataHandler -> dimensionWiseMetaChunkData + .get(chunkMetaDataHandler.getTagName()) + .get(aEvent.world.provider.dimensionId) + .remove(aEvent.getChunk().getChunkCoordIntPair())); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onClientTickEvent(TickEvent.ClientTickEvent aEvent) { + clientHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickClient( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); + } + + @SideOnly(Side.CLIENT) + @SubscribeEvent + public void onRenderTickEvent(TickEvent.RenderTickEvent aEvent) { + renderHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickRender( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); + } + + @SubscribeEvent + public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { + serverHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickServer( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); + } + + @SubscribeEvent + public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { + worldHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickWorld( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); + } + + @SubscribeEvent + public void onPlayerTickEvent(TickEvent.PlayerTickEvent aEvent) { + playerHandlers.forEach(chunkMetaDataHandler -> + chunkMetaDataHandler.tickPlayer( + dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); + } + + + public void clearData() { + dimensionWiseChunkData.clear(); + dimensionWiseMetaChunkData.forEach((k,v)->v.clear()); + } + + public ChunkMetaDataHandler getChunkMetaDataHandler(String s){ + return metaDataHandlerHashMap.get(s); + } + + public void registerChunkMetaDataHandler(ChunkMetaDataHandler handler){ + metaDataHandlerHashMap.put(handler.getTagName(),handler); + dimensionWiseMetaChunkData.put(handler.getTagName(),new HashMap<>()); + Class clazz=handler.getClass(); + try { + if(clazz.getMethod("tickServer", HashMap.class, TickEvent.ServerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + serverHandlers.add(handler); + } + if(clazz.getMethod("tickWorld", HashMap.class, TickEvent.WorldTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + worldHandlers.add(handler); + } + if(clazz.getMethod("tickPlayer", HashMap.class, TickEvent.PlayerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ + playerHandlers.add(handler); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException("Cannot register common event handlers!"); + } + if(FMLCommonHandler.instance().getEffectiveSide().isClient()) { + try { + if (clazz.getMethod("tickClient", HashMap.class, TickEvent.ClientTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + clientHandlers.add(handler); + } + if (clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + renderHandlers.add(handler); + } + if (clazz.getMethod("requestData", int.class, ChunkCoordIntPair.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + clientSyncHandlers.add(handler); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException("Cannot register client event handlers!"); + } + } + } + + public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world).get(chunk); + } + + public NBTTagCompound putChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk,NBTTagCompound data){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world).put(chunk,data); + } + public NBTTagCompound createIfAbsentChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world) + .computeIfAbsent(chunk,chunkCoordIntPair -> handler.createData()); + } + + public HashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler){ + return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()); + } + + public ChunkHashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler,int world){ + return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()).get(world); + } + + private HashMap createDimensionData(Integer dim) { + HashMap map = new HashMap<>(); + for (String meta : metaDataHandlerHashMap.keySet()) { + dimensionWiseMetaChunkData.get(meta).put(dim, new ChunkHashMap(meta, map)); + } + return map; + } + + public static final class ChunkHashMap implements Map{ + private final HashMap storage; + private final HashMap storageMeta=new HashMap<>(1024); + private final String meta; + + private ChunkHashMap(String meta, HashMap storage) { + this.storage =storage; + this.meta=meta; + } + + private void putLoaded(ChunkCoordIntPair key, NBTTagCompound value) { + storageMeta.put(key, value); + } + + @Override + public NBTTagCompound remove(Object key) { + NBTTagCompound compound=storageMeta.remove(key); + if(compound!=null) { + NBTChunk chunk = storage.get(key); + chunk.data.removeTag(meta); + if(chunk.data.hasNoTags()){ + storage.remove(key); + } + } + return compound; + } + + @Override + public NBTTagCompound put(ChunkCoordIntPair key, NBTTagCompound value) { + if(value==null){ + return remove(key); + } + NBTChunk chunk = storage.get(key); + if(chunk==null){ + NBTTagCompound base=new NBTTagCompound(); + base.setTag(meta,value); + storage.put(key,new NBTChunk(base,false)); + }else { + chunk.data.setTag(meta,value); + } + return storageMeta.put(key, value); + } + + @Override + public int size() { + return storageMeta.size(); + } + + @Override + public boolean isEmpty() { + return storageMeta.isEmpty(); + } + + @Override + public NBTTagCompound get(Object key) { + return storageMeta.get(key); + } + + @Override + public void clear() { + storageMeta.entrySet().forEach(this::remove); + } + + @Override + public void putAll(Map m) { + m.forEach(this::put); + } + + @Override + public boolean containsKey(Object key) { + return storageMeta.containsKey(key); + } + + @Override + public boolean containsValue(Object value) { + return storageMeta.containsValue(value); + } + + @Override + public Set keySet() { + return storageMeta.keySet(); + } + + @Override + public Collection values() { + return storageMeta.values(); + } + + @Override + public Set> entrySet() { + return storageMeta.entrySet(); + } + } + + private static final class NBTChunk { + private final NBTTagCompound data; + private boolean isLoaded; + + private NBTChunk(NBTTagCompound data, boolean isLoaded) { + if(data==null){ + data=new NBTTagCompound(); + } + this.data = data; + this.isLoaded = isLoaded; + } + } +} diff --git a/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java b/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java new file mode 100644 index 0000000000..479f8ddb37 --- /dev/null +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java @@ -0,0 +1,27 @@ +package com.github.technus.tectech.chunkData; + +import cpw.mods.fml.common.gameevent.TickEvent; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.event.world.ChunkEvent; + +import java.util.HashMap; + +public interface ChunkMetaDataHandler { + String getTagName(); + void mergeData(NBTTagCompound target, NBTTagCompound loadedData); + NBTTagCompound createData(); + @SideOnly(Side.CLIENT) + default void requestData(ChunkEvent.Load aEvent){} + default void pushData(int world, ChunkCoordIntPair chunk){} + @SideOnly(Side.CLIENT) + default void tickRender(HashMap data, TickEvent.RenderTickEvent aEvent){} + @SideOnly(Side.CLIENT) + default void tickClient(HashMap data, TickEvent.ClientTickEvent aEvent){} + default void tickServer(HashMap data, TickEvent.ServerTickEvent event){} + default void tickWorld(HashMap data, TickEvent.WorldTickEvent aEvent){} + default void tickPlayer(HashMap data, TickEvent.PlayerTickEvent aEvent){} +} + diff --git a/src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java b/src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java new file mode 100644 index 0000000000..daa6195944 --- /dev/null +++ b/src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java @@ -0,0 +1,101 @@ +package com.github.technus.tectech.loader.network; + +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.Util; +import com.github.technus.tectech.chunkData.ChunkMetaDataHandler; +import cpw.mods.fml.common.network.ByteBufUtils; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import eu.usrv.yamcore.network.client.AbstractClientMessageHandler; +import eu.usrv.yamcore.network.server.AbstractServerMessageHandler; +import io.netty.buffer.ByteBuf; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraftforge.event.world.ChunkEvent; + +public class ChunkDataMessage implements IMessage { + int worldId; + ChunkCoordIntPair chunk; + NBTTagCompound data; + ChunkMetaDataHandler handler; + + public ChunkDataMessage(){} + + @Override + public void fromBytes(ByteBuf pBuffer) { + NBTTagCompound tag = ByteBufUtils.readTag(pBuffer); + worldId = tag.getInteger("wId"); + chunk=new ChunkCoordIntPair( + tag.getInteger("posx"), + tag.getInteger("posz")); + handler = TecTech.chunkDataHandler.getChunkMetaDataHandler( + tag.getString("handle")); + if(tag.hasKey("data")){ + data=tag.getCompoundTag("data"); + } + } + + @Override + public void toBytes(ByteBuf pBuffer) { + NBTTagCompound tag = new NBTTagCompound(); + tag.setInteger("wId",worldId); + tag.setInteger("posx",chunk.chunkXPos); + tag.setInteger("posz",chunk.chunkZPos); + tag.setString("handle",handler.getTagName()); + if(data!=null){ + tag.setTag("data",data); + } + ByteBufUtils.writeTag(pBuffer, tag); + } + + public static class ChunkDataQuery extends ChunkDataMessage { + public ChunkDataQuery() { + } + public ChunkDataQuery(ChunkEvent.Load aEvent,ChunkMetaDataHandler handler) { + worldId=aEvent.world.provider.dimensionId; + chunk=aEvent.getChunk().getChunkCoordIntPair(); + this.handler=handler; + } + } + + public static class ChunkDataData extends ChunkDataMessage { + public ChunkDataData() { + } + + public ChunkDataData(int worldId,ChunkCoordIntPair chunk,ChunkMetaDataHandler handler){ + this.worldId=worldId; + this.chunk=chunk; + this.handler=handler; + this.data=TecTech.chunkDataHandler.getChunkData(handler,worldId,chunk); + } + + public ChunkDataData(ChunkDataQuery query){ + worldId=query.worldId; + chunk=query.chunk; + handler=query.handler; + data=TecTech.chunkDataHandler.getChunkData(handler,worldId,chunk); + } + } + + public static class ClientHandler extends AbstractClientMessageHandler { + @Override + public IMessage handleClientMessage(EntityPlayer pPlayer, ChunkDataData pMessage, MessageContext pCtx) { + if(Util.checkChunkExist(pPlayer.worldObj,pMessage.chunk)){ + TecTech.chunkDataHandler.putChunkData(pMessage.handler, pMessage.worldId,pMessage.chunk, pMessage.data); + } + return null; + } + } + + public static class ServerHandler extends AbstractServerMessageHandler { + @Override + public IMessage handleServerMessage(EntityPlayer pPlayer, ChunkDataQuery pMessage, MessageContext pCtx) { + if(pPlayer instanceof EntityPlayerMP){ + NetworkDispatcher.INSTANCE.sendTo(new ChunkDataData(pMessage),(EntityPlayerMP) pPlayer); + } + return null; + } + } +} diff --git a/src/main/java/com/github/technus/tectech/loader/network/NetworkDispatcher.java b/src/main/java/com/github/technus/tectech/loader/network/NetworkDispatcher.java index 2ee027ddc8..56455a13c4 100644 --- a/src/main/java/com/github/technus/tectech/loader/network/NetworkDispatcher.java +++ b/src/main/java/com/github/technus/tectech/loader/network/NetworkDispatcher.java @@ -17,5 +17,7 @@ public class NetworkDispatcher extends eu.usrv.yamcore.network.PacketDispatcher registerMessage(PipeActivityMessage.ClientHandler.class, PipeActivityMessage.PipeActivityData.class); registerMessage(RotationMessage.ServerHandler.class, RotationMessage.RotationQuery.class); registerMessage(RotationMessage.ClientHandler.class, RotationMessage.RotationData.class); + registerMessage(ChunkDataMessage.ServerHandler.class, ChunkDataMessage.ChunkDataQuery.class); + registerMessage(ChunkDataMessage.ClientHandler.class, ChunkDataMessage.ChunkDataData.class); } } diff --git a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java index c5060c8709..b69fa5f76e 100644 --- a/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java +++ b/src/main/java/com/github/technus/tectech/mechanics/anomaly/AnomalyHandler.java @@ -1,9 +1,16 @@ package com.github.technus.tectech.mechanics.anomaly; -import com.github.technus.tectech.mechanics.chunkData.ChunkDataHandler; -import com.github.technus.tectech.mechanics.chunkData.ChunkMetaDataHandler; +import com.github.technus.tectech.TecTech; +import com.github.technus.tectech.loader.network.ChunkDataMessage; +import com.github.technus.tectech.loader.network.NetworkDispatcher; +import com.github.technus.tectech.chunkData.ChunkDataHandler; +import com.github.technus.tectech.chunkData.ChunkMetaDataHandler; import cpw.mods.fml.common.gameevent.TickEvent; +import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraftforge.event.world.ChunkEvent; import java.util.HashMap; @@ -17,8 +24,8 @@ public class AnomalyHandler implements ChunkMetaDataHandler { @Override public void mergeData(NBTTagCompound target, NBTTagCompound loadedData) { - int intensity=target.getInteger(INTENSITY)+loadedData.getInteger(INTENSITY); - target.setInteger(INTENSITY,intensity); + double intensity=target.getDouble(INTENSITY)+loadedData.getDouble(INTENSITY); + target.setDouble(INTENSITY,intensity); } @Override @@ -30,4 +37,42 @@ public class AnomalyHandler implements ChunkMetaDataHandler { public void tickServer(HashMap data, TickEvent.ServerTickEvent event) { } + + @Override + public void tickClient(HashMap data, TickEvent.ClientTickEvent aEvent) { + + } + + @Override + public void requestData(ChunkEvent.Load aEvent) { + NetworkDispatcher.INSTANCE.sendToServer(new ChunkDataMessage.ChunkDataQuery(aEvent,this)); + } + + @Override + public void pushData(int world, ChunkCoordIntPair chunk) { + NetworkDispatcher.INSTANCE.sendToDimension(new ChunkDataMessage.ChunkDataData(world,chunk,this),world); + } + + public void addAnomaly(IGregTechTileEntity iGregTechTileEntity, double amount) { + World w=iGregTechTileEntity.getWorld(); + addAnomaly(w.provider.dimensionId, + w.getChunkFromBlockCoords( + iGregTechTileEntity.getXCoord(), + iGregTechTileEntity.getZCoord()) + .getChunkCoordIntPair(), + amount); + } + + public void addAnomaly(int world, ChunkCoordIntPair chunk,double amount) { + NBTTagCompound old=TecTech.chunkDataHandler.getChunkData(this,world,chunk); + if(old==null){ + NBTTagCompound data=new NBTTagCompound(); + data.setDouble(INTENSITY,amount); + TecTech.chunkDataHandler.putChunkData(this,world,chunk,data); + //todo update client on threshold reach + }else { + old.setDouble(INTENSITY,old.getDouble(INTENSITY)+amount); + //todo update client on threshold change + } + } } diff --git a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java deleted file mode 100644 index f0a1c5488c..0000000000 --- a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.github.technus.tectech.mechanics.chunkData; - -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; -import net.minecraft.world.chunk.Chunk; -import net.minecraftforge.event.world.ChunkDataEvent; - -import java.util.*; - -public class ChunkDataHandler { - private final String BASE_TAG_NAME ="TecTechData"; - private final HashMap> dimensionWiseChunkData=new HashMap<>(); - private final HashMap> dimensionWiseMetaChunkData=new HashMap<>(); - private final HashMap metaDataHandlerHashMap =new HashMap<>(); - private final ArrayList serverHandlers=new ArrayList<>(); - private final ArrayList clientHandlers=new ArrayList<>(); - private final ArrayList worldHandlers=new ArrayList<>(); - private final ArrayList playerHandlers=new ArrayList<>(); - private final ArrayList renderHandlers=new ArrayList<>(); - - @SubscribeEvent - public void handleChunkSaveEvent(ChunkDataEvent.Save event) { - HashMap dimensionData=dimensionWiseChunkData.get(event.world.provider.dimensionId); - NBTChunk chunkData =dimensionData!=null?dimensionData.get(event.getChunk().getChunkCoordIntPair()):null; - if(chunkData==null) { - event.getData().removeTag(BASE_TAG_NAME); - } else { - chunkData.isLoaded=true; - event.getData().setTag(BASE_TAG_NAME,chunkData.data); - } - } - - @SubscribeEvent - public void handleChunkLoadEvent(ChunkDataEvent.Load event) { - NBTTagCompound loadedTag=event.getData().getCompoundTag(BASE_TAG_NAME); - if(loadedTag.hasNoTags()){ - return; - } - int dimId=event.world.provider.dimensionId; - HashMap dimensionMemory= - dimensionWiseChunkData.computeIfAbsent(dimId, this::createDimensionData); - ChunkCoordIntPair chunkCoordIntPair=event.getChunk().getChunkCoordIntPair(); - Set loadedKeys=loadedTag.func_150296_c(); - NBTChunk chunkMemory =dimensionMemory.get(chunkCoordIntPair); - if(chunkMemory==null) { - chunkMemory=new NBTChunk(loadedTag,true); - dimensionMemory.put(chunkCoordIntPair,chunkMemory); - for (String s :loadedKeys) { - dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair, loadedTag.getCompoundTag(s)); - } - }else if(!chunkMemory.isLoaded) { - chunkMemory.isLoaded=true; - - Set tagsDuplicated=new HashSet(loadedKeys); - tagsDuplicated.retainAll(chunkMemory.data.func_150296_c()); - - if (tagsDuplicated.isEmpty()) { - for (String s:loadedKeys) { - NBTTagCompound tag=loadedTag.getCompoundTag(s); - chunkMemory.data.setTag(s,tag); - dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair,tag); - } - } else { - for (String s : loadedKeys) { - NBTTagCompound memory=chunkMemory.data.getCompoundTag(s); - if(tagsDuplicated.contains(s)){ - metaDataHandlerHashMap.get(s).mergeData(memory,loadedTag.getCompoundTag(s)); - }else { - chunkMemory.data.setTag(s,loadedTag.getCompoundTag(s)); - dimensionWiseMetaChunkData.get(s).get(dimId).putLoaded(chunkCoordIntPair,memory); - } - } - } - } - } - - @SubscribeEvent - public void onClientTickEvent(TickEvent.ClientTickEvent aEvent) { - clientHandlers.forEach(chunkMetaDataHandler -> - chunkMetaDataHandler.tickClient( - dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), - aEvent)); - } - - @SubscribeEvent - public void onServerTickEvent(TickEvent.ServerTickEvent aEvent) { - serverHandlers.forEach(chunkMetaDataHandler -> - chunkMetaDataHandler.tickServer( - dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), - aEvent)); - } - - @SubscribeEvent - public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { - worldHandlers.forEach(chunkMetaDataHandler -> - chunkMetaDataHandler.tickWorld( - dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), - aEvent)); - } - - @SubscribeEvent - public void onPlayerTickEvent(TickEvent.PlayerTickEvent aEvent) { - playerHandlers.forEach(chunkMetaDataHandler -> - chunkMetaDataHandler.tickPlayer( - dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), - aEvent)); - } - - @SubscribeEvent - public void onRenderTickEvent(TickEvent.RenderTickEvent aEvent) { - renderHandlers.forEach(chunkMetaDataHandler -> - chunkMetaDataHandler.tickRender( - dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), - aEvent)); - } - - - public void clearData() { - dimensionWiseChunkData.clear(); - dimensionWiseMetaChunkData.forEach((k,v)->v.clear()); - } - - public void registerChunkMetaDataHandler(ChunkMetaDataHandler handler){ - metaDataHandlerHashMap.put(handler.getTagName(),handler); - dimensionWiseMetaChunkData.put(handler.getTagName(),new HashMap<>()); - try { - Class clazz=handler.getClass(); - if(clazz.getMethod("tickClient", HashMap.class, TickEvent.ClientTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ - clientHandlers.add(handler); - } - if(clazz.getMethod("tickServer", HashMap.class, TickEvent.ServerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ - serverHandlers.add(handler); - } - if(clazz.getMethod("tickWorld", HashMap.class, TickEvent.WorldTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ - worldHandlers.add(handler); - } - if(clazz.getMethod("tickPlayer", HashMap.class, TickEvent.PlayerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ - playerHandlers.add(handler); - } - if(clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ - renderHandlers.add(handler); - } - } catch (NoSuchMethodException e) { - throw new RuntimeException("Cannot register event handlers!"); - } - } - - public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, World world, Chunk chunk){ - return getChunkData(handler,world.provider.dimensionId,chunk.getChunkCoordIntPair()); - } - - public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ - return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world).get(chunk); - } - - public NBTTagCompound computeIfAbsentChunkData(ChunkMetaDataHandler handler, World world, Chunk chunk){ - return computeIfAbsentChunkData(handler,world.provider.dimensionId,chunk.getChunkCoordIntPair()); - } - - public NBTTagCompound computeIfAbsentChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ - return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world) - .computeIfAbsent(chunk,chunkCoordIntPair -> handler.createData()); - } - - public HashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler){ - return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()); - } - - public ChunkHashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler,World world){ - return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()).get(world.provider.dimensionId); - } - - public ChunkHashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler,int world){ - return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()).get(world); - } - - private HashMap createDimensionData(Integer dim) { - HashMap map = new HashMap<>(); - for (String meta : metaDataHandlerHashMap.keySet()) { - dimensionWiseMetaChunkData.get(meta).put(dim, new ChunkHashMap(meta, map)); - } - return map; - } - - public static final class ChunkHashMap implements Map{ - private final HashMap storage; - private final HashMap storageMeta=new HashMap<>(1024); - private final String meta; - - private ChunkHashMap(String meta, HashMap storage) { - this.storage =storage; - this.meta=meta; - } - - private void putLoaded(ChunkCoordIntPair key, NBTTagCompound value) { - storageMeta.put(key, value); - } - - @Override - public NBTTagCompound remove(Object key) { - NBTTagCompound compound=storageMeta.remove(key); - if(compound!=null) { - NBTChunk chunk = storage.get(key); - chunk.data.removeTag(meta); - if(chunk.data.hasNoTags()){ - storage.remove(key); - } - } - return compound; - } - - @Override - public NBTTagCompound put(ChunkCoordIntPair key, NBTTagCompound value) { - NBTChunk chunk = storage.get(key); - if(chunk==null){ - NBTTagCompound base=new NBTTagCompound(); - base.setTag(meta,value); - storage.put(key,new NBTChunk(base,false)); - }else { - chunk.data.setTag(meta,value); - } - return storageMeta.put(key, value); - } - - @Override - public int size() { - return storageMeta.size(); - } - - @Override - public boolean isEmpty() { - return storageMeta.isEmpty(); - } - - @Override - public NBTTagCompound get(Object key) { - return storageMeta.get(key); - } - - @Override - public void clear() { - storageMeta.entrySet().forEach(this::remove); - } - - @Override - public void putAll(Map m) { - m.forEach(this::put); - } - - @Override - public boolean containsKey(Object key) { - return storageMeta.containsKey(key); - } - - @Override - public boolean containsValue(Object value) { - return storageMeta.containsValue(value); - } - - @Override - public Set keySet() { - return storageMeta.keySet(); - } - - @Override - public Collection values() { - return storageMeta.values(); - } - - @Override - public Set> entrySet() { - return storageMeta.entrySet(); - } - } - - private static final class NBTChunk { - private final NBTTagCompound data; - private boolean isLoaded; - - private NBTChunk(NBTTagCompound data, boolean isLoaded) { - if(data==null){ - data=new NBTTagCompound(); - } - this.data = data; - this.isLoaded = isLoaded; - } - } -} diff --git a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java b/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java deleted file mode 100644 index e16f19b681..0000000000 --- a/src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.technus.tectech.mechanics.chunkData; - -import cpw.mods.fml.common.gameevent.TickEvent; -import net.minecraft.nbt.NBTTagCompound; - -import java.util.HashMap; - -public interface ChunkMetaDataHandler { - String getTagName(); - void mergeData(NBTTagCompound target, NBTTagCompound loadedData); - NBTTagCompound createData(); - default void tickClient(HashMap data, TickEvent.ClientTickEvent aEvent){} - default void tickServer(HashMap data, TickEvent.ServerTickEvent event){} - default void tickWorld(HashMap data, TickEvent.WorldTickEvent aEvent){} - default void tickPlayer(HashMap data, TickEvent.PlayerTickEvent aEvent){} - default void tickRender(HashMap data, TickEvent.RenderTickEvent aEvent){} -} - -- cgit From fc5f458c69519ae0d314873c68779a8c503fb176 Mon Sep 17 00:00:00 2001 From: Tec Date: Sun, 14 Jul 2019 11:19:43 +0200 Subject: Add most of pollution injections --- .../tectech/chunkData/ChunkDataHandler.java | 32 ++++++---- .../dreamcraft/DreamCraftRecipeLoader.java | 10 ++++ .../github/technus/tectech/loader/MainLoader.java | 3 +- .../tectech/loader/recipe/BloodyRecipeLoader.java | 68 +++++++++++++++------- .../tectech/mechanics/anomaly/AnomalyHandler.java | 16 ++--- .../core/iElementalInstanceContainer.java | 2 +- .../tectech/thing/block/QuantumGlassBlock.java | 1 + ...GT_MetaTileEntity_Hatch_ElementalContainer.java | 22 ++++--- .../GT_MetaTileEntity_Hatch_OverflowElemental.java | 5 +- .../base/GT_MetaTileEntity_MultiblockBase_EM.java | 57 ++++-------------- .../multi/em_machine/Behaviour_Recycler.java | 21 +++++-- .../em_machine/GT_MetaTileEntity_EM_machine.java | 1 + .../pipe/GT_MetaTileEntity_Pipe_EM.java | 7 +++ 13 files changed, 141 insertions(+), 104 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java index cd6002e7fc..157a1a7057 100644 --- a/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkCoordIntPair; import net.minecraftforge.event.world.ChunkDataEvent; import net.minecraftforge.event.world.ChunkEvent; +import net.minecraftforge.event.world.WorldEvent; import java.util.*; @@ -27,6 +28,24 @@ public class ChunkDataHandler { @SideOnly(Side.CLIENT) private final ArrayList clientSyncHandlers =new ArrayList<>(); + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event){ + int dim=event.world.provider.dimensionId; + dimensionWiseChunkData.computeIfAbsent(dim, m->{ + HashMap map = new HashMap<>(); + for (String meta : metaDataHandlerHashMap.keySet()) { + dimensionWiseMetaChunkData.get(meta).put(dim, new ChunkHashMap(meta, map)); + } + return map; + }); + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event){ + dimensionWiseChunkData.remove(event.world.provider.dimensionId); + dimensionWiseMetaChunkData.forEach((k,v)->v.remove(event.world.provider.dimensionId)); + } + @SideOnly(Side.SERVER) @SubscribeEvent public void handleChunkSaveEvent(ChunkDataEvent.Save event) { @@ -48,8 +67,7 @@ public class ChunkDataHandler { return; } int dimId = event.world.provider.dimensionId; - HashMap dimensionMemory = - dimensionWiseChunkData.computeIfAbsent(dimId, this::createDimensionData); + HashMap dimensionMemory = dimensionWiseChunkData.get(dimId); ChunkCoordIntPair chunkCoordIntPair = event.getChunk().getChunkCoordIntPair(); Set loadedKeys = loadedTag.func_150296_c(); NBTChunk chunkMemory = dimensionMemory.get(chunkCoordIntPair); @@ -172,7 +190,7 @@ public class ChunkDataHandler { if (clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { renderHandlers.add(handler); } - if (clazz.getMethod("requestData", int.class, ChunkCoordIntPair.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + if (clazz.getMethod("requestData", ChunkEvent.Load.class).getDeclaringClass() != ChunkMetaDataHandler.class) { clientSyncHandlers.add(handler); } } catch (NoSuchMethodException e) { @@ -201,14 +219,6 @@ public class ChunkDataHandler { return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()).get(world); } - private HashMap createDimensionData(Integer dim) { - HashMap map = new HashMap<>(); - for (String meta : metaDataHandlerHashMap.keySet()) { - dimensionWiseMetaChunkData.get(meta).put(dim, new ChunkHashMap(meta, map)); - } - return map; - } - public static final class ChunkHashMap implements Map{ private final HashMap storage; private final HashMap storageMeta=new HashMap<>(1024); diff --git a/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java b/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java index dd3ad339af..16636d67cf 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java +++ b/src/main/java/com/github/technus/tectech/compatibility/dreamcraft/DreamCraftRecipeLoader.java @@ -5,6 +5,7 @@ import com.github.technus.tectech.thing.CustomItemList; import com.github.technus.tectech.thing.block.QuantumGlassBlock; import com.github.technus.tectech.thing.metaTileEntity.multi.em_machine.Behaviour_Centrifuge; import com.github.technus.tectech.thing.metaTileEntity.multi.em_machine.Behaviour_ElectromagneticSeparator; +import com.github.technus.tectech.thing.metaTileEntity.multi.em_machine.Behaviour_Recycler; import com.github.technus.tectech.thing.metaTileEntity.multi.em_machine.GT_MetaTileEntity_EM_machine; import cpw.mods.fml.common.Loader; import gregtech.api.enums.GT_Values; @@ -1111,5 +1112,14 @@ public class DreamCraftRecipeLoader implements Runnable { GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_ElectromagneticSeparator(10),getItemContainer("ElectromagneticSeparatorUEV").get(1)); GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_ElectromagneticSeparator(11),getItemContainer("ElectromagneticSeparatorUIV").get(1)); GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_ElectromagneticSeparator(12),getItemContainer("ElectromagneticSeparatorUMV").get(1)); + + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(5),ItemList.Machine_IV_Recycler.get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(6),getItemContainer("RecyclerLuV").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(7),getItemContainer("RecyclerZPM").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(8),getItemContainer("RecyclerUV").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(9),getItemContainer("RecyclerUHV").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(10),getItemContainer("RecyclerUEV").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(11),getItemContainer("RecyclerUIV").get(1)); + GT_MetaTileEntity_EM_machine.registerBehaviour(()->new Behaviour_Recycler(12),getItemContainer("RecyclerUMV").get(1)); } } diff --git a/src/main/java/com/github/technus/tectech/loader/MainLoader.java b/src/main/java/com/github/technus/tectech/loader/MainLoader.java index 473045d665..2272733d5a 100644 --- a/src/main/java/com/github/technus/tectech/loader/MainLoader.java +++ b/src/main/java/com/github/technus/tectech/loader/MainLoader.java @@ -49,7 +49,7 @@ import static com.github.technus.tectech.loader.gui.CreativeTabTecTech.creativeT import static gregtech.api.enums.GT_Values.W; public final class MainLoader { - public static DamageSource microwaving, elementalPollution; + public static DamageSource microwaving, elementalPollution,subspace; private MainLoader(){} @@ -102,6 +102,7 @@ public final class MainLoader { progressBarLoad.step("Add damage types"); microwaving =new DamageSource("microwaving").setDamageBypassesArmor(); elementalPollution =new DamageSource("elementalPollution").setDamageBypassesArmor(); + subspace =new DamageSource("subspace").setDamageBypassesArmor().setDamageIsAbsolute(); LOGGER.info("Damage types addition Done"); progressBarLoad.step("Register Packet Dispatcher"); diff --git a/src/main/java/com/github/technus/tectech/loader/recipe/BloodyRecipeLoader.java b/src/main/java/com/github/technus/tectech/loader/recipe/BloodyRecipeLoader.java index c4ab54694c..bfe015749c 100644 --- a/src/main/java/com/github/technus/tectech/loader/recipe/BloodyRecipeLoader.java +++ b/src/main/java/com/github/technus/tectech/loader/recipe/Blood