aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com
diff options
context:
space:
mode:
authorTec <daniel112092@gmail.com>2019-07-13 13:07:04 +0200
committerTec <daniel112092@gmail.com>2019-07-13 13:07:04 +0200
commit9d238f79f8caf9add7a7b8fb7ee026765d8ba94e (patch)
tree5732f9af6155e09061eadb8ef6ea58e5ff377d65 /src/main/java/com
parentf59ccc47d72842a731bd220c68b2faee8987aef4 (diff)
downloadGT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.tar.gz
GT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.tar.bz2
GT5-Unofficial-9d238f79f8caf9add7a7b8fb7ee026765d8ba94e.zip
Chunk data handler
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkDataHandler.java105
-rw-r--r--src/main/java/com/github/technus/tectech/mechanics/chunkData/ChunkMetaDataHandler.java2
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();
}