diff options
| author | Tec <daniel112092@gmail.com> | 2019-07-14 22:24:16 +0200 |
|---|---|---|
| committer | Tec <daniel112092@gmail.com> | 2019-07-14 22:24:16 +0200 |
| commit | c3388bf4fb0acad4ebdda64d178453edcc3cfeb8 (patch) | |
| tree | 93df4649eea7f722f779df9208fa23b2fcc50604 | |
| parent | 1bbbbcaea14966d113a3f0230228e3f5ccb9d053 (diff) | |
| download | GT5-Unofficial-c3388bf4fb0acad4ebdda64d178453edcc3cfeb8.tar.gz GT5-Unofficial-c3388bf4fb0acad4ebdda64d178453edcc3cfeb8.tar.bz2 GT5-Unofficial-c3388bf4fb0acad4ebdda64d178453edcc3cfeb8.zip | |
Pollution works?
44 files changed, 388 insertions, 263 deletions
diff --git a/src/main/java/com/github/technus/tectech/Util.java b/src/main/java/com/github/technus/tectech/Util.java index 7746d8dd41..53e9627187 100644 --- a/src/main/java/com/github/technus/tectech/Util.java +++ b/src/main/java/com/github/technus/tectech/Util.java @@ -2,7 +2,7 @@ package com.github.technus.tectech; import com.github.technus.tectech.thing.casing.TT_Container_Casings; import com.github.technus.tectech.thing.metaTileEntity.IFrontRotation; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.HatchAdder; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IHatchAdder; import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.GregTech_API; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; @@ -396,7 +396,7 @@ public final class Util { String[][] structure,//0-9 casing, +- air no air, A... ignore 'A'-CHAR-1 blocks Block[] blockType,//use numbers 0-9 for casing types byte[] blockMeta,//use numbers 0-9 for casing types - HatchAdder[] addingMethods, + IHatchAdder[] addingMethods, short[] casingTextures, Block[] blockTypeFallback,//use numbers 0-9 for casing types byte[] blockMetaFallback,//use numbers 0-9 for casing types 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 c3818009a4..f7b3895a80 100644 --- a/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java @@ -17,36 +17,27 @@ public class ChunkDataHandler { private final String BASE_TAG_NAME ="TecTechData"; private final HashMap<Integer,HashMap<ChunkCoordIntPair, NBTChunk>> dimensionWiseChunkData=new HashMap<>(); private final HashMap<String,HashMap<Integer,ChunkHashMap >> dimensionWiseMetaChunkData=new HashMap<>(); - private final HashMap<String,ChunkMetaDataHandler> metaDataHandlerHashMap =new HashMap<>(); - private final ArrayList<ChunkMetaDataHandler> clientSyncHandlers =new ArrayList<>(); - private final ArrayList<ChunkMetaDataHandler> serverHandlers=new ArrayList<>(); - private final ArrayList<ChunkMetaDataHandler> worldHandlers=new ArrayList<>(); - private final ArrayList<ChunkMetaDataHandler> playerHandlers=new ArrayList<>(); - @SideOnly(Side.CLIENT) - private final ArrayList<ChunkMetaDataHandler> clientHandlers=new ArrayList<>(); - @SideOnly(Side.CLIENT) - private final ArrayList<ChunkMetaDataHandler> renderHandlers=new ArrayList<>(); + private final HashMap<String, IChunkMetaDataHandler> metaDataHandlerHashMap =new HashMap<>(); + private final ArrayList<IChunkMetaDataHandler> clientSyncHandlers =new ArrayList<>(); + private final ArrayList<IChunkMetaDataHandler> serverHandlers=new ArrayList<>(); + private final ArrayList<IChunkMetaDataHandler> worldHandlers=new ArrayList<>(); + private final ArrayList<IChunkMetaDataHandler> playerHandlers=new ArrayList<>(); + private final ArrayList<IChunkMetaDataHandler> clientHandlers=new ArrayList<>(); + private final ArrayList<IChunkMetaDataHandler> renderHandlers=new ArrayList<>(); @SubscribeEvent public void onWorldLoad(WorldEvent.Load event){ int dim=event.world.provider.dimensionId; dimensionWiseChunkData.computeIfAbsent(dim, m->{ HashMap<ChunkCoordIntPair, NBTChunk> map = new HashMap<>(); - for (String meta : metaDataHandlerHashMap.keySet()) { - dimensionWiseMetaChunkData.get(meta).put(dim, new ChunkHashMap(meta, map)); + for (Map.Entry<String,IChunkMetaDataHandler> meta : metaDataHandlerHashMap.entrySet()) { + dimensionWiseMetaChunkData.get(meta.getKey()).put(dim, new ChunkHashMap(meta.getValue(), 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) { HashMap<ChunkCoordIntPair, NBTChunk> dimensionData = dimensionWiseChunkData.get(event.world.provider.dimensionId); NBTChunk chunkData = dimensionData != null ? dimensionData.get(event.getChunk().getChunkCoordIntPair()) : null; @@ -58,7 +49,6 @@ public class ChunkDataHandler { } } - @SideOnly(Side.SERVER) @SubscribeEvent public void handleChunkLoadEvent(ChunkDataEvent.Load event) { NBTTagCompound loadedTag = event.getData().getCompoundTag(BASE_TAG_NAME); @@ -140,36 +130,35 @@ public class ChunkDataHandler { dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); } + @SideOnly(Side.SERVER) @SubscribeEvent public void onWorldTickEvent(TickEvent.WorldTickEvent aEvent) { - if(aEvent.side.isServer()){ - int dim=aEvent.world.provider.dimensionId; - clientSyncHandlers.forEach(chunkMetaDataHandler -> { - ChunkHashMap data=dimensionWiseMetaChunkData - .get(chunkMetaDataHandler.getTagName()).get(dim); - int cycle=chunkMetaDataHandler.pushPayloadSpreadPeriod(); - int epoch=(int)(aEvent.world.getTotalWorldTime()%cycle); - ArrayList<ChunkCoordIntPair> work; - if(epoch==0){ - int per=data.dirtyBoys.size()/cycle; - int mod=data.dirtyBoys.size()%cycle; - Iterator<ChunkCoordIntPair> iter=data.dirtyBoys.iterator(); - for (int periodWork = 0; periodWork < cycle; periodWork++) { - work=data.workLoad.get(periodWork); - for (int i = 0; i < per; i++) { - work.add(iter.next()); - } - if(periodWork<mod){ - work.add(iter.next()); - } + int dim=aEvent.world.provider.dimensionId; + clientSyncHandlers.forEach(chunkMetaDataHandler -> { + ChunkHashMap data=dimensionWiseMetaChunkData + .get(chunkMetaDataHandler.getTagName()).get(dim); + int cycle=chunkMetaDataHandler.pushPayloadSpreadPeriod(); + int epoch=(int)(aEvent.world.getTotalWorldTime()%cycle); + ArrayList<ChunkCoordIntPair> work; + if(epoch==0){ + int per=data.dirtyBoys.size()/cycle; + int mod=data.dirtyBoys.size()%cycle; + Iterator<ChunkCoordIntPair> iter=data.dirtyBoys.iterator(); + for (int periodWork = 0; periodWork < cycle; periodWork++) { + work=data.workLoad.get(periodWork); + for (int i = 0; i < per; i++) { + work.add(iter.next()); + } + if(periodWork<mod){ + work.add(iter.next()); } - data.dirtyBoys.clear(); } - work=data.workLoad.get(epoch); - chunkMetaDataHandler.pushPayload(dim,work); - work.clear(); - }); - } + data.dirtyBoys.clear(); + } + work=data.workLoad.get(epoch); + chunkMetaDataHandler.pushPayload(dim,work); + work.clear(); + }); worldHandlers.forEach(chunkMetaDataHandler -> chunkMetaDataHandler.tickWorld( dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); @@ -188,36 +177,42 @@ public class ChunkDataHandler { dimensionWiseMetaChunkData.forEach((k,v)->v.clear()); } - public ChunkMetaDataHandler getChunkMetaDataHandler(String s){ + public IChunkMetaDataHandler getChunkMetaDataHandler(String s){ return metaDataHandlerHashMap.get(s); } - public void registerChunkMetaDataHandler(ChunkMetaDataHandler handler){ + public void registerChunkMetaDataHandler(IChunkMetaDataHandler 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){ + if(clazz.getMethod("tickServer", HashMap.class, TickEvent.ServerTickEvent.class).getDeclaringClass()!= IChunkMetaDataHandler.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){ + if(clazz.getMethod("tickPlayer", HashMap.class, TickEvent.PlayerTickEvent.class).getDeclaringClass()!= IChunkMetaDataHandler.class){ playerHandlers.add(handler); } - if (clazz.getMethod("requestData", ChunkEvent.Load.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + if (clazz.getMethod("requestData", ChunkEvent.Load.class).getDeclaringClass() != IChunkMetaDataHandler.class) { clientSyncHandlers.add(handler); } } catch (NoSuchMethodException e) { throw new RuntimeException("Cannot register common event handlers!"); } + if(FMLCommonHandler.instance().getEffectiveSide().isServer()) { + try { + if(clazz.getMethod("tickWorld", HashMap.class, TickEvent.WorldTickEvent.class).getDeclaringClass()!= IChunkMetaDataHandler.class){ + worldHandlers.add(handler); + } + } catch (NoSuchMethodException e) { + throw new RuntimeException("Cannot register client event handlers!"); + } + } if(FMLCommonHandler.instance().getEffectiveSide().isClient()) { try { - if (clazz.getMethod("tickClient", HashMap.class, TickEvent.ClientTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + if (clazz.getMethod("tickClient", HashMap.class, TickEvent.ClientTickEvent.class).getDeclaringClass() != IChunkMetaDataHandler.class) { clientHandlers.add(handler); } - if (clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + if (clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass() != IChunkMetaDataHandler.class) { renderHandlers.add(handler); } } catch (NoSuchMethodException e) { @@ -226,23 +221,28 @@ public class ChunkDataHandler { } } - public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ + public NBTTagCompound removeChunkData(IChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world).remove(chunk); + } + + public NBTTagCompound getChunkData(IChunkMetaDataHandler 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){ + public NBTTagCompound putChunkData(IChunkMetaDataHandler 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){ + + public NBTTagCompound createIfAbsentChunkData(IChunkMetaDataHandler handler, int world, ChunkCoordIntPair chunk){ return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world) .computeIfAbsent(chunk,chunkCoordIntPair -> handler.createData()); } - public HashMap<Integer,ChunkHashMap> getChunkData(ChunkMetaDataHandler chunkMetaDataHandler){ + public HashMap<Integer,ChunkHashMap> getChunkData(IChunkMetaDataHandler chunkMetaDataHandler){ return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()); } - public ChunkHashMap getChunkData(ChunkMetaDataHandler chunkMetaDataHandler,int world){ + public ChunkHashMap getChunkData(IChunkMetaDataHandler chunkMetaDataHandler, int world){ return dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()).get(world); } @@ -253,9 +253,12 @@ public class ChunkDataHandler { private final ArrayList<ArrayList<ChunkCoordIntPair>> workLoad=new ArrayList<>(); private final String meta; - private ChunkHashMap(String meta, HashMap<ChunkCoordIntPair, NBTChunk> storage) { + private ChunkHashMap(IChunkMetaDataHandler meta, HashMap<ChunkCoordIntPair, NBTChunk> storage) { this.storage =storage; - this.meta=meta; + this.meta=meta.getTagName(); + for (int i = 0; i < meta.pushPayloadSpreadPeriod(); i++) { + workLoad.add(new ArrayList<>(128)); + } } public void markForTransmissionToClient(ChunkCoordIntPair chunk){ diff --git a/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java b/src/main/java/com/github/technus/tectech/chunkData/IChunkMetaDataHandler.java index 543fb080a5..b904f09f33 100644 --- a/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java +++ b/src/main/java/com/github/technus/tectech/chunkData/IChunkMetaDataHandler.java @@ -10,13 +10,15 @@ import net.minecraftforge.event.world.ChunkEvent; import java.util.ArrayList; import java.util.HashMap; -public interface ChunkMetaDataHandler { +public interface IChunkMetaDataHandler { String getTagName(); void mergeData(NBTTagCompound target, NBTTagCompound loadedData); NBTTagCompound createData(); @SideOnly(Side.CLIENT) default void requestData(ChunkEvent.Load aEvent){} + @SideOnly(Side.SERVER) default void pushData(int world, ChunkCoordIntPair chunk){} + @SideOnly(Side.SERVER) default void pushPayload(int world, ArrayList<ChunkCoordIntPair> chunk){ chunk.forEach(chunkCoordIntPair -> pushData(world,chunkCoordIntPair)); } @@ -28,6 +30,7 @@ public interface ChunkMetaDataHandler { @SideOnly(Side.CLIENT) default void tickClient(HashMap<Integer, ChunkDataHandler.ChunkHashMap> data, TickEvent.ClientTickEvent aEvent){} default void tickServer(HashMap<Integer, ChunkDataHandler.ChunkHashMap> data, TickEvent.ServerTickEvent event){} + @SideOnly(Side.SERVER) default void tickWorld(HashMap<Integer, ChunkDataHandler.ChunkHashMap> data, TickEvent.WorldTickEvent aEvent){} default void tickPlayer(HashMap<Integer, ChunkDataHandler.ChunkHashMap> data, TickEvent.PlayerTickEvent aEvent){} } diff --git a/src/main/java/com/github/technus/tectech/chunkData/WorldData.java b/src/main/java/com/github/technus/tectech/chunkData/WorldData.java new file mode 100644 index 0000000000..42641a015e --- /dev/null +++ b/src/main/java/com/github/technus/tectech/chunkData/WorldData.java @@ -0,0 +1,52 @@ +package com.github.technus.tectech.chunkData; + +import net.minecraft.world.ChunkCoordIntPair; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +import java.util.Objects; + +public final class WorldData { + private final World world; + private final Chunk chunk; + private final ChunkCoordIntPair coordIntPair; + + public WorldData(World world, Chunk data) { + this.world = world; + this.chunk = data; + coordIntPair=data.getChunkCoordIntPair(); + } + + public WorldData(World world, ChunkCoordIntPair data) { + this.world = world; + this.coordIntPair = data; + chunk= world.getChunkFromChunkCoords(data.chunkXPos,data.chunkZPos); + } + + public World getWorld() { + return world; + } + + public Chunk getChunk() { + return chunk; + } + + public ChunkCoordIntPair getCoordIntPair() { + return coordIntPair; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + WorldData worldData = (WorldData) o; + return world.provider.dimensionId==worldData.world.provider.dimensionId && + coordIntPair.chunkXPos==worldData.coordIntPair.chunkXPos && + coordIntPair.chunkZPos==worldData.coordIntPair.chunkXPos; + } + + @Override + public int hashCode() { + return Objects.hash(world.provider.dimensionId, coordIntPair); + } +} diff --git a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaDequantizer.java b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaDequantizer.java index 6cec48c41f..3d64ceee62 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaDequantizer.java +++ b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaDequantizer.java @@ -10,7 +10,7 @@ import com.github.technus.tectech.thing.casing.TT_Container_Casings; import com.github.technus.tectech.thing.metaTileEntity.IConstructable; import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_quantizer; import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.HatchAdder; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IHatchAdder; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; @@ -46,7 +46,7 @@ public class GT_MetaTileEntity_EM_essentiaDequantizer extends GT_MetaTileEntity_ }; private static final Block[] blockType = new Block[]{QuantumGlassBlock.INSTANCE, sBlockCasingsTT, sBlockCasingsTT, sBlockCasingsTT}; private static final byte[] blockMeta = new byte[]{0,0,4,8}; - private final HatchAdder[] addingMethods = new HatchAdder[]{ + private final IHatchAdder[] addingMethods = new IHatchAdder[]{ this::addClassicToMachineList, this::addElementalInputToMachineList, this::addElementalMufflerToMachineList}; diff --git a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaQuantizer.java b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaQuantizer.java index fd56305d5f..9bd16c959b 100644 --- a/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaQuantizer.java +++ b/src/main/java/com/github/technus/tectech/compatibility/thaumcraft/thing/metaTileEntity/multi/GT_MetaTileEntity_EM_essentiaQuantizer.java @@ -10,7 +10,7 @@ import com.github.technus.tectech.thing.casing.TT_Container_Casings; import com.github.technus.tectech.thing.metaTileEntity.IConstructable; import com.github.technus.tectech.thing.metaTileEntity.multi.GT_MetaTileEntity_EM_quantizer; import com.github.technus.tectech.thing.metaTileEntity.multi.base.GT_MetaTileEntity_MultiblockBase_EM; -import com.github.technus.tectech.thing.metaTileEntity.multi.base.HatchAdder; +import com.github.technus.tectech.thing.metaTileEntity.multi.base.IHatchAdder; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; @@ -46,7 +46,7 @@ public class GT_MetaTileEntity_EM_essentiaQuantizer extends GT_MetaTileEntity_Mu }; private static final Block[] blockType = new Block[]{QuantumGlassBlock.INSTANCE, sBlockCasingsTT, sBlockCasingsTT, sBlockCasingsTT}; private static final byte[] blockMeta = new byte[]{0,4,0,8}; - private final HatchAdder[] addingMethods = new HatchAdder[]{ + private final IHatchAdder[] addingMethods = new IHatchAdder[]{ this::addClassicToMachineList, this::addElementalOutputToMachineList, this::addElementalMufflerToMachineList}; 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 index daa6195944..15c936191a 100644 --- a/src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java +++ b/src/main/java/com/github/technus/tectech/loader/network/ChunkDataMessage.java @@ -2,7 +2,7 @@ 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 com.github.technus.tectech.chunkData.IChunkMetaDataHandler; import cpw.mods.fml.common.network.ByteBufUtils; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.MessageContext; @@ -19,7 +19,7 @@ public class ChunkDataMessage implements IMessage { int worldId; ChunkCoordIntPair chunk; NBTTagCompound data; - ChunkMetaDataHandler handler; + IChunkMetaDataHandler handler; public ChunkDataMessage(){} @@ -53,7 +53,7 @@ public class ChunkDataMessage implements IMessage { public static class ChunkDataQuery extends ChunkDataMessage { public ChunkDataQuery() { } - public ChunkDataQuery(ChunkEvent.Load aEvent,ChunkMetaDataHandler handler) { + public ChunkDataQuery(ChunkEvent.Load aEvent, IChunkMetaDataHandler handler) { |
