From 1126306c2c5c8ab8aa75d04b21beb6e533e4d374 Mon Sep 17 00:00:00 2001 From: Tara Date: Sat, 7 Jan 2023 01:30:54 -0700 Subject: [PATCH] Finish fixing bugs and downgrading --- src/main/java/dev/zontreck/otemod/OTEMod.java | 4 +- .../zontreck/otemod/antigrief/Handler.java | 133 ------- .../otemod/antigrief/HealerManager.java | 67 ---- .../otemod/antigrief/HealerQueue.java | 327 ------------------ .../otemod/antigrief/HealerWorker.java | 198 ----------- .../zontreck/otemod/antigrief2/Healer.java | 68 ---- .../handlers/WorldEventHandler.java | 37 -- .../otemod/zschem/BlockContainerList.java | 2 +- .../zontreck/otemod/zschem/BlockSaver.java | 5 - .../zontreck/otemod/zschem/EventHandler.java | 54 ++- .../dev/zontreck/otemod/zschem/WorldProp.java | 116 +++++++ 11 files changed, 171 insertions(+), 840 deletions(-) delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief/Handler.java delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief/HealerManager.java delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief/HealerQueue.java delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief/HealerWorker.java delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief2/Healer.java delete mode 100644 src/main/java/dev/zontreck/otemod/antigrief2/handlers/WorldEventHandler.java create mode 100644 src/main/java/dev/zontreck/otemod/zschem/WorldProp.java diff --git a/src/main/java/dev/zontreck/otemod/OTEMod.java b/src/main/java/dev/zontreck/otemod/OTEMod.java index a0d779f..4dd3fb6 100644 --- a/src/main/java/dev/zontreck/otemod/OTEMod.java +++ b/src/main/java/dev/zontreck/otemod/OTEMod.java @@ -38,8 +38,6 @@ import net.minecraftforge.registries.ForgeRegistries; import org.slf4j.Logger; import dev.zontreck.libzontreck.chat.ChatColor; -import dev.zontreck.otemod.antigrief.HealerManager; -import dev.zontreck.otemod.antigrief.HealerQueue; import dev.zontreck.otemod.blocks.ModBlocks; import dev.zontreck.otemod.chat.ChatServerOverride; import dev.zontreck.otemod.commands.CommandRegistry; @@ -155,7 +153,7 @@ public class OTEMod try { OTEMod.DB = new Database(this); OTEMod.ALIVE=true; - HealerQueue.Initialize(); // Set up the queue + //HealerQueue.Initialize(); // Set up the queue // Validate that the database has been established and that tables exist diff --git a/src/main/java/dev/zontreck/otemod/antigrief/Handler.java b/src/main/java/dev/zontreck/otemod/antigrief/Handler.java deleted file mode 100644 index 980e655..0000000 --- a/src/main/java/dev/zontreck/otemod/antigrief/Handler.java +++ /dev/null @@ -1,133 +0,0 @@ -package dev.zontreck.otemod.antigrief; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; - -import dev.zontreck.libzontreck.vectors.Vector3; -import dev.zontreck.libzontreck.vectors.WorldPosition; -import dev.zontreck.otemod.OTEMod; -import dev.zontreck.otemod.configs.OTEServerConfig; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.MinecraftServer; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.Entity; -import net.minecraft.world.level.BlockEventData; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; -import net.minecraftforge.event.entity.item.ItemEvent; -import net.minecraftforge.event.level.BlockEvent; -import net.minecraftforge.event.level.ChunkDataEvent; -import net.minecraftforge.event.level.ExplosionEvent; -import net.minecraftforge.event.level.BlockEvent.NeighborNotifyEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.common.Mod.EventBusSubscriber; - -@EventBusSubscriber(modid = OTEMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE) -public class Handler -{ - private static final String EXPLOSION_HEAL_TAG = "OTEEH"; - - - /*@OnlyIn(Dist.DEDICATED_SERVER) - @SubscribeEvent - public void onChunkLoad(final ChunkDataEvent.Load event) - { - final CompoundTag EHTag = event.getData().getCompound(EXPLOSION_HEAL_TAG); - if(!EHTag.isEmpty()) - { - final CompoundTag healer = EHTag.getCompound("healer"); - if(!healer.isEmpty()){ - // This would re-queue the healer - } - } - }*/ - - @OnlyIn(Dist.DEDICATED_SERVER) - @SubscribeEvent - public void onDetonation(ExplosionEvent.Detonate event) - { - ServerLevel level = (ServerLevel)event.getLevel(); - - Entity exploder = event.getExplosion().getExploder(); - - if(exploder==null)return ; // TODO: Make this check config - - final Collection affectedBlocks = buildBlocks(level, event.getAffectedBlocks()); - Collection toHeal = new ArrayList(affectedBlocks.size()); - - Block tnt = Blocks.TNT; - - for(final StoredBlock data : affectedBlocks) - { - // Check an exclusions list - if(!OTEServerConfig.EXCLUDE_DIMENSIONS.get().contains(data.getWorldPosition().Dimension)) - if(!data.getState().is(tnt)) - toHeal.add(data); - } - - // Process Block Entities - - for(final StoredBlock sb : toHeal) - { - if(sb.getState().hasBlockEntity()) - { - BlockEntity be = level.getBlockEntity(sb.getPos()); - if(be != null){ - sb.setBlockEntity(be); - } - } - } - - // Remove the existing blocks from the world to prevent item duplication - // Begin - for(StoredBlock data : toHeal) - { - if(data.getBlockEntity()!=null) - data.getWorldPosition().getActualDimension().removeBlockEntity(data.getPos()); - - data.getWorldPosition().getActualDimension().destroyBlock(data.getPos(), false); - } - - // Add to the healing queue - List mainList = new ArrayList<>(); - mainList.addAll(toHeal); - mainList = HealerQueue.removeSame(mainList); - - HealerWorker work = new HealerWorker(mainList); - HealerQueue.ManagerInstance.registerWorker(work); - Thread tx = new Thread(work); - tx.start(); - - HealerQueue.ToHeal.addAll(mainList); - - - HealerQueue.Pass=0; - - HealerQueue.Shuffle(); - - } - - private Collection buildBlocks(ServerLevel level, Collection positions) - { - Collection healables = new LinkedList(); - for(final BlockPos pos : positions) - { - final BlockState state = level.getBlockState(pos); - StoredBlock sb = new StoredBlock(pos, state, level); - - if(state !=null) - healables.add(sb); - - } - - return healables; - } -} diff --git a/src/main/java/dev/zontreck/otemod/antigrief/HealerManager.java b/src/main/java/dev/zontreck/otemod/antigrief/HealerManager.java deleted file mode 100644 index b2d934a..0000000 --- a/src/main/java/dev/zontreck/otemod/antigrief/HealerManager.java +++ /dev/null @@ -1,67 +0,0 @@ -package dev.zontreck.otemod.antigrief; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import dev.zontreck.otemod.OTEMod; -import dev.zontreck.otemod.configs.OTEServerConfig; - -public class HealerManager implements Runnable -{ - private List Workers = new ArrayList<>(); - public HealerManager(){ - - } - public void registerWorker(HealerWorker worker) - { - Workers.add(worker); - } - - public void deregisterWorker(HealerWorker worker) - { - Workers.remove(worker); - } - @Override - public void run(){ - boolean skipWait=false; - int skipCount=0; - long lastSave = 0; - final long saveInterval = (2*60); // Every 2 minutes - boolean lastWait = false; - // Heal pass 1 is set all positions to bedrock - // Pass 2 is assert all solid blocks (Not air) - // Pass 3 is to set the air blocks and remove bedrock - - - while(OTEMod.ALIVE) - { - try{ - try{ - if(!skipWait) Thread.sleep(OTEServerConfig.HEALER_TIMER.get()); - }catch(Exception E){} - - if(lastWait != OTEMod.HEALER_WAIT) OTEMod.LOGGER.info("Healer Wait Flag was Toggled"); - lastWait = OTEMod.HEALER_WAIT; - if(OTEMod.HEALER_WAIT) continue; // Wait to process until import completes - - if(!OTEMod.ALIVE) break; // Begin tear down, server has shut down - - for (HealerWorker healerWorker : Workers) { - healerWorker.doTick=true; - } - - - }catch(Exception e){} - } - - OTEMod.LOGGER.info("Tearing down healer jobs. Saving remaining queue, stand by..."); - try { - HealerQueue.dump(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - OTEMod.LOGGER.info("Finished tearing down Healer - Good bye"); - } -} diff --git a/src/main/java/dev/zontreck/otemod/antigrief/HealerQueue.java b/src/main/java/dev/zontreck/otemod/antigrief/HealerQueue.java deleted file mode 100644 index 5a8c954..0000000 --- a/src/main/java/dev/zontreck/otemod/antigrief/HealerQueue.java +++ /dev/null @@ -1,327 +0,0 @@ -package dev.zontreck.otemod.antigrief; - -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -import dev.zontreck.libzontreck.vectors.Vector3; -import dev.zontreck.libzontreck.vectors.WorldPosition; -import dev.zontreck.otemod.OTEMod; -import dev.zontreck.otemod.configs.OTEServerConfig; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.NbtIo; -import net.minecraft.nbt.NbtUtils; -import net.minecraft.nbt.Tag; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.fml.loading.FMLConfig; -import net.minecraftforge.fml.loading.FMLPaths; - -public class HealerQueue { - // Healer Queue's data source is a NBT File in the config folder - public static final String HealerQueueFile = "OTEHealerLastQueue.nbt"; - public static final String HealerQueueDebugFile = "OTEHealerLastQueue.snbt"; - - public static List ToHeal = new ArrayList(); // Air and Solid Blocks get set to bedrock initially - - public static int Pass = 0; - - - private static List LastToHeal = new ArrayList(); - private static int LastPass = 0; - - public static HealerManager ManagerInstance=null; - - - public static Path getPath() - { - - Path configDir = FMLPaths.GAMEDIR.get().resolve(FMLConfig.defaultConfigPath()); - Path configFile = null; - if(OTEServerConfig.DEBUG_HEALER.get()) - { - configFile = configDir.resolve(HealerQueue.HealerQueueDebugFile); - - }else { - configFile = configDir.resolve(HealerQueue.HealerQueueFile); - } - - //OTEMod.LOGGER.info("OTE HEALER TEMPORARY FILE: "+configFile.toFile().getAbsolutePath()); - return configFile; - } - - public static StoredBlock locateHighestBlock(List list) - { - StoredBlock sb = null; - double currentY = 0; - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.getWorldPosition().Position.y > currentY) - { - currentY = storedBlock.getWorldPosition().Position.y; - sb=storedBlock; - } - } - - return sb; - } - - public static StoredBlock locateLowestBlock(List list) - { - StoredBlock sb = null; - double currentY = 300; - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.getWorldPosition().Position.y < currentY) - { - currentY = storedBlock.getWorldPosition().Position.y; - sb=storedBlock; - } - } - - return sb; - } - - public static StoredBlock locateLowestBlockForWorker(List list, HealerWorker worker) - { - StoredBlock sb = null; - double currentY = 300; - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.getWorldPosition().Position.y < currentY && storedBlock.isClaimedBy(worker)) - { - currentY = storedBlock.getWorldPosition().Position.y; - sb=storedBlock; - } - } - - return sb; - } - - public static List getBlocksByWorker(HealerWorker worker) - { - List blocks = new ArrayList<>(); - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.isClaimedBy(worker))blocks.add(storedBlock); - } - return blocks; - } - - public static StoredBlock getExact(WorldPosition wp) - { - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.getWorldPosition().same(wp)) - { - return storedBlock; - } - } - - return null; - } - - - public static boolean HasValidatePosition(BlockPos pos, ServerLevel lvl) - { - Vector3 realPos = new Vector3(pos); - WorldPosition real = new WorldPosition(realPos, lvl); - - for (StoredBlock storedBlock : ToHeal) { - if(storedBlock.getWorldPosition().same(real)) - { - return true; - } - } - - return false; - } - - public static void Initialize() - { - Thread tx = new Thread(new Runnable(){ - public void run(){ - if(OTEServerConfig.DEBUG_HEALER.get()) - { - // Load the sNBT file - Path configFile = getPath(); - File x = configFile.toFile(); - String FinalStr = ""; - try { - BufferedReader br = new BufferedReader(new FileReader(x)); - while(br.ready()) - { - FinalStr += br.readLine(); - } - br.close(); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch(IOException e) - { - e.printStackTrace(); - } - - try { - HealerQueue.deserialize(NbtUtils.snbtToStructure(FinalStr)); - } catch (Exception e) { - e.printStackTrace(); - } - } else { - // Load from normal NBT - Path configFile = getPath(); - File x = configFile.toFile(); - // Load binary - try { - CompoundTag tag = NbtIo.readCompressed(x); - HealerQueue.deserialize(tag); - } catch (IOException e) { - e.printStackTrace(); - } - } - OTEMod.HEALER_WAIT=false; - } - }); - tx.start(); - - // Set up the HealerManager / Runner - ManagerInstance = new HealerManager(); - Thread txx = new Thread(ManagerInstance); - txx.start(); - - HealerWorker worker = new HealerWorker(ToHeal); - Thread txxx = new Thread(worker); - ManagerInstance.registerWorker(worker); - txxx.start(); - - OTEMod.HEALER_THREAD = txx; - } - - public static CompoundTag serialize() - { - CompoundTag tag = new CompoundTag(); - // Save entire list - ListTag lst = new ListTag(); - for(final StoredBlock block : HealerQueue.ToHeal) - { - lst.add(block.serialize()); - } - - tag.put("queue", lst); - tag.putInt("pass", HealerQueue.Pass); - - //OTEMod.LOGGER.info("HEAL ["+HealerQueue.ToHeal.size()+"] / VALIDATE ["+HealerQueue.ToValidate.size()+"]"); - - // OK - - return tag; - } - - public static List removeSame(List other) - { - other=removeSameFrom(ToHeal, other); - - return other; - } - - public static List removeSameFrom(List stored, List other) - { - - for(int i = 0;i proc; - public boolean alive=false; // These are the - public boolean doTick = false; - public Thread MyThread; - - private boolean skipWait; - - public int Pass; // A local pass for this worker - - - public HealerWorker(List toProcess) - { - // TODO: Make this a individualized heal worker that does the task of the current HealerManager, but with a central list of positions for de-duplication. But that a second worker would not process the same positions - // The goal is to have a worker so a second explosion elsewhere does not reset the entire thing - for (StoredBlock sBlock : toProcess) { - if(!sBlock.claimed()) // Checks if a thread has been set on this storage block yet or not. This data does not get serialized. - sBlock.setClaimed(); // We are not yet in a new thread but we know we will be soon. - } - proc = toProcess; - } - - @Override - public void run() - { - alive=true; - MyThread=Thread.currentThread(); - HealerQueue.ManagerInstance.registerWorker(this); - OTEMod.LOGGER.info("Hello from Healer Worker "+Thread.currentThread().getName()); - - for(int i=0;i -{ - private Level world; - private TickingHealerTask task; - static final String DATAKEY = OTEMod.MOD_ID+":"+Healer.class.getSimpleName(); - - public Healer() - { - task = new TickingHealerTask(); - } - - public void onTick() - { - Collection blocks = task.tick(); - if(blocks != null) - { - for(StoredBlock bdata : blocks) - { - HealRunner.scheduleHeal(bdata); - } - } - } - - public void onDetonate(ExplosionEvent.Detonate event) - { - Level world = event.getLevel(); - int maxTicks = 0; - for(BlockPos posExplode : event.getAffectedBlocks()) - { - BlockState stateExplode = world.getBlockState(posExplode); - if(!isValid(stateExplode)) - continue; - - if(!stateExplode.isAir()) - { - - } - } - } - - @Override - public Object get() { - // TODO Auto-generated method stub - return null; - } - - @Override - public CompoundTag save(CompoundTag p_77763_) { - // TODO Auto-generated method stub - return null; - } - -} diff --git a/src/main/java/dev/zontreck/otemod/antigrief2/handlers/WorldEventHandler.java b/src/main/java/dev/zontreck/otemod/antigrief2/handlers/WorldEventHandler.java deleted file mode 100644 index e548de2..0000000 --- a/src/main/java/dev/zontreck/otemod/antigrief2/handlers/WorldEventHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.zontreck.otemod.antigrief2.handlers; - -import java.util.HashMap; -import java.util.Map; - -import dev.zontreck.otemod.antigrief2.Healer; -import net.minecraft.server.level.ServerLevel; -import net.minecraftforge.event.level.LevelEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - -public class WorldEventHandler { - private Map healers = new HashMap(); - - public Map getHealers() - { - return healers; - } - - @SubscribeEvent - public void onLoadLevel(LevelEvent.Load ev) - { - if(!ev.getLevel().isClientSide() && ev.getLevel() instanceof ServerLevel) - { - healers.put((ServerLevel)ev.getLevel(), Healer.acquire((ServerLevel)ev.getLevel())); - - } - } - - @SubscribeEvent - public void onUnload(LevelEvent.Unload ev) - { - if(!ev.getLevel().isClientSide()) - { - healers.remove(ev.getLevel()); - } - } -} diff --git a/src/main/java/dev/zontreck/otemod/zschem/BlockContainerList.java b/src/main/java/dev/zontreck/otemod/zschem/BlockContainerList.java index bfeaf58..1d546ee 100644 --- a/src/main/java/dev/zontreck/otemod/zschem/BlockContainerList.java +++ b/src/main/java/dev/zontreck/otemod/zschem/BlockContainerList.java @@ -15,7 +15,7 @@ public class BlockContainerList { private final Lock lock; private final List containers; - private BlockContainerList() + public BlockContainerList() { this.lock = new ReentrantLock(); this.containers = new ArrayList<>(); diff --git a/src/main/java/dev/zontreck/otemod/zschem/BlockSaver.java b/src/main/java/dev/zontreck/otemod/zschem/BlockSaver.java index 4eb9ae0..1e8bd91 100644 --- a/src/main/java/dev/zontreck/otemod/zschem/BlockSaver.java +++ b/src/main/java/dev/zontreck/otemod/zschem/BlockSaver.java @@ -25,11 +25,6 @@ public class BlockSaver { executor=service; } - public static void InitialLoad() - { - - } - public void start() { executor.scheduleAtFixedRate(()->{ diff --git a/src/main/java/dev/zontreck/otemod/zschem/EventHandler.java b/src/main/java/dev/zontreck/otemod/zschem/EventHandler.java index a6cdf60..f546b4d 100644 --- a/src/main/java/dev/zontreck/otemod/zschem/EventHandler.java +++ b/src/main/java/dev/zontreck/otemod/zschem/EventHandler.java @@ -1,6 +1,13 @@ package dev.zontreck.otemod.zschem; +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.Entity; +import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.level.ExplosionEvent; +import net.minecraftforge.event.level.LevelEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; public class EventHandler { @@ -8,6 +15,51 @@ public class EventHandler { @SubscribeEvent public void onDetonate(ExplosionEvent.Detonate ev) { - + if(ev.getLevel().isClientSide)return; + + Entity explodes = ev.getExplosion().getSourceMob(); + // Register blocks to be healed + WorldProp wp = WorldProp.acquire((ServerLevel)ev.getLevel()); + if(wp!=null){ + wp.onDetonate(ev); + } + } + + + private Map healers = new HashMap(); + + public Map getHealers() + { + return healers; + } + + @SubscribeEvent + public void onLoadLevel(LevelEvent.Load ev) + { + if(!ev.getLevel().isClientSide() && ev.getLevel() instanceof ServerLevel) + { + healers.put((ServerLevel)ev.getLevel(), WorldProp.acquire((ServerLevel)ev.getLevel())); + + } + } + + @SubscribeEvent + public void onUnload(LevelEvent.Unload ev) + { + if(!ev.getLevel().isClientSide()) + { + healers.remove(ev.getLevel()); + } + } + + @SubscribeEvent + public void onLevelTick(TickEvent.LevelTickEvent ev) + { + if(!ev.level.isClientSide){ + WorldProp wp = WorldProp.acquire((ServerLevel)ev.level); + if(wp!=null){ + wp.onTick(); + } + } } } diff --git a/src/main/java/dev/zontreck/otemod/zschem/WorldProp.java b/src/main/java/dev/zontreck/otemod/zschem/WorldProp.java new file mode 100644 index 0000000..5c09194 --- /dev/null +++ b/src/main/java/dev/zontreck/otemod/zschem/WorldProp.java @@ -0,0 +1,116 @@ +package dev.zontreck.otemod.zschem; + +import java.util.function.Supplier; + +import dev.zontreck.otemod.OTEMod; +import dev.zontreck.otemod.configs.OTEServerConfig; +import net.minecraft.core.BlockPos; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.tags.BlockTags; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.saveddata.SavedData; +import net.minecraft.world.level.storage.DimensionDataStorage; +import net.minecraftforge.event.level.ExplosionEvent; + +public class WorldProp extends SavedData implements Supplier +{ + private Level world; + private BlockContainerList task; + static final String KEY = OTEMod.MOD_ID + ":" + WorldProp.class.getSimpleName(); + + public WorldProp(){ + task = new BlockContainerList(); + } + + public void onTick() + { + task.tick(); + } + + public void onDetonate(ExplosionEvent.Detonate ev) + { + Level w = ev.getLevel(); + int maxTicks = 0; + + for(BlockPos p : ev.getAffectedBlocks()) + { + BlockState bsExplode = w.getBlockState(p); + if(!isValid(bsExplode))continue; + + if(!bsExplode.isAir()){ + int ticks = OTEServerConfig.HEALER_TIMER.get() + w.random.nextInt(); + if(ticks > maxTicks){ + maxTicks = ticks; + } + + + addHeal(p, bsExplode, world); + } + } + maxTicks ++; + for(BlockPos p : ev.getAffectedBlocks()) + { + BlockState bsE = w.getBlockState(p); + if(!isValid(bsE))continue; + if(!bsE.isAir()){ + addHeal(p, bsE, world); + } + } + } + + private void addHeal(BlockPos p, BlockState s, Level w) + { + task.add(new StoredBlock(p, s, (ServerLevel)w)); + world.removeBlockEntity(p); + world.setBlock(p, Blocks.AIR.defaultBlockState(), 7); + } + + private boolean isValid(BlockState bs) + { + if(bs.is(BlockTags.DOORS) || bs.is(BlockTags.BEDS) || bs.is(BlockTags.TALL_FLOWERS)){ + return false; + } else return true; + } + + public CompoundTag save(CompoundTag tag){ + + return (CompoundTag) tag.put("task", task.save(tag)); + + } + + public void load(CompoundTag tag) + { + CompoundTag ct = tag.getCompound("task"); + task = BlockContainerList.load(ct); + } + + public static WorldProp acquire(ServerLevel w) + { + DimensionDataStorage dds = w.getDataStorage(); + WorldProp wp = dds.computeIfAbsent(p->{ + WorldProp swp = new WorldProp(); + swp.load(p); + return swp; + }, ()->{ + return new WorldProp(); + }, KEY); + wp.world = w; + return wp; + + } + + + @Override + public boolean isDirty(){ + return true; + } + + @Override + public Object get() + { + return this; + } +}