Center On BlockPos Not ChunkPos
All checks were successful
Twine/pipeline/head This commit looks good
All checks were successful
Twine/pipeline/head This commit looks good
This commit is contained in:
parent
3ade8dd72f
commit
7da5501008
@ -5,11 +5,12 @@ import net.minecraft.nbt.CompoundTag;
|
|||||||
import net.minecraft.nbt.ListTag;
|
import net.minecraft.nbt.ListTag;
|
||||||
import net.minecraft.nbt.Tag;
|
import net.minecraft.nbt.Tag;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
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.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 class StageDataComponent extends PersistentState {
|
||||||
public StageDataComponent(String key) {
|
public StageDataComponent(String key) {
|
||||||
@ -28,23 +29,23 @@ public class StageDataComponent extends PersistentState {
|
|||||||
return data.computeIfAbsent(uuid, k -> new StageData[Twine.STAGE_COUNT]);
|
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";
|
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--) {
|
for (int i = Twine.STAGE_COUNT - 1; i >= 0; i--) {
|
||||||
StageDataComponent.StageData stage = data[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;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
data[0] = new StageDataComponent.StageData();
|
data[0] = new StageDataComponent.StageData();
|
||||||
data[0].x = pos.x;
|
data[0].x = pos.getX();
|
||||||
data[0].z = pos.z;
|
data[0].z = pos.getZ();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int findEffectiveStageOfChunk(ServerWorld world, ChunkPos pos) {
|
public int findEffectiveStageOfChunk(ServerWorld world, BlockPos pos) {
|
||||||
int stage = 0;
|
int stage = 0;
|
||||||
for (Map.Entry<UUID, StageData[]> entry : data.entrySet()) {
|
for (Map.Entry<UUID, StageData[]> entry : data.entrySet()) {
|
||||||
if (world.getPlayerByUuid(entry.getKey()) != null) {
|
if (world.getPlayerByUuid(entry.getKey()) != null) {
|
||||||
@ -54,7 +55,7 @@ public class StageDataComponent extends PersistentState {
|
|||||||
return stage;
|
return stage;
|
||||||
}
|
}
|
||||||
|
|
||||||
public long findEffectiveTimeOfChunk(ServerWorld world, ChunkPos pos) {
|
public long findEffectiveTimeOfChunk(ServerWorld world, BlockPos pos) {
|
||||||
long time = 0;
|
long time = 0;
|
||||||
for (Map.Entry<UUID, StageData[]> entry : data.entrySet()) {
|
for (Map.Entry<UUID, StageData[]> entry : data.entrySet()) {
|
||||||
if (world.getPlayerByUuid(entry.getKey()) != null) {
|
if (world.getPlayerByUuid(entry.getKey()) != null) {
|
||||||
|
@ -56,8 +56,8 @@ public class ExplodeArtificialBlockGoal extends MoveToTargetPosGoal {
|
|||||||
@Override
|
@Override
|
||||||
public boolean canStart() {
|
public boolean canStart() {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
||||||
ChunkPos chunkPos = new ChunkPos(mob.getBlockPos());
|
BlockPos pos = mob.getBlockPos();
|
||||||
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos);
|
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos);
|
||||||
|
|
||||||
return stage >= 3 && super.canStart();
|
return stage >= 3 && super.canStart();
|
||||||
}
|
}
|
||||||
|
@ -9,14 +9,14 @@ import net.minecraft.entity.mob.MobEntity;
|
|||||||
import net.minecraft.entity.passive.PassiveEntity;
|
import net.minecraft.entity.passive.PassiveEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
|
||||||
public class FollowPassiveEntityGoal extends FollowTargetGoal<LivingEntity> {
|
public class FollowPassiveEntityGoal extends FollowTargetGoal<LivingEntity> {
|
||||||
public FollowPassiveEntityGoal(MobEntity mob) {
|
public FollowPassiveEntityGoal(MobEntity mob) {
|
||||||
super(mob, LivingEntity.class, 10, false, false, entity -> {
|
super(mob, LivingEntity.class, 10, false, false, entity -> {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
||||||
ChunkPos chunkPos = new ChunkPos(mob.getBlockPos());
|
BlockPos pos = mob.getBlockPos();
|
||||||
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos);
|
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos);
|
||||||
|
|
||||||
return entity instanceof PassiveEntity || (entity instanceof PlayerEntity && stage >= 4);
|
return entity instanceof PassiveEntity || (entity instanceof PlayerEntity && stage >= 4);
|
||||||
});
|
});
|
||||||
@ -24,8 +24,8 @@ public class FollowPassiveEntityGoal extends FollowTargetGoal<LivingEntity> {
|
|||||||
|
|
||||||
public boolean canStart() {
|
public boolean canStart() {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) mob.getEntityWorld());
|
||||||
ChunkPos chunkPos = new ChunkPos(mob.getBlockPos());
|
BlockPos pos = mob.getBlockPos();
|
||||||
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), chunkPos);
|
int stage = component.findEffectiveStageOfChunk((ServerWorld) mob.getEntityWorld(), pos);
|
||||||
|
|
||||||
return mob instanceof HostileEntity && (!(mob instanceof Angerable) || stage >= 4) && stage >= 2 && super.canStart();
|
return mob instanceof HostileEntity && (!(mob instanceof Angerable) || stage >= 4) && stage >= 2 && super.canStart();
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import com.thebrokenrail.twine.component.StageDataComponent;
|
|||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import net.minecraft.item.SwordItem;
|
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.text.LiteralText;
|
import net.minecraft.text.LiteralText;
|
||||||
import net.minecraft.text.TranslatableText;
|
import net.minecraft.text.TranslatableText;
|
||||||
@ -13,7 +12,7 @@ import net.minecraft.util.ActionResult;
|
|||||||
import net.minecraft.util.Formatting;
|
import net.minecraft.util.Formatting;
|
||||||
import net.minecraft.util.Hand;
|
import net.minecraft.util.Hand;
|
||||||
import net.minecraft.util.TypedActionResult;
|
import net.minecraft.util.TypedActionResult;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
|
|
||||||
public class DivinerItem extends Item {
|
public class DivinerItem extends Item {
|
||||||
@ -26,17 +25,17 @@ public class DivinerItem extends Item {
|
|||||||
ItemStack stack = user.getStackInHand(hand);
|
ItemStack stack = user.getStackInHand(hand);
|
||||||
if (!world.isClient()) {
|
if (!world.isClient()) {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) world);
|
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());
|
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_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_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);
|
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));
|
stack.damage(1, user, e -> e.sendToolBreakStatus(hand));
|
||||||
|
@ -12,7 +12,7 @@ import net.minecraft.entity.mob.*;
|
|||||||
import net.minecraft.entity.passive.IronGolemEntity;
|
import net.minecraft.entity.passive.IronGolemEntity;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
import net.minecraft.server.world.ServerWorld;
|
||||||
import net.minecraft.util.math.ChunkPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import org.spongepowered.asm.mixin.Final;
|
import org.spongepowered.asm.mixin.Final;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
@ -48,8 +48,8 @@ public class MixinMobEntity {
|
|||||||
} else if ((Object) this instanceof IronGolemEntity) {
|
} else if ((Object) this instanceof IronGolemEntity) {
|
||||||
targetSelector.add(3, new FollowTargetGoal<>((IronGolemEntity) (Object) this, PlayerEntity.class, 10, true, false, entity -> {
|
targetSelector.add(3, new FollowTargetGoal<>((IronGolemEntity) (Object) this, PlayerEntity.class, 10, true, false, entity -> {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((IronGolemEntity) (Object) this).getEntityWorld());
|
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((IronGolemEntity) (Object) this).getEntityWorld());
|
||||||
ChunkPos chunkPos = new ChunkPos(((IronGolemEntity) (Object) this).getBlockPos());
|
BlockPos blockPos = ((IronGolemEntity) (Object) this).getBlockPos();
|
||||||
int stage = component.findEffectiveStageOfChunk((ServerWorld) (((IronGolemEntity) (Object) this).getEntityWorld()), chunkPos);
|
int stage = component.findEffectiveStageOfChunk((ServerWorld) (((IronGolemEntity) (Object) this).getEntityWorld()), blockPos);
|
||||||
|
|
||||||
return stage >= 3 && !((IronGolemEntity) (Object) this).isPlayerCreated();
|
return stage >= 3 && !((IronGolemEntity) (Object) this).isPlayerCreated();
|
||||||
}));
|
}));
|
||||||
@ -59,11 +59,13 @@ public class MixinMobEntity {
|
|||||||
|
|
||||||
@Inject(at = @At("HEAD"), method = "isInDaylight", cancellable = true)
|
@Inject(at = @At("HEAD"), method = "isInDaylight", cancellable = true)
|
||||||
public void isInDaylight(CallbackInfoReturnable<Boolean> info) {
|
public void isInDaylight(CallbackInfoReturnable<Boolean> info) {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((ZombieEntity) (Object) this).getEntityWorld());
|
if (!((MobEntity) (Object) this).getEntityWorld().isClient()) {
|
||||||
ChunkPos chunkPos = new ChunkPos(((ZombieEntity) (Object) this).getBlockPos());
|
StageDataComponent component = StageDataComponent.getFromWorld((ServerWorld) ((MobEntity) (Object) this).getEntityWorld());
|
||||||
int stage = component.findEffectiveStageOfChunk((ServerWorld) ((ZombieEntity) (Object) this).getEntityWorld(), chunkPos);
|
BlockPos blockPos = ((MobEntity) (Object) this).getBlockPos();
|
||||||
if (stage >= 5) {
|
int stage = component.findEffectiveStageOfChunk((ServerWorld) ((MobEntity) (Object) this).getEntityWorld(), blockPos);
|
||||||
info.setReturnValue(false);
|
if (stage >= 5) {
|
||||||
|
info.setReturnValue(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import com.thebrokenrail.twine.Twine;
|
|||||||
import com.thebrokenrail.twine.component.StageDataComponent;
|
import com.thebrokenrail.twine.component.StageDataComponent;
|
||||||
import net.minecraft.server.network.ServerPlayerEntity;
|
import net.minecraft.server.network.ServerPlayerEntity;
|
||||||
import net.minecraft.server.world.ServerWorld;
|
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.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Shadow;
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
@ -17,11 +17,6 @@ public abstract class MixinServerPlayerEntity {
|
|||||||
@Shadow
|
@Shadow
|
||||||
public abstract ServerWorld getServerWorld();
|
public abstract ServerWorld getServerWorld();
|
||||||
|
|
||||||
@Unique
|
|
||||||
private ChunkPos getChunkPos() {
|
|
||||||
return new ChunkPos(((ServerPlayerEntity) (Object) this).getBlockPos());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private long lastTime = -1L;
|
private long lastTime = -1L;
|
||||||
|
|
||||||
@ -29,7 +24,7 @@ public abstract class MixinServerPlayerEntity {
|
|||||||
public void tick(CallbackInfo info) {
|
public void tick(CallbackInfo info) {
|
||||||
StageDataComponent component = StageDataComponent.getFromWorld(getServerWorld());
|
StageDataComponent component = StageDataComponent.getFromWorld(getServerWorld());
|
||||||
StageDataComponent.StageData[] data = component.getData(((ServerPlayerEntity) (Object) this).getUuid());
|
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];
|
StageDataComponent.StageData stageObj = data[stage];
|
||||||
if (stage + 1 < Twine.STAGE_COUNT) {
|
if (stage + 1 < Twine.STAGE_COUNT) {
|
||||||
if (lastTime != -1L) {
|
if (lastTime != -1L) {
|
||||||
@ -41,9 +36,9 @@ public abstract class MixinServerPlayerEntity {
|
|||||||
old.time = 0;
|
old.time = 0;
|
||||||
}
|
}
|
||||||
StageDataComponent.StageData newData = new StageDataComponent.StageData();
|
StageDataComponent.StageData newData = new StageDataComponent.StageData();
|
||||||
ChunkPos pos = getChunkPos();
|
BlockPos pos = ((ServerPlayerEntity) (Object) this).getBlockPos();
|
||||||
newData.x = pos.x;
|
newData.x = pos.getX();
|
||||||
newData.z = pos.z;
|
newData.z = pos.getZ();
|
||||||
data[stage + 1] = newData;
|
data[stage + 1] = newData;
|
||||||
data[stage] = old;
|
data[stage] = old;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user