mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-02-17 16:37:43 +01:00
Upstream has released updates that appear to apply and compile correctly Paper Changes: PaperMC/Paper@37df121 Fix BlockState being set to null for damage events (#10252)
175 lines
10 KiB
Diff
175 lines
10 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: JustDoom <justdoomdev@gmail.com>
|
|
Date: Fri, 5 Mar 2021 14:23:16 -0500
|
|
Subject: [PATCH] Dont run with scissors!
|
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
index 32f33eb8b99ad4655cf021b7cf16eb15fe96ba59..4220c1b4e44ecf67653fe5a50a209866ddafd3bf 100644
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
@@ -1657,6 +1657,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
this.player.resetFallDistance();
|
|
}
|
|
|
|
+ // Purpur Start
|
|
+ if (this.player.level().purpurConfig.dontRunWithScissors && this.player.isSprinting() && !(this.player.level().purpurConfig.ignoreScissorsInWater && this.player.isInWater()) && !(this.player.level().purpurConfig.ignoreScissorsInLava && this.player.isInLava()) && (isScissor(this.player.getItemInHand(InteractionHand.MAIN_HAND)) || isScissor(this.player.getItemInHand(InteractionHand.OFF_HAND))) && (int) (Math.random() * 10) == 0) {
|
|
+ this.player.hurt(this.player.damageSources().scissors(), (float) this.player.level().purpurConfig.scissorsRunningDamage);
|
|
+ if (!org.purpurmc.purpur.PurpurConfig.dontRunWithScissors.isBlank()) this.player.sendActionBarMessage(org.purpurmc.purpur.PurpurConfig.dontRunWithScissors);
|
|
+ }
|
|
+ // Purpur End
|
|
+
|
|
this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5);
|
|
this.lastGoodX = this.player.getX();
|
|
this.lastGoodY = this.player.getY();
|
|
@@ -1696,6 +1703,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
return false;
|
|
}
|
|
// Paper end - optimise out extra getCubes
|
|
+
|
|
+ // Purpur start
|
|
+ public boolean isScissor(ItemStack stack) {
|
|
+ return stack.is(Items.SHEARS) && (stack.getTag() == null || stack.getTag().getInt("CustomModelData") == 0);
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) {
|
|
AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ());
|
|
Iterable<VoxelShape> iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D));
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
|
index 9c99b2e365aacb8309f29acb9025faccd2c676b3..5c9d49b40a940df724101bef339a9ac5a31fd025 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/CombatTracker.java
|
|
@@ -99,6 +99,11 @@ public class CombatTracker {
|
|
Component component = ComponentUtils.wrapInSquareBrackets(Component.translatable(string + ".link")).withStyle(INTENTIONAL_GAME_DESIGN_STYLE);
|
|
return Component.translatable(string + ".message", this.mob.getDisplayName(), component);
|
|
} else {
|
|
+ // Purpur start
|
|
+ if (damageSource.isScissors()) {
|
|
+ return damageSource.getLocalizedDeathMessage(org.purpurmc.purpur.PurpurConfig.deathMsgRunWithScissors, this.mob);
|
|
+ }
|
|
+ // Purpur end
|
|
return damageSource.getLocalizedDeathMessage(this.mob);
|
|
}
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSource.java b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
index 938524dc5b495ad160b9b14219db573e4e7c6a8a..f7786be77a0594fa5e11a328648cbad16bbab2e1 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSource.java
|
|
@@ -27,6 +27,7 @@ public class DamageSource {
|
|
private boolean withSweep = false;
|
|
private boolean melting = false;
|
|
private boolean poison = false;
|
|
+ private boolean scissors = false; // Purpur
|
|
private Entity customCausingEntity = null; // This field is a helper for when causing entity damage is not set by vanilla
|
|
|
|
public DamageSource sweep() {
|
|
@@ -56,6 +57,17 @@ public class DamageSource {
|
|
return this.poison;
|
|
}
|
|
|
|
+ // Purpur start
|
|
+ public DamageSource scissors() {
|
|
+ this.scissors = true;
|
|
+ return this;
|
|
+ }
|
|
+
|
|
+ public boolean isScissors() {
|
|
+ return this.scissors;
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
public Entity getCausingEntity() {
|
|
return (this.customCausingEntity != null) ? this.customCausingEntity : this.causingEntity;
|
|
}
|
|
@@ -94,6 +106,7 @@ public class DamageSource {
|
|
damageSource.withSweep = this.isSweep();
|
|
damageSource.poison = this.isPoison();
|
|
damageSource.melting = this.isMelting();
|
|
+ damageSource.scissors = this.isScissors(); // Purpur
|
|
return damageSource;
|
|
}
|
|
// CraftBukkit end
|
|
diff --git a/src/main/java/net/minecraft/world/damagesource/DamageSources.java b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
index a47473c9875c70c52b9a61e0156e55961f34c694..23c7f22dacc570837120c28e0a57f8c9155e92fc 100644
|
|
--- a/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
+++ b/src/main/java/net/minecraft/world/damagesource/DamageSources.java
|
|
@@ -44,11 +44,13 @@ public class DamageSources {
|
|
// CraftBukkit start
|
|
private final DamageSource melting;
|
|
private final DamageSource poison;
|
|
+ private final DamageSource scissors; // Purpur
|
|
|
|
public DamageSources(RegistryAccess registryManager) {
|
|
this.damageTypes = registryManager.registryOrThrow(Registries.DAMAGE_TYPE);
|
|
this.melting = this.source(DamageTypes.ON_FIRE).melting();
|
|
this.poison = this.source(DamageTypes.MAGIC).poison();
|
|
+ this.scissors = this.source(DamageTypes.MAGIC).scissors(); // Purpur
|
|
// CraftBukkit end
|
|
this.inFire = this.source(DamageTypes.IN_FIRE);
|
|
this.lightningBolt = this.source(DamageTypes.LIGHTNING_BOLT);
|
|
@@ -97,6 +99,12 @@ public class DamageSources {
|
|
}
|
|
// CraftBukkit end
|
|
|
|
+ // Purpur start
|
|
+ public DamageSource scissors() {
|
|
+ return this.scissors;
|
|
+ }
|
|
+ // Purpur end
|
|
+
|
|
public DamageSource inFire() {
|
|
return this.inFire;
|
|
}
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurConfig.java b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
index 57734b187e3a66d0d244db2f7968256884957ff2..6714c095714c3a34464b9190be964ceaac718d45 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurConfig.java
|
|
@@ -183,6 +183,7 @@ public class PurpurConfig {
|
|
public static String demoCommandOutput = "<green>%s has been shown the demo screen";
|
|
public static String pingCommandOutput = "<green>%s's ping is %sms";
|
|
public static String tpsbarCommandOutput = "<green>Tpsbar toggled <onoff> for <target>";
|
|
+ public static String dontRunWithScissors = "<red><italic>Don't run with scissors!";
|
|
private static void messages() {
|
|
cannotRideMob = getString("settings.messages.cannot-ride-mob", cannotRideMob);
|
|
afkBroadcastAway = getString("settings.messages.afk-broadcast-away", afkBroadcastAway);
|
|
@@ -194,6 +195,12 @@ public class PurpurConfig {
|
|
demoCommandOutput = getString("settings.messages.demo-command-output", demoCommandOutput);
|
|
pingCommandOutput = getString("settings.messages.ping-command-output", pingCommandOutput);
|
|
tpsbarCommandOutput = getString("settings.messages.tpsbar-command-output", tpsbarCommandOutput);
|
|
+ dontRunWithScissors = getString("settings.messages.dont-run-with-scissors", dontRunWithScissors);
|
|
+ }
|
|
+
|
|
+ public static String deathMsgRunWithScissors = "<player> slipped and fell on their shears";
|
|
+ private static void deathMessages() {
|
|
+ deathMsgRunWithScissors = getString("settings.messages.death-message.run-with-scissors", deathMsgRunWithScissors);
|
|
}
|
|
|
|
public static String serverModName = "Purpur";
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
index 6d017d5d3cfe8581936b8f1fb58656ff2b2fdf95..9fa138e30e3885a760e40f8da32a8a86acf150b7 100644
|
|
--- a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
@@ -197,6 +197,10 @@ public class PurpurWorldConfig {
|
|
public List<Item> itemImmuneToExplosion = new ArrayList<>();
|
|
public List<Item> itemImmuneToFire = new ArrayList<>();
|
|
public List<Item> itemImmuneToLightning = new ArrayList<>();
|
|
+ public boolean dontRunWithScissors = false;
|
|
+ public boolean ignoreScissorsInWater = false;
|
|
+ public boolean ignoreScissorsInLava = false;
|
|
+ public double scissorsRunningDamage = 1D;
|
|
private void itemSettings() {
|
|
itemImmuneToCactus.clear();
|
|
getList("gameplay-mechanics.item.immune.cactus", new ArrayList<>()).forEach(key -> {
|
|
@@ -234,6 +238,10 @@ public class PurpurWorldConfig {
|
|
Item item = BuiltInRegistries.ITEM.get(new ResourceLocation(key.toString()));
|
|
if (item != Items.AIR) itemImmuneToLightning.add(item);
|
|
});
|
|
+ dontRunWithScissors = getBoolean("gameplay-mechanics.item.shears.damage-if-sprinting", dontRunWithScissors);
|
|
+ ignoreScissorsInWater = getBoolean("gameplay-mechanics.item.shears.ignore-in-water", ignoreScissorsInWater);
|
|
+ ignoreScissorsInLava = getBoolean("gameplay-mechanics.item.shears.ignore-in-lava", ignoreScissorsInLava);
|
|
+ scissorsRunningDamage = getDouble("gameplay-mechanics.item.shears.sprinting-damage", scissorsRunningDamage);
|
|
}
|
|
|
|
public double minecartMaxSpeed = 0.4D;
|