mirror of
https://github.com/barkeser2002/Tenet.git
synced 2026-09-25 10:05:58 +03:00
231 lines
12 KiB
Diff
231 lines
12 KiB
Diff
--- a/net/minecraft/world/entity/Entity.java
|
|
+++ b/net/minecraft/world/entity/Entity.java
|
|
@@ -122,8 +122,65 @@
|
|
import net.minecraft.world.scores.ScoreboardTeamBase;
|
|
import org.slf4j.Logger;
|
|
|
|
+// CraftBukkit start
|
|
+import net.minecraft.core.Position;
|
|
+import net.minecraft.world.level.dimension.WorldDimension;
|
|
+import org.bukkit.Bukkit;
|
|
+import org.bukkit.Location;
|
|
+import org.bukkit.Server;
|
|
+import org.bukkit.block.BlockFace;
|
|
+import org.bukkit.command.CommandSender;
|
|
+import org.bukkit.craftbukkit.event.CraftPortalEvent;
|
|
+import org.bukkit.entity.Hanging;
|
|
+import org.bukkit.entity.LivingEntity;
|
|
+import org.bukkit.entity.Vehicle;
|
|
+import org.bukkit.event.entity.EntityCombustByEntityEvent;
|
|
+import org.bukkit.event.hanging.HangingBreakByEntityEvent;
|
|
+import org.bukkit.event.vehicle.VehicleBlockCollisionEvent;
|
|
+import org.bukkit.event.vehicle.VehicleEnterEvent;
|
|
+import org.bukkit.event.vehicle.VehicleExitEvent;
|
|
+import org.bukkit.craftbukkit.CraftWorld;
|
|
+import org.bukkit.craftbukkit.entity.CraftEntity;
|
|
+import org.bukkit.craftbukkit.entity.CraftPlayer;
|
|
+import org.bukkit.craftbukkit.event.CraftEventFactory;
|
|
+import org.bukkit.entity.Pose;
|
|
+import org.bukkit.event.entity.EntityAirChangeEvent;
|
|
+import org.bukkit.event.entity.EntityCombustEvent;
|
|
+import org.bukkit.event.entity.EntityDropItemEvent;
|
|
+import org.bukkit.event.entity.EntityPortalEvent;
|
|
+import org.bukkit.event.entity.EntityPoseChangeEvent;
|
|
+import org.bukkit.event.player.PlayerTeleportEvent;
|
|
+import org.bukkit.plugin.PluginManager;
|
|
+// CraftBukkit end
|
|
@@ -2391,15 +2772,38 @@
|
|
|
|
@Nullable
|
|
public Entity changeDimension(WorldServer worldserver) {
|
|
+ // CraftBukkit start
|
|
+ return teleportTo(worldserver, null);
|
|
+ }
|
|
+
|
|
+ @Nullable
|
|
+ public Entity teleportTo(WorldServer worldserver, Position location) {
|
|
+ // CraftBukkit end
|
|
if (this.level instanceof WorldServer && !this.isRemoved()) {
|
|
this.level.getProfiler().push("changeDimension");
|
|
- this.unRide();
|
|
+ // CraftBukkit start
|
|
+ // this.decouple();
|
|
+ if (worldserver == null) {
|
|
+ return null;
|
|
+ }
|
|
+ // CraftBukkit end
|
|
this.level.getProfiler().push("reposition");
|
|
- ShapeDetectorShape shapedetectorshape = this.findDimensionEntryPoint(worldserver);
|
|
+ ShapeDetectorShape shapedetectorshape = (location == null) ? this.findDimensionEntryPoint(worldserver) : new ShapeDetectorShape(new Vec3D(location.x(), location.y(), location.z()), Vec3D.ZERO, this.yRot, this.xRot, worldserver, null); // CraftBukkit
|
|
|
|
if (shapedetectorshape == null) {
|
|
return null;
|
|
} else {
|
|
+ // CraftBukkit start
|
|
+ worldserver = shapedetectorshape.world;
|
|
+ if (worldserver == level) {
|
|
+ // SPIGOT-6782: Just move the entity if a plugin changed the world to the one the entity is already in
|
|
+ moveTo(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, shapedetectorshape.xRot);
|
|
+ setDeltaMovement(shapedetectorshape.speed);
|
|
+ return this;
|
|
+ }
|
|
+ this.unRide();
|
|
+ // CraftBukkit end
|
|
+
|
|
this.level.getProfiler().popPush("reloading");
|
|
Entity entity = this.getType().create(worldserver);
|
|
|
|
@@ -2408,9 +2812,17 @@
|
|
entity.moveTo(shapedetectorshape.pos.x, shapedetectorshape.pos.y, shapedetectorshape.pos.z, shapedetectorshape.yRot, entity.getXRot());
|
|
entity.setDeltaMovement(shapedetectorshape.speed);
|
|
worldserver.addDuringTeleport(entity);
|
|
- if (worldserver.dimension() == World.END) {
|
|
- WorldServer.makeObsidianPlatform(worldserver);
|
|
+ if (worldserver.getTypeKey() == WorldDimension.END) { // CraftBukkit
|
|
+ WorldServer.makeObsidianPlatform(worldserver, this); // CraftBukkit
|
|
}
|
|
+ // CraftBukkit start - Forward the CraftEntity to the new entity
|
|
+ this.getBukkitEntity().setHandle(entity);
|
|
+ entity.bukkitEntity = this.getBukkitEntity();
|
|
+
|
|
+ if (this instanceof EntityInsentient) {
|
|
+ ((EntityInsentient) this).dropLeash(true, false); // Unleash to prevent duping of leads.
|
|
+ }
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
this.removeAfterChangingDimensions();
|
|
@@ -2431,20 +2843,34 @@
|
|
|
|
@Nullable
|
|
protected ShapeDetectorShape findDimensionEntryPoint(WorldServer worldserver) {
|
|
- boolean flag = this.level.dimension() == World.END && worldserver.dimension() == World.OVERWORLD;
|
|
- boolean flag1 = worldserver.dimension() == World.END;
|
|
+ // CraftBukkit start
|
|
+ if (worldserver == null) {
|
|
+ return null;
|
|
+ }
|
|
+ boolean flag = this.level.getTypeKey() == WorldDimension.END && worldserver.getTypeKey() == WorldDimension.OVERWORLD; // fromEndToOverworld
|
|
+ boolean flag1 = worldserver.getTypeKey() == WorldDimension.END; // targetIsEnd
|
|
+ // CraftBukkit end
|
|
|
|
if (!flag && !flag1) {
|
|
- boolean flag2 = worldserver.dimension() == World.NETHER;
|
|
+ boolean flag2 = worldserver.getTypeKey() == WorldDimension.NETHER; // CraftBukkit
|
|
|
|
- if (this.level.dimension() != World.NETHER && !flag2) {
|
|
+ if (this.level.getTypeKey() != WorldDimension.NETHER && !flag2) { // CraftBukkit
|
|
return null;
|
|
} else {
|
|
WorldBorder worldborder = worldserver.getWorldBorder();
|
|
double d0 = DimensionManager.getTeleportationScale(this.level.dimensionType(), worldserver.dimensionType());
|
|
BlockPosition blockposition = worldborder.clampToBounds(this.getX() * d0, this.getY(), this.getZ() * d0);
|
|
+ // CraftBukkit start
|
|
+ CraftPortalEvent event = callPortalEvent(this, worldserver, new Position(blockposition.getX(), blockposition.getY(), blockposition.getZ()), PlayerTeleportEvent.TeleportCause.NETHER_PORTAL, flag2 ? 16 : 128, 16);
|
|
+ if (event == null) {
|
|
+ return null;
|
|
+ }
|
|
+ final WorldServer worldserverFinal = worldserver = ((CraftWorld) event.getTo().getWorld()).getHandle();
|
|
+ worldborder = worldserverFinal.getWorldBorder();
|
|
+ blockposition = worldborder.clampToBounds(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ());
|
|
|
|
- return (ShapeDetectorShape) this.getExitPortal(worldserver, blockposition, flag2, worldborder).map((blockutil_rectangle) -> {
|
|
+ return (ShapeDetectorShape) this.getExitPortal(worldserver, blockposition, flag2, worldborder, event.getSearchRadius(), event.getCanCreatePortal(), event.getCreationRadius()).map((blockutil_rectangle) -> {
|
|
+ // CraftBukkit end
|
|
IBlockData iblockdata = this.level.getBlockState(this.portalEntrancePos);
|
|
EnumDirection.EnumAxis enumdirection_enumaxis;
|
|
Vec3D vec3d;
|
|
@@ -2461,8 +2887,8 @@
|
|
vec3d = new Vec3D(0.5D, 0.0D, 0.0D);
|
|
}
|
|
|
|
- return BlockPortalShape.createPortalInfo(worldserver, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.getDimensions(this.getPose()), this.getDeltaMovement(), this.getYRot(), this.getXRot());
|
|
- }).orElse((Object) null);
|
|
+ return BlockPortalShape.createPortalInfo(worldserverFinal, blockutil_rectangle, enumdirection_enumaxis, vec3d, this.getDimensions(this.getPose()), this.getDeltaMovement(), this.getYRot(), this.getXRot(), event); // CraftBukkit
|
|
+ }).orElse(null); // CraftBukkit - decompile error
|
|
}
|
|
} else {
|
|
BlockPosition blockposition1;
|
|
@@ -2472,8 +2898,14 @@
|
|
} else {
|
|
blockposition1 = worldserver.getHeightmapPos(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver.getSharedSpawnPos());
|
|
}
|
|
+ // CraftBukkit start
|
|
+ CraftPortalEvent event = callPortalEvent(this, worldserver, new Position(blockposition1.getX() + 0.5D, blockposition1.getY(), blockposition1.getZ() + 0.5D), PlayerTeleportEvent.TeleportCause.END_PORTAL, 0, 0);
|
|
+ if (event == null) {
|
|
+ return null;
|
|
+ }
|
|
|
|
- return new ShapeDetectorShape(new Vec3D((double) blockposition1.getX() + 0.5D, (double) blockposition1.getY(), (double) blockposition1.getZ() + 0.5D), this.getDeltaMovement(), this.getYRot(), this.getXRot());
|
|
+ return new ShapeDetectorShape(new Vec3D(event.getTo().getX(), event.getTo().getY(), event.getTo().getZ()), this.getDeltaMovement(), this.getYRot(), this.getXRot(), ((CraftWorld) event.getTo().getWorld()).getHandle(), event);
|
|
+ // CraftBukkit end
|
|
}
|
|
}
|
|
|
|
@@ -2481,8 +2913,23 @@
|
|
return BlockPortalShape.getRelativePosition(blockutil_rectangle, enumdirection_enumaxis, this.position(), this.getDimensions(this.getPose()));
|
|
}
|
|
|
|
- protected Optional<BlockUtil.Rectangle> getExitPortal(WorldServer worldserver, BlockPosition blockposition, boolean flag, WorldBorder worldborder) {
|
|
- return worldserver.getPortalForcer().findPortalAround(blockposition, flag, worldborder);
|
|
+ // CraftBukkit start
|
|
+ protected CraftPortalEvent callPortalEvent(Entity entity, WorldServer exitWorldServer, Position exitPosition, PlayerTeleportEvent.TeleportCause cause, int searchRadius, int creationRadius) {
|
|
+ org.bukkit.entity.Entity bukkitEntity = entity.getBukkitEntity();
|
|
+ Location enter = bukkitEntity.getLocation();
|
|
+ Location exit = new Location(exitWorldServer.getWorld(), exitPosition.x(), exitPosition.y(), exitPosition.z());
|
|
+
|
|
+ EntityPortalEvent event = new EntityPortalEvent(bukkitEntity, enter, exit, searchRadius);
|
|
+ event.getEntity().getServer().getPluginManager().callEvent(event);
|
|
+ if (event.isCancelled() || event.getTo() == null || event.getTo().getWorld() == null || !entity.isAlive()) {
|
|
+ return null;
|
|
+ }
|
|
+ return new CraftPortalEvent(event);
|
|
+ }
|
|
+
|
|
+ protected Optional<BlockUtil.Rectangle> getExitPortal(WorldServer worldserver, BlockPosition blockposition, boolean flag, WorldBorder worldborder, int searchRadius, boolean canCreatePortal, int createRadius) {
|
|
+ return worldserver.getPortalForcer().findPortalAround(blockposition, worldborder, searchRadius);
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
public boolean canChangeDimensions() {
|
|
@@ -2691,7 +3138,26 @@
|
|
}
|
|
|
|
public final void setBoundingBox(AxisAlignedBB axisalignedbb) {
|
|
- this.bb = axisalignedbb;
|
|
+ // CraftBukkit start - block invalid bounding boxes
|
|
+ double minX = axisalignedbb.minX,
|
|
+ minY = axisalignedbb.minY,
|
|
+ minZ = axisalignedbb.minZ,
|
|
+ maxX = axisalignedbb.maxX,
|
|
+ maxY = axisalignedbb.maxY,
|
|
+ maxZ = axisalignedbb.maxZ;
|
|
+ double len = axisalignedbb.maxX - axisalignedbb.minX;
|
|
+ if (len < 0) maxX = minX;
|
|
+ if (len > 64) maxX = minX + 64.0;
|
|
+
|
|
+ len = axisalignedbb.maxY - axisalignedbb.minY;
|
|
+ if (len < 0) maxY = minY;
|
|
+ if (len > 64) maxY = minY + 64.0;
|
|
+
|
|
+ len = axisalignedbb.maxZ - axisalignedbb.minZ;
|
|
+ if (len < 0) maxZ = minZ;
|
|
+ if (len > 64) maxZ = minZ + 64.0;
|
|
+ this.bb = new AxisAlignedBB(minX, minY, minZ, maxX, maxY, maxZ);
|
|
+ // CraftBukkit end
|
|
}
|
|
|
|
protected float getEyeHeight(EntityPose entitypose, EntitySize entitysize) {
|
|
@@ -2979,6 +3445,11 @@
|
|
vec3d = vec3d.add(vec3d1);
|
|
++k1;
|
|
}
|
|
+ // CraftBukkit start - store last lava contact location
|
|
+ if (tagkey == TagsFluid.LAVA) {
|
|
+ this.lastLavaContact = blockposition_mutableblockposition.immutable();
|
|
+ }
|
|
+ // CraftBukkit end
|
|
}
|
|
}
|
|
}
|