Skip to content
Open
Show file tree
Hide file tree
Changes from all 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,53 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Mickey42302 <bgoodwin423@gmail.com>
Date: Mon, 20 Jul 2026 21:30: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..74340c3ae87846b0610d994331916d130aa4274e 100644
--- a/net/minecraft/server/Main.java
+++ b/net/minecraft/server/Main.java
@@ -107,12 +107,16 @@ public class Main {
JvmProfiler.INSTANCE.start(Environment.SERVER);
}

- // Purpur start - Add toggle for enchant level clamping - load config files early
+ // Purpur - 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 - 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 - 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


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..6858bfce9464251025fddc825f32e686df394f9d 100644
--- a/net/minecraft/server/network/ServerGamePacketListenerImpl.java
+++ b/net/minecraft/server/network/ServerGamePacketListenerImpl.java
@@ -2328,11 +2328,14 @@ 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;
+ // Purpur - Check if requiring a permission node for spectators to teleport to players is disabled or if the player has the permission node.
+ 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