Peril_Dice/FURWARE_Leaderboard_Communication_Linkset.lsl

72 lines
2.9 KiB
Text

#include "Peril_Constants.lsl"
string leftText = "";
// Distribute text to the FURWARE "Leaderboard" boxes
distributeFullText(string text) {
if (llGetSubString(text, 0, 7) == "COLUMNS|") {
// Use llParseStringKeepNulls to ensure empty columns don't break the registration logic
list parts = llParseStringKeepNulls(llGetSubString(text, 8, -1), ["|"], []);
if (llGetListLength(parts) >= 3) {
// Distribute each column to its virtual box
llMessageLinked(LINK_SET, 0, llList2String(parts, 0), (key)(FW_DATA + ":LB_Rank"));
llMessageLinked(LINK_SET, 0, llList2String(parts, 1), (key)(FW_DATA + ":LB_Name"));
llMessageLinked(LINK_SET, 0, llList2String(parts, 2), (key)(FW_DATA + ":LB_WL"));
}
} else {
// Fallback for legacy text or titles (sent to parent box)
llMessageLinked(LINK_SET, 0, text, (key)(FW_DATA + ":Leaderboard"));
}
}
default {
on_rez(integer start_param) {
DISCOVER_CORE_LINKS();
llResetScript();
}
state_entry() {
DISCOVER_CORE_LINKS();
REPORT_MEMORY();
dbg("📋 [Leaderboard] Leaderboard Communication Script ready! (Virtual Multi-Column)");
// Wait for engine to be ready, then register virtual columns
llSleep(1.0);
// Registering virtual columns inside the physical "Leaderboard" mesh
// Format: fw_addbox:NewName:ParentName:x,y,w,h
llMessageLinked(LINK_SET, 0, "", (key)("fw_addbox:LB_Rank:Leaderboard:0,1,4,11"));
llMessageLinked(LINK_SET, 0, "", (key)("fw_addbox:LB_Name:Leaderboard:4,1,20,11"));
llMessageLinked(LINK_SET, 0, "", (key)("fw_addbox:LB_WL:Leaderboard:24,1,8,11"));
dbg("📋 [Leaderboard] Virtual column registration requests sent.");
// --- STARTUP HANDSHAKE ---
// Wait a moment for the engine to process ADD_BOX, then ask Scoreboard for a fresh update
llSleep(0.5);
llMessageLinked(LINK_SET, MSG_DISPLAY_LEADERBOARD, "REFRESH_STARTUP", NULL_KEY);
// Start with blank display
distributeFullText("");
}
link_message(integer sender, integer num, string str, key id) {
// Handle messages from the game logic
if (num == MSG_DISPLAY_LEADERBOARD) {
if (llGetSubString(str, 0, 14) == "FORMATTED_TEXT|") {
distributeFullText(llGetSubString(str, 15, -1));
} else if (llGetSubString(str, 0, 9) == "LEFT_TEXT|") {
// For individual bank updates
leftText = llGetSubString(str, 10, -1);
distributeFullText(leftText);
} else {
// Pass directly for COLUMNS| or multi-column data
distributeFullText(str);
}
}
else if (llSubStringIndex(str, "LEADERBOARD") == 0) {
dbg("📋 [Leaderboard] ⚠️ Received legacy LEADERBOARD format - ignoring");
}
}
}