|
|
|
|
@@ -1,6 +1,6 @@
|
|
|
|
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
|
|
|
From: granny <contact@granny.dev>
|
|
|
|
|
Date: Tue, 7 May 2024 13:13:47 +0000
|
|
|
|
|
Date: Mon, 6 May 2024 15:08:02 +0900
|
|
|
|
|
Subject: [PATCH] Purpur Server Changes
|
|
|
|
|
|
|
|
|
|
PurpurMC
|
|
|
|
|
@@ -2742,7 +2742,7 @@ index 0981d440d0dbfe4df668d1f3f1b5706a93bc4434..f72af2feb74626abbdfbfd090c153574
|
|
|
|
|
}
|
|
|
|
|
// Paper end - Fix merchant inventory not closing on entity removal
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/level/ServerPlayer.java b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
|
|
|
index 8437316888c6056060a2780652147590b6fe7443..d7e4a9fe9676563845d9981523bff1a7ff12282c 100644
|
|
|
|
|
index 8437316888c6056060a2780652147590b6fe7443..42a623254bd2886d09eb0cfeb01dd12d0dda19cf 100644
|
|
|
|
|
--- a/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
|
|
|
+++ b/src/main/java/net/minecraft/server/level/ServerPlayer.java
|
|
|
|
|
@@ -298,6 +298,10 @@ public class ServerPlayer extends Player {
|
|
|
|
|
@@ -2883,15 +2883,7 @@ index 8437316888c6056060a2780652147590b6fe7443..d7e4a9fe9676563845d9981523bff1a7
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
((ServerLevel) this.level()).updateSleepingPlayerList();
|
|
|
|
|
@@ -1643,6 +1686,7 @@ public class ServerPlayer extends Player {
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public void openTextEdit(SignBlockEntity sign, boolean front) {
|
|
|
|
|
+ if (level().purpurConfig.signAllowColors) this.connection.send(sign.getTranslatedUpdatePacket(textFilteringEnabled, front)); // Purpur
|
|
|
|
|
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), sign.getBlockPos()));
|
|
|
|
|
this.connection.send(new ClientboundOpenSignEditorPacket(sign.getBlockPos(), front));
|
|
|
|
|
}
|
|
|
|
|
@@ -1977,6 +2021,26 @@ public class ServerPlayer extends Player {
|
|
|
|
|
@@ -1977,6 +2020,26 @@ public class ServerPlayer extends Player {
|
|
|
|
|
this.lastSentExp = -1; // CraftBukkit - Added to reset
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2918,7 +2910,7 @@ index 8437316888c6056060a2780652147590b6fe7443..d7e4a9fe9676563845d9981523bff1a7
|
|
|
|
|
@Override
|
|
|
|
|
public void displayClientMessage(Component message, boolean overlay) {
|
|
|
|
|
this.sendSystemMessage(message, overlay);
|
|
|
|
|
@@ -2296,8 +2360,68 @@ public class ServerPlayer extends Player {
|
|
|
|
|
@@ -2296,8 +2359,68 @@ public class ServerPlayer extends Player {
|
|
|
|
|
|
|
|
|
|
public void resetLastActionTime() {
|
|
|
|
|
this.lastActionTime = Util.getMillis();
|
|
|
|
|
@@ -2987,7 +2979,7 @@ index 8437316888c6056060a2780652147590b6fe7443..d7e4a9fe9676563845d9981523bff1a7
|
|
|
|
|
public ServerStatsCounter getStats() {
|
|
|
|
|
return this.stats;
|
|
|
|
|
}
|
|
|
|
|
@@ -2865,4 +2989,50 @@ public class ServerPlayer extends Player {
|
|
|
|
|
@@ -2865,4 +2988,50 @@ public class ServerPlayer extends Player {
|
|
|
|
|
return (CraftPlayer) super.getBukkitEntity();
|
|
|
|
|
}
|
|
|
|
|
// CraftBukkit end
|
|
|
|
|
@@ -3186,7 +3178,7 @@ index 8ac5d8ccf731100a1be690cb2ed1be82cadba8ed..8368c5ff929df9d32cdb95cc2da0e9f7
|
|
|
|
|
|
|
|
|
|
private boolean checkIfClosed(long time) {
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
|
index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07db1bc20da 100644
|
|
|
|
|
index 5e9202bc7fc649764568b55d66ba0d684118c00c..cd6fe5e2dd8217708e27a8f2eed9c055f2707031 100644
|
|
|
|
|
--- a/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
|
+++ b/src/main/java/net/minecraft/server/network/ServerGamePacketListenerImpl.java
|
|
|
|
|
@@ -332,6 +332,20 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -3264,86 +3256,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
server.scheduleOnMain(() -> this.disconnect("Book too large!", org.bukkit.event.player.PlayerKickEvent.Cause.ILLEGAL_ACTION)); // Paper - kick event cause
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
@@ -1212,10 +1241,14 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
Objects.requireNonNull(list);
|
|
|
|
|
stream.forEach(list::add);
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ boolean hasEditPerm = getCraftPlayer().hasPermission("purpur.book.color.edit");
|
|
|
|
|
+ boolean hasSignPerm = hasEditPerm || getCraftPlayer().hasPermission("purpur.book.color.sign");
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
Consumer<List<FilteredText>> consumer = optional.isPresent() ? (list1) -> {
|
|
|
|
|
- this.signBook((FilteredText) list1.get(0), list1.subList(1, list1.size()), i);
|
|
|
|
|
+ this.signBook((FilteredText) list1.get(0), list1.subList(1, list1.size()), i, hasSignPerm); // Purpur
|
|
|
|
|
} : (list1) -> {
|
|
|
|
|
- this.updateBookContents(list1, i);
|
|
|
|
|
+ this.updateBookContents(list1, i, hasEditPerm); // Purpur
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
this.filterTextPacket((List) list).thenAcceptAsync(consumer, this.server);
|
|
|
|
|
@@ -1223,13 +1256,18 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void updateBookContents(List<FilteredText> pages, int slotId) {
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ updateBookContents(pages, slotId, false);
|
|
|
|
|
+ }
|
|
|
|
|
+ private void updateBookContents(List<FilteredText> pages, int slotId, boolean hasPerm) {
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
// CraftBukkit start
|
|
|
|
|
ItemStack handItem = this.player.getInventory().getItem(slotId);
|
|
|
|
|
ItemStack itemstack = handItem.copy();
|
|
|
|
|
// CraftBukkit end
|
|
|
|
|
|
|
|
|
|
if (itemstack.is(Items.WRITABLE_BOOK)) {
|
|
|
|
|
- List<Filterable<String>> list1 = pages.stream().map(this::filterableFromOutgoing).toList();
|
|
|
|
|
+ List<Filterable<String>> list1 = pages.stream().map(filteredText -> filterableFromOutgoing(filteredText).map(s -> color(s, hasPerm))).toList(); // Purpur
|
|
|
|
|
|
|
|
|
|
itemstack.set(DataComponents.WRITABLE_BOOK_CONTENT, new WritableBookContent(list1));
|
|
|
|
|
this.player.getInventory().setItem(slotId, CraftEventFactory.handleEditBookEvent(this.player, slotId, handItem, itemstack)); // CraftBukkit // Paper - Don't ignore result (see other callsite for handleEditBookEvent)
|
|
|
|
|
@@ -1237,6 +1275,11 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void signBook(FilteredText title, List<FilteredText> pages, int slotId) {
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ signBook(title, pages, slotId, false);
|
|
|
|
|
+ }
|
|
|
|
|
+ private void signBook(FilteredText title, List<FilteredText> pages, int slotId, boolean hasPerm) {
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
ItemStack itemstack = this.player.getInventory().getItem(slotId);
|
|
|
|
|
|
|
|
|
|
if (itemstack.is(Items.WRITABLE_BOOK)) {
|
|
|
|
|
@@ -1244,10 +1287,10 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
itemstack1.remove(DataComponents.WRITABLE_BOOK_CONTENT);
|
|
|
|
|
List<Filterable<Component>> list1 = (List<Filterable<Component>>) (List) pages.stream().map((filteredtext1) -> { // CraftBukkit - decompile error
|
|
|
|
|
- return this.filterableFromOutgoing(filteredtext1).map(Component::literal);
|
|
|
|
|
+ return this.filterableFromOutgoing(filteredtext1).map(s -> hexColor(s, hasPerm)); // Purpur
|
|
|
|
|
}).toList();
|
|
|
|
|
|
|
|
|
|
- itemstack1.set(DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title), this.player.getName().getString(), 0, list1, true));
|
|
|
|
|
+ itemstack1.set(DataComponents.WRITTEN_BOOK_CONTENT, new WrittenBookContent(this.filterableFromOutgoing(title).map(s -> color(s, hasPerm)), this.player.getName().getString(), 0, list1, true)); // Purpur
|
|
|
|
|
CraftEventFactory.handleEditBookEvent(this.player, slotId, itemstack, itemstack1); // CraftBukkit
|
|
|
|
|
this.player.getInventory().setItem(slotId, itemstack); // CraftBukkit - event factory updates the hand book
|
|
|
|
|
}
|
|
|
|
|
@@ -1257,6 +1300,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
return this.player.isTextFilteringEnabled() ? Filterable.passThrough(message.filteredOrEmpty()) : Filterable.from(message);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ private Component hexColor(String str, boolean hasPerm) {
|
|
|
|
|
+ return hasPerm ? PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().deserialize(str)) : Component.literal(str);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private String color(String str, boolean hasPerm) {
|
|
|
|
|
+ return hasPerm ? org.bukkit.ChatColor.color(str, false) : str;
|
|
|
|
|
+ }
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
+
|
|
|
|
|
@Override
|
|
|
|
|
public void handleEntityTagQuery(ServerboundEntityTagQueryPacket packet) {
|
|
|
|
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
|
|
|
|
@@ -1306,8 +1359,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1306,8 +1335,16 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@Override
|
|
|
|
|
public void handleMovePlayer(ServerboundMovePlayerPacket packet) {
|
|
|
|
|
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.serverLevel());
|
|
|
|
|
@@ -3361,7 +3274,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
} else {
|
|
|
|
|
ServerLevel worldserver = this.player.serverLevel();
|
|
|
|
|
|
|
|
|
|
@@ -1494,7 +1555,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1494,7 +1531,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
movedWrongly = true;
|
|
|
|
|
if (event.getLogWarning())
|
|
|
|
|
// Paper end
|
|
|
|
|
@@ -3370,7 +3283,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
} // Paper
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1562,6 +1623,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1562,6 +1599,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
this.lastYaw = to.getYaw();
|
|
|
|
|
this.lastPitch = to.getPitch();
|
|
|
|
|
|
|
|
|
|
@@ -3379,7 +3292,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
Location oldTo = to.clone();
|
|
|
|
|
PlayerMoveEvent event = new PlayerMoveEvent(player, from, to);
|
|
|
|
|
this.cserver.getPluginManager().callEvent(event);
|
|
|
|
|
@@ -1603,6 +1666,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1603,6 +1642,13 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
this.player.resetCurrentImpulseContext();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -3393,7 +3306,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
this.player.checkMovementStatistics(this.player.getX() - d3, this.player.getY() - d4, this.player.getZ() - d5);
|
|
|
|
|
this.lastGoodX = this.player.getX();
|
|
|
|
|
this.lastGoodY = this.player.getY();
|
|
|
|
|
@@ -1642,6 +1712,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1642,6 +1688,15 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
// Paper end - optimise out extra getCubes
|
|
|
|
|
@@ -3409,7 +3322,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
private boolean isPlayerCollidingWithAnythingNew(LevelReader world, AABB box, double newX, double newY, double newZ) {
|
|
|
|
|
AABB axisalignedbb1 = this.player.getBoundingBox().move(newX - this.player.getX(), newY - this.player.getY(), newZ - this.player.getZ());
|
|
|
|
|
Iterable<VoxelShape> iterable = world.getCollisions(this.player, axisalignedbb1.deflate(9.999999747378752E-6D));
|
|
|
|
|
@@ -1652,7 +1731,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1652,7 +1707,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
do {
|
|
|
|
|
if (!iterator.hasNext()) {
|
|
|
|
|
@@ -3418,7 +3331,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
voxelshape1 = (VoxelShape) iterator.next();
|
|
|
|
|
@@ -1990,6 +2069,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -1990,6 +2045,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
boolean cancelled;
|
|
|
|
|
if (movingobjectposition == null || movingobjectposition.getType() != HitResult.Type.BLOCK) {
|
|
|
|
|
@@ -3426,7 +3339,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
org.bukkit.event.player.PlayerInteractEvent event = CraftEventFactory.callPlayerInteractEvent(this.player, Action.RIGHT_CLICK_AIR, itemstack, enumhand);
|
|
|
|
|
cancelled = event.useItemInHand() == Event.Result.DENY;
|
|
|
|
|
} else {
|
|
|
|
|
@@ -2466,7 +2546,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -2466,7 +2522,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
public void handleCommand(String s) { // Paper - private -> public
|
|
|
|
|
org.spigotmc.AsyncCatcher.catchOp("Command Dispatched Async: " + s); // Paper - Add async catcher
|
|
|
|
|
@@ -3435,7 +3348,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
if ( org.spigotmc.SpigotConfig.logCommands ) // Spigot
|
|
|
|
|
this.LOGGER.info(this.player.getScoreboardName() + " issued server command: " + s);
|
|
|
|
|
|
|
|
|
|
@@ -2476,7 +2556,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -2476,7 +2532,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
this.cserver.getPluginManager().callEvent(event);
|
|
|
|
|
|
|
|
|
|
if (event.isCancelled()) {
|
|
|
|
|
@@ -3444,7 +3357,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -2489,7 +2569,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -2489,7 +2545,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
java.util.logging.Logger.getLogger(ServerGamePacketListenerImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
|
|
|
|
|
return;
|
|
|
|
|
} finally {
|
|
|
|
|
@@ -3453,7 +3366,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// CraftBukkit end
|
|
|
|
|
@@ -2776,6 +2856,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -2776,6 +2832,7 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
AABB axisalignedbb = entity.getBoundingBox();
|
|
|
|
|
|
|
|
|
|
if (this.player.canInteractWithEntity(axisalignedbb, 1.0D)) {
|
|
|
|
|
@@ -3461,7 +3374,7 @@ index 5e9202bc7fc649764568b55d66ba0d684118c00c..478f3bba5e0768c8ab800d7cb591f07d
|
|
|
|
|
packet.dispatch(new ServerboundInteractPacket.Handler() {
|
|
|
|
|
private void performInteraction(InteractionHand enumhand, ServerGamePacketListenerImpl.EntityInteraction playerconnection_a, PlayerInteractEntityEvent event) { // CraftBukkit
|
|
|
|
|
ItemStack itemstack = ServerGamePacketListenerImpl.this.player.getItemInHand(enumhand);
|
|
|
|
|
@@ -2789,6 +2870,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
@@ -2789,6 +2846,8 @@ public class ServerGamePacketListenerImpl extends ServerCommonPacketListenerImpl
|
|
|
|
|
|
|
|
|
|
ServerGamePacketListenerImpl.this.cserver.getPluginManager().callEvent(event);
|
|
|
|
|
|
|
|
|
|
@@ -12811,10 +12724,10 @@ index ac411202c0029052a962b51b015da191b124de5f..ae3eb87af8d3853be82c2002507141e4
|
|
|
|
|
this.targetSelector.addGoal(2, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
|
|
|
|
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, false));
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/entity/monster/Ravager.java b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
|
|
|
|
|
index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff6abae4a2 100644
|
|
|
|
|
index 2d7b7c949faaaaae94c0043132a4a822f55df104..9551bd7c9bed37cf17910e7f71b82ed20fb2d759 100644
|
|
|
|
|
--- a/src/main/java/net/minecraft/world/entity/monster/Ravager.java
|
|
|
|
|
+++ b/src/main/java/net/minecraft/world/entity/monster/Ravager.java
|
|
|
|
|
@@ -68,14 +68,55 @@ public class Ravager extends Raider {
|
|
|
|
|
@@ -68,14 +68,54 @@ public class Ravager extends Raider {
|
|
|
|
|
this.setPathfindingMalus(PathType.LEAVES, 0.0F);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -12861,7 +12774,6 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff
|
|
|
|
|
super.registerGoals();
|
|
|
|
|
this.goalSelector.addGoal(0, new FloatGoal(this));
|
|
|
|
|
+ this.goalSelector.addGoal(0, new org.purpurmc.purpur.entity.ai.HasRider(this)); // Purpur
|
|
|
|
|
+ if (level().purpurConfig.ravagerAvoidRabbits) this.goalSelector.addGoal(3, new net.minecraft.world.entity.ai.goal.AvoidEntityGoal<>(this, net.minecraft.world.entity.animal.Rabbit.class, 6.0F, 1.0D, 1.2D)); // Purpur
|
|
|
|
|
this.goalSelector.addGoal(4, new MeleeAttackGoal(this, 1.0D, true));
|
|
|
|
|
this.goalSelector.addGoal(5, new WaterAvoidingRandomStrollGoal(this, 0.4D));
|
|
|
|
|
this.goalSelector.addGoal(6, new LookAtPlayerGoal(this, Player.class, 6.0F));
|
|
|
|
|
@@ -12870,7 +12782,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff
|
|
|
|
|
this.targetSelector.addGoal(2, (new HurtByTargetGoal(this, new Class[]{Raider.class})).setAlertOthers());
|
|
|
|
|
this.targetSelector.addGoal(3, new NearestAttackableTargetGoal<>(this, Player.class, true));
|
|
|
|
|
this.targetSelector.addGoal(4, new NearestAttackableTargetGoal<>(this, AbstractVillager.class, true, (entityliving) -> {
|
|
|
|
|
@@ -128,7 +169,7 @@ public class Ravager extends Raider {
|
|
|
|
|
@@ -128,7 +168,7 @@ public class Ravager extends Raider {
|
|
|
|
|
@Override
|
|
|
|
|
public void aiStep() {
|
|
|
|
|
super.aiStep();
|
|
|
|
|
@@ -12879,7 +12791,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff
|
|
|
|
|
if (this.isImmobile()) {
|
|
|
|
|
this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(0.0D);
|
|
|
|
|
} else {
|
|
|
|
|
@@ -138,7 +179,7 @@ public class Ravager extends Raider {
|
|
|
|
|
@@ -138,7 +178,7 @@ public class Ravager extends Raider {
|
|
|
|
|
this.getAttribute(Attributes.MOVEMENT_SPEED).setBaseValue(Mth.lerp(0.1D, d1, d0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -12888,7 +12800,7 @@ index 2d7b7c949faaaaae94c0043132a4a822f55df104..dbfcca8adb7afa7a3101f22c2bc48aff
|
|
|
|
|
boolean flag = false;
|
|
|
|
|
AABB axisalignedbb = this.getBoundingBox().inflate(0.2D);
|
|
|
|
|
Iterator iterator = BlockPos.betweenClosed(Mth.floor(axisalignedbb.minX), Mth.floor(axisalignedbb.minY), Mth.floor(axisalignedbb.minZ), Mth.floor(axisalignedbb.maxX), Mth.floor(axisalignedbb.maxY), Mth.floor(axisalignedbb.maxZ)).iterator();
|
|
|
|
|
@@ -148,7 +189,7 @@ public class Ravager extends Raider {
|
|
|
|
|
@@ -148,7 +188,7 @@ public class Ravager extends Raider {
|
|
|
|
|
BlockState iblockdata = this.level().getBlockState(blockposition);
|
|
|
|
|
Block block = iblockdata.getBlock();
|
|
|
|
|
|
|
|
|
|
@@ -18954,73 +18866,6 @@ index d47bc2f54c4722a0b8c419b99ee57eb3cb25d750..fdeabdcc781b605d6f3ee18528fd380f
|
|
|
|
|
+ }
|
|
|
|
|
+ // Purpur
|
|
|
|
|
}
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
|
|
|
index a28be7a332659be655f419d969e0c64e659b6c21..8cd812a25b1cc05ea14675658bf9c1503ebebd51 100644
|
|
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
|
|
|
+++ b/src/main/java/net/minecraft/world/level/block/entity/SignBlockEntity.java
|
|
|
|
|
@@ -201,16 +201,31 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
|
|
|
|
|
return this.setText((SignText) textChanger.apply(signtext), front);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ private Component translateColors(org.bukkit.entity.Player player, String line, Style style) {
|
|
|
|
|
+ if (level.purpurConfig.signAllowColors) {
|
|
|
|
|
+ if (player.hasPermission("purpur.sign.color")) line = line.replaceAll("(?i)&([0-9a-fr])", "\u00a7$1");
|
|
|
|
|
+ if (player.hasPermission("purpur.sign.style")) line = line.replaceAll("(?i)&([l-or])", "\u00a7$1");
|
|
|
|
|
+ if (player.hasPermission("purpur.sign.magic")) line = line.replaceAll("(?i)&([kr])", "\u00a7$1");
|
|
|
|
|
+
|
|
|
|
|
+ return io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(line));
|
|
|
|
|
+ } else {
|
|
|
|
|
+ return Component.literal(line).setStyle(style);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
+
|
|
|
|
|
private SignText setMessages(net.minecraft.world.entity.player.Player entityhuman, List<FilteredText> list, SignText signtext, boolean front) { // CraftBukkit
|
|
|
|
|
SignText originalText = signtext; // CraftBukkit
|
|
|
|
|
for (int i = 0; i < list.size(); ++i) {
|
|
|
|
|
FilteredText filteredtext = (FilteredText) list.get(i);
|
|
|
|
|
Style chatmodifier = signtext.getMessage(i, entityhuman.isTextFilteringEnabled()).getStyle();
|
|
|
|
|
|
|
|
|
|
+ org.bukkit.entity.Player player = (org.bukkit.craftbukkit.entity.CraftPlayer) entityhuman.getBukkitEntity(); // Purpur
|
|
|
|
|
if (entityhuman.isTextFilteringEnabled()) {
|
|
|
|
|
- signtext = signtext.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty())).setStyle(chatmodifier)); // Paper - filter sign text to chat only
|
|
|
|
|
+ signtext = signtext.setMessage(i, translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty()), chatmodifier)); // Paper - filter sign text to chat only // Purpur
|
|
|
|
|
} else {
|
|
|
|
|
- signtext = signtext.setMessage(i, Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.raw())).setStyle(chatmodifier), Component.literal(net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty())).setStyle(chatmodifier)); // Paper - filter sign text to chat only
|
|
|
|
|
+ signtext = signtext.setMessage(i, translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.raw()), chatmodifier), translateColors(player, net.minecraft.util.StringUtil.filterText(filteredtext.filteredOrEmpty()), chatmodifier)); // Paper - filter sign text to chat only // Purpur
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -345,6 +360,28 @@ public class SignBlockEntity extends BlockEntity implements CommandSource { // C
|
|
|
|
|
return new CommandSourceStack(commandSource, Vec3.atCenterOf(pos), Vec2.ZERO, (ServerLevel) world, 2, s, (Component) object, world.getServer(), player); // Paper - Fix commands from signs not firing command events
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Purpur start
|
|
|
|
|
+ public ClientboundBlockEntityDataPacket getTranslatedUpdatePacket(boolean filtered, boolean front) {
|
|
|
|
|
+ final CompoundTag nbt = new CompoundTag();
|
|
|
|
|
+ this.saveAdditional(nbt, this.getLevel().registryAccess());
|
|
|
|
|
+ final Component[] lines = front ? frontText.getMessages(filtered) : backText.getMessages(filtered);
|
|
|
|
|
+ final String side = front ? "front_text" : "back_text";
|
|
|
|
|
+ for (int i = 0; i < 4; i++) {
|
|
|
|
|
+ final var component = io.papermc.paper.adventure.PaperAdventure.asAdventure(lines[i]);
|
|
|
|
|
+ final String line = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacyAmpersand().serialize(component);
|
|
|
|
|
+ final var text = net.kyori.adventure.text.Component.text(line);
|
|
|
|
|
+ final String json = net.kyori.adventure.text.serializer.gson.GsonComponentSerializer.gson().serialize(text);
|
|
|
|
|
+ if (!nbt.contains(side)) nbt.put(side, new CompoundTag());
|
|
|
|
|
+ final CompoundTag sideNbt = nbt.getCompound(side);
|
|
|
|
|
+ if (!sideNbt.contains("messages")) sideNbt.put("messages", new net.minecraft.nbt.ListTag());
|
|
|
|
|
+ final net.minecraft.nbt.ListTag messagesNbt = sideNbt.getList("messages", Tag.TAG_STRING);
|
|
|
|
|
+ messagesNbt.set(i, net.minecraft.nbt.StringTag.valueOf(json));
|
|
|
|
|
+ }
|
|
|
|
|
+ nbt.putString("PurpurEditor", "true");
|
|
|
|
|
+ return ClientboundBlockEntityDataPacket.create(this, (blockEntity, registryAccess) -> nbt);
|
|
|
|
|
+ }
|
|
|
|
|
+ // Purpur end
|
|
|
|
|
+
|
|
|
|
|
@Override
|
|
|
|
|
public ClientboundBlockEntityDataPacket getUpdatePacket() {
|
|
|
|
|
return ClientboundBlockEntityDataPacket.create(this);
|
|
|
|
|
diff --git a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java b/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java
|
|
|
|
|
index 93bd70c1dc2ba8b893a6087730071c81fb1132f4..fb9611866671880fc7a1a969da928b8f2ad15269 100644
|
|
|
|
|
--- a/src/main/java/net/minecraft/world/level/block/entity/TheEndGatewayBlockEntity.java
|
|
|
|
|
@@ -21348,10 +21193,10 @@ index 0000000000000000000000000000000000000000..f49108ed94f7787347c5e0a721646083
|
|
|
|
|
+}
|
|
|
|
|
diff --git a/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000000000000000000000000000000000000..d8de8710d9b8cf2ae5c434b2b0b27e76ffbbe4bf
|
|
|
|
|
index 0000000000000000000000000000000000000000..7a9a5985b1429c25467db732678d0658aafcfafa
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ b/src/main/java/org/purpurmc/purpur/PurpurWorldConfig.java
|
|
|
|
|
@@ -0,0 +1,3306 @@
|
|
|
|
|
@@ -0,0 +1,3299 @@
|
|
|
|
|
+package org.purpurmc.purpur;
|
|
|
|
|
+
|
|
|
|
|
+import net.minecraft.core.registries.BuiltInRegistries;
|
|
|
|
|
@@ -22465,11 +22310,6 @@ index 0000000000000000000000000000000000000000..d8de8710d9b8cf2ae5c434b2b0b27e76
|
|
|
|
|
+ sculkShriekerCanSummonDefault = getBoolean("blocks.sculk_shrieker.can-summon-default", sculkShriekerCanSummonDefault);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public boolean signAllowColors = false;
|
|
|
|
|
+ private void signSettings() {
|
|
|
|
|
+ signAllowColors = getBoolean("blocks.sign.allow-colors", signAllowColors);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public boolean slabHalfBreak = false;
|
|
|
|
|
+ private void slabSettings() {
|
|
|
|
|
+ slabHalfBreak = getBoolean("blocks.slab.break-individual-slabs-when-sneaking", slabHalfBreak);
|
|
|
|
|
@@ -23766,7 +23606,6 @@ index 0000000000000000000000000000000000000000..d8de8710d9b8cf2ae5c434b2b0b27e76
|
|
|
|
|
+ public boolean ravagerTakeDamageFromWater = false;
|
|
|
|
|
+ public List<Block> ravagerGriefableBlocks = new ArrayList<>();
|
|
|
|
|
+ public boolean ravagerAlwaysDropExp = false;
|
|
|
|
|
+ public boolean ravagerAvoidRabbits = false;
|
|
|
|
|
+ private void ravagerSettings() {
|
|
|
|
|
+ ravagerRidable = getBoolean("mobs.ravager.ridable", ravagerRidable);
|
|
|
|
|
+ ravagerRidableInWater = getBoolean("mobs.ravager.ridable-in-water", ravagerRidableInWater);
|
|
|
|
|
@@ -23797,7 +23636,6 @@ index 0000000000000000000000000000000000000000..d8de8710d9b8cf2ae5c434b2b0b27e76
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ ravagerAlwaysDropExp = getBoolean("mobs.ravager.always-drop-exp", ravagerAlwaysDropExp);
|
|
|
|
|
+ ravagerAvoidRabbits = getBoolean("mobs.ravager.avoid-rabbits", ravagerAvoidRabbits);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public boolean salmonRidable = false;
|
|
|
|
|
|