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;