improved claim display with liquids

This commit is contained in:
Flemmli97 2020-08-26 20:16:04 +02:00
parent 2a1d65a30d
commit 5ca457c882
3 changed files with 65 additions and 18 deletions

View File

@ -5,7 +5,7 @@ import net.minecraft.particle.DustParticleEffect;
public class ParticleIndicators {
public static final DustParticleEffect CLAIMCORNER = new DustParticleEffect(194 / 255f, 130 / 255f, 4 / 255f, 1);
public static final DustParticleEffect CLAIMMIDDLE = new DustParticleEffect(230 / 255f, 170 / 255f, 53 / 255f, 1);
public static final DustParticleEffect CLAIMMIDDLE = new DustParticleEffect(237 / 255f, 187 / 255f, 38 / 255f, 1);
public static final DustParticleEffect SUBCLAIMCORNER = new DustParticleEffect(125 / 255f, 125 / 255f, 125 / 255f, 1);
public static final DustParticleEffect SUBCLAIMMIDDLE = new DustParticleEffect(194 / 255f, 194 / 255f, 194 / 255f, 1);

View File

@ -56,7 +56,8 @@ public class ClaimDisplay {
}
public boolean display(ServerPlayerEntity player) {
this.displayTime--;
if(--this.displayTime % 2 == 0)
return toDisplay.isRemoved();
int[] dims = this.toDisplay.getDimensions();
if (this.poss == null || this.changed(dims)) {
this.middlePoss = calculateDisplayPos(player.getServerWorld(), dims, this.height);
@ -68,11 +69,15 @@ public class ClaimDisplay {
};
}
for (int[] pos : this.poss) {
player.networkHandler.sendPacket(new ParticleS2CPacket(this.corner, true, pos[0] + 0.5, pos[1] + 0.25, pos[2] + 0.5, 0, 0.25f, 0, 0, 1));
if(pos[1]!=pos[2])
player.networkHandler.sendPacket(new ParticleS2CPacket(this.corner, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
player.networkHandler.sendPacket(new ParticleS2CPacket(this.corner, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
}
if (this.middlePoss != null)
for (int[] pos : this.middlePoss) {
player.networkHandler.sendPacket(new ParticleS2CPacket(this.middle, true, pos[0] + 0.5, pos[1] + 0.25, pos[2] + 0.5, 0, 0.25f, 0, 0, 1));
if(pos[1]!=pos[2])
player.networkHandler.sendPacket(new ParticleS2CPacket(this.middle, true, pos[0] + 0.5, pos[2] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
player.networkHandler.sendPacket(new ParticleS2CPacket(this.middle, true, pos[0] + 0.5, pos[1] + 0.25, pos[3] + 0.5, 0, 0.5f, 0, 0, 1));
}
this.prevDims = dims;
return toDisplay.isRemoved() || displayTime < 0;
@ -121,27 +126,48 @@ public class ClaimDisplay {
addEvenly(min + step, max - step, step, l);
}
private static int[] getPosFrom(ServerWorld world, int x, int z, int maxY) {
int y = nextAirBlockFrom(world, x, maxY, z);
return new int[]{x, y, z};
/**
* Returns an array of of form [x,y1,y2,z] where y1 = height of the lowest replaceable block and y2 = height of the
* lowest air block above water (if possible)
*/
public static int[] getPosFrom(ServerWorld world, int x, int z, int maxY) {
int[] y = nextAirAndWaterBlockFrom(world, x, maxY, z);
return new int[]{x, y[0], y[1], z};
}
private static int nextAirBlockFrom(ServerWorld world, int x, int y, int z) {
private static int[] nextAirAndWaterBlockFrom(ServerWorld world, int x, int y, int z) {
BlockPos pos = new BlockPos(x, y, z);
BlockState state = world.getBlockState(pos);
if (state.getMaterial().isReplaceable()) {
pos = pos.down();
while (world.getBlockState(pos).getMaterial().isReplaceable()) {
state = world.getBlockState(pos);
while (state.getMaterial().isReplaceable()) {
pos = pos.down();
state = world.getBlockState(pos);
}
pos = pos.up();
state = world.getBlockState(pos);
} else {
pos = pos.up();
while (!world.getBlockState(pos).getMaterial().isReplaceable()) {
state = world.getBlockState(pos);
while (!state.getMaterial().isReplaceable()) {
pos = pos.up();
state = world.getBlockState(pos);
}
}
return pos.getY();
int[] yRet = new int[]{pos.getY(), pos.getY()};
if(state.getMaterial().isLiquid()){
pos = pos.up();
state = world.getBlockState(pos);
while (state.getMaterial().isLiquid()) {
pos = pos.up();
state = world.getBlockState(pos);
}
if(state.getMaterial().isReplaceable())
yRet[1] = pos.getY();
}
return yRet;
}
@Override

View File

@ -27,7 +27,7 @@ import java.util.UUID;
public class PlayerClaimData {
private int claimBlocks, additionalClaimBlocks, confirmTick;
private int claimBlocks, additionalClaimBlocks, confirmTick, actionCooldown;
private int lastBlockTick;
private EnumEditMode mode = EnumEditMode.DEFAULT;
@ -35,6 +35,7 @@ public class PlayerClaimData {
private ClaimDisplay displayEditing;
private BlockPos firstCorner;
private int[] cornerRenderPos;
private final Set<ClaimDisplay> claimDisplayList = Sets.newHashSet();
private final Set<ClaimDisplay> displayToAdd = Sets.newHashSet();
@ -88,6 +89,19 @@ public class PlayerClaimData {
return this.calculateUsedClaimBlocks();
}
/**
* To prevent double processing. most notably when right clicking on a block and the block doesnt do anything ->
* block onUse -> item use. Might be a better way but for now this. But also handles having
* same items on both hands triggering
*/
public void setClaimActionCooldown(){
this.actionCooldown = 10;
}
public boolean claimCooldown(){
return this.actionCooldown>0;
}
public Claim currentEdit() {
return this.editingClaim;
}
@ -113,8 +127,8 @@ public class PlayerClaimData {
public void setEditMode(EnumEditMode mode) {
this.mode = mode;
this.editingClaim = null;
this.firstCorner = null;
this.setEditClaim(null, 0);
this.setEditingCorner(null);
}
public BlockPos editingCorner() {
@ -128,7 +142,10 @@ public class PlayerClaimData {
pos = pos.down();
state = this.player.world.getBlockState(pos);
}
this.cornerRenderPos = ClaimDisplay.getPosFrom(this.player.getServerWorld(), pos.getX(), pos.getZ(), pos.getY());
}
else
this.cornerRenderPos = null;
this.firstCorner = pos;
}
@ -162,16 +179,20 @@ public class PlayerClaimData {
this.addClaimBlocks(1);
this.lastBlockTick = 0;
}
if (this.firstCorner != null)
this.player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleIndicators.SETCORNER, true, this.firstCorner.getX() + 0.5, this.firstCorner.getY() + 1.25, this.firstCorner.getZ() + 0.5, 0, 0.25f, 0, 0, 3));
if (this.cornerRenderPos != null) {
if(this.cornerRenderPos[1]!=this.cornerRenderPos[2])
player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[2] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2));
player.networkHandler.sendPacket(new ParticleS2CPacket(ParticleIndicators.SETCORNER, true, this.cornerRenderPos[0] + 0.5, this.cornerRenderPos[1] + 0.25, this.cornerRenderPos[3] + 0.5, 0, 0.25f, 0, 0, 2));
}
if (--this.confirmTick < 0)
this.confirmDeleteAll = false;
if (this.displayEditing != null)
this.displayEditing.display(this.player);
if (this.player.getMainHandStack().getItem() != ConfigHandler.config.claimingItem && this.player.getOffHandStack().getItem() != ConfigHandler.config.claimingItem) {
this.firstCorner = null;
this.editingClaim = null;
this.setEditingCorner(null);
this.setEditClaim(null, 0);
}
this.actionCooldown--;
}
public void save(MinecraftServer server) {