From 3369c2c1a6b27ae581b1ed18f753ded679adf86d Mon Sep 17 00:00:00 2001 From: Ben Kerllenevich Date: Wed, 16 Jun 2021 11:23:56 -0400 Subject: [PATCH] you guessed it, another 6 --- ...ispenser-curse-of-binding-protection.patch | 69 ---------- .../0071-Add-obfhelpers-for-plugin-use.patch | 18 --- ...g-mends-most-damages-equipment-first.patch | 99 -------------- .../0074-Implement-elytra-settings.patch | 126 ------------------ ...ispenser-curse-of-binding-protection.patch | 60 +++++++++ ...-for-boats-to-eject-players-on-land.patch} | 20 +-- ...g-mends-most-damages-equipment-first.patch | 94 +++++++++++++ ...070-Add-5-second-tps-average-in-tps.patch} | 36 ++--- .../0071-Implement-elytra-settings.patch | 124 +++++++++++++++++ 9 files changed, 306 insertions(+), 340 deletions(-) delete mode 100644 patches/server-unmapped/0069-Dispenser-curse-of-binding-protection.patch delete mode 100644 patches/server-unmapped/0071-Add-obfhelpers-for-plugin-use.patch delete mode 100644 patches/server-unmapped/0072-Mending-mends-most-damages-equipment-first.patch delete mode 100644 patches/server-unmapped/0074-Implement-elytra-settings.patch create mode 100644 patches/server/0067-Dispenser-curse-of-binding-protection.patch rename patches/{server-unmapped/0070-Add-option-for-boats-to-eject-players-on-land.patch => server/0068-Add-option-for-boats-to-eject-players-on-land.patch} (69%) create mode 100644 patches/server/0069-Mending-mends-most-damages-equipment-first.patch rename patches/{server-unmapped/0073-Add-5-second-tps-average-in-tps.patch => server/0070-Add-5-second-tps-average-in-tps.patch} (79%) create mode 100644 patches/server/0071-Implement-elytra-settings.patch diff --git a/patches/server-unmapped/0069-Dispenser-curse-of-binding-protection.patch b/patches/server-unmapped/0069-Dispenser-curse-of-binding-protection.patch deleted file mode 100644 index 9026596ac..000000000 --- a/patches/server-unmapped/0069-Dispenser-curse-of-binding-protection.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 25 Aug 2019 00:09:52 -0500 -Subject: [PATCH] Dispenser curse of binding protection - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityInsentient.java b/src/main/java/net/minecraft/world/entity/EntityInsentient.java -index f6e868a5cd62e0d997a2538c6b2bead0e3d88178..5a9a658c56f1d39bcbcabc0415c1c3f7d96cfab7 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityInsentient.java -+++ b/src/main/java/net/minecraft/world/entity/EntityInsentient.java -@@ -65,6 +65,7 @@ import net.minecraft.world.item.ItemSword; - import net.minecraft.world.item.ItemTool; - import net.minecraft.world.item.Items; - import net.minecraft.world.item.enchantment.EnchantmentManager; -+import net.minecraft.world.item.enchantment.Enchantments; - import net.minecraft.world.level.GameRules; - import net.minecraft.world.level.GeneratorAccess; - import net.minecraft.world.level.IBlockAccess; -@@ -1062,6 +1063,13 @@ public abstract class EntityInsentient extends EntityLiving { - - } - -+ // Purpur start -+ public static EnumItemSlot getSlotForDispenser(ItemStack itemstack) { -+ return EnchantmentManager.getEnchantmentLevel(Enchantments.BINDING_CURSE, itemstack) > 0 ? EnumItemSlot.MAINHAND : getSlotForItemStack(itemstack); -+ } -+ // Purpur end -+ -+ public static EnumItemSlot getSlotForItemStack(ItemStack itemstack) { return j(itemstack); } // Purpur - OBFHELPER - public static EnumItemSlot j(ItemStack itemstack) { - Item item = itemstack.getItem(); - -diff --git a/src/main/java/net/minecraft/world/item/ItemArmor.java b/src/main/java/net/minecraft/world/item/ItemArmor.java -index 7962808aebf67cf9bc1dc4c1e106e943536fdced..d072b604a1cd8835c1fe658831cdaf9f27d02cd5 100644 ---- a/src/main/java/net/minecraft/world/item/ItemArmor.java -+++ b/src/main/java/net/minecraft/world/item/ItemArmor.java -@@ -54,7 +54,7 @@ public class ItemArmor extends Item implements ItemWearable { - return false; - } else { - EntityLiving entityliving = (EntityLiving) list.get(0); -- EnumItemSlot enumitemslot = EntityInsentient.j(itemstack); -+ EnumItemSlot enumitemslot = isourceblock.getWorld().purpurConfig.dispenserApplyCursedArmor ? EntityInsentient.getSlotForItemStack(itemstack) : EntityInsentient.getSlotForDispenser(itemstack); // Purpur - ItemStack itemstack1 = itemstack.cloneAndSubtract(1); - // CraftBukkit start - World world = isourceblock.getWorld(); -@@ -113,6 +113,7 @@ public class ItemArmor extends Item implements ItemWearable { - this.m = builder.build(); - } - -+ public EnumItemSlot getEquipmentSlot() { return b(); } // Purpur - OBFHELPER - public EnumItemSlot b() { - return this.b; - } -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 0e715362fcfb3d26825b51f4fd96d8cba810bf55..d5095a9b20118bf9c35346fce95a446254872832 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -198,6 +198,11 @@ public class PurpurWorldConfig { - }); - } - -+ public boolean dispenserApplyCursedArmor = true; -+ private void dispenserSettings() { -+ dispenserApplyCursedArmor = getBoolean("blocks.dispenser.apply-cursed-to-armor-slots", dispenserApplyCursedArmor); -+ } -+ - public boolean farmlandGetsMoistFromBelow = false; - private void farmlandSettings() { - farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); diff --git a/patches/server-unmapped/0071-Add-obfhelpers-for-plugin-use.patch b/patches/server-unmapped/0071-Add-obfhelpers-for-plugin-use.patch deleted file mode 100644 index 3bfcad3aa..000000000 --- a/patches/server-unmapped/0071-Add-obfhelpers-for-plugin-use.patch +++ /dev/null @@ -1,18 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Wed, 1 Jan 2020 20:12:39 -0600 -Subject: [PATCH] Add obfhelpers for plugin use - - -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 366ceb65d40c685117d1c79a933864ab91d8aa11..a342174cf35ee6ac1f10028b60c5a19e1b547ef4 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -694,6 +694,7 @@ public final class ItemStack { - return this.tag; - } - -+ public NBTTagCompound getOrCreateSubTag(String s) { return a(s); } // Purpur - OBFHELPER - public NBTTagCompound a(String s) { - if (this.tag != null && this.tag.hasKeyOfType(s, 10)) { - return this.tag.getCompound(s); diff --git a/patches/server-unmapped/0072-Mending-mends-most-damages-equipment-first.patch b/patches/server-unmapped/0072-Mending-mends-most-damages-equipment-first.patch deleted file mode 100644 index 67fe1f720..000000000 --- a/patches/server-unmapped/0072-Mending-mends-most-damages-equipment-first.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Sun, 14 Jul 2019 19:52:47 -0500 -Subject: [PATCH] Mending mends most damages equipment first - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityExperienceOrb.java b/src/main/java/net/minecraft/world/entity/EntityExperienceOrb.java -index a7551e95185895a290be70d501496279eaf884ae..31d36ead273e8397ba2c826b791a2cf59306ff7f 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityExperienceOrb.java -+++ b/src/main/java/net/minecraft/world/entity/EntityExperienceOrb.java -@@ -236,7 +236,7 @@ public class EntityExperienceOrb extends Entity { - if (this.d == 0 && entityhuman.bu == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(((EntityPlayer) entityhuman).getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - entityhuman.bu = 2; - entityhuman.receive(this, 1); -- Entry entry = EnchantmentManager.a(Enchantments.MENDING, (EntityLiving) entityhuman, ItemStack::f); -+ Entry entry = world.purpurConfig.useBetterMending ? EnchantmentManager.getMostDamagedEquipment(Enchantments.MENDING, entityhuman) : EnchantmentManager.a(Enchantments.MENDING, entityhuman, ItemStack::isDamaged); // Purpur - - if (entry != null) { - ItemStack itemstack = (ItemStack) entry.getValue(); -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index a342174cf35ee6ac1f10028b60c5a19e1b547ef4..72400425d6177ba938057ec145f9499eb1160288 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -468,10 +468,19 @@ public final class ItemStack { - } - } - -+ public boolean isDamaged() { return f(); } // Purpur - OBFHELPER - public boolean f() { - return this.e() && this.getDamage() > 0; - } - -+ public float getDamagePercent() { -+ if (isDamaged()) { -+ return (float) getDamage() / (float) getItem().getMaxDurability(); -+ } else { -+ return 0F; -+ } -+ } -+ - public int getDamage() { - return this.tag == null ? 0 : this.tag.getInt("Damage"); - } -diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java -index 72afbf8f537770540e90a2880ea81de137ea10f5..b2d28c2bf0a9e93d38583e2d734c12fed4f63d5d 100644 ---- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java -+++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentManager.java -@@ -269,7 +269,30 @@ public class EnchantmentManager { - return getEnchantmentLevel(Enchantments.CHANNELING, itemstack) > 0; - } - -- public static @javax.annotation.Nonnull ItemStack getRandomEquippedItemWithEnchant(Enchantment enchantment, EntityLiving entityliving) { Entry entry = b(enchantment, entityliving); return entry != null ? entry.getValue() : ItemStack.NULL_ITEM; } // Paper - OBFHELPER -+ // Purpur start -+ @Nullable -+ public static Entry getMostDamagedEquipment(Enchantment enchantment, EntityLiving entityliving) { -+ Map map = enchantment.a(entityliving); -+ if (map.isEmpty()) { -+ return null; -+ } -+ Entry item = null; -+ float maxPercent = 0F; -+ for (Entry entry : map.entrySet()) { -+ ItemStack itemstack = entry.getValue(); -+ if (!itemstack.isEmpty() && itemstack.isDamaged() && getEnchantmentLevel(enchantment, itemstack) > 0) { -+ float percent = itemstack.getDamagePercent(); -+ if (item == null || percent > maxPercent) { -+ item = entry; -+ maxPercent = percent; -+ } -+ } -+ } -+ return item; -+ } -+ // Purpur end -+ -+ public static @javax.annotation.Nonnull ItemStack getRandomEquippedItemWithEnchant(Enchantment enchantment, EntityLiving entityliving) { Entry entry = enchantment == Enchantments.MENDING && entityliving.world.purpurConfig.useBetterMending ? getMostDamagedEquipment(enchantment, entityliving) : b(enchantment, entityliving); return entry != null ? entry.getValue() : ItemStack.NULL_ITEM; } // Paper - OBFHELPER - @Nullable public static Entry b(Enchantment enchantment, EntityLiving entityliving) { - return a(enchantment, entityliving, (itemstack) -> { - return true; -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index 06c6e181b753a840e0060539b6b0387a7a1511dc..ce1d33315a7999fb304d6f7d843ab3d1f415eb17 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -146,6 +146,7 @@ public class PurpurWorldConfig { - idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); - } - -+ public boolean useBetterMending = false; - public boolean boatEjectPlayersOnLand = false; - public boolean disableDropsOnCrammingDeath = false; - public boolean entitiesPickUpLootBypassMobGriefing = false; -@@ -154,6 +155,7 @@ public class PurpurWorldConfig { - public double voidDamageHeight = -64.0D; - public double voidDamageDealt = 4.0D; - private void miscGameplayMechanicsSettings() { -+ useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); - boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); - disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); - entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); diff --git a/patches/server-unmapped/0074-Implement-elytra-settings.patch b/patches/server-unmapped/0074-Implement-elytra-settings.patch deleted file mode 100644 index 4790b878f..000000000 --- a/patches/server-unmapped/0074-Implement-elytra-settings.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 -From: William Blake Galbreath -Date: Thu, 25 Jul 2019 18:07:37 -0500 -Subject: [PATCH] Implement elytra settings - - -diff --git a/src/main/java/net/minecraft/world/entity/EntityLiving.java b/src/main/java/net/minecraft/world/entity/EntityLiving.java -index 2b8e1843ed01542f9fc0ce400b772d44eed305fc..dc946534a9f218a2f2a7838cbc64bf9dc3b96375 100644 ---- a/src/main/java/net/minecraft/world/entity/EntityLiving.java -+++ b/src/main/java/net/minecraft/world/entity/EntityLiving.java -@@ -2952,7 +2952,16 @@ public abstract class EntityLiving extends Entity { - if (itemstack.getItem() == Items.ELYTRA && ItemElytra.d(itemstack)) { - flag = true; - if (!this.world.isClientSide && (this.be + 1) % 20 == 0) { -- itemstack.damage(1, this, (entityliving) -> { -+ // Purpur start -+ int damage = world.purpurConfig.elytraDamagePerSecond; -+ if (world.purpurConfig.elytraDamageMultiplyBySpeed > 0) { -+ double speed = getMot().magnitudeSquared(); -+ if (speed > world.purpurConfig.elytraDamageMultiplyBySpeed) { -+ damage *= (int) speed; -+ } -+ } -+ itemstack.damage(damage, this, (entityliving) -> { -+ // Purpur end - entityliving.broadcastItemBreak(EnumItemSlot.CHEST); - }); - } -diff --git a/src/main/java/net/minecraft/world/item/ItemFireworks.java b/src/main/java/net/minecraft/world/item/ItemFireworks.java -index e7f958d137257da912ce9b83db017b4423959943..210b95f1d67ec12566d6fc93b8234e11ad132d1a 100644 ---- a/src/main/java/net/minecraft/world/item/ItemFireworks.java -+++ b/src/main/java/net/minecraft/world/item/ItemFireworks.java -@@ -7,6 +7,7 @@ import net.minecraft.server.level.EntityPlayer; - import net.minecraft.world.EnumHand; - import net.minecraft.world.EnumInteractionResult; - import net.minecraft.world.InteractionResultWrapper; -+import net.minecraft.world.entity.EnumItemSlot; - import net.minecraft.world.entity.player.EntityHuman; - import net.minecraft.world.entity.projectile.EntityFireworks; - import net.minecraft.world.item.context.ItemActionContext; -@@ -53,6 +54,14 @@ public class ItemFireworks extends Item { - // Paper start - com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) entityhuman.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemstack), (org.bukkit.entity.Firework) entityfireworks.getBukkitEntity()); - if (event.callEvent() && world.addEntity(entityfireworks)) { -+ // Purpur start -+ if (world.purpurConfig.elytraDamagePerFireworkBoost > 0) { -+ ItemStack chestItem = entityhuman.getEquipment(EnumItemSlot.CHEST); -+ if (chestItem.getItem() == Items.ELYTRA) { -+ chestItem.damage(world.purpurConfig.elytraDamagePerFireworkBoost, entityhuman, (entityliving) -> entityliving.broadcastItemBreak(EnumItemSlot.CHEST)); -+ } -+ } -+ // Purpur end - if (event.shouldConsume() && !entityhuman.abilities.canInstantlyBuild) { - itemstack.subtract(1); - } else ((EntityPlayer) entityhuman).getBukkitEntity().updateInventory(); -diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java -index 72400425d6177ba938057ec145f9499eb1160288..2aa761656ce75f78732c502fd4ce65034b6c2919 100644 ---- a/src/main/java/net/minecraft/world/item/ItemStack.java -+++ b/src/main/java/net/minecraft/world/item/ItemStack.java -@@ -500,7 +500,7 @@ public final class ItemStack { - int j; - - if (i > 0) { -- j = EnchantmentManager.getEnchantmentLevel(Enchantments.DURABILITY, this); -+ j = (getItem() == Items.ELYTRA && entityplayer != null && entityplayer.world.purpurConfig.elytraIgnoreUnbreaking) ? 0 : EnchantmentManager.getEnchantmentLevel(Enchantments.DURABILITY, this); // Purpur - int k = 0; - - for (int l = 0; j > 0 && l < i; ++l) { -@@ -546,6 +546,12 @@ public final class ItemStack { - if (this.isDamaged(i, t0.getRandom(), t0 instanceof EntityPlayer ? (EntityPlayer) t0 : null)) { - consumer.accept(t0); - Item item = this.getItem(); -+ // Purpur start -+ if (item == Items.ELYTRA) { -+ setDamage(item.getMaxDurability() - 1); -+ return; -+ } -+ // Purpur end - // CraftBukkit start - Check for item breaking - if (this.count == 1 && t0 instanceof EntityHuman) { - org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((EntityHuman) t0, this); -diff --git a/src/main/java/net/minecraft/world/item/ItemTrident.java b/src/main/java/net/minecraft/world/item/ItemTrident.java -index 9896477b54cf91a88bdfc3d85018a59193b32859..0711d195c654edef5875f587e391bacfdea096da 100644 ---- a/src/main/java/net/minecraft/world/item/ItemTrident.java -+++ b/src/main/java/net/minecraft/world/item/ItemTrident.java -@@ -123,6 +123,16 @@ public class ItemTrident extends Item implements ItemVanishable { - f2 *= f6 / f5; - f3 *= f6 / f5; - f4 *= f6 / f5; -+ -+ // Purpur start -+ ItemStack chestItem = entityhuman.getEquipment(EnumItemSlot.CHEST); -+ if (chestItem.getItem() == Items.ELYTRA && world.purpurConfig.elytraDamagePerTridentBoost > 0) { -+ chestItem.damage(world.purpurConfig.elytraDamagePerTridentBoost, entityhuman, (entity) -> { -+ entity.broadcastItemBreak(EnumItemSlot.CHEST); -+ }); -+ } -+ // Purpur end -+ - entityhuman.i((double) f2, (double) f3, (double) f4); - entityhuman.r(20); - if (entityhuman.isOnGround()) { -diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index ce1d33315a7999fb304d6f7d843ab3d1f415eb17..5e577cd97df14463f590919b2931a5065ac37033 100644 ---- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -@@ -165,6 +165,19 @@ public class PurpurWorldConfig { - voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); - } - -+ public int elytraDamagePerSecond = 1; -+ public double elytraDamageMultiplyBySpeed = 0; -+ public boolean elytraIgnoreUnbreaking = false; -+ public int elytraDamagePerFireworkBoost = 0; -+ public int elytraDamagePerTridentBoost = 0; -+ private void elytraSettings() { -+ elytraDamagePerSecond = getInt("gameplay-mechanics.elytra.damage-per-second", elytraDamagePerSecond); -+ elytraDamageMultiplyBySpeed = getDouble("gameplay-mechanics.elytra.damage-multiplied-by-speed", elytraDamageMultiplyBySpeed); -+ elytraIgnoreUnbreaking = getBoolean("gameplay-mechanics.elytra.ignore-unbreaking", elytraIgnoreUnbreaking); -+ elytraDamagePerFireworkBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.firework", elytraDamagePerFireworkBoost); -+ elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); -+ } -+ - public String playerDeathExpDropEquation = "expLevel * 7"; - public int playerDeathExpDropMax = 100; - private void playerDeathExpSettings() { diff --git a/patches/server/0067-Dispenser-curse-of-binding-protection.patch b/patches/server/0067-Dispenser-curse-of-binding-protection.patch new file mode 100644 index 000000000..8a556f439 --- /dev/null +++ b/patches/server/0067-Dispenser-curse-of-binding-protection.patch @@ -0,0 +1,60 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 25 Aug 2019 00:09:52 -0500 +Subject: [PATCH] Dispenser curse of binding protection + + +diff --git a/src/main/java/net/minecraft/world/entity/Mob.java b/src/main/java/net/minecraft/world/entity/Mob.java +index f4c9e6184f39dea9ea1fda98333734773858d0f8..5cca9a981fe74d9689c69f85e90d0c8ad94220d9 100644 +--- a/src/main/java/net/minecraft/world/entity/Mob.java ++++ b/src/main/java/net/minecraft/world/entity/Mob.java +@@ -63,6 +63,7 @@ import net.minecraft.world.item.ProjectileWeaponItem; + import net.minecraft.world.item.SpawnEggItem; + import net.minecraft.world.item.SwordItem; + import net.minecraft.world.item.enchantment.EnchantmentHelper; ++import net.minecraft.world.item.enchantment.Enchantments; + import net.minecraft.world.level.BlockGetter; + import net.minecraft.world.level.GameRules; + import net.minecraft.world.level.ItemLike; +@@ -1064,6 +1065,12 @@ public abstract class Mob extends LivingEntity { + + } + ++ // Purpur start ++ public static EquipmentSlot getSlotForDispenser(ItemStack itemstack) { ++ return EnchantmentHelper.getItemEnchantmentLevel(Enchantments.BINDING_CURSE, itemstack) > 0 ? EquipmentSlot.MAINHAND : getEquipmentSlotForItem(itemstack); ++ } ++ // Purpur end ++ + @Nullable + public static Item getEquipmentForSlot(EquipmentSlot equipmentSlot, int equipmentLevel) { + switch (equipmentSlot) { +diff --git a/src/main/java/net/minecraft/world/item/ArmorItem.java b/src/main/java/net/minecraft/world/item/ArmorItem.java +index aab4a63e61aced51b1b6c885fd8b8426a4f14408..ad095c6bc7e00d286c83e37f84d8ed5d4a2c6881 100644 +--- a/src/main/java/net/minecraft/world/item/ArmorItem.java ++++ b/src/main/java/net/minecraft/world/item/ArmorItem.java +@@ -56,7 +56,7 @@ public class ArmorItem extends Item implements Wearable { + return false; + } else { + LivingEntity entityliving = (LivingEntity) list.get(0); +- EquipmentSlot enumitemslot = Mob.getEquipmentSlotForItem(armor); ++ EquipmentSlot enumitemslot = pointer.getLevel().purpurConfig.dispenserApplyCursedArmor ? Mob.getEquipmentSlotForItem(armor) : Mob.getSlotForDispenser(armor); // Purpur + ItemStack itemstack1 = armor.split(1); + // CraftBukkit start + Level world = pointer.getLevel(); +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 035883538cb4b4ad60b3b872c1348e95d5ebf2be..5feabb6c542c8254d276ba45a634c2f25eb55ef3 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -198,6 +198,11 @@ public class PurpurWorldConfig { + }); + } + ++ public boolean dispenserApplyCursedArmor = true; ++ private void dispenserSettings() { ++ dispenserApplyCursedArmor = getBoolean("blocks.dispenser.apply-cursed-to-armor-slots", dispenserApplyCursedArmor); ++ } ++ + public boolean farmlandGetsMoistFromBelow = false; + private void farmlandSettings() { + farmlandGetsMoistFromBelow = getBoolean("blocks.farmland.gets-moist-from-below", farmlandGetsMoistFromBelow); diff --git a/patches/server-unmapped/0070-Add-option-for-boats-to-eject-players-on-land.patch b/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch similarity index 69% rename from patches/server-unmapped/0070-Add-option-for-boats-to-eject-players-on-land.patch rename to patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch index ffcc46584..944b8a468 100644 --- a/patches/server-unmapped/0070-Add-option-for-boats-to-eject-players-on-land.patch +++ b/patches/server/0068-Add-option-for-boats-to-eject-players-on-land.patch @@ -4,20 +4,20 @@ Date: Sat, 7 Sep 2019 22:47:59 -0500 Subject: [PATCH] Add option for boats to eject players on land -diff --git a/src/main/java/net/minecraft/world/entity/vehicle/EntityBoat.java b/src/main/java/net/minecraft/world/entity/vehicle/EntityBoat.java -index 5e2c13bd6e52ffe182ef034e05ba6fe1cb301005..01839c7319e175477ded7001e00e5937734ff516 100644 ---- a/src/main/java/net/minecraft/world/entity/vehicle/EntityBoat.java -+++ b/src/main/java/net/minecraft/world/entity/vehicle/EntityBoat.java -@@ -487,6 +487,7 @@ public class EntityBoat extends Entity { +diff --git a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +index aa7c022c4faade23bd9061311d4152cf845d3331..d4a19fc38027717e43353bc62ef23e564f3b4c26 100644 +--- a/src/main/java/net/minecraft/world/entity/vehicle/Boat.java ++++ b/src/main/java/net/minecraft/world/entity/vehicle/Boat.java +@@ -520,6 +520,7 @@ public class Boat extends Entity { if (f > 0.0F) { - this.aw = f; -+ if (world.purpurConfig.boatEjectPlayersOnLand) ejectPassengers(); // Purpur - return EntityBoat.EnumStatus.ON_LAND; + this.landFriction = f; ++ if (level.purpurConfig.boatEjectPlayersOnLand) ejectPassengers(); // Purpur + return Boat.Status.ON_LAND; } else { - return EntityBoat.EnumStatus.IN_AIR; + return Boat.Status.IN_AIR; diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java -index d5095a9b20118bf9c35346fce95a446254872832..06c6e181b753a840e0060539b6b0387a7a1511dc 100644 +index 5feabb6c542c8254d276ba45a634c2f25eb55ef3..7735506a31e9614f71498dbe04541b776bf5328d 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -146,6 +146,7 @@ public class PurpurWorldConfig { diff --git a/patches/server/0069-Mending-mends-most-damages-equipment-first.patch b/patches/server/0069-Mending-mends-most-damages-equipment-first.patch new file mode 100644 index 000000000..8a428c9f7 --- /dev/null +++ b/patches/server/0069-Mending-mends-most-damages-equipment-first.patch @@ -0,0 +1,94 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: William Blake Galbreath +Date: Sun, 14 Jul 2019 19:52:47 -0500 +Subject: [PATCH] Mending mends most damages equipment first + + +diff --git a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +index a30f9d57257e1de1641f4af1fa7afaea3f0fd37c..5fffe07176ece547a0224aefbf7660a33508b959 100644 +--- a/src/main/java/net/minecraft/world/entity/ExperienceOrb.java ++++ b/src/main/java/net/minecraft/world/entity/ExperienceOrb.java +@@ -319,7 +319,7 @@ public class ExperienceOrb extends Entity { + } + + private int repairPlayerItems(Player player, int amount) { +- Entry entry = EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, (LivingEntity) player, ItemStack::isDamaged); ++ Entry entry = level.purpurConfig.useBetterMending ? EnchantmentHelper.getMostDamagedEquipment(Enchantments.MENDING, player) : EnchantmentHelper.getRandomItemWith(Enchantments.MENDING, (LivingEntity) player, ItemStack::isDamaged); // Purpur + + if (entry != null) { + ItemStack itemstack = (ItemStack) entry.getValue(); +diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java +index 2c73eec83af8bbf7f1dba08315542c94f81512a6..324ec7f0284c68ee5f667f587b72a6dacc6eaad3 100644 +--- a/src/main/java/net/minecraft/world/item/ItemStack.java ++++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -511,6 +511,16 @@ public final class ItemStack { + return this.isDamageableItem() && this.getDamageValue() > 0; + } + ++ // Purpur start ++ public float getDamagePercent() { ++ if (isDamaged()) { ++ return (float) getDamageValue() / (float) getItem().getMaxDamage(); ++ } else { ++ return 0F; ++ } ++ } ++ // Purpur end ++ + public int getDamageValue() { + return this.tag == null ? 0 : this.tag.getInt("Damage"); + } +diff --git a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java +index 069ce59faab5184ab9da8ca3fe1cebf7449cd7fe..b391b6f457b9a2df9d59eac46473576b809bd95e 100644 +--- a/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java ++++ b/src/main/java/net/minecraft/world/item/enchantment/EnchantmentHelper.java +@@ -246,6 +246,29 @@ public class EnchantmentHelper { + return getItemEnchantmentLevel(Enchantments.CHANNELING, stack) > 0; + } + ++ // Purpur start ++ @Nullable ++ public static Entry getMostDamagedEquipment(Enchantment enchantment, LivingEntity entity) { ++ Map map = enchantment.getSlotItems(entity); ++ if (map.isEmpty()) { ++ return null; ++ } ++ Entry item = null; ++ float maxPercent = 0F; ++ for (Entry entry : map.entrySet()) { ++ ItemStack itemstack = entry.getValue(); ++ if (!itemstack.isEmpty() && itemstack.isDamaged() && getItemEnchantmentLevel(enchantment, itemstack) > 0) { ++ float percent = itemstack.getDamagePercent(); ++ if (item == null || percent > maxPercent) { ++ item = entry; ++ maxPercent = percent; ++ } ++ } ++ } ++ return item; ++ } ++ // Purpur end ++ + public static @javax.annotation.Nonnull ItemStack getRandomEquippedItemWithEnchant(Enchantment enchantment, LivingEntity entityliving) { + Entry entry = getRandomItemWith(enchantment, entityliving); + return entry != null ? entry.getValue() : ItemStack.EMPTY; +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 7735506a31e9614f71498dbe04541b776bf5328d..4f0da082391d6cf6a761c54a917a8181eefde457 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -146,6 +146,7 @@ public class PurpurWorldConfig { + idleTimeoutUpdateTabList = getBoolean("gameplay-mechanics.player.idle-timeout.update-tab-list", idleTimeoutUpdateTabList); + } + ++ public boolean useBetterMending = false; + public boolean boatEjectPlayersOnLand = false; + public boolean disableDropsOnCrammingDeath = false; + public boolean entitiesPickUpLootBypassMobGriefing = false; +@@ -154,6 +155,7 @@ public class PurpurWorldConfig { + public double voidDamageHeight = -64.0D; + public double voidDamageDealt = 4.0D; + private void miscGameplayMechanicsSettings() { ++ useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending); + boatEjectPlayersOnLand = getBoolean("gameplay-mechanics.boat.eject-players-on-land", boatEjectPlayersOnLand); + disableDropsOnCrammingDeath = getBoolean("gameplay-mechanics.disable-drops-on-cramming-death", disableDropsOnCrammingDeath); + entitiesPickUpLootBypassMobGriefing = getBoolean("gameplay-mechanics.entities-pick-up-loot-bypass-mob-griefing", entitiesPickUpLootBypassMobGriefing); diff --git a/patches/server-unmapped/0073-Add-5-second-tps-average-in-tps.patch b/patches/server/0070-Add-5-second-tps-average-in-tps.patch similarity index 79% rename from patches/server-unmapped/0073-Add-5-second-tps-average-in-tps.patch rename to patches/server/0070-Add-5-second-tps-average-in-tps.patch index 462097f1d..f8d8bd4ba 100644 --- a/patches/server-unmapped/0073-Add-5-second-tps-average-in-tps.patch +++ b/patches/server/0070-Add-5-second-tps-average-in-tps.patch @@ -5,7 +5,7 @@ Subject: [PATCH] Add 5 second tps average in /tps diff --git a/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java b/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java -index dc6bc1910ad0f9b27144d5750078c3ca607d03d3..e8be35f836ede2630d44902e99a21489a7bad61f 100644 +index fa56cd09102a89692b42f1d14257990508c5c720..f9251183df72ddc56662fd3f02acf21641a2200c 100644 --- a/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java +++ b/src/main/java/com/destroystokyo/paper/gui/RAMDetails.java @@ -58,7 +58,7 @@ public class RAMDetails extends JList { @@ -20,26 +20,26 @@ index dc6bc1910ad0f9b27144d5750078c3ca607d03d3..e8be35f836ede2630d44902e99a21489 @@ -67,7 +67,7 @@ public class RAMDetails extends JList { vector.add("Memory use: " + (data.getUsedMem() / 1024L / 1024L) + " mb (" + (data.getFree() * 100L / data.getMax()) + "% free)"); vector.add("Heap: " + (data.getTotal() / 1024L / 1024L) + " / " + (data.getMax() / 1024L / 1024L) + " mb"); - vector.add("Avg tick: " + DECIMAL_FORMAT.format(getAverage(server.getTickTimes())) + " ms"); + vector.add("Avg tick: " + DECIMAL_FORMAT.format(getAverage(server.tickTimes)) + " ms"); - vector.add("TPS from last 1m, 5m, 15m: " + String.join(", ", tpsAvg)); + vector.add("TPS from last 5s, 1m, 5m, 15m: " + String.join(", ", tpsAvg)); // Purpur setListData(vector); } diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java -index 41de6d447226d9a26a49fd0303344adaf7465064..6afff6ba0c59e3285c99fddf3de738d95153ed24 100644 +index 98b7ccbd1ee4d14fde0cdea2c08c432709fa6e56..e294de7b7e0753bde5a1439ecafdb5abc2ceeea4 100644 --- a/src/main/java/net/minecraft/server/MinecraftServer.java +++ b/src/main/java/net/minecraft/server/MinecraftServer.java -@@ -278,7 +278,7 @@ public abstract class MinecraftServer extends IAsyncTaskHandlerReentrant +Date: Thu, 25 Jul 2019 18:07:37 -0500 +Subject: [PATCH] Implement elytra settings + + +diff --git a/src/main/java/net/minecraft/world/entity/LivingEntity.java b/src/main/java/net/minecraft/world/entity/LivingEntity.java +index 2f7caed2506045c95c7f1dac1fa0c981695b3171..79cfe0511427a4919a6e2c0077dcfe3fb51132bb 100644 +--- a/src/main/java/net/minecraft/world/entity/LivingEntity.java ++++ b/src/main/java/net/minecraft/world/entity/LivingEntity.java +@@ -3260,7 +3260,16 @@ public abstract class LivingEntity extends Entity { + int j = i / 10; + + if (j % 2 == 0) { +- itemstack.hurtAndBreak(1, this, (entityliving) -> { ++ // Purpur start ++ int damage = level.purpurConfig.elytraDamagePerSecond; ++ if (level.purpurConfig.elytraDamageMultiplyBySpeed > 0) { ++ double speed = getDeltaMovement().lengthSqr(); ++ if (speed > level.purpurConfig.elytraDamageMultiplyBySpeed) { ++ damage *= (int) speed; ++ } ++ } ++ itemstack.hurtAndBreak(damage, this, (entityliving) -> { ++ // Purpur end + entityliving.broadcastBreakEvent(EquipmentSlot.CHEST); + }); + } +diff --git a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java +index 543a08f920319a2547258640bafebb1e70af65c4..dd211aa7c4ef1e158933a89898b9e5bc1451ee14 100644 +--- a/src/main/java/net/minecraft/world/item/FireworkRocketItem.java ++++ b/src/main/java/net/minecraft/world/item/FireworkRocketItem.java +@@ -17,6 +17,7 @@ import net.minecraft.server.level.ServerPlayer; + import net.minecraft.world.InteractionHand; + import net.minecraft.world.InteractionResult; + import net.minecraft.world.InteractionResultHolder; ++import net.minecraft.world.entity.EquipmentSlot; + import net.minecraft.world.entity.player.Player; + import net.minecraft.world.entity.projectile.FireworkRocketEntity; + import net.minecraft.world.item.context.UseOnContext; +@@ -70,6 +71,14 @@ public class FireworkRocketItem extends Item { + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) user.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemStack), (org.bukkit.entity.Firework) fireworkRocketEntity.getBukkitEntity()); + if (event.callEvent() && world.addFreshEntity(fireworkRocketEntity)) { + user.awardStat(Stats.ITEM_USED.get(this)); ++ // Purpur start ++ if (world.purpurConfig.elytraDamagePerFireworkBoost > 0) { ++ ItemStack chestItem = user.getItemBySlot(EquipmentSlot.CHEST); ++ if (chestItem.getItem() == Items.ELYTRA) { ++ chestItem.hurtAndBreak(world.purpurConfig.elytraDamagePerFireworkBoost, user, (entityliving) -> entityliving.broadcastBreakEvent(EquipmentSlot.CHEST)); ++ } ++ } ++ // Purpur end + if (event.shouldConsume() && !user.getAbilities().instabuild) { + itemStack.shrink(1); + } else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); +diff --git a/src/main/java/net/minecraft/world/item/ItemStack.java b/src/main/java/net/minecraft/world/item/ItemStack.java +index 324ec7f0284c68ee5f667f587b72a6dacc6eaad3..0c5edc11ae59860f0e253a0a760f7f028111d8b1 100644 +--- a/src/main/java/net/minecraft/world/item/ItemStack.java ++++ b/src/main/java/net/minecraft/world/item/ItemStack.java +@@ -540,7 +540,7 @@ public final class ItemStack { + int j; + + if (amount > 0) { +- j = EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this); ++ j = (getItem() == Items.ELYTRA && player != null && player.level.purpurConfig.elytraIgnoreUnbreaking) ? 0 : EnchantmentHelper.getItemEnchantmentLevel(Enchantments.UNBREAKING, this); + int k = 0; + + for (int l = 0; j > 0 && l < amount; ++l) { +@@ -586,6 +586,12 @@ public final class ItemStack { + if (this.hurt(amount, entity.getRandom(), entity instanceof ServerPlayer ? (ServerPlayer) entity : null)) { + breakCallback.accept(entity); + Item item = this.getItem(); ++ // Purpur start ++ if (item == Items.ELYTRA) { ++ setDamageValue(item.getMaxDamage() - 1); ++ return; ++ } ++ // Purpur end + // CraftBukkit start - Check for item breaking + if (this.count == 1 && entity instanceof net.minecraft.world.entity.player.Player) { + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent((net.minecraft.world.entity.player.Player) entity, this); +diff --git a/src/main/java/net/minecraft/world/item/TridentItem.java b/src/main/java/net/minecraft/world/item/TridentItem.java +index 510ed67a7de2b503ab8b01db57ed09ee33b0d825..3f53dc8f250ad3f7616ce7ef0a2353caa0ab1879 100644 +--- a/src/main/java/net/minecraft/world/item/TridentItem.java ++++ b/src/main/java/net/minecraft/world/item/TridentItem.java +@@ -126,6 +126,14 @@ public class TridentItem extends Item implements Vanishable { + f2 *= f6 / f5; + f3 *= f6 / f5; + f4 *= f6 / f5; ++ ++ // Purpur start ++ ItemStack chestItem = entityhuman.getItemBySlot(EquipmentSlot.CHEST); ++ if (chestItem.getItem() == Items.ELYTRA && world.purpurConfig.elytraDamagePerTridentBoost > 0) { ++ chestItem.hurtAndBreak(world.purpurConfig.elytraDamagePerTridentBoost, entityhuman, (entity) -> entity.broadcastBreakEvent(EquipmentSlot.CHEST)); ++ } ++ // Purpur end ++ + entityhuman.push((double) f2, (double) f3, (double) f4); + entityhuman.startAutoSpinAttack(20); + if (entityhuman.isOnGround()) { +diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +index 4f0da082391d6cf6a761c54a917a8181eefde457..8306dc47d15492a5a7ad357c6c9073874b231394 100644 +--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java ++++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +@@ -165,6 +165,19 @@ public class PurpurWorldConfig { + voidDamageDealt = getDouble("gameplay-mechanics.void-damage-dealt", voidDamageDealt); + } + ++ public int elytraDamagePerSecond = 1; ++ public double elytraDamageMultiplyBySpeed = 0; ++ public boolean elytraIgnoreUnbreaking = false; ++ public int elytraDamagePerFireworkBoost = 0; ++ public int elytraDamagePerTridentBoost = 0; ++ private void elytraSettings() { ++ elytraDamagePerSecond = getInt("gameplay-mechanics.elytra.damage-per-second", elytraDamagePerSecond); ++ elytraDamageMultiplyBySpeed = getDouble("gameplay-mechanics.elytra.damage-multiplied-by-speed", elytraDamageMultiplyBySpeed); ++ elytraIgnoreUnbreaking = getBoolean("gameplay-mechanics.elytra.ignore-unbreaking", elytraIgnoreUnbreaking); ++ elytraDamagePerFireworkBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.firework", elytraDamagePerFireworkBoost); ++ elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); ++ } ++ + public String playerDeathExpDropEquation = "expLevel * 7"; + public int playerDeathExpDropMax = 100; + private void playerDeathExpSettings() {