diff options
Diffstat (limited to 'src')
4 files changed, 65 insertions, 11 deletions
diff --git a/src/main/java/com/github/technus/tectech/TecTech.java b/src/main/java/com/github/technus/tectech/TecTech.java index cfe8662a21..9d3273f10e 100644 --- a/src/main/java/com/github/technus/tectech/TecTech.java +++ b/src/main/java/com/github/technus/tectech/TecTech.java @@ -80,7 +80,6 @@ public class TecTech { } chunkDataHandler=new ChunkDataHandler(); - chunkDataHandler.registerChunkMetaDataHandler(anomalyHandler=new AnomalyHandler()); FMLCommonHandler.instance().bus().register(chunkDataHandler); MinecraftForge.EVENT_BUS.register(chunkDataHandler); @@ -188,6 +187,8 @@ public class TecTech { @Mod.EventHandler public void PostLoad(FMLPostInitializationEvent PostEvent) { MainLoader.postLoad(); + + chunkDataHandler.registerChunkMetaDataHandler(anomalyHandler=new AnomalyHandler()); } @Mod.EventHandler 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 157a1a7057..c3818009a4 100644 --- a/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkDataHandler.java @@ -18,6 +18,7 @@ public class ChunkDataHandler { 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<>(); @@ -25,8 +26,6 @@ public class ChunkDataHandler { private final ArrayList<ChunkMetaDataHandler> clientHandlers=new ArrayList<>(); @SideOnly(Side.CLIENT) private final ArrayList<ChunkMetaDataHandler> renderHandlers=new ArrayList<>(); - @SideOnly(Side.CLIENT) - private final ArrayList<ChunkMetaDataHandler> clientSyncHandlers =new ArrayList<>(); @SubscribeEvent public void onWorldLoad(WorldEvent.Load event){ @@ -143,6 +142,34 @@ public class ChunkDataHandler { @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()); + } + } + data.dirtyBoys.clear(); + } + work=data.workLoad.get(epoch); + chunkMetaDataHandler.pushPayload(dim,work); + work.clear(); + }); + } worldHandlers.forEach(chunkMetaDataHandler -> chunkMetaDataHandler.tickWorld( dimensionWiseMetaChunkData.get(chunkMetaDataHandler.getTagName()), aEvent)); @@ -179,6 +206,9 @@ public class ChunkDataHandler { if(clazz.getMethod("tickPlayer", HashMap.class, TickEvent.PlayerTickEvent.class).getDeclaringClass()!=ChunkMetaDataHandler.class){ playerHandlers.add(handler); } + if (clazz.getMethod("requestData", ChunkEvent.Load.class).getDeclaringClass() != ChunkMetaDataHandler.class) { + clientSyncHandlers.add(handler); + } } catch (NoSuchMethodException e) { throw new RuntimeException("Cannot register common event handlers!"); } @@ -190,9 +220,6 @@ public class ChunkDataHandler { if (clazz.getMethod("tickRender", HashMap.class, TickEvent.RenderTickEvent.class).getDeclaringClass() != ChunkMetaDataHandler.class) { renderHandlers.add(handler); } - if (clazz.getMethod("requestData", ChunkEvent.Load.class).getDeclaringClass() != ChunkMetaDataHandler.class) { - clientSyncHandlers.add(handler); - } } catch (NoSuchMethodException e) { throw new RuntimeException("Cannot register client event handlers!"); } @@ -222,6 +249,8 @@ public class ChunkDataHandler { public static final class ChunkHashMap implements Map<ChunkCoordIntPair,NBTTagCompound>{ private final HashMap<ChunkCoordIntPair,NBTChunk> storage; private final HashMap<ChunkCoordIntPair,NBTTagCompound> storageMeta=new HashMap<>(1024); + private final HashSet<ChunkCoordIntPair> dirtyBoys=new HashSet<>(1024); + private final ArrayList<ArrayList<ChunkCoordIntPair>> workLoad=new ArrayList<>(); private final String meta; private ChunkHashMap(String meta, HashMap<ChunkCoordIntPair, NBTChunk> storage) { @@ -229,6 +258,10 @@ public class ChunkDataHandler { this.meta=meta; } + public void markForTransmissionToClient(ChunkCoordIntPair chunk){ + dirtyBoys.add(chunk); + } + private void putLoaded(ChunkCoordIntPair key, NBTTagCompound value) { storageMeta.put(key, value); } diff --git a/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java b/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java index 479f8ddb37..543fb080a5 100644 --- a/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java +++ b/src/main/java/com/github/technus/tectech/chunkData/ChunkMetaDataHandler.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.ChunkCoordIntPair; import net.minecraftforge.event.world.ChunkEvent; +import java.util.ArrayList; import java.util.HashMap; public interface ChunkMetaDataHandler { @@ -16,6 +17,12 @@ public interface ChunkMetaDataHandler { @SideOnly(Side.CLIENT) default void requestData(ChunkEvent.Load aEvent){} default void pushData(int world, ChunkCoordIntPair chunk){} + default void pushPayload(int world, ArrayList<ChunkCoordIntPair> chunk){ + chunk.forEach(chunkCoordIntPair -> pushData(world,chunkCoordIntPair)); + } + default int pushPayloadSpreadPeriod(){ + return 20; + } @SideOnly(Side.CLIENT) default void tickRender(HashMap<Integer, ChunkDataHandler.ChunkHashMap> data, TickEvent.RenderTickEvent aEvent){} @SideOnly(Side.CLIENT) 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 69585e29b0..8ef33e7c3f 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,10 +1,11 @@ package com.github.technus.tectech.mechanics.anomaly; 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 com.github.technus.tectech.loader.network.ChunkDataMessage; +import com.github.technus.tectech.loader.network.NetworkDispatcher; +import com.github.technus.tectech.mechanics.elementalMatter.definitions.complex.atom.dAtomDefinition; import cpw.mods.fml.common.gameevent.TickEvent; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import net.minecraft.nbt.NBTTagCompound; @@ -15,6 +16,8 @@ import net.minecraftforge.event.world.ChunkEvent; import java.util.HashMap; public class AnomalyHandler implements ChunkMetaDataHandler { + private static final double MIN_POLLUTION= dAtomDefinition.getSomethingHeavy().getMass()*10000D; + private static final String INTENSITY="intensity"; @Override @@ -53,6 +56,11 @@ public class AnomalyHandler implements ChunkMetaDataHandler { NetworkDispatcher.INSTANCE.sendToDimension(new ChunkDataMessage.ChunkDataData(world,chunk,this),world); } + @Override + public int pushPayloadSpreadPeriod() { + return 100; + } + public void addAnomaly(IGregTechTileEntity iGregTechTileEntity, double amount) { if(iGregTechTileEntity.isServerSide()) { World w = iGregTechTileEntity.getWorld(); @@ -71,10 +79,15 @@ public class AnomalyHandler implements ChunkMetaDataHandler { NBTTagCompound data=new NBTTagCompound(); data.setDouble(INTENSITY,amount); TecTech.chunkDataHandler.putChunkData(this,world,chunk,data); - //todo update client on threshold reach + if(amount>MIN_POLLUTION){ + + } }else { - old.setDouble(INTENSITY,old.getDouble(INTENSITY)+amount); - //todo update client on threshold change + double newAmount=old.getDouble(INTENSITY)+amount; + old.setDouble(INTENSITY,newAmount); + if(newAmount>MIN_POLLUTION){ + + } } } } |