diff --git a/patches/server-unmapped/0011-LivingEntity-safeFallDistance.patch b/patches/server-unmapped/0011-LivingEntity-safeFallDistance.patch deleted file mode 100644 index 0678acb58..000000000 --- a/patches/server-unmapped/0011-LivingEntity-safeFallDistance.patch +++ /dev/null @@ -1,84 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 5 May 2019 12:58:45 -0500 -Subject: [PATCH] LivingEntity safeFallDistance - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java -index b7b07b652b29e6f84f87fc92add99ce68f8bbd09..b3f04847af8fc7211f5432ad851de03ebbdc1c11 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityLiving.java -+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java -@@ -227,6 +227,7 @@ public abstract class EntityLiving extends Entity { - // CraftBukkit start - public int expToDrop; - public int maxAirTicks = 300; -+ public float safeFallDistance = 3.0F; // Purpur - public boolean forceDrops; - public ArrayList drops = new ArrayList(); - public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; -@@ -321,8 +322,8 @@ public abstract class EntityLiving extends Entity { - this.cR(); - } - -- if (!this.world.isClientSide && this.fallDistance > 3.0F && flag) { -- float f = (float) MathHelper.f(this.fallDistance - 3.0F); -+ if (!this.world.isClientSide && this.fallDistance > this.safeFallDistance && flag) { // Purpur -+ float f = (float) MathHelper.f(this.fallDistance - this.safeFallDistance); // Purpur - - if (!iblockdata.isAir()) { - double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); -@@ -1787,7 +1788,7 @@ public abstract class EntityLiving extends Entity { - MobEffect mobeffect = this.getEffect(MobEffects.JUMP); - float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); - -- return MathHelper.f((f - 3.0F - f2) * f1); -+ return MathHelper.f((f - this.safeFallDistance - f2) * f1); // Purpur - } - - protected void playBlockStepSound() { -diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java -index 1e41c45af6dbcf097d7d6104e63db637f199301a..cb6e2053d1315b65812e7bff8a17988b5b8ab0e4 100644 ---- a/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java -+++ b/src/main/java/net/minecraft/world/entity/animal/horse/EntityHorseAbstract.java -@@ -272,7 +272,7 @@ public abstract class EntityHorseAbstract extends EntityAnimal implements IInven - - @Override - protected int e(float f, float f1) { -- return MathHelper.f((f * 0.5F - 3.0F) * f1); -+ return MathHelper.f((f * 0.5F - this.safeFallDistance) * f1); // Purpur - } - - protected int getChestSlots() { -diff --git a/src/main/java/net/minecraft/world/entity/monster/EntityGiantZombie.java b/src/main/java/net/minecraft/world/entity/monster/EntityGiantZombie.java -index 3b004160da9a2aed440a3ccda538d78f91c61e87..5e6a92dcdbca686d5a8cfc4aaff72b70b81b111f 100644 ---- a/src/main/java/net/minecraft/world/entity/monster/EntityGiantZombie.java -+++ b/src/main/java/net/minecraft/world/entity/monster/EntityGiantZombie.java -@@ -13,6 +13,7 @@ public class EntityGiantZombie extends EntityMonster { - - public EntityGiantZombie(EntityTypes entitytypes, World world) { - super(entitytypes, world); -+ this.safeFallDistance = 10.0F; // Purpur - } - - @Override -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -index 592dacf8cc924caac339a8810ba5b0d85448ed90..75af4d5385d4366e562a53716e020ba20ccbea94 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java -@@ -875,4 +875,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { - throw new IllegalArgumentException(entityCategory + " is an unrecognized entity category"); - } - // Paper end -+ -+ // Purpur start -+ @Override -+ public float getSafeFallDistance() { -+ return getHandle().safeFallDistance; -+ } -+ -+ @Override -+ public void setSafeFallDistance(float safeFallDistance) { -+ getHandle().safeFallDistance = safeFallDistance; -+ } -+ // Purpur end - } diff --git a/patches/server-unmapped/0013-ItemFactory-getMonsterEgg.patch b/patches/server-unmapped/0013-ItemFactory-getMonsterEgg.patch deleted file mode 100644 index 92ec66aca..000000000 --- a/patches/server-unmapped/0013-ItemFactory-getMonsterEgg.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Fri, 5 Jul 2019 16:36:55 -0500 -Subject: [PATCH] ItemFactory#getMonsterEgg - - -diff --git a/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java b/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -index 4d965e504a40eb52777575df839856c825a0900a..addddb64956c63563fc072b35cc511d31c9afd45 100644 ---- a/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -+++ b/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -@@ -35,7 +35,7 @@ import net.minecraft.world.phys.Vec3D; - - public class ItemMonsterEgg extends Item { - -- private static final Map, ItemMonsterEgg> a = Maps.newIdentityHashMap(); -+ public static final Map, ItemMonsterEgg> a = Maps.newIdentityHashMap(); // Purpur - private -> public - private final int b; - private final int c; - private final EntityTypes d; -diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -index 347c23d4b7d47198f214c3f95354e8abb660b191..4ec0e93d93936080d876ffa017ebe181d2896b22 100644 ---- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -+++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java -@@ -401,4 +401,18 @@ public final class CraftItemFactory implements ItemFactory { - new net.md_5.bungee.api.chat.TextComponent(customName)); - } - // Paper end -+ -+ // Purpur start -+ @Override -+ public ItemStack getMonsterEgg(org.bukkit.entity.EntityType type) { -+ if (type == null) { -+ return null; -+ } -+ String name = type.getKey().toString(); -+ net.minecraft.resources.MinecraftKey key = new net.minecraft.resources.MinecraftKey(name); -+ net.minecraft.world.entity.EntityTypes types = net.minecraft.world.entity.EntityTypes.getFromKey(key); -+ net.minecraft.world.item.ItemMonsterEgg egg = net.minecraft.world.item.ItemMonsterEgg.a.get(types); -+ return new net.minecraft.world.item.ItemStack(egg).asBukkitMirror(); -+ } -+ // Purpur end - } diff --git a/patches/server-unmapped/0014-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/server-unmapped/0014-PlayerSetSpawnerTypeWithEggEvent.patch deleted file mode 100644 index c40126d06..000000000 --- a/patches/server-unmapped/0014-PlayerSetSpawnerTypeWithEggEvent.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Fri, 5 Jul 2019 18:21:00 -0500 -Subject: [PATCH] PlayerSetSpawnerTypeWithEggEvent - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityTypes.java b/src/main/java/net/minecraft/world/entity/EntityTypes.java -index 80c229c1852199fda85c03453d64cae33e413e89..6335e9046a6288f7bcf945ad8c381e080744653d 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityTypes.java -+++ b/src/main/java/net/minecraft/world/entity/EntityTypes.java -@@ -274,6 +274,16 @@ public class EntityTypes { - return (EntityTypes) IRegistry.a((IRegistry) IRegistry.ENTITY_TYPE, s, (Object) entitytypes_builder.a(s)); - } - -+ // Purpur start -+ public static EntityTypes getFromBukkitType(org.bukkit.entity.EntityType bukkitType) { -+ return getFromKey(new MinecraftKey(bukkitType.getKey().toString())); -+ } -+ -+ public static EntityTypes getFromKey(MinecraftKey key) { -+ return IRegistry.ENTITY_TYPE.get(key); -+ } -+ // Purpur end -+ - public static MinecraftKey getName(EntityTypes entitytypes) { - return IRegistry.ENTITY_TYPE.getKey(entitytypes); - } -@@ -439,6 +449,16 @@ public class EntityTypes { - return this.bg; - } - -+ // Purpur start -+ public String getName() { -+ return IRegistry.ENTITY_TYPE.getKey(this).getKey(); -+ } -+ -+ public String getTranslatedName() { -+ return getNameComponent().getString(); -+ } -+ // Purpur end -+ - public String getDescriptionId() { return f(); } // Paper - OBFHELPER - public String f() { - if (this.bo == null) { -@@ -448,6 +468,7 @@ public class EntityTypes { - return this.bo; - } - -+ public IChatBaseComponent getNameComponent() { return g(); } // Purpur - OBFHELPER - public IChatBaseComponent g() { - if (this.bp == null) { - this.bp = new ChatMessage(this.f()); -diff --git a/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java b/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -index addddb64956c63563fc072b35cc511d31c9afd45..5e2d0246146af8bf1de1038f6a1953451b99f0f5 100644 ---- a/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -+++ b/src/main/java/net/minecraft/world/item/ItemMonsterEgg.java -@@ -33,6 +33,13 @@ import net.minecraft.world.phys.MovingObjectPosition; - import net.minecraft.world.phys.MovingObjectPositionBlock; - import net.minecraft.world.phys.Vec3D; - -+// Purpur start -+import net.pl3x.purpur.event.PlayerSetSpawnerTypeWithEggEvent; -+import org.bukkit.block.CreatureSpawner; -+import org.bukkit.entity.EntityType; -+import org.bukkit.entity.Player; -+// Purpur end -+ - public class ItemMonsterEgg extends Item { - - public static final Map, ItemMonsterEgg> a = Maps.newIdentityHashMap(); // Purpur - private -> public -@@ -67,6 +74,15 @@ public class ItemMonsterEgg extends Item { - MobSpawnerAbstract mobspawnerabstract = ((TileEntityMobSpawner) tileentity).getSpawner(); - EntityTypes entitytypes = this.a(itemstack.getTag()); - -+ // Purpur start -+ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); -+ PlayerSetSpawnerTypeWithEggEvent event = new PlayerSetSpawnerTypeWithEggEvent((Player) itemactioncontext.getEntity().getBukkitEntity(), bukkitBlock, (CreatureSpawner) bukkitBlock.getState(), EntityType.fromName(entitytypes.getName())); -+ if (!event.callEvent()) { -+ return EnumInteractionResult.FAIL; -+ } -+ entitytypes = EntityTypes.getFromBukkitType(event.getEntityType()); -+ // Purpur end -+ - mobspawnerabstract.setMobName(entitytypes); - tileentity.update(); - world.notify(blockposition, iblockdata, iblockdata, 3); diff --git a/patches/server-unmapped/0015-EMC-MonsterEggSpawnEvent.patch b/patches/server-unmapped/0015-EMC-MonsterEggSpawnEvent.patch deleted file mode 100644 index 86429a61c..000000000 --- a/patches/server-unmapped/0015-EMC-MonsterEggSpawnEvent.patch +++ /dev/null @@ -1,63 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: Aikar -Date: Sat, 20 Jul 2013 22:40:56 -0400 -Subject: [PATCH] EMC - MonsterEggSpawnEvent - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityTypes.java b/src/main/java/net/minecraft/world/entity/EntityTypes.java -index 6335e9046a6288f7bcf945ad8c381e080744653d..1bfde4cfc0f27705238abf7852ad9bb7997e23e6 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityTypes.java -+++ b/src/main/java/net/minecraft/world/entity/EntityTypes.java -@@ -318,13 +318,20 @@ public class EntityTypes { - - @Nullable - public Entity spawnCreature(WorldServer worldserver, @Nullable ItemStack itemstack, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -- return this.spawnCreature(worldserver, itemstack == null ? null : itemstack.getTag(), itemstack != null && itemstack.hasName() ? itemstack.getName() : null, entityhuman, blockposition, enummobspawn, flag, flag1); -+ return this.spawnCreature(worldserver, itemstack, itemstack == null ? null : itemstack.getTag(), itemstack != null && itemstack.hasName() ? itemstack.getName() : null, entityhuman, blockposition, enummobspawn, flag, flag1); // Purpur - } - - @Nullable - public T spawnCreature(WorldServer worldserver, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -+ // Purpur start -+ return spawnCreature(worldserver, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); -+ } -+ -+ @Nullable -+ public T spawnCreature(WorldServer worldserver, @Nullable ItemStack itemstack, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1) { -+ // Purpur end - // CraftBukkit start -- return this.spawnCreature(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); -+ return this.spawnCreature(worldserver, itemstack, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG, null); // Purpur - } - - @Nullable -@@ -349,9 +356,29 @@ public class EntityTypes { - } - } - // Paper end -+ // Purpur start -+ return spawnCreature(worldserver, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason, op); -+ } -+ -+ @Nullable -+ public T spawnCreature(WorldServer worldserver, @Nullable ItemStack itemstack, @Nullable NBTTagCompound nbttagcompound, @Nullable IChatBaseComponent ichatbasecomponent, @Nullable EntityHuman entityhuman, BlockPosition blockposition, EnumMobSpawn enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason, @Nullable java.util.function.Consumer op) { -+ // Purpur end - T t0 = this.createCreature(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); - if (t0 != null && op != null) op.accept(t0); // Paper - -+ // Purpur start -+ if (spawnReason == org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG && itemstack != null && t0 != null) { -+ final net.pl3x.purpur.event.entity.MonsterEggSpawnEvent event = new net.pl3x.purpur.event.entity.MonsterEggSpawnEvent(entityhuman != null ? entityhuman.getBukkitEntity() : null, t0.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack)); -+ if (!event.callEvent()) { -+ worldserver.removeEntity(t0); -+ return null; -+ } -+ if (event.getEntity().getEntityId() != t0.getId()) { -+ return (T) ((org.bukkit.craftbukkit.entity.CraftEntity) event.getEntity()).getHandle(); -+ } -+ } -+ // Purpur end -+ - if (t0 != null) { - worldserver.addAllEntities(t0, spawnReason); - return !t0.dead ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled diff --git a/patches/server-unmapped/0016-Player-invulnerabilities.patch b/patches/server-unmapped/0016-Player-invulnerabilities.patch deleted file mode 100644 index b57c3671e..000000000 --- a/patches/server-unmapped/0016-Player-invulnerabilities.patch +++ /dev/null @@ -1,134 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sat, 2 May 2020 20:55:44 -0500 -Subject: [PATCH] Player invulnerabilities - - -diff --git a/src/main/java/net/minecraft/server/level/EntityPlayer.java b/src/main/java/net/minecraft/server/level/EntityPlayer.java -index 0130b0329691f696107a4d1e6a01043b59077000..e06c324d38f1be72a90aa75b96d471b96123ba56 100644 ---- a/src/main/java/net/minecraft/server/level/EntityPlayer.java -+++ b/src/main/java/net/minecraft/server/level/EntityPlayer.java -@@ -285,6 +285,8 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - this.canPickUpLoot = true; - this.maxHealthCache = this.getMaxHealth(); - this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper -+ -+ this.invulnerableTicks = world.purpurConfig.playerSpawnInvulnerableTicks; // Purpur - } - // Paper start - public BlockPosition getPointInFront(double inFront) { -@@ -950,6 +952,12 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - - } - -+ // Purpur start -+ public boolean isSpawnInvulnerable() { -+ return invulnerableTicks > 0 || frozen; -+ } -+ // Purpur end -+ - @Override - public boolean damageEntity(DamageSource damagesource, float f) { - if (this.isInvulnerable(damagesource)) { -@@ -957,7 +965,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - } else { - boolean flag = this.server.j() && this.canPvP() && "fall".equals(damagesource.translationIndex); - -- if (!flag && this.invulnerableTicks > 0 && damagesource != DamageSource.OUT_OF_WORLD) { -+ if (!flag && isSpawnInvulnerable() && damagesource != DamageSource.OUT_OF_WORLD) { // Purpur - return false; - } else { - if (damagesource instanceof EntityDamageSource) { -@@ -1134,6 +1142,7 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - } - // Paper end - -+ this.invulnerableTicks = worldserver.purpurConfig.playerSpawnInvulnerableTicks; // Purpur - return this; - } - } -@@ -2331,9 +2340,17 @@ public class EntityPlayer extends EntityHuman implements ICrafting { - - @Override - public boolean isFrozen() { // Paper - protected > public -- return super.isFrozen() || (this.playerConnection != null && this.playerConnection.isDisconnected()); // Paper -+ return super.isFrozen() || frozen || (this.playerConnection != null && this.playerConnection.isDisconnected()); // Paper // Purpur - } - -+ // Purpur start -+ private boolean frozen = false; -+ -+ public void setFrozen(boolean frozen) { -+ this.frozen = frozen; -+ } -+ // Purpur end -+ - @Override - public Scoreboard getScoreboard() { - return getBukkitEntity().getScoreboard().getHandle(); -diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java -index d228d07ee4febfdc931da5e142825f314f0a8848..ab807588a4b7dc0fd8bb6f829f9d1a785490d733 100644 ---- a/src/main/java/net/minecraft/server/network/PlayerConnection.java -+++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java -@@ -1828,6 +1828,7 @@ public class PlayerConnection implements PacketListenerPlayIn { - PlayerConnectionUtils.ensureMainThread(packetplayinresourcepackstatus, this, this.player.getWorldServer()); - // Paper start - PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packetplayinresourcepackstatus.status.ordinal()]; -+ if (player.world.purpurConfig.playerInvulnerableWhileAcceptingResourcePack) player.setFrozen(packStatus == PlayerResourcePackStatusEvent.Status.ACCEPTED); // Purpur - player.getBukkitEntity().setResourcePackStatus(packStatus); - this.server.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(getPlayer(), packStatus)); - // Paper end -diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java -index 90776231b1faffb11e4394f555f336ca248e3004..6c95d8449c9931638c2550dd14eb5a08a980f327 100644 ---- a/src/main/java/net/minecraft/server/players/PlayerList.java -+++ b/src/main/java/net/minecraft/server/players/PlayerList.java -@@ -1014,6 +1014,8 @@ public abstract class PlayerList { - } - // Paper end - -+ entityplayer1.invulnerableTicks = entityplayer1.world.purpurConfig.playerSpawnInvulnerableTicks; // Purpur -+ - // CraftBukkit end - return entityplayer1; - } -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 2578a4677d1ee060f687be531e696b7c7be89e84..c441fcea9b2b5a77b801c8a69541cf42050927dc 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -67,4 +67,11 @@ public class PurpurWorldConfig { - idleTimeoutCountAsSleeping = getBoolean("gameplay-mechanics.player.idle-timeout.count-as-sleeping", idleTimeoutCountAsSleeping); - idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); - } -+ -+ public int playerSpawnInvulnerableTicks = 60; -+ public boolean playerInvulnerableWhileAcceptingResourcePack = false; -+ private void playerInvulnerabilities() { -+ playerSpawnInvulnerableTicks = getInt("gameplay-mechanics.player.spawn-invulnerable-ticks", playerSpawnInvulnerableTicks); -+ playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack); -+ } - } -diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -index 8e36d1dbde5128eea79d321496210065620acebd..45bf2b87518ba81cb4a18a59d11dba9430e63e40 100644 ---- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -+++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java -@@ -2460,5 +2460,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { - public void resetIdleTimer() { - getHandle().resetIdleTimer(); - } -+ -+ @Override -+ public boolean isSpawnInvulnerable() { -+ return getHandle().isSpawnInvulnerable(); -+ } -+ -+ @Override -+ public int getSpawnInvulnerableTicks() { -+ return getHandle().invulnerableTicks; -+ } -+ -+ @Override -+ public void setSpawnInvulnerableTicks(int invulnerableTicks) { -+ getHandle().invulnerableTicks = invulnerableTicks; -+ } - // Purpur end - } diff --git a/patches/server/0010-LivingEntity-safeFallDistance.patch b/patches/server/0010-LivingEntity-safeFallDistance.patch new file mode 100644 index 000000000..2342683c7 --- /dev/null +++ b/patches/server/0010-LivingEntity-safeFallDistance.patch @@ -0,0 +1,84 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 5 May 2019 12:58:45 -0500 +Subject: [PATCH] LivingEntity safeFallDistance + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index cf7588aa282709a7b8ce6caff4aa713d54280660..03cebf030a17f342b1cfc071d22280ca83b8e66f 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -255,6 +255,7 @@ public abstract class LivingEntity extends Entity { + // CraftBukkit start + public int expToDrop; + public int maxAirTicks = 300; ++ public float safeFallDistance = 3.0F; // Purpur + public boolean forceDrops; + public ArrayList drops = new ArrayList(); + public final org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; +@@ -350,8 +351,8 @@ public abstract class LivingEntity extends Entity { + this.tryAddSoulSpeed(); + } + +- if (!this.level.isClientSide && this.fallDistance > 3.0F && onGround) { +- float f = (float) Mth.ceil(this.fallDistance - 3.0F); ++ if (!this.level.isClientSide && this.fallDistance > this.safeFallDistance && onGround) { // Purpur ++ float f = (float) Mth.ceil(this.fallDistance - this.safeFallDistance); // Purpur + + if (!landedState.isAir()) { + double d1 = Math.min((double) (0.2F + f / 15.0F), 2.5D); +@@ -1880,7 +1881,7 @@ public abstract class LivingEntity extends Entity { + MobEffectInstance mobeffect = this.getEffect(MobEffects.JUMP); + float f2 = mobeffect == null ? 0.0F : (float) (mobeffect.getAmplifier() + 1); + +- return Mth.ceil((fallDistance - 3.0F - f2) * damageMultiplier); ++ return Mth.ceil((fallDistance - this.safeFallDistance - f2) * damageMultiplier); // Purpur + } + + protected void playBlockFallSound() { +diff --git a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +index d9699a422164c30a8386a8042202e1a8bc0ab2b0..7db4f64a6f4c4406d8eb47fd2264be3312c62a2f 100644 +--- a/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java ++++ b/src/main/java/net/minecraft/world/entity/animal/horse/AbstractHorse.java +@@ -285,7 +285,7 @@ public abstract class AbstractHorse extends Animal implements ContainerListener, + + @Override + protected int calculateFallDamage(float fallDistance, float damageMultiplier) { +- return Mth.ceil((fallDistance * 0.5F - 3.0F) * damageMultiplier); ++ return Mth.ceil((fallDistance * 0.5F - this.safeFallDistance) * damageMultiplier); + } + + protected int getInventorySize() { +diff --git a/src/main/java/net/minecraft/world/entity/monster/Giant.java b/src/main/java/net/minecraft/world/entity/monster/Giant.java +index 0d578ab12c874bd2daccc4322a3fe1abafa4bc18..a183226bb0cf01c5aaf7babe1d08fa9ab7388648 100644 +--- a/src/main/java/net/minecraft/world/entity/monster/Giant.java ++++ b/src/main/java/net/minecraft/world/entity/monster/Giant.java +@@ -12,6 +12,7 @@ import net.minecraft.world.level.LevelReader; + public class Giant extends Monster { + public Giant(EntityType type, Level world) { + super(type, world); ++ this.safeFallDistance = 10.0F; // Purpur + } + + @Override +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +index 53b61b609361c305fb8d1f1a8700e81ce139fde4..3e4ad876fa34d0e509fe6331767d31068c4ddb20 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftLivingEntity.java +@@ -872,4 +872,16 @@ public class CraftLivingEntity extends CraftEntity implements LivingEntity { + throw new IllegalArgumentException(entityCategory + " is an unrecognized entity category"); + } + // Paper end ++ ++ // Purpur start ++ @Override ++ public float getSafeFallDistance() { ++ return getHandle().safeFallDistance; ++ } ++ ++ @Override ++ public void setSafeFallDistance(float safeFallDistance) { ++ getHandle().safeFallDistance = safeFallDistance; ++ } ++ // Purpur end + } diff --git a/patches/server-unmapped/0012-Lagging-threshold.patch b/patches/server/0011-Lagging-threshold.patch similarity index 65% rename from patches/server-unmapped/0012-Lagging-threshold.patch rename to patches/server/0011-Lagging-threshold.patch index 9376c94af..9f97c45e4 100644 --- a/patches/server-unmapped/0012-Lagging-threshold.patch +++ b/patches/server/0011-Lagging-threshold.patch @@ -5,31 +5,31 @@ Subject: [PATCH] Lagging threshold diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 7aa50a1e4ecb03a4cbe1ccf45ad7d900a8509f6f..c4f0bcc55546e9e01e22d5f4c328165c31e87809 100644 +index e21ad36be8a95c7d6e3d4b1ee920b6317d13e503..592db0dbc9817d93153179c4afa04787d8fb5e94 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -279,6 +279,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant +Date: Fri, 5 Jul 2019 16:36:55 -0500 +Subject: [PATCH] ItemFactory#getMonsterEgg + + +diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java +index 32a9a752e1afdcdaffa5198f3577856f742c9136..ab7e4780529a88183600f3d3860e882bbe3a1754 100644 +--- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java ++++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java +@@ -36,7 +36,7 @@ import net.minecraft.world.phys.Vec3; + + public class SpawnEggItem extends Item { + +- private static final Map, SpawnEggItem> BY_ID = Maps.newIdentityHashMap(); ++ public static final Map, SpawnEggItem> BY_ID = Maps.newIdentityHashMap(); // Purpur - private -> public + private final int backgroundColor; + private final int highlightColor; + private final EntityType defaultType; +diff --git a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +index 9cde8ae979287d342574da066f65731324725dea..1c726483ea3f94a6b18d998053fb5114a94af6e0 100644 +--- a/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java ++++ b/src/main/java/org/bukkit/craftbukkit/inventory/CraftItemFactory.java +@@ -404,4 +404,18 @@ public final class CraftItemFactory implements ItemFactory { + new net.md_5.bungee.api.chat.TextComponent(customName)); + } + // Paper end ++ ++ // Purpur start ++ @Override ++ public ItemStack getMonsterEgg(org.bukkit.entity.EntityType type) { ++ if (type == null) { ++ return null; ++ } ++ String name = type.getKey().toString(); ++ net.minecraft.resources.ResourceLocation key = new net.minecraft.resources.ResourceLocation(name); ++ net.minecraft.world.entity.EntityType types = net.minecraft.world.entity.EntityType.getFromKey(key); ++ net.minecraft.world.item.SpawnEggItem egg = net.minecraft.world.item.SpawnEggItem.BY_ID.get(types); ++ return new net.minecraft.world.item.ItemStack(egg).asBukkitMirror(); ++ } ++ // Purpur end + } diff --git a/patches/server/0013-PlayerSetSpawnerTypeWithEggEvent.patch b/patches/server/0013-PlayerSetSpawnerTypeWithEggEvent.patch new file mode 100644 index 000000000..e0628fc90 --- /dev/null +++ b/patches/server/0013-PlayerSetSpawnerTypeWithEggEvent.patch @@ -0,0 +1,64 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Fri, 5 Jul 2019 18:21:00 -0500 +Subject: [PATCH] PlayerSetSpawnerTypeWithEggEvent + + +diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java +index 2b82859d4ac43036e346220333e676998742d56d..87211af4cf638f4b6042548c030ec8927a28d760 100644 +--- a/src/main/java/net/minecraft/world/entity/EntityType.java ++++ b/src/main/java/net/minecraft/world/entity/EntityType.java +@@ -287,6 +287,16 @@ public class EntityType implements EntityTypeTest { + return (EntityType) Registry.register((Registry) Registry.ENTITY_TYPE, id, (Object) type.build(id)); + } + ++ // Purpur start ++ public static EntityType getFromBukkitType(org.bukkit.entity.EntityType bukkitType) { ++ return getFromKey(new ResourceLocation(bukkitType.getKey().toString())); ++ } ++ ++ public static EntityType getFromKey(ResourceLocation location) { ++ return Registry.ENTITY_TYPE.get(location); ++ } ++ // Purpur end ++ + public static ResourceLocation getKey(EntityType type) { + return Registry.ENTITY_TYPE.getKey(type); + } +@@ -453,6 +463,16 @@ public class EntityType implements EntityTypeTest { + return this.category; + } + ++ // Purpur start ++ public String getName() { ++ return Registry.ENTITY_TYPE.getKey(this).getPath(); ++ } ++ ++ public String getTranslatedName() { ++ return getDescription().getString(); ++ } ++ // Purpur end ++ + public String getDescriptionId() { + if (this.descriptionId == null) { + this.descriptionId = Util.makeDescriptionId("entity", Registry.ENTITY_TYPE.getKey(this)); +diff --git a/src/main/java/net/minecraft/world/item/SpawnEggItem.java b/src/main/java/net/minecraft/world/item/SpawnEggItem.java +index ab7e4780529a88183600f3d3860e882bbe3a1754..fbe131ac0381c89cd297b5c2f7519f81aa565440 100644 +--- a/src/main/java/net/minecraft/world/item/SpawnEggItem.java ++++ b/src/main/java/net/minecraft/world/item/SpawnEggItem.java +@@ -68,6 +68,15 @@ public class SpawnEggItem extends Item { + BaseSpawner mobspawnerabstract = ((SpawnerBlockEntity) tileentity).getSpawner(); + EntityType entitytypes = this.getType(itemstack.getTag()); + ++ // Purpur start ++ org.bukkit.block.Block bukkitBlock = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); ++ net.pl3x.purpur.event.PlayerSetSpawnerTypeWithEggEvent event = new net.pl3x.purpur.event.PlayerSetSpawnerTypeWithEggEvent((org.bukkit.entity.Player) context.getPlayer().getBukkitEntity(), bukkitBlock, (org.bukkit.block.CreatureSpawner) bukkitBlock.getState(), org.bukkit.entity.EntityType.fromName(entitytypes.getName())); ++ if (!event.callEvent()) { ++ return InteractionResult.FAIL; ++ } ++ entitytypes = EntityType.getFromBukkitType(event.getEntityType()); ++ // Purpur end ++ + mobspawnerabstract.setEntityId(entitytypes); + tileentity.setChanged(); + world.sendBlockUpdated(blockposition, iblockdata, iblockdata, 3); diff --git a/patches/server/0014-EMC-MonsterEggSpawnEvent.patch b/patches/server/0014-EMC-MonsterEggSpawnEvent.patch new file mode 100644 index 000000000..ea4518fec --- /dev/null +++ b/patches/server/0014-EMC-MonsterEggSpawnEvent.patch @@ -0,0 +1,63 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Aikar +Date: Sat, 20 Jul 2013 22:40:56 -0400 +Subject: [PATCH] EMC - MonsterEggSpawnEvent + + +diff --git a/src/main/java/net/minecraft/world/entity/EntityType.java b/src/main/java/net/minecraft/world/entity/EntityType.java +index 87211af4cf638f4b6042548c030ec8927a28d760..0e5f87f87c6523430e86cc65987f22db5568bc18 100644 +--- a/src/main/java/net/minecraft/world/entity/EntityType.java ++++ b/src/main/java/net/minecraft/world/entity/EntityType.java +@@ -333,13 +333,20 @@ public class EntityType implements EntityTypeTest { + + @Nullable + public Entity spawn(ServerLevel world, @Nullable ItemStack stack, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { +- return this.spawn(world, stack == null ? null : stack.getTag(), stack != null && stack.hasCustomHoverName() ? stack.getHoverName() : null, player, pos, spawnReason, alignPosition, invertY); ++ return this.spawn(world, stack, stack == null ? null : stack.getTag(), stack != null && stack.hasCustomHoverName() ? stack.getHoverName() : null, player, pos, spawnReason, alignPosition, invertY); // Purpur + } + + @Nullable + public T spawn(ServerLevel world, @Nullable CompoundTag itemNbt, @Nullable Component name, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { ++ // Purpur start ++ return spawn(world, null, itemNbt, name, player, pos, spawnReason, alignPosition, invertY); // Purpur ++ } ++ ++ @Nullable ++ public T spawn(ServerLevel world, @Nullable ItemStack stack, @Nullable CompoundTag itemNbt, @Nullable Component name, @Nullable Player player, BlockPos pos, MobSpawnType spawnReason, boolean alignPosition, boolean invertY) { ++ // Purpur end + // CraftBukkit start +- return this.spawnCreature(world, itemNbt, name, player, pos, spawnReason, alignPosition, invertY, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG); ++ return this.spawn(world, stack, itemNbt, name, player, pos, spawnReason, alignPosition, invertY, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG, null); // Purpur + } + + @Nullable +@@ -364,9 +371,29 @@ public class EntityType implements EntityTypeTest { + } + } + // Paper end ++ // Purpur start ++ return this.spawn(worldserver, null, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1, spawnReason, op); ++ } ++ ++ @Nullable ++ public T spawn(ServerLevel worldserver, @Nullable ItemStack stack, @Nullable CompoundTag nbttagcompound, @Nullable Component ichatbasecomponent, @Nullable Player entityhuman, BlockPos blockposition, MobSpawnType enummobspawn, boolean flag, boolean flag1, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason spawnReason, @Nullable java.util.function.Consumer op) { ++ // Purpur end + T t0 = this.create(worldserver, nbttagcompound, ichatbasecomponent, entityhuman, blockposition, enummobspawn, flag, flag1); + if (t0 != null && op != null) op.accept(t0); // Paper + ++ // Purpur start ++ if (spawnReason == org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.SPAWNER_EGG && stack != null && t0 != null) { ++ final net.pl3x.purpur.event.entity.MonsterEggSpawnEvent event = new net.pl3x.purpur.event.entity.MonsterEggSpawnEvent(entityhuman != null ? entityhuman.getBukkitEntity() : null, t0.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(stack)); ++ if (!event.callEvent()) { ++ t0.setRemoved(Entity.RemovalReason.DISCARDED); ++ return null; ++ } ++ if (event.getEntity().getEntityId() != t0.getId()) { ++ return (T) ((org.bukkit.craftbukkit.entity.CraftEntity) event.getEntity()).getHandle(); ++ } ++ } ++ // Purpur end ++ + if (t0 != null) { + worldserver.addAllEntities(t0, spawnReason); + return !t0.isRemoved() ? t0 : null; // Don't return an entity when CreatureSpawnEvent is canceled diff --git a/patches/server/0015-Player-invulnerabilities.patch b/patches/server/0015-Player-invulnerabilities.patch new file mode 100644 index 000000000..15096f67f --- /dev/null +++ b/patches/server/0015-Player-invulnerabilities.patch @@ -0,0 +1,132 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sat, 2 May 2020 20:55:44 -0500 +Subject: [PATCH] Player invulnerabilities + + +diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java +index 2ddce62629be9fc1af38306ca50ad3e81150f94c..3e89650de727069aa27cc86196937cd71770ed4c 100644 +--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java ++++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java +@@ -331,6 +331,7 @@ public class ServerPlayer extends Player { + this.bukkitPickUpLoot = true; + this.maxHealthCache = this.getMaxHealth(); + this.cachedSingleMobDistanceMap = new com.destroystokyo.paper.util.PooledHashSets.PooledObjectLinkedOpenHashSet<>(this); // Paper ++ this.spawnInvulnerableTime = world.purpurConfig.playerSpawnInvulnerableTicks; // Purpur + } + // Paper start + public BlockPos getPointInFront(double inFront) { +@@ -963,6 +964,12 @@ public class ServerPlayer extends Player { + + } + ++ // Purpur start ++ public boolean isSpawnInvulnerable() { ++ return spawnInvulnerableTime > 0 || frozen; ++ } ++ // Purpur end ++ + @Override + public boolean hurt(DamageSource source, float amount) { + if (this.isInvulnerableTo(source)) { +@@ -970,7 +977,7 @@ public class ServerPlayer extends Player { + } else { + boolean flag = this.server.isDedicatedServer() && this.isPvpAllowed() && "fall".equals(source.msgId); + +- if (!flag && this.spawnInvulnerableTime > 0 && source != DamageSource.OUT_OF_WORLD) { ++ if (!flag && isSpawnInvulnerable() && source != DamageSource.OUT_OF_WORLD) { // Purpur + return false; + } else { + if (source instanceof EntityDamageSource) { +@@ -1145,6 +1152,7 @@ public class ServerPlayer extends Player { + } + // Paper end + ++ this.spawnInvulnerableTime = worldserver.purpurConfig.playerSpawnInvulnerableTicks; // Purpur + return this; + } + } +@@ -2363,8 +2371,16 @@ public class ServerPlayer extends Player { + + @Override + public boolean isImmobile() { +- return super.isImmobile() || (this.connection != null && this.connection.isDisconnected()); // Paper ++ return super.isImmobile() || frozen || (this.connection != null && this.connection.isDisconnected()); // Paper // Purpur ++ } ++ ++ // Purpur start ++ private boolean frozen = false; ++ ++ public void setFrozen(boolean frozen) { ++ this.frozen = frozen; + } ++ // Purpur end + + @Override + public Scoreboard getScoreboard() { +diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +index c2d4c8dc38f2bdf376a02b243e1b8fba8b133979..7700bad94ad07bfac4a5efd90689f26bec1eed45 100644 +--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java ++++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java +@@ -1861,6 +1861,7 @@ public class ServerGamePacketListenerImpl implements ServerPlayerConnection, Ser + } + // Paper start + PlayerResourcePackStatusEvent.Status packStatus = PlayerResourcePackStatusEvent.Status.values()[packet.action.ordinal()]; ++ if (player.level.purpurConfig.playerInvulnerableWhileAcceptingResourcePack) player.setFrozen(packStatus == PlayerResourcePackStatusEvent.Status.ACCEPTED); // Purpur + player.getBukkitEntity().setResourcePackStatus(packStatus); + this.cserver.getPluginManager().callEvent(new PlayerResourcePackStatusEvent(this.getCraftPlayer(), packStatus)); // CraftBukkit + // Paper end +diff --git a/src/main/java/net/minecraft/server/players/PlayerList.java b/src/main/java/net/minecraft/server/players/PlayerList.java +index bc3fe18dd32da2d381b9546aae675a475c073696..ef5315298bde3a82de75f1f9099d6298a1345a5d 100644 +--- a/src/main/java/net/minecraft/server/players/PlayerList.java ++++ b/src/main/java/net/minecraft/server/players/PlayerList.java +@@ -984,6 +984,8 @@ public abstract class PlayerList { + } + // Paper end + ++ entityplayer1.spawnInvulnerableTime = entityplayer1.level.purpurConfig.playerSpawnInvulnerableTicks; // Purpur ++ + // CraftBukkit end + return entityplayer1; + } +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 2578a4677d1ee060f687be531e696b7c7be89e84..c441fcea9b2b5a77b801c8a69541cf42050927dc 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -67,4 +67,11 @@ public class PurpurWorldConfig { + idleTimeoutCountAsSleeping = getBoolean("gameplay-mechanics.player.idle-timeout.count-as-sleeping", idleTimeoutCountAsSleeping); + idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); + } ++ ++ public int playerSpawnInvulnerableTicks = 60; ++ public boolean playerInvulnerableWhileAcceptingResourcePack = false; ++ private void playerInvulnerabilities() { ++ playerSpawnInvulnerableTicks = getInt("gameplay-mechanics.player.spawn-invulnerable-ticks", playerSpawnInvulnerableTicks); ++ playerInvulnerableWhileAcceptingResourcePack = getBoolean("gameplay-mechanics.player.invulnerable-while-accepting-resource-pack", playerInvulnerableWhileAcceptingResourcePack); ++ } + } +diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +index 391d7ebe71b7e741f058566cc5cdb9bb6a5a879a..b76a4bee5bae4278053adc311ab1b865ed263c6b 100644 +--- a/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java ++++ b/src/main/java/org/bukkit/craftbukkit/entity/CraftPlayer.java +@@ -2462,5 +2462,20 @@ public class CraftPlayer extends CraftHumanEntity implements Player { + public void resetIdleTimer() { + getHandle().resetLastActionTime(); + } ++ ++ @Override ++ public boolean isSpawnInvulnerable() { ++ return getHandle().isSpawnInvulnerable(); ++ } ++ ++ @Override ++ public int getSpawnInvulnerableTicks() { ++ return getHandle().spawnInvulnerableTime; ++ } ++ ++ @Override ++ public void setSpawnInvulnerableTicks(int spawnInvulnerableTime) { ++ getHandle().spawnInvulnerableTime = spawnInvulnerableTime; ++ } + // Purpur end + }