Files
Purpur/patches/server/0046-Implement-elytra-settings.patch
William Blake Galbreath c0c212bf48 Updated Upstream (Paper)
Upstream has released updates that appears to apply and compile correctly

Paper Changes:
b75eeca0 Boost light task priority to ensure it doesnt hold up chunk loads
3d2bc848 Ensure VillagerTrades doesn't load async - fixes #3495
e470f1ef Add more information to Timing Reports
f4a47db6 Improve Thread Pool usage to allow single threads for single cpu servers
a4fe910f Fix sounds when using worldedit regen command
70ad51a8 Updated Upstream (Bukkit/CraftBukkit)
d7cfa4fa Improve legacy format serialization more
2020-06-05 21:42:48 -05:00

144 lines
8.2 KiB
Diff

From 06d3e2899cea8bb9a7a4143b6acf6afc157e14f3 Mon Sep 17 00:00:00 2001
From: William Blake Galbreath <blake.galbreath@gmail.com>
Date: Thu, 25 Jul 2019 18:07:37 -0500
Subject: [PATCH] Implement elytra settings
---
.../java/net/minecraft/server/EntityLiving.java | 13 ++++++++++---
.../java/net/minecraft/server/ItemFireworks.java | 8 ++++++++
src/main/java/net/minecraft/server/ItemStack.java | 8 +++++++-
src/main/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, 49 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/minecraft/server/EntityLiving.java b/src/main/java/net/minecraft/server/EntityLiving.java
index 21b5bc47d7..c1cc24cf11 100644
--- a/src/main/java/net/minecraft/server/EntityLiving.java
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
@@ -2658,9 +2658,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.broadcastItemBreak(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.broadcastItemBreak(EnumItemSlot.CHEST));
+ // Purpur end
}
} else {
flag = false;
diff --git a/src/main/java/net/minecraft/server/ItemFireworks.java b/src/main/java/net/minecraft/server/ItemFireworks.java
index bd524a35bb..c0e8cd0cdc 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.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/server/ItemStack.java b/src/main/java/net/minecraft/server/ItemStack.java
index ce6a466852..8c3bbef666 100644
--- a/src/main/java/net/minecraft/server/ItemStack.java
+++ b/src/main/java/net/minecraft/server/ItemStack.java
@@ -402,7 +402,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) {
@@ -448,6 +448,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 f571a1586d..c26300eacd 100644
--- a/src/main/java/net/minecraft/server/ItemTrident.java
+++ b/src/main/java/net/minecraft/server/ItemTrident.java
@@ -100,6 +100,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.broadcastItemBreak(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 62a0810062..53e7e82688 100644
--- a/src/main/java/net/minecraft/server/Vec3D.java
+++ b/src/main/java/net/minecraft/server/Vec3D.java
@@ -100,6 +100,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 299b080c89..5318a8e327 100644
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
@@ -142,6 +142,19 @@ public class PurpurWorldConfig {
useBetterMending = getBoolean("gameplay-mechanics.use-better-mending", useBetterMending);
}
+ 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 boolean idleTimeoutKick = true;
public boolean idleTimeoutTickNearbyEntities = true;
public boolean idleTimeoutCountAsSleeping = false;
--
2.24.0