From fe7db9d53b7ccaf5be93a64ec1a89b2e3af6a0f7 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 15 Jul 2018 16:17:35 +1000 Subject: [PATCH] Add EntityToggleSwimEvent and isSwimming / setSwimming API --- nms-patches/Entity.patch | 26 ++++++++++++++----- .../craftbukkit/entity/CraftLivingEntity.java | 10 +++++++ .../craftbukkit/event/CraftEventFactory.java | 6 +++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch index b7bc2f619f..567ef8b007 100644 --- a/nms-patches/Entity.patch +++ b/nms-patches/Entity.patch @@ -497,7 +497,21 @@ this.passengers.remove(entity); entity.k = 60; } -@@ -1859,14 +2178,49 @@ +@@ -1799,6 +2118,13 @@ + } + + public void g(boolean flag) { ++ // CraftBukkit start ++ if (this.bb() != flag && this instanceof EntityLiving) { ++ if (CraftEventFactory.callToggleSwimEvent((EntityLiving) this, flag).isCancelled()) { ++ return; ++ } ++ } ++ // CraftBukkit end + this.setFlag(4, flag); + } + +@@ -1859,14 +2185,49 @@ } public void setAirTicks(int i) { @@ -550,7 +564,7 @@ } } -@@ -2035,19 +2389,76 @@ +@@ -2035,19 +2396,76 @@ if (!this.world.isClientSide && !this.dead) { this.world.methodProfiler.a("changeDimension"); MinecraftServer minecraftserver = this.bK(); @@ -630,7 +644,7 @@ BlockPosition blockposition; if (i == 1) { -@@ -2076,12 +2487,18 @@ +@@ -2076,12 +2494,18 @@ blockposition = new BlockPosition(this); } @@ -650,7 +664,7 @@ if (j == 1 && i == 1) { BlockPosition blockposition1 = worldserver1.getHighestBlockYAt(HeightMap.Type.MOTION_BLOCKING_NO_LEAVES, worldserver1.getSpawn()); -@@ -2089,6 +2506,7 @@ +@@ -2089,6 +2513,7 @@ } else { entity.setPositionRotation(blockposition, entity.yaw, entity.pitch); } @@ -658,7 +672,7 @@ boolean flag = entity.attachedToPlayer; -@@ -2096,13 +2514,21 @@ +@@ -2096,13 +2521,21 @@ worldserver1.addEntity(entity); entity.attachedToPlayer = flag; worldserver1.entityJoinedWorld(entity, false); @@ -681,7 +695,7 @@ return entity; } else { return null; -@@ -2242,7 +2668,26 @@ +@@ -2242,7 +2675,26 @@ } public void a(AxisAlignedBB axisalignedbb) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java index 0b12ed8197..382b8028aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java @@ -469,6 +469,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { getHandle().setFlag(7, gliding); } + @Override + public boolean isSwimming() { + return getHandle().bb(); + } + + @Override + public void setSwimming(boolean swimming) { + getHandle().g(swimming); + } + @Override public AttributeInstance getAttribute(Attribute attribute) { return getHandle().craftAttributes.getAttribute(attribute); diff --git a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java index 527af08c0a..951a0683cf 100644 --- a/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java +++ b/src/main/java/org/bukkit/craftbukkit/event/CraftEventFactory.java @@ -1015,6 +1015,12 @@ public class CraftEventFactory { return event; } + public static EntityToggleSwimEvent callToggleSwimEvent(EntityLiving entity, boolean swimming) { + EntityToggleSwimEvent event = new EntityToggleSwimEvent((LivingEntity) entity.getBukkitEntity(), swimming); + entity.world.getServer().getPluginManager().callEvent(event); + return event; + } + public static AreaEffectCloudApplyEvent callAreaEffectCloudApplyEvent(EntityAreaEffectCloud cloud, List entities) { AreaEffectCloudApplyEvent event = new AreaEffectCloudApplyEvent((AreaEffectCloud) cloud.getBukkitEntity(), entities); cloud.world.getServer().getPluginManager().callEvent(event);