Yatopia/patches/server/0060-tic-tacs-unblocking.patch
Simon Gardling 939aa76bf3 Updated Upstream and Sidestream(s) (Tuinity/Airplane/Origami)
Upstream/An Sidestream has released updates that appears to apply and compile correctly
This update has NOT been tested by YatopiaMC and as with ANY update, please do your own testing.

Tuinity Changes:
f32fe9a Updated Upstream (Paper)

Airplane Changes:
125aff7 Updated Upstream (Tuinity)

Origami Changes:
756162f Update Paper
2f9721c Update snakeyaml and enable comment loading/saving
2021-06-09 16:22:42 -04:00

408 lines
22 KiB
Diff

From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Gegy <gegy1000@gmail.com>
Date: Tue, 9 Feb 2021 13:23:12 -0500
Subject: [PATCH] tic-tacs: unblocking
Code originally licenced under LGPLv3 for the tic-tacs project: https://github.com/Gegy/tic-tacs
diff --git a/src/main/java/net/gegy1000/tictacs/NonBlockingWorldAccess.java b/src/main/java/net/gegy1000/tictacs/NonBlockingWorldAccess.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d99f3b4930045632d88fa4acb3b8159ee9cf9f3
--- /dev/null
+++ b/src/main/java/net/gegy1000/tictacs/NonBlockingWorldAccess.java
@@ -0,0 +1,29 @@
+package net.gegy1000.tictacs;
+
+import net.minecraft.world.level.block.state.IBlockData;
+import net.minecraft.world.level.block.Blocks;
+import net.minecraft.world.level.material.Fluid;
+import net.minecraft.world.level.material.FluidTypes;
+import net.minecraft.core.BlockPosition;
+import net.minecraft.world.level.IWorldReader;
+import net.minecraft.world.level.material.FluidTypes;
+
+public interface NonBlockingWorldAccess extends IWorldReader {
+
+ public static final IBlockData DEFAULT_BLOCK_STATE = Blocks.AIR.getBlockData();
+ public static final Fluid DEFAULT_FLUID_STATE = FluidTypes.EMPTY.getFluidData();
+
+ default IBlockData getBlockStateIfLoaded(BlockPosition pos) {
+ if (this.isLoaded(pos)) {
+ return this.getType(pos);
+ }
+ return DEFAULT_BLOCK_STATE;
+ }
+
+ default Fluid getFluidStateIfLoaded(BlockPosition pos) {
+ if (this.isLoaded(pos)) {
+ return this.getFluid(pos);
+ }
+ return DEFAULT_FLUID_STATE;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java
index 742d802d63963778454e41e5b19a3d889c544efc..13264b642a065dbbf908cef0a0f086ee666b24c7 100644
--- a/src/main/java/net/minecraft/server/level/EntityPlayer.java
+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java
@@ -654,6 +654,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting {
}
public void playerTick() {
+ if (!this.world.isLoaded(this.getChunkCoordinates())) return; // Yatopia - tic-tac unblocking
+
try {
if (valid && !this.isSpectator() || this.world.isLoaded(this.getChunkCoordinates())) { // Paper - don't tick dead players that are not in the world currently (pending respawn)
super.tick();
diff --git a/src/main/java/net/minecraft/server/level/WorldServer.java b/src/main/java/net/minecraft/server/level/WorldServer.java
index 13b00ae4e2a9fd2714b9bfd6ca9015f27b492399..9e9ecd78a0c1803449d44df680fd19c0f6bc1154 100644
--- a/src/main/java/net/minecraft/server/level/WorldServer.java
+++ b/src/main/java/net/minecraft/server/level/WorldServer.java
@@ -169,8 +169,9 @@ import org.bukkit.event.weather.LightningStrikeEvent;
import org.bukkit.event.world.TimeSkipEvent;
// CraftBukkit end
import it.unimi.dsi.fastutil.ints.IntArrayList; // Tuinity
+import net.gegy1000.tictacs.NonBlockingWorldAccess; // Yatopia
-public class WorldServer extends World implements GeneratorAccessSeed {
+public class WorldServer extends World implements GeneratorAccessSeed, NonBlockingWorldAccess { // Yatopia
public static final BlockPosition a = new BlockPosition(100, 50, 0);
private static final Logger LOGGER = LogManager.getLogger();
diff --git a/src/main/java/net/minecraft/world/entity/Entity.java b/src/main/java/net/minecraft/world/entity/Entity.java
index b742f457d72eee4f00f5df7a2b5b3cfdeb917a86..c4d3f716dda0e33b444de6caa6f336d8d33daf5b 100644
--- a/src/main/java/net/minecraft/world/entity/Entity.java
+++ b/src/main/java/net/minecraft/world/entity/Entity.java
@@ -141,9 +141,12 @@ import org.bukkit.event.entity.EntityPoseChangeEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.plugin.PluginManager;
// CraftBukkit end
+import net.gegy1000.tictacs.NonBlockingWorldAccess; // Yatopia
public abstract class Entity implements INamableTileEntity, ICommandListener, net.minecraft.server.KeyedObject { // Paper
+ public boolean updateNeeded; // Yatopia
+ private boolean chunkPosUpdateRequested; // Yatopia
// CraftBukkit start
private static final int CURRENT_LEVEL = 2;
public boolean preserveMotion = true; // Paper - keep initial motion on first setPositionRotation
@@ -827,6 +830,12 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
// Tuinity end - detailed watchdog information
public void move(EnumMoveType enummovetype, Vec3D vec3d) {
+ // Yatopia start - tic-tacs unblocking
+ BlockPosition pos = this.getChunkCoordinates();
+ if (!this.world.isLoaded(pos)) {
+ return;
+ }
+ // Yatopia end
// Tuinity start - detailed watchdog information
com.tuinity.tuinity.util.TickThread.ensureTickThread("Cannot move an entity off-main");
synchronized (this.posLock) {
@@ -877,7 +886,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
this.v = vec3d.y != vec3d1.y;
this.onGround = this.v && vec3d.y < 0.0D;
BlockPosition blockposition = this.ap();
- IBlockData iblockdata = this.world.getType(blockposition);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition); // Yatopia
this.a(vec3d1.y, this.onGround, iblockdata, blockposition);
Vec3D vec3d2 = this.getMot();
@@ -991,9 +1000,9 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
int k = MathHelper.floor(this.loc.z);
BlockPosition blockposition = new BlockPosition(i, j, k);
- if (this.world.getType(blockposition).isAir()) {
+ if (this.world.getBlockStateIfLoaded(blockposition).isAir()) { // Yatopia
BlockPosition blockposition1 = blockposition.down();
- IBlockData iblockdata = this.world.getType(blockposition1);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition1); // Yatopia
Block block = iblockdata.getBlock();
if (block.a((Tag) TagsBlock.FENCES) || block.a((Tag) TagsBlock.WALLS) || block instanceof BlockFenceGate) {
@@ -1005,17 +1014,21 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
protected float getBlockJumpFactor() {
- float f = this.world.getType(this.getChunkCoordinates()).getBlock().getJumpFactor();
- float f1 = this.world.getType(this.as()).getBlock().getJumpFactor();
+ // Yatopia start - tic-tacs unblocking
+ float f = this.world.getBlockStateIfLoaded(this.getChunkCoordinates()).getBlock().getJumpFactor();
+ float f1 = this.world.getBlockStateIfLoaded(this.as()).getBlock().getJumpFactor();
+ // Yatopia end
return (double) f == 1.0D ? f1 : f;
}
protected float getBlockSpeedFactor() {
- Block block = this.world.getType(this.getChunkCoordinates()).getBlock();
+ // Yatopia start - tic-tacs unblocking
+ Block block = this.world.getBlockStateIfLoaded(this.getChunkCoordinates()).getBlock();
float f = block.getSpeedFactor();
- return block != Blocks.WATER && block != Blocks.BUBBLE_COLUMN ? ((double) f == 1.0D ? this.world.getType(this.as()).getBlock().getSpeedFactor() : f) : f;
+ return block != Blocks.WATER && block != Blocks.BUBBLE_COLUMN ? ((double) f == 1.0D ? this.world.getBlockStateIfLoaded(this.as()).getBlock().getSpeedFactor() : f) : f;
+ // Yatopia end
}
protected BlockPosition as() {
@@ -1360,7 +1373,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
for (int i = blockposition.getX(); i <= blockposition1.getX(); ++i) {
// Tuinity end - reorder iteration to more cache aware
blockposition_mutableblockposition.d(i, j, k);
- IBlockData iblockdata = this.world.getType(blockposition_mutableblockposition);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition_mutableblockposition);
// Tuinity start - move fire checking in here - reuse getType from this method
if (checkFire) {
@@ -1396,7 +1409,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
protected void b(BlockPosition blockposition, IBlockData iblockdata) {
if (!iblockdata.getMaterial().isLiquid()) {
- IBlockData iblockdata1 = this.world.getType(blockposition.up());
+ IBlockData iblockdata1 = this.world.getBlockStateIfLoaded(blockposition.up()); // Yatopia
SoundEffectType soundeffecttype = iblockdata1.a(Blocks.SNOW) ? iblockdata1.getStepSound() : iblockdata.getStepSound();
this.playSound(soundeffecttype.getStepSound(), soundeffecttype.getVolume() * 0.15F, soundeffecttype.getPitch());
@@ -1487,7 +1500,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
public final boolean isInBubbleColumn() { return k(); } // Paper - OBFHELPER
private boolean k() {
- return this.world.getType(this.getChunkCoordinates()).a(Blocks.BUBBLE_COLUMN);
+ return this.world.getBlockStateIfLoaded(this.getChunkCoordinates()).a(Blocks.BUBBLE_COLUMN); // Yatopia
}
public boolean isInWaterOrRain() {
@@ -1558,7 +1571,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
BlockPosition blockposition = new BlockPosition(this.locX(), d0, this.locZ());
- Fluid fluid = this.world.getFluid(blockposition);
+ Fluid fluid = this.world.getFluidStateIfLoaded(blockposition); // Yatopia
Iterator iterator = TagsFluid.b().iterator();
Tag tag;
@@ -1616,7 +1629,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
protected IBlockData aN() {
- return this.world.getType(this.ap());
+ return this.world.getBlockStateIfLoaded(this.ap()); // Yatopia
}
public boolean aO() {
@@ -1628,7 +1641,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
int j = MathHelper.floor(this.locY() - 0.20000000298023224D);
int k = MathHelper.floor(this.locZ());
BlockPosition blockposition = new BlockPosition(i, j, k);
- IBlockData iblockdata = this.world.getType(blockposition);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition); // Yatopia
if (iblockdata.h() != EnumRenderType.INVISIBLE) {
Vec3D vec3d = this.getMot();
@@ -2867,7 +2880,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
EnumDirection enumdirection1 = aenumdirection[j];
blockposition_mutableblockposition.a((BaseBlockPosition) blockposition, enumdirection1);
- if (!this.world.getType(blockposition_mutableblockposition).r(this.world, blockposition_mutableblockposition)) {
+ if (!this.world.getBlockStateIfLoaded(blockposition_mutableblockposition).r(this.world, blockposition_mutableblockposition)) { // Yatopia
double d4 = vec3d.a(enumdirection1.n());
double d5 = enumdirection1.e() == EnumDirection.EnumAxisDirection.POSITIVE ? 1.0D - d4 : d4;
@@ -3081,14 +3094,14 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
return (ShapeDetectorShape) this.findOrCreatePortal(worldserver, blockposition, flag2, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((blockutil_rectangle) -> {
// CraftBukkit end
- IBlockData iblockdata = this.world.getType(this.ac);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(this.ac); // Yatopia
EnumDirection.EnumAxis enumdirection_enumaxis;
Vec3D vec3d;
if (iblockdata.b(BlockProperties.E)) {
enumdirection_enumaxis = (EnumDirection.EnumAxis) iblockdata.get(BlockProperties.E);
BlockUtil.Rectangle blockutil_rectangle1 = BlockUtil.a(this.ac, enumdirection_enumaxis, 21, EnumDirection.EnumAxis.Y, 21, (blockposition1) -> {
- return this.world.getType(blockposition1) == iblockdata;
+ return this.world.getBlockStateIfLoaded(blockposition1) == iblockdata; // Yatopia
});
vec3d = this.a(enumdirection_enumaxis, blockutil_rectangle1);
@@ -3443,6 +3456,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
}
public boolean cl() {
+ if (!this.updateNeeded) this.chunkPosUpdateRequested = true; // Yatopia
boolean flag = this.au;
this.au = false;
@@ -3641,7 +3655,7 @@ public abstract class Entity implements INamableTileEntity, ICommandListener, ne
for (int i2 = k; i2 < l; ++i2) {
for (int j2 = i1; j2 < j1; ++j2) {
blockposition_mutableblockposition.d(l1, i2, j2);
- Fluid fluid = this.world.getFluid(blockposition_mutableblockposition);
+ Fluid fluid = this.world.getFluidStateIfLoaded(blockposition_mutableblockposition); // Yatopia
if (fluid.a(tag)) {
double d2 = (double) ((float) i2 + fluid.getHeight(this.world, blockposition_mutableblockposition));
diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java
index 6132c711836908569006a8993973526275c9fb7c..02f7a588f883c0ed8b5daef6839e385b4ce1334b 100644
--- a/src/main/java/net/minecraft/world/entity/EntityLiving.java
+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java
@@ -139,6 +139,7 @@ import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.player.PlayerItemConsumeEvent;
// CraftBukkit end
+import net.gegy1000.tictacs.NonBlockingWorldAccess; // Yatopia
public abstract class EntityLiving extends Entity {
@@ -387,7 +388,7 @@ public abstract class EntityLiving extends Entity {
boolean flag1 = flag && ((EntityHuman) this).abilities.isInvulnerable;
if (this.isAlive()) {
- if (this.a((Tag) TagsFluid.WATER) && !this.world.getType(new BlockPosition(this.locX(), this.getHeadY(), this.locZ())).a(Blocks.BUBBLE_COLUMN)) {
+ if (this.a((Tag) TagsFluid.WATER) && !this.world.getBlockStateIfLoaded(new BlockPosition(this.locX(), this.getHeadY(), this.locZ())).a(Blocks.BUBBLE_COLUMN)) { // Yatopia
if (!this.canBreatheUnderwater() && !MobEffectUtil.c(this) && !flag1) { // Paper - use OBFHELPER so it can be overridden
this.setAirTicks(this.l(this.getAirTicks()));
if (this.getAirTicks() == -20) {
@@ -480,7 +481,7 @@ public abstract class EntityLiving extends Entity {
}
protected boolean cP() {
- return this.world.getType(this.as()).a((Tag) TagsBlock.SOUL_SPEED_BLOCKS);
+ return this.world.getBlockStateIfLoaded(this.as()).a((Tag) TagsBlock.SOUL_SPEED_BLOCKS); // Yatopia
}
@Override
@@ -528,6 +529,8 @@ public abstract class EntityLiving extends Entity {
}
protected void c(BlockPosition blockposition) {
+ if (!this.world.isLoaded(blockposition)) return; // Yatopia
+
int i = EnchantmentManager.a(Enchantments.FROST_WALKER, this);
if (i > 0) {
@@ -1561,7 +1564,7 @@ public abstract class EntityLiving extends Entity {
BlockPosition blockposition = this.getChunkCoordinates();
IBlockData iblockdata = Blocks.WITHER_ROSE.getBlockData();
- if (this.world.getType(blockposition).isAir() && iblockdata.canPlace(this.world, blockposition)) {
+ if (this.world.getBlockStateIfLoaded(blockposition).isAir() && iblockdata.canPlace(this.world, blockposition)) { // Yatopia
this.world.setTypeAndData(blockposition, iblockdata, 3);
flag = true;
}
@@ -1764,12 +1767,12 @@ public abstract class EntityLiving extends Entity {
// Airplane end
public IBlockData ds() {
- return this.world.getType(this.getChunkCoordinates());
+ return this.world.getBlockStateIfLoaded(this.getChunkCoordinates()); // Yatopia
}
private boolean c(BlockPosition blockposition, IBlockData iblockdata) {
if ((Boolean) iblockdata.get(BlockTrapdoor.OPEN)) {
- IBlockData iblockdata1 = this.world.getType(blockposition.down());
+ IBlockData iblockdata1 = this.world.getBlockStateIfLoaded(blockposition.down()); // Yatopia
if (iblockdata1.a(Blocks.LADDER) && iblockdata1.get(BlockLadder.FACING) == iblockdata.get(BlockTrapdoor.FACING)) {
return true;
@@ -1816,7 +1819,7 @@ public abstract class EntityLiving extends Entity {
int i = MathHelper.floor(this.locX());
int j = MathHelper.floor(this.locY() - 0.20000000298023224D);
int k = MathHelper.floor(this.locZ());
- IBlockData iblockdata = this.world.getType(new BlockPosition(i, j, k));
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(new BlockPosition(i, j, k)); // Yatopia
if (!iblockdata.isAir()) {
SoundEffectType soundeffecttype = iblockdata.getStepSound();
@@ -2289,7 +2292,7 @@ public abstract class EntityLiving extends Entity {
private void a(Entity entity) {
Vec3D vec3d;
- if (!entity.dead && !this.world.getType(entity.getChunkCoordinates()).getBlock().a((Tag) TagsBlock.PORTALS)) {
+ if (!entity.dead && !this.world.getBlockStateIfLoaded(entity.getChunkCoordinates()).getBlock().a((Tag) TagsBlock.PORTALS)) { // Yatopia
vec3d = entity.b(this);
} else {
vec3d = new Vec3D(entity.locX(), entity.locY() + (double) entity.getHeight(), entity.locZ());
@@ -2343,7 +2346,7 @@ public abstract class EntityLiving extends Entity {
this.fallDistance = 0.0F;
}
- Fluid fluid = this.world.getFluid(this.getChunkCoordinates());
+ Fluid fluid = this.world.getFluidStateIfLoaded(this.getChunkCoordinates()); // Yatopia
double d1;
float f;
@@ -2459,7 +2462,7 @@ public abstract class EntityLiving extends Entity {
}
} else {
BlockPosition blockposition = this.as();
- float f5 = this.world.getType(blockposition).getBlock().getFrictionFactor();
+ float f5 = this.world.getBlockStateIfLoaded(blockposition).getBlock().getFrictionFactor(); // Yatopia
f = this.onGround ? f5 * 0.91F : 0.91F;
Vec3D vec3d6 = this.a(vec3d, f5);
@@ -3505,7 +3508,7 @@ public abstract class EntityLiving extends Entity {
while (!flag2 && blockposition.getY() > 0) {
BlockPosition blockposition1 = blockposition.down();
- IBlockData iblockdata = world.getType(blockposition1);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition1); // Yatopia
if (iblockdata.getMaterial().isSolid()) {
flag2 = true;
@@ -3617,7 +3620,7 @@ public abstract class EntityLiving extends Entity {
this.stopRiding();
}
- IBlockData iblockdata = this.world.getType(blockposition);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition); // Yatopia
if (iblockdata.getBlock() instanceof BlockBed) {
this.world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockBed.OCCUPIED, true), 3);
@@ -3636,7 +3639,7 @@ public abstract class EntityLiving extends Entity {
private boolean x() {
return (Boolean) this.getBedPosition().map((blockposition) -> {
- return this.world.getType(blockposition).getBlock() instanceof BlockBed;
+ return this.world.getBlockStateIfLoaded(blockposition).getBlock() instanceof BlockBed; // Yatopia
}).orElse(false);
}
@@ -3646,7 +3649,7 @@ public abstract class EntityLiving extends Entity {
this.world.getClass();
optional.filter(world::isLoaded).ifPresent((blockposition) -> {
- IBlockData iblockdata = this.world.getType(blockposition);
+ IBlockData iblockdata = this.world.getBlockStateIfLoaded(blockposition); // Yatopia
if (iblockdata.getBlock() instanceof BlockBed) {
this.world.setTypeAndData(blockposition, (IBlockData) iblockdata.set(BlockBed.OCCUPIED, false), 3);
diff --git a/src/main/java/net/minecraft/world/level/World.java b/src/main/java/net/minecraft/world/level/World.java
index d571624244bf3db54ec266cb760407889fc33bf4..b04a785c70126ad3cc60eff47dffc4a913e0dd87 100644
--- a/src/main/java/net/minecraft/world/level/World.java
+++ b/src/main/java/net/minecraft/world/level/World.java
@@ -96,7 +96,9 @@ import org.bukkit.craftbukkit.block.data.CraftBlockData;
import org.bukkit.event.block.BlockPhysicsEvent;
// CraftBukkit end
-public abstract class World implements GeneratorAccess, AutoCloseable {
+import net.gegy1000.tictacs.NonBlockingWorldAccess; // Yatopia
+
+public abstract class World implements GeneratorAccess, AutoCloseable, NonBlockingWorldAccess { // Yatopia
protected static final Logger LOGGER = LogManager.getLogger();
public static final Codec<ResourceKey<World>> f = MinecraftKey.a.xmap(ResourceKey.b(IRegistry.L), ResourceKey::a);
diff --git a/src/main/java/net/minecraft/world/level/material/FluidType.java b/src/main/java/net/minecraft/world/level/material/FluidType.java
index 6a60f53407db840150b84f4d2a709cc2e92362a4..bf3300607f9142486dc790a600d4c2ffa998d376 100644
--- a/src/main/java/net/minecraft/world/level/material/FluidType.java
+++ b/src/main/java/net/minecraft/world/level/material/FluidType.java
@@ -38,6 +38,7 @@ public abstract class FluidType {
this.a = fluid;
}
+ public final Fluid getFluidData() { return this.h(); } // Yatopia - OBFHELPER
public final Fluid h() {
return this.a;
}