Add MiniMessage support for legacy color conversion in NPC Text script and implement entity tracking in ScriptApi
All checks were successful
Build JStom / build (push) Successful in 1m23s
All checks were successful
Build JStom / build (push) Successful in 1m23s
This commit is contained in:
@@ -32,6 +32,23 @@ const text = [
|
|||||||
// Join all lines with newline for the display
|
// Join all lines with newline for the display
|
||||||
var fullDisplayText = text.join("\n");
|
var fullDisplayText = text.join("\n");
|
||||||
|
|
||||||
|
// Helper to convert legacy colors (& and §) to MiniMessage tags
|
||||||
|
function convertLegacyToMiniMessage(text) {
|
||||||
|
if (!text) return text;
|
||||||
|
var legacyMap = {
|
||||||
|
'0': 'black', '1': 'dark_blue', '2': 'dark_green', '3': 'dark_aqua',
|
||||||
|
'4': 'dark_red', '5': 'dark_purple', '6': 'gold', '7': 'gray',
|
||||||
|
'8': 'dark_gray', '9': 'blue', 'a': 'green', 'b': 'aqua',
|
||||||
|
'c': 'red', 'd': 'light_purple', 'e': 'yellow', 'f': 'white',
|
||||||
|
'l': 'bold', 'm': 'strikethrough', 'n': 'underlined', 'o': 'italic',
|
||||||
|
'r': 'reset'
|
||||||
|
};
|
||||||
|
return text.replace(/[&§]([0-9a-fk-orA-FK-OR])/g, function(match, code) {
|
||||||
|
var tag = legacyMap[code.toLowerCase()];
|
||||||
|
return tag ? "<" + tag + ">" : match;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Run sequentially to prevent race conditions
|
// Run sequentially to prevent race conditions
|
||||||
function spawnNext(index) {
|
function spawnNext(index) {
|
||||||
if (index >= pos.length) {
|
if (index >= pos.length) {
|
||||||
@@ -63,24 +80,30 @@ function spawnNext(index) {
|
|||||||
// 1. Create the "NPC" (Host)
|
// 1. Create the "NPC" (Host)
|
||||||
var npc = new Entity(HUSK);
|
var npc = new Entity(HUSK);
|
||||||
npc.setNoGravity(true);
|
npc.setNoGravity(true);
|
||||||
|
server.track(npc);
|
||||||
|
|
||||||
// 2. Create the TextDisplay (Passenger)
|
// 2. Create the TextDisplay (Passenger)
|
||||||
var textDisplay = new Entity(TEXT_DISPLAY);
|
var textDisplay = new Entity(TEXT_DISPLAY);
|
||||||
textDisplay.setNoGravity(true); // Ensure text doesn't fall
|
textDisplay.setNoGravity(true); // Ensure text doesn't fall
|
||||||
|
server.track(textDisplay);
|
||||||
var meta = textDisplay.getEntityMeta();
|
var meta = textDisplay.getEntityMeta();
|
||||||
|
|
||||||
meta.setText(MiniMessage.miniMessage().deserialize(displayString));
|
// Parse both MiniMessage and Legacy
|
||||||
|
var processedText = convertLegacyToMiniMessage(displayString);
|
||||||
|
meta.setText(MiniMessage.miniMessage().deserialize(processedText));
|
||||||
|
|
||||||
meta.setBillboardRenderConstraints(BillboardConstraints.CENTER);
|
meta.setBillboardRenderConstraints(BillboardConstraints.CENTER);
|
||||||
meta.setScale(new Vec(1.0, 1.0, 1.0));
|
meta.setScale(new Vec(1.0, 1.0, 1.0));
|
||||||
meta.setBackgroundColor(0);
|
meta.setBackgroundColor(0);
|
||||||
|
meta.setShadow(true);
|
||||||
|
|
||||||
// 3. Spawn entities
|
// 3. Spawn entities
|
||||||
server.log("Spawning NPC " + (index + 1) + "/" + pos.length + " at " + x + "," + y + "," + z + "...");
|
server.log("Spawning NPC " + (index + 1) + "/" + pos.length + " at " + x + "," + y + "," + z + "...");
|
||||||
|
|
||||||
npc.setInstance(instance, position).thenAccept(function() {
|
npc.setInstance(instance, position).thenAccept(function() {
|
||||||
textDisplay.setInstance(instance, position.add(0, 2.5, 0)).thenAccept(function() {
|
textDisplay.setInstance(instance, position.add(0, 3.0, 0)).thenAccept(function() {
|
||||||
try {
|
try {
|
||||||
npc.addPassenger(textDisplay);
|
// npc.addPassenger(textDisplay);
|
||||||
server.log("Successfully spawned NPC + Text at " + x + "," + y + "," + z);
|
server.log("Successfully spawned NPC + Text at " + x + "," + y + "," + z);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
server.log("Error adding passenger: " + e);
|
server.log("Error adding passenger: " + e);
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ 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 net.minestom.server.entity.EntityType;
|
||||||
|
import net.minestom.server.entity.Entity;
|
||||||
import org.graalvm.polyglot.Value;
|
import org.graalvm.polyglot.Value;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -15,6 +16,7 @@ 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 final List<Entity> trackedEntities = new ArrayList<>();
|
||||||
private static final Map<String, EntityType> entityTypes = new HashMap<>();
|
private static final Map<String, EntityType> entityTypes = new HashMap<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
@@ -71,12 +73,28 @@ public class ScriptApi {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void track(Entity entity) {
|
||||||
|
if (entity != null) {
|
||||||
|
synchronized (trackedEntities) {
|
||||||
|
trackedEntities.add(entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
System.out.println("[JStom] Cleaning up " + registeredNodes.size() + " event nodes...");
|
System.out.println("[JStom] Cleaning up " + registeredNodes.size() + " event nodes...");
|
||||||
for (var node : registeredNodes) {
|
for (var node : registeredNodes) {
|
||||||
MinecraftServer.getGlobalEventHandler().removeChild(node);
|
MinecraftServer.getGlobalEventHandler().removeChild(node);
|
||||||
}
|
}
|
||||||
registeredNodes.clear();
|
registeredNodes.clear();
|
||||||
|
|
||||||
|
System.out.println("[JStom] Removing " + trackedEntities.size() + " tracked entities...");
|
||||||
|
synchronized (trackedEntities) {
|
||||||
|
for (Entity entity : trackedEntities) {
|
||||||
|
entity.remove();
|
||||||
|
}
|
||||||
|
trackedEntities.clear();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void log(String message) {
|
public void log(String message) {
|
||||||
|
|||||||
Reference in New Issue
Block a user