mirror of
https://github.com/YouHaveTrouble/Stand-in.git
synced 2026-05-11 22:16:55 +00:00
basic armor stand edit screen interaction
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
package me.youhavetrouble.standin;
|
package me.youhavetrouble.standin;
|
||||||
|
|
||||||
|
import me.youhavetrouble.standin.stand.StandinInteractionListener;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
|
|
||||||
@@ -9,12 +10,7 @@ public final class StandIn extends JavaPlugin {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEnable() {
|
public void onEnable() {
|
||||||
// Plugin startup logic
|
getServer().getPluginManager().registerEvents(new StandinInteractionListener(), this);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onDisable() {
|
|
||||||
// Plugin shutdown logic
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import io.papermc.paper.registry.data.dialog.input.DialogInput;
|
|||||||
import io.papermc.paper.registry.data.dialog.type.DialogType;
|
import io.papermc.paper.registry.data.dialog.type.DialogType;
|
||||||
import net.kyori.adventure.text.Component;
|
import net.kyori.adventure.text.Component;
|
||||||
import net.kyori.adventure.text.event.ClickCallback;
|
import net.kyori.adventure.text.event.ClickCallback;
|
||||||
import net.kyori.adventure.util.TriState;
|
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
|
||||||
import org.bukkit.entity.ArmorStand;
|
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;
|
||||||
@@ -30,9 +30,14 @@ public class StandinDialog {
|
|||||||
|
|
||||||
List<DialogInput> inputs = new ArrayList<>();
|
List<DialogInput> inputs = new ArrayList<>();
|
||||||
|
|
||||||
|
String currentName = "";
|
||||||
|
if (armorStand.customName() != null) {
|
||||||
|
currentName = PlainTextComponentSerializer.plainText().serialize(armorStand.name());
|
||||||
|
}
|
||||||
|
|
||||||
inputs.add(
|
inputs.add(
|
||||||
DialogInput.text("name", Component.text("Display name"))
|
DialogInput.text("name", Component.text("Display name"))
|
||||||
.labelVisible(true)
|
.initial(currentName)
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
inputs.add(
|
inputs.add(
|
||||||
@@ -42,8 +47,20 @@ public class StandinDialog {
|
|||||||
);
|
);
|
||||||
|
|
||||||
inputs.add(
|
inputs.add(
|
||||||
DialogInput.bool("onFire", Component.text("On fire"))
|
DialogInput.bool("basePlate", Component.text("Base plate"))
|
||||||
.initial(Boolean.TRUE.equals(armorStand.getVisualFire().toBoolean()))
|
.initial(armorStand.hasBasePlate())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
inputs.add(
|
||||||
|
DialogInput.bool("arms", Component.text("Arms"))
|
||||||
|
.initial(armorStand.hasArms())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
|
||||||
|
inputs.add(
|
||||||
|
DialogInput.bool("small", Component.text("Small"))
|
||||||
|
.initial(armorStand.isSmall())
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -53,8 +70,16 @@ public class StandinDialog {
|
|||||||
Entity entity = callbackPlayer.getWorld().getEntity(armorStandId);
|
Entity entity = callbackPlayer.getWorld().getEntity(armorStandId);
|
||||||
if (!(entity instanceof ArmorStand stand)) return;
|
if (!(entity instanceof ArmorStand stand)) return;
|
||||||
if (stand.isDead()) return;
|
if (stand.isDead()) return;
|
||||||
|
String customName = view.getText("name");
|
||||||
|
if (customName == null || customName.isEmpty()) {
|
||||||
|
stand.customName(null);
|
||||||
|
} else {
|
||||||
|
stand.customName(Component.text(customName));
|
||||||
|
}
|
||||||
stand.setInvisible(Boolean.TRUE.equals(view.getBoolean("invisible")));
|
stand.setInvisible(Boolean.TRUE.equals(view.getBoolean("invisible")));
|
||||||
stand.setVisualFire(TriState.byBoolean(Boolean.TRUE.equals(view.getBoolean("onFire"))));
|
stand.setBasePlate(Boolean.TRUE.equals(view.getBoolean("basePlate")));
|
||||||
|
stand.setArms(Boolean.TRUE.equals(view.getBoolean("arms")));
|
||||||
|
stand.setSmall(Boolean.TRUE.equals(view.getBoolean("small")));
|
||||||
}, ClickCallback.Options.builder().lifetime(Duration.ofHours(1)).uses(1).build())
|
}, ClickCallback.Options.builder().lifetime(Duration.ofHours(1)).uses(1).build())
|
||||||
).build();
|
).build();
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
package me.youhavetrouble.standin.stand;
|
||||||
|
|
||||||
|
import me.youhavetrouble.standin.StandinDialog;
|
||||||
|
import org.bukkit.attribute.Attribute;
|
||||||
|
import org.bukkit.attribute.AttributeInstance;
|
||||||
|
import org.bukkit.entity.ArmorStand;
|
||||||
|
import org.bukkit.entity.Entity;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.event.EventHandler;
|
||||||
|
import org.bukkit.event.EventPriority;
|
||||||
|
import org.bukkit.event.Listener;
|
||||||
|
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
|
||||||
|
import org.bukkit.event.player.PlayerInteractEvent;
|
||||||
|
import org.bukkit.inventory.EquipmentSlot;
|
||||||
|
import org.bukkit.util.RayTraceResult;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
public class StandinInteractionListener implements Listener {
|
||||||
|
|
||||||
|
private boolean handleInteraction(@NotNull Player player, Entity entity) {
|
||||||
|
if (entity == null) return false;
|
||||||
|
if (!player.isOnline()) return false;
|
||||||
|
|
||||||
|
if (entity instanceof ArmorStand armorStand) {
|
||||||
|
StandinDialog.openArmorStandDialog(player, armorStand);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = false)
|
||||||
|
public void onInteractWithDisplays(PlayerInteractEvent event) {
|
||||||
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
|
if (event.getHand() == EquipmentSlot.OFF_HAND) return;
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
|
||||||
|
AttributeInstance instance = player.getAttribute(Attribute.ENTITY_INTERACTION_RANGE);
|
||||||
|
if (instance == null) return;
|
||||||
|
|
||||||
|
double interactionRange = instance.getValue();
|
||||||
|
|
||||||
|
RayTraceResult result = player.getWorld().rayTraceEntities(
|
||||||
|
player.getEyeLocation(),
|
||||||
|
player.getEyeLocation().getDirection(),
|
||||||
|
interactionRange,
|
||||||
|
0.5,
|
||||||
|
(entity -> {
|
||||||
|
switch (entity.getType()) {
|
||||||
|
case TEXT_DISPLAY,
|
||||||
|
BLOCK_DISPLAY,
|
||||||
|
ITEM_DISPLAY -> {
|
||||||
|
if (entity.getVehicle() == null) return true;
|
||||||
|
return !player.getUniqueId().equals(entity.getVehicle().getUniqueId());
|
||||||
|
}
|
||||||
|
default -> {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
if (result == null) return;
|
||||||
|
|
||||||
|
Entity entity = result.getHitEntity();
|
||||||
|
if (!handleInteraction(player, entity)) return;
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
|
||||||
|
public void onInteractWithStands(PlayerInteractAtEntityEvent event) {
|
||||||
|
if (!event.getPlayer().isSneaking()) return;
|
||||||
|
if (!handleInteraction(event.getPlayer(), event.getRightClicked())) return;
|
||||||
|
event.setCancelled(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user