diff options
author | Tec <daniel112092@gmail.com> | 2019-07-13 13:07:04 +0200 |
---|---|---|
committer | Tec <daniel112092@gmail.com> | 2019-07-13 13:07:04 +0200 |
commit | 9d238f79f8caf9add7a7b8fb7ee026765d8ba94e (patch) | |
tree | 5732f9af6155e09061eadb8ef6ea58e5ff377d65 /src/main | |
parent | f59ccc47d72842a731bd220c68b2faee8987aef4 (diff) | |
download | GT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.tar.gz GT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.tar.bz2 GT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.zip |
Chunk data handler
Diffstat (limited to 'src/main')
-rw-r--r-- | src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java | 105 | ||||
-rw-r--r-- | src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java | 2 |
2 files changed, 84 insertions, 23 deletions
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 8bed59ae35..8b5a7c870a 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 @@ -2,6 +2,8 @@ package com.github.technus.tectech.mechanics.chunkData; 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.HashMap; @@ -11,7 +13,8 @@ import java.util.Set; public class ChunkDataHandler { private final String TEC_TAG="TecTechTag"; private final HashMap<Integer,HashMap<ChunkCoordIntPair, NBTChunk>> dimensionWiseChunkData=new HashMap<>(); - private final HashMap<String, ChunkMetaDataHandler> metaDataHandlerHashMap =new HashMap<>(); + private final HashMap<String,HashMap<Integer,HashMap<ChunkCoordIntPair, NBTTagCompound>>> dimensionWiseMetaChunkData=new HashMap<>(); + private final HashMap<String,ChunkMetaDataHandler> metaDataHandlerHashMap =new HashMap<>(); public void handleChunkSaveEvent(ChunkDataEvent.Save event) { HashMap<ChunkCoordIntPair, NBTChunk> dimensionData=dimensionWiseChunkData.get(event.world.provider.dimensionId); @@ -19,49 +22,107 @@ public class ChunkDataHandler { if(chunkData==null) { event.getData().removeTag(TEC_TAG); } else { - event.getData().setTag(TEC_TAG,chunkData.getData()); + chunkData.isLoaded=true; + event.getData().setTag(TEC_TAG,chunkData.data); } } public void handleChunkLoadEvent(ChunkDataEvent.Load event) { - HashMap<ChunkCoordIntPair, NBTChunk> dimensionData= - dimensionWiseChunkData.computeIfAbsent(event.world.provider.dimensionId,k->new HashMap<>(1024)); + NBTTagCompound loadedTag=event.getData().getCompoundTag(TEC_TAG); + if(loadedTag.hasNoTags()){ + return; + } + + int dimId=event.world.provider.dimensionId; + HashMap<ChunkCoordIntPair, NBTChunk> dimensionMemory= + dimensionWiseChunkData.computeIfAbsent(dimId,dim->{ + for (String meta : metaDataHandlerHashMap.keySet()) { + dimensionWiseMetaChunkData.get(meta).put(dim, new HashMap<>(1024)); + } + return new HashMap<>(1024); + }); + ChunkCoordIntPair chunkCoordIntPair=event.getChunk().getChunkCoordIntPair(); - NBTChunk chunkData =dimensionData.get(chunkCoordIntPair); - if(chunkData==null) { - dimensionData.put(chunkCoordIntPair,new NBTChunk(event.getData().getCompoundTag(TEC_TAG),true)); - }else if(!chunkData.isLoaded) { - chunkData.isLoaded=true; - Set<String> tags=new HashSet<>(); - tags.addAll(chunkData.getData().func_150296_c()); - tags.addAll(event.getData().func_150296_c()); - NBTTagCompound compound=new NBTTagCompound(); + NBTChunk chunkMemory =dimensionMemory.get(chunkCoordIntPair); + Set<String> loadedKeys=loadedTag.func_150296_c(); + + if(chunkMemory==null) { + chunkMemory=new NBTChunk(/*(NBTTagCompound)*/loadedTag/*.copy()*/,true); + for (String s :loadedKeys) { + if (metaDataHandlerHashMap.containsKey(s)) { + dimensionWiseMetaChunkData.get(s).get(dimId).put(chunkCoordIntPair,chunkMemory.data.getCompoundTag(s)); + } else { + throw new RuntimeException("Missing meta handler!" + s); + } + } + dimensionMemory.put(chunkCoordIntPair,chunkMemory); + }else if(!chunkMemory.isLoaded) { + chunkMemory.isLoaded=true; + + Set<String> tagsDuplicated=new HashSet(loadedKeys); + tagsDuplicated.retainAll(chunkMemory.data.func_150296_c()); + + if (tagsDuplicated.isEmpty()) { + for (String s:loadedKeys) { + if (metaDataHandlerHashMap.containsKey(s)) { + chunkMemory.data.setTag(s,loadedTag.getTag(s)/*.copy()*/); + dimensionWiseMetaChunkData.get(s).get(dimId).put(chunkCoordIntPair,chunkMemory.data.getCompoundTag(s)); + } else { + throw new RuntimeException("Missing meta handler!" + s); + } + } + } else { + for (String s : loadedKeys) { + if(tagsDuplicated.contains(s)){ + ChunkMetaDataHandler metaDataHandler = metaDataHandlerHashMap.get(s); + if (metaDataHandler == null) { + throw new RuntimeException("Missing meta handler!" + s); + } else { + metaDataHandler.mergeData( + chunkMemory.data.getCompoundTag(s), + loadedTag.getCompoundTag(s)); + } + }else { + if (metaDataHandlerHashMap.containsKey(s)) { + chunkMemory.data.setTag(s,loadedTag.getTag(s)); + dimensionWiseMetaChunkData.get(s).get(dimId).put(chunkCoordIntPair,chunkMemory.data.getCompoundTag(s)); + } else { + throw new RuntimeException("Missing meta handler!" + s); + } + } + } + } } } public void onServerStarting() { dimensionWiseChunkData.clear(); + dimensionWiseMetaChunkData.clear(); } public void registerChunkMetaDataHandler(ChunkMetaDataHandler handler){ metaDataHandlerHashMap.put(handler.getTagName(),handler); + dimensionWiseMetaChunkData.put(handler.getTagName(),new HashMap<>()); } - public static class NBTChunk { + public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, World world, Chunk chunk){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world.provider.dimensionId).get(chunk.getChunkCoordIntPair()); + } + + public NBTTagCompound getChunkData(ChunkMetaDataHandler handler, Integer world, ChunkCoordIntPair chunk){ + return dimensionWiseMetaChunkData.get(handler.getTagName()).get(world).get(chunk); + } + + private static 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; } - - public boolean isLoaded(){ - return isLoaded; - } - - public NBTTagCompound getData(){ - return data; - } } } 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 baa7bfba13..369a623998 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 @@ -4,7 +4,7 @@ import net.minecraft.nbt.NBTTagCompound; public interface ChunkMetaDataHandler { String getTagName(); - void mergeData(NBTTagCompound inMemory,NBTTagCompound loaded,NBTTagCompound result); + void mergeData(NBTTagCompound target, NBTTagCompound loadedData); NBTTagCompound createData(); } |