mirror of
https://github.com/PurpurMC/Purpur.git
synced 2026-06-21 09:47:45 +02:00
Initial 26.2 port
This commit is contained in:
@@ -1,9 +1,9 @@
|
|||||||
group = org.purpurmc.purpur
|
group = org.purpurmc.purpur
|
||||||
|
|
||||||
mcVersion = 26.1.2
|
mcVersion = 26.2-pre-3
|
||||||
apiVersion = 26.1.2
|
apiVersion = 26.2
|
||||||
channel=STABLE
|
channel=EXPERIMENTAL
|
||||||
paperCommit = 76d2ac758cb3abe75aceefa88207443768f585c6
|
paperCommit = 1bea43f2481fd75fc4474d5cbc8cf8633ac72ca5
|
||||||
|
|
||||||
org.gradle.configuration-cache = true
|
org.gradle.configuration-cache = true
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
|
|||||||
@@ -27,7 +27,7 @@
|
|||||||
+ // Purpur end - Rebrand
|
+ // Purpur end - Rebrand
|
||||||
+
|
+
|
||||||
+ /*updatingMinecraft { // Purpur start - TODO - snapshot - we don't need this
|
+ /*updatingMinecraft { // Purpur start - TODO - snapshot - we don't need this
|
||||||
// oldPaperCommit = "711c5de2b05df39b72c44ff54e9f9381f8d153cb"
|
oldPaperCommit = "d4fe85375af18bfa88f44d7c1e6a61904ae550cc"
|
||||||
- }
|
- }
|
||||||
+ }*/ // Purpur end - TODO - snapshot - we don't need this
|
+ }*/ // Purpur end - TODO - snapshot - we don't need this
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/core/dispenser/DispenseItemBehavior.java b/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
||||||
|
index b851968a97a0f6df597a9f1fc91517b6835adf68..56b9f9016a652a704d785de683738efcf02a44f9 100644
|
||||||
--- a/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
--- a/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
||||||
+++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
+++ b/net/minecraft/core/dispenser/DispenseItemBehavior.java
|
||||||
@@ -683,5 +_,22 @@
|
@@ -683,5 +683,22 @@ public interface DispenseItemBehavior {
|
||||||
DispenserBlock.registerBehavior(Items.TNT_MINECART, new MinecartDispenseItemBehavior(EntityType.TNT_MINECART));
|
DispenserBlock.registerBehavior(Items.TNT_MINECART, new MinecartDispenseItemBehavior(EntityType.TNT_MINECART));
|
||||||
DispenserBlock.registerBehavior(Items.HOPPER_MINECART, new MinecartDispenseItemBehavior(EntityType.HOPPER_MINECART));
|
DispenserBlock.registerBehavior(Items.HOPPER_MINECART, new MinecartDispenseItemBehavior(EntityType.HOPPER_MINECART));
|
||||||
DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, new MinecartDispenseItemBehavior(EntityType.COMMAND_BLOCK_MINECART));
|
DispenserBlock.registerBehavior(Items.COMMAND_BLOCK_MINECART, new MinecartDispenseItemBehavior(EntityType.COMMAND_BLOCK_MINECART));
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/server/gui/MinecraftServerGui.java b/net/minecraft/server/gui/MinecraftServerGui.java
|
||||||
|
index b810cb0a9dd8713aed70cc9fdeea1bc249c8e0dc..f5c52f0aa85d8ae66215fbbe94773b16e06a72a5 100644
|
||||||
--- a/net/minecraft/server/gui/MinecraftServerGui.java
|
--- a/net/minecraft/server/gui/MinecraftServerGui.java
|
||||||
+++ b/net/minecraft/server/gui/MinecraftServerGui.java
|
+++ b/net/minecraft/server/gui/MinecraftServerGui.java
|
||||||
@@ -39,6 +_,11 @@
|
@@ -39,6 +39,11 @@ public class MinecraftServerGui extends JComponent {
|
||||||
private Thread logAppenderThread;
|
private Thread logAppenderThread;
|
||||||
private final Collection<Runnable> finalizers = Lists.newArrayList();
|
private final Collection<Runnable> finalizers = Lists.newArrayList();
|
||||||
private final AtomicBoolean isClosing = new AtomicBoolean();
|
private final AtomicBoolean isClosing = new AtomicBoolean();
|
||||||
@@ -12,7 +20,7 @@
|
|||||||
|
|
||||||
public static MinecraftServerGui showFrameFor(final DedicatedServer server) {
|
public static MinecraftServerGui showFrameFor(final DedicatedServer server) {
|
||||||
try {
|
try {
|
||||||
@@ -46,7 +_,7 @@
|
@@ -46,7 +51,7 @@ public class MinecraftServerGui extends JComponent {
|
||||||
} catch (Exception var3) {
|
} catch (Exception var3) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -21,7 +29,7 @@
|
|||||||
final MinecraftServerGui gui = new MinecraftServerGui(server);
|
final MinecraftServerGui gui = new MinecraftServerGui(server);
|
||||||
frame.setDefaultCloseOperation(2);
|
frame.setDefaultCloseOperation(2);
|
||||||
frame.add(gui);
|
frame.add(gui);
|
||||||
@@ -54,7 +_,7 @@
|
@@ -54,7 +59,7 @@ public class MinecraftServerGui extends JComponent {
|
||||||
frame.setLocationRelativeTo(null);
|
frame.setLocationRelativeTo(null);
|
||||||
frame.setVisible(true);
|
frame.setVisible(true);
|
||||||
// Paper start - Improve ServerGUI
|
// Paper start - Improve ServerGUI
|
||||||
@@ -30,7 +38,7 @@
|
|||||||
try {
|
try {
|
||||||
frame.setIconImage(javax.imageio.ImageIO.read(java.util.Objects.requireNonNull(MinecraftServerGui.class.getClassLoader().getResourceAsStream("logo.png"))));
|
frame.setIconImage(javax.imageio.ImageIO.read(java.util.Objects.requireNonNull(MinecraftServerGui.class.getClassLoader().getResourceAsStream("logo.png"))));
|
||||||
} catch (java.io.IOException ignore) {
|
} catch (java.io.IOException ignore) {
|
||||||
@@ -64,7 +_,7 @@
|
@@ -64,7 +69,7 @@ public class MinecraftServerGui extends JComponent {
|
||||||
@Override
|
@Override
|
||||||
public void windowClosing(final WindowEvent event) {
|
public void windowClosing(final WindowEvent event) {
|
||||||
if (!gui.isClosing.getAndSet(true)) {
|
if (!gui.isClosing.getAndSet(true)) {
|
||||||
@@ -39,7 +47,7 @@
|
|||||||
server.halt(true);
|
server.halt(true);
|
||||||
gui.runFinalizers();
|
gui.runFinalizers();
|
||||||
}
|
}
|
||||||
@@ -112,7 +_,7 @@
|
@@ -112,7 +117,7 @@ public class MinecraftServerGui extends JComponent {
|
||||||
|
|
||||||
private JComponent buildChatPanel() {
|
private JComponent buildChatPanel() {
|
||||||
JPanel panel = new JPanel(new BorderLayout());
|
JPanel panel = new JPanel(new BorderLayout());
|
||||||
@@ -48,7 +56,7 @@
|
|||||||
JScrollPane scrollPane = new JScrollPane(chatArea, 22, 30);
|
JScrollPane scrollPane = new JScrollPane(chatArea, 22, 30);
|
||||||
chatArea.setEditable(false);
|
chatArea.setEditable(false);
|
||||||
chatArea.setFont(MONOSPACED);
|
chatArea.setFont(MONOSPACED);
|
||||||
@@ -121,10 +_,43 @@
|
@@ -121,10 +126,43 @@ public class MinecraftServerGui extends JComponent {
|
||||||
String text = chatField.getText().trim();
|
String text = chatField.getText().trim();
|
||||||
if (!text.isEmpty()) {
|
if (!text.isEmpty()) {
|
||||||
this.server.handleConsoleInput(text, this.server.createCommandSourceStack());
|
this.server.handleConsoleInput(text, this.server.createCommandSourceStack());
|
||||||
@@ -92,7 +100,7 @@
|
|||||||
chatArea.addFocusListener(new FocusAdapter() {
|
chatArea.addFocusListener(new FocusAdapter() {
|
||||||
@Override
|
@Override
|
||||||
public void focusGained(final FocusEvent arg0) {
|
public void focusGained(final FocusEvent arg0) {
|
||||||
@@ -159,7 +_,7 @@
|
@@ -159,7 +197,7 @@ public class MinecraftServerGui extends JComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final java.util.regex.Pattern ANSI = java.util.regex.Pattern.compile("\\e\\[[\\d;]*[^\\d;]"); // CraftBukkit // Paper
|
private static final java.util.regex.Pattern ANSI = java.util.regex.Pattern.compile("\\e\\[[\\d;]*[^\\d;]"); // CraftBukkit // Paper
|
||||||
@@ -101,7 +109,7 @@
|
|||||||
if (!SwingUtilities.isEventDispatchThread()) {
|
if (!SwingUtilities.isEventDispatchThread()) {
|
||||||
SwingUtilities.invokeLater(() -> this.print(console, scrollPane, line));
|
SwingUtilities.invokeLater(() -> this.print(console, scrollPane, line));
|
||||||
} else {
|
} else {
|
||||||
@@ -170,16 +_,29 @@
|
@@ -170,10 +208,11 @@ public class MinecraftServerGui extends JComponent {
|
||||||
shouldScroll = scrollBar.getValue() + scrollBar.getSize().getHeight() + MONOSPACED.getSize() * 4 > scrollBar.getMaximum();
|
shouldScroll = scrollBar.getValue() + scrollBar.getSize().getHeight() + MONOSPACED.getSize() * 4 > scrollBar.getMaximum();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,10 +123,10 @@
|
|||||||
|
|
||||||
if (shouldScroll) {
|
if (shouldScroll) {
|
||||||
scrollBar.setValue(Integer.MAX_VALUE);
|
scrollBar.setValue(Integer.MAX_VALUE);
|
||||||
}
|
@@ -181,6 +220,18 @@ public class MinecraftServerGui extends JComponent {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+
|
|
||||||
+ // Purpur start - GUI Improvements
|
+ // Purpur start - GUI Improvements
|
||||||
+ public static class CommandHistory extends java.util.LinkedList<String> {
|
+ public static class CommandHistory extends java.util.LinkedList<String> {
|
||||||
+ @Override
|
+ @Override
|
||||||
@@ -130,6 +138,7 @@
|
|||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
+ // Purpur end - GUI Improvements
|
+ // Purpur end - GUI Improvements
|
||||||
|
+
|
||||||
// Paper start - Add onboarding message for initial server start
|
// Paper start - Add onboarding message for initial server start
|
||||||
private JComponent buildOnboardingPanel() {
|
private JComponent buildOnboardingPanel() {
|
||||||
|
String onboardingLink = "https://docs.papermc.io/paper/next-steps";
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
|
||||||
|
index 229ff740e0418a05d824a67401ae6f105b4c3642..316fece122a3b71b5c809ed15c46c8cb37d1cdbf 100644
|
||||||
--- a/net/minecraft/server/level/ServerLevel.java
|
--- a/net/minecraft/server/level/ServerLevel.java
|
||||||
+++ b/net/minecraft/server/level/ServerLevel.java
|
+++ b/net/minecraft/server/level/ServerLevel.java
|
||||||
@@ -219,6 +_,8 @@
|
@@ -219,6 +219,8 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
private final StructureManager structureManager;
|
private final StructureManager structureManager;
|
||||||
private final StructureCheck structureCheck;
|
private final StructureCheck structureCheck;
|
||||||
private final boolean tickTime;
|
private final boolean tickTime;
|
||||||
@@ -9,7 +17,7 @@
|
|||||||
private final LevelDebugSynchronizers debugSynchronizers = new LevelDebugSynchronizers(this);
|
private final LevelDebugSynchronizers debugSynchronizers = new LevelDebugSynchronizers(this);
|
||||||
|
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
@@ -643,8 +_,25 @@
|
@@ -643,8 +645,25 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
this.tickTime = tickTime;
|
this.tickTime = tickTime;
|
||||||
this.server = server;
|
this.server = server;
|
||||||
@@ -36,7 +44,7 @@
|
|||||||
ChunkGenerator generator = levelStem.generator();
|
ChunkGenerator generator = levelStem.generator();
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
// Paper start - per-world time
|
// Paper start - per-world time
|
||||||
@@ -738,6 +_,7 @@
|
@@ -738,6 +757,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler);
|
this.chunkDataController = new ca.spottedleaf.moonrise.patches.chunk_system.io.datacontroller.ChunkDataController((ServerLevel)(Object)this, this.chunkTaskScheduler);
|
||||||
// Paper end - rewrite chunk system
|
// Paper end - rewrite chunk system
|
||||||
this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
|
this.getCraftServer().addWorld(this.getWorld()); // CraftBukkit
|
||||||
@@ -44,7 +52,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Paper start
|
// Paper start
|
||||||
@@ -794,7 +_,7 @@
|
@@ -794,7 +814,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
}
|
}
|
||||||
|
|
||||||
int percentage = this.getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
int percentage = this.getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
||||||
@@ -53,7 +61,7 @@
|
|||||||
Optional<Holder<WorldClock>> defaultClock = this.dimensionType().defaultClock();
|
Optional<Holder<WorldClock>> defaultClock = this.dimensionType().defaultClock();
|
||||||
org.bukkit.event.world.ClockTimeSkipEvent event = null; // Paper - per-world time
|
org.bukkit.event.world.ClockTimeSkipEvent event = null; // Paper - per-world time
|
||||||
if (this.getGameRules().get(GameRules.ADVANCE_TIME) && defaultClock.isPresent()) {
|
if (this.getGameRules().get(GameRules.ADVANCE_TIME) && defaultClock.isPresent()) {
|
||||||
@@ -1036,9 +_,18 @@
|
@@ -1036,9 +1056,18 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
&& this.random.nextDouble() < difficulty.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01) // Paper - Configurable spawn chances for skeleton horses
|
&& this.random.nextDouble() < difficulty.getEffectiveDifficulty() * this.paperConfig().entities.spawning.skeletonHorseThunderSpawnChance.or(0.01) // Paper - Configurable spawn chances for skeleton horses
|
||||||
&& !this.getBlockState(pos.below()).is(BlockTags.LIGHTNING_RODS);
|
&& !this.getBlockState(pos.below()).is(BlockTags.LIGHTNING_RODS);
|
||||||
if (isTrap) {
|
if (isTrap) {
|
||||||
@@ -73,7 +81,7 @@
|
|||||||
horse.setAge(0);
|
horse.setAge(0);
|
||||||
horse.setPos(pos.getX(), pos.getY(), pos.getZ());
|
horse.setPos(pos.getX(), pos.getY(), pos.getZ());
|
||||||
this.addFreshEntity(horse, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit
|
this.addFreshEntity(horse, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.LIGHTNING); // CraftBukkit
|
||||||
@@ -1073,9 +_,35 @@
|
@@ -1073,9 +1102,35 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
if (state.is(Blocks.SNOW)) {
|
if (state.is(Blocks.SNOW)) {
|
||||||
int currentLayers = state.getValue(SnowLayerBlock.LAYERS);
|
int currentLayers = state.getValue(SnowLayerBlock.LAYERS);
|
||||||
if (currentLayers < Math.min(maxHeight, 8)) {
|
if (currentLayers < Math.min(maxHeight, 8)) {
|
||||||
@@ -109,7 +117,7 @@
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, topPos, Blocks.SNOW.defaultBlockState(), Block.UPDATE_ALL, null); // CraftBukkit
|
org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(this, topPos, Blocks.SNOW.defaultBlockState(), Block.UPDATE_ALL, null); // CraftBukkit
|
||||||
@@ -1096,7 +_,7 @@
|
@@ -1096,7 +1151,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
p -> p.is(PoiTypes.LIGHTNING_ROD),
|
p -> p.is(PoiTypes.LIGHTNING_ROD),
|
||||||
lightningRodPos -> lightningRodPos.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, lightningRodPos.getX(), lightningRodPos.getZ()) - 1,
|
lightningRodPos -> lightningRodPos.getY() == this.getHeight(Heightmap.Types.WORLD_SURFACE, lightningRodPos.getX(), lightningRodPos.getZ()) - 1,
|
||||||
center,
|
center,
|
||||||
@@ -118,7 +126,7 @@
|
|||||||
PoiManager.Occupancy.ANY
|
PoiManager.Occupancy.ANY
|
||||||
);
|
);
|
||||||
return nearbyLightningRod.map(blockPos -> blockPos.above(1));
|
return nearbyLightningRod.map(blockPos -> blockPos.above(1));
|
||||||
@@ -1144,8 +_,26 @@
|
@@ -1144,8 +1199,26 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
int percentage = this.getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
int percentage = this.getGameRules().get(GameRules.PLAYERS_SLEEPING_PERCENTAGE);
|
||||||
Component message;
|
Component message;
|
||||||
if (this.sleepStatus.areEnoughSleeping(percentage)) {
|
if (this.sleepStatus.areEnoughSleeping(percentage)) {
|
||||||
@@ -145,7 +153,7 @@
|
|||||||
message = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(percentage));
|
message = Component.translatable("sleep.players_sleeping", this.sleepStatus.amountSleeping(), this.sleepStatus.sleepersNeeded(percentage));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1311,6 +_,7 @@
|
@@ -1311,6 +1384,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
public void resetWeatherCycle() {
|
public void resetWeatherCycle() {
|
||||||
WeatherData weatherData = this.getWeatherData();
|
WeatherData weatherData = this.getWeatherData();
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
@@ -153,7 +161,7 @@
|
|||||||
weatherData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
|
weatherData.setRaining(false, org.bukkit.event.weather.WeatherChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
|
||||||
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
|
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
|
||||||
// Not that everyone ever manages to get the whole server to sleep at the same time....
|
// Not that everyone ever manages to get the whole server to sleep at the same time....
|
||||||
@@ -1318,6 +_,7 @@
|
@@ -1318,6 +1392,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
weatherData.setRainTime(0);
|
weatherData.setRainTime(0);
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -161,7 +169,7 @@
|
|||||||
weatherData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
|
weatherData.setThundering(false, org.bukkit.event.weather.ThunderChangeEvent.Cause.SLEEP); // Paper - Add cause to Weather/ThunderChangeEvents
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
|
// If we stop due to everyone sleeping we should reset the weather duration to some other random value.
|
||||||
@@ -1989,7 +_,7 @@
|
@@ -1989,7 +2064,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
Explosion.BlockInteraction blockInteraction = switch (interactionType) {
|
Explosion.BlockInteraction blockInteraction = switch (interactionType) {
|
||||||
case NONE -> Explosion.BlockInteraction.KEEP;
|
case NONE -> Explosion.BlockInteraction.KEEP;
|
||||||
case BLOCK -> this.getDestroyType(GameRules.BLOCK_EXPLOSION_DROP_DECAY);
|
case BLOCK -> this.getDestroyType(GameRules.BLOCK_EXPLOSION_DROP_DECAY);
|
||||||
@@ -170,7 +178,7 @@
|
|||||||
? this.getDestroyType(GameRules.MOB_EXPLOSION_DROP_DECAY)
|
? this.getDestroyType(GameRules.MOB_EXPLOSION_DROP_DECAY)
|
||||||
: Explosion.BlockInteraction.KEEP;
|
: Explosion.BlockInteraction.KEEP;
|
||||||
case TNT -> this.getDestroyType(GameRules.TNT_EXPLOSION_DROP_DECAY);
|
case TNT -> this.getDestroyType(GameRules.TNT_EXPLOSION_DROP_DECAY);
|
||||||
@@ -2914,7 +_,7 @@
|
@@ -2914,7 +2989,7 @@ public class ServerLevel extends Level implements WorldGenLevel, ServerEntityGet
|
||||||
// Spigot start
|
// Spigot start
|
||||||
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message
|
if (entity.getBukkitEntity() instanceof org.bukkit.inventory.InventoryHolder && (!(entity instanceof ServerPlayer) || entity.getRemovalReason() != Entity.RemovalReason.KILLED)) { // SPIGOT-6876: closeInventory clears death message
|
||||||
// Paper start - Fix merchant inventory not closing on entity removal
|
// Paper start - Fix merchant inventory not closing on entity removal
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/Entity.java b/net/minecraft/world/entity/Entity.java
|
||||||
|
index 3623fa8e923e3d417b073aed03f7be931285e3e5..a4a0683c0287da0543a5c869163c925f899b1550 100644
|
||||||
|
--- a/net/minecraft/world/entity/Entity.java
|
||||||
|
+++ b/net/minecraft/world/entity/Entity.java
|
||||||
|
@@ -168,6 +168,7 @@ public abstract class Entity
|
||||||
|
SlotProvider,
|
||||||
|
DebugValueSource,
|
||||||
|
TypedInstance<EntityType<?>>, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity { // Paper - rewrite chunk system // Paper - optimise entity tracker
|
||||||
|
+ public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur - Configurable entity base attributes
|
||||||
|
// CraftBukkit start
|
||||||
|
private static final int CURRENT_LEVEL = 2;
|
||||||
|
static boolean isLevelAtLeast(ValueInput input, int level) {
|
||||||
|
@@ -297,8 +298,9 @@ public abstract class Entity
|
||||||
|
public double xOld;
|
||||||
|
public double yOld;
|
||||||
|
public double zOld;
|
||||||
|
+ public float maxUpStep; // Purpur - Add option to set armorstand step height
|
||||||
|
public boolean noPhysics;
|
||||||
|
- public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random
|
||||||
|
+ public final RandomSource random; // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation
|
||||||
|
public int tickCount;
|
||||||
|
private int remainingFireTicks;
|
||||||
|
private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(Set.of(FluidTags.WATER, FluidTags.LAVA));
|
||||||
|
@@ -330,8 +332,8 @@ public abstract class Entity
|
||||||
|
public @Nullable PortalProcessor portalProcess;
|
||||||
|
public int portalCooldown;
|
||||||
|
private boolean invulnerable;
|
||||||
|
- protected UUID uuid = Mth.createInsecureUUID(this.random);
|
||||||
|
- protected String stringUUID = this.uuid.toString();
|
||||||
|
+ protected UUID uuid; // Purpur - Add toggle for RNG manipulation
|
||||||
|
+ protected String stringUUID; // Purpur - Add toggle for RNG manipulation
|
||||||
|
private boolean hasGlowingTag;
|
||||||
|
private final Set<String> tags = new io.papermc.paper.util.SizeLimitedSet<>(new it.unimi.dsi.fastutil.objects.ObjectOpenHashSet<>(), MAX_ENTITY_TAG_COUNT); // Paper - fully limit tag size - replace set impl
|
||||||
|
private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0};
|
||||||
|
@@ -382,6 +384,7 @@ public abstract class Entity
|
||||||
|
private final int despawnTime; // Paper - entity despawn time limit
|
||||||
|
public int totalEntityAge; // Paper - age-like counter for all entities
|
||||||
|
public final io.papermc.paper.entity.activation.ActivationType activationType = io.papermc.paper.entity.activation.ActivationType.activationTypeFor(this); // Paper - EAR 2/tracking ranges
|
||||||
|
+ public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API
|
||||||
|
// Paper start - EAR 2
|
||||||
|
public final boolean defaultActivationState;
|
||||||
|
public long activatedTick = Integer.MIN_VALUE;
|
||||||
|
@@ -549,10 +552,22 @@ public abstract class Entity
|
||||||
|
}
|
||||||
|
// Paper end - optimise entity tracker
|
||||||
|
|
||||||
|
+ // Purpur start - Add canSaveToDisk to Entity
|
||||||
|
+ public boolean canSaveToDisk() {
|
||||||
|
+ return true;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Add canSaveToDisk to Entity
|
||||||
|
+
|
||||||
|
public Entity(final EntityType<?> type, final Level level) {
|
||||||
|
this.type = type;
|
||||||
|
this.level = level;
|
||||||
|
this.dimensions = type.getDimensions();
|
||||||
|
+ this.maxAirTicks = level == null || this.getDefaultMaxAirSupply() != Entity.TOTAL_AIR_SUPPLY ? this.getDefaultMaxAirSupply() : this.level.purpurConfig.drowningAirTicks; // Purpur - Drowning Settings
|
||||||
|
+ // Purpur start - Add toggle for RNG manipulation
|
||||||
|
+ this.random = level == null || level.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create();
|
||||||
|
+ this.uuid = Mth.createInsecureUUID(this.random);
|
||||||
|
+ this.stringUUID = this.uuid.toString();
|
||||||
|
+ // Purpur end - Add toggle for RNG manipulation
|
||||||
|
this.position = Vec3.ZERO;
|
||||||
|
this.blockPosition = BlockPos.ZERO;
|
||||||
|
this.chunkPosition = ChunkPos.ZERO;
|
||||||
|
@@ -950,6 +965,7 @@ public abstract class Entity
|
||||||
|
&& this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
|
||||||
|
&& (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
|
||||||
|
// Paper end - Configurable nether ceiling damage
|
||||||
|
+ if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level.levelData.getRespawnData().pos(), this.level)); else // Purpur - Add option to teleport to spawn on nether ceiling damage
|
||||||
|
this.onBelowWorld();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -2007,7 +2023,7 @@ public abstract class Entity
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean fireImmune() {
|
||||||
|
- return this.getType().fireImmune();
|
||||||
|
+ return this.immuneToFire != null ? immuneToFire : this.getType().fireImmune(); // Purpur - add fire immune API
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean causeFallDamage(final double fallDistance, final float damageModifier, final DamageSource damageSource) {
|
||||||
|
@@ -2593,7 +2609,7 @@ public abstract class Entity
|
||||||
|
output.putBoolean("Bukkit.invisible", this.persistentInvisibility);
|
||||||
|
}
|
||||||
|
// SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
|
||||||
|
- if (this.maxAirTicks != this.getDefaultMaxAirSupply()) {
|
||||||
|
+ if (this.maxAirTicks != this.getDefaultMaxAirSupply() && this.getDefaultMaxAirSupply() != this.level().purpurConfig.drowningAirTicks) { // Purpur - Drowning Settings
|
||||||
|
output.putInt("Bukkit.MaxAirSupply", this.getMaxAirSupply());
|
||||||
|
}
|
||||||
|
output.putInt("Spigot.ticksLived", this.totalEntityAge); // Paper
|
||||||
|
@@ -2679,6 +2695,11 @@ public abstract class Entity
|
||||||
|
output.putBoolean("Paper.FreezeLock", true);
|
||||||
|
}
|
||||||
|
// Paper end
|
||||||
|
+ // Purpur start - Fire immune API
|
||||||
|
+ if (immuneToFire != null) {
|
||||||
|
+ output.putBoolean("Purpur.FireImmune", immuneToFire);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Fire immune API
|
||||||
|
} catch (Throwable t) {
|
||||||
|
CrashReport report = CrashReport.forThrowable(t, "Saving entity NBT");
|
||||||
|
CrashReportCategory category = report.addCategory("Entity being saved");
|
||||||
|
@@ -2802,6 +2823,9 @@ public abstract class Entity
|
||||||
|
}
|
||||||
|
freezeLocked = input.getBooleanOr("Paper.FreezeLock", false);
|
||||||
|
// Paper end
|
||||||
|
+
|
||||||
|
+ immuneToFire = input.read("Purpur.FireImmune", com.mojang.serialization.Codec.BOOL).orElse(null); // Purpur - Fire immune API
|
||||||
|
+
|
||||||
|
} catch (Throwable t) {
|
||||||
|
CrashReport report = CrashReport.forThrowable(t, "Loading entity NBT");
|
||||||
|
CrashReportCategory category = report.addCategory("Entity being loaded");
|
||||||
|
@@ -3067,6 +3091,7 @@ public abstract class Entity
|
||||||
|
if (this.isAlive() && this instanceof Leashable leashable) {
|
||||||
|
if (leashable.getLeashHolder() == player) {
|
||||||
|
if (!this.level().isClientSide()) {
|
||||||
|
+ if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.villager.AbstractVillager) return InteractionResult.CONSUME; // Purpur - Allow leashing villagers
|
||||||
|
// Paper start - EntityUnleashEvent
|
||||||
|
if (!org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerUnleashEntityEvent(
|
||||||
|
leashable, player, hand, !player.hasInfiniteMaterials(), true
|
||||||
|
@@ -3500,15 +3525,18 @@ public abstract class Entity
|
||||||
|
return Vec3.directionFromRotation(this.getRotationVector());
|
||||||
|
}
|
||||||
|
|
||||||
|
+ public BlockPos portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals
|
||||||
|
public void setAsInsidePortal(final Portal portal, final BlockPos pos) {
|
||||||
|
if (this.isOnPortalCooldown()) {
|
||||||
|
+ if (!(level().purpurConfig.playerFixStuckPortal && this instanceof Player && !pos.equals(this.portalPos))) // Purpur - Fix stuck in portals
|
||||||
|
this.setPortalCooldown();
|
||||||
|
- } else {
|
||||||
|
+ } else if (this.level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur - Entities can use portals
|
||||||
|
if (this.portalProcess == null || !this.portalProcess.isSamePortal(portal)) {
|
||||||
|
this.portalProcess = new PortalProcessor(portal, pos.immutable());
|
||||||
|
} else if (!this.portalProcess.isInsidePortalThisTick()) {
|
||||||
|
this.portalProcess.updateEntryPosition(pos.immutable());
|
||||||
|
this.portalProcess.setAsInsidePortalThisTick(true);
|
||||||
|
+ this.portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -4238,7 +4266,7 @@ public abstract class Entity
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canUsePortal(final boolean ignorePassenger) {
|
||||||
|
- return (ignorePassenger || !this.isPassenger()) && this.isAlive();
|
||||||
|
+ return (ignorePassenger || !this.isPassenger()) && this.isAlive() && (this.level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Purpur - Entities can use portals
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean canTeleport(final Level from, final Level to) {
|
||||||
|
@@ -4788,6 +4816,12 @@ public abstract class Entity
|
||||||
|
return Mth.lerp(partial, this.yRotO, this.yRot);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Stop squids floating on top of water
|
||||||
|
+ public AABB getAxisForFluidCheck() {
|
||||||
|
+ return this.getBoundingBox().deflate(0.001D);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Stop squids floating on top of water
|
||||||
|
+
|
||||||
|
public boolean touchingUnloadedChunk() {
|
||||||
|
AABB box = this.getBoundingBox().inflate(1.0);
|
||||||
|
int x0 = Mth.floor(box.minX);
|
||||||
|
@@ -5091,7 +5125,7 @@ public abstract class Entity
|
||||||
|
}
|
||||||
|
|
||||||
|
public float maxUpStep() {
|
||||||
|
- return 0.0F;
|
||||||
|
+ return maxUpStep; // Purpur - Add option to set armorstand step height
|
||||||
|
}
|
||||||
|
|
||||||
|
public void onExplosionHit(final @Nullable Entity explosionCausedBy) {
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/EntityType.java b/net/minecraft/world/entity/EntityType.java
|
||||||
|
index 0840d69c9e80a2df01737a2980f0b5d6a6ca7691..c2d4f6a164a18c8809d143793921567907363a17 100644
|
||||||
|
--- a/net/minecraft/world/entity/EntityType.java
|
||||||
|
+++ b/net/minecraft/world/entity/EntityType.java
|
||||||
|
@@ -1238,6 +1238,16 @@ public class EntityType<T extends Entity> implements EntityTypeTest<Entity, T>,
|
||||||
|
return register(vanillaEntityId(vanillaId), builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - PlayerSetSpawnerTypeWithEggEvent
|
||||||
|
+ public static EntityType<?> getFromBukkitType(org.bukkit.entity.EntityType bukkitType) {
|
||||||
|
+ return getFromKey(Identifier.parse(bukkitType.getKey().toString()));
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public static EntityType<?> getFromKey(Identifier location) {
|
||||||
|
+ return BuiltInRegistries.ENTITY_TYPE.getValue(location);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - PlayerSetSpawnerTypeWithEggEvent
|
||||||
|
+
|
||||||
|
public static Identifier getKey(final EntityType<?> type) {
|
||||||
|
return BuiltInRegistries.ENTITY_TYPE.getKey(type);
|
||||||
|
}
|
||||||
|
@@ -1495,6 +1505,16 @@ public class EntityType<T extends Entity> implements EntityTypeTest<Entity, T>,
|
||||||
|
return this.category;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - PlayerSetSpawnerTypeWithEggEvent
|
||||||
|
+ public String getName() {
|
||||||
|
+ return BuiltInRegistries.ENTITY_TYPE.getKey(this).getPath();
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ public String getTranslatedName() {
|
||||||
|
+ return getDescription().getString();
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - PlayerSetSpawnerTypeWithEggEvent
|
||||||
|
+
|
||||||
|
public String getDescriptionId() {
|
||||||
|
return this.descriptionId;
|
||||||
|
}
|
||||||
|
@@ -1556,6 +1576,7 @@ public class EntityType<T extends Entity> implements EntityTypeTest<Entity, T>,
|
||||||
|
// Paper start - Add logging for debugging entity tags with invalid ids
|
||||||
|
() -> {
|
||||||
|
LOGGER.warn("Skipping Entity with id {}", input.getStringOr("id", "[invalid]"));
|
||||||
|
+ LOGGER.warn("Location: {} {}", level.getWorld().getName(), input.read("Pos", net.minecraft.world.phys.Vec3.CODEC).orElse(net.minecraft.world.phys.Vec3.ZERO)); // Purpur - log skipped entity's position
|
||||||
|
if ((DEBUG_ENTITIES_WITH_INVALID_IDS || level.getCraftServer().getServer().isDebugging()) && input instanceof TagValueInput tagInput) {
|
||||||
|
LOGGER.warn("Skipped entity tag: {}", tagInput.input);
|
||||||
|
}
|
||||||
@@ -0,0 +1,184 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/LivingEntity.java b/net/minecraft/world/entity/LivingEntity.java
|
||||||
|
index 4bb708ef6601ee0512974b23fd98acc4e6bf81bb..93191aa5a24f9390d0d8c7c384c700dbe18d0212 100644
|
||||||
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
||||||
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
||||||
|
@@ -441,6 +441,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
if (dist < 0.0) {
|
||||||
|
double damagePerBlock = level.getWorldBorder().getDamagePerBlock();
|
||||||
|
if (damagePerBlock > 0.0) {
|
||||||
|
+ // Purpur start - Add option to teleport to spawn if outside world border
|
||||||
|
+ if (this.level().purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer serverPlayer) {
|
||||||
|
+ serverPlayer.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level().levelData.getRespawnData().pos(), this.level()));
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Add option to teleport to spawn if outside world border
|
||||||
|
this.hurtServer(level, this.damageSources().outOfBorder(), Math.max(1, Mth.floor(-dist * damagePerBlock)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -456,7 +462,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
if (this.shouldTakeDrowningDamage()) {
|
||||||
|
this.setAirSupply(0);
|
||||||
|
level.broadcastEntityEvent(this, EntityEvent.DROWN_PARTICLES);
|
||||||
|
- this.hurtServer(level, this.damageSources().drown(), 2.0F);
|
||||||
|
+ this.hurtServer(level, this.damageSources().drown(), (float) this.level().purpurConfig.damageFromDrowning); // Purpur - Drowning Settings
|
||||||
|
}
|
||||||
|
} else if (this.getAirSupply() < this.getMaxAirSupply() && MobEffectUtil.shouldEffectsRefillAirsupply(this)) {
|
||||||
|
this.setAirSupply(this.increaseAirSupply(this.getAirSupply()));
|
||||||
|
@@ -516,7 +522,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean shouldTakeDrowningDamage() {
|
||||||
|
- return this.getAirSupply() <= -20;
|
||||||
|
+ return this.getAirSupply() <= -this.level().purpurConfig.drowningDamageInterval; // Purpur - Drowning Settings
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@@ -1048,16 +1054,34 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
}
|
||||||
|
|
||||||
|
if (targetingEntity != null) {
|
||||||
|
- ItemStack itemStack = this.getItemBySlot(EquipmentSlot.HEAD);
|
||||||
|
- if (targetingEntity.is(EntityType.SKELETON) && itemStack.is(Items.SKELETON_SKULL)
|
||||||
|
- || targetingEntity.is(EntityType.ZOMBIE) && itemStack.is(Items.ZOMBIE_HEAD)
|
||||||
|
- || targetingEntity.is(EntityType.PIGLIN) && itemStack.is(Items.PIGLIN_HEAD)
|
||||||
|
- || targetingEntity.is(EntityType.PIGLIN_BRUTE) && itemStack.is(Items.PIGLIN_HEAD)
|
||||||
|
- || targetingEntity.is(EntityType.CREEPER) && itemStack.is(Items.CREEPER_HEAD)) {
|
||||||
|
- visibilityPercent *= 0.5;
|
||||||
|
+ ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
|
||||||
|
+ // Purpur start - Mob head visibility percent
|
||||||
|
+ if (targetingEntity.is(EntityType.SKELETON) && itemBySlot.is(Items.SKELETON_SKULL)) {
|
||||||
|
+ visibilityPercent *= targetingEntity.level().purpurConfig.skeletonHeadVisibilityPercent;
|
||||||
|
+ }
|
||||||
|
+ else if (targetingEntity.is(EntityType.ZOMBIE) && itemBySlot.is(Items.ZOMBIE_HEAD)) {
|
||||||
|
+ visibilityPercent *= targetingEntity.level().purpurConfig.zombieHeadVisibilityPercent;
|
||||||
|
}
|
||||||
|
+ else if ((targetingEntity.is(EntityType.PIGLIN) || targetingEntity.is(EntityType.PIGLIN_BRUTE)) && itemBySlot.is(Items.PIGLIN_HEAD)) {
|
||||||
|
+ visibilityPercent *= targetingEntity.level().purpurConfig.piglinHeadVisibilityPercent;
|
||||||
|
+ }
|
||||||
|
+ else if (targetingEntity.is(EntityType.CREEPER) && itemBySlot.is(Items.CREEPER_HEAD)) {
|
||||||
|
+ visibilityPercent *= targetingEntity.level().purpurConfig.creeperHeadVisibilityPercent;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Mob head visibility percent
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Configurable mob blindness
|
||||||
|
+ if (targetingEntity instanceof LivingEntity entityliving) {
|
||||||
|
+ if (entityliving.hasEffect(MobEffects.BLINDNESS)) {
|
||||||
|
+ int amplifier = entityliving.getEffect(MobEffects.BLINDNESS).getAmplifier();
|
||||||
|
+ for (int i = 0; i < amplifier; i++) {
|
||||||
|
+ amplifier *= this.level().purpurConfig.mobsBlindnessMultiplier;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Configurable mob blindness
|
||||||
|
+
|
||||||
|
return visibilityPercent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1106,6 +1130,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
Iterator<MobEffectInstance> iterator = this.activeEffects.values().iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
MobEffectInstance effect = iterator.next();
|
||||||
|
+ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().value().isBeneficial()) continue; // Purpur - Milk Keeps Beneficial Effects
|
||||||
|
EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
continue;
|
||||||
|
@@ -1438,7 +1463,23 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
this.stopSleeping();
|
||||||
|
}
|
||||||
|
|
||||||
|
- this.noActionTime = 0;
|
||||||
|
+ // Purpur start - One Punch Man!
|
||||||
|
+ if (source.getEntity() instanceof net.minecraft.world.entity.player.Player player && source.getEntity().level().purpurConfig.creativeOnePunch && !source.is(DamageTypeTags.IS_PROJECTILE)) {
|
||||||
|
+ if (player.isCreative()) {
|
||||||
|
+ org.apache.commons.lang3.mutable.MutableDouble attackDamage = new org.apache.commons.lang3.mutable.MutableDouble();
|
||||||
|
+ player.getMainHandItem().forEachModifier(EquipmentSlot.MAINHAND, (attributeHolder, attributeModifier) -> {
|
||||||
|
+ if (attributeModifier.operation() == AttributeModifier.Operation.ADD_VALUE) {
|
||||||
|
+ attackDamage.addAndGet(attributeModifier.amount());
|
||||||
|
+ }
|
||||||
|
+ });
|
||||||
|
+
|
||||||
|
+ if (attackDamage.doubleValue() == 0.0D) {
|
||||||
|
+ // One punch!
|
||||||
|
+ damage = this.getHealth();
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - One Punch Man!this.noActionTime = 0;
|
||||||
|
if (damage < 0.0F) {
|
||||||
|
damage = 0.0F;
|
||||||
|
}
|
||||||
|
@@ -1699,10 +1740,10 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
protected @Nullable Player resolvePlayerResponsibleForDamage(final DamageSource source) {
|
||||||
|
Entity sourceEntity = source.getEntity();
|
||||||
|
if (sourceEntity instanceof Player playerSource) {
|
||||||
|
- this.setLastHurtByPlayer(playerSource, 100);
|
||||||
|
+ this.setLastHurtByPlayer(playerSource, this.level().purpurConfig.mobLastHurtByPlayerTime); // Purpur - Config for mob last hurt by player time
|
||||||
|
} else if (sourceEntity instanceof Wolf wolf && wolf.isTame()) {
|
||||||
|
if (wolf.getOwnerReference() != null) {
|
||||||
|
- this.setLastHurtByPlayer(wolf.getOwnerReference().getUUID(), 100);
|
||||||
|
+ this.setLastHurtByPlayer(wolf.getOwnerReference().getUUID(), this.level().purpurConfig.mobLastHurtByPlayerTime); // Purpur - Config for mob last hurt by player time
|
||||||
|
} else {
|
||||||
|
this.lastHurtByPlayer = null;
|
||||||
|
this.lastHurtByPlayerMemoryTime = 0;
|
||||||
|
@@ -1754,6 +1795,17 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Totems work in inventory
|
||||||
|
+ if (level().purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemStack == null || itemStack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) {
|
||||||
|
+ for (ItemStack item : player.getInventory().getNonEquipmentItems()) {
|
||||||
|
+ if (item.getItem() == Items.TOTEM_OF_UNDYING) {
|
||||||
|
+ itemStack = item;
|
||||||
|
+ protectionItem = item.copy();
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Totems work in inventory
|
||||||
|
final org.bukkit.inventory.EquipmentSlot handSlot = (usedHand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(usedHand) : null;
|
||||||
|
final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot);
|
||||||
|
event.setCancelled(protectionItem == null);
|
||||||
|
@@ -1927,6 +1979,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
boolean playerKilled = this.lastHurtByPlayerMemoryTime > 0;
|
||||||
|
this.dropEquipment(level); // CraftBukkit - from below
|
||||||
|
if (this.shouldDropLoot(level)) {
|
||||||
|
+ if (!(source.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level().purpurConfig.disableDropsOnCrammingDeath)) { // Purpur - Disable loot drops on death by cramming
|
||||||
|
this.dropFromLootTable(level, source, playerKilled);
|
||||||
|
// Paper start
|
||||||
|
final boolean prev = this.clearEquipmentSlots;
|
||||||
|
@@ -1935,6 +1988,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
// Paper end
|
||||||
|
this.dropCustomDeathLoot(level, source, playerKilled);
|
||||||
|
this.clearEquipmentSlots = prev; // Paper
|
||||||
|
+ } // Purpur - Disable loot drops on death by cramming
|
||||||
|
}
|
||||||
|
|
||||||
|
// CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment
|
||||||
|
@@ -3264,6 +3318,7 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
float dmg = (float)(diff * 10.0 - 3.0);
|
||||||
|
if (dmg > 0.0F) {
|
||||||
|
this.playSound(this.getFallDamageSound((int)dmg), 1.0F, 1.0F);
|
||||||
|
+ if (level().purpurConfig.elytraKineticDamage) // Purpur - Toggle for kinetic damage
|
||||||
|
this.hurt(this.damageSources().flyIntoWall(), dmg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@@ -4750,6 +4805,12 @@ public abstract class LivingEntity extends Entity implements Attackable, Waypoin
|
||||||
|
: slot == equippable.slot() && this.canUseSlot(equippable.slot()) && equippable.canBeEquippedBy(this.typeHolder());
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Dispenser curse of binding protection
|
||||||
|
+ public @Nullable EquipmentSlot getEquipmentSlotForDispenserItem(ItemStack itemstack) {
|
||||||
|
+ return EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.BINDING_CURSE, itemstack) > 0 ? null : this.getEquipmentSlotForItem(itemstack);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Dispenser curse of binding protection
|
||||||
|
+
|
||||||
|
private static SlotAccess createEquipmentSlotAccess(final LivingEntity entity, final EquipmentSlot equipmentSlot) {
|
||||||
|
return equipmentSlot != EquipmentSlot.HEAD && equipmentSlot != EquipmentSlot.MAINHAND && equipmentSlot != EquipmentSlot.OFFHAND
|
||||||
|
? SlotAccess.forEquipmentSlot(entity, equipmentSlot, stack -> stack.isEmpty() || entity.getEquipmentSlotForItem(stack) == equipmentSlot)
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||||
|
index 2940dbc31a20eb49e24418ec84b73f2bfbdcfc32..812cd00f750197f9bdde6f2295c27172ae463414 100644
|
||||||
--- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
--- a/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||||
+++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
+++ b/net/minecraft/world/entity/ai/behavior/AcquirePoi.java
|
||||||
@@ -96,7 +_,7 @@
|
@@ -96,7 +96,7 @@ public class AcquirePoi {
|
||||||
};
|
};
|
||||||
// Paper start - optimise POI searches
|
// Paper start - optimise POI searches
|
||||||
java.util.List<Pair<Holder<PoiType>, BlockPos>> poiPositionsRaw = new java.util.ArrayList<>();
|
java.util.List<Pair<Holder<PoiType>, BlockPos>> poiPositionsRaw = new java.util.ArrayList<>();
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/animal/bee/Bee.java b/net/minecraft/world/entity/animal/bee/Bee.java
|
||||||
|
index 899481ad0108bd06fb09727bf59827a7227e0c80..28cf7f1b7b947639a686b83a5a7d617af9b83e15 100644
|
||||||
--- a/net/minecraft/world/entity/animal/bee/Bee.java
|
--- a/net/minecraft/world/entity/animal/bee/Bee.java
|
||||||
+++ b/net/minecraft/world/entity/animal/bee/Bee.java
|
+++ b/net/minecraft/world/entity/animal/bee/Bee.java
|
||||||
@@ -171,7 +_,7 @@
|
@@ -171,7 +171,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
// Paper end - Fix MC-167279
|
// Paper end - Fix MC-167279
|
||||||
this.lookControl = new Bee.BeeLookControl(this);
|
this.lookControl = new Bee.BeeLookControl(this);
|
||||||
this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, -1.0F);
|
this.setPathfindingMalus(PathType.FIRE_IN_NEIGHBOR, -1.0F);
|
||||||
@@ -9,7 +17,7 @@
|
|||||||
this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F);
|
this.setPathfindingMalus(PathType.WATER_BORDER, 16.0F);
|
||||||
this.setPathfindingMalus(PathType.COCOA, -1.0F);
|
this.setPathfindingMalus(PathType.COCOA, -1.0F);
|
||||||
this.setPathfindingMalus(PathType.FENCE, -1.0F);
|
this.setPathfindingMalus(PathType.FENCE, -1.0F);
|
||||||
@@ -362,13 +_,19 @@
|
@@ -362,13 +362,19 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
if (this.stayOutOfHiveCountdown <= 0 && !this.beePollinateGoal.isPollinating() && !this.hasStung() && this.getTarget() == null) {
|
if (this.stayOutOfHiveCountdown <= 0 && !this.beePollinateGoal.isPollinating() && !this.hasStung() && this.getTarget() == null) {
|
||||||
boolean wantsToEnterHive = this.hasNectar()
|
boolean wantsToEnterHive = this.hasNectar()
|
||||||
|| this.isTiredOfLookingForNectar()
|
|| this.isTiredOfLookingForNectar()
|
||||||
@@ -30,7 +38,7 @@
|
|||||||
public void setStayOutOfHiveCountdown(final int ticks) {
|
public void setStayOutOfHiveCountdown(final int ticks) {
|
||||||
this.stayOutOfHiveCountdown = ticks;
|
this.stayOutOfHiveCountdown = ticks;
|
||||||
}
|
}
|
||||||
@@ -389,7 +_,7 @@
|
@@ -389,7 +395,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
@Override
|
@Override
|
||||||
protected void customServerAiStep(final ServerLevel level) {
|
protected void customServerAiStep(final ServerLevel level) {
|
||||||
boolean hasStung = this.hasStung();
|
boolean hasStung = this.hasStung();
|
||||||
@@ -39,7 +47,7 @@
|
|||||||
this.underWaterTicks++;
|
this.underWaterTicks++;
|
||||||
} else {
|
} else {
|
||||||
this.underWaterTicks = 0;
|
this.underWaterTicks = 0;
|
||||||
@@ -399,6 +_,7 @@
|
@@ -399,6 +405,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
this.hurtServer(level, this.damageSources().drown(), 1.0F);
|
this.hurtServer(level, this.damageSources().drown(), 1.0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +55,7 @@
|
|||||||
if (hasStung) {
|
if (hasStung) {
|
||||||
this.timeSinceSting++;
|
this.timeSinceSting++;
|
||||||
if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) {
|
if (this.timeSinceSting % 5 == 0 && this.random.nextInt(Mth.clamp(1200 - this.timeSinceSting, 1, 1200)) == 0) {
|
||||||
@@ -1132,6 +_,7 @@
|
@@ -1132,6 +1139,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
Bee.this.savedFlowerPos = nearbyPos.get();
|
Bee.this.savedFlowerPos = nearbyPos.get();
|
||||||
Bee.this.navigation
|
Bee.this.navigation
|
||||||
.moveTo(Bee.this.savedFlowerPos.getX() + 0.5, Bee.this.savedFlowerPos.getY() + 0.5, Bee.this.savedFlowerPos.getZ() + 0.5, 1.2F);
|
.moveTo(Bee.this.savedFlowerPos.getX() + 0.5, Bee.this.savedFlowerPos.getY() + 0.5, Bee.this.savedFlowerPos.getZ() + 0.5, 1.2F);
|
||||||
@@ -55,7 +63,7 @@
|
|||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60);
|
Bee.this.remainingCooldownBeforeLocatingNewFlower = Mth.nextInt(Bee.this.random, 20, 60);
|
||||||
@@ -1178,6 +_,7 @@
|
@@ -1178,6 +1186,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
this.pollinating = false;
|
this.pollinating = false;
|
||||||
Bee.this.navigation.stop();
|
Bee.this.navigation.stop();
|
||||||
Bee.this.remainingCooldownBeforeLocatingNewFlower = 200;
|
Bee.this.remainingCooldownBeforeLocatingNewFlower = 200;
|
||||||
@@ -63,7 +71,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1224,6 +_,7 @@
|
@@ -1224,6 +1233,7 @@ public class Bee extends Animal implements FlyingAnimal, NeutralMob {
|
||||||
this.setWantedPos();
|
this.setWantedPos();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/animal/squid/Squid.java b/net/minecraft/world/entity/animal/squid/Squid.java
|
||||||
|
index 637cdcf459aaf78dc381d8a990b0e2c571c06de8..45e170bbcc72206ed0018440c435359084749a7f 100644
|
||||||
--- a/net/minecraft/world/entity/animal/squid/Squid.java
|
--- a/net/minecraft/world/entity/animal/squid/Squid.java
|
||||||
+++ b/net/minecraft/world/entity/animal/squid/Squid.java
|
+++ b/net/minecraft/world/entity/animal/squid/Squid.java
|
||||||
@@ -51,10 +_,29 @@
|
@@ -51,10 +51,29 @@ public class Squid extends AgeableWaterCreature {
|
||||||
|
|
||||||
public Squid(final EntityType<? extends Squid> type, final Level level) {
|
public Squid(final EntityType<? extends Squid> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -31,7 +39,7 @@
|
|||||||
@Override
|
@Override
|
||||||
protected void registerGoals() {
|
protected void registerGoals() {
|
||||||
this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this));
|
this.goalSelector.addGoal(0, new Squid.SquidRandomMovementGoal(this));
|
||||||
@@ -131,6 +_,7 @@
|
@@ -131,6 +150,7 @@ public class Squid extends AgeableWaterCreature {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.isInWater()) {
|
if (this.isInWater()) {
|
||||||
@@ -39,7 +47,7 @@
|
|||||||
if (this.tentacleMovement < Mth.PI) {
|
if (this.tentacleMovement < Mth.PI) {
|
||||||
float tentacleScale = this.tentacleMovement / Mth.PI;
|
float tentacleScale = this.tentacleMovement / Mth.PI;
|
||||||
this.tentacleAngle = Mth.sin(tentacleScale * tentacleScale * Mth.PI) * Mth.PI * 0.25F;
|
this.tentacleAngle = Mth.sin(tentacleScale * tentacleScale * Mth.PI) * Mth.PI * 0.25F;
|
||||||
@@ -316,7 +_,7 @@
|
@@ -316,7 +336,7 @@ public class Squid extends AgeableWaterCreature {
|
||||||
int noActionTime = this.squid.getNoActionTime();
|
int noActionTime = this.squid.getNoActionTime();
|
||||||
if (noActionTime > 100) {
|
if (noActionTime > 100) {
|
||||||
this.squid.movementVector = Vec3.ZERO;
|
this.squid.movementVector = Vec3.ZERO;
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/animal/wolf/Wolf.java b/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||||
|
index a2e1cfc50356142e08134df9123139f2025cb414..3519e9289f79d89bcaa3ad51fe07657018aa607f 100644
|
||||||
--- a/net/minecraft/world/entity/animal/wolf/Wolf.java
|
--- a/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||||
+++ b/net/minecraft/world/entity/animal/wolf/Wolf.java
|
+++ b/net/minecraft/world/entity/animal/wolf/Wolf.java
|
||||||
@@ -96,6 +_,37 @@
|
@@ -96,6 +96,37 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
public static final TargetingConditions.Selector PREY_SELECTOR = (target, level) -> target.is(EntityType.SHEEP)
|
public static final TargetingConditions.Selector PREY_SELECTOR = (target, level) -> target.is(EntityType.SHEEP)
|
||||||
|| target.is(EntityType.RABBIT)
|
|| target.is(EntityType.RABBIT)
|
||||||
|| target.is(EntityType.FOX);
|
|| target.is(EntityType.FOX);
|
||||||
@@ -38,7 +46,7 @@
|
|||||||
private static final float START_HEALTH = 8.0F;
|
private static final float START_HEALTH = 8.0F;
|
||||||
private static final float TAME_HEALTH = 40.0F;
|
private static final float TAME_HEALTH = 40.0F;
|
||||||
private static final float ARMOR_REPAIR_UNIT = 0.125F;
|
private static final float ARMOR_REPAIR_UNIT = 0.125F;
|
||||||
@@ -117,12 +_,47 @@
|
@@ -117,12 +148,47 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
this.setPathfindingMalus(PathType.ON_TOP_OF_POWDER_SNOW, -1.0F);
|
this.setPathfindingMalus(PathType.ON_TOP_OF_POWDER_SNOW, -1.0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +94,7 @@
|
|||||||
this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F));
|
this.goalSelector.addGoal(4, new LeapAtTargetGoal(this, 0.4F));
|
||||||
this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0, true));
|
this.goalSelector.addGoal(5, new MeleeAttackGoal(this, 1.0, true));
|
||||||
this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0, 10.0F, 2.0F));
|
this.goalSelector.addGoal(6, new FollowOwnerGoal(this, 1.0, 10.0F, 2.0F));
|
||||||
@@ -135,7 +_,7 @@
|
@@ -135,7 +201,7 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this));
|
this.targetSelector.addGoal(2, new OwnerHurtTargetGoal(this));
|
||||||
this.targetSelector.addGoal(3, new HurtByTargetGoal(this).setAlertOthers());
|
this.targetSelector.addGoal(3, new HurtByTargetGoal(this).setAlertOthers());
|
||||||
this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt));
|
this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, Player.class, 10, true, false, this::isAngryAt));
|
||||||
@@ -95,7 +103,7 @@
|
|||||||
this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR));
|
this.targetSelector.addGoal(6, new NonTameRandomTargetGoal<>(this, Turtle.class, false, Turtle.BABY_ON_LAND_SELECTOR));
|
||||||
this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, AbstractSkeleton.class, false));
|
this.targetSelector.addGoal(7, new NearestAttackableTargetGoal<>(this, AbstractSkeleton.class, false));
|
||||||
this.targetSelector.addGoal(8, new ResetUniversalAngerTargetGoal<>(this, true));
|
this.targetSelector.addGoal(8, new ResetUniversalAngerTargetGoal<>(this, true));
|
||||||
@@ -230,6 +_,7 @@
|
@@ -230,6 +296,7 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
protected void addAdditionalSaveData(final ValueOutput output) {
|
protected void addAdditionalSaveData(final ValueOutput output) {
|
||||||
super.addAdditionalSaveData(output);
|
super.addAdditionalSaveData(output);
|
||||||
output.store("CollarColor", DyeColor.LEGACY_ID_CODEC, this.getCollarColor());
|
output.store("CollarColor", DyeColor.LEGACY_ID_CODEC, this.getCollarColor());
|
||||||
@@ -103,7 +111,7 @@
|
|||||||
VariantUtils.writeVariant(output, this.getVariant());
|
VariantUtils.writeVariant(output, this.getVariant());
|
||||||
this.addPersistentAngerSaveData(output);
|
this.addPersistentAngerSaveData(output);
|
||||||
this.getSoundVariant()
|
this.getSoundVariant()
|
||||||
@@ -244,6 +_,10 @@
|
@@ -244,6 +311,10 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
super.readAdditionalSaveData(input);
|
super.readAdditionalSaveData(input);
|
||||||
VariantUtils.readVariant(input, Registries.WOLF_VARIANT).ifPresent(this::setVariant);
|
VariantUtils.readVariant(input, Registries.WOLF_VARIANT).ifPresent(this::setVariant);
|
||||||
this.setCollarColor(input.read("CollarColor", DyeColor.LEGACY_ID_CODEC).orElse(DEFAULT_COLLAR_COLOR));
|
this.setCollarColor(input.read("CollarColor", DyeColor.LEGACY_ID_CODEC).orElse(DEFAULT_COLLAR_COLOR));
|
||||||
@@ -114,7 +122,7 @@
|
|||||||
this.readPersistentAngerSaveData(this.level(), input);
|
this.readPersistentAngerSaveData(this.level(), input);
|
||||||
input.read("sound_variant", ResourceKey.codec(Registries.WOLF_SOUND_VARIANT))
|
input.read("sound_variant", ResourceKey.codec(Registries.WOLF_SOUND_VARIANT))
|
||||||
.flatMap(soundVariant -> this.registryAccess().lookupOrThrow(Registries.WOLF_SOUND_VARIANT).get((ResourceKey<WolfSoundVariant>)soundVariant))
|
.flatMap(soundVariant -> this.registryAccess().lookupOrThrow(Registries.WOLF_SOUND_VARIANT).get((ResourceKey<WolfSoundVariant>)soundVariant))
|
||||||
@@ -267,6 +_,10 @@
|
@@ -267,6 +338,10 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setSoundVariant(WolfSoundVariants.pickRandomSoundVariant(this.registryAccess(), level.getRandom()));
|
this.setSoundVariant(WolfSoundVariants.pickRandomSoundVariant(this.registryAccess(), level.getRandom()));
|
||||||
@@ -125,7 +133,7 @@
|
|||||||
return super.finalizeSpawn(level, difficulty, spawnReason, groupData);
|
return super.finalizeSpawn(level, difficulty, spawnReason, groupData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,6 +_,11 @@
|
@@ -315,6 +390,11 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
public void tick() {
|
public void tick() {
|
||||||
super.tick();
|
super.tick();
|
||||||
if (this.isAlive()) {
|
if (this.isAlive()) {
|
||||||
@@ -137,7 +145,7 @@
|
|||||||
this.interestedAngleO = this.interestedAngle;
|
this.interestedAngleO = this.interestedAngle;
|
||||||
if (this.isInterested()) {
|
if (this.isInterested()) {
|
||||||
this.interestedAngle = this.interestedAngle + (1.0F - this.interestedAngle) * 0.4F;
|
this.interestedAngle = this.interestedAngle + (1.0F - this.interestedAngle) * 0.4F;
|
||||||
@@ -516,13 +_,27 @@
|
@@ -516,13 +596,27 @@ public class Wolf extends TamableAnimal implements NeutralMob {
|
||||||
itemStack.consume(1, player);
|
itemStack.consume(1, player);
|
||||||
this.tryToTame(player);
|
this.tryToTame(player);
|
||||||
return InteractionResult.SUCCESS_SERVER;
|
return InteractionResult.SUCCESS_SERVER;
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/monster/MagmaCube.java b/net/minecraft/world/entity/monster/MagmaCube.java
|
||||||
|
index eed2e3f9f46f5950615b201706e9fecfae903e0f..f6021d3e41bcf7c65c708f9937bafafecea34ce3 100644
|
||||||
--- a/net/minecraft/world/entity/monster/MagmaCube.java
|
--- a/net/minecraft/world/entity/monster/MagmaCube.java
|
||||||
+++ b/net/minecraft/world/entity/monster/MagmaCube.java
|
+++ b/net/minecraft/world/entity/monster/MagmaCube.java
|
||||||
@@ -31,6 +_,11 @@
|
@@ -31,6 +31,11 @@ public class MagmaCube extends Slime {
|
||||||
public static boolean checkMagmaCubeSpawnRules(
|
public static boolean checkMagmaCubeSpawnRules(
|
||||||
final EntityType<MagmaCube> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
final EntityType<MagmaCube> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
||||||
) {
|
) {
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/monster/Monster.java b/net/minecraft/world/entity/monster/Monster.java
|
||||||
|
index c55b51ed7ed27cc658170d5c35c81a818b8867f2..0ce15ca820010f2dd44488e60ac06517968884bb 100644
|
||||||
--- a/net/minecraft/world/entity/monster/Monster.java
|
--- a/net/minecraft/world/entity/monster/Monster.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Monster.java
|
+++ b/net/minecraft/world/entity/monster/Monster.java
|
||||||
@@ -84,6 +_,11 @@
|
@@ -84,6 +84,11 @@ public abstract class Monster extends PathfinderMob implements Enemy {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isDarkEnoughToSpawn(final ServerLevelAccessor level, final BlockPos pos, final RandomSource random) {
|
public static boolean isDarkEnoughToSpawn(final ServerLevelAccessor level, final BlockPos pos, final RandomSource random) {
|
||||||
@@ -12,7 +20,7 @@
|
|||||||
if (level.getBrightness(LightLayer.SKY, pos) > random.nextInt(32)) {
|
if (level.getBrightness(LightLayer.SKY, pos) > random.nextInt(32)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -113,6 +_,11 @@
|
@@ -113,6 +118,11 @@ public abstract class Monster extends PathfinderMob implements Enemy {
|
||||||
public static boolean checkAnyLightMonsterSpawnRules(
|
public static boolean checkAnyLightMonsterSpawnRules(
|
||||||
final EntityType<? extends Monster> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
final EntityType<? extends Monster> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
||||||
) {
|
) {
|
||||||
@@ -24,7 +32,7 @@
|
|||||||
return level.getDifficulty() != Difficulty.PEACEFUL && checkMobSpawnRules(type, level, spawnReason, pos, random);
|
return level.getDifficulty() != Difficulty.PEACEFUL && checkMobSpawnRules(type, level, spawnReason, pos, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -154,4 +_,12 @@
|
@@ -154,4 +164,12 @@ public abstract class Monster extends PathfinderMob implements Enemy {
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/monster/Shulker.java b/net/minecraft/world/entity/monster/Shulker.java
|
||||||
|
index 86ca7f79741373fb54a4a90645fe080879edb416..1f7a8b12a37b42fa38cb7136cd9ef5b3bab45d6b 100644
|
||||||
|
--- a/net/minecraft/world/entity/monster/Shulker.java
|
||||||
|
+++ b/net/minecraft/world/entity/monster/Shulker.java
|
||||||
|
@@ -93,6 +93,22 @@ public class Shulker extends AbstractGolem implements Enemy {
|
||||||
|
this.lookControl = new Shulker.ShulkerLookControl(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Shulker change color with dye
|
||||||
|
+ @Override
|
||||||
|
+ protected net.minecraft.world.InteractionResult mobInteract(Player player, net.minecraft.world.InteractionHand hand) {
|
||||||
|
+ net.minecraft.world.item.ItemStack itemstack = player.getItemInHand(hand);
|
||||||
|
+ DyeColor dyeColor = itemstack.get(DataComponents.DYE);
|
||||||
|
+ if (player.level().purpurConfig.shulkerChangeColorWithDye && dyeColor != null && dyeColor != this.getColor()) {
|
||||||
|
+ this.setVariant(Optional.of(dyeColor));
|
||||||
|
+ if (!player.getAbilities().instabuild) {
|
||||||
|
+ itemstack.shrink(1);
|
||||||
|
+ }
|
||||||
|
+ return net.minecraft.world.InteractionResult.SUCCESS;
|
||||||
|
+ }
|
||||||
|
+ return super.mobInteract(player, hand);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Shulker change color with dye
|
||||||
|
+
|
||||||
|
@Override
|
||||||
|
protected void registerGoals() {
|
||||||
|
this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F, 0.02F, true));
|
||||||
|
@@ -454,11 +470,21 @@ public class Shulker extends AbstractGolem implements Enemy {
|
||||||
|
private void hitByShulkerBullet() {
|
||||||
|
Vec3 oldPosition = this.position();
|
||||||
|
AABB oldAabb = this.getBoundingBox();
|
||||||
|
- if (!this.isClosed() && this.teleportSomewhere()) {
|
||||||
|
- int shulkerCount = this.level().getEntities(EntityType.SHULKER, oldAabb.inflate(8.0), Entity::isAlive).size();
|
||||||
|
- float failureChance = (shulkerCount - 1) / 5.0F;
|
||||||
|
- if (!(this.level().getRandom().nextFloat() < failureChance)) {
|
||||||
|
+ // Purpur start - Shulker spawn from bullet options
|
||||||
|
+ if ((!this.level().purpurConfig.shulkerSpawnFromBulletRequireOpenLid || !this.isClosed()) && this.teleportSomewhere()) {
|
||||||
|
+ float failureChance = this.level().purpurConfig.shulkerSpawnFromBulletBaseChance;
|
||||||
|
+ if (!this.level().purpurConfig.shulkerSpawnFromBulletNearbyEquation.isBlank()) {
|
||||||
|
+ int shulkerCount = this.level().getEntities((net.minecraft.world.level.entity.EntityTypeTest) EntityType.SHULKER, oldAabb.inflate(this.level().purpurConfig.shulkerSpawnFromBulletNearbyRange), Entity::isAlive).size();
|
||||||
|
+ try {
|
||||||
|
+ failureChance -= ((Number) scriptEngine.eval("let nearby = " + shulkerCount + "; " + this.level().purpurConfig.shulkerSpawnFromBulletNearbyEquation)).floatValue();
|
||||||
|
+ } catch (javax.script.ScriptException e) {
|
||||||
|
+ e.printStackTrace();
|
||||||
|
+ failureChance -= (shulkerCount - 1) / 5.0F;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ if (this.level().getRandom().nextFloat() <= failureChance) {
|
||||||
|
Shulker baby = EntityType.SHULKER.create(this.level(), EntitySpawnReason.BREEDING);
|
||||||
|
+ // Purpur end - Shulker spawn from bullet options
|
||||||
|
if (baby != null) {
|
||||||
|
baby.setVariant(this.getVariant());
|
||||||
|
baby.snapTo(oldPosition);
|
||||||
|
@@ -565,7 +591,7 @@ public class Shulker extends AbstractGolem implements Enemy {
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<DyeColor> getVariant() {
|
||||||
|
- return Optional.ofNullable(this.getColor());
|
||||||
|
+ return Optional.ofNullable(this.level().purpurConfig.shulkerSpawnFromBulletRandomColor ? DyeColor.random(this.level().getRandom()) : this.getColor()); // Purpur - Shulker spawn from bullet options
|
||||||
|
}
|
||||||
|
|
||||||
|
public @Nullable DyeColor getColor() {
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/monster/Slime.java b/net/minecraft/world/entity/monster/Slime.java
|
||||||
|
index e19da253db0b1840f582b09a45d73638438afcfd..04f0c15a891c86ab42fe5aa719cb1357f68dd0f6 100644
|
||||||
--- a/net/minecraft/world/entity/monster/Slime.java
|
--- a/net/minecraft/world/entity/monster/Slime.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Slime.java
|
+++ b/net/minecraft/world/entity/monster/Slime.java
|
||||||
@@ -299,6 +_,11 @@
|
@@ -299,6 +299,11 @@ public class Slime extends Mob implements Enemy {
|
||||||
public static boolean checkSlimeSpawnRules(
|
public static boolean checkSlimeSpawnRules(
|
||||||
final EntityType<Slime> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
final EntityType<Slime> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
||||||
) {
|
) {
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java
|
||||||
|
index 4dea05ff63055803e7f41b729fdeca35879bc0d8..d53c8c684615421b982272bbb84a40cdcb0387f5 100644
|
||||||
--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java
|
--- a/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java
|
||||||
+++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java
|
+++ b/net/minecraft/world/entity/npc/wanderingtrader/WanderingTraderSpawner.java
|
||||||
@@ -135,7 +_,17 @@
|
@@ -135,7 +135,17 @@ public class WanderingTraderSpawner implements CustomSpawner {
|
||||||
int xPosition = referencePosition.getX() + this.random.nextInt(radius * 2) - radius;
|
int xPosition = referencePosition.getX() + this.random.nextInt(radius * 2) - radius;
|
||||||
int zPosition = referencePosition.getZ() + this.random.nextInt(radius * 2) - radius;
|
int zPosition = referencePosition.getZ() + this.random.nextInt(radius * 2) - radius;
|
||||||
int yPosition = level.getHeight(SpawnPlacements.getHeightmapType(EntityType.WANDERING_TRADER), xPosition, zPosition);
|
int yPosition = level.getHeight(SpawnPlacements.getHeightmapType(EntityType.WANDERING_TRADER), xPosition, zPosition);
|
||||||
@@ -0,0 +1,119 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/player/Player.java b/net/minecraft/world/entity/player/Player.java
|
||||||
|
index 5788ace1dfaf600833d8ce5e3742fb3a907d87d4..7c4ae5904081da7b0e4c135c243f2d9cebb161d9 100644
|
||||||
|
--- a/net/minecraft/world/entity/player/Player.java
|
||||||
|
+++ b/net/minecraft/world/entity/player/Player.java
|
||||||
|
@@ -173,11 +173,20 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
public float hurtDir;
|
||||||
|
public boolean affectsSpawning = true; // Paper - Affects Spawning API
|
||||||
|
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
|
||||||
|
+ public int burpDelay = 0; // Purpur - Burp delay
|
||||||
|
+ public boolean canPortalInstant = false; // Purpur - Add portal permission bypass
|
||||||
|
|
||||||
|
// CraftBukkit start
|
||||||
|
public boolean fauxSleeping;
|
||||||
|
public int oldLevel = -1;
|
||||||
|
|
||||||
|
+ // Purpur start - AFK API
|
||||||
|
+ public abstract void setAfk(boolean afk);
|
||||||
|
+
|
||||||
|
+ public boolean isAfk() {
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - AFK API
|
||||||
|
@Override
|
||||||
|
public org.bukkit.craftbukkit.entity.CraftHumanEntity getBukkitEntity() {
|
||||||
|
return (org.bukkit.craftbukkit.entity.CraftHumanEntity) super.getBukkitEntity();
|
||||||
|
@@ -242,6 +251,12 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void tick() {
|
||||||
|
+ // Purpur start - Burp delay
|
||||||
|
+ if (this.burpDelay > 0 && --this.burpDelay == 0) {
|
||||||
|
+ this.level().playSound(null, getX(), getY(), getZ(), SoundEvents.PLAYER_BURP, SoundSource.PLAYERS, 1.0F, this.level().getRandom().nextFloat() * 0.1F + 0.9F);
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Burp delay
|
||||||
|
+
|
||||||
|
this.noPhysics = this.isSpectator();
|
||||||
|
if (this.isSpectator() || this.isPassenger()) {
|
||||||
|
this.setOnGround(false);
|
||||||
|
@@ -299,6 +314,17 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
this.turtleHelmetTick();
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Full netherite armor grants fire resistance
|
||||||
|
+ if (this.level().purpurConfig.playerNetheriteFireResistanceDuration > 0 && this.level().getGameTime() % 20 == 0) {
|
||||||
|
+ if (this.getItemBySlot(EquipmentSlot.HEAD).is(Items.NETHERITE_HELMET)
|
||||||
|
+ && this.getItemBySlot(EquipmentSlot.CHEST).is(Items.NETHERITE_CHESTPLATE)
|
||||||
|
+ && this.getItemBySlot(EquipmentSlot.LEGS).is(Items.NETHERITE_LEGGINGS)
|
||||||
|
+ && this.getItemBySlot(EquipmentSlot.FEET).is(Items.NETHERITE_BOOTS)) {
|
||||||
|
+ this.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, this.level().purpurConfig.playerNetheriteFireResistanceDuration, this.level().purpurConfig.playerNetheriteFireResistanceAmplifier, this.level().purpurConfig.playerNetheriteFireResistanceAmbient, this.level().purpurConfig.playerNetheriteFireResistanceShowParticles, this.level().purpurConfig.playerNetheriteFireResistanceShowIcon), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.NETHERITE_ARMOR);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Full netherite armor grants fire resistance
|
||||||
|
+
|
||||||
|
this.cooldowns.tick();
|
||||||
|
this.updatePlayerPose();
|
||||||
|
}
|
||||||
|
@@ -504,7 +530,7 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
List<Entity> orbs = Lists.newArrayList();
|
||||||
|
|
||||||
|
for (Entity entity : entities) {
|
||||||
|
- if (entity.is(EntityType.EXPERIENCE_ORB)) {
|
||||||
|
+ if (entity.is(EntityType.EXPERIENCE_ORB) && entity.level().purpurConfig.playerExpPickupDelay >= 0) { // Purpur - Configurable player pickup exp delay
|
||||||
|
orbs.add(entity);
|
||||||
|
} else if (!entity.isRemoved()) {
|
||||||
|
this.touch(entity);
|
||||||
|
@@ -1052,7 +1078,7 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
criticalAttack = criticalAttack && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
|
||||||
|
if (criticalAttack) {
|
||||||
|
damageSource = damageSource.critical(); // Paper - critical damage API
|
||||||
|
- baseDamage *= 1.5F;
|
||||||
|
+ baseDamage *= (float) this.level().purpurConfig.playerCriticalDamageMultiplier; // Purpur - Add config change multiplier critical damage value
|
||||||
|
}
|
||||||
|
|
||||||
|
float totalDamage = baseDamage + magicBoost;
|
||||||
|
@@ -1748,7 +1774,23 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getBaseExperienceReward(final ServerLevel level) {
|
||||||
|
- return !level.getGameRules().get(GameRules.KEEP_INVENTORY) && !this.isSpectator() ? Math.min(this.experienceLevel * 7, 100) : 0;
|
||||||
|
+ // Purpur start - Add player death exp control options
|
||||||
|
+ if (!level.getGameRules().get(GameRules.KEEP_INVENTORY) && !this.isSpectator()) {
|
||||||
|
+ int toDrop;
|
||||||
|
+ try {
|
||||||
|
+ toDrop = Math.round(((Number) scriptEngine.eval("let expLevel = " + experienceLevel + "; " +
|
||||||
|
+ "let expTotal = " + totalExperience + "; " +
|
||||||
|
+ "let exp = " + experienceProgress + "; " +
|
||||||
|
+ level().purpurConfig.playerDeathExpDropEquation)).floatValue());
|
||||||
|
+ } catch (javax.script.ScriptException e) {
|
||||||
|
+ e.printStackTrace();
|
||||||
|
+ toDrop = experienceLevel * 7;
|
||||||
|
+ }
|
||||||
|
+ return Math.min(toDrop, level().purpurConfig.playerDeathExpDropMax);
|
||||||
|
+ } else {
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Add player death exp control options
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@@ -1792,6 +1834,13 @@ public abstract class Player extends Avatar implements ContainerUser {
|
||||||
|
return this.inventory.add(itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ // Purpur start - Player ridable in water option
|
||||||
|
+ @Override
|
||||||
|
+ public boolean dismountsUnderwater() {
|
||||||
|
+ return !level().purpurConfig.playerRidableInWater;
|
||||||
|
+ }
|
||||||
|
+ // Purpur end - Player ridable in water option
|
||||||
|
+
|
||||||
|
public abstract @Nullable GameType gameMode();
|
||||||
|
|
||||||
|
@Override
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java b/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java
|
||||||
|
index cd0191ab65e7d829cfa055fe8978ea14c14a3bfe..5967bfd4e738b82480f158de0c144e4b416de9b8 100644
|
||||||
--- a/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java
|
--- a/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java
|
||||||
+++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java
|
+++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/ThrownEnderpearl.java
|
||||||
@@ -113,9 +_,10 @@
|
@@ -113,9 +113,10 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -12,7 +20,7 @@
|
|||||||
endermite.snapTo(preTeleportX, preTeleportY, preTeleportZ, preTeleportYRot, preTeleportXRot); // Paper - spawn endermite at pre teleport position as teleport has been moved up
|
endermite.snapTo(preTeleportX, preTeleportY, preTeleportZ, preTeleportYRot, preTeleportXRot); // Paper - spawn endermite at pre teleport position as teleport has been moved up
|
||||||
level.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL); // Paper - add reason
|
level.addFreshEntity(endermite, org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.ENDER_PEARL); // Paper - add reason
|
||||||
}
|
}
|
||||||
@@ -135,7 +_,7 @@
|
@@ -135,7 +136,7 @@ public class ThrownEnderpearl extends ThrowableItemProjectile {
|
||||||
if (newOwner != null) {
|
if (newOwner != null) {
|
||||||
newOwner.resetFallDistance();
|
newOwner.resetFallDistance();
|
||||||
newOwner.resetCurrentImpulseContext();
|
newOwner.resetCurrentImpulseContext();
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/inventory/GrindstoneMenu.java b/net/minecraft/world/inventory/GrindstoneMenu.java
|
||||||
|
index e074c3f28599f650fab9bda25b69c596d6129781..cbb50aedac2a2cafa5ca34140ba28b02e118b458 100644
|
||||||
--- a/net/minecraft/world/inventory/GrindstoneMenu.java
|
--- a/net/minecraft/world/inventory/GrindstoneMenu.java
|
||||||
+++ b/net/minecraft/world/inventory/GrindstoneMenu.java
|
+++ b/net/minecraft/world/inventory/GrindstoneMenu.java
|
||||||
@@ -92,11 +_,13 @@
|
@@ -92,11 +92,13 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
||||||
@Override
|
@Override
|
||||||
public void onTake(final Player player, final ItemStack carried) {
|
public void onTake(final Player player, final ItemStack carried) {
|
||||||
access.execute((level, pos) -> {
|
access.execute((level, pos) -> {
|
||||||
@@ -15,7 +23,7 @@
|
|||||||
// Paper end - Fire BlockExpEvent on grindstone use
|
// Paper end - Fire BlockExpEvent on grindstone use
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -125,7 +_,7 @@
|
@@ -125,7 +127,7 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
||||||
for (Entry<Holder<Enchantment>> entry : enchantments.entrySet()) {
|
for (Entry<Holder<Enchantment>> entry : enchantments.entrySet()) {
|
||||||
Holder<Enchantment> enchant = entry.getKey();
|
Holder<Enchantment> enchant = entry.getKey();
|
||||||
int lvl = entry.getIntValue();
|
int lvl = entry.getIntValue();
|
||||||
@@ -24,7 +32,7 @@
|
|||||||
amount += enchant.value().getMinCost(lvl);
|
amount += enchant.value().getMinCost(lvl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,16 +_,76 @@
|
@@ -205,16 +207,76 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
||||||
|
|
||||||
for (Entry<Holder<Enchantment>> entry : enchantments.entrySet()) {
|
for (Entry<Holder<Enchantment>> entry : enchantments.entrySet()) {
|
||||||
Holder<Enchantment> enchant = entry.getKey();
|
Holder<Enchantment> enchant = entry.getKey();
|
||||||
@@ -103,7 +111,7 @@
|
|||||||
);
|
);
|
||||||
if (item.is(Items.ENCHANTED_BOOK) && newEnchantments.isEmpty()) {
|
if (item.is(Items.ENCHANTED_BOOK) && newEnchantments.isEmpty()) {
|
||||||
item = item.transmuteCopy(Items.BOOK);
|
item = item.transmuteCopy(Items.BOOK);
|
||||||
@@ -227,6 +_,22 @@
|
@@ -227,6 +289,22 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
||||||
}
|
}
|
||||||
|
|
||||||
item.set(DataComponents.REPAIR_COST, repairCost);
|
item.set(DataComponents.REPAIR_COST, repairCost);
|
||||||
@@ -126,7 +134,7 @@
|
|||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -283,7 +_,9 @@
|
@@ -283,7 +361,9 @@ public class GrindstoneMenu extends AbstractContainerMenu {
|
||||||
return ItemStack.EMPTY;
|
return ItemStack.EMPTY;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/item/Items.java b/net/minecraft/world/item/Items.java
|
||||||
|
index 20738a373069ee391e7a9cdb99338028a7a1fff8..cb336a31df9f484f9dbee8ef744fd82ac363ed51 100644
|
||||||
--- a/net/minecraft/world/item/Items.java
|
--- a/net/minecraft/world/item/Items.java
|
||||||
+++ b/net/minecraft/world/item/Items.java
|
+++ b/net/minecraft/world/item/Items.java
|
||||||
@@ -396,7 +_,7 @@
|
@@ -396,7 +396,7 @@ public class Items {
|
||||||
public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK);
|
public static final Item PURPUR_BLOCK = registerBlock(Blocks.PURPUR_BLOCK);
|
||||||
public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR);
|
public static final Item PURPUR_PILLAR = registerBlock(Blocks.PURPUR_PILLAR);
|
||||||
public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS);
|
public static final Item PURPUR_STAIRS = registerBlock(Blocks.PURPUR_STAIRS);
|
||||||
@@ -9,7 +17,7 @@
|
|||||||
public static final Item CREAKING_HEART = registerBlock(Blocks.CREAKING_HEART);
|
public static final Item CREAKING_HEART = registerBlock(Blocks.CREAKING_HEART);
|
||||||
public static final Item CHEST = registerBlock(Blocks.CHEST, p -> p.component(DataComponents.CONTAINER, ItemContainerContents.EMPTY));
|
public static final Item CHEST = registerBlock(Blocks.CHEST, p -> p.component(DataComponents.CONTAINER, ItemContainerContents.EMPTY));
|
||||||
public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE);
|
public static final Item CRAFTING_TABLE = registerBlock(Blocks.CRAFTING_TABLE);
|
||||||
@@ -2105,7 +_,7 @@
|
@@ -2105,7 +2105,7 @@ public class Items {
|
||||||
"sweet_berries", createBlockItemWithCustomItemName(Blocks.SWEET_BERRY_BUSH), new Item.Properties().food(Foods.SWEET_BERRIES)
|
"sweet_berries", createBlockItemWithCustomItemName(Blocks.SWEET_BERRY_BUSH), new Item.Properties().food(Foods.SWEET_BERRIES)
|
||||||
);
|
);
|
||||||
public static final Item GLOW_BERRIES = registerItem(
|
public static final Item GLOW_BERRIES = registerItem(
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/level/ServerExplosion.java b/net/minecraft/world/level/ServerExplosion.java
|
||||||
|
index 34d7eef8b2540172bd4dcdbf80df45e9cbfcb43c..be97308736a54c8415f1b32f66c42afe8e0e5b4f 100644
|
||||||
--- a/net/minecraft/world/level/ServerExplosion.java
|
--- a/net/minecraft/world/level/ServerExplosion.java
|
||||||
+++ b/net/minecraft/world/level/ServerExplosion.java
|
+++ b/net/minecraft/world/level/ServerExplosion.java
|
||||||
@@ -623,6 +_,23 @@
|
@@ -623,6 +623,23 @@ public class ServerExplosion implements Explosion {
|
||||||
}
|
}
|
||||||
|
|
||||||
public int explode() {
|
public int explode() {
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/level/block/BedBlock.java b/net/minecraft/world/level/block/BedBlock.java
|
||||||
|
index 3ab00a55523bb4ab79c346df5c83993cecb3154c..23d6d30a386816c7af0fdafc4b446a61a7d66763 100644
|
||||||
--- a/net/minecraft/world/level/block/BedBlock.java
|
--- a/net/minecraft/world/level/block/BedBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/BedBlock.java
|
+++ b/net/minecraft/world/level/block/BedBlock.java
|
||||||
@@ -101,7 +_,7 @@
|
@@ -101,7 +101,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3 boomPos = pos.getCenter();
|
Vec3 boomPos = pos.getCenter();
|
||||||
@@ -9,7 +17,7 @@
|
|||||||
return InteractionResult.SUCCESS_SERVER;
|
return InteractionResult.SUCCESS_SERVER;
|
||||||
} else if (state.getValue(OCCUPIED)) {
|
} else if (state.getValue(OCCUPIED)) {
|
||||||
if (bedRule.explodes()) return this.explodeBed(state, level, pos); // Paper - check explode first
|
if (bedRule.explodes()) return this.explodeBed(state, level, pos); // Paper - check explode first
|
||||||
@@ -153,7 +_,7 @@
|
@@ -153,7 +153,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
Vec3 boomPos = pos.getCenter();
|
Vec3 boomPos = pos.getCenter();
|
||||||
@@ -18,7 +26,7 @@
|
|||||||
return InteractionResult.SUCCESS_SERVER;
|
return InteractionResult.SUCCESS_SERVER;
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -170,7 +_,7 @@
|
@@ -170,7 +170,7 @@ public class BedBlock extends HorizontalDirectionalBlock implements EntityBlock
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void fallOn(final Level level, final BlockState state, final BlockPos pos, final Entity entity, final double fallDistance) {
|
public void fallOn(final Level level, final BlockState state, final BlockPos pos, final Entity entity, final double fallDistance) {
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/level/block/RespawnAnchorBlock.java b/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
||||||
|
index 8675c1f34cc595b3cf5fb7bcfebf3b17c9b959d7..9975afaca9702394a05da502b17badb0ba261575 100644
|
||||||
--- a/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
--- a/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
+++ b/net/minecraft/world/level/block/RespawnAnchorBlock.java
|
||||||
@@ -176,7 +_,7 @@
|
@@ -176,7 +176,7 @@ public class RespawnAnchorBlock extends Block {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Vec3 boomPos = pos.getCenter();
|
Vec3 boomPos = pos.getCenter();
|
||||||
@@ -1,6 +1,14 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||||
|
index e47a91b1869801258d0db20c126722fb06522c80..76174967cc80e8b7024b4d8cf48289c5e14bc6f2 100644
|
||||||
--- a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
--- a/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||||
+++ b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
+++ b/net/minecraft/world/level/chunk/storage/RegionFileStorage.java
|
||||||
@@ -309,7 +_,7 @@
|
@@ -309,7 +309,7 @@ public class RegionFileStorage implements AutoCloseable, ca.spottedleaf.moonrise
|
||||||
|
|
||||||
// Paper start
|
// Paper start
|
||||||
private static void printOversizedLog(String msg, Path file, int x, int z) {
|
private static void printOversizedLog(String msg, Path file, int x, int z) {
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
From d44c75e006d2ffe1b3217d503036c0a070fc63ba Mon Sep 17 00:00:00 2001
|
||||||
|
From: File <noreply+automated@papermc.io>
|
||||||
|
Date: Sun, 20 Apr 1997 06:37:42 -0700
|
||||||
|
Subject: [PATCH] purpur File Patches
|
||||||
|
|
||||||
|
|
||||||
|
diff --git a/net/minecraft/world/level/portal/PortalShape.java b/net/minecraft/world/level/portal/PortalShape.java
|
||||||
|
index 45cad44bcc715d111c168bad84b7a7c47a6b7517..28760a5e04b659dd7eca7953d6a12e9818d4ada0 100644
|
||||||
|
--- a/net/minecraft/world/level/portal/PortalShape.java
|
||||||
|
+++ b/net/minecraft/world/level/portal/PortalShape.java
|
||||||
|
@@ -29,7 +29,7 @@ public class PortalShape {
|
||||||
|
public static final int MAX_WIDTH = 21;
|
||||||
|
private static final int MIN_HEIGHT = 3;
|
||||||
|
public static final int MAX_HEIGHT = 21;
|
||||||
|
- public static final BlockBehaviour.StatePredicate FRAME = (state, level, pos) -> state.is(Blocks.OBSIDIAN);
|
||||||
|
+ public static final BlockBehaviour.StatePredicate FRAME = (state, level, pos) -> state.is(Blocks.OBSIDIAN) || (org.purpurmc.purpur.PurpurConfig.cryingObsidianValidForPortalFrame && state.is(Blocks.CRYING_OBSIDIAN)); // Purpur - Crying obsidian valid for portal frames
|
||||||
|
private static final float SAFE_TRAVEL_MAX_ENTITY_XY = 4.0F;
|
||||||
|
private static final double SAFE_TRAVEL_MAX_VERTICAL_DELTA = 1.0;
|
||||||
|
private final Direction.Axis axis;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/io/papermc/paper/entity/activation/ActivationRange.java
|
--- a/io/papermc/paper/entity/activation/ActivationRange.java
|
||||||
+++ b/io/papermc/paper/entity/activation/ActivationRange.java
|
+++ b/io/papermc/paper/entity/activation/ActivationRange.java
|
||||||
@@ -147,6 +_,8 @@
|
@@ -148,6 +_,8 @@
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
final int worldHeight = world.getHeight();
|
final int worldHeight = world.getHeight();
|
||||||
ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, worldHeight, maxRange);
|
ActivationRange.maxBB = player.getBoundingBox().inflate(maxRange, worldHeight, maxRange);
|
||||||
ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, worldHeight, miscActivationRange);
|
ActivationType.MISC.boundingBox = player.getBoundingBox().inflate(miscActivationRange, worldHeight, miscActivationRange);
|
||||||
@@ -288,6 +_,7 @@
|
@@ -289,6 +_,7 @@
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static boolean checkIfActive(final Entity entity) {
|
public static boolean checkIfActive(final Entity entity) {
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
public CrashReport(final String title, final Throwable t) {
|
public CrashReport(final String title, final Throwable t) {
|
||||||
this.title = title;
|
this.title = title;
|
||||||
@@ -126,7 +_,7 @@
|
@@ -147,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getFriendlyReport(final ReportType reportType) {
|
public String getFriendlyReport(final ReportType reportType) {
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
public @Nullable Path getSaveFile() {
|
public @Nullable Path getSaveFile() {
|
||||||
@@ -156,7 +_,7 @@
|
@@ -177,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean saveToFile(final Path file, final ReportType reportType) {
|
public boolean saveToFile(final Path file, final ReportType reportType) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/commands/Commands.java
|
--- a/net/minecraft/commands/Commands.java
|
||||||
+++ b/net/minecraft/commands/Commands.java
|
+++ b/net/minecraft/commands/Commands.java
|
||||||
@@ -267,11 +_,11 @@
|
@@ -268,11 +_,11 @@
|
||||||
JfrCommand.register(this.dispatcher);
|
JfrCommand.register(this.dispatcher);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
RaidCommand.register(this.dispatcher, context);
|
RaidCommand.register(this.dispatcher, context);
|
||||||
DebugPathCommand.register(this.dispatcher);
|
DebugPathCommand.register(this.dispatcher);
|
||||||
DebugMobSpawningCommand.register(this.dispatcher);
|
DebugMobSpawningCommand.register(this.dispatcher);
|
||||||
@@ -299,6 +_,14 @@
|
@@ -300,6 +_,14 @@
|
||||||
StopCommand.register(this.dispatcher);
|
StopCommand.register(this.dispatcher);
|
||||||
TransferCommand.register(this.dispatcher);
|
TransferCommand.register(this.dispatcher);
|
||||||
WhitelistCommand.register(this.dispatcher);
|
WhitelistCommand.register(this.dispatcher);
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (commandSelection.includeIntegrated) {
|
if (commandSelection.includeIntegrated) {
|
||||||
@@ -521,6 +_,7 @@
|
@@ -523,6 +_,7 @@
|
||||||
private void runSync(ServerPlayer player, java.util.Collection<String> bukkit, RootCommandNode<CommandSourceStack> root) {
|
private void runSync(ServerPlayer player, java.util.Collection<String> bukkit, RootCommandNode<CommandSourceStack> root) {
|
||||||
// Paper end - Perf: Async command map building
|
// Paper end - Perf: Async command map building
|
||||||
new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent<CommandSourceStack>(player.getBukkitEntity(), (RootCommandNode) root, true).callEvent(); // Paper - Brigadier API
|
new com.destroystokyo.paper.event.brigadier.AsyncPlayerSendCommandsEvent<CommandSourceStack>(player.getBukkitEntity(), (RootCommandNode) root, true).callEvent(); // Paper - Brigadier API
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit));
|
org.bukkit.event.player.PlayerCommandSendEvent event = new org.bukkit.event.player.PlayerCommandSendEvent(player.getBukkitEntity(), new java.util.LinkedHashSet<>(bukkit));
|
||||||
event.getPlayer().getServer().getPluginManager().callEvent(event);
|
event.getPlayer().getServer().getPluginManager().callEvent(event);
|
||||||
|
|
||||||
@@ -531,6 +_,8 @@
|
@@ -533,6 +_,8 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/core/BlockPos.java
|
--- a/net/minecraft/core/BlockPos.java
|
||||||
+++ b/net/minecraft/core/BlockPos.java
|
+++ b/net/minecraft/core/BlockPos.java
|
||||||
@@ -60,6 +_,12 @@
|
@@ -59,6 +_,12 @@
|
||||||
public static final int MAX_HORIZONTAL_COORDINATE = 33554431;
|
public static final int MAX_HORIZONTAL_COORDINATE = 33554431;
|
||||||
// Paper end - Optimize Bit Operations by inlining
|
// Paper end - Optimize Bit Operations by inlining
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/gametest/framework/GameTestHelper.java
|
--- a/net/minecraft/gametest/framework/GameTestHelper.java
|
||||||
+++ b/net/minecraft/gametest/framework/GameTestHelper.java
|
+++ b/net/minecraft/gametest/framework/GameTestHelper.java
|
||||||
@@ -352,6 +_,8 @@
|
@@ -361,6 +_,8 @@
|
||||||
return gameType;
|
return gameType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/network/Connection.java
|
--- a/net/minecraft/network/Connection.java
|
||||||
+++ b/net/minecraft/network/Connection.java
|
+++ b/net/minecraft/network/Connection.java
|
||||||
@@ -552,11 +_,20 @@
|
@@ -553,11 +_,20 @@
|
||||||
private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world
|
private static final int MAX_PER_TICK = io.papermc.paper.configuration.GlobalConfiguration.get().misc.maxJoinsPerTick; // Paper - Buffer joins to world
|
||||||
private static int joinAttemptsThisTick; // Paper - Buffer joins to world
|
private static int joinAttemptsThisTick; // Paper - Buffer joins to world
|
||||||
private static int currTick; // Paper - Buffer joins to world
|
private static int currTick; // Paper - Buffer joins to world
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/Main.java
|
--- a/net/minecraft/server/Main.java
|
||||||
+++ b/net/minecraft/server/Main.java
|
+++ b/net/minecraft/server/Main.java
|
||||||
@@ -104,6 +_,13 @@
|
@@ -107,6 +_,13 @@
|
||||||
JvmProfiler.INSTANCE.start(Environment.SERVER);
|
JvmProfiler.INSTANCE.start(Environment.SERVER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/MinecraftServer.java
|
--- a/net/minecraft/server/MinecraftServer.java
|
||||||
+++ b/net/minecraft/server/MinecraftServer.java
|
+++ b/net/minecraft/server/MinecraftServer.java
|
||||||
@@ -320,6 +_,7 @@
|
@@ -318,6 +_,7 @@
|
||||||
public joptsimple.OptionSet options;
|
public joptsimple.OptionSet options;
|
||||||
public org.bukkit.command.ConsoleCommandSender console;
|
public org.bukkit.command.ConsoleCommandSender console;
|
||||||
public static int currentTick; // Paper - improve tick loop
|
public static int currentTick; // Paper - improve tick loop
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
|
public java.util.Queue<Runnable> processQueue = new java.util.concurrent.ConcurrentLinkedQueue<Runnable>();
|
||||||
public int autosavePeriod;
|
public int autosavePeriod;
|
||||||
// Paper - don't store the vanilla dispatcher
|
// Paper - don't store the vanilla dispatcher
|
||||||
@@ -336,6 +_,8 @@
|
@@ -334,6 +_,8 @@
|
||||||
public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
|
public boolean isIteratingOverLevels = false; // Paper - Throw exception on world create while being ticked
|
||||||
private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
|
private final Set<String> pluginsBlockingSleep = new java.util.HashSet<>(); // Paper - API to allow/disallow tick sleeping
|
||||||
public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
|
public static final long SERVER_INIT = System.nanoTime(); // Paper - Lag compensation
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
// Paper start - improve tick loop
|
// Paper start - improve tick loop
|
||||||
public final ca.spottedleaf.moonrise.common.time.TickData tickTimes1s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(1L));
|
public final ca.spottedleaf.moonrise.common.time.TickData tickTimes1s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(1L));
|
||||||
public final ca.spottedleaf.moonrise.common.time.TickData tickTimes5s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(5L));
|
public final ca.spottedleaf.moonrise.common.time.TickData tickTimes5s = new ca.spottedleaf.moonrise.common.time.TickData(java.util.concurrent.TimeUnit.SECONDS.toNanos(5L));
|
||||||
@@ -420,6 +_,7 @@
|
@@ -418,6 +_,7 @@
|
||||||
public double[] computeTPS() {
|
public double[] computeTPS() {
|
||||||
final long interval = this.tickRateManager().nanosecondsPerTick();
|
final long interval = this.tickRateManager().nanosecondsPerTick();
|
||||||
return new double[] {
|
return new double[] {
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
getTPS(this.tickTimes1m, interval),
|
getTPS(this.tickTimes1m, interval),
|
||||||
getTPS(this.tickTimes5m, interval),
|
getTPS(this.tickTimes5m, interval),
|
||||||
getTPS(this.tickTimes15m, interval)
|
getTPS(this.tickTimes15m, interval)
|
||||||
@@ -1047,6 +_,15 @@
|
@@ -955,6 +_,15 @@
|
||||||
|
|
||||||
LOGGER.info("Stopping server");
|
LOGGER.info("Stopping server");
|
||||||
Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing
|
Commands.COMMAND_SENDING_POOL.shutdownNow(); // Paper - Perf: Async command map building; Shutdown and don't bother finishing
|
||||||
@@ -41,7 +41,7 @@
|
|||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
if (this.server != null) {
|
if (this.server != null) {
|
||||||
this.server.spark.disable(); // Paper - spark
|
this.server.spark.disable(); // Paper - spark
|
||||||
@@ -1141,6 +_,8 @@
|
@@ -1044,6 +_,8 @@
|
||||||
this.safeShutdown(wait, false);
|
this.safeShutdown(wait, false);
|
||||||
}
|
}
|
||||||
public void safeShutdown(final boolean wait, final boolean isRestarting) {
|
public void safeShutdown(final boolean wait, final boolean isRestarting) {
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
this.isRestarting = isRestarting;
|
this.isRestarting = isRestarting;
|
||||||
this.hasLoggedStop = true; // Paper - Debugging
|
this.hasLoggedStop = true; // Paper - Debugging
|
||||||
if (this.isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging
|
if (this.isDebugging()) io.papermc.paper.util.TraceUtil.dumpTraceForThread("Server stopped"); // Paper - Debugging
|
||||||
@@ -1322,11 +_,21 @@
|
@@ -1210,11 +_,21 @@
|
||||||
}
|
}
|
||||||
// Paper end - Add onboarding message for initial server start
|
// Paper end - Add onboarding message for initial server start
|
||||||
// Paper start - Improve outdated version checking
|
// Paper start - Improve outdated version checking
|
||||||
@@ -73,7 +73,7 @@
|
|||||||
while (this.running) {
|
while (this.running) {
|
||||||
final long tickStart = System.nanoTime(); // Paper - improve tick loop
|
final long tickStart = System.nanoTime(); // Paper - improve tick loop
|
||||||
long thisTickNanos; // Paper - improve tick loop - diff on change, expect this to be tick interval
|
long thisTickNanos; // Paper - improve tick loop - diff on change, expect this to be tick interval
|
||||||
@@ -1340,9 +_,11 @@
|
@@ -1228,9 +_,11 @@
|
||||||
final long ticksBehind = Math.max(1L, this.tickSchedule.getPeriodsAhead(thisTickNanos, tickStart));
|
final long ticksBehind = Math.max(1L, this.tickSchedule.getPeriodsAhead(thisTickNanos, tickStart));
|
||||||
final long catchup = (long)Math.max(
|
final long catchup = (long)Math.max(
|
||||||
1,
|
1,
|
||||||
@@ -86,7 +86,7 @@
|
|||||||
// adjust ticksBehind so that it is not greater-than catchup
|
// adjust ticksBehind so that it is not greater-than catchup
|
||||||
if (ticksBehind - catchup > 0L) {
|
if (ticksBehind - catchup > 0L) {
|
||||||
final long difference = ticksBehind - catchup;
|
final long difference = ticksBehind - catchup;
|
||||||
@@ -1973,7 +_,7 @@
|
@@ -1853,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getServerModName() {
|
public String getServerModName() {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/PlayerAdvancements.java
|
--- a/net/minecraft/server/PlayerAdvancements.java
|
||||||
+++ b/net/minecraft/server/PlayerAdvancements.java
|
+++ b/net/minecraft/server/PlayerAdvancements.java
|
||||||
@@ -148,6 +_,7 @@
|
@@ -146,6 +_,7 @@
|
||||||
AdvancementHolder advancement = manager.get(id);
|
AdvancementHolder advancement = manager.get(id);
|
||||||
if (advancement == null) {
|
if (advancement == null) {
|
||||||
if (!id.getNamespace().equals(Identifier.DEFAULT_NAMESPACE)) return; // CraftBukkit
|
if (!id.getNamespace().equals(Identifier.DEFAULT_NAMESPACE)) return; // CraftBukkit
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", id, this.playerSavePath);
|
LOGGER.warn("Ignored advancement '{}' in progress file {} - it doesn't exist anymore?", id, this.playerSavePath);
|
||||||
} else {
|
} else {
|
||||||
this.startProgress(advancement, progress);
|
this.startProgress(advancement, progress);
|
||||||
@@ -195,6 +_,7 @@
|
@@ -193,6 +_,7 @@
|
||||||
holder.value().display().ifPresent(display -> {
|
holder.value().display().ifPresent(display -> {
|
||||||
// Paper start - Add Adventure message to PlayerAdvancementDoneEvent
|
// Paper start - Add Adventure message to PlayerAdvancementDoneEvent
|
||||||
if (event.message() != null && this.player.level().getGameRules().get(GameRules.SHOW_ADVANCEMENT_MESSAGES)) {
|
if (event.message() != null && this.player.level().getGameRules().get(GameRules.SHOW_ADVANCEMENT_MESSAGES)) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
--- a/net/minecraft/server/dedicated/DedicatedServer.java
|
||||||
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
|
+++ b/net/minecraft/server/dedicated/DedicatedServer.java
|
||||||
@@ -211,6 +_,7 @@
|
@@ -172,6 +_,7 @@
|
||||||
public void run() {
|
public void run() {
|
||||||
if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit
|
if (!org.bukkit.craftbukkit.Main.useConsole) return; // CraftBukkit
|
||||||
// Paper start - Use TerminalConsoleAppender
|
// Paper start - Use TerminalConsoleAppender
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start();
|
new com.destroystokyo.paper.console.PaperConsole(DedicatedServer.this).start();
|
||||||
/*
|
/*
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in, StandardCharsets.UTF_8));
|
||||||
@@ -289,6 +_,15 @@
|
@@ -250,6 +_,15 @@
|
||||||
io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command
|
io.papermc.paper.command.PaperCommands.registerCommands(this); // Paper - setup /paper command
|
||||||
this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark
|
this.server.spark.registerCommandBeforePlugins(this.server); // Paper - spark
|
||||||
com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics
|
com.destroystokyo.paper.Metrics.PaperMetrics.startMetrics(); // Paper - start metrics
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now
|
com.destroystokyo.paper.VersionHistoryManager.INSTANCE.getClass(); // Paper - load version history now
|
||||||
|
|
||||||
// this.worldData.setGameType(properties.gameMode.get()); // CraftBukkit - moved to world loading
|
// this.worldData.setGameType(properties.gameMode.get()); // CraftBukkit - moved to world loading
|
||||||
@@ -331,6 +_,30 @@
|
@@ -292,6 +_,30 @@
|
||||||
if (true) throw new IllegalStateException("Failed to bind to port", e); // Paper - Propagate failed to bind to port error
|
if (true) throw new IllegalStateException("Failed to bind to port", e); // Paper - Propagate failed to bind to port error
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
this.server.loadPlugins();
|
this.server.loadPlugins();
|
||||||
@@ -406,6 +_,9 @@
|
@@ -366,6 +_,9 @@
|
||||||
MinecraftServerStatistics.registerJmxMonitoring(this);
|
MinecraftServerStatistics.registerJmxMonitoring(this);
|
||||||
LOGGER.info("JMX monitoring enabled");
|
LOGGER.info("JMX monitoring enabled");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/level/ServerPlayer.java
|
--- a/net/minecraft/server/level/ServerPlayer.java
|
||||||
+++ b/net/minecraft/server/level/ServerPlayer.java
|
+++ b/net/minecraft/server/level/ServerPlayer.java
|
||||||
@@ -435,6 +_,9 @@
|
@@ -436,6 +_,9 @@
|
||||||
public boolean isRealPlayer; // Paper
|
public boolean isRealPlayer; // Paper
|
||||||
public com.destroystokyo.paper.event.entity.@Nullable PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent
|
public com.destroystokyo.paper.event.entity.@Nullable PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent
|
||||||
public org.bukkit.event.player.PlayerQuitEvent.@Nullable QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
|
public org.bukkit.event.player.PlayerQuitEvent.@Nullable QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event
|
||||||
@@ -8,9 +8,9 @@
|
|||||||
+ private boolean compassBar = false; // Purpur - Add compass command
|
+ private boolean compassBar = false; // Purpur - Add compass command
|
||||||
+ private boolean ramBar = false; // Purpur - Implement rambar commands
|
+ private boolean ramBar = false; // Purpur - Implement rambar commands
|
||||||
|
|
||||||
// Paper start - rewrite chunk system
|
public ServerPlayer(final MinecraftServer server, final ServerLevel level, final GameProfile gameProfile, final ClientInformation clientInformation) {
|
||||||
private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader;
|
super(level, gameProfile);
|
||||||
@@ -508,6 +_,9 @@
|
@@ -480,6 +_,9 @@
|
||||||
this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null);
|
this.respawnConfig = input.read("respawn", ServerPlayer.RespawnConfig.CODEC).orElse(null);
|
||||||
this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false);
|
this.spawnExtraParticlesOnFall = input.getBooleanOr("spawn_extra_particles_on_fall", false);
|
||||||
this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null);
|
this.raidOmenPosition = input.read("raid_omen_position", BlockPos.CODEC).orElse(null);
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
// Paper start - Expand PlayerGameModeChangeEvent
|
// Paper start - Expand PlayerGameModeChangeEvent
|
||||||
this.loadGameTypes(input);
|
this.loadGameTypes(input);
|
||||||
}
|
}
|
||||||
@@ -549,6 +_,9 @@
|
@@ -522,6 +_,9 @@
|
||||||
output.store("ShoulderEntityRight", CompoundTag.CODEC, this.getShoulderEntityRight());
|
output.store("ShoulderEntityRight", CompoundTag.CODEC, this.getShoulderEntityRight());
|
||||||
}
|
}
|
||||||
this.getBukkitEntity().setExtraData(output); // CraftBukkit
|
this.getBukkitEntity().setExtraData(output); // CraftBukkit
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void saveParentVehicle(final ValueOutput playerOutput) {
|
private void saveParentVehicle(final ValueOutput playerOutput) {
|
||||||
@@ -1179,6 +_,7 @@
|
@@ -1158,6 +_,7 @@
|
||||||
// Paper - moved up to sendClientboundPlayerCombatKillPacket()
|
// Paper - moved up to sendClientboundPlayerCombatKillPacket()
|
||||||
sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent
|
sendClientboundPlayerCombatKillPacket(event.getShowDeathMessages(), deathScreenMessage); // Paper - Expand PlayerDeathEvent
|
||||||
Team team = this.getTeam();
|
Team team = this.getTeam();
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) {
|
if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) {
|
||||||
this.server.getPlayerList().broadcastSystemMessage(deathMessage, false);
|
this.server.getPlayerList().broadcastSystemMessage(deathMessage, false);
|
||||||
} else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) {
|
} else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) {
|
||||||
@@ -1288,6 +_,13 @@
|
@@ -1267,6 +_,13 @@
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
Entity entity = source.getEntity();
|
Entity entity = source.getEntity();
|
||||||
if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false.
|
if (!( // Paper - split the if statement. If below statement is false, hurtServer would not have been evaluated. Return false.
|
||||||
!(entity instanceof Player player && !this.canHarmPlayer(player))
|
!(entity instanceof Player player && !this.canHarmPlayer(player))
|
||||||
@@ -1529,7 +_,7 @@
|
@@ -1508,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newLevel.dimension() == lastDimension) {
|
if (newLevel.dimension() == lastDimension) {
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
this.connection.resetPosition();
|
this.connection.resetPosition();
|
||||||
transition.postTeleportTransition().onTransition(this);
|
transition.postTeleportTransition().onTransition(this);
|
||||||
return this;
|
return this;
|
||||||
@@ -1552,6 +_,7 @@
|
@@ -1531,6 +_,7 @@
|
||||||
|
|
||||||
profiler.pop();
|
profiler.pop();
|
||||||
profiler.push("placing");
|
profiler.push("placing");
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
this.setServerLevel(newLevel);
|
this.setServerLevel(newLevel);
|
||||||
this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit - use internal teleport without event
|
this.connection.internalTeleport(PositionMoveRotation.of(transition), transition.relatives()); // CraftBukkit - use internal teleport without event
|
||||||
this.connection.resetPosition();
|
this.connection.resetPosition();
|
||||||
@@ -1664,7 +_,7 @@
|
@@ -1643,7 +_,7 @@
|
||||||
new AABB(bedCenter.x() - 8.0, bedCenter.y() - 5.0, bedCenter.z() - 8.0, bedCenter.x() + 8.0, bedCenter.y() + 5.0, bedCenter.z() + 8.0),
|
new AABB(bedCenter.x() - 8.0, bedCenter.y() - 5.0, bedCenter.z() - 8.0, bedCenter.x() + 8.0, bedCenter.y() + 5.0, bedCenter.z() + 8.0),
|
||||||
monster -> monster.isPreventingPlayerRest(this.level(), this)
|
monster -> monster.isPreventingPlayerRest(this.level(), this)
|
||||||
);
|
);
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
return Either.left(Player.BedSleepingProblem.NOT_SAFE);
|
return Either.left(Player.BedSleepingProblem.NOT_SAFE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1700,7 +_,17 @@
|
@@ -1679,7 +_,17 @@
|
||||||
CriteriaTriggers.SLEPT_IN_BED.trigger(this);
|
CriteriaTriggers.SLEPT_IN_BED.trigger(this);
|
||||||
});
|
});
|
||||||
if (!this.level().canSleepThroughNights()) {
|
if (!this.level().canSleepThroughNights()) {
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.level().updateSleepingPlayerList();
|
this.level().updateSleepingPlayerList();
|
||||||
@@ -1794,6 +_,7 @@
|
@@ -1774,6 +_,7 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void openTextEdit(final SignBlockEntity sign, final boolean isFrontText) {
|
public void openTextEdit(final SignBlockEntity sign, final boolean isFrontText) {
|
||||||
@@ -105,7 +105,7 @@
|
|||||||
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos()));
|
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos()));
|
||||||
this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), isFrontText));
|
this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), isFrontText));
|
||||||
}
|
}
|
||||||
@@ -2138,6 +_,26 @@
|
@@ -2118,6 +_,26 @@
|
||||||
this.lastSentExp = -1; // CraftBukkit - Added to reset
|
this.lastSentExp = -1; // CraftBukkit - Added to reset
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@
|
|||||||
@Override
|
@Override
|
||||||
public void completeUsingItem() {
|
public void completeUsingItem() {
|
||||||
if (!this.useItem.isEmpty() && this.isUsingItem()) {
|
if (!this.useItem.isEmpty() && this.isUsingItem()) {
|
||||||
@@ -2373,6 +_,20 @@
|
@@ -2355,6 +_,20 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +153,7 @@
|
|||||||
@Override
|
@Override
|
||||||
public void sendSystemMessage(final Component message) {
|
public void sendSystemMessage(final Component message) {
|
||||||
this.sendSystemMessage(message, false);
|
this.sendSystemMessage(message, false);
|
||||||
@@ -2524,7 +_,67 @@
|
@@ -2506,7 +_,67 @@
|
||||||
|
|
||||||
public void resetLastActionTime() {
|
public void resetLastActionTime() {
|
||||||
this.lastActionTime = Util.getMillis();
|
this.lastActionTime = Util.getMillis();
|
||||||
@@ -222,7 +222,7 @@
|
|||||||
|
|
||||||
public ServerStatsCounter getStats() {
|
public ServerStatsCounter getStats() {
|
||||||
return this.stats;
|
return this.stats;
|
||||||
@@ -3149,4 +_,65 @@
|
@@ -3131,4 +_,65 @@
|
||||||
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
|
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
--- a/net/minecraft/server/level/WorldGenRegion.java
|
--- a/net/minecraft/server/level/WorldGenRegion.java
|
||||||
+++ b/net/minecraft/server/level/WorldGenRegion.java
|
+++ b/net/minecraft/server/level/WorldGenRegion.java
|
||||||
@@ -292,6 +_,7 @@
|
@@ -297,6 +_,7 @@
|
||||||
return true;
|
int chunkX = SectionPos.blockToSectionCoord(pos.getX());
|
||||||
} else {
|
int chunkZ = SectionPos.blockToSectionCoord(pos.getZ());
|
||||||
// Paper start - Buffer OOB setBlock calls
|
// Paper start - Buffer OOB setBlock calls
|
||||||
+ if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressSetBlockFarChunk) // Purpur - Logger settings (suppressing pointless logs)
|
+ if (!org.purpurmc.purpur.PurpurConfig.loggerSuppressSetBlockFarChunk) // Purpur - Logger settings (suppressing pointless logs)
|
||||||
if (!hasSetFarWarned) {
|
if (!hasSetFarWarned) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
||||||
@@ -354,6 +_,20 @@
|
@@ -357,6 +_,20 @@
|
||||||
}
|
}
|
||||||
// Paper end - configuration phase API
|
// Paper end - configuration phase API
|
||||||
|
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
if (this.ackBlockChangesUpTo > -1) {
|
if (this.ackBlockChangesUpTo > -1) {
|
||||||
@@ -371,6 +_,12 @@
|
@@ -375,6 +_,12 @@
|
||||||
&& this.server.playerIdleTimeout() > 0
|
&& this.server.playerIdleTimeout() > 0
|
||||||
&& Util.getMillis() - this.player.getLastActionTime() > TimeUnit.MINUTES.toMillis(this.server.playerIdleTimeout())
|
&& Util.getMillis() - this.player.getLastActionTime() > TimeUnit.MINUTES.toMillis(this.server.playerIdleTimeout())
|
||||||
&& !this.player.wonGame) {
|
&& !this.player.wonGame) {
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause
|
this.disconnect(Component.translatable("multiplayer.disconnect.idling"), org.bukkit.event.player.PlayerKickEvent.Cause.IDLING); // Paper - kick event cause
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -692,6 +_,8 @@
|
@@ -685,6 +_,8 @@
|
||||||
this.lastYaw = to.getYaw();
|
this.lastYaw = to.getYaw();
|
||||||
this.lastPitch = to.getPitch();
|
this.lastPitch = to.getPitch();
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
Location oldTo = to.clone();
|
Location oldTo = to.clone();
|
||||||
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
|
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
|
||||||
this.cserver.getPluginManager().callEvent(event);
|
this.cserver.getPluginManager().callEvent(event);
|
||||||
@@ -771,6 +_,7 @@
|
@@ -741,6 +_,7 @@
|
||||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||||
if (packet.getId() == this.awaitingTeleport) {
|
if (packet.getId() == this.awaitingTeleport) {
|
||||||
if (this.awaitingPositionFromClient == null) {
|
if (this.awaitingPositionFromClient == null) {
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1339,6 +_,10 @@
|
@@ -1312,6 +_,10 @@
|
||||||
final int maxBookPageSize = pageMax.intValue();
|
final int maxBookPageSize = pageMax.intValue();
|
||||||
final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D);
|
final double multiplier = Math.clamp(io.papermc.paper.configuration.GlobalConfiguration.get().itemValidation.bookSize.totalMultiplier, 0.3D, 1D);
|
||||||
long byteAllowed = maxBookPageSize;
|
long byteAllowed = maxBookPageSize;
|
||||||
@@ -62,7 +62,7 @@
|
|||||||
for (final String page : pageList) {
|
for (final String page : pageList) {
|
||||||
final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
|
final int byteLength = page.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;
|
||||||
byteTotal += byteLength;
|
byteTotal += byteLength;
|
||||||
@@ -1363,7 +_,8 @@
|
@@ -1336,7 +_,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
if (byteTotal > byteAllowed) {
|
if (byteTotal > byteAllowed) {
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect
|
this.disconnectAsync(Component.literal("Book too large!"), org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION); // Paper - kick event cause // Paper - add proper async disconnect
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1382,31 +_,45 @@
|
@@ -1355,31 +_,45 @@
|
||||||
Optional<String> title = packet.title();
|
Optional<String> title = packet.title();
|
||||||
title.ifPresent(contents::add);
|
title.ifPresent(contents::add);
|
||||||
contents.addAll(packet.pages());
|
contents.addAll(packet.pages());
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
writtenBook.set(
|
writtenBook.set(
|
||||||
DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getPlainTextName(), 0, pages, true)
|
DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getPlainTextName(), 0, pages, true)
|
||||||
);
|
);
|
||||||
@@ -1419,6 +_,16 @@
|
@@ -1392,6 +_,16 @@
|
||||||
return this.player.isTextFilteringEnabled() ? Filterable.passThrough(text.filteredOrEmpty()) : Filterable.from(text);
|
return this.player.isTextFilteringEnabled() ? Filterable.passThrough(text.filteredOrEmpty()) : Filterable.from(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -139,7 +139,7 @@
|
|||||||
@Override
|
@Override
|
||||||
public void handleEntityTagQuery(final ServerboundEntityTagQueryPacket packet) {
|
public void handleEntityTagQuery(final ServerboundEntityTagQueryPacket packet) {
|
||||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||||
@@ -1458,7 +_,15 @@
|
@@ -1431,7 +_,15 @@
|
||||||
@Override
|
@Override
|
||||||
public void handleMovePlayer(final ServerboundMovePlayerPacket packet) {
|
public void handleMovePlayer(final ServerboundMovePlayerPacket packet) {
|
||||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||||
@@ -156,7 +156,7 @@
|
|||||||
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
this.disconnect(Component.translatable("multiplayer.disconnect.invalid_player_movement"), org.bukkit.event.player.PlayerKickEvent.Cause.INVALID_PLAYER_MOVEMENT); // Paper - kick event cause
|
||||||
} else {
|
} else {
|
||||||
ServerLevel level = this.player.level();
|
ServerLevel level = this.player.level();
|
||||||
@@ -1643,7 +_,7 @@
|
@@ -1615,7 +_,7 @@
|
||||||
movedWrongly = true;
|
movedWrongly = true;
|
||||||
if (event.getLogWarning())
|
if (event.getLogWarning())
|
||||||
// Paper end
|
// Paper end
|
||||||
@@ -165,7 +165,7 @@
|
|||||||
} // Paper
|
} // Paper
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1708,6 +_,8 @@
|
@@ -1670,6 +_,8 @@
|
||||||
this.lastYaw = to.getYaw();
|
this.lastYaw = to.getYaw();
|
||||||
this.lastPitch = to.getPitch();
|
this.lastPitch = to.getPitch();
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@
|
|||||||
Location oldTo = to.clone();
|
Location oldTo = to.clone();
|
||||||
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
|
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
|
||||||
this.cserver.getPluginManager().callEvent(event);
|
this.cserver.getPluginManager().callEvent(event);
|
||||||
@@ -1763,6 +_,13 @@
|
@@ -1725,6 +_,13 @@
|
||||||
this.player.tryResetCurrentImpulseContext();
|
this.player.tryResetCurrentImpulseContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@
|
|||||||
this.player.checkMovementStatistics(this.player.getX() - startX, this.player.getY() - startY, this.player.getZ() - startZ);
|
this.player.checkMovementStatistics(this.player.getX() - startX, this.player.getY() - startY, this.player.getZ() - startZ);
|
||||||
this.lastGoodX = this.player.getX();
|
this.lastGoodX = this.player.getX();
|
||||||
this.lastGoodY = this.player.getY();
|
this.lastGoodY = this.player.getY();
|
||||||
@@ -1783,6 +_,17 @@
|
@@ -1745,6 +_,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -206,7 +206,7 @@
|
|||||||
private boolean shouldCheckPlayerMovement(final boolean isFallFlying) {
|
private boolean shouldCheckPlayerMovement(final boolean isFallFlying) {
|
||||||
if (this.isSingleplayerOwner()) {
|
if (this.isSingleplayerOwner()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -2229,6 +_,7 @@
|
@@ -2158,6 +_,7 @@
|
||||||
|
|
||||||
boolean cancelled;
|
boolean cancelled;
|
||||||
if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) {
|
if (hitResult == null || hitResult.getType() != HitResult.Type.BLOCK) {
|
||||||
@@ -214,7 +214,7 @@
|
|||||||
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemStack, hand);
|
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemStack, hand);
|
||||||
cancelled = event.useItemInHand() == Event.Result.DENY;
|
cancelled = event.useItemInHand() == Event.Result.DENY;
|
||||||
} else {
|
} else {
|
||||||
@@ -2863,6 +_,7 @@
|
@@ -2801,6 +_,7 @@
|
||||||
ItemStack mainHandItem = this.player.getMainHandItem();
|
ItemStack mainHandItem = this.player.getMainHandItem();
|
||||||
if (this.player.isWithinAttackRange(mainHandItem, targetBounds, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience
|
if (this.player.isWithinAttackRange(mainHandItem, targetBounds, io.papermc.paper.configuration.GlobalConfiguration.get().misc.clientInteractionLeniencyDistance.or(3.0))) { // Paper - configurable lenience
|
||||||
if (!mainHandItem.has(DataComponents.PIERCING_WEAPON)) {
|
if (!mainHandItem.has(DataComponents.PIERCING_WEAPON)) {
|
||||||
@@ -222,7 +222,7 @@
|
|||||||
if (target instanceof ItemEntity
|
if (target instanceof ItemEntity
|
||||||
|| target instanceof ExperienceOrb
|
|| target instanceof ExperienceOrb
|
||||||
|| target == this.player
|
|| target == this.player
|
||||||
@@ -3644,7 +_,7 @@
|
@@ -3584,7 +_,7 @@
|
||||||
@Override
|
@Override
|
||||||
public void handleChangeGameMode(final ServerboundChangeGameModePacket packet) {
|
public void handleChangeGameMode(final ServerboundChangeGameModePacket packet) {
|
||||||
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
--- a/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||||
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
+++ b/net/minecraft/server/network/ServerLoginPacketListenerImpl.java
|
||||||
@@ -284,7 +_,7 @@
|
@@ -286,7 +_,7 @@
|
||||||
ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!");
|
ServerLoginPacketListenerImpl.LOGGER.warn("Failed to verify username but will let them in anyway!");
|
||||||
ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(name)); // Spigot
|
ServerLoginPacketListenerImpl.this.startClientVerification(ServerLoginPacketListenerImpl.this.createOfflineProfile(name)); // Spigot
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/server/players/PlayerList.java
|
--- a/net/minecraft/server/players/PlayerList.java
|
||||||
+++ b/net/minecraft/server/players/PlayerList.java
|
+++ b/net/minecraft/server/players/PlayerList.java
|
||||||
@@ -312,6 +_,7 @@
|
@@ -313,6 +_,7 @@
|
||||||
scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
|
scoreboard.addPlayerToTeam(player.getScoreboardName(), collideRuleTeam);
|
||||||
}
|
}
|
||||||
// Paper end - Configurable player collision
|
// Paper end - Configurable player collision
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
// CraftBukkit start - moved down
|
// CraftBukkit start - moved down
|
||||||
LOGGER.info(
|
LOGGER.info(
|
||||||
"{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", // Paper - add world identifier
|
"{}[{}] logged in with entity id {} at ([{}]{}, {}, {})", // Paper - add world identifier
|
||||||
@@ -432,6 +_,7 @@
|
@@ -433,6 +_,7 @@
|
||||||
}
|
}
|
||||||
public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player, final net.kyori.adventure.text.Component leaveMessage) {
|
public net.kyori.adventure.text.@Nullable Component remove(final ServerPlayer player, final net.kyori.adventure.text.Component leaveMessage) {
|
||||||
// Paper end - Fix kick event leave message not being sent
|
// Paper end - Fix kick event leave message not being sent
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
ServerLevel level = player.level();
|
ServerLevel level = player.level();
|
||||||
player.awardStat(Stats.LEAVE_GAME);
|
player.awardStat(Stats.LEAVE_GAME);
|
||||||
// CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it
|
// CraftBukkit start - Quitting must be before we do final save of data, in case plugins need to modify it
|
||||||
@@ -768,6 +_,20 @@
|
@@ -769,6 +_,20 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
public void broadcastAll(final Packet<?> packet, final ResourceKey<Level> dimension) {
|
public void broadcastAll(final Packet<?> packet, final ResourceKey<Level> dimension) {
|
||||||
for (ServerPlayer player : this.players) {
|
for (ServerPlayer player : this.players) {
|
||||||
if (player.level().dimension() == dimension) {
|
if (player.level().dimension() == dimension) {
|
||||||
@@ -861,6 +_,7 @@
|
@@ -862,6 +_,7 @@
|
||||||
case ADMINS -> EntityEvent.PERMISSION_LEVEL_ADMINS;
|
case ADMINS -> EntityEvent.PERMISSION_LEVEL_ADMINS;
|
||||||
case OWNERS -> EntityEvent.PERMISSION_LEVEL_OWNERS;
|
case OWNERS -> EntityEvent.PERMISSION_LEVEL_OWNERS;
|
||||||
};
|
};
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
player.connection.send(new ClientboundEntityEventPacket(player, eventId));
|
player.connection.send(new ClientboundEntityEventPacket(player, eventId));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -872,7 +_,7 @@
|
@@ -873,7 +_,7 @@
|
||||||
|
|
||||||
// Paper start - whitelist verify event / login event
|
// Paper start - whitelist verify event / login event
|
||||||
public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) {
|
public LoginResult canBypassFullServerLogin(final NameAndId nameAndId, final LoginResult currentResult) {
|
||||||
|
|||||||
@@ -1,170 +1,11 @@
|
|||||||
--- a/net/minecraft/world/entity/Entity.java
|
--- a/net/minecraft/world/entity/Entity.java
|
||||||
+++ b/net/minecraft/world/entity/Entity.java
|
+++ b/net/minecraft/world/entity/Entity.java
|
||||||
@@ -168,6 +_,7 @@
|
@@ -381,7 +_,7 @@
|
||||||
SlotProvider,
|
|
||||||
DebugValueSource,
|
|
||||||
TypedInstance<EntityType<?>>, ca.spottedleaf.moonrise.patches.chunk_system.entity.ChunkSystemEntity, ca.spottedleaf.moonrise.patches.entity_tracker.EntityTrackerEntity { // Paper - rewrite chunk system // Paper - optimise entity tracker
|
|
||||||
+ public static javax.script.ScriptEngine scriptEngine = new javax.script.ScriptEngineManager().getEngineByName("rhino"); // Purpur - Configurable entity base attributes
|
|
||||||
// CraftBukkit start
|
|
||||||
private static final int CURRENT_LEVEL = 2;
|
|
||||||
static boolean isLevelAtLeast(ValueInput input, int level) {
|
|
||||||
@@ -297,8 +_,9 @@
|
|
||||||
public double xOld;
|
|
||||||
public double yOld;
|
|
||||||
public double zOld;
|
|
||||||
+ public float maxUpStep; // Purpur - Add option to set armorstand step height
|
|
||||||
public boolean noPhysics;
|
|
||||||
- public final RandomSource random = SHARED_RANDOM; // Paper - Share random for entities to make them more random
|
|
||||||
+ public final RandomSource random; // Paper - Share random for entities to make them more random // Purpur - Add toggle for RNG manipulation
|
|
||||||
public int tickCount;
|
|
||||||
private int remainingFireTicks;
|
|
||||||
private final EntityFluidInteraction fluidInteraction = new EntityFluidInteraction(Set.of(FluidTags.WATER, FluidTags.LAVA));
|
|
||||||
@@ -330,8 +_,8 @@
|
|
||||||
public @Nullable PortalProcessor portalProcess;
|
|
||||||
public int portalCooldown;
|
|
||||||
private boolean invulnerable;
|
|
||||||
- protected UUID uuid = Mth.createInsecureUUID(this.random);
|
|
||||||
- protected String stringUUID = this.uuid.toString();
|
|
||||||
+ protected UUID uuid; // Purpur - Add toggle for RNG manipulation
|
|
||||||
+ protected String stringUUID; // Purpur - Add toggle for RNG manipulation
|
|
||||||
private boolean hasGlowingTag;
|
|
||||||
private final Set<String> tags = new io.papermc.paper.util.SizeLimitedSet<>(new it.unimi.dsi.fastutil.objects.ObjectOpenHashSet<>(), MAX_ENTITY_TAG_COUNT); // Paper - fully limit tag size - replace set impl
|
private final Set<String> tags = new io.papermc.paper.util.SizeLimitedSet<>(new it.unimi.dsi.fastutil.objects.ObjectOpenHashSet<>(), MAX_ENTITY_TAG_COUNT); // Paper - fully limit tag size - replace set impl
|
||||||
private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0};
|
private final double[] pistonDeltas = new double[]{0.0, 0.0, 0.0};
|
||||||
@@ -382,6 +_,7 @@
|
private long pistonDeltasGameTime;
|
||||||
private final int despawnTime; // Paper - entity despawn time limit
|
- protected EntityDimensions dimensions;
|
||||||
public int totalEntityAge; // Paper - age-like counter for all entities
|
+ private EntityDimensions dimensions;
|
||||||
public final io.papermc.paper.entity.activation.ActivationType activationType = io.papermc.paper.entity.activation.ActivationType.activationTypeFor(this); // Paper - EAR 2/tracking ranges
|
private float eyeHeight;
|
||||||
+ public @Nullable Boolean immuneToFire = null; // Purpur - Fire immune API
|
public boolean isInPowderSnow;
|
||||||
// Paper start - EAR 2
|
public boolean wasInPowderSnow;
|
||||||
public final boolean defaultActivationState;
|
|
||||||
public long activatedTick = Integer.MIN_VALUE;
|
|
||||||
@@ -549,10 +_,22 @@
|
|
||||||
}
|
|
||||||
// Paper end - optimise entity tracker
|
|
||||||
|
|
||||||
+ // Purpur start - Add canSaveToDisk to Entity
|
|
||||||
+ public boolean canSaveToDisk() {
|
|
||||||
+ return true;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Add canSaveToDisk to Entity
|
|
||||||
+
|
|
||||||
public Entity(final EntityType<?> type, final Level level) {
|
|
||||||
this.type = type;
|
|
||||||
this.level = level;
|
|
||||||
this.dimensions = type.getDimensions();
|
|
||||||
+ this.maxAirTicks = level == null || this.getDefaultMaxAirSupply() != Entity.TOTAL_AIR_SUPPLY ? this.getDefaultMaxAirSupply() : this.level.purpurConfig.drowningAirTicks; // Purpur - Drowning Settings
|
|
||||||
+ // Purpur start - Add toggle for RNG manipulation
|
|
||||||
+ this.random = level == null || level.purpurConfig.entitySharedRandom ? SHARED_RANDOM : RandomSource.create();
|
|
||||||
+ this.uuid = Mth.createInsecureUUID(this.random);
|
|
||||||
+ this.stringUUID = this.uuid.toString();
|
|
||||||
+ // Purpur end - Add toggle for RNG manipulation
|
|
||||||
this.position = Vec3.ZERO;
|
|
||||||
this.blockPosition = BlockPos.ZERO;
|
|
||||||
this.chunkPosition = ChunkPos.ZERO;
|
|
||||||
@@ -950,6 +_,7 @@
|
|
||||||
&& this.level.paperConfig().environment.netherCeilingVoidDamageHeight.test(v -> this.getY() >= v)
|
|
||||||
&& (!(this instanceof Player player) || !player.getAbilities().invulnerable))) {
|
|
||||||
// Paper end - Configurable nether ceiling damage
|
|
||||||
+ if (this.level.purpurConfig.teleportOnNetherCeilingDamage && this.level.getWorld().getEnvironment() == org.bukkit.World.Environment.NETHER && this instanceof ServerPlayer player) player.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level.levelData.getRespawnData().pos(), this.level)); else // Purpur - Add option to teleport to spawn on nether ceiling damage
|
|
||||||
this.onBelowWorld();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2007,7 +_,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean fireImmune() {
|
|
||||||
- return this.getType().fireImmune();
|
|
||||||
+ return this.immuneToFire != null ? immuneToFire : this.getType().fireImmune(); // Purpur - add fire immune API
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean causeFallDamage(final double fallDistance, final float damageModifier, final DamageSource damageSource) {
|
|
||||||
@@ -2593,7 +_,7 @@
|
|
||||||
output.putBoolean("Bukkit.invisible", this.persistentInvisibility);
|
|
||||||
}
|
|
||||||
// SPIGOT-6907: re-implement LivingEntity#setMaximumAir()
|
|
||||||
- if (this.maxAirTicks != this.getDefaultMaxAirSupply()) {
|
|
||||||
+ if (this.maxAirTicks != this.getDefaultMaxAirSupply() && this.getDefaultMaxAirSupply() != this.level().purpurConfig.drowningAirTicks) { // Purpur - Drowning Settings
|
|
||||||
output.putInt("Bukkit.MaxAirSupply", this.getMaxAirSupply());
|
|
||||||
}
|
|
||||||
output.putInt("Spigot.ticksLived", this.totalEntityAge); // Paper
|
|
||||||
@@ -2679,6 +_,11 @@
|
|
||||||
output.putBoolean("Paper.FreezeLock", true);
|
|
||||||
}
|
|
||||||
// Paper end
|
|
||||||
+ // Purpur start - Fire immune API
|
|
||||||
+ if (immuneToFire != null) {
|
|
||||||
+ output.putBoolean("Purpur.FireImmune", immuneToFire);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Fire immune API
|
|
||||||
} catch (Throwable t) {
|
|
||||||
CrashReport report = CrashReport.forThrowable(t, "Saving entity NBT");
|
|
||||||
CrashReportCategory category = report.addCategory("Entity being saved");
|
|
||||||
@@ -2802,6 +_,9 @@
|
|
||||||
}
|
|
||||||
freezeLocked = input.getBooleanOr("Paper.FreezeLock", false);
|
|
||||||
// Paper end
|
|
||||||
+
|
|
||||||
+ immuneToFire = input.read("Purpur.FireImmune", com.mojang.serialization.Codec.BOOL).orElse(null); // Purpur - Fire immune API
|
|
||||||
+
|
|
||||||
} catch (Throwable t) {
|
|
||||||
CrashReport report = CrashReport.forThrowable(t, "Loading entity NBT");
|
|
||||||
CrashReportCategory category = report.addCategory("Entity being loaded");
|
|
||||||
@@ -3067,6 +_,7 @@
|
|
||||||
if (this.isAlive() && this instanceof Leashable leashable) {
|
|
||||||
if (leashable.getLeashHolder() == player) {
|
|
||||||
if (!this.level().isClientSide()) {
|
|
||||||
+ if (hand == InteractionHand.OFF_HAND && (level().purpurConfig.villagerCanBeLeashed || level().purpurConfig.wanderingTraderCanBeLeashed) && this instanceof net.minecraft.world.entity.npc.villager.AbstractVillager) return InteractionResult.CONSUME; // Purpur - Allow leashing villagers
|
|
||||||
// Paper start - EntityUnleashEvent
|
|
||||||
if (!org.bukkit.craftbukkit.event.CraftEventFactory.handlePlayerUnleashEntityEvent(
|
|
||||||
leashable, player, hand, !player.hasInfiniteMaterials(), true
|
|
||||||
@@ -3500,15 +_,18 @@
|
|
||||||
return Vec3.directionFromRotation(this.getRotationVector());
|
|
||||||
}
|
|
||||||
|
|
||||||
+ public BlockPos portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals
|
|
||||||
public void setAsInsidePortal(final Portal portal, final BlockPos pos) {
|
|
||||||
if (this.isOnPortalCooldown()) {
|
|
||||||
+ if (!(level().purpurConfig.playerFixStuckPortal && this instanceof Player && !pos.equals(this.portalPos))) // Purpur - Fix stuck in portals
|
|
||||||
this.setPortalCooldown();
|
|
||||||
- } else {
|
|
||||||
+ } else if (this.level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer) { // Purpur - Entities can use portals
|
|
||||||
if (this.portalProcess == null || !this.portalProcess.isSamePortal(portal)) {
|
|
||||||
this.portalProcess = new PortalProcessor(portal, pos.immutable());
|
|
||||||
} else if (!this.portalProcess.isInsidePortalThisTick()) {
|
|
||||||
this.portalProcess.updateEntryPosition(pos.immutable());
|
|
||||||
this.portalProcess.setAsInsidePortalThisTick(true);
|
|
||||||
+ this.portalPos = BlockPos.ZERO; // Purpur - Fix stuck in portals
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4238,7 +_,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canUsePortal(final boolean ignorePassenger) {
|
|
||||||
- return (ignorePassenger || !this.isPassenger()) && this.isAlive();
|
|
||||||
+ return (ignorePassenger || !this.isPassenger()) && this.isAlive() && (this.level.purpurConfig.entitiesCanUsePortals || this instanceof ServerPlayer); // Purpur - Entities can use portals
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean canTeleport(final Level from, final Level to) {
|
|
||||||
@@ -4788,6 +_,12 @@
|
|
||||||
return Mth.lerp(partial, this.yRotO, this.yRot);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start - Stop squids floating on top of water
|
|
||||||
+ public AABB getAxisForFluidCheck() {
|
|
||||||
+ return this.getBoundingBox().deflate(0.001D);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Stop squids floating on top of water
|
|
||||||
+
|
|
||||||
public boolean touchingUnloadedChunk() {
|
|
||||||
AABB box = this.getBoundingBox().inflate(1.0);
|
|
||||||
int x0 = Mth.floor(box.minX);
|
|
||||||
@@ -5091,7 +_,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
public float maxUpStep() {
|
|
||||||
- return 0.0F;
|
|
||||||
+ return maxUpStep; // Purpur - Add option to set armorstand step height
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onExplosionHit(final @Nullable Entity explosionCausedBy) {
|
|
||||||
|
|||||||
@@ -1,44 +1,11 @@
|
|||||||
--- a/net/minecraft/world/entity/EntityType.java
|
--- a/net/minecraft/world/entity/EntityType.java
|
||||||
+++ b/net/minecraft/world/entity/EntityType.java
|
+++ b/net/minecraft/world/entity/EntityType.java
|
||||||
@@ -1238,6 +_,16 @@
|
@@ -69,7 +_,7 @@
|
||||||
return register(vanillaEntityId(vanillaId), builder);
|
private final String descriptionId;
|
||||||
}
|
private @Nullable Component description;
|
||||||
|
private final Optional<ResourceKey<LootTable>> lootTable;
|
||||||
+ // Purpur start - PlayerSetSpawnerTypeWithEggEvent
|
- public EntityDimensions dimensions;
|
||||||
+ public static EntityType<?> getFromBukkitType(org.bukkit.entity.EntityType bukkitType) {
|
+ private final EntityDimensions dimensions;
|
||||||
+ return getFromKey(Identifier.parse(bukkitType.getKey().toString()));
|
private final float spawnDimensionsScale;
|
||||||
+ }
|
private final FeatureFlagSet requiredFeatures;
|
||||||
+
|
private final boolean allowedInPeaceful;
|
||||||
+ public static EntityType<?> getFromKey(Identifier location) {
|
|
||||||
+ return BuiltInRegistries.ENTITY_TYPE.getValue(location);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - PlayerSetSpawnerTypeWithEggEvent
|
|
||||||
+
|
|
||||||
public static Identifier getKey(final EntityType<?> type) {
|
|
||||||
return BuiltInRegistries.ENTITY_TYPE.getKey(type);
|
|
||||||
}
|
|
||||||
@@ -1495,6 +_,16 @@
|
|
||||||
return this.category;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start - PlayerSetSpawnerTypeWithEggEvent
|
|
||||||
+ public String getName() {
|
|
||||||
+ return BuiltInRegistries.ENTITY_TYPE.getKey(this).getPath();
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ public String getTranslatedName() {
|
|
||||||
+ return getDescription().getString();
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - PlayerSetSpawnerTypeWithEggEvent
|
|
||||||
+
|
|
||||||
public String getDescriptionId() {
|
|
||||||
return this.descriptionId;
|
|
||||||
}
|
|
||||||
@@ -1556,6 +_,7 @@
|
|
||||||
// Paper start - Add logging for debugging entity tags with invalid ids
|
|
||||||
() -> {
|
|
||||||
LOGGER.warn("Skipping Entity with id {}", input.getStringOr("id", "[invalid]"));
|
|
||||||
+ LOGGER.warn("Location: {} {}", level.getWorld().getName(), input.read("Pos", net.minecraft.world.phys.Vec3.CODEC).orElse(net.minecraft.world.phys.Vec3.ZERO)); // Purpur - log skipped entity's position
|
|
||||||
if ((DEBUG_ENTITIES_WITH_INVALID_IDS || level.getCraftServer().getServer().isDebugging()) && input instanceof TagValueInput tagInput) {
|
|
||||||
LOGGER.warn("Skipped entity tag: {}", tagInput.input);
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/ExperienceOrb.java
|
--- a/net/minecraft/world/entity/ExperienceOrb.java
|
||||||
+++ b/net/minecraft/world/entity/ExperienceOrb.java
|
+++ b/net/minecraft/world/entity/ExperienceOrb.java
|
||||||
@@ -352,7 +_,7 @@
|
@@ -357,7 +_,7 @@
|
||||||
public void playerTouch(final Player player) {
|
public void playerTouch(final Player player) {
|
||||||
if (player instanceof ServerPlayer serverPlayer) {
|
if (player instanceof ServerPlayer serverPlayer) {
|
||||||
if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent
|
if (player.takeXpDelay == 0 && new com.destroystokyo.paper.event.player.PlayerPickupExperienceEvent(serverPlayer.getBukkitEntity(), (org.bukkit.entity.ExperienceOrb) this.getBukkitEntity()).callEvent()) { // Paper - PlayerPickupExperienceEvent
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
player.take(this, 1);
|
player.take(this, 1);
|
||||||
int remaining = this.repairPlayerItems(serverPlayer, this.getValue());
|
int remaining = this.repairPlayerItems(serverPlayer, this.getValue());
|
||||||
if (remaining > 0) {
|
if (remaining > 0) {
|
||||||
@@ -368,7 +_,8 @@
|
@@ -373,7 +_,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
private int repairPlayerItems(final ServerPlayer player, final int amount) {
|
private int repairPlayerItems(final ServerPlayer player, final int amount) {
|
||||||
|
|||||||
@@ -1,177 +1,11 @@
|
|||||||
--- a/net/minecraft/world/entity/LivingEntity.java
|
--- a/net/minecraft/world/entity/LivingEntity.java
|
||||||
+++ b/net/minecraft/world/entity/LivingEntity.java
|
+++ b/net/minecraft/world/entity/LivingEntity.java
|
||||||
@@ -441,6 +_,12 @@
|
@@ -3914,7 +_,7 @@
|
||||||
if (dist < 0.0) {
|
}
|
||||||
double damagePerBlock = level.getWorldBorder().getDamagePerBlock();
|
|
||||||
if (damagePerBlock > 0.0) {
|
|
||||||
+ // Purpur start - Add option to teleport to spawn if outside world border
|
|
||||||
+ if (this.level().purpurConfig.teleportIfOutsideBorder && this instanceof ServerPlayer serverPlayer) {
|
|
||||||
+ serverPlayer.teleport(org.bukkit.craftbukkit.util.CraftLocation.toBukkit(this.level().levelData.getRespawnData().pos(), this.level()));
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Add option to teleport to spawn if outside world border
|
|
||||||
this.hurtServer(level, this.damageSources().outOfBorder(), Math.max(1, Mth.floor(-dist * damagePerBlock)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -456,7 +_,7 @@
|
|
||||||
if (this.shouldTakeDrowningDamage()) {
|
|
||||||
this.setAirSupply(0);
|
|
||||||
level.broadcastEntityEvent(this, EntityEvent.DROWN_PARTICLES);
|
|
||||||
- this.hurtServer(level, this.damageSources().drown(), 2.0F);
|
|
||||||
+ this.hurtServer(level, this.damageSources().drown(), (float) this.level().purpurConfig.damageFromDrowning); // Purpur - Drowning Settings
|
|
||||||
}
|
|
||||||
} else if (this.getAirSupply() < this.getMaxAirSupply() && MobEffectUtil.shouldEffectsRefillAirsupply(this)) {
|
|
||||||
this.setAirSupply(this.increaseAirSupply(this.getAirSupply()));
|
|
||||||
@@ -516,7 +_,7 @@
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean shouldTakeDrowningDamage() {
|
- public boolean canGlide() {
|
||||||
- return this.getAirSupply() <= -20;
|
+ protected boolean canGlide() {
|
||||||
+ return this.getAirSupply() <= -this.level().purpurConfig.drowningDamageInterval; // Purpur - Drowning Settings
|
if (!this.onGround() && !this.isPassenger() && !this.hasEffect(MobEffects.LEVITATION)) {
|
||||||
}
|
for (EquipmentSlot slot : EquipmentSlot.VALUES) {
|
||||||
|
if (canGlideUsing(this.getItemBySlot(slot), slot)) {
|
||||||
@Override
|
|
||||||
@@ -1048,15 +_,33 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
if (targetingEntity != null) {
|
|
||||||
- ItemStack itemStack = this.getItemBySlot(EquipmentSlot.HEAD);
|
|
||||||
- if (targetingEntity.is(EntityType.SKELETON) && itemStack.is(Items.SKELETON_SKULL)
|
|
||||||
- || targetingEntity.is(EntityType.ZOMBIE) && itemStack.is(Items.ZOMBIE_HEAD)
|
|
||||||
- || targetingEntity.is(EntityType.PIGLIN) && itemStack.is(Items.PIGLIN_HEAD)
|
|
||||||
- || targetingEntity.is(EntityType.PIGLIN_BRUTE) && itemStack.is(Items.PIGLIN_HEAD)
|
|
||||||
- || targetingEntity.is(EntityType.CREEPER) && itemStack.is(Items.CREEPER_HEAD)) {
|
|
||||||
- visibilityPercent *= 0.5;
|
|
||||||
- }
|
|
||||||
- }
|
|
||||||
+ ItemStack itemBySlot = this.getItemBySlot(EquipmentSlot.HEAD);
|
|
||||||
+ // Purpur start - Mob head visibility percent
|
|
||||||
+ if (targetingEntity.is(EntityType.SKELETON) && itemBySlot.is(Items.SKELETON_SKULL)) {
|
|
||||||
+ visibilityPercent *= targetingEntity.level().purpurConfig.skeletonHeadVisibilityPercent;
|
|
||||||
+ }
|
|
||||||
+ else if (targetingEntity.is(EntityType.ZOMBIE) && itemBySlot.is(Items.ZOMBIE_HEAD)) {
|
|
||||||
+ visibilityPercent *= targetingEntity.level().purpurConfig.zombieHeadVisibilityPercent;
|
|
||||||
+ }
|
|
||||||
+ else if ((targetingEntity.is(EntityType.PIGLIN) || targetingEntity.is(EntityType.PIGLIN_BRUTE)) && itemBySlot.is(Items.PIGLIN_HEAD)) {
|
|
||||||
+ visibilityPercent *= targetingEntity.level().purpurConfig.piglinHeadVisibilityPercent;
|
|
||||||
+ }
|
|
||||||
+ else if (targetingEntity.is(EntityType.CREEPER) && itemBySlot.is(Items.CREEPER_HEAD)) {
|
|
||||||
+ visibilityPercent *= targetingEntity.level().purpurConfig.creeperHeadVisibilityPercent;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Mob head visibility percent
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ // Purpur start - Configurable mob blindness
|
|
||||||
+ if (targetingEntity instanceof LivingEntity entityliving) {
|
|
||||||
+ if (entityliving.hasEffect(MobEffects.BLINDNESS)) {
|
|
||||||
+ int amplifier = entityliving.getEffect(MobEffects.BLINDNESS).getAmplifier();
|
|
||||||
+ for (int i = 0; i < amplifier; i++) {
|
|
||||||
+ amplifier *= this.level().purpurConfig.mobsBlindnessMultiplier;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Configurable mob blindness
|
|
||||||
|
|
||||||
return visibilityPercent;
|
|
||||||
}
|
|
||||||
@@ -1106,6 +_,7 @@
|
|
||||||
Iterator<MobEffectInstance> iterator = this.activeEffects.values().iterator();
|
|
||||||
while (iterator.hasNext()) {
|
|
||||||
MobEffectInstance effect = iterator.next();
|
|
||||||
+ if (cause == EntityPotionEffectEvent.Cause.MILK && !this.level().purpurConfig.milkClearsBeneficialEffects && effect.getEffect().value().isBeneficial()) continue; // Purpur - Milk Keeps Beneficial Effects
|
|
||||||
EntityPotionEffectEvent event = CraftEventFactory.callEntityPotionEffectChangeEvent(this, effect, null, cause, EntityPotionEffectEvent.Action.CLEARED);
|
|
||||||
if (event.isCancelled()) {
|
|
||||||
continue;
|
|
||||||
@@ -1438,7 +_,23 @@
|
|
||||||
this.stopSleeping();
|
|
||||||
}
|
|
||||||
|
|
||||||
- this.noActionTime = 0;
|
|
||||||
+ // Purpur start - One Punch Man!
|
|
||||||
+ if (source.getEntity() instanceof net.minecraft.world.entity.player.Player player && source.getEntity().level().purpurConfig.creativeOnePunch && !source.is(DamageTypeTags.IS_PROJECTILE)) {
|
|
||||||
+ if (player.isCreative()) {
|
|
||||||
+ org.apache.commons.lang3.mutable.MutableDouble attackDamage = new org.apache.commons.lang3.mutable.MutableDouble();
|
|
||||||
+ player.getMainHandItem().forEachModifier(EquipmentSlot.MAINHAND, (attributeHolder, attributeModifier) -> {
|
|
||||||
+ if (attributeModifier.operation() == AttributeModifier.Operation.ADD_VALUE) {
|
|
||||||
+ attackDamage.addAndGet(attributeModifier.amount());
|
|
||||||
+ }
|
|
||||||
+ });
|
|
||||||
+
|
|
||||||
+ if (attackDamage.doubleValue() == 0.0D) {
|
|
||||||
+ // One punch!
|
|
||||||
+ damage = this.getHealth();
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - One Punch Man!this.noActionTime = 0;
|
|
||||||
if (damage < 0.0F) {
|
|
||||||
damage = 0.0F;
|
|
||||||
}
|
|
||||||
@@ -1699,10 +_,10 @@
|
|
||||||
protected @Nullable Player resolvePlayerResponsibleForDamage(final DamageSource source) {
|
|
||||||
Entity sourceEntity = source.getEntity();
|
|
||||||
if (sourceEntity instanceof Player playerSource) {
|
|
||||||
- this.setLastHurtByPlayer(playerSource, 100);
|
|
||||||
+ this.setLastHurtByPlayer(playerSource, this.level().purpurConfig.mobLastHurtByPlayerTime); // Purpur - Config for mob last hurt by player time
|
|
||||||
} else if (sourceEntity instanceof Wolf wolf && wolf.isTame()) {
|
|
||||||
if (wolf.getOwnerReference() != null) {
|
|
||||||
- this.setLastHurtByPlayer(wolf.getOwnerReference().getUUID(), 100);
|
|
||||||
+ this.setLastHurtByPlayer(wolf.getOwnerReference().getUUID(), this.level().purpurConfig.mobLastHurtByPlayerTime); // Purpur - Config for mob last hurt by player time
|
|
||||||
} else {
|
|
||||||
this.lastHurtByPlayer = null;
|
|
||||||
this.lastHurtByPlayerMemoryTime = 0;
|
|
||||||
@@ -1754,6 +_,17 @@
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start - Totems work in inventory
|
|
||||||
+ if (level().purpurConfig.totemOfUndyingWorksInInventory && this instanceof ServerPlayer player && (itemStack == null || itemStack.getItem() != Items.TOTEM_OF_UNDYING) && player.getBukkitEntity().hasPermission("purpur.inventory_totem")) {
|
|
||||||
+ for (ItemStack item : player.getInventory().getNonEquipmentItems()) {
|
|
||||||
+ if (item.getItem() == Items.TOTEM_OF_UNDYING) {
|
|
||||||
+ itemStack = item;
|
|
||||||
+ protectionItem = item.copy();
|
|
||||||
+ break;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Totems work in inventory
|
|
||||||
final org.bukkit.inventory.EquipmentSlot handSlot = (usedHand != null) ? org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(usedHand) : null;
|
|
||||||
final EntityResurrectEvent event = new EntityResurrectEvent((org.bukkit.entity.LivingEntity) this.getBukkitEntity(), handSlot);
|
|
||||||
event.setCancelled(protectionItem == null);
|
|
||||||
@@ -1927,6 +_,7 @@
|
|
||||||
boolean playerKilled = this.lastHurtByPlayerMemoryTime > 0;
|
|
||||||
this.dropEquipment(level); // CraftBukkit - from below
|
|
||||||
if (this.shouldDropLoot(level)) {
|
|
||||||
+ if (!(source.is(net.minecraft.world.damagesource.DamageTypes.CRAMMING) && level().purpurConfig.disableDropsOnCrammingDeath)) { // Purpur - Disable loot drops on death by cramming
|
|
||||||
this.dropFromLootTable(level, source, playerKilled);
|
|
||||||
// Paper start
|
|
||||||
final boolean prev = this.clearEquipmentSlots;
|
|
||||||
@@ -1935,6 +_,7 @@
|
|
||||||
// Paper end
|
|
||||||
this.dropCustomDeathLoot(level, source, playerKilled);
|
|
||||||
this.clearEquipmentSlots = prev; // Paper
|
|
||||||
+ } // Purpur - Disable loot drops on death by cramming
|
|
||||||
}
|
|
||||||
|
|
||||||
// CraftBukkit start - Call death event // Paper start - call advancement triggers with correct entity equipment
|
|
||||||
@@ -3264,6 +_,7 @@
|
|
||||||
float dmg = (float)(diff * 10.0 - 3.0);
|
|
||||||
if (dmg > 0.0F) {
|
|
||||||
this.playSound(this.getFallDamageSound((int)dmg), 1.0F, 1.0F);
|
|
||||||
+ if (level().purpurConfig.elytraKineticDamage) // Purpur - Toggle for kinetic damage
|
|
||||||
this.hurt(this.damageSources().flyIntoWall(), dmg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -4749,6 +_,12 @@
|
|
||||||
? slot == EquipmentSlot.MAINHAND && this.canUseSlot(EquipmentSlot.MAINHAND)
|
|
||||||
: slot == equippable.slot() && this.canUseSlot(equippable.slot()) && equippable.canBeEquippedBy(this.typeHolder());
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+ // Purpur start - Dispenser curse of binding protection
|
|
||||||
+ public @Nullable EquipmentSlot getEquipmentSlotForDispenserItem(ItemStack itemstack) {
|
|
||||||
+ return EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.BINDING_CURSE, itemstack) > 0 ? null : this.getEquipmentSlotForItem(itemstack);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Dispenser curse of binding protection
|
|
||||||
|
|
||||||
private static SlotAccess createEquipmentSlotAccess(final LivingEntity entity, final EquipmentSlot equipmentSlot) {
|
|
||||||
return equipmentSlot != EquipmentSlot.HEAD && equipmentSlot != EquipmentSlot.MAINHAND && equipmentSlot != EquipmentSlot.OFFHAND
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/Mob.java
|
--- a/net/minecraft/world/entity/Mob.java
|
||||||
+++ b/net/minecraft/world/entity/Mob.java
|
+++ b/net/minecraft/world/entity/Mob.java
|
||||||
@@ -150,6 +_,7 @@
|
@@ -155,6 +_,7 @@
|
||||||
private int homeRadius = -1;
|
private int homeRadius = -1;
|
||||||
public boolean aware = true; // CraftBukkit
|
public boolean aware = true; // CraftBukkit
|
||||||
public net.kyori.adventure.util.TriState despawnInPeacefulOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - allow changing despawnInPeaceful
|
public net.kyori.adventure.util.TriState despawnInPeacefulOverride = net.kyori.adventure.util.TriState.NOT_SET; // Paper - allow changing despawnInPeaceful
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
protected Mob(final EntityType<? extends Mob> type, final Level level) {
|
protected Mob(final EntityType<? extends Mob> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -304,6 +_,7 @@
|
@@ -309,6 +_,7 @@
|
||||||
target = null;
|
target = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
this.target = target;
|
this.target = target;
|
||||||
return true;
|
return true;
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
@@ -347,7 +_,27 @@
|
@@ -352,7 +_,27 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
profiler.pop();
|
profiler.pop();
|
||||||
@@ -45,7 +45,7 @@
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void playHurtSound(final DamageSource source) {
|
protected void playHurtSound(final DamageSource source) {
|
||||||
@@ -451,6 +_,7 @@
|
@@ -456,6 +_,7 @@
|
||||||
output.putString("Paper.DespawnInPeacefulOverride", this.despawnInPeacefulOverride.name());
|
output.putString("Paper.DespawnInPeacefulOverride", this.despawnInPeacefulOverride.name());
|
||||||
}
|
}
|
||||||
// Paper end - allow changing despawnInPeaceful
|
// Paper end - allow changing despawnInPeaceful
|
||||||
@@ -53,7 +53,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -478,6 +_,7 @@
|
@@ -483,6 +_,7 @@
|
||||||
this.lootTableSeed = input.getLongOr("DeathLootTableSeed", 0L);
|
this.lootTableSeed = input.getLongOr("DeathLootTableSeed", 0L);
|
||||||
this.setNoAi(input.getBooleanOr("NoAI", false));
|
this.setNoAi(input.getBooleanOr("NoAI", false));
|
||||||
this.aware = input.getBooleanOr("Bukkit.Aware", true); // CraftBukkit
|
this.aware = input.getBooleanOr("Bukkit.Aware", true); // CraftBukkit
|
||||||
@@ -61,7 +61,7 @@
|
|||||||
// Paper start - allow changing despawnInPeaceful
|
// Paper start - allow changing despawnInPeaceful
|
||||||
this.despawnInPeacefulOverride = readDespawnInPeacefulOverride(input);
|
this.despawnInPeacefulOverride = readDespawnInPeacefulOverride(input);
|
||||||
}
|
}
|
||||||
@@ -1257,7 +_,7 @@
|
@@ -1289,7 +_,7 @@
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
return groupData;
|
return groupData;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1614,6 +_,7 @@
|
@@ -1646,6 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.postPiercingAttack();
|
this.postPiercingAttack();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/cow/AbstractCow.java
|
--- a/net/minecraft/world/entity/animal/cow/AbstractCow.java
|
||||||
+++ b/net/minecraft/world/entity/animal/cow/AbstractCow.java
|
+++ b/net/minecraft/world/entity/animal/cow/AbstractCow.java
|
||||||
@@ -40,7 +_,7 @@
|
@@ -41,7 +_,7 @@
|
||||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||||
this.goalSelector.addGoal(1, new PanicGoal(this, 2.0));
|
this.goalSelector.addGoal(1, new PanicGoal(this, 2.0));
|
||||||
this.goalSelector.addGoal(2, new BreedGoal(this, 1.0));
|
this.goalSelector.addGoal(2, new BreedGoal(this, 1.0));
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
|
this.goalSelector.addGoal(4, new FollowParentGoal(this, 1.25));
|
||||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
||||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
||||||
@@ -100,6 +_,10 @@
|
@@ -101,6 +_,10 @@
|
||||||
ItemStack bucketOrMilkBucket = ItemUtils.createFilledResult(itemStack, player, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit
|
ItemStack bucketOrMilkBucket = ItemUtils.createFilledResult(itemStack, player, org.bukkit.craftbukkit.inventory.CraftItemStack.asNMSCopy(event.getItemStack())); // CraftBukkit
|
||||||
player.setItemInHand(hand, bucketOrMilkBucket);
|
player.setItemInHand(hand, bucketOrMilkBucket);
|
||||||
return InteractionResult.SUCCESS;
|
return InteractionResult.SUCCESS;
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
} else {
|
} else {
|
||||||
return super.mobInteract(player, hand);
|
return super.mobInteract(player, hand);
|
||||||
}
|
}
|
||||||
@@ -109,4 +_,67 @@
|
@@ -110,4 +_,67 @@
|
||||||
public EntityDimensions getDefaultDimensions(final Pose pose) {
|
public EntityDimensions getDefaultDimensions(final Pose pose) {
|
||||||
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
|
return this.isBaby() ? BABY_DIMENSIONS : super.getDefaultDimensions(pose);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java
|
--- a/net/minecraft/world/entity/animal/cow/MushroomCow.java
|
||||||
+++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java
|
+++ b/net/minecraft/world/entity/animal/cow/MushroomCow.java
|
||||||
@@ -199,6 +_,13 @@
|
@@ -207,6 +_,13 @@
|
||||||
level.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, soundSource, 1.0F, 1.0F);
|
level.playSound(null, this, SoundEvents.MOOSHROOM_SHEAR, soundSource, 1.0F, 1.0F);
|
||||||
this.convertTo(EntityType.COW, ConversionParams.single(this, false, false), cow -> {
|
this.convertTo(EntityTypes.COW, ConversionParams.single(this, false, false), cow -> {
|
||||||
level.sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5), this.getZ(), 1, 0.0, 0.0, 0.0, 0.0);
|
level.sendParticles(ParticleTypes.EXPLOSION, this.getX(), this.getY(0.5), this.getZ(), 1, 0.0, 0.0, 0.0, 0.0);
|
||||||
+ // Purpur start - Fix cow rotation when shearing mooshroom
|
+ // Purpur start - Fix cow rotation when shearing mooshroom
|
||||||
+ cow.copyPosition(this);
|
+ cow.copyPosition(this);
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java
|
--- a/net/minecraft/world/entity/animal/dolphin/Dolphin.java
|
||||||
+++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java
|
+++ b/net/minecraft/world/entity/animal/dolphin/Dolphin.java
|
||||||
@@ -77,6 +_,7 @@
|
@@ -86,6 +_,7 @@
|
||||||
public static final float BABY_SCALE = 0.65F;
|
.withAttachments(EntityAttachments.builder().attach(EntityAttachment.PASSENGER, 0.0F, 0.3125F, 0.0F));
|
||||||
private static final boolean DEFAULT_GOT_FISH = false;
|
private static final boolean DEFAULT_GOT_FISH = false;
|
||||||
public @Nullable BlockPos treasurePos;
|
public @Nullable BlockPos treasurePos;
|
||||||
+ private boolean isNaturallyAggressiveToPlayers; // Purpur - Dolphins naturally aggressive to players chance
|
+ private boolean isNaturallyAggressiveToPlayers; // Purpur - Dolphins naturally aggressive to players chance
|
||||||
|
|
||||||
public Dolphin(final EntityType<? extends Dolphin> type, final Level level) {
|
public Dolphin(final EntityType<? extends Dolphin> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -92,6 +_,7 @@
|
@@ -101,6 +_,7 @@
|
||||||
this.setAirSupply(this.getMaxAirSupply());
|
this.setAirSupply(this.getMaxAirSupply());
|
||||||
this.setXRot(0.0F);
|
this.setXRot(0.0F);
|
||||||
SpawnGroupData spawnGroupData = Objects.requireNonNullElseGet(groupData, () -> new AgeableMob.AgeableMobGroupData(0.1F));
|
SpawnGroupData spawnGroupData = Objects.requireNonNullElseGet(groupData, () -> new AgeableMob.AgeableMobGroupData(0.1F));
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
|
return super.finalizeSpawn(level, difficulty, spawnReason, spawnGroupData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,18 +_,20 @@
|
@@ -166,18 +_,20 @@
|
||||||
protected void registerGoals() {
|
protected void registerGoals() {
|
||||||
this.goalSelector.addGoal(0, new BreathAirGoal(this));
|
this.goalSelector.addGoal(0, new BreathAirGoal(this));
|
||||||
this.goalSelector.addGoal(0, new TryFindWaterGoal(this));
|
this.goalSelector.addGoal(0, new TryFindWaterGoal(this));
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static AttributeSupplier.Builder createAttributes() {
|
public static AttributeSupplier.Builder createAttributes() {
|
||||||
@@ -395,6 +_,7 @@
|
@@ -404,6 +_,7 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUse() {
|
public boolean canUse() {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/equine/Llama.java
|
--- a/net/minecraft/world/entity/animal/equine/Llama.java
|
||||||
+++ b/net/minecraft/world/entity/animal/equine/Llama.java
|
+++ b/net/minecraft/world/entity/animal/equine/Llama.java
|
||||||
@@ -75,6 +_,7 @@
|
@@ -76,6 +_,7 @@
|
||||||
private boolean didSpit;
|
private boolean didSpit;
|
||||||
private @Nullable Llama caravanHead;
|
private @Nullable Llama caravanHead;
|
||||||
public @Nullable Llama caravanTail; // Paper - public
|
public @Nullable Llama caravanTail; // Paper - public
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
public Llama(final EntityType<? extends Llama> type, final Level level) {
|
public Llama(final EntityType<? extends Llama> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -104,6 +_,7 @@
|
@@ -105,6 +_,7 @@
|
||||||
super.addAdditionalSaveData(output);
|
super.addAdditionalSaveData(output);
|
||||||
output.store("Variant", Llama.Variant.LEGACY_CODEC, this.getVariant());
|
output.store("Variant", Llama.Variant.LEGACY_CODEC, this.getVariant());
|
||||||
output.putInt("Strength", this.getStrength());
|
output.putInt("Strength", this.getStrength());
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -111,6 +_,7 @@
|
@@ -112,6 +_,7 @@
|
||||||
this.setStrength(input.getIntOr("Strength", 0));
|
this.setStrength(input.getIntOr("Strength", 0));
|
||||||
super.readAdditionalSaveData(input);
|
super.readAdditionalSaveData(input);
|
||||||
this.setVariant(input.read("Variant", Llama.Variant.LEGACY_CODEC).orElse(Llama.Variant.DEFAULT));
|
this.setVariant(input.read("Variant", Llama.Variant.LEGACY_CODEC).orElse(Llama.Variant.DEFAULT));
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -387,6 +_,7 @@
|
@@ -388,6 +_,7 @@
|
||||||
|
|
||||||
public void leaveCaravan() {
|
public void leaveCaravan() {
|
||||||
if (this.caravanHead != null) {
|
if (this.caravanHead != null) {
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
this.caravanHead.caravanTail = null;
|
this.caravanHead.caravanTail = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -394,6 +_,7 @@
|
@@ -395,6 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public void joinCaravan(final Llama tail) {
|
public void joinCaravan(final Llama tail) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/feline/Cat.java
|
--- a/net/minecraft/world/entity/animal/feline/Cat.java
|
||||||
+++ b/net/minecraft/world/entity/animal/feline/Cat.java
|
+++ b/net/minecraft/world/entity/animal/feline/Cat.java
|
||||||
@@ -382,6 +_,14 @@
|
@@ -394,6 +_,14 @@
|
||||||
return this.isTame() && partner instanceof Cat cat && cat.isTame() && super.canMate(partner);
|
return this.isTame() && partner instanceof Cat cat && cat.isTame() && super.canMate(partner);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
@Override
|
@Override
|
||||||
public @Nullable SpawnGroupData finalizeSpawn(
|
public @Nullable SpawnGroupData finalizeSpawn(
|
||||||
final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData
|
final ServerLevelAccessor level, final DifficultyInstance difficulty, final EntitySpawnReason spawnReason, @Nullable SpawnGroupData groupData
|
||||||
@@ -476,7 +_,7 @@
|
@@ -488,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
private void tryToTame(final Player player) {
|
private void tryToTame(final Player player) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/feline/Ocelot.java
|
--- a/net/minecraft/world/entity/animal/feline/Ocelot.java
|
||||||
+++ b/net/minecraft/world/entity/animal/feline/Ocelot.java
|
+++ b/net/minecraft/world/entity/animal/feline/Ocelot.java
|
||||||
@@ -234,7 +_,7 @@
|
@@ -246,7 +_,7 @@
|
||||||
public boolean checkSpawnObstruction(final LevelReader level) {
|
public boolean checkSpawnObstruction(final LevelReader level) {
|
||||||
if (level.isUnobstructed(this) && !level.containsAnyLiquid(this.getBoundingBox())) {
|
if (level.isUnobstructed(this) && !level.containsAnyLiquid(this.getBoundingBox())) {
|
||||||
BlockPos pos = this.blockPosition();
|
BlockPos pos = this.blockPosition();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/fox/Fox.java
|
--- a/net/minecraft/world/entity/animal/fox/Fox.java
|
||||||
+++ b/net/minecraft/world/entity/animal/fox/Fox.java
|
+++ b/net/minecraft/world/entity/animal/fox/Fox.java
|
||||||
@@ -363,6 +_,11 @@
|
@@ -370,6 +_,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setTargetGoals() {
|
private void setTargetGoals() {
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
if (this.getVariant() == Fox.Variant.RED) {
|
if (this.getVariant() == Fox.Variant.RED) {
|
||||||
this.targetSelector.addGoal(4, this.landTargetGoal);
|
this.targetSelector.addGoal(4, this.landTargetGoal);
|
||||||
this.targetSelector.addGoal(4, this.turtleEggTargetGoal);
|
this.targetSelector.addGoal(4, this.turtleEggTargetGoal);
|
||||||
@@ -390,6 +_,7 @@
|
@@ -397,6 +_,7 @@
|
||||||
|
|
||||||
public void setVariant(final Fox.Variant variant) {
|
public void setVariant(final Fox.Variant variant) {
|
||||||
this.entityData.set(DATA_TYPE_ID, variant.getId());
|
this.entityData.set(DATA_TYPE_ID, variant.getId());
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -715,6 +_,29 @@
|
@@ -722,6 +_,29 @@
|
||||||
return slot == EquipmentSlot.MAINHAND;
|
return slot == EquipmentSlot.MAINHAND;
|
||||||
}
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/goat/Goat.java
|
--- a/net/minecraft/world/entity/animal/goat/Goat.java
|
||||||
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
|
+++ b/net/minecraft/world/entity/animal/goat/Goat.java
|
||||||
@@ -362,6 +_,7 @@
|
@@ -369,6 +_,7 @@
|
||||||
|
|
||||||
// Paper start - Goat ram API
|
// Paper start - Goat ram API
|
||||||
public void ram(net.minecraft.world.entity.LivingEntity entity) {
|
public void ram(net.minecraft.world.entity.LivingEntity entity) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/golem/IronGolem.java
|
--- a/net/minecraft/world/entity/animal/golem/IronGolem.java
|
||||||
+++ b/net/minecraft/world/entity/animal/golem/IronGolem.java
|
+++ b/net/minecraft/world/entity/animal/golem/IronGolem.java
|
||||||
@@ -58,13 +_,25 @@
|
@@ -59,13 +_,25 @@
|
||||||
private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39);
|
private static final UniformInt PERSISTENT_ANGER_TIME = TimeUtil.rangeOfSeconds(20, 39);
|
||||||
private long persistentAngerEndTime;
|
private long persistentAngerEndTime;
|
||||||
private @Nullable EntityReference<LivingEntity> persistentAngerTarget;
|
private @Nullable EntityReference<LivingEntity> persistentAngerTarget;
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true));
|
this.goalSelector.addGoal(1, new MeleeAttackGoal(this, 1.0, true));
|
||||||
this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F));
|
this.goalSelector.addGoal(2, new MoveTowardsTargetGoal(this, 0.9, 32.0F));
|
||||||
this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false));
|
this.goalSelector.addGoal(2, new MoveBackToVillageGoal(this, 0.6, false));
|
||||||
@@ -142,6 +_,7 @@
|
@@ -143,6 +_,7 @@
|
||||||
protected void addAdditionalSaveData(final ValueOutput output) {
|
protected void addAdditionalSaveData(final ValueOutput output) {
|
||||||
super.addAdditionalSaveData(output);
|
super.addAdditionalSaveData(output);
|
||||||
output.putBoolean("PlayerCreated", this.isPlayerCreated());
|
output.putBoolean("PlayerCreated", this.isPlayerCreated());
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
this.addPersistentAngerSaveData(output);
|
this.addPersistentAngerSaveData(output);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,6 +_,7 @@
|
@@ -150,6 +_,7 @@
|
||||||
protected void readAdditionalSaveData(final ValueInput input) {
|
protected void readAdditionalSaveData(final ValueInput input) {
|
||||||
super.readAdditionalSaveData(input);
|
super.readAdditionalSaveData(input);
|
||||||
this.setPlayerCreated(input.getBooleanOr("PlayerCreated", false));
|
this.setPlayerCreated(input.getBooleanOr("PlayerCreated", false));
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
this.readPersistentAngerSaveData(this.level(), input);
|
this.readPersistentAngerSaveData(this.level(), input);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -269,6 +_,7 @@
|
@@ -270,6 +_,7 @@
|
||||||
float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F;
|
float pitch = 1.0F + (this.random.nextFloat() - this.random.nextFloat()) * 0.2F;
|
||||||
this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch);
|
this.playSound(SoundEvents.IRON_GOLEM_REPAIR, 1.0F, pitch);
|
||||||
itemStack.consume(1, player);
|
itemStack.consume(1, player);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/pig/Pig.java
|
--- a/net/minecraft/world/entity/animal/pig/Pig.java
|
||||||
+++ b/net/minecraft/world/entity/animal/pig/Pig.java
|
+++ b/net/minecraft/world/entity/animal/pig/Pig.java
|
||||||
@@ -158,6 +_,19 @@
|
@@ -166,6 +_,19 @@
|
||||||
@Override
|
@Override
|
||||||
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
||||||
boolean hasFood = this.isFood(player.getItemInHand(hand));
|
boolean hasFood = this.isFood(player.getItemInHand(hand));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java
|
--- a/net/minecraft/world/entity/animal/polarbear/PolarBear.java
|
||||||
+++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java
|
+++ b/net/minecraft/world/entity/animal/polarbear/PolarBear.java
|
||||||
@@ -66,6 +_,29 @@
|
@@ -72,6 +_,29 @@
|
||||||
super(type, level);
|
super(type, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -29,8 +29,8 @@
|
|||||||
+
|
+
|
||||||
@Override
|
@Override
|
||||||
public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final AgeableMob partner) {
|
public @Nullable AgeableMob getBreedOffspring(final ServerLevel level, final AgeableMob partner) {
|
||||||
return EntityType.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING);
|
return EntityTypes.POLAR_BEAR.create(level, EntitySpawnReason.BREEDING);
|
||||||
@@ -73,7 +_,7 @@
|
@@ -79,7 +_,7 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isFood(final ItemStack itemStack) {
|
public boolean isFood(final ItemStack itemStack) {
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -82,6 +_,12 @@
|
@@ -88,6 +_,12 @@
|
||||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||||
this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal());
|
this.goalSelector.addGoal(1, new PolarBear.PolarBearMeleeAttackGoal());
|
||||||
this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, bear -> bear.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES));
|
this.goalSelector.addGoal(1, new PanicGoal(this, 2.0, bear -> bear.isBaby() ? DamageTypeTags.PANIC_CAUSES : DamageTypeTags.PANIC_ENVIRONMENTAL_CAUSES));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java
|
--- a/net/minecraft/world/entity/animal/rabbit/Rabbit.java
|
||||||
+++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java
|
+++ b/net/minecraft/world/entity/animal/rabbit/Rabbit.java
|
||||||
@@ -419,10 +_,23 @@
|
@@ -420,10 +_,23 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setVariant(variant);
|
this.setVariant(variant);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java
|
--- a/net/minecraft/world/entity/animal/squid/GlowSquid.java
|
||||||
+++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java
|
+++ b/net/minecraft/world/entity/animal/squid/GlowSquid.java
|
||||||
@@ -30,6 +_,13 @@
|
@@ -31,6 +_,13 @@
|
||||||
super(type, level);
|
super(type, level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
--- a/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||||
+++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
+++ b/net/minecraft/world/entity/boss/enderdragon/EndCrystal.java
|
||||||
@@ -39,6 +_,24 @@
|
@@ -40,6 +_,24 @@
|
||||||
this.setPos(x, y, z);
|
this.setPos(x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
@Override
|
@Override
|
||||||
protected Entity.MovementEmission getMovementEmission() {
|
protected Entity.MovementEmission getMovementEmission() {
|
||||||
return Entity.MovementEmission.NONE;
|
return Entity.MovementEmission.NONE;
|
||||||
@@ -75,6 +_,8 @@
|
@@ -76,6 +_,8 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Paper end - Fix invulnerable end crystals
|
// Paper end - Fix invulnerable end crystals
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -118,15 +_,17 @@
|
@@ -119,15 +_,17 @@
|
||||||
}
|
}
|
||||||
// CraftBukkit end
|
// CraftBukkit end
|
||||||
if (!source.is(DamageTypeTags.IS_EXPLOSION)) {
|
if (!source.is(DamageTypeTags.IS_EXPLOSION)) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
--- a/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
||||||
+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
+++ b/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java
|
||||||
@@ -960,6 +_,7 @@
|
@@ -964,6 +_,7 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean canRide(final Entity vehicle) {
|
protected boolean canRide(final Entity vehicle) {
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -995,7 +_,7 @@
|
@@ -999,7 +_,7 @@
|
||||||
boolean shouldDrop = level.getGameRules().get(GameRules.MOB_DROPS);
|
boolean shouldDrop = level.getGameRules().get(GameRules.MOB_DROPS);
|
||||||
int xpCount = 500;
|
int xpCount = 500;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/decoration/ArmorStand.java
|
--- a/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||||
+++ b/net/minecraft/world/entity/decoration/ArmorStand.java
|
+++ b/net/minecraft/world/entity/decoration/ArmorStand.java
|
||||||
@@ -94,10 +_,13 @@
|
@@ -95,10 +_,13 @@
|
||||||
public boolean canTickSetByAPI = false;
|
public boolean canTickSetByAPI = false;
|
||||||
private boolean noTickEquipmentDirty = false;
|
private boolean noTickEquipmentDirty = false;
|
||||||
// Paper end - Allow ArmorStands not to tick
|
// Paper end - Allow ArmorStands not to tick
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
public ArmorStand(final Level level, final double x, final double y, final double z) {
|
public ArmorStand(final Level level, final double x, final double y, final double z) {
|
||||||
@@ -546,6 +_,7 @@
|
@@ -547,6 +_,7 @@
|
||||||
// Paper start - Allow ArmorStands not to tick
|
// Paper start - Allow ArmorStands not to tick
|
||||||
@Override
|
@Override
|
||||||
public void tick() {
|
public void tick() {
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
if (!this.canTick) {
|
if (!this.canTick) {
|
||||||
if (this.noTickEquipmentDirty) {
|
if (this.noTickEquipmentDirty) {
|
||||||
this.noTickEquipmentDirty = false;
|
this.noTickEquipmentDirty = false;
|
||||||
@@ -832,4 +_,19 @@
|
@@ -833,4 +_,19 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/item/ItemEntity.java
|
--- a/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
+++ b/net/minecraft/world/entity/item/ItemEntity.java
|
+++ b/net/minecraft/world/entity/item/ItemEntity.java
|
||||||
@@ -54,6 +_,12 @@
|
@@ -55,6 +_,12 @@
|
||||||
public boolean canMobPickup = true; // Paper - Item#canEntityPickup
|
public boolean canMobPickup = true; // Paper - Item#canEntityPickup
|
||||||
private int despawnRate = -1; // Paper - Alternative item-despawn-rate
|
private int despawnRate = -1; // Paper - Alternative item-despawn-rate
|
||||||
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
public net.kyori.adventure.util.TriState frictionState = net.kyori.adventure.util.TriState.NOT_SET; // Paper - Friction API
|
||||||
@@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
public ItemEntity(final EntityType<? extends ItemEntity> type, final Level level) {
|
public ItemEntity(final EntityType<? extends ItemEntity> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -339,7 +_,16 @@
|
@@ -341,7 +_,16 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean hurtServer(final ServerLevel level, final DamageSource source, final float damage) {
|
public final boolean hurtServer(final ServerLevel level, final DamageSource source, final float damage) {
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,6 +_,12 @@
|
@@ -523,6 +_,12 @@
|
||||||
public void setItem(final ItemStack itemStack) {
|
public void setItem(final ItemStack itemStack) {
|
||||||
this.getEntityData().set(DATA_ITEM, itemStack);
|
this.getEntityData().set(DATA_ITEM, itemStack);
|
||||||
this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(itemStack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate
|
this.despawnRate = this.level().paperConfig().entities.spawning.altItemDespawnRate.enabled ? this.level().paperConfig().entities.spawning.altItemDespawnRate.items.getOrDefault(itemStack.getItem(), this.level().spigotConfig.itemDespawnRate) : this.level().spigotConfig.itemDespawnRate; // Paper - Alternative item-despawn-rate
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/item/PrimedTnt.java
|
--- a/net/minecraft/world/entity/item/PrimedTnt.java
|
||||||
+++ b/net/minecraft/world/entity/item/PrimedTnt.java
|
+++ b/net/minecraft/world/entity/item/PrimedTnt.java
|
||||||
@@ -237,4 +_,32 @@
|
@@ -244,4 +_,32 @@
|
||||||
return !this.level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid();
|
return !this.level().paperConfig().fixes.preventTntFromMovingInWater && super.isPushedByFluid();
|
||||||
}
|
}
|
||||||
// Paper end - Option to prevent TNT from moving in water
|
// Paper end - Option to prevent TNT from moving in water
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/Guardian.java
|
--- a/net/minecraft/world/entity/monster/Guardian.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Guardian.java
|
+++ b/net/minecraft/world/entity/monster/Guardian.java
|
||||||
@@ -310,6 +_,11 @@
|
@@ -307,6 +_,11 @@
|
||||||
final BlockPos pos,
|
final BlockPos pos,
|
||||||
final RandomSource random
|
final RandomSource random
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/Ravager.java
|
--- a/net/minecraft/world/entity/monster/Ravager.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Ravager.java
|
+++ b/net/minecraft/world/entity/monster/Ravager.java
|
||||||
@@ -74,6 +_,7 @@
|
@@ -75,6 +_,7 @@
|
||||||
protected void registerGoals() {
|
protected void registerGoals() {
|
||||||
super.registerGoals();
|
super.registerGoals();
|
||||||
this.goalSelector.addGoal(0, new FloatGoal(this));
|
this.goalSelector.addGoal(0, new FloatGoal(this));
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, true));
|
this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0, true));
|
||||||
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.4));
|
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.4));
|
||||||
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
||||||
@@ -152,7 +_,7 @@
|
@@ -153,7 +_,7 @@
|
||||||
)) {
|
)) {
|
||||||
BlockState state = serverLevel.getBlockState(pos);
|
BlockState state = serverLevel.getBlockState(pos);
|
||||||
Block block = state.getBlock();
|
Block block = state.getBlock();
|
||||||
|
|||||||
@@ -1,60 +1,11 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/Shulker.java
|
--- a/net/minecraft/world/entity/monster/Shulker.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Shulker.java
|
+++ b/net/minecraft/world/entity/monster/Shulker.java
|
||||||
@@ -93,6 +_,22 @@
|
@@ -80,7 +_,7 @@
|
||||||
this.lookControl = new Shulker.ShulkerLookControl(this);
|
private static final byte DEFAULT_PEEK = 0;
|
||||||
}
|
private static final Direction DEFAULT_ATTACH_FACE = Direction.DOWN;
|
||||||
|
private static final Vector3fc FORWARD = Direction.SOUTH.getUnitVec3f();
|
||||||
+ // Purpur start - Shulker change color with dye
|
- public static final float MAX_SCALE = 3.0F;
|
||||||
+ @Override
|
+ private static final float MAX_SCALE = 3.0F;
|
||||||
+ protected net.minecraft.world.InteractionResult mobInteract(Player player, net.minecraft.world.InteractionHand hand) {
|
private float currentPeekAmountO;
|
||||||
+ net.minecraft.world.item.ItemStack itemstack = player.getItemInHand(hand);
|
private float currentPeekAmount;
|
||||||
+ DyeColor dyeColor = itemstack.get(DataComponents.DYE);
|
private @Nullable BlockPos clientOldAttachPosition;
|
||||||
+ if (player.level().purpurConfig.shulkerChangeColorWithDye && dyeColor != null && dyeColor != this.getColor()) {
|
|
||||||
+ this.setVariant(Optional.of(dyeColor));
|
|
||||||
+ if (!player.getAbilities().instabuild) {
|
|
||||||
+ itemstack.shrink(1);
|
|
||||||
+ }
|
|
||||||
+ return net.minecraft.world.InteractionResult.SUCCESS;
|
|
||||||
+ }
|
|
||||||
+ return super.mobInteract(player, hand);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Shulker change color with dye
|
|
||||||
+
|
|
||||||
@Override
|
|
||||||
protected void registerGoals() {
|
|
||||||
this.goalSelector.addGoal(1, new LookAtPlayerGoal(this, Player.class, 8.0F, 0.02F, true));
|
|
||||||
@@ -454,11 +_,21 @@
|
|
||||||
private void hitByShulkerBullet() {
|
|
||||||
Vec3 oldPosition = this.position();
|
|
||||||
AABB oldAabb = this.getBoundingBox();
|
|
||||||
- if (!this.isClosed() && this.teleportSomewhere()) {
|
|
||||||
- int shulkerCount = this.level().getEntities(EntityType.SHULKER, oldAabb.inflate(8.0), Entity::isAlive).size();
|
|
||||||
- float failureChance = (shulkerCount - 1) / 5.0F;
|
|
||||||
- if (!(this.level().getRandom().nextFloat() < failureChance)) {
|
|
||||||
+ // Purpur start - Shulker spawn from bullet options
|
|
||||||
+ if ((!this.level().purpurConfig.shulkerSpawnFromBulletRequireOpenLid || !this.isClosed()) && this.teleportSomewhere()) {
|
|
||||||
+ float failureChance = this.level().purpurConfig.shulkerSpawnFromBulletBaseChance;
|
|
||||||
+ if (!this.level().purpurConfig.shulkerSpawnFromBulletNearbyEquation.isBlank()) {
|
|
||||||
+ int shulkerCount = this.level().getEntities((net.minecraft.world.level.entity.EntityTypeTest) EntityType.SHULKER, oldAabb.inflate(this.level().purpurConfig.shulkerSpawnFromBulletNearbyRange), Entity::isAlive).size();
|
|
||||||
+ try {
|
|
||||||
+ failureChance -= ((Number) scriptEngine.eval("let nearby = " + shulkerCount + "; " + this.level().purpurConfig.shulkerSpawnFromBulletNearbyEquation)).floatValue();
|
|
||||||
+ } catch (javax.script.ScriptException e) {
|
|
||||||
+ e.printStackTrace();
|
|
||||||
+ failureChance -= (shulkerCount - 1) / 5.0F;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ if (this.level().getRandom().nextFloat() <= failureChance) {
|
|
||||||
Shulker baby = EntityType.SHULKER.create(this.level(), EntitySpawnReason.BREEDING);
|
|
||||||
+ // Purpur end - Shulker spawn from bullet options
|
|
||||||
if (baby != null) {
|
|
||||||
baby.setVariant(this.getVariant());
|
|
||||||
baby.snapTo(oldPosition);
|
|
||||||
@@ -565,7 +_,7 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
public Optional<DyeColor> getVariant() {
|
|
||||||
- return Optional.ofNullable(this.getColor());
|
|
||||||
+ return Optional.ofNullable(this.level().purpurConfig.shulkerSpawnFromBulletRandomColor ? DyeColor.random(this.level().getRandom()) : this.getColor()); // Purpur - Shulker spawn from bullet options
|
|
||||||
}
|
|
||||||
|
|
||||||
public @Nullable DyeColor getColor() {
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/Strider.java
|
--- a/net/minecraft/world/entity/monster/Strider.java
|
||||||
+++ b/net/minecraft/world/entity/monster/Strider.java
|
+++ b/net/minecraft/world/entity/monster/Strider.java
|
||||||
@@ -400,6 +_,18 @@
|
@@ -411,6 +_,18 @@
|
||||||
@Override
|
@Override
|
||||||
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
||||||
boolean hasFood = this.isFood(player.getItemInHand(hand));
|
boolean hasFood = this.isFood(player.getItemInHand(hand));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
--- a/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
||||||
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
+++ b/net/minecraft/world/entity/monster/hoglin/Hoglin.java
|
||||||
@@ -173,6 +_,11 @@
|
@@ -186,6 +_,11 @@
|
||||||
public static boolean checkHoglinSpawnRules(
|
public static boolean checkHoglinSpawnRules(
|
||||||
final EntityType<Hoglin> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
final EntityType<Hoglin> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
|
--- a/net/minecraft/world/entity/monster/piglin/Piglin.java
|
||||||
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
|
+++ b/net/minecraft/world/entity/monster/piglin/Piglin.java
|
||||||
@@ -181,6 +_,11 @@
|
@@ -182,6 +_,11 @@
|
||||||
public static boolean checkPiglinSpawnRules(
|
public static boolean checkPiglinSpawnRules(
|
||||||
final EntityType<Piglin> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
final EntityType<Piglin> type, final LevelAccessor level, final EntitySpawnReason spawnReason, final BlockPos pos, final RandomSource random
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
--- a/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
||||||
+++ b/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
+++ b/net/minecraft/world/entity/monster/piglin/PiglinAi.java
|
||||||
@@ -666,14 +_,24 @@
|
@@ -664,14 +_,24 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isWearingSafeArmor(final LivingEntity livingEntity) {
|
public static boolean isWearingSafeArmor(final LivingEntity livingEntity) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java
|
--- a/net/minecraft/world/entity/monster/skeleton/Skeleton.java
|
||||||
+++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java
|
+++ b/net/minecraft/world/entity/monster/skeleton/Skeleton.java
|
||||||
@@ -130,4 +_,64 @@
|
@@ -131,4 +_,64 @@
|
||||||
SoundEvent getStepSound() {
|
protected SoundEvent getStepSound() {
|
||||||
return SoundEvents.SKELETON_STEP;
|
return SoundEvents.SKELETON_STEP;
|
||||||
}
|
}
|
||||||
+
|
+
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/zombie/Drowned.java
|
--- a/net/minecraft/world/entity/monster/zombie/Drowned.java
|
||||||
+++ b/net/minecraft/world/entity/monster/zombie/Drowned.java
|
+++ b/net/minecraft/world/entity/monster/zombie/Drowned.java
|
||||||
@@ -93,10 +_,23 @@
|
@@ -94,10 +_,23 @@
|
||||||
this.goalSelector.addGoal(2, new Drowned.DrownedAttackGoal(this, 1.0, false));
|
this.goalSelector.addGoal(2, new Drowned.DrownedAttackGoal(this, 1.0, false));
|
||||||
this.goalSelector.addGoal(5, new Drowned.DrownedGoToBeachGoal(this, 1.0));
|
this.goalSelector.addGoal(5, new Drowned.DrownedGoToBeachGoal(this, 1.0));
|
||||||
this.goalSelector.addGoal(6, new Drowned.DrownedSwimUpGoal(this, 1.0, this.level().getSeaLevel()));
|
this.goalSelector.addGoal(6, new Drowned.DrownedSwimUpGoal(this, 1.0, this.level().getSeaLevel()));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/zombie/Zombie.java
|
--- a/net/minecraft/world/entity/monster/zombie/Zombie.java
|
||||||
+++ b/net/minecraft/world/entity/monster/zombie/Zombie.java
|
+++ b/net/minecraft/world/entity/monster/zombie/Zombie.java
|
||||||
@@ -127,7 +_,19 @@
|
@@ -128,7 +_,19 @@
|
||||||
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
this.goalSelector.addGoal(7, new WaterAvoidingRandomStrollGoal(this, 1.0));
|
||||||
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class));
|
this.targetSelector.addGoal(1, new HurtByTargetGoal(this).setAlertOthers(ZombifiedPiglin.class));
|
||||||
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true));
|
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, IronGolem.class, true));
|
||||||
this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR));
|
this.targetSelector.addGoal(5, new NearestAttackableTargetGoal<>(this, Turtle.class, 10, true, false, Turtle.BABY_ON_LAND_SELECTOR));
|
||||||
}
|
}
|
||||||
@@ -540,7 +_,7 @@
|
@@ -542,7 +_,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
|
--- a/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
|
||||||
+++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
|
+++ b/net/minecraft/world/entity/monster/zombie/ZombieVillager.java
|
||||||
@@ -170,10 +_,10 @@
|
@@ -166,10 +_,10 @@
|
||||||
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
public InteractionResult mobInteract(final Player player, final InteractionHand hand) {
|
||||||
ItemStack itemStack = player.getItemInHand(hand);
|
ItemStack itemStack = player.getItemInHand(hand);
|
||||||
if (itemStack.is(Items.GOLDEN_APPLE)) {
|
if (itemStack.is(Items.GOLDEN_APPLE)) {
|
||||||
|
|||||||
@@ -7,10 +7,10 @@
|
|||||||
+ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers
|
+ private boolean isLobotomized = false; public boolean isLobotomized() { return this.isLobotomized; } // Purpur - Lobotomize stuck villagers
|
||||||
+ private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers
|
+ private int notLobotomizedCount = 0; // Purpur - Lobotomize stuck villagers
|
||||||
|
|
||||||
public Villager(final EntityType<? extends Villager> type, final Level level) {
|
public Villager(final EntityType<? extends Villager> entityType, final Level level) {
|
||||||
this(type, level, VillagerType.PLAINS);
|
super(entityType, level);
|
||||||
@@ -199,6 +_,57 @@
|
@@ -190,6 +_,57 @@
|
||||||
this.setVillagerData(this.getVillagerData().withType(type).withProfession(level.registryAccess(), VillagerProfession.NONE));
|
this.setCanPickUpLoot(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
+ // Purpur start - Allow leashing villagers
|
+ // Purpur start - Allow leashing villagers
|
||||||
@@ -66,8 +66,8 @@
|
|||||||
+
|
+
|
||||||
@Override
|
@Override
|
||||||
public Brain<Villager> getBrain() {
|
public Brain<Villager> getBrain() {
|
||||||
return (Brain<Villager>) super.getBrain();
|
return (Brain<Villager>)super.getBrain();
|
||||||
@@ -268,11 +_,22 @@
|
@@ -259,11 +_,22 @@
|
||||||
// Paper start - EAR 2
|
// Paper start - EAR 2
|
||||||
this.customServerAiStep(level, false);
|
this.customServerAiStep(level, false);
|
||||||
}
|
}
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
profiler.pop();
|
profiler.pop();
|
||||||
if (this.assignProfessionWhenSpawned) {
|
if (this.assignProfessionWhenSpawned) {
|
||||||
this.assignProfessionWhenSpawned = false;
|
this.assignProfessionWhenSpawned = false;
|
||||||
@@ -347,6 +_,7 @@
|
@@ -338,6 +_,7 @@
|
||||||
return InteractionResult.CONSUME;
|
return InteractionResult.CONSUME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
this.startTrading(player);
|
this.startTrading(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,7 +_,7 @@
|
@@ -478,7 +_,7 @@
|
||||||
|
|
||||||
public void updateDemand() {
|
public void updateDemand() {
|
||||||
for (MerchantOffer offer : this.getOffers()) {
|
for (MerchantOffer offer : this.getOffers()) {
|
||||||
@@ -109,7 +109,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -687,7 +_,7 @@
|
@@ -688,7 +_,7 @@
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canBreed() {
|
public boolean canBreed() {
|
||||||
|
|||||||
@@ -1,111 +1,11 @@
|
|||||||
--- a/net/minecraft/world/entity/player/Player.java
|
--- a/net/minecraft/world/entity/player/Player.java
|
||||||
+++ b/net/minecraft/world/entity/player/Player.java
|
+++ b/net/minecraft/world/entity/player/Player.java
|
||||||
@@ -173,11 +_,20 @@
|
@@ -1529,7 +_,7 @@
|
||||||
public float hurtDir;
|
|
||||||
public boolean affectsSpawning = true; // Paper - Affects Spawning API
|
|
||||||
public net.kyori.adventure.util.TriState flyingFallDamage = net.kyori.adventure.util.TriState.NOT_SET; // Paper - flying fall damage
|
|
||||||
+ public int burpDelay = 0; // Purpur - Burp delay
|
|
||||||
+ public boolean canPortalInstant = false; // Purpur - Add portal permission bypass
|
|
||||||
|
|
||||||
// CraftBukkit start
|
|
||||||
public boolean fauxSleeping;
|
|
||||||
public int oldLevel = -1;
|
|
||||||
|
|
||||||
+ // Purpur start - AFK API
|
|
||||||
+ public abstract void setAfk(boolean afk);
|
|
||||||
+
|
|
||||||
+ public boolean isAfk() {
|
|
||||||
+ return false;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - AFK API
|
|
||||||
@Override
|
|
||||||
public org.bukkit.craftbukkit.entity.CraftHumanEntity getBukkitEntity() {
|
|
||||||
return (org.bukkit.craftbukkit.entity.CraftHumanEntity) super.getBukkitEntity();
|
|
||||||
@@ -242,6 +_,12 @@
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void tick() {
|
|
||||||
+ // Purpur start - Burp delay
|
|
||||||
+ if (this.burpDelay > 0 && --this.burpDelay == 0) {
|
|
||||||
+ this.level().playSound(null, getX(), getY(), getZ(), SoundEvents.PLAYER_BURP, SoundSource.PLAYERS, 1.0F, this.level().getRandom().nextFloat() * 0.1F + 0.9F);
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Burp delay
|
|
||||||
+
|
|
||||||
this.noPhysics = this.isSpectator();
|
|
||||||
if (this.isSpectator() || this.isPassenger()) {
|
|
||||||
this.setOnGround(false);
|
|
||||||
@@ -299,6 +_,17 @@
|
|
||||||
this.turtleHelmetTick();
|
|
||||||
}
|
|
||||||
|
|
||||||
+ // Purpur start - Full netherite armor grants fire resistance
|
|
||||||
+ if (this.level().purpurConfig.playerNetheriteFireResistanceDuration > 0 && this.level().getGameTime() % 20 == 0) {
|
|
||||||
+ if (this.getItemBySlot(EquipmentSlot.HEAD).is(Items.NETHERITE_HELMET)
|
|
||||||
+ && this.getItemBySlot(EquipmentSlot.CHEST).is(Items.NETHERITE_CHESTPLATE)
|
|
||||||
+ && this.getItemBySlot(EquipmentSlot.LEGS).is(Items.NETHERITE_LEGGINGS)
|
|
||||||
+ && this.getItemBySlot(EquipmentSlot.FEET).is(Items.NETHERITE_BOOTS)) {
|
|
||||||
+ this.addEffect(new MobEffectInstance(MobEffects.FIRE_RESISTANCE, this.level().purpurConfig.playerNetheriteFireResistanceDuration, this.level().purpurConfig.playerNetheriteFireResistanceAmplifier, this.level().purpurConfig.playerNetheriteFireResistanceAmbient, this.level().purpurConfig.playerNetheriteFireResistanceShowParticles, this.level().purpurConfig.playerNetheriteFireResistanceShowIcon), org.bukkit.event.entity.EntityPotionEffectEvent.Cause.NETHERITE_ARMOR);
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Full netherite armor grants fire resistance
|
|
||||||
+
|
|
||||||
this.cooldowns.tick();
|
|
||||||
this.updatePlayerPose();
|
|
||||||
}
|
|
||||||
@@ -504,7 +_,7 @@
|
|
||||||
List<Entity> orbs = Lists.newArrayList();
|
|
||||||
|
|
||||||
for (Entity entity : entities) {
|
|
||||||
- if (entity.is(EntityType.EXPERIENCE_ORB)) {
|
|
||||||
+ if (entity.is(EntityType.EXPERIENCE_ORB) && entity.level().purpurConfig.playerExpPickupDelay >= 0) { // Purpur - Configurable player pickup exp delay
|
|
||||||
orbs.add(entity);
|
|
||||||
} else if (!entity.isRemoved()) {
|
|
||||||
this.touch(entity);
|
|
||||||
@@ -1052,7 +_,7 @@
|
|
||||||
criticalAttack = criticalAttack && !this.level().paperConfig().entities.behavior.disablePlayerCrits; // Paper - Toggleable player crits
|
|
||||||
if (criticalAttack) {
|
|
||||||
damageSource = damageSource.critical(); // Paper - critical damage API
|
|
||||||
- baseDamage *= 1.5F;
|
|
||||||
+ baseDamage *= (float) this.level().purpurConfig.playerCriticalDamageMultiplier; // Purpur - Add config change multiplier critical damage value
|
|
||||||
}
|
|
||||||
|
|
||||||
float totalDamage = baseDamage + magicBoost;
|
|
||||||
@@ -1748,7 +_,23 @@
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getBaseExperienceReward(final ServerLevel level) {
|
|
||||||
- return !level.getGameRules().get(GameRules.KEEP_INVENTORY) && !this.isSpectator() ? Math.min(this.experienceLevel * 7, 100) : 0;
|
|
||||||
+ // Purpur start - Add player death exp control options
|
|
||||||
+ if (!level.getGameRules().get(GameRules.KEEP_INVENTORY) && !this.isSpectator()) {
|
|
||||||
+ int toDrop;
|
|
||||||
+ try {
|
|
||||||
+ toDrop = Math.round(((Number) scriptEngine.eval("let expLevel = " + experienceLevel + "; " +
|
|
||||||
+ "let expTotal = " + totalExperience + "; " +
|
|
||||||
+ "let exp = " + experienceProgress + "; " +
|
|
||||||
+ level().purpurConfig.playerDeathExpDropEquation)).floatValue());
|
|
||||||
+ } catch (javax.script.ScriptException e) {
|
|
||||||
+ e.printStackTrace();
|
|
||||||
+ toDrop = experienceLevel * 7;
|
|
||||||
+ }
|
|
||||||
+ return Math.min(toDrop, level().purpurConfig.playerDeathExpDropMax);
|
|
||||||
+ } else {
|
|
||||||
+ return 0;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Add player death exp control options
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1791,6 +_,13 @@
|
- public boolean canGlide() {
|
||||||
public boolean addItem(final ItemStack itemStack) {
|
+ protected boolean canGlide() {
|
||||||
return this.inventory.add(itemStack);
|
return !this.abilities.flying && super.canGlide();
|
||||||
}
|
}
|
||||||
+
|
|
||||||
+ // Purpur start - Player ridable in water option
|
|
||||||
+ @Override
|
|
||||||
+ public boolean dismountsUnderwater() {
|
|
||||||
+ return !level().purpurConfig.playerRidableInWater;
|
|
||||||
+ }
|
|
||||||
+ // Purpur end - Player ridable in water option
|
|
||||||
|
|
||||||
public abstract @Nullable GameType gameMode();
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/projectile/arrow/AbstractArrow.java
|
--- a/net/minecraft/world/entity/projectile/arrow/AbstractArrow.java
|
||||||
+++ b/net/minecraft/world/entity/projectile/arrow/AbstractArrow.java
|
+++ b/net/minecraft/world/entity/projectile/arrow/AbstractArrow.java
|
||||||
@@ -78,6 +_,7 @@
|
@@ -79,6 +_,7 @@
|
||||||
private @Nullable List<Entity> piercedAndKilledEntities;
|
private @Nullable List<Entity> piercedAndKilledEntities;
|
||||||
public ItemStack pickupItemStack = this.getDefaultPickupItem();
|
public ItemStack pickupItemStack = this.getDefaultPickupItem();
|
||||||
public @Nullable ItemStack firedFromWeapon = null;
|
public @Nullable ItemStack firedFromWeapon = null;
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
protected AbstractArrow(final EntityType<? extends AbstractArrow> type, final Level level) {
|
protected AbstractArrow(final EntityType<? extends AbstractArrow> type, final Level level) {
|
||||||
super(type, level);
|
super(type, level);
|
||||||
@@ -605,6 +_,12 @@
|
@@ -611,6 +_,12 @@
|
||||||
public @Nullable ItemStack getWeaponItem() {
|
public @Nullable ItemStack getWeaponItem() {
|
||||||
return this.firedFromWeapon;
|
return this.firedFromWeapon;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/projectile/arrow/ThrownTrident.java
|
--- a/net/minecraft/world/entity/projectile/arrow/ThrownTrident.java
|
||||||
+++ b/net/minecraft/world/entity/projectile/arrow/ThrownTrident.java
|
+++ b/net/minecraft/world/entity/projectile/arrow/ThrownTrident.java
|
||||||
@@ -72,7 +_,7 @@
|
@@ -73,7 +_,7 @@
|
||||||
|
|
||||||
Entity currentOwner = this.getOwner();
|
Entity currentOwner = this.getOwner();
|
||||||
int loyalty = this.entityData.get(ID_LOYALTY);
|
int loyalty = this.entityData.get(ID_LOYALTY);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java
|
--- a/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java
|
||||||
+++ b/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java
|
+++ b/net/minecraft/world/entity/projectile/hurtingprojectile/WitherSkull.java
|
||||||
@@ -94,7 +_,7 @@
|
@@ -95,7 +_,7 @@
|
||||||
super.onHit(hitResult);
|
super.onHit(hitResult);
|
||||||
if (!this.level().isClientSide()) {
|
if (!this.level().isClientSide()) {
|
||||||
// CraftBukkit start
|
// CraftBukkit start
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
if (event.callEvent()) {
|
if (event.callEvent()) {
|
||||||
this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB);
|
this.level().explode(this, this.getX(), this.getY(), this.getZ(), event.getRadius(), event.getFire(), Level.ExplosionInteraction.MOB);
|
||||||
}
|
}
|
||||||
@@ -102,6 +_,13 @@
|
@@ -103,6 +_,13 @@
|
||||||
this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
|
this.discard(org.bukkit.event.entity.EntityRemoveEvent.Cause.HIT); // CraftBukkit - add Bukkit remove cause
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java
|
--- a/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java
|
||||||
+++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java
|
+++ b/net/minecraft/world/entity/projectile/throwableitemprojectile/Snowball.java
|
||||||
@@ -54,9 +_,39 @@
|
@@ -55,9 +_,39 @@
|
||||||
protected void onHitEntity(final EntityHitResult hitResult) {
|
protected void onHitEntity(final EntityHitResult hitResult) {
|
||||||
super.onHitEntity(hitResult);
|
super.onHitEntity(hitResult);
|
||||||
Entity entity = hitResult.getEntity();
|
Entity entity = hitResult.getEntity();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java
|
--- a/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java
|
||||||
+++ b/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java
|
+++ b/net/minecraft/world/entity/vehicle/minecart/NewMinecartBehavior.java
|
||||||
@@ -394,7 +_,7 @@
|
@@ -396,7 +_,7 @@
|
||||||
private Vec3 calculateBoostTrackSpeed(final Vec3 deltaMovement, final BlockPos pos, final BlockState state) {
|
private Vec3 calculateBoostTrackSpeed(final Vec3 deltaMovement, final BlockPos pos, final BlockState state) {
|
||||||
if (state.is(Blocks.POWERED_RAIL) && state.getValue(PoweredRailBlock.POWERED)) {
|
if (state.is(Blocks.POWERED_RAIL) && state.getValue(PoweredRailBlock.POWERED)) {
|
||||||
if (deltaMovement.length() > 0.01) {
|
if (deltaMovement.length() > 0.01) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/inventory/AbstractFurnaceMenu.java
|
--- a/net/minecraft/world/inventory/AbstractFurnaceMenu.java
|
||||||
+++ b/net/minecraft/world/inventory/AbstractFurnaceMenu.java
|
+++ b/net/minecraft/world/inventory/AbstractFurnaceMenu.java
|
||||||
@@ -121,7 +_,13 @@
|
@@ -116,7 +_,13 @@
|
||||||
} else if (slotIndex != 1 && slotIndex != 0) {
|
} else if (slotIndex != 1 && slotIndex != 0) {
|
||||||
if (this.canSmelt(stack)) {
|
if (this.canSmelt(stack)) {
|
||||||
if (!this.moveItemStackTo(stack, 0, 1, false)) {
|
if (!this.moveItemStackTo(stack, 0, 1, false)) {
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
}
|
}
|
||||||
// Paper end
|
// Paper end
|
||||||
@@ -81,8 +_,15 @@
|
@@ -81,8 +_,15 @@
|
||||||
CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger((ServerPlayer)player, pos, itemInHand);
|
CriteriaTriggers.ITEM_USED_ON_BLOCK.trigger(serverPlayer, pos, itemInHand);
|
||||||
}
|
}
|
||||||
|
|
||||||
- level.setBlock(pos, newBlock.get(), Block.UPDATE_ALL_IMMEDIATE);
|
- level.setBlock(pos, newBlock.get(), Block.UPDATE_ALL_IMMEDIATE);
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
--- a/net/minecraft/world/item/BowItem.java
|
--- a/net/minecraft/world/item/BowItem.java
|
||||||
+++ b/net/minecraft/world/item/BowItem.java
|
+++ b/net/minecraft/world/item/BowItem.java
|
||||||
@@ -28,6 +_,11 @@
|
@@ -26,6 +_,11 @@
|
||||||
return false;
|
public boolean releaseUsing(final ItemStack itemStack, final Level level, final LivingEntity entity, final int remainingTime) {
|
||||||
} else {
|
if (entity instanceof Player player) {
|
||||||
ItemStack projectile = player.getProjectile(itemStack);
|
ItemStack projectile = player.getProjectile(itemStack);
|
||||||
+ // Purpur start - Infinity bow settings
|
+ // Purpur start - Infinity bow settings
|
||||||
+ if (level.purpurConfig.infinityWorksWithoutArrows && projectile.isEmpty() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, itemStack) > 0) {
|
+ if (level.purpurConfig.infinityWorksWithoutArrows && projectile.isEmpty() && net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(net.minecraft.world.item.enchantment.Enchantments.INFINITY, itemStack) > 0) {
|
||||||
@@ -12,7 +12,7 @@
|
|||||||
if (projectile.isEmpty()) {
|
if (projectile.isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -40,7 +_,7 @@
|
@@ -38,7 +_,7 @@
|
||||||
|
|
||||||
List<ItemStack> firedProjectiles = draw(itemStack, projectile, player);
|
List<ItemStack> firedProjectiles = draw(itemStack, projectile, player);
|
||||||
if (level instanceof ServerLevel serverLevel && !firedProjectiles.isEmpty()) {
|
if (level instanceof ServerLevel serverLevel && !firedProjectiles.isEmpty()) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/item/BucketItem.java
|
--- a/net/minecraft/world/item/BucketItem.java
|
||||||
+++ b/net/minecraft/world/item/BucketItem.java
|
+++ b/net/minecraft/world/item/BucketItem.java
|
||||||
@@ -152,7 +_,7 @@
|
@@ -154,7 +_,7 @@
|
||||||
return hitResult != null && this.emptyContents(user, level, hitResult.getBlockPos().relative(hitResult.getDirection()), null, direction, clicked, itemStack, hand); // CraftBukkit
|
return hitResult != null && this.emptyContents(user, level, hitResult.getBlockPos().relative(hitResult.getDirection()), null, direction, clicked, itemStack, hand); // CraftBukkit
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/item/DyeColor.java
|
--- a/net/minecraft/world/item/DyeColor.java
|
||||||
+++ b/net/minecraft/world/item/DyeColor.java
|
+++ b/net/minecraft/world/item/DyeColor.java
|
||||||
@@ -154,4 +_,10 @@
|
@@ -168,4 +_,10 @@
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/item/ItemStack.java
|
--- a/net/minecraft/world/item/ItemStack.java
|
||||||
+++ b/net/minecraft/world/item/ItemStack.java
|
+++ b/net/minecraft/world/item/ItemStack.java
|
||||||
@@ -453,6 +_,7 @@
|
@@ -452,6 +_,7 @@
|
||||||
// revert back all captured blocks
|
// revert back all captured blocks
|
||||||
for (org.bukkit.block.BlockState blockstate : blocks) {
|
for (org.bukkit.block.BlockState blockstate : blocks) {
|
||||||
((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).revertPlace();
|
((org.bukkit.craftbukkit.block.CraftBlockState) blockstate).revertPlace();
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
SignItem.openSign = null; // SPIGOT-6758 - Reset on early return
|
SignItem.openSign = null; // SPIGOT-6758 - Reset on early return
|
||||||
@@ -476,6 +_,7 @@
|
@@ -475,6 +_,7 @@
|
||||||
if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically
|
if (!(block.getBlock() instanceof net.minecraft.world.level.block.BaseEntityBlock)) { // Containers get placed automatically
|
||||||
block.onPlace(level, newPos, oldBlock, true, context);
|
block.onPlace(level, newPos, oldBlock, true, context);
|
||||||
}
|
}
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
level.notifyAndUpdatePhysics(newPos, null, oldBlock, block, level.getBlockState(newPos), updateFlags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point
|
level.notifyAndUpdatePhysics(newPos, null, oldBlock, block, level.getBlockState(newPos), updateFlags, net.minecraft.world.level.block.Block.UPDATE_LIMIT); // send null chunk as chunk.k() returns false by this point
|
||||||
}
|
}
|
||||||
@@ -591,6 +_,26 @@
|
@@ -590,6 +_,26 @@
|
||||||
return this.isDamageableItem() && this.getDamageValue() > 0;
|
return this.isDamageableItem() && this.getDamageValue() > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/item/SpawnEggItem.java
|
--- a/net/minecraft/world/item/SpawnEggItem.java
|
||||||
+++ b/net/minecraft/world/item/SpawnEggItem.java
|
+++ b/net/minecraft/world/item/SpawnEggItem.java
|
||||||
@@ -64,6 +_,23 @@
|
@@ -61,6 +_,23 @@
|
||||||
return InteractionResult.FAIL;
|
return InteractionResult.FAIL;
|
||||||
} else {
|
} else {
|
||||||
if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation
|
if (level.paperConfig().entities.spawning.disableMobSpawnerSpawnEggTransformation) return InteractionResult.FAIL; // Paper - Allow disabling mob spawner spawn egg transformation
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/BaseSpawner.java
|
--- a/net/minecraft/world/level/BaseSpawner.java
|
||||||
+++ b/net/minecraft/world/level/BaseSpawner.java
|
+++ b/net/minecraft/world/level/BaseSpawner.java
|
||||||
@@ -60,6 +_,7 @@
|
@@ -66,6 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isNearPlayer(final Level level, final BlockPos pos) {
|
public boolean isNearPlayer(final Level level, final BlockPos pos) {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/EntityGetter.java
|
--- a/net/minecraft/world/level/EntityGetter.java
|
||||||
+++ b/net/minecraft/world/level/EntityGetter.java
|
+++ b/net/minecraft/world/level/EntityGetter.java
|
||||||
@@ -183,7 +_,7 @@
|
@@ -142,7 +_,7 @@
|
||||||
|
|
||||||
default boolean hasNearbyAlivePlayer(final double x, final double y, final double z, final double range) {
|
default boolean hasNearbyAlivePlayer(final double x, final double y, final double z, final double range) {
|
||||||
for (Player player : this.players()) {
|
for (Player player : this.players()) {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@
|
|||||||
public CraftWorld getWorld() {
|
public CraftWorld getWorld() {
|
||||||
return this.world;
|
return this.world;
|
||||||
}
|
}
|
||||||
@@ -852,6 +_,8 @@
|
@@ -220,6 +_,8 @@
|
||||||
final org.bukkit.NamespacedKey worldKey = CraftNamespacedKey.fromMinecraft(dimension.identifier()); // Paper
|
final org.bukkit.NamespacedKey worldKey = CraftNamespacedKey.fromMinecraft(dimension.identifier()); // Paper
|
||||||
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(bukkitName, worldKey); // Spigot
|
this.spigotConfig = new org.spigotmc.SpigotWorldConfig(bukkitName, worldKey); // Spigot
|
||||||
this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config
|
this.paperConfig = paperWorldConfigCreator.apply(this.spigotConfig); // Paper - create paper world config
|
||||||
@@ -64,8 +64,8 @@
|
|||||||
this.generator = generator;
|
this.generator = generator;
|
||||||
this.world = new CraftWorld((ServerLevel) this, worldKey, biomeProvider, environment);
|
this.world = new CraftWorld((ServerLevel) this, worldKey, biomeProvider, environment);
|
||||||
|
|
||||||
@@ -2197,4 +_,14 @@
|
@@ -1504,4 +_,14 @@
|
||||||
return this.moonrise$getEntityLookup().getEntityCount(); // Paper - rewrite chunk system
|
return ret;
|
||||||
}
|
}
|
||||||
// Paper end - allow patching this logic
|
// Paper end - allow patching this logic
|
||||||
+
|
+
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/NaturalSpawner.java
|
--- a/net/minecraft/world/level/NaturalSpawner.java
|
||||||
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
+++ b/net/minecraft/world/level/NaturalSpawner.java
|
||||||
@@ -289,7 +_,7 @@
|
@@ -213,7 +_,7 @@
|
||||||
pos.set(x, yStart, z);
|
pos.set(x, yStart, z);
|
||||||
double xx = x + 0.5;
|
double xx = x + 0.5;
|
||||||
double zz = z + 0.5;
|
double zz = z + 0.5;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/block/Block.java
|
--- a/net/minecraft/world/level/block/Block.java
|
||||||
+++ b/net/minecraft/world/level/block/Block.java
|
+++ b/net/minecraft/world/level/block/Block.java
|
||||||
@@ -114,6 +_,10 @@
|
@@ -111,6 +_,10 @@
|
||||||
public static final int UPDATE_LIMIT = 512;
|
public static final int UPDATE_LIMIT = 512;
|
||||||
protected final StateDefinition<Block, BlockState> stateDefinition;
|
protected final StateDefinition<Block, BlockState> stateDefinition;
|
||||||
private BlockState defaultBlockState;
|
private BlockState defaultBlockState;
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
// Paper start - Protect Bedrock and End Portal/Frames from being destroyed
|
// Paper start - Protect Bedrock and End Portal/Frames from being destroyed
|
||||||
public final boolean isDestroyable() {
|
public final boolean isDestroyable() {
|
||||||
return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits ||
|
return io.papermc.paper.configuration.GlobalConfiguration.get().unsupportedSettings.allowPermanentBlockBreakExploits ||
|
||||||
@@ -415,7 +_,7 @@
|
@@ -412,7 +_,7 @@
|
||||||
event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping
|
event.setExpToDrop(block.getExpDrop(state, serverLevel, pos, net.minecraft.world.item.ItemStack.EMPTY, true)); // Paper - Properly handle xp dropping
|
||||||
event.callEvent();
|
event.callEvent();
|
||||||
for (org.bukkit.inventory.ItemStack drop : event.getDrops()) {
|
for (org.bukkit.inventory.ItemStack drop : event.getDrops()) {
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
}
|
}
|
||||||
state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping
|
state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, false); // Paper - Properly handle xp dropping
|
||||||
block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping
|
block.popExperience(serverLevel, pos, event.getExpToDrop()); // Paper - Properly handle xp dropping
|
||||||
@@ -433,7 +_,7 @@
|
@@ -430,7 +_,7 @@
|
||||||
|
|
||||||
public static void dropResources(final BlockState state, final LevelAccessor level, final BlockPos pos, final @Nullable BlockEntity blockEntity) {
|
public static void dropResources(final BlockState state, final LevelAccessor level, final BlockPos pos, final @Nullable BlockEntity blockEntity) {
|
||||||
if (level instanceof ServerLevel serverLevel) {
|
if (level instanceof ServerLevel serverLevel) {
|
||||||
@@ -29,7 +29,7 @@
|
|||||||
state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, true);
|
state.spawnAfterBreak(serverLevel, pos, ItemStack.EMPTY, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -454,11 +_,30 @@
|
@@ -451,11 +_,30 @@
|
||||||
, final boolean dropExperience // Paper - Properly handle xp dropping
|
, final boolean dropExperience // Paper - Properly handle xp dropping
|
||||||
) {
|
) {
|
||||||
if (level instanceof ServerLevel serverLevel) {
|
if (level instanceof ServerLevel serverLevel) {
|
||||||
@@ -59,9 +59,9 @@
|
|||||||
+ // Purpur end - Persistent BlockEntity Lore and DisplayName
|
+ // Purpur end - Persistent BlockEntity Lore and DisplayName
|
||||||
+
|
+
|
||||||
public static void popResource(final Level level, final BlockPos pos, final ItemStack itemStack) {
|
public static void popResource(final Level level, final BlockPos pos, final ItemStack itemStack) {
|
||||||
double halfHeight = EntityType.ITEM.getHeight() / 2.0;
|
double halfHeight = EntityTypes.ITEM.getHeight() / 2.0;
|
||||||
RandomSource random = level.getRandom();
|
RandomSource random = level.getRandom();
|
||||||
@@ -548,7 +_,15 @@
|
@@ -545,7 +_,15 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPlacedBy(final Level level, final BlockPos pos, final BlockState state, final @Nullable LivingEntity by, final ItemStack itemStack) {
|
public void setPlacedBy(final Level level, final BlockPos pos, final BlockState state, final @Nullable LivingEntity by, final ItemStack itemStack) {
|
||||||
@@ -78,7 +78,7 @@
|
|||||||
|
|
||||||
public boolean isPossibleToRespawnInThis(final BlockState state) {
|
public boolean isPossibleToRespawnInThis(final BlockState state) {
|
||||||
return !state.isSolid() && !state.liquid();
|
return !state.isSolid() && !state.liquid();
|
||||||
@@ -559,7 +_,7 @@
|
@@ -556,7 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fallOn(final Level level, final BlockState state, final BlockPos pos, final Entity entity, final double fallDistance) {
|
public void fallOn(final Level level, final BlockState state, final BlockPos pos, final Entity entity, final double fallDistance) {
|
||||||
@@ -86,4 +86,4 @@
|
|||||||
+ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, entity.damageSources().fall()); // Purpur - Configurable block fall damage modifiers
|
+ entity.causeFallDamage(fallDistance * fallDistanceMultiplier, fallDamageMultiplier, entity.damageSources().fall()); // Purpur - Configurable block fall damage modifiers
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateEntityMovementAfterFallOn(final BlockGetter level, final Entity entity) {
|
public float getBounceRestitution() {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/block/Blocks.java
|
--- a/net/minecraft/world/level/block/Blocks.java
|
||||||
+++ b/net/minecraft/world/level/block/Blocks.java
|
+++ b/net/minecraft/world/level/block/Blocks.java
|
||||||
@@ -6727,6 +_,7 @@
|
@@ -5519,6 +_,7 @@
|
||||||
BlockBehaviour.Properties.of()
|
BlockBehaviour.Properties.of()
|
||||||
.mapColor(MapColor.PLANT)
|
.mapColor(MapColor.PLANT)
|
||||||
.forceSolidOff()
|
.forceSolidOff()
|
||||||
@@ -8,7 +8,7 @@
|
|||||||
.instabreak()
|
.instabreak()
|
||||||
.sound(SoundType.AZALEA)
|
.sound(SoundType.AZALEA)
|
||||||
.noOcclusion()
|
.noOcclusion()
|
||||||
@@ -6738,6 +_,7 @@
|
@@ -5530,6 +_,7 @@
|
||||||
BlockBehaviour.Properties.of()
|
BlockBehaviour.Properties.of()
|
||||||
.mapColor(MapColor.PLANT)
|
.mapColor(MapColor.PLANT)
|
||||||
.forceSolidOff()
|
.forceSolidOff()
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/block/CampfireBlock.java
|
--- a/net/minecraft/world/level/block/CampfireBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/CampfireBlock.java
|
+++ b/net/minecraft/world/level/block/CampfireBlock.java
|
||||||
@@ -136,7 +_,7 @@
|
@@ -137,7 +_,7 @@
|
||||||
return this.defaultBlockState()
|
return this.defaultBlockState()
|
||||||
.setValue(WATERLOGGED, replacedWater)
|
.setValue(WATERLOGGED, replacedWater)
|
||||||
.setValue(SIGNAL_FIRE, this.isSmokeSource(level.getBlockState(pos.below())))
|
.setValue(SIGNAL_FIRE, this.isSmokeSource(level.getBlockState(pos.below())))
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
+++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java
|
+++ b/net/minecraft/world/level/block/CarvedPumpkinBlock.java
|
||||||
@@ -67,7 +_,7 @@
|
@@ -67,7 +_,7 @@
|
||||||
if (snowGolemMatch != null) {
|
if (snowGolemMatch != null) {
|
||||||
SnowGolem snowGolem = EntityType.SNOW_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
SnowGolem snowGolem = EntityTypes.SNOW_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
||||||
if (snowGolem != null) {
|
if (snowGolem != null) {
|
||||||
- spawnGolemInWorld(level, snowGolemMatch, snowGolem, snowGolemMatch.getBlock(0, 2, 0).getPos());
|
- spawnGolemInWorld(level, snowGolemMatch, snowGolem, snowGolemMatch.getBlock(0, 2, 0).getPos());
|
||||||
+ spawnGolemInWorld(level, snowGolemMatch, snowGolem, snowGolemMatch.getBlock(0, 2, 0).getPos(), this.placer); // Purpur - Summoner API
|
+ spawnGolemInWorld(level, snowGolemMatch, snowGolem, snowGolemMatch.getBlock(0, 2, 0).getPos(), this.placer); // Purpur - Summoner API
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -77,7 +_,7 @@
|
@@ -77,7 +_,7 @@
|
||||||
IronGolem ironGolem = EntityType.IRON_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
IronGolem ironGolem = EntityTypes.IRON_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
||||||
if (ironGolem != null) {
|
if (ironGolem != null) {
|
||||||
ironGolem.setPlayerCreated(true);
|
ironGolem.setPlayerCreated(true);
|
||||||
- spawnGolemInWorld(level, ironGolemMatch, ironGolem, ironGolemMatch.getBlock(1, 2, 0).getPos());
|
- spawnGolemInWorld(level, ironGolemMatch, ironGolem, ironGolemMatch.getBlock(1, 2, 0).getPos());
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
}
|
}
|
||||||
@@ -86,7 +_,7 @@
|
@@ -86,7 +_,7 @@
|
||||||
if (copperGolemMatch != null) {
|
if (copperGolemMatch != null) {
|
||||||
CopperGolem copperGolem = EntityType.COPPER_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
CopperGolem copperGolem = EntityTypes.COPPER_GOLEM.create(level, EntitySpawnReason.TRIGGERED);
|
||||||
if (copperGolem != null) {
|
if (copperGolem != null) {
|
||||||
- spawnGolemInWorld(level, copperGolemMatch, copperGolem, copperGolemMatch.getBlock(0, 0, 0).getPos());
|
- spawnGolemInWorld(level, copperGolemMatch, copperGolem, copperGolemMatch.getBlock(0, 0, 0).getPos());
|
||||||
+ spawnGolemInWorld(level, copperGolemMatch, copperGolem, copperGolemMatch.getBlock(0, 0, 0).getPos(), this.placer); // Purpur - Summoner API
|
+ spawnGolemInWorld(level, copperGolemMatch, copperGolem, copperGolemMatch.getBlock(0, 0, 0).getPos(), this.placer); // Purpur - Summoner API
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/block/ChestBlock.java
|
--- a/net/minecraft/world/level/block/ChestBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/ChestBlock.java
|
+++ b/net/minecraft/world/level/block/ChestBlock.java
|
||||||
@@ -347,6 +_,7 @@
|
@@ -348,6 +_,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isBlockedChestByBlock(final BlockGetter level, final BlockPos pos) {
|
public static boolean isBlockedChestByBlock(final BlockGetter level, final BlockPos pos) {
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
--- a/net/minecraft/world/level/block/NetherPortalBlock.java
|
--- a/net/minecraft/world/level/block/NetherPortalBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/NetherPortalBlock.java
|
+++ b/net/minecraft/world/level/block/NetherPortalBlock.java
|
||||||
@@ -68,7 +_,7 @@
|
@@ -70,7 +_,7 @@
|
||||||
protected void randomTick(final BlockState state, final ServerLevel level, BlockPos pos, final RandomSource random) {
|
if (level.spigotConfig.enableZombiePigmenPortalSpawns && level.isSpawningMonsters() // Paper
|
||||||
if (level.spigotConfig.enableZombiePigmenPortalSpawns && level.isSpawningMonsters() // Spigot
|
&& level.getLevelData().getDifficulty() != Difficulty.PEACEFUL
|
||||||
&& level.environmentAttributes().getValue(EnvironmentAttributes.NETHER_PORTAL_SPAWNS_PIGLINS, pos)
|
&& level.environmentAttributes().getValue(EnvironmentAttributes.NETHER_PORTAL_SPAWNS_PIGLINS, pos)
|
||||||
- && random.nextInt(2000) < level.getDifficulty().getId()
|
- && random.nextInt(2000) < level.getDifficulty().getId()
|
||||||
+ && random.nextInt(level.purpurConfig.piglinPortalSpawnModifier) < level.getDifficulty().getId() // Purpur - Piglin portal spawn modifier
|
+ && random.nextInt(level.purpurConfig.piglinPortalSpawnModifier) < level.getDifficulty().getId() // Purpur - Piglin portal spawn modifier
|
||||||
&& level.anyPlayerCloseEnoughForSpawning(pos)) {
|
&& level.anyPlayerCloseEnoughForSpawning(pos)) {
|
||||||
while (level.getBlockState(pos).is(this)) {
|
while (level.getBlockState(pos).is(this)) {
|
||||||
pos = pos.below();
|
pos = pos.below();
|
||||||
@@ -133,7 +_,7 @@
|
@@ -135,7 +_,7 @@
|
||||||
@Override
|
@Override
|
||||||
public int getPortalTransitionTime(final ServerLevel level, final Entity entity) {
|
public int getPortalTransitionTime(final ServerLevel level, final Entity entity) {
|
||||||
return entity instanceof Player player
|
return entity instanceof Player player
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
--- a/net/minecraft/world/level/block/PointedDripstoneBlock.java
|
--- a/net/minecraft/world/level/block/PointedDripstoneBlock.java
|
||||||
+++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java
|
+++ b/net/minecraft/world/level/block/PointedDripstoneBlock.java
|
||||||
@@ -196,20 +_,20 @@
|
@@ -89,20 +_,20 @@
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static void maybeTransferFluid(final BlockState state, final ServerLevel level, final BlockPos pos, final float randomValue) {
|
public static void maybeTransferFluid(final BlockState state, final ServerLevel level, final BlockPos pos, final float randomValue) {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user