From 7da55010080fb843d1c836d409fe73dd440c8708 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Mon, 15 Jun 2020 16:29:28 -0400 Subject: [PATCH] Center On BlockPos Not ChunkPos --- .../twine/component/StageDataComponent.java | 21 ++++++++++--------- .../entity/ExplodeArtificialBlockGoal.java | 4 ++-- .../twine/entity/FollowPassiveEntityGoal.java | 10 ++++----- .../thebrokenrail/twine/item/DivinerItem.java | 13 ++++++------ .../twine/mixin/MixinMobEntity.java | 18 +++++++++------- .../twine/mixin/MixinServerPlayerEntity.java | 15 +++++-------- 6 files changed, 39 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/thebrokenrail/twine/component/StageDataComponent.java b/src/main/java/com/thebrokenrail/twine/component/StageDataComponent.java index ea8e6e7..75a7d4b 100644 --- a/src/main/java/com/thebrokenrail/twine/component/StageDataComponent.java +++ b/src/main/java/com/thebrokenrail/twine/component/StageDataComponent.java @@ -5,11 +5,12 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.PersistentState; -import net.minecraft.world.World; -import java.util.*; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; public class StageDataComponent extends PersistentState { public StageDataComponent(String key) { @@ -28,23 +29,23 @@ public class StageDataComponent extends PersistentState { return data.computeIfAbsent(uuid, k -> new StageData[Twine.STAGE_COUNT]); } - private static final int CHUNK_RADIUS = 16; + private static final int CHUNK_RADIUS = 16 * 16; private static final String STAGE_DATA_ID = "twine_stage_data"; - public static int findStageOfChunk(ChunkPos pos, StageDataComponent.StageData[] data) { + public static int findStageOfChunk(BlockPos pos, StageDataComponent.StageData[] data) { for (int i = Twine.STAGE_COUNT - 1; i >= 0; i--) { StageDataComponent.StageData stage = data[i]; - if (stage != null && Math.abs(stage.x - pos.x) <= CHUNK_RADIUS && Math.abs(stage.z - pos.z) <= CHUNK_RADIUS) { + if (stage != null && Math.abs(stage.x - pos.getX()) <= CHUNK_RADIUS && Math.abs(stage.z - pos.getZ()) <= CHUNK_RADIUS) { return i; } } data[0] = new StageDataComponent.StageData(); - data[0].x = pos.x; - data[0].z = pos.z; + data[0].x = pos.getX(); + data[0].z = pos.getZ(); return 0; } - public int findEffectiveStageOfChunk(ServerWorld world, ChunkPos pos) { + public int findEffectiveStageOfChunk(ServerWorld world, BlockPos pos) { int stage = 0; for (Map.Entry entry : data.entrySet()) { if (world.getPlayerByUuid(entry.getKey()) != null) { @@ -54,7 +55,7 @@ public class StageDataComponent extends PersistentState { return stage; } - public long findEffectiveTimeOfChunk(ServerWorld world, ChunkPos pos) { + public long findEffectiveTimeOfChunk(ServerWorld world, BlockPos pos) { long time = 0; for (Map.Entry entry : data.entrySet()) { if (world.getPlayerByUuid(entry.getKey()) != null) { diff --git a/src/main/java/com/thebrokenrail/twine/entity/ExplodeArtificialBlockGoal.java b/src/main/java/com/thebrokenrail/twine/entity/ExplodeArtificialBlockGoal.java index c33e03a..e1b0bbd 100644 --- a/src/main/java/com/thebrokenrail/twine/entity/ExplodeArtificialBlockGoal.java +++ b/src/main/java/com/thebrokenrail/twine/entity/ExplodeArtificialBlockGoal.java @@ -56,8 +56,8 @@ public class ExplodeArtificialBlockGoal extends MoveToTargetPosGoal { @Override public boolean canStart() { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld()); - ChunkPos chunkPos = new ChunkPos(mob.getBlockPos()); - int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos); + BlockPos pos = mob.getBlockPos(); + int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos); return stage >= 3 && super.canStart(); } diff --git a/src/main/java/com/thebrokenrail/twine/entity/FollowPassiveEntityGoal.java b/src/main/java/com/thebrokenrail/twine/entity/FollowPassiveEntityGoal.java index 415133e..9b5016e 100644 --- a/src/main/java/com/thebrokenrail/twine/entity/FollowPassiveEntityGoal.java +++ b/src/main/java/com/thebrokenrail/twine/entity/FollowPassiveEntityGoal.java @@ -9,14 +9,14 @@ import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.passive.PassiveEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; public class FollowPassiveEntityGoal extends FollowTargetGoal { public FollowPassiveEntityGoal(MobEntity mob) { super(mob, LivingEntity.class, 10, false, false, entity -> { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld()); - ChunkPos chunkPos = new ChunkPos(mob.getBlockPos()); - int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos); + BlockPos pos = mob.getBlockPos(); + int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos); return entity instanceof PassiveEntity || (entity instanceof PlayerEntity && stage >= 4); }); @@ -24,8 +24,8 @@ public class FollowPassiveEntityGoal extends FollowTargetGoal { public boolean canStart() { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld()); - ChunkPos chunkPos = new ChunkPos(mob.getBlockPos()); - int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos); + BlockPos pos = mob.getBlockPos(); + int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos); return mob instanceof HostileEntity && (!(mob instanceof Angerable) || stage >= 4) && stage >= 2 && super.canStart(); } diff --git a/src/main/java/com/thebrokenrail/twine/item/DivinerItem.java b/src/main/java/com/thebrokenrail/twine/item/DivinerItem.java index 5827222..c8466a3 100644 --- a/src/main/java/com/thebrokenrail/twine/item/DivinerItem.java +++ b/src/main/java/com/thebrokenrail/twine/item/DivinerItem.java @@ -5,7 +5,6 @@ import com.thebrokenrail.twine.component.StageDataComponent; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; -import net.minecraft.item.SwordItem; import net.minecraft.server.world.ServerWorld; import net.minecraft.text.LiteralText; import net.minecraft.text.TranslatableText; @@ -13,7 +12,7 @@ import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; import net.minecraft.util.Hand; import net.minecraft.util.TypedActionResult; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; public class DivinerItem extends Item { @@ -26,17 +25,17 @@ public class DivinerItem extends Item { ItemStack stack = user.getStackInHand(hand); if (!world.isClient()) { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) world); - ChunkPos chunkPos = new ChunkPos(user.getBlockPos()); + BlockPos pos = user.getBlockPos(); - int stage = component.findEffectiveStageOfChunk((ServerWorld) world, chunkPos); + int stage = component.findEffectiveStageOfChunk((ServerWorld) world, pos); StageDataComponent.StageData[] personalData = component.getData(user.getUuid()); - int effectiveStage = StageDataComponent.findStageOfChunk(chunkPos, personalData); + int effectiveStage = StageDataComponent.findStageOfChunk(pos, personalData); user.sendMessage(new TranslatableText("chat.twine.diviner_info_1", new LiteralText(String.valueOf(stage + 1)).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); - user.sendMessage(new TranslatableText("chat.twine.diviner_info_2", (stage + 1 >= Twine.STAGE_COUNT ? new TranslatableText("chat.twine.diviner_info_never") : new LiteralText(String.valueOf(Twine.STAGE_TIME - component.findEffectiveTimeOfChunk((ServerWorld) world, chunkPos)))).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); + user.sendMessage(new TranslatableText("chat.twine.diviner_info_2", (stage + 1 >= Twine.STAGE_COUNT ? new TranslatableText("chat.twine.diviner_info_never") : new LiteralText(String.valueOf(Twine.STAGE_TIME - component.findEffectiveTimeOfChunk((ServerWorld) world, pos)))).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); user.sendMessage(new TranslatableText("chat.twine.diviner_info_3", new LiteralText(String.valueOf(effectiveStage + 1)).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); - user.sendMessage(new TranslatableText("chat.twine.diviner_info_4", new LiteralText(String.valueOf(personalData[effectiveStage].x << 4)).formatted(Formatting.WHITE), new LiteralText(String.valueOf(personalData[effectiveStage].z << 4)).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); + user.sendMessage(new TranslatableText("chat.twine.diviner_info_4", new LiteralText(String.valueOf(personalData[effectiveStage].x)).formatted(Formatting.WHITE), new LiteralText(String.valueOf(personalData[effectiveStage].z)).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); user.sendMessage(new TranslatableText("chat.twine.diviner_info_5", (effectiveStage + 1 >= Twine.STAGE_COUNT ? new TranslatableText("chat.twine.diviner_info_never") : new LiteralText(String.valueOf(Twine.STAGE_TIME - personalData[effectiveStage].time))).formatted(Formatting.WHITE)).formatted(Formatting.YELLOW), false); stack.damage(1, user, e -> e.sendToolBreakStatus(hand)); diff --git a/src/main/java/com/thebrokenrail/twine/mixin/MixinMobEntity.java b/src/main/java/com/thebrokenrail/twine/mixin/MixinMobEntity.java index bbcf14c..541ff62 100644 --- a/src/main/java/com/thebrokenrail/twine/mixin/MixinMobEntity.java +++ b/src/main/java/com/thebrokenrail/twine/mixin/MixinMobEntity.java @@ -12,7 +12,7 @@ import net.minecraft.entity.mob.*; import net.minecraft.entity.passive.IronGolemEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -48,8 +48,8 @@ public class MixinMobEntity { } else if ((Object) this instanceof IronGolemEntity) { targetSelector.add(3, new FollowTargetGoal<>((IronGolemEntity) (Object) this, PlayerEntity.class, 10, true, false, entity -> { StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((IronGolemEntity) (Object) this).getEntityWorld()); - ChunkPos chunkPos = new ChunkPos(((IronGolemEntity) (Object) this).getBlockPos()); - int stage = component.findEffectiveStageOfChunk((ServerWorld) (((IronGolemEntity) (Object) this).getEntityWorld()), chunkPos); + BlockPos blockPos = ((IronGolemEntity) (Object) this).getBlockPos(); + int stage = component.findEffectiveStageOfChunk((ServerWorld) (((IronGolemEntity) (Object) this).getEntityWorld()), blockPos); return stage >= 3 && !((IronGolemEntity) (Object) this).isPlayerCreated(); })); @@ -59,11 +59,13 @@ public class MixinMobEntity { @Inject(at = @At("HEAD"), method = "isInDaylight", cancellable = true) public void isInDaylight(CallbackInfoReturnable info) { - StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((ZombieEntity) (Object) this).getEntityWorld()); - ChunkPos chunkPos = new ChunkPos(((ZombieEntity) (Object) this).getBlockPos()); - int stage = component.findEffectiveStageOfChunk((ServerWorld) ((ZombieEntity) (Object) this).getEntityWorld(), chunkPos); - if (stage >= 5) { - info.setReturnValue(false); + if (!((MobEntity) (Object) this).getEntityWorld().isClient()) { + StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((MobEntity) (Object) this).getEntityWorld()); + BlockPos blockPos = ((MobEntity) (Object) this).getBlockPos(); + int stage = component.findEffectiveStageOfChunk((ServerWorld) ((MobEntity) (Object) this).getEntityWorld(), blockPos); + if (stage >= 5) { + info.setReturnValue(false); + } } } } diff --git a/src/main/java/com/thebrokenrail/twine/mixin/MixinServerPlayerEntity.java b/src/main/java/com/thebrokenrail/twine/mixin/MixinServerPlayerEntity.java index f61ca7b..ff9dc8d 100644 --- a/src/main/java/com/thebrokenrail/twine/mixin/MixinServerPlayerEntity.java +++ b/src/main/java/com/thebrokenrail/twine/mixin/MixinServerPlayerEntity.java @@ -4,7 +4,7 @@ import com.thebrokenrail.twine.Twine; import com.thebrokenrail.twine.component.StageDataComponent; import net.minecraft.server.network.ServerPlayerEntity; import net.minecraft.server.world.ServerWorld; -import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.math.BlockPos; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Unique; @@ -17,11 +17,6 @@ public abstract class MixinServerPlayerEntity { @Shadow public abstract ServerWorld getServerWorld(); - @Unique - private ChunkPos getChunkPos() { - return new ChunkPos(((ServerPlayerEntity) (Object) this).getBlockPos()); - } - @Unique private long lastTime = -1L; @@ -29,7 +24,7 @@ public abstract class MixinServerPlayerEntity { public void tick(CallbackInfo info) { StageDataComponent component = StageDataComponent.getFromWorld(getServerWorld()); StageDataComponent.StageData[] data = component.getData(((ServerPlayerEntity) (Object) this).getUuid()); - int stage = StageDataComponent.findStageOfChunk(getChunkPos(), data); + int stage = StageDataComponent.findStageOfChunk(((ServerPlayerEntity) (Object) this).getBlockPos(), data); StageDataComponent.StageData stageObj = data[stage]; if (stage + 1 < Twine.STAGE_COUNT) { if (lastTime != -1L) { @@ -41,9 +36,9 @@ public abstract class MixinServerPlayerEntity { old.time = 0; } StageDataComponent.StageData newData = new StageDataComponent.StageData(); - ChunkPos pos = getChunkPos(); - newData.x = pos.x; - newData.z = pos.z; + BlockPos pos = ((ServerPlayerEntity) (Object) this).getBlockPos(); + newData.x = pos.getX(); + newData.z = pos.getZ(); data[stage + 1] = newData; data[stage] = old; }