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 45ab2a35a27b35b682cf90a14c587a50ad2f6ce5..7ec097b3be4fa2ad99de2891fa5507af92ebbeab 100644 --- a/net/minecraft/world/entity/LivingEntity.java +++ b/net/minecraft/world/entity/LivingEntity.java @@ -3968,7 +3968,16 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin if (freeFallInterval % 2 == 0) { List slotsWithGliders = EquipmentSlot.VALUES.stream().filter(slot -> canGlideUsing(this.getItemBySlot(slot), slot)).toList(); EquipmentSlot slotToDamage = Util.getRandom(slotsWithGliders, this.random); - this.getItemBySlot(slotToDamage).hurtAndBreak(1, this, slotToDamage); + // 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(slotToDamage).hurtAndBreak(damage, this, slotToDamage); + // 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 b3443ff2d06af328493046e723efc11d299a2824..3c001b3810097d5cb60ad64e0727d8d9907f6a38 100644 --- a/net/minecraft/world/item/FireworkRocketItem.java +++ b/net/minecraft/world/item/FireworkRocketItem.java @@ -73,6 +73,17 @@ public class FireworkRocketItem extends Item implements ProjectileItem { if (player.dropAllLeashConnections(player, hand)) { // Paper - PlayerUnleashEntityEvent level.playSound(null, player, SoundEvents.LEAD_BREAK, SoundSource.NEUTRAL, 1.0F, 1.0F); } + // Purpur start - Implement elytra settings + if (level.purpurConfig.elytraDamagePerFireworkBoost > 0) { + java.util.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.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()) { itemStack.shrink(1); // Moved up from below } else { diff --git a/net/minecraft/world/item/ItemStack.java b/net/minecraft/world/item/ItemStack.java index 3bbad55a7a81534a192e91ecd198f3201f65f527..d74eef5eb06f7d957941e9602f137f20c25fc3c5 100644 --- a/net/minecraft/world/item/ItemStack.java +++ b/net/minecraft/world/item/ItemStack.java @@ -669,6 +669,14 @@ public final class ItemStack implements DataComponentHolder, ItemInstance { 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 0321dffbbea8bf35640680eedd21cd9f9daa6c04..91f81dbf4e1fbf029c8f70ad3a80a489e1188a54 100644 --- a/net/minecraft/world/item/TridentItem.java +++ b/net/minecraft/world/item/TridentItem.java @@ -127,6 +127,16 @@ public class TridentItem extends Item implements ProjectileItem { yd *= riptideStrength / dist; zd *= riptideStrength / dist; if (!org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerRiptideEvent(player, itemStack, xd, yd, zd)) return false; // Paper - Add player riptide event + // Purpur start - Implement elytra settings + List list = net.minecraft.world.entity.EquipmentSlot.VALUES.stream().filter((enumitemslot) -> LivingEntity.canGlideUsing(entity.getItemBySlot(enumitemslot), enumitemslot)).toList(); + if (!list.isEmpty()) { + net.minecraft.world.entity.EquipmentSlot enumitemslot = net.minecraft.util.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(xd, yd, zd); player.startAutoSpinAttack(20, 8.0F, itemStack); if (player.onGround()) {