Add NPC Text script and enhance ScriptApi with entity type retrieval
All checks were successful
Build JStom / build (push) Successful in 1m21s

This commit is contained in:
2026-01-26 23:42:41 +00:00
parent 7c9283a043
commit 676857d650
3 changed files with 86 additions and 1 deletions

61
scripts/npc_text.js Normal file
View File

@@ -0,0 +1,61 @@
var Entity = Java.type('net.minestom.server.entity.Entity');
var Pos = Java.type('net.minestom.server.coordinate.Pos');
var Vec = Java.type('net.minestom.server.coordinate.Vec');
var Component = Java.type('net.kyori.adventure.text.Component');
var NamedTextColor = Java.type('net.kyori.adventure.text.format.NamedTextColor');
var BillboardConstraints = Java.type('net.minestom.server.entity.metadata.display.AbstractDisplayMeta.BillboardConstraints');
var MinecraftServer = Java.type('net.minestom.server.MinecraftServer');
server.log("NPC Text script initializing...");
function spawnFixedNPC() {
var instanceManager = MinecraftServer.getInstanceManager();
var instances = instanceManager.getInstances();
if (instances.isEmpty()) {
server.log("No instances found to spawn NPC!");
return;
}
var instance = instances.iterator().next();
var pos = new Pos(45.5, 65.0, -80.5);
// Retrieve EntityTypes via Java helper
var HUSK = server.getEntityType('HUSK');
var TEXT_DISPLAY = server.getEntityType('TEXT_DISPLAY');
if (HUSK == null || TEXT_DISPLAY == null) {
server.log("Failed to resolve EntityTypes! HUSK=" + HUSK + ", TEXT_DISPLAY=" + TEXT_DISPLAY);
return;
}
// 1. Create the "NPC" (Host) - Husk
var npc = new Entity(HUSK);
// 2. Create the TextDisplay (Passenger)
var textDisplay = new Entity(TEXT_DISPLAY);
var meta = textDisplay.getEntityMeta();
// Configure the text display
meta.setText(Component.text("I am a fixed NPC!").color(NamedTextColor.YELLOW));
meta.setBillboardRenderConstraints(BillboardConstraints.CENTER);
meta.setScale(new Vec(1.0, 1.0, 1.0));
meta.setBackgroundColor(0); // Transparent
// 3. Spawn entities
npc.setInstance(instance, pos).thenAccept(function() {
textDisplay.setInstance(instance, pos.add(0, 2.5, 0)).thenAccept(function() {
// 4. Make the TextDisplay ride the NPC
npc.addPassenger(textDisplay);
server.log("Spawned fixed NPC at " + pos);
});
});
}
// Run immediately
try {
spawnFixedNPC();
} catch (e) {
server.log("Error spawning NPC: " + e);
e.printStackTrace();
}

View File

@@ -11,6 +11,7 @@ import net.minestom.server.event.server.ServerListPingEvent;
import net.minestom.server.instance.InstanceContainer; import net.minestom.server.instance.InstanceContainer;
import net.minestom.server.instance.InstanceManager; import net.minestom.server.instance.InstanceManager;
import net.minestom.server.instance.LightingChunk; import net.minestom.server.instance.LightingChunk;
import net.minestom.server.instance.Chunk;
import net.minestom.server.instance.anvil.AnvilLoader; import net.minestom.server.instance.anvil.AnvilLoader;
import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.Block;
import net.minestom.server.ping.Status; import net.minestom.server.ping.Status;

View File

@@ -3,14 +3,32 @@ package net.jstom.script;
import net.minestom.server.MinecraftServer; import net.minestom.server.MinecraftServer;
import net.minestom.server.event.Event; import net.minestom.server.event.Event;
import net.minestom.server.event.EventNode; import net.minestom.server.event.EventNode;
import net.minestom.server.entity.EntityType;
import org.graalvm.polyglot.Value; import org.graalvm.polyglot.Value;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.function.Consumer; import java.util.Map;
import java.util.HashMap;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
public class ScriptApi { public class ScriptApi {
private final List<EventNode<Event>> registeredNodes = new ArrayList<>(); private final List<EventNode<Event>> registeredNodes = new ArrayList<>();
private static final Map<String, EntityType> entityTypes = new HashMap<>();
static {
for (Field field : EntityType.class.getFields()) {
if (Modifier.isStatic(field.getModifiers()) && Modifier.isPublic(field.getModifiers()) && field.getType() == EntityType.class) {
try {
field.setAccessible(true);
entityTypes.put(field.getName(), (EntityType) field.get(null));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
/** /**
* Registers an event listener from JavaScript. * Registers an event listener from JavaScript.
@@ -64,4 +82,9 @@ public class ScriptApi {
public void log(String message) { public void log(String message) {
System.out.println("[JS] " + message); System.out.println("[JS] " + message);
} }
public EntityType getEntityType(String name) {
if (name == null) return null;
return entityTypes.get(name.toUpperCase());
}
} }