From eba616d0174d1b56458799b7944350a89fffc7d4 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 --- .../java/net/minecraft/server/EntityLiving.java | 14 +++++++++++--- .../java/net/minecraft/server/ItemFireworks.java | 8 ++++++++ src/main/java/net/minecraft/server/ItemStack.java | 8 +++++++- .../java/net/minecraft/server/ItemTrident.java | 10 ++++++++++ src/main/java/net/minecraft/server/Vec3D.java | 1 + .../java/net/pl3x/purpur/PurpurWorldConfig.java | 13 +++++++++++++ 6 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java index 7581316497..7d424040cc 100644 --- a/src/main/java/net/minecraft/server/EntityLiving.java +++ b/src/main/java/net/minecraft/server/EntityLiving.java @@ -2652,9 +2652,16 @@ public abstract class EntityLiving extends Entity { if (itemstack.getItem() == Items.ELYTRA && ItemElytra.e(itemstack)) { flag = true; if (!this.world.isClientSide && (this.bm + 1) % 20 == 0) { - itemstack.damage(1, this, (entityliving) -> { - entityliving.c(EnumItemSlot.CHEST); - }); + // Purpur start + int damage = world.purpurConfig.elytraDamagePerSecond; + if (world.purpurConfig.elytraDamageMultiplyBySpeed > 0) { + double speed = getMot().length(); + if (speed > world.purpurConfig.elytraDamageMultiplyBySpeed) { + damage *= (int) speed; + } + } + itemstack.damage(damage, this, (entityliving) -> entityliving.c(EnumItemSlot.CHEST)); + // Purpur end } } else { flag = false; @@ -3317,6 +3324,7 @@ public abstract class EntityLiving extends Entity { } } + public void sendBreakAnimation(EnumItemSlot slot) { c(slot); } // Purpur - OBFHELPER public void c(EnumItemSlot enumitemslot) { this.world.broadcastEntityEffect(this, d(enumitemslot)); } diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java index a43e52889f..cc8fbccd16 100644 --- a/src/main/java/net/minecraft/server/ItemFireworks.java +++ b/src/main/java/net/minecraft/server/ItemFireworks.java @@ -39,6 +39,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.sendBreakAnimation(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/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java index 222a8fdc3b..5379d0e0d8 100644 --- a/src/main/java/net/minecraft/server/ItemStack.java +++ b/src/main/java/net/minecraft/server/ItemStack.java @@ -401,7 +401,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) { @@ -447,6 +447,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/server/ItemTrident.java b/src/main/java/net/minecraft/server/ItemTrident.java index b8c36e9b10..cff48fafa0 100644 --- a/src/main/java/net/minecraft/server/ItemTrident.java +++ b/src/main/java/net/minecraft/server/ItemTrident.java @@ -93,6 +93,16 @@ public class ItemTrident extends Item { f2 *= f6 / f5; f3 *= f6 / f5; f4 *= f6 / f5; + + // Purpur start + ItemStack chestItem = entityhuman.getEquipment(EnumItemSlot.CHEST); + if (chestItem.getItem() == Items.ELYTRA) { + if (world.purpurConfig.elytraDamagePerTridentBoost > 0) { + chestItem.damage(world.purpurConfig.elytraDamagePerTridentBoost, entityhuman, (entity) -> entity.sendBreakAnimation(EnumItemSlot.CHEST)); + } + } + // Purpur end + entityhuman.h((double) f2, (double) f3, (double) f4); entityhuman.r(20); if (entityhuman.onGround) { diff --git a/src/main/java/net/minecraft/server/Vec3D.java b/src/main/java/net/minecraft/server/Vec3D.java index 0c7f094e54..dfa2a863a0 100644 --- a/src/main/java/net/minecraft/server/Vec3D.java +++ b/src/main/java/net/minecraft/server/Vec3D.java @@ -97,6 +97,7 @@ public class Vec3D implements IPosition { return (double) MathHelper.sqrt(this.x * this.x + this.y * this.y + this.z * this.z); } + public double length() { return this.g(); } // Purpur - OBFHELPER public double g() { return this.x * this.x + this.y * this.y + this.z * this.z; } diff --git a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java index 8d01cdc8e3..059cf85f4f 100644 --- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java +++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java @@ -130,4 +130,17 @@ public class PurpurWorldConfig { radiusVillagerIronGolemSpawns = getInt("radius-villager-iron-golem-spawns", radiusVillagerIronGolemSpawns); limitVillagerIronGolemSpawns = getInt("limit-villager-iron-golem-spawns", limitVillagerIronGolemSpawns); } + + 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("elytra.damage-per-second", elytraDamagePerSecond); + elytraDamageMultiplyBySpeed = getDouble("elytra.damage-multiplied-by-speed", elytraDamageMultiplyBySpeed); + elytraIgnoreUnbreaking = getBoolean("elytra.ignore-unbreaking", elytraIgnoreUnbreaking); + elytraDamagePerFireworkBoost = getInt("elytra.damage-per-boost.firework", elytraDamagePerFireworkBoost); + elytraDamagePerTridentBoost = getInt("elytra.damage-per-boost.trident", elytraDamagePerTridentBoost); + } } -- 2.24.0.rc1