From a695c5c5467d015d0d09b97458b7f38feda4e535 Mon Sep 17 00:00:00 2001 From: stellanera Date: Tue, 18 Aug 2026 20:00:42 +0200 Subject: [PATCH] move aura to capability --- .../java/wayoftime/bloodmagic/BloodMagic.java | 48 ++++- .../wayoftime/bloodmagic/demonaura/PosXY.java | 76 -------- .../bloodmagic/demonaura/WillChunk.java | 72 -------- .../bloodmagic/demonaura/WillWorld.java | 49 ----- .../demonaura/WorldDemonWillHandler.java | 171 ++---------------- .../util/handler/event/GenericHandler.java | 3 +- .../util/handler/event/WillHandler.java | 138 -------------- .../bloodmagic/will/DemonWillHolder.java | 48 +++-- 8 files changed, 92 insertions(+), 513 deletions(-) delete mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java delete mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java delete mode 100644 src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java diff --git a/src/main/java/wayoftime/bloodmagic/BloodMagic.java b/src/main/java/wayoftime/bloodmagic/BloodMagic.java index cca5f86888..ae270aa731 100644 --- a/src/main/java/wayoftime/bloodmagic/BloodMagic.java +++ b/src/main/java/wayoftime/bloodmagic/BloodMagic.java @@ -1,30 +1,32 @@ package wayoftime.bloodmagic; import net.minecraft.Util; +import net.minecraft.core.Direction; import net.minecraft.core.HolderLookup; import net.minecraft.core.Position; import net.minecraft.core.dispenser.AbstractProjectileDispenseBehavior; import net.minecraft.core.registries.Registries; import net.minecraft.data.DataGenerator; import net.minecraft.data.PackOutput; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.PackSource; import net.minecraft.world.entity.projectile.Projectile; -import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.DispenserBlock; +import net.minecraft.world.level.chunk.LevelChunk; import net.minecraftforge.client.event.RegisterColorHandlersEvent; import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent; +import net.minecraftforge.common.capabilities.*; import net.minecraftforge.common.crafting.CraftingHelper; +import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.data.event.GatherDataEvent; import net.minecraftforge.event.AddPackFindersEvent; -import net.minecraftforge.event.RegisterCommandsEvent; +import net.minecraftforge.event.AttachCapabilitiesEvent; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fluids.DispenseFluidContainer; @@ -40,6 +42,8 @@ import net.minecraftforge.resource.PathPackResources; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import wayoftime.bloodmagic.anointment.Anointment; import wayoftime.bloodmagic.client.ClientEvents; import wayoftime.bloodmagic.client.hud.ElementRegistry; @@ -48,7 +52,6 @@ import wayoftime.bloodmagic.client.key.KeyBindingBloodMagic; import wayoftime.bloodmagic.client.sounds.SoundRegistry; import wayoftime.bloodmagic.command.CommandBloodMagic; -import wayoftime.bloodmagic.command.sub.SoulNetworkCommand; import wayoftime.bloodmagic.common.block.BloodMagicBlocks; import wayoftime.bloodmagic.common.data.*; import wayoftime.bloodmagic.common.fluid.BloodMagicFluids; @@ -83,8 +86,8 @@ import wayoftime.bloodmagic.structures.ModRoomPools; import wayoftime.bloodmagic.util.handler.event.GenericHandler; import wayoftime.bloodmagic.util.handler.event.WillHandler; +import wayoftime.bloodmagic.will.DemonWillHolder; -import java.util.List; import java.util.concurrent.CompletableFuture; @Mod("bloodmagic") @@ -98,6 +101,7 @@ public class BloodMagic { // Custom ItemGroup TAB public static final String NAME = "Blood Magic: Alchemical Wizardry"; public static Boolean curiosLoaded; + public static final Capability WILL_AURA_CAP = CapabilityManager.get(new CapabilityToken<>() {}); public BloodMagic() { IEventBus modBus = FMLJavaModLoadingContext.get().getModEventBus(); @@ -147,6 +151,7 @@ public BloodMagic() { modBus.addListener(this::gatherData); modBus.addListener(this::addPackfinders); modBus.addListener(this::onRegisterCapabilities); + MinecraftForge.EVENT_BUS.addGenericListener(LevelChunk.class, this::attachWillCapability); modBus.addListener(this::registerRecipes); modBus.addListener(ConfigManager::onCommonReload); @@ -222,6 +227,37 @@ private void registerRecipes(RegisterEvent event) { private void onRegisterCapabilities(RegisterCapabilitiesEvent event) { event.register(CapabilityRuneType.class); + event.register(DemonWillHolder.class); + } + + public void attachWillCapability(AttachCapabilitiesEvent event) { + DemonWillHolder holder = new DemonWillHolder() { + @Override + public void onContentsChanged() { + event.getObject().setUnsaved(true); + } + }; + LazyOptional lazy = LazyOptional.of(() -> holder); + + ICapabilitySerializable provider = new ICapabilitySerializable<>() { + @Override + public @NotNull LazyOptional getCapability(@NotNull Capability cap, @Nullable Direction side) { + return WILL_AURA_CAP.orEmpty(cap, lazy.cast()); + } + + @Override + public CompoundTag serializeNBT() { + return holder.serializeNBT(); + } + + @Override + public void deserializeNBT(CompoundTag nbt) { + holder.deserializeNBT(nbt); + } + }; + + event.addCapability(BloodMagic.rl("will_aura"), provider); + event.addListener(lazy::invalidate); } public void onLoadComplete(FMLLoadCompleteEvent event) { diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java b/src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java deleted file mode 100644 index 2e2fd6da9d..0000000000 --- a/src/main/java/wayoftime/bloodmagic/demonaura/PosXY.java +++ /dev/null @@ -1,76 +0,0 @@ -package wayoftime.bloodmagic.demonaura; - -import org.apache.commons.lang3.builder.ToStringBuilder; - -public class PosXY implements Comparable -{ - public int x; - public int y; - - public PosXY() - { - } - - public PosXY(int x, int y) - { - this.x = x; - this.y = y; - } - - @Override - public int compareTo(PosXY c) - { - return this.y == c.y ? this.x - c.x : this.y - c.y; - } - - public float getDistanceSquared(int x, int z) - { - float f = this.x - x; - float f2 = this.y - z; - return f * f + f2 * f2; - } - - public float getDistanceSquaredToChunkCoordinates(PosXY c) - { - return getDistanceSquared(c.x, c.y); - } - - public void setX(int x) - { - this.x = x; - } - - public void setY(int y) - { - this.y = y; - } - - @Override - public String toString() - { - return new ToStringBuilder(this).append("x", x).append("y", y).toString(); - } - - @Override - public boolean equals(Object o) - { - if (this == o) - return true; - if (!(o instanceof PosXY)) - return false; - - PosXY posXY = (PosXY) o; - - if (x != posXY.x) - return false; - return y == posXY.y; - } - - @Override - public int hashCode() - { - int result = x; - result = 31 * result + y; - return result; - } -} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java b/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java deleted file mode 100644 index 2fc67a3c9b..0000000000 --- a/src/main/java/wayoftime/bloodmagic/demonaura/WillChunk.java +++ /dev/null @@ -1,72 +0,0 @@ -package wayoftime.bloodmagic.demonaura; - -import java.lang.ref.WeakReference; - -import net.minecraft.world.level.chunk.ChunkAccess; -import wayoftime.bloodmagic.will.DemonWillHolder; - -public class WillChunk -{ - PosXY loc; - private short base; - private DemonWillHolder currentWill = new DemonWillHolder(); - private WeakReference chunkRef; - - public WillChunk(PosXY loc) - { - this.loc = loc; - } - - public WillChunk(ChunkAccess chunk, short base, DemonWillHolder currentWill) - { - this.loc = new PosXY(chunk.getPos().x, chunk.getPos().z); - this.chunkRef = new WeakReference(chunk); - this.base = base; - this.currentWill = currentWill; - } - - public boolean isModified() - { - return (this.chunkRef != null) && (this.chunkRef.get() != null) && this.chunkRef.get().isUnsaved(); - } - - public PosXY getLoc() - { - return loc; - } - - public void setLoc(PosXY loc) - { - this.loc = loc; - } - - public short getBase() - { - return base; - } - - public void setBase(short base) - { - this.base = base; - } - - public DemonWillHolder getCurrentWill() - { - return currentWill; - } - - public void setCurrentWill(DemonWillHolder currentWill) - { - this.currentWill = currentWill; - } - - public WeakReference getChunkRef() - { - return chunkRef; - } - - public void setChunkRef(WeakReference chunkRef) - { - this.chunkRef = chunkRef; - } -} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java b/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java deleted file mode 100644 index f539908f35..0000000000 --- a/src/main/java/wayoftime/bloodmagic/demonaura/WillWorld.java +++ /dev/null @@ -1,49 +0,0 @@ -package wayoftime.bloodmagic.demonaura; - -import java.util.concurrent.ConcurrentHashMap; - -import net.minecraft.resources.ResourceLocation; - -public class WillWorld -{ - // TODO: It was noted I may need to use RegistryKey instead. - ResourceLocation dim; - ConcurrentHashMap willChunks = new ConcurrentHashMap<>(); - -// private static ConcurrentHashMap nodeTickets = new ConcurrentHashMap(); - - public WillWorld(ResourceLocation resourceLocation) - { - this.dim = resourceLocation; - } - - public WillChunk getWillChunkAt(int x, int y) - { - return getWillChunkAt(new PosXY(x, y)); - } - - public WillChunk getWillChunkAt(PosXY loc) - { - return this.willChunks.get(loc); - } - - public ConcurrentHashMap getWillChunks() - { - return willChunks; - } - - public void setWillChunks(ConcurrentHashMap willChunks) - { - this.willChunks = willChunks; - } - -// public static ConcurrentHashMap getNodeTickets() -// { -// return nodeTickets; -// } -// -// public static void setNodeTickets(ConcurrentHashMap nodeTickets) -// { -// nodeTickets = nodeTickets; -// } -} \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java index a43b60a4b1..78d0c85fdf 100644 --- a/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java +++ b/src/main/java/wayoftime/bloodmagic/demonaura/WorldDemonWillHandler.java @@ -1,95 +1,23 @@ package wayoftime.bloodmagic.demonaura; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; - -import javax.annotation.Nullable; - -import net.minecraft.resources.ResourceLocation; import net.minecraft.core.BlockPos; import net.minecraft.world.level.Level; -import net.minecraft.world.level.chunk.LevelChunk; -import net.minecraft.world.level.chunk.ChunkAccess; -import wayoftime.bloodmagic.util.BMLog; +import net.minecraftforge.common.util.LazyOptional; +import wayoftime.bloodmagic.BloodMagic; import wayoftime.bloodmagic.will.DemonWillHolder; import wayoftime.bloodmagic.api.compat.EnumDemonWillType; public class WorldDemonWillHandler { - public static ConcurrentHashMap> dirtyChunks = new ConcurrentHashMap<>(); - static ConcurrentHashMap containedWills = new ConcurrentHashMap<>(); - - @Nullable - public static DemonWillHolder getWillHolder(ResourceLocation resourceLocation, int x, int y) - { - WillChunk chunk = getWillChunk(resourceLocation, x, y); - if (chunk != null) - { - return chunk.getCurrentWill(); - } - - return null; - } - public static DemonWillHolder getWillHolder(Level world, BlockPos pos) { - return getWillHolder(getDimensionResourceLocation(world), pos.getX() >> 4, pos.getZ() >> 4); - } - - public static WillWorld getWillWorld(ResourceLocation rl) - { - return containedWills.get(rl); - } - - @Nullable - public static WillChunk getWillChunk(ResourceLocation resourceLocation, int x, int y) - { - if (!containedWills.containsKey(resourceLocation)) - { - addWillWorld(resourceLocation); - } - - return (containedWills.get(resourceLocation)).getWillChunkAt(x, y); + LazyOptional lazyWill = world.getChunkAt(pos).getCapability(BloodMagic.WILL_AURA_CAP); + return lazyWill.resolve().get(); } - public static void addWillWorld(ResourceLocation resourceLocation) - { - if (!containedWills.containsKey(resourceLocation)) - { - containedWills.put(resourceLocation, new WillWorld(resourceLocation)); - BMLog.DEBUG.info("Creating demon will cache for world {}", resourceLocation); - } - } - - public static void removeWillWorld(ResourceLocation rl) - { - containedWills.remove(rl); - BMLog.DEBUG.info("Removing demon will cache for world {}", rl); - } - - public static void addWillChunk(ResourceLocation resourceLocation, ChunkAccess chunk, short base, DemonWillHolder currentWill) - { - WillWorld aw = containedWills.get(resourceLocation); - if (aw == null) - { - aw = new WillWorld(resourceLocation); - } - aw.getWillChunks().put(new PosXY(chunk.getPos().x, chunk.getPos().z), new WillChunk(chunk, base, currentWill)); - - containedWills.put(resourceLocation, aw); - } - - public static void removeWillChunk(ResourceLocation resourceLocation, int x, int y) + public static double getCurrentWill(Level world, BlockPos pos, EnumDemonWillType type) { - WillWorld aw = containedWills.get(resourceLocation); - if (aw != null) - { - WillChunk chunk = aw.getWillChunks().remove(new PosXY(x, y)); - if (chunk != null) - { - markChunkAsDirty(chunk, resourceLocation); - } - } + return getWillHolder(world, pos).getWill(type); } public static EnumDemonWillType getHighestDemonWillType(Level world, BlockPos pos) @@ -97,14 +25,13 @@ public static EnumDemonWillType getHighestDemonWillType(Level world, BlockPos po double currentMax = 0; EnumDemonWillType currentHighest = EnumDemonWillType.DEFAULT; - WillChunk willChunk = getWillChunk(world, pos); + DemonWillHolder willHolder = getWillHolder(world, pos); - DemonWillHolder currentWill = willChunk.getCurrentWill(); for (EnumDemonWillType type : EnumDemonWillType.values()) { - if (currentWill.getWill(type) > currentMax) + if (willHolder.getWill(type) > currentMax) { - currentMax = currentWill.getWill(type); + currentMax = willHolder.getWill(type); currentHighest = type; } } @@ -114,107 +41,43 @@ public static EnumDemonWillType getHighestDemonWillType(Level world, BlockPos po public static double drainWill(Level world, BlockPos pos, EnumDemonWillType type, double amount, boolean doDrain) { - WillChunk willChunk = getWillChunk(world, pos); + DemonWillHolder willHolder = getWillHolder(world, pos); - DemonWillHolder currentWill = willChunk.getCurrentWill(); - double drain = Math.min(currentWill.getWill(type), amount); + double drain = Math.min(willHolder.getWill(type), amount); if (!doDrain) { return drain; } - drain = currentWill.drainWill(type, drain); - markChunkAsDirty(willChunk, getDimensionResourceLocation(world)); + drain = willHolder.drainWill(type, drain); return drain; } public static double fillWillToMaximum(Level world, BlockPos pos, EnumDemonWillType type, double amount, double max, boolean doFill) { - WillChunk willChunk = getWillChunk(world, pos); + DemonWillHolder willHolder = getWillHolder(world, pos); - DemonWillHolder currentWill = willChunk.getCurrentWill(); - double fill = Math.min(amount, max - currentWill.getWill(type)); + double fill = Math.min(amount, max - willHolder.getWill(type)); if (!doFill || fill <= 0) { return fill > 0 ? fill : 0; } - fill = currentWill.addWill(type, amount, max); - markChunkAsDirty(willChunk, getDimensionResourceLocation(world)); + fill = willHolder.addWill(type, amount, max); return fill; } public static double fillWill(Level world, BlockPos pos, EnumDemonWillType type, double amount, boolean doFill) { - WillChunk willChunk = getWillChunk(world, pos); - - DemonWillHolder currentWill = willChunk.getCurrentWill(); + DemonWillHolder willHolder = getWillHolder(world, pos); if (!doFill) { return amount; } - - currentWill.addWill(type, amount); - markChunkAsDirty(willChunk, getDimensionResourceLocation(world)); + willHolder.addWill(type, amount); return amount; } - - public static WillChunk getWillChunk(Level world, BlockPos pos) - { - WillChunk willChunk = getWillChunk(getDimensionResourceLocation(world), pos.getX() >> 4, pos.getZ() >> 4); - if (willChunk == null) - { - LevelChunk chunk = world.getChunk(pos.getX() >> 4, pos.getZ() >> 4); - generateWill(chunk, world); - - willChunk = getWillChunk(getDimensionResourceLocation(world), pos.getX() >> 4, pos.getZ() >> 4); - } - - return willChunk; - } - - public static double getCurrentWill(Level world, BlockPos pos, EnumDemonWillType type) - { - WillChunk willChunk = getWillChunk(world, pos); - - if (willChunk == null) - { - return 0; - } - - DemonWillHolder currentWill = willChunk.getCurrentWill(); - return currentWill.getWill(type); - } - - private static void markChunkAsDirty(WillChunk chunk, ResourceLocation resourceLocation) - { - if (chunk.isModified()) - { - return; - } - PosXY pos = new PosXY(chunk.loc.x, chunk.loc.y); - if (!dirtyChunks.containsKey(resourceLocation)) - { - dirtyChunks.put(resourceLocation, new ConcurrentLinkedQueue<>()); - } - ConcurrentLinkedQueue dc = dirtyChunks.get(resourceLocation); - if (!dc.contains(pos)) - { - dc.add(pos); - } - } - - public static void generateWill(ChunkAccess chunk, Level world) - { - addWillChunk(getDimensionResourceLocation(world), chunk, (short) 1, new DemonWillHolder()); - } - - public static ResourceLocation getDimensionResourceLocation(Level world) - { - return world.dimension().location(); - } - } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java index f0b646b725..f2f50aa019 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/GenericHandler.java @@ -494,8 +494,7 @@ public static void sendPlayerDemonWillAura(Player player) { if (player instanceof ServerPlayer) { - BlockPos pos = player.blockPosition(); - DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(WorldDemonWillHandler.getDimensionResourceLocation(player.level()), pos.getX() >> 4, pos.getZ() >> 4); + DemonWillHolder holder = WorldDemonWillHandler.getWillHolder(player.level(), player.blockPosition()); if (holder != null) { BloodMagic.packetHandler.sendTo(new DemonAuraClientPacket(holder), (ServerPlayer) player); diff --git a/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java b/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java index 70e7ccbf41..bff692563b 100644 --- a/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java +++ b/src/main/java/wayoftime/bloodmagic/util/handler/event/WillHandler.java @@ -1,7 +1,5 @@ package wayoftime.bloodmagic.util.handler.event; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.Difficulty; import net.minecraft.world.damagesource.DamageSource; @@ -12,16 +10,8 @@ import net.minecraft.world.entity.item.ItemEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.ChunkPos; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.ChunkStatus; -import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.entity.living.LivingDropsEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; -import net.minecraftforge.event.level.ChunkDataEvent; import net.minecraftforge.eventbus.api.Event; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod; @@ -30,17 +20,11 @@ import wayoftime.bloodmagic.api.compat.IDemonWill; import wayoftime.bloodmagic.api.compat.IDemonWillWeapon; import wayoftime.bloodmagic.common.item.BloodMagicItems; -import wayoftime.bloodmagic.demonaura.PosXY; -import wayoftime.bloodmagic.demonaura.WillChunk; -import wayoftime.bloodmagic.demonaura.WorldDemonWillHandler; import wayoftime.bloodmagic.potion.BloodMagicPotions; -import wayoftime.bloodmagic.util.BMLog; -import wayoftime.bloodmagic.will.DemonWillHolder; import wayoftime.bloodmagic.will.PlayerDemonWillHandler; import java.util.HashMap; import java.util.List; -import java.util.concurrent.ConcurrentLinkedQueue; @Mod.EventBusSubscriber(modid = BloodMagic.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) public class WillHandler @@ -127,126 +111,4 @@ public void onLivingDrops(LivingDropsEvent event) } } } - - @SubscribeEvent - public void onServerWorldTick(TickEvent.LevelTickEvent event) - { - if (event.level.isClientSide) - return; - - ResourceLocation rl = WorldDemonWillHandler.getDimensionResourceLocation(event.level); -// int dim = event.world.provider.getDimension(); - if (event.phase == TickEvent.Phase.END) - { - if (!SERVER_TICKS.containsKey(rl)) - SERVER_TICKS.put(rl, 0); - - int ticks = (SERVER_TICKS.get(rl)); - - if (ticks % 20 == 0) - { -// CopyOnWriteArrayList dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(rl); - ConcurrentLinkedQueue dirtyChunks = WorldDemonWillHandler.dirtyChunks.get(rl); - if ((dirtyChunks != null) && (dirtyChunks.size() > 0)) - { - for (PosXY pos : dirtyChunks) - { - ChunkAccess chunk = event.level.getChunk(pos.x, pos.y, ChunkStatus.FULL, false); - if (chunk != null) - { - chunk.setUnsaved(true); - } - } - - dirtyChunks.clear(); - } - } - - SERVER_TICKS.put(rl, ticks + 1); - } - - } - - public static boolean isBlockLoaded(BlockGetter world, BlockPos pos) - { - - if (world == null || pos.getY() < world.getMinBuildHeight() || pos.getY() > world.getMaxBuildHeight()) - { - return false; - } else if (world instanceof LevelReader) - { - // Note: We don't bother checking if it is a world and then isBlockPresent - // because - // all that does is also validate the y value is in bounds, and we already check - // to make - // sure the position is valid both in the y and xz directions - return ((LevelReader) world).hasChunkAt(pos); - } - return true; - } - - @SubscribeEvent - public void chunkSave(ChunkDataEvent.Save event) - { - if (!(event.getLevel() instanceof Level)) - { - return; - } - ResourceLocation rl = WorldDemonWillHandler.getDimensionResourceLocation((Level) event.getLevel()); -// int dim = event.getWorld().provider.getDimension(); - - ChunkPos loc = event.getChunk().getPos(); - - - WillChunk ac = WorldDemonWillHandler.getWillChunk(rl, loc.x, loc.z); - if (ac != null) - { - CompoundTag nbt = new CompoundTag(); - nbt.putShort("base", ac.getBase()); - ac.getCurrentWill().writeToNBT(nbt, "current"); - - event.getData().put("BloodMagic", nbt); -// if (event.getChunk() instanceof Chunk && !((Chunk) event.getChunk()).setLoaded(loaded);) -// event.getWorld().getChunkSource().getChunk(p_62228_, p_62229_, p_62230_) -// if (!event.getWorld().getChunkSource().isEntityTickingChunk(event.getChunk().getPos())) -// WorldDemonWillHandler.removeWillChunk(rl, loc.x, loc.z); - } - } - - @SubscribeEvent - public void chunkUnload(ChunkDataEvent.Unload event) - { - if (!(event.getLevel() instanceof Level)) - { - return; - } - ResourceLocation rl = WorldDemonWillHandler.getDimensionResourceLocation((Level) event.getLevel()); - - ChunkPos loc = event.getChunk().getPos(); - - WillChunk ac = WorldDemonWillHandler.getWillChunk(rl, loc.x, loc.z); - if (ac != null) - { - WorldDemonWillHandler.removeWillChunk(rl, loc.x, loc.z); - } - } - - @SubscribeEvent - public void chunkLoad(ChunkDataEvent.Load event) - { - if (!(event.getLevel() instanceof Level)) - { - return; - } - ResourceLocation rl = WorldDemonWillHandler.getDimensionResourceLocation((Level) event.getLevel()); -// int dim = event.getWorld().provider.getDimension(); - if (event.getData().getCompound("BloodMagic").contains("base")) - { - CompoundTag nbt = event.getData().getCompound("BloodMagic"); - short base = nbt.getShort("base"); - DemonWillHolder current = new DemonWillHolder(); - current.readFromNBT(nbt, "current"); - WorldDemonWillHandler.addWillChunk(rl, event.getChunk(), base, current); - } - } } diff --git a/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java index c8c50f9493..880aaa1304 100644 --- a/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java +++ b/src/main/java/wayoftime/bloodmagic/will/DemonWillHolder.java @@ -3,10 +3,18 @@ import java.util.HashMap; import java.util.Map.Entry; +import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.capabilities.ICapabilitySerializable; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.common.util.LazyOptional; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import wayoftime.bloodmagic.api.compat.EnumDemonWillType; -public class DemonWillHolder +public class DemonWillHolder implements INBTSerializable { public HashMap willMap = new HashMap<>(); @@ -29,9 +37,11 @@ public void addWill(EnumDemonWillType type, double amount) if (willMap.containsKey(type)) { willMap.put(type, amount + willMap.get(type)); + onContentsChanged(); } else { willMap.put(type, amount); + onContentsChanged(); } } @@ -45,9 +55,11 @@ public double drainWill(EnumDemonWillType type, double amount) if (reduced >= current) { willMap.remove(type); + onContentsChanged(); } else { willMap.put(type, current - reduced); + onContentsChanged(); } return reduced; @@ -66,15 +78,28 @@ public double getWill(EnumDemonWillType type) return 0; } - public void readFromNBT(CompoundTag tag, String key) + @Override + public CompoundTag serializeNBT() { + CompoundTag willTag = new CompoundTag(); + for (Entry entry : willMap.entrySet()) + { + willTag.putDouble("EnumWill" + entry.getKey().name(), entry.getValue()); + } + return willTag; + } + + public void writeToNBT(CompoundTag tag, String key) { - CompoundTag willTag = tag.getCompound(key); + tag.put(key, serializeNBT()); + } + @Override + public void deserializeNBT(CompoundTag nbt) { willMap.clear(); for (EnumDemonWillType type : EnumDemonWillType.values()) { - double amount = willTag.getDouble("EnumWill" + type.name()); + double amount = nbt.getDouble("EnumWill" + type.name()); if (amount > 0) { willMap.put(type, amount); @@ -82,19 +107,10 @@ public void readFromNBT(CompoundTag tag, String key) } } - public void writeToNBT(CompoundTag tag, String key) + public void readFromNBT(CompoundTag tag, String key) { - CompoundTag willTag = new CompoundTag(); - for (Entry entry : willMap.entrySet()) - { - willTag.putDouble("EnumWill" + entry.getKey().name(), entry.getValue()); - } - - tag.put(key, willTag); + deserializeNBT(tag.getCompound(key)); } - public void clearWill() - { - willMap.clear(); - } + public void onContentsChanged() {} }