Skip to content
Open
Show file tree
Hide file tree
Changes from 21 commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
252fe38
Add files via upload
Mickey42302 Nov 24, 2025
3954084
Add files via upload
Mickey42302 May 2, 2026
e26f4dc
Add to PurpurConfig
Mickey42302 May 2, 2026
2436898
Add files via upload
Mickey42302 May 2, 2026
27800a9
Merge branch 'PurpurMC:ver/26.2' into spectatetp
Mickey42302 Jul 1, 2026
0f9cfc3
Delete purpur-server/minecraft-patches/features/0021-Add-spectator-te…
Mickey42302 Jul 1, 2026
7e24aa8
Delete purpur-server/minecraft-patches/features/0022-Add-configuratio…
Mickey42302 Jul 1, 2026
d552351
Delete purpur-server/minecraft-patches/features/0023-Add-check-for-sp…
Mickey42302 Jul 1, 2026
d5052dc
Add files via upload
Mickey42302 Jul 1, 2026
07a9f6a
Add requireSpectatorTeleportPermission setting
Mickey42302 Jul 1, 2026
d94d0a1
Add files via upload
Mickey42302 Jul 1, 2026
1a00bef
Merge branch 'PurpurMC:ver/26.2' into spectatetp
Mickey42302 Jul 20, 2026
8d38b72
Update PurpurPermissions.java
Mickey42302 Jul 20, 2026
cd88d62
Add files via upload
Mickey42302 Jul 20, 2026
d32ef39
Delete purpur-server/minecraft-patches/features/0022-Add-spectatetp-p…
Mickey42302 Jul 20, 2026
82b2fe2
Rewriting the original patch file
Mickey42302 Jul 20, 2026
fb109cf
Rewriting the original patch file
Mickey42302 Jul 20, 2026
70963be
Update PurpurConfig.java
Mickey42302 Jul 20, 2026
922e689
Fix configuration key for spectator teleport permission
Mickey42302 Jul 20, 2026
01d8d11
Update PurpurConfig.java
Mickey42302 Jul 20, 2026
159f2e8
Add files via upload
Mickey42302 Jul 20, 2026
5e4d1b3
Add files via upload
Mickey42302 Jul 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ public static Permission registerPermissions() {

DefaultPermissions.registerPermission(PREFIX + "inventory_totem", "Allows the user to use totem of undying anywhere in their inventory", PermissionDefault.FALSE, purpur);

DefaultPermissions.registerPermission(PREFIX + "spectator-can-teleport-to-players", "Allows the user to teleport to players while in spectator mode", PermissionDefault.TRUE, purpur);

Permission anvil = DefaultPermissions.registerPermission(PREFIX + "anvil", "Allows the user to use all anvil color and format abilities", PermissionDefault.FALSE, purpur);
DefaultPermissions.registerPermission(PREFIX + "anvil.color", "Allows the user to use color codes in an anvil", PermissionDefault.FALSE, anvil);
DefaultPermissions.registerPermission(PREFIX + "anvil.minimessage", "Allows the user to use minimessage tags in an anvil", PermissionDefault.FALSE, anvil);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mickey42302 <bgoodwin423@gmail.com>
Date: Mon, 20 Jul 2026 15:12:50 -0400
Subject: [PATCH] Add spectator teleport permission node


diff --git a/net/minecraft/server/Main.java b/net/minecraft/server/Main.java
index 1862df44a3319e459b547cebffb16972674856d6..9edf61c70dbf739a4eeee2b238ed7206ec012c37 100644
--- a/net/minecraft/server/Main.java
+++ b/net/minecraft/server/Main.java
@@ -110,9 +110,16 @@ public class Main {
// Purpur start - Add toggle for enchant level clamping - load config files early
org.bukkit.configuration.file.YamlConfiguration purpurConfiguration = io.papermc.paper.configuration.PaperConfigurations.loadLegacyConfigFile((File) options.valueOf("purpur-settings"));
org.purpurmc.purpur.PurpurConfig.clampEnchantLevels = purpurConfiguration.getBoolean("settings.enchantment.clamp-levels", true);
+ // Purpur end - Add toggle for enchant level clamping - load config files early
+
+ // Purpur start - Add settings for enabling commands that are unavailable by default.
org.purpurmc.purpur.PurpurConfig.registerMinecraftDebugCommands = purpurConfiguration.getBoolean("settings.register-minecraft-debug-commands"); // Purpur - register minecraft debug commands
org.purpurmc.purpur.PurpurConfig.registerMinecraftDisabledCommands = purpurConfiguration.getBoolean("settings.register-minecraft-disabled-commands"); // Purpur - register disabled minecraft commands
- // Purpur end - Add toggle for enchant level clamping - load config files early
+ // Purpur end - Add settings for enabling commands that are unavailable by default.
+
+ // Purpur start - Add setting which can be used to enable a permission node that controls the ability for spectators to teleport to other players.
+ org.purpurmc.purpur.PurpurConfig.requirePermissionSpectatorTeleportToPlayers = purpurConfiguration.getBoolean("settings.require-permission-spectator-teleport-to-players"); // Purpur - require permission spectator teleport to players

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You should comment here with // Purpur instead of having // Purpur start and // Purpur end

+ // Purpur end - Add setting which can be used to enable a permission node that controls the ability for spectators to teleport to other players.

io.papermc.paper.plugin.PluginInitializerManager.load(options); // Paper
Bootstrap.bootStrap();
diff --git a/net/minecraft/server/network/ServerGamePacketListenerImpl.java b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
index d731cea2005dff7be6e8e82d602b11355a143ec7..d7493ba7267015a86ee9fdace5fe8d4f0d0d6acf 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2328,11 +2328,13 @@ public class ServerGamePacketListenerImpl
public void handleTeleportToEntityPacket(final ServerboundTeleportToEntityPacket packet) {
PacketUtils.ensureRunningOnSameThread(packet, this, this.player.level());
if (this.player.isSpectator()) {
- for (ServerLevel level : this.server.getAllLevels()) {
- Entity entity = packet.getEntity(level);
- if (entity != null) {
- this.player.teleportTo(level, entity.getX(), entity.getY(), entity.getZ(), Set.of(), entity.getYRot(), entity.getXRot(), true, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.SPECTATE); // CraftBukkit
- return;
+ if (!org.purpurmc.purpur.PurpurConfig.requirePermissionSpectatorTeleportToPlayers || this.player.getBukkitEntity().hasPermission("purpur.spectator-can-teleport-to-players")) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a // Purpur comment

+ for (ServerLevel level : this.server.getAllLevels()) {
+ Entity entity = packet.getEntity(level);
+ if (entity != null) {
+ this.player.teleportTo(level, entity.getX(), entity.getY(), entity.getZ(), Set.of(), entity.getYRot(), entity.getXRot(), true, org.bukkit.event.player.PlayerTeleportEvent.TeleportCause.SPECTATE); // CraftBukkit
+ return;
+ }
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -606,6 +606,11 @@ private static void registerMinecraftDisabledCommands() {
registerMinecraftDisabledCommands = getBoolean("settings.register-minecraft-disabled-commands", registerMinecraftDisabledCommands);
}

public static boolean requirePermissionSpectatorTeleportToPlayers = false;
private static void requirePermissionSpectatorTeleportToPlayers() {
requirePermissionSpectatorTeleportToPlayers = getBoolean("settings.require-permission-spectator-teleport-to-players", requirePermissionSpectatorTeleportToPlayers);
}

public static List<String> startupCommands = new ArrayList<>();
private static void startupCommands() {
startupCommands.clear();
Expand Down
Loading