do not let editing random entities unless they are spawned with Standin. only armor stands are allowed for editing by default

This commit is contained in:
2025-11-26 18:53:14 +01:00
parent 9fe536439b
commit 664636ce44
3 changed files with 38 additions and 6 deletions
@@ -7,24 +7,45 @@ import me.youhavetrouble.standin.stand.StandinInteractionListener;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType; import org.bukkit.entity.EntityType;
import org.bukkit.permissions.Permission;
import org.bukkit.permissions.PermissionDefault;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@SuppressWarnings("UnstableApiUsage")
public final class StandIn extends JavaPlugin { public final class StandIn extends JavaPlugin {
public static final NamespacedKey KEY = new NamespacedKey("stand-in", "stand-in"); public static final NamespacedKey KEY = new NamespacedKey("stand-in", "stand-in");
public final Permission editAnyEntityPermission = new Permission("standin.edit-anything", PermissionDefault.FALSE);
public final Permission convertAnyEntityPermission = new Permission("standin.convert-anything", PermissionDefault.FALSE);
private final Map<EntityType, EntityHandler<? extends Entity>> entityHandlers = new HashMap<>(); private final Map<EntityType, EntityHandler<? extends Entity>> entityHandlers = new HashMap<>();
@Override @Override
public void onEnable() { public void onEnable() {
getServer().getPluginManager().addPermissions(
List.of(
editAnyEntityPermission,
convertAnyEntityPermission
)
);
entityHandlers.put(EntityType.ARMOR_STAND, new ArmorStandHandler()); entityHandlers.put(EntityType.ARMOR_STAND, new ArmorStandHandler());
entityHandlers.put(EntityType.MANNEQUIN, new MannequinHandler()); entityHandlers.put(EntityType.MANNEQUIN, new MannequinHandler());
getServer().getPluginManager().registerEvents(new StandinInteractionListener(), this); entityHandlers.keySet().forEach(entityType -> {
Permission editPermission = new Permission("standin.edit." + entityType.getKey().value(), PermissionDefault.OP);
Permission convertPermission = new Permission("standin.change_type." + entityType.getKey().value(), PermissionDefault.OP);
getServer().getPluginManager().addPermission(editPermission);
getServer().getPluginManager().addPermission(convertPermission);
});
getServer().getPluginManager().registerEvents(new StandinInteractionListener(this), this);
} }
/** /**
@@ -149,7 +149,7 @@ public abstract class EntityHandler<E extends Entity> {
if (player.getWorld() != entity.getWorld() || player.getLocation().distanceSquared(entity.getLocation()) > range * range) { if (player.getWorld() != entity.getWorld() || player.getLocation().distanceSquared(entity.getLocation()) > range * range) {
return false; return false;
} }
String entityTypeName = entity.getType().toString().toLowerCase(Locale.ENGLISH); String entityTypeName = entity.getType().getKey().value();
return switch (action) { return switch (action) {
case EDIT -> player.hasPermission("standin.edit." + entityTypeName); case EDIT -> player.hasPermission("standin.edit." + entityTypeName);
case CHANGE_TYPE -> player.hasPermission("standin.change_type." + entityTypeName); case CHANGE_TYPE -> player.hasPermission("standin.change_type." + entityTypeName);
@@ -4,6 +4,7 @@ import io.papermc.paper.dialog.Dialog;
import io.papermc.paper.event.player.PlayerPickEntityEvent; import io.papermc.paper.event.player.PlayerPickEntityEvent;
import me.youhavetrouble.standin.StandIn; import me.youhavetrouble.standin.StandIn;
import me.youhavetrouble.standin.entity.EntityHandler; import me.youhavetrouble.standin.entity.EntityHandler;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@@ -14,6 +15,12 @@ import org.jetbrains.annotations.Nullable;
public class StandinInteractionListener implements Listener { public class StandinInteractionListener implements Listener {
private final StandIn plugin;
public StandinInteractionListener(StandIn plugin) {
this.plugin = plugin;
}
private <E extends Entity> @Nullable Dialog invokeEditDialog(EntityHandler<E> handler, Player player, Entity clicked) { private <E extends Entity> @Nullable Dialog invokeEditDialog(EntityHandler<E> handler, Player player, Entity clicked) {
return handler.editDialog(player, handler.clazz.cast(clicked)); return handler.editDialog(player, handler.clazz.cast(clicked));
} }
@@ -25,9 +32,11 @@ public class StandinInteractionListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInteractWithStands(PlayerInteractAtEntityEvent event) { public void onInteractWithStands(PlayerInteractAtEntityEvent event) {
if (!event.getPlayer().isSneaking()) return; if (!event.getPlayer().isSneaking()) return;
EntityHandler<?> handler = StandIn.getPlugin(StandIn.class).getEntityHandler(event.getRightClicked().getType()); Entity entity = event.getRightClicked();
if (!(entity instanceof ArmorStand) && !EntityHandler.isStandinEntity(entity) && !event.getPlayer().hasPermission(plugin.editAnyEntityPermission)) return;
EntityHandler<?> handler = plugin.getEntityHandler(entity.getType());
if (handler == null) return; if (handler == null) return;
Dialog dialog = invokeEditDialog(handler, event.getPlayer(), event.getRightClicked()); Dialog dialog = invokeEditDialog(handler, event.getPlayer(), entity);
if (dialog == null) return; if (dialog == null) return;
event.getPlayer().showDialog(dialog); event.getPlayer().showDialog(dialog);
event.setCancelled(true); event.setCancelled(true);
@@ -39,9 +48,11 @@ public class StandinInteractionListener implements Listener {
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onInteractWithStands(PlayerPickEntityEvent event) { public void onInteractWithStands(PlayerPickEntityEvent event) {
if (!event.getPlayer().isSneaking()) return; if (!event.getPlayer().isSneaking()) return;
EntityHandler<?> handler = StandIn.getPlugin(StandIn.class).getEntityHandler(event.getEntity().getType()); Entity entity = event.getEntity();
if (!(entity instanceof ArmorStand) && !EntityHandler.isStandinEntity(entity) && !event.getPlayer().hasPermission(plugin.convertAnyEntityPermission)) return;
EntityHandler<?> handler = plugin.getEntityHandler(entity.getType());
if (handler == null) return; if (handler == null) return;
Dialog dialog = invokeConvertDialog(handler, event.getPlayer(), event.getEntity()); Dialog dialog = invokeConvertDialog(handler, event.getPlayer(), entity);
if (dialog == null) return; if (dialog == null) return;
event.getPlayer().showDialog(dialog); event.getPlayer().showDialog(dialog);
event.setCancelled(true); event.setCancelled(true);