diff --git a/build-data/purpur.at b/build-data/purpur.at index 203f836e9..79d15d2a6 100644 --- a/build-data/purpur.at +++ b/build-data/purpur.at @@ -1,4 +1,6 @@ # This file is auto generated, any changes may be overridden! # See CONTRIBUTING.md on how to add access transformers. protected net.minecraft.world.entity.Entity dimensions +public net.minecraft.world.entity.LivingEntity canGlide()Z public net.minecraft.world.entity.monster.Shulker MAX_SCALE +public net.minecraft.world.entity.player.Player canGlide()Z diff --git a/patches/server/0058-Implement-elytra-settings.patch b/patches/server/0058-Implement-elytra-settings.patch deleted file mode 100644 index a935e367f..000000000 --- a/patches/server/0058-Implement-elytra-settings.patch +++ /dev/null @@ -1,136 +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/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java -index 8829e613e1c307e9a40b30a797cada500971453d..d711bef21fba8e32ae99a0a52992e609e4841734 100644 ---- a/net/minecraft/world/entity/LivingEntity.java -+++ b/net/minecraft/world/entity/LivingEntity.java -@@ -3772,7 +3772,17 @@ public abstract class LivingEntity extends Entity implements Attackable { - }).toList(); - EquipmentSlot enumitemslot = (EquipmentSlot) Util.getRandom(list, this.random); - -- this.getItemBySlot(enumitemslot).hurtAndBreak(1, this, enumitemslot); -+ // Purpur start -+ int damage = level().purpurConfig.elytraDamagePerSecond; -+ if (level().purpurConfig.elytraDamageMultiplyBySpeed > 0) { -+ double speed = getDeltaMovement().lengthSqr(); -+ if (speed > level().purpurConfig.elytraDamageMultiplyBySpeed) { -+ damage *= (int) speed; -+ } -+ } -+ -+ this.getItemBySlot(enumitemslot).hurtAndBreak(damage, this, enumitemslot); -+ // Purpur end - } - - this.gameEvent(GameEvent.ELYTRA_GLIDE); -@@ -3781,7 +3791,7 @@ public abstract class LivingEntity extends Entity implements Attackable { - - } - -- protected boolean canGlide() { -+ public boolean canGlide() { // Purpur - if (!this.onGround() && !this.isPassenger() && !this.hasEffect(MobEffects.LEVITATION)) { - Iterator iterator = EquipmentSlot.VALUES.iterator(); - -diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java -index 8ccc760e84aec8aabbe5b8112b332cee13849b23..fee0ffaaf94c484c9272d3b5743b90bb70e0d08d 100644 ---- a/net/minecraft/world/entity/player/Player.java -+++ b/net/minecraft/world/entity/player/Player.java -@@ -1664,7 +1664,7 @@ public abstract class Player extends LivingEntity { - } - - @Override -- protected boolean canGlide() { -+ public boolean canGlide() { // Purpur - return !this.abilities.flying && super.canGlide(); - } - -diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java -index 29a048a9b09166838616ac7ba1d31625d56b0bca..184e6d9bf393188fc1f1c7acd545b4ac6d31f6a4 100644 ---- a/net/minecraft/world/item/FireworkRocketItem.java -+++ b/net/minecraft/world/item/FireworkRocketItem.java -@@ -66,6 +66,18 @@ public class FireworkRocketItem extends Item implements ProjectileItem { - 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) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); - if (event.callEvent() && delayed.attemptSpawn()) { - user.awardStat(Stats.ITEM_USED.get(this)); // Moved up from below -+ -+ // Purpur start -+ if (world.purpurConfig.elytraDamagePerFireworkBoost > 0) { -+ List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> net.minecraft.world.entity.LivingEntity.canGlideUsing(user.getItemBySlot(enumitemslot), enumitemslot)).toList(); -+ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, user.random); -+ -+ ItemStack glideItem = user.getItemBySlot(enumitemslot); -+ if (user.canGlide()) { -+ glideItem.hurtAndBreak(world.purpurConfig.elytraDamagePerFireworkBoost, user, enumitemslot); -+ } -+ } -+ // Purpur end - if (event.shouldConsume() && !user.hasInfiniteMaterials()) { - itemStack.shrink(1); // Moved up from below - } else ((net.minecraft.server.level.ServerPlayer) user).getBukkitEntity().updateInventory(); -diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java -index 122859ba52e9719f98111a9c543dab27abac39b5..c616ebbf0f709b8c3a500a23a2190f7023f7757d 100644 ---- a/net/minecraft/world/item/ItemStack.java -+++ b/net/minecraft/world/item/ItemStack.java -@@ -786,6 +786,12 @@ public final class ItemStack implements DataComponentHolder { - org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent - } - // CraftBukkit end -+ // Purpur start -+ if (this.has(DataComponents.GLIDER)) { -+ setDamageValue(this.getMaxDamage() - 1); -+ return; -+ } -+ // Purpur end - - this.shrink(1); - breakCallback.accept(item); -diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java -index 2b2af4b7cc2c8be8c3aed30885be26816c021bdc..aff4f33be216f62d6c6e139dcd7fd82efdbd267c 100644 ---- a/net/minecraft/world/item/TridentItem.java -+++ b/net/minecraft/world/item/TridentItem.java -@@ -132,6 +132,18 @@ public class TridentItem extends Item implements ProjectileItem { - f4 *= f / f6; - f5 *= f / f6; - org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(entityhuman, stack, f3, f4, f5); // CraftBukkit -+ -+ // Purpur start -+ List list = EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entityhuman.getItemBySlot(enumitemslot), enumitemslot)).toList(); -+ if (!list.isEmpty()) { -+ EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, entityhuman.random); -+ ItemStack glideItem = entityhuman.getItemBySlot(enumitemslot); -+ if (glideItem.has(net.minecraft.core.component.DataComponents.GLIDER) && world.purpurConfig.elytraDamagePerTridentBoost > 0) { -+ glideItem.hurtAndBreak(world.purpurConfig.elytraDamagePerTridentBoost, entityhuman, enumitemslot); -+ } -+ } -+ // Purpur end -+ - entityhuman.push((double) f3, (double) f4, (double) f5); - entityhuman.startAutoSpinAttack(20, 8.0F, stack); - if (entityhuman.onGround()) { -diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -index 6b7a6a7889353f9557c6e3bfa8ff8caf66416c1b..bc355a6b03877ca5e74688df13a089b487cde86c 100644 ---- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java -@@ -109,6 +109,17 @@ public class PurpurWorldConfig { - tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); - } - -+ public int elytraDamagePerSecond = 1; -+ public double elytraDamageMultiplyBySpeed = 0; -+ 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); -+ elytraDamagePerFireworkBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.firework", elytraDamagePerFireworkBoost); -+ elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); -+ } -+ - public double minecartMaxSpeed = 0.4D; - public boolean minecartPlaceAnywhere = false; - public boolean minecartControllable = false; diff --git a/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch b/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch new file mode 100644 index 000000000..2a4f594c7 --- /dev/null +++ b/purpur-server/minecraft-patches/features/0009-Implement-elytra-settings.patch @@ -0,0 +1,96 @@ +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/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java +index e0b348d8c9f030e745b84d88ad52f70e4214e098..b4add726d6e1c192ecb9524dd9ea6e6c8b6a345d 100644 +--- a/net/minecraft/world/entity/LivingEntity.java ++++ b/net/minecraft/world/entity/LivingEntity.java +@@ -3537,7 +3537,18 @@ public abstract class LivingEntity extends Entity implements Attackable { + if (i1 % 2 == 0) { + List list = EquipmentSlot.VALUES.stream().filter(slot -> canGlideUsing(this.getItemBySlot(slot), slot)).toList(); + EquipmentSlot equipmentSlot = Util.getRandom(list, this.random); +- this.getItemBySlot(equipmentSlot).hurtAndBreak(1, this, equipmentSlot); ++ ++ // Purpur start - Implement elytra settings ++ int damage = level().purpurConfig.elytraDamagePerSecond; ++ if (level().purpurConfig.elytraDamageMultiplyBySpeed > 0) { ++ double speed = getDeltaMovement().lengthSqr(); ++ if (speed > level().purpurConfig.elytraDamageMultiplyBySpeed) { ++ damage *= (int) speed; ++ } ++ } ++ ++ this.getItemBySlot(equipmentSlot).hurtAndBreak(damage, this, equipmentSlot); ++ // Purpur end - Implement elytra settings + } + + this.gameEvent(GameEvent.ELYTRA_GLIDE); +diff --git a/net/minecraft/world/item/FireworkRocketItem.java b/net/minecraft/world/item/FireworkRocketItem.java +index 75a9bd205f32b77c5d242cb9fac0f571ce36045a..b03f182c62c699cc222e67c1ae6eadf99c45d48d 100644 +--- a/net/minecraft/world/item/FireworkRocketItem.java ++++ b/net/minecraft/world/item/FireworkRocketItem.java +@@ -66,6 +66,19 @@ public class FireworkRocketItem extends Item implements ProjectileItem { + com.destroystokyo.paper.event.player.PlayerElytraBoostEvent event = new com.destroystokyo.paper.event.player.PlayerElytraBoostEvent((org.bukkit.entity.Player) player.getBukkitEntity(), org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(itemInHand), (org.bukkit.entity.Firework) delayed.projectile().getBukkitEntity(), org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(hand)); + if (event.callEvent() && delayed.attemptSpawn()) { + player.awardStat(Stats.ITEM_USED.get(this)); // Moved up from below ++ ++ // Purpur start - Implement elytra settings ++ if (level.purpurConfig.elytraDamagePerFireworkBoost > 0) { ++ List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> net.minecraft.world.entity.LivingEntity.canGlideUsing(player.getItemBySlot(enumitemslot), enumitemslot)).toList(); ++ net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, player.random); ++ ++ ItemStack glideItem = player.getItemBySlot(enumitemslot); ++ if (player.canGlide()) { ++ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerFireworkBoost, player, enumitemslot); ++ } ++ } ++ // Purpur end - Implement elytra settings ++ + if (event.shouldConsume() && !player.hasInfiniteMaterials()) { + itemInHand.shrink(1); // Moved up from below + } else { +diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java +index 5d44b568718681b0a5d241037b38a787ad5aaa45..06dfd5424dcf7ab83e524803c8c11f29a6f2ea36 100644 +--- a/net/minecraft/world/item/ItemStack.java ++++ b/net/minecraft/world/item/ItemStack.java +@@ -731,6 +731,14 @@ public final class ItemStack implements DataComponentHolder { + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerItemBreakEvent(serverPlayer, this); // Paper - Add EntityDamageItemEvent + } + // CraftBukkit end ++ ++ // Purpur start - Implement elytra settings ++ if (this.has(DataComponents.GLIDER)) { ++ setDamageValue(this.getMaxDamage() - 1); ++ return; ++ } ++ // Purpur end - Implement elytra settings ++ + this.shrink(1); + onBreak.accept(item); + } +diff --git a/net/minecraft/world/item/TridentItem.java b/net/minecraft/world/item/TridentItem.java +index 23284dbeff327d1b8dc89f3a0dc0ee549cec2daa..cf1bc55f1b5aa610bcb10316ac320344e9739086 100644 +--- a/net/minecraft/world/item/TridentItem.java ++++ b/net/minecraft/world/item/TridentItem.java +@@ -130,6 +130,18 @@ public class TridentItem extends Item implements ProjectileItem { + f1 *= tridentSpinAttackStrength / squareRoot; + f2 *= tridentSpinAttackStrength / squareRoot; + org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, stack, f, f1, f2); // CraftBukkit ++ ++ // Purpur start - Implement elytra settings ++ List list = EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList(); ++ if (!list.isEmpty()) { ++ EquipmentSlot enumitemslot = net.minecraft.Util.getRandom(list, entity.random); ++ ItemStack glideItem = entity.getItemBySlot(enumitemslot); ++ if (glideItem.has(net.minecraft.core.component.DataComponents.GLIDER) && level.purpurConfig.elytraDamagePerTridentBoost > 0) { ++ glideItem.hurtAndBreak(level.purpurConfig.elytraDamagePerTridentBoost, entity, enumitemslot); ++ } ++ } ++ // Purpur end - Implement elytra settings ++ + player.push(f, f1, f2); + player.startAutoSpinAttack(20, 8.0F, stack); + if (player.onGround()) { diff --git a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java index 686f1f083..c9f68c572 100644 --- a/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java +++ b/purpur-server/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java @@ -97,6 +97,17 @@ public class PurpurWorldConfig { tridentLoyaltyVoidReturnHeight = getDouble("gameplay-mechanics.trident-loyalty-void-return-height", tridentLoyaltyVoidReturnHeight); } + public int elytraDamagePerSecond = 1; + public double elytraDamageMultiplyBySpeed = 0; + 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); + elytraDamagePerFireworkBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.firework", elytraDamagePerFireworkBoost); + elytraDamagePerTridentBoost = getInt("gameplay-mechanics.elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); + } + public double minecartMaxSpeed = 0.4D; public boolean minecartPlaceAnywhere = false; public boolean minecartControllable = false;