mirror of
https://github.com/PaperMC/Paper.git
synced 2024-11-30 22:44:17 +01:00
289 lines
12 KiB
Diff
289 lines
12 KiB
Diff
--- a/net/minecraft/server/PortalTravelAgent.java
|
|
+++ b/net/minecraft/server/PortalTravelAgent.java
|
|
@@ -4,6 +4,11 @@
|
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
|
import it.unimi.dsi.fastutil.objects.ObjectIterator;
|
|
import java.util.Random;
|
|
+// CraftBukkit start
|
|
+import org.bukkit.Location;
|
|
+import org.bukkit.event.entity.EntityPortalExitEvent;
|
|
+import org.bukkit.util.Vector;
|
|
+// CraftBukkit end
|
|
|
|
public class PortalTravelAgent {
|
|
|
|
@@ -26,8 +31,21 @@
|
|
int i = MathHelper.floor(entity.locX);
|
|
int j = MathHelper.floor(entity.locY) - 1;
|
|
int k = MathHelper.floor(entity.locZ);
|
|
- boolean flag = true;
|
|
- boolean flag1 = false;
|
|
+ // CraftBukkit start - Modularize end portal creation
|
|
+ BlockPosition created = this.createEndPortal(entity.locX, entity.locY, entity.locZ);
|
|
+ entity.setPositionRotation((double) created.getX(), (double) created.getY(), (double) created.getZ(), entity.yaw, 0.0F);
|
|
+ entity.motX = entity.motY = entity.motZ = 0.0D;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // Split out from original a(Entity, double, double, double, float) method in order to enable being called from createPortal
|
|
+ private BlockPosition createEndPortal(double x, double y, double z) {
|
|
+ int i = MathHelper.floor(x);
|
|
+ int j = MathHelper.floor(y) - 1;
|
|
+ int k = MathHelper.floor(z);
|
|
+ // CraftBukkit end
|
|
+ byte b0 = 1;
|
|
+ byte b1 = 0;
|
|
|
|
for (int l = -2; l <= 2; ++l) {
|
|
for (int i1 = -2; i1 <= 2; ++i1) {
|
|
@@ -42,18 +60,63 @@
|
|
}
|
|
}
|
|
|
|
- entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F);
|
|
- entity.motX = 0.0D;
|
|
- entity.motY = 0.0D;
|
|
- entity.motZ = 0.0D;
|
|
+ // CraftBukkit start
|
|
+ return new BlockPosition(i, k, k);
|
|
+ }
|
|
+
|
|
+ // use logic based on creation to verify end portal
|
|
+ private BlockPosition findEndPortal(BlockPosition portal) {
|
|
+ int i = portal.getX();
|
|
+ int j = portal.getY() - 1;
|
|
+ int k = portal.getZ();
|
|
+ byte b0 = 1;
|
|
+ byte b1 = 0;
|
|
+
|
|
+ for (int l = -2; l <= 2; ++l) {
|
|
+ for (int i1 = -2; i1 <= 2; ++i1) {
|
|
+ for (int j1 = -1; j1 < 3; ++j1) {
|
|
+ int k1 = i + i1 * b0 + l * b1;
|
|
+ int l1 = j + j1;
|
|
+ int i2 = k + i1 * b1 - l * b0;
|
|
+ boolean flag = j1 < 0;
|
|
+
|
|
+ if (this.world.getType(new BlockPosition(k1, l1, i2)).getBlock() != (flag ? Blocks.OBSIDIAN : Blocks.AIR)) {
|
|
+ return null;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
}
|
|
+ return new BlockPosition(i, j, k);
|
|
}
|
|
+ // CraftBukkit end
|
|
|
|
public boolean b(Entity entity, float f) {
|
|
- boolean flag = true;
|
|
+ // CraftBukkit start - Modularize portal search process and entity teleportation
|
|
+ BlockPosition found = this.findPortal(entity.locX, entity.locY, entity.locZ, 128);
|
|
+ if (found == null) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ Location exit = new Location(this.world.getWorld(), found.getX(), found.getY(), found.getZ(), f, entity.pitch);
|
|
+ Vector velocity = entity.getBukkitEntity().getVelocity();
|
|
+ this.adjustExit(entity, exit, velocity);
|
|
+ entity.setPositionRotation(exit.getX(), exit.getY(), exit.getZ(), exit.getYaw(), exit.getPitch());
|
|
+ if (entity.motX != velocity.getX() || entity.motY != velocity.getY() || entity.motZ != velocity.getZ()) {
|
|
+ entity.getBukkitEntity().setVelocity(velocity);
|
|
+ }
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ public BlockPosition findPortal(double x, double y, double z, int radius) {
|
|
+ if (this.world.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) {
|
|
+ return this.findEndPortal(this.world.worldProvider.h());
|
|
+ }
|
|
+ // CraftBukkit end
|
|
double d0 = -1.0D;
|
|
- int i = MathHelper.floor(entity.locX);
|
|
- int j = MathHelper.floor(entity.locZ);
|
|
+ // CraftBukkit start
|
|
+ int i = MathHelper.floor(x);
|
|
+ int j = MathHelper.floor(z);
|
|
+ // CraftBukkit end
|
|
boolean flag1 = true;
|
|
Object object = BlockPosition.ZERO;
|
|
long k = ChunkCoordIntPair.a(i, j);
|
|
@@ -66,12 +129,12 @@
|
|
portaltravelagent_chunkcoordinatesportal.b = this.world.getTime();
|
|
flag1 = false;
|
|
} else {
|
|
- BlockPosition blockposition = new BlockPosition(entity);
|
|
+ BlockPosition blockposition = new BlockPosition(x, y, z); // CraftBukkit
|
|
|
|
- for (int l = -128; l <= 128; ++l) {
|
|
+ for (int l = -radius; l <= radius; ++l) {
|
|
BlockPosition blockposition1;
|
|
|
|
- for (int i1 = -128; i1 <= 128; ++i1) {
|
|
+ for (int i1 = -radius; i1 <= radius; ++i1) {
|
|
for (BlockPosition blockposition2 = blockposition.a(l, this.world.Z() - 1 - blockposition.getY(), i1); blockposition2.getY() >= 0; blockposition2 = blockposition1) {
|
|
blockposition1 = blockposition2.down();
|
|
if (this.world.getType(blockposition2).getBlock() == Blocks.PORTAL) {
|
|
@@ -95,6 +158,29 @@
|
|
if (flag1) {
|
|
this.c.put(k, new PortalTravelAgent.ChunkCoordinatesPortal((BlockPosition) object, this.world.getTime()));
|
|
}
|
|
+ // CraftBukkit start - Move entity teleportation logic into exit
|
|
+ return (BlockPosition) object;
|
|
+ } else {
|
|
+ return null;
|
|
+ }
|
|
+ }
|
|
+
|
|
+ // Entity repositioning logic split out from original b method and combined with repositioning logic for The End from original a method
|
|
+ public void adjustExit(Entity entity, Location position, Vector velocity) {
|
|
+ Location from = position.clone();
|
|
+ Vector before = velocity.clone();
|
|
+ BlockPosition object = new BlockPosition(position.getBlockX(), position.getBlockY(), position.getBlockZ());
|
|
+ float f = position.getYaw();
|
|
+
|
|
+ if (this.world.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END || entity.getBukkitEntity().getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END || entity.getPortalOffset() == null) {
|
|
+ // entity.setPositionRotation((double) i, (double) j, (double) k, entity.yaw, 0.0F);
|
|
+ // entity.motX = entity.motY = entity.motZ = 0.0D;
|
|
+ position.setPitch(0.0F);
|
|
+ velocity.setX(0);
|
|
+ velocity.setY(0);
|
|
+ velocity.setZ(0);
|
|
+ } else {
|
|
+ // CraftBukkit end
|
|
|
|
double d2 = (double) ((BlockPosition) object).getX() + 0.5D;
|
|
double d3 = (double) ((BlockPosition) object).getZ() + 0.5D;
|
|
@@ -132,30 +218,59 @@
|
|
f4 = 1.0F;
|
|
}
|
|
|
|
- double d6 = entity.motX;
|
|
- double d7 = entity.motZ;
|
|
-
|
|
- entity.motX = d6 * (double) f1 + d7 * (double) f4;
|
|
- entity.motZ = d6 * (double) f3 + d7 * (double) f2;
|
|
- entity.yaw = f - (float) (entity.getPortalDirection().opposite().get2DRotationValue() * 90) + (float) (shapedetector_shapedetectorcollection.getFacing().get2DRotationValue() * 90);
|
|
- if (entity instanceof EntityPlayer) {
|
|
- ((EntityPlayer) entity).playerConnection.a(d2, d5, d3, entity.yaw, entity.pitch);
|
|
- } else {
|
|
- entity.setPositionRotation(d2, d5, d3, entity.yaw, entity.pitch);
|
|
- }
|
|
-
|
|
- return true;
|
|
+ // CraftBukkit start
|
|
+ double d6 = velocity.getX();
|
|
+ double d7 = velocity.getZ();
|
|
+ // CraftBukkit end
|
|
+
|
|
+ // CraftBukkit start - Adjust position and velocity instances instead of entity
|
|
+ velocity.setX(d6 * (double) f1 + d7 * (double) f4);
|
|
+ velocity.setZ(d6 * (double) f3 + d7 * (double) f2);
|
|
+ f = f - (float) (entity.getPortalDirection().opposite().get2DRotationValue() * 90) + (float) (shapedetector_shapedetectorcollection.getFacing().get2DRotationValue() * 90);
|
|
+ // entity.setPositionRotation(d2, d5, d3, entity.yaw, entity.pitch);
|
|
+ position.setX(d2);
|
|
+ position.setY(d5);
|
|
+ position.setZ(d3);
|
|
+ position.setYaw(f);
|
|
+ }
|
|
+ EntityPortalExitEvent event = new EntityPortalExitEvent(entity.getBukkitEntity(), from, position, before, velocity);
|
|
+ this.world.getServer().getPluginManager().callEvent(event);
|
|
+ Location to = event.getTo();
|
|
+ if (event.isCancelled() || to == null || !entity.isAlive()) {
|
|
+ position.setX(from.getX());
|
|
+ position.setY(from.getY());
|
|
+ position.setZ(from.getZ());
|
|
+ position.setYaw(from.getYaw());
|
|
+ position.setPitch(from.getPitch());
|
|
+ velocity.copy(before);
|
|
} else {
|
|
- return false;
|
|
+ position.setX(to.getX());
|
|
+ position.setY(to.getY());
|
|
+ position.setZ(to.getZ());
|
|
+ position.setYaw(to.getYaw());
|
|
+ position.setPitch(to.getPitch());
|
|
+ velocity.copy(event.getAfter()); // event.getAfter() will never be null, as setAfter() will cause an NPE if null is passed in
|
|
}
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
public boolean a(Entity entity) {
|
|
- boolean flag = true;
|
|
+ // CraftBukkit start - Allow for portal creation to be based on coordinates instead of entity
|
|
+ return this.createPortal(entity.locX, entity.locY, entity.locZ, 16);
|
|
+ }
|
|
+
|
|
+ public boolean createPortal(double x, double y, double z, int b0) {
|
|
+ if (this.world.getWorld().getEnvironment() == org.bukkit.World.Environment.THE_END) {
|
|
+ createEndPortal(x, y, z);
|
|
+ return true;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
double d0 = -1.0D;
|
|
- int i = MathHelper.floor(entity.locX);
|
|
- int j = MathHelper.floor(entity.locY);
|
|
- int k = MathHelper.floor(entity.locZ);
|
|
+ // CraftBukkit start
|
|
+ int i = MathHelper.floor(x);
|
|
+ int j = MathHelper.floor(y);
|
|
+ int k = MathHelper.floor(z);
|
|
+ // CraftBukkit end
|
|
int l = i;
|
|
int i1 = j;
|
|
int j1 = k;
|
|
@@ -180,10 +295,10 @@
|
|
double d4;
|
|
|
|
for (i2 = i - 16; i2 <= i + 16; ++i2) {
|
|
- d1 = (double) i2 + 0.5D - entity.locX;
|
|
+ d1 = (double) i2 + 0.5D - x; // CraftBukkit
|
|
|
|
for (j2 = k - 16; j2 <= k + 16; ++j2) {
|
|
- d2 = (double) j2 + 0.5D - entity.locZ;
|
|
+ d2 = (double) j2 + 0.5D - z; // CraftBukkit
|
|
|
|
label271:
|
|
for (k2 = this.world.Z() - 1; k2 >= 0; --k2) {
|
|
@@ -215,7 +330,7 @@
|
|
}
|
|
}
|
|
|
|
- d3 = (double) k2 + 0.5D - entity.locY;
|
|
+ d3 = (double) k2 + 0.5D - y; // CraftBukkit
|
|
d4 = d1 * d1 + d3 * d3 + d2 * d2;
|
|
if (d0 < 0.0D || d4 < d0) {
|
|
d0 = d4;
|
|
@@ -232,10 +347,10 @@
|
|
|
|
if (d0 < 0.0D) {
|
|
for (i2 = i - 16; i2 <= i + 16; ++i2) {
|
|
- d1 = (double) i2 + 0.5D - entity.locX;
|
|
+ d1 = (double) i2 + 0.5D - x; // CraftBukkit
|
|
|
|
for (j2 = k - 16; j2 <= k + 16; ++j2) {
|
|
- d2 = (double) j2 + 0.5D - entity.locZ;
|
|
+ d2 = (double) j2 + 0.5D - z; // CraftBukkit
|
|
|
|
label219:
|
|
for (k2 = this.world.Z() - 1; k2 >= 0; --k2) {
|
|
@@ -260,7 +375,7 @@
|
|
}
|
|
}
|
|
|
|
- d3 = (double) k2 + 0.5D - entity.locY;
|
|
+ d3 = (double) k2 + 0.5D - y; // CraftBukkit
|
|
d4 = d1 * d1 + d3 * d3 + d2 * d2;
|
|
if (d0 < 0.0D || d4 < d0) {
|
|
d0 = d4;
|
|
@@ -359,5 +474,10 @@
|
|
super(blockposition.getX(), blockposition.getY(), blockposition.getZ());
|
|
this.b = i;
|
|
}
|
|
+
|
|
+ @Override
|
|
+ public int compareTo(BaseBlockPosition o) {
|
|
+ return this.l(o);
|
|
+ }
|
|
}
|
|
}
|