Files
Purpur/purpur-server/minecraft-patches/sources/net/minecraft/server/level/ServerPlayer.java.patch
granny 6e45786e29 Updated Upstream (Paper)
Upstream has released updates that appear to apply and compile correctly

Paper Changes:
PaperMC/Paper@46c6f49 Fix Registry#getKey implementation
PaperMC/Paper@4c6ea84 move junit platform dep to -server and -api
PaperMC/Paper@c31d95e remove test plugin diff accidentally committed
PaperMC/Paper@90d50aa update .editorconfig
PaperMC/Paper@8ad15d6 Update minecraft dir references
PaperMC/Paper@083c083 Fix a bunch more issues arising from mutable types (#11769)
PaperMC/Paper@eb793c3 [ci skip] more cleanup from repo reorg
PaperMC/Paper@f8bf600 Fix potion effect type removal (#11778)
PaperMC/Paper@188124b Fix totems negating incorrect item (#11776)
PaperMC/Paper@a0b3326 refactor registry entry to detach 'delayed' from other meta
PaperMC/Paper@cbf630d Move missing import into feature patches to fix pre-features compile
PaperMC/Paper@17f649d Fix PlayerTradeEvent visual issue when being cancelled (#11773)
PaperMC/Paper@976b0a4 [ci skip] Simplify and update contribution guidelines
PaperMC/Paper@63c94c9 [ci skip] Comment out update tasks, update comments
PaperMC/Paper@62d4130 [ci skip] Fix Inventory#addItem javadoc mismatch with behaviour (#11782)
PaperMC/Paper@bd4c235 Throw during plugin update folder process on failed rename/delete (#11784)
PaperMC/Paper@793d361 Fix recipe book items order (#11787)
PaperMC/Paper@c768099 Fix tripwires (#11790)
PaperMC/Paper@17d76ae Correctly die when cancelling EntityResurrectEvent (#11785)
PaperMC/Paper@aa2c52b Fix dropper inventory var
PaperMC/Paper@d0d0efe Partially revert 083c083188 for Transformation (#11798)
PaperMC/Paper@b8a0541 Fix 0 parameter in Player#applyMending (#11802)
PaperMC/Paper@9e2d39c Fix double chest identification (#11812)
PaperMC/Paper@321d17c [ci skip] Only build PRs on correct label (#11811)
PaperMC/Paper@d568e17 Port basic lookAt methods from Player to Entity (#11775)
PaperMC/Paper@25cc3d8 Fix EnchantmentView#setOffers length precondition being flipped (#11818)
PaperMC/Paper@763b32d Fix framed maps looping through all players in world (#11819)
PaperMC/Paper@946314f Remove disableTeleportationSuffocationCheck config (#11822)
PaperMC/Paper@140577b Fix broken field rename compat for instrument "feel_goat_horn" (#11824)
PaperMC/Paper@a07cec1 Add effective name to ItemStack (#11770)
PaperMC/Paper@3a479ea Add Registry#getTags (#11795)
PaperMC/Paper@d85d318 Fix NullPointerException in PlayerInteractEvent#getClickedPosition (#11827)
PaperMC/Paper@3331805 Deprecate #furnace_materials item tag (#11823)
PaperMC/Paper@c9a904e Fix keepalive logic resetting counter
PaperMC/Paper@a8f850a temporarily revert OldEnum toString changes (#11829)
PaperMC/Paper@a14c06b fix annotation test for null marked inner classes (#11826)
PaperMC/Paper@f51aa3e Fix BlockRedstoneEvent for tripwire hooks (#11791)
PaperMC/Paper@af2812f For new registry values, allow copying from existing (#11796)
PaperMC/Paper@0efd301 Fix suggestions for ResourceLocation (#11830)
PaperMC/Paper@aac246a Expand on entity serialization API (#11807)
PaperMC/Paper@953f6f9 Banner pattern registry modification (#11803)
PaperMC/Paper@a5b8df6 add tagkey file for entity type (#11832)
PaperMC/Paper@c530c39 More var name fixes
PaperMC/Paper@2b73d19 More var name fixes
PaperMC/Paper@326c687 Fix whack diff from last commit
PaperMC/Paper@13c94e4 Updated adventure to 4.18.0 (#11809)
PaperMC/Paper@ca8709b Fix more incorrect array nullability annotations (#11836)
PaperMC/Paper@e10dcbf [ci skip] Improve build workflow conditions (#11842)
PaperMC/Paper@b4051db Handle disabled vanilla registry values correctly (#11781)
PaperMC/Paper@4b89390 Fix contextual map renderer memory leak (#11841)
PaperMC/Paper@5c7537c Add DamageType RegistryEvent (#11783)
PaperMC/Paper@33411ec Properly remove UnsafeValues#getDamageEffect
PaperMC/Paper@0629524 Directly build Art (#11813)
PaperMC/Paper@e0abc5f Do not spawn fire for visual lightning (#11845)
PaperMC/Paper@dac977a Correctly force particles (#11850)
PaperMC/Paper@feb8756 Add datapack registration lifecycle event (#11804)
PaperMC/Paper@18da1ae [ci skip] update DiscoveredDatapack javadoc
PaperMC/Paper@93a3df0 Extend HumanEntity#dropItem API (#11810)
PaperMC/Paper@287eb52 Use hidden classes for event executors (#11848)
PaperMC/Paper@887f3f7 [ci skip] Replace FQN with import in EventExecutor
PaperMC/Paper@d00344a update jb annotations to 26.0.1 (#11860)
PaperMC/Paper@60edd61 [ci skip] Fix spelling of ignition's word into javadoc (#11864)
PaperMC/Paper@a81990e Update mache, fixes dev bundle use with Java 23
PaperMC/Paper@1e4669e [ci skip] Clarify loot table behavior when set to null. (#11861)
PaperMC/Paper@9298f59 Update paperweight to 2.0.0-beta.10
PaperMC/Paper@bdfad1c Add sendRich/PlainMessage methods to Server (#11872)
PaperMC/Paper@1dd52be Use playerlist whitelist status instead of properties
PaperMC/Paper@83995d7 Fix settings changes not being saved (#11881)
PaperMC/Paper@daddcf6 Fix JOML javadoc URL (#11883)
PaperMC/Paper@edde726 [ci skip] Add missing Nullable annotations for NMS DamageSource (#11875)
PaperMC/Paper@4106da7 Fix retain passengers teleport flag (#11858)
PaperMC/Paper@6ab1352 Improve performance of PoiCompetitorScan by unrolling stream (#11871)
PaperMC/Paper@33a590b Fix TargetHitEvent#getSignalStrength() post-hard-fork (#11897)
PaperMC/Paper@f367f10 Add rotation helpers to Location (#11908)
PaperMC/Paper@9f90b4c Fix ItemDamageEvents called for 0 damage (#11900)
PaperMC/Paper@486e521 Re-add droped MapLike spam fix (#11917)
PaperMC/Paper@3375570 Fix MapCanvas#drawImage (#11865)
PaperMC/Paper@49d15f6 Fix DiscoveredDatapack#getSource (#11928)
PaperMC/Paper@b34ae4f Fix wolves ignoring result of damage event (#11932)
PaperMC/Paper@efdcaa2 Fix removing the "LootTable" nbt tag from Block entities (#11929)
PaperMC/Paper@55f3f28 Reimplement ItemStack Obfuscation (#11817)
PaperMC/Paper@08fc33c Update CustomTimingsHandler Nag Message (#11923)
PaperMC/Paper@5e14504 [ci skip] Add missing deprecated docs for isEnabledByFeature (#11938)
PaperMC/Paper@4007171 Correct obfuscation of oversized items (#11944)
PaperMC/Paper@1b38f28 Fix reading recipes used on furnace (#11947)
PaperMC/Paper@b03d39b [ci skip] Update paperweight to 2.0.0-beta.13
PaperMC/Paper@6316a50 Make CraftServer#isPrimaryThread use TickThread check
PaperMC/Paper@ea7b961 Fix MapItem incorectly fetching water biomes on treasure maps (#11936)
PaperMC/Paper@b242f1e Prevent day cycle on the client when using fixed time (#11924)
PaperMC/Paper@3e42518 Fix snow accumulating in custom biomes without precipitation (#11854)
PaperMC/Paper@3d9ecc4 Log thread check parameters when the thread check fails
PaperMC/Paper@3ad3fbc Update to Concurrentutil 0.0.3
PaperMC/Paper@79ffcd1 Fix vanilla parity on enchantable items with no targets (#11896)
PaperMC/Paper@19ddbef Fix InventoryAction wrong for Bundles (#11902)
PaperMC/Paper@ac3aaa2 Don't use delayed registries in impl anywhere (#11918)
PaperMC/Paper@775002a [ci skip] Remove nullable from SyncedEntityData#packAll (#11949)
PaperMC/Paper@c949225 MenuType API addition InventoryView Builders (#11816)
PaperMC/Paper@c2f24e1 Feat: Add 'with' methods to CommandSourceStack (#11868)
PaperMC/Paper@ed75b0e Disallow calling JavaPlugin#getCommand during onEnable for Paper plugins (#11914)
PaperMC/Paper@08ac057 Rename getPotentialBedLocation to getPotentialRespawnLocation (#11950)
PaperMC/Paper@9746d73 Add back known movement check
PaperMC/Paper@e5542cf Hide unnecessary decorated pot data (#11957)
PaperMC/Paper@eb4db79 Make CommandSourceStack respect hidden players (#11898)
PaperMC/Paper@76617dd Add EntityEffectTickEvent (#11838)
PaperMC/Paper@86c6308 Fix locate command dist overflow/underflow (#11956)
PaperMC/Paper@2ea6aee Deprecate Turtle#isDigging (#11959)
PaperMC/Paper@ad74b67 Fix client visual desync if cooldown events are cancelled (#11892)
PaperMC/Paper@50c2c59 Fix unstable Suggestion comparison by sorting int suggestions before text ones (#11941)
PaperMC/Paper@3709150 Expose all possible block data states (#11958)
PaperMC/Paper@5e23d28 Remove entity tag selector tag completion fix (#11964)
PaperMC/Paper@ab1b312 Call PlayerItemDamageEvent for tridents (#11899)
PaperMC/Paper@1bb3677 Remove deprecation from EntityRemoveEvent (#11961)
PaperMC/Paper@d69981b [ci skip] Remove redundant build configuration
PaperMC/Paper@6fde26d remove .paperassetsroot
PaperMC/Paper@fe75eaf split direct holder support up from ctor accepting Holder
2025-01-14 11:51:16 -08:00

277 lines
13 KiB
Diff

--- a/net/minecraft/server/level/ServerPlayer.java
+++ b/net/minecraft/server/level/ServerPlayer.java
@@ -393,6 +_,10 @@
public com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent
public @Nullable String clientBrandName = null; // Paper - Brand support
public org.bukkit.event.player.PlayerQuitEvent.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 boolean purpurClient = false; // Purpur - Purpur client support
+ private boolean tpsBar = false; // Purpur - Implement TPSBar
+ private boolean compassBar = false; // Purpur - Add compass command
+ private boolean ramBar = false; // Purpur - Implement rambar commands
// Paper start - rewrite chunk system
private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader;
@@ -561,6 +_,10 @@
if (tag != null) {
BlockPos.CODEC.parse(NbtOps.INSTANCE, tag).resultOrPartial(LOGGER::error).ifPresent(pos -> this.raidOmenPosition = pos);
}
+
+ if (compound.contains("Purpur.TPSBar")) { this.tpsBar = compound.getBoolean("Purpur.TPSBar"); } // Purpur - Implement TPSBar
+ if (compound.contains("Purpur.CompassBar")) { this.compassBar = compound.getBoolean("Purpur.CompassBar"); } // Purpur - Add compass command
+ if (compound.contains("Purpur.RamBar")) { this.ramBar = compound.getBoolean("Purpur.RamBar"); } // Purpur - Implement rambar command
}
@Override
@@ -605,6 +_,9 @@
}
this.saveEnderPearls(compound);
+ compound.putBoolean("Purpur.TPSBar", this.tpsBar); // Purpur - Implement TPSBar
+ compound.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur - Add compass command
+ compound.putBoolean("Purpur.CompassBar", this.compassBar); // Purpur - Add rambar command
}
private void saveParentVehicle(CompoundTag tag) {
@@ -1124,6 +_,7 @@
)
);
Team team = this.getTeam();
+ if (org.purpurmc.purpur.PurpurConfig.deathMessageOnlyBroadcastToAffectedPlayer) this.sendSystemMessage(deathMessage); else // Purpur - Configurable broadcast settings
if (team == null || team.getDeathMessageVisibility() == Team.Visibility.ALWAYS) {
this.server.getPlayerList().broadcastSystemMessage(deathMessage, false);
} else if (team.getDeathMessageVisibility() == Team.Visibility.HIDE_FOR_OTHER_TEAMS) {
@@ -1217,6 +_,13 @@
if (this.isInvulnerableTo(level, damageSource)) {
return false;
} else {
+ // Purpur start - Add boat fall damage config
+ if (damageSource.is(net.minecraft.tags.DamageTypeTags.IS_FALL)) {
+ if (getRootVehicle() instanceof net.minecraft.world.entity.vehicle.Boat && !level().purpurConfig.boatsDoFallDamage) {
+ return false;
+ }
+ }
+ // Purpur end - Add boat fall damage config
Entity entity = damageSource.getEntity();
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))
@@ -1446,6 +_,7 @@
serverLevel.removePlayerImmediately(this, Entity.RemovalReason.CHANGED_DIMENSION);
this.unsetRemoved();
// CraftBukkit end
+ this.portalPos = io.papermc.paper.util.MCUtil.toBlockPosition(exit); // Purpur - Fix stuck in portals
this.setServerLevel(level);
this.connection.internalTeleport(PositionMoveRotation.of(teleportTransition), teleportTransition.relatives()); // CraftBukkit - use internal teleport without event
this.connection.resetPosition();
@@ -1564,7 +_,7 @@
new AABB(vec3.x() - 8.0, vec3.y() - 5.0, vec3.z() - 8.0, vec3.x() + 8.0, vec3.y() + 5.0, vec3.z() + 8.0),
monster -> monster.isPreventingPlayerRest(this.serverLevel(), this)
);
- if (!entitiesOfClass.isEmpty()) {
+ if (!this.level().purpurConfig.playerSleepNearMonsters && !entitiesOfClass.isEmpty()) { // Purpur - Config to ignore nearby mobs when sleeping
return Either.left(Player.BedSleepingProblem.NOT_SAFE);
}
}
@@ -1601,7 +_,19 @@
CriteriaTriggers.SLEPT_IN_BED.trigger(this);
});
if (!this.serverLevel().canSleepThroughNights()) {
- this.displayClientMessage(Component.translatable("sleep.not_possible"), true);
+ // Purpur start - Customizable sleeping actionbar messages
+ Component clientMessage;
+ if (org.purpurmc.purpur.PurpurConfig.sleepNotPossible.isBlank()) {
+ clientMessage = null;
+ } else if (!org.purpurmc.purpur.PurpurConfig.sleepNotPossible.equalsIgnoreCase("default")) {
+ clientMessage = io.papermc.paper.adventure.PaperAdventure.asVanilla(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(org.purpurmc.purpur.PurpurConfig.sleepNotPossible));
+ } else {
+ clientMessage = Component.translatable("sleep.not_possible");
+ }
+ if (clientMessage != null) {
+ this.displayClientMessage(clientMessage, true);
+ }
+ // Purpur end - Customizable sleeping actionbar messages
}
((ServerLevel)this.level()).updateSleepingPlayerList();
@@ -1709,6 +_,7 @@
@Override
public void openTextEdit(SignBlockEntity signEntity, boolean isFrontText) {
+ if (level().purpurConfig.signAllowColors) this.connection.send(signEntity.getTranslatedUpdatePacket(textFilteringEnabled, isFrontText)); // Purpur - Signs allow color codes
this.connection.send(new ClientboundBlockUpdatePacket(this.level(), signEntity.getBlockPos()));
this.connection.send(new ClientboundOpenSignEditorPacket(signEntity.getBlockPos(), isFrontText));
}
@@ -2014,6 +_,26 @@
this.lastSentExp = -1; // CraftBukkit - Added to reset
}
+ // Purpur start - Component related conveniences
+ public void sendActionBarMessage(@Nullable String message) {
+ if (message != null && !message.isEmpty()) {
+ sendActionBarMessage(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(message));
+ }
+ }
+
+ public void sendActionBarMessage(@Nullable net.kyori.adventure.text.Component message) {
+ if (message != null) {
+ sendActionBarMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message));
+ }
+ }
+
+ public void sendActionBarMessage(@Nullable Component message) {
+ if (message != null) {
+ displayClientMessage(message, true);
+ }
+ }
+ // Purpur end - Component related conveniences
+
@Override
public void displayClientMessage(Component chatComponent, boolean actionBar) {
this.sendSystemMessage(chatComponent, actionBar);
@@ -2235,6 +_,20 @@
);
}
+ // Purpur start - Component related conveniences
+ public void sendMiniMessage(@Nullable String message) {
+ if (message != null && !message.isEmpty()) {
+ this.sendMessage(net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().deserialize(message));
+ }
+ }
+
+ public void sendMessage(@Nullable net.kyori.adventure.text.Component message) {
+ if (message != null) {
+ this.sendSystemMessage(io.papermc.paper.adventure.PaperAdventure.asVanilla(message));
+ }
+ }
+ // Purpur end - Component related conveniences
+
public void sendSystemMessage(Component mesage) {
this.sendSystemMessage(mesage, false);
}
@@ -2373,7 +_,67 @@
public void resetLastActionTime() {
this.lastActionTime = Util.getMillis();
- }
+ this.setAfk(false); // Purpur - AFK API
+ }
+
+ // Purpur start - AFK API
+ private boolean isAfk = false;
+
+ @Override
+ public void setAfk(boolean afk) {
+ if (this.isAfk == afk) {
+ return;
+ }
+
+ String msg = afk ? org.purpurmc.purpur.PurpurConfig.afkBroadcastAway : org.purpurmc.purpur.PurpurConfig.afkBroadcastBack;
+
+ org.purpurmc.purpur.event.PlayerAFKEvent event = new org.purpurmc.purpur.event.PlayerAFKEvent(this.getBukkitEntity(), afk, this.level().purpurConfig.idleTimeoutKick, msg, !org.bukkit.Bukkit.isPrimaryThread());
+ if (!event.callEvent() || event.shouldKick()) {
+ return;
+ }
+
+ this.isAfk = afk;
+
+ if (!afk) {
+ resetLastActionTime();
+ }
+
+ msg = event.getBroadcastMsg();
+ if (msg != null && !msg.isEmpty()) {
+ String playerName = this.getGameProfile().getName();
+ if (org.purpurmc.purpur.PurpurConfig.afkBroadcastUseDisplayName) {
+ net.kyori.adventure.text.Component playerDisplayNameComponent = net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer.legacySection().deserialize(this.getBukkitEntity().getDisplayName());
+ playerName = net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer.plainText().serialize(playerDisplayNameComponent);
+ }
+ server.getPlayerList().broadcastMiniMessage(String.format(msg, playerName), false);
+ }
+
+ if (this.level().purpurConfig.idleTimeoutUpdateTabList) {
+ String scoreboardName = getScoreboardName();
+ String playerListName = net.kyori.adventure.text.minimessage.MiniMessage.miniMessage().serialize(getBukkitEntity().playerListName());
+ String[] split = playerListName.split(scoreboardName);
+ String prefix = (split.length > 0 ? split[0] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix, "");
+ String suffix = (split.length > 1 ? split[1] : "").replace(org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, "");
+ if (afk) {
+ getBukkitEntity().setPlayerListName(org.purpurmc.purpur.PurpurConfig.afkTabListPrefix + prefix + scoreboardName + suffix + org.purpurmc.purpur.PurpurConfig.afkTabListSuffix, true);
+ } else {
+ getBukkitEntity().setPlayerListName(prefix + scoreboardName + suffix, true);
+ }
+ }
+
+ ((ServerLevel) this.level()).updateSleepingPlayerList();
+ }
+
+ @Override
+ public boolean isAfk() {
+ return this.isAfk;
+ }
+
+ @Override
+ public boolean canBeCollidedWith() {
+ return !this.isAfk() && super.canBeCollidedWith();
+ }
+ // Purpur end - AFK API
public ServerStatsCounter getStats() {
return this.stats;
@@ -3078,4 +_,56 @@
return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity();
}
// CraftBukkit end
+
+ // Purpur start - Add option to teleport to spawn if outside world border
+ public void teleport(org.bukkit.Location to) {
+ this.ejectPassengers();
+ this.stopRiding(true);
+
+ if (this.isSleeping()) {
+ this.stopSleepInBed(true, false);
+ }
+
+ if (this.containerMenu != this.inventoryMenu) {
+ this.closeContainer(org.bukkit.event.inventory.InventoryCloseEvent.Reason.TELEPORT);
+ }
+
+ ServerLevel toLevel = ((org.bukkit.craftbukkit.CraftWorld) to.getWorld()).getHandle();
+ if (this.level() == toLevel) {
+ this.connection.teleport(to);
+ } else {
+ this.server.getPlayerList().respawn(this, true, RemovalReason.KILLED, org.bukkit.event.player.PlayerRespawnEvent.RespawnReason.DEATH, to);
+ }
+ }
+ // Purpur end - Add option to teleport to spawn if outside world border
+
+ // Purpur start - Implement TPSBar
+ public boolean tpsBar() {
+ return this.tpsBar;
+ }
+
+ public void tpsBar(boolean tpsBar) {
+ this.tpsBar = tpsBar;
+ }
+ // Purpur end - Implement TPSBar
+
+ // Purpur start - Add compass command
+ public boolean compassBar() {
+ return this.compassBar;
+ }
+
+ public void compassBar(boolean compassBar) {
+ this.compassBar = compassBar;
+ }
+ // Purpur end - Add compass command
+
+ // Purpur start - Add rambar command
+ public boolean ramBar() {
+ return this.ramBar;
+ }
+
+ public void ramBar(boolean ramBar) {
+ this.ramBar = ramBar;
+ }
+ // Purpur end - Add rambar command
}