mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
150 lines
8.4 KiB
Diff
150 lines
8.4 KiB
Diff
From 8fe170dadbfa162a96bce3f144e17eaa07c09c2c 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 | 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 4e6598cf5a..cbd7ab3a89 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityLiving.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityLiving.java
|
|
@@ -2588,9 +2588,16 @@ public abstract class EntityLiving extends Entity {
|
|
if (itemstack.getItem() == Items.ELYTRA && ItemElytra.e(itemstack)) {
|
|
flag = true;
|
|
if (!this.world.isClientSide && (this.bp + 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;
|
|
@@ -3237,6 +3244,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 9e86ef4ce2..832cea636b 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemFireworks.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemFireworks.java
|
|
@@ -38,6 +38,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 0e164840fd..d9b63547d9 100644
|
|
--- a/src/main/java/net/minecraft/server/ItemStack.java
|
|
+++ b/src/main/java/net/minecraft/server/ItemStack.java
|
|
@@ -393,7 +393,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) {
|
|
@@ -439,6 +439,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 c408157368..28f9f6e405 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.f((double) f2, (double) f3, (double) f4);
|
|
entityhuman.q(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 d2eb861af2..b89f9fe7b1 100644
|
|
--- a/src/main/java/net/minecraft/server/Vec3D.java
|
|
+++ b/src/main/java/net/minecraft/server/Vec3D.java
|
|
@@ -93,6 +93,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 4dfecc4a1b..6a3df6ed2a 100644
|
|
--- a/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
+++ b/src/main/java/net/pl3x/purpur/PurpurWorldConfig.java
|
|
@@ -140,4 +140,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.20.1
|
|
|