Add NPC Text script and enhance ScriptApi with entity type retrieval
All checks were successful
Build JStom / build (push) Successful in 1m21s
All checks were successful
Build JStom / build (push) Successful in 1m21s
This commit is contained in:
61
scripts/npc_text.js
Normal file
61
scripts/npc_text.js
Normal 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();
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user