Issue Identified: The main issue was that the floater was showing 0 as the player's pick even after they made a selection, and the correct pick was not being reflected in the float. Steps Taken: Improved Data Synchronization: We ensured that the picksData list, which holds player choices, was properly updated and synchronized across all parts of the system. State Serialization: The game state, including updated picksData, was serialized correctly using the serializeGameState() function. This ensured that the floater was aware of the new state whenever a player's pick changed. Immediate Float Updates: After updating a player's pick, we immediately sent the new game state (gameSync) to all linked objects to update their floats, ensuring the pick was reflected in the UI. Key Modifications: Main Peril Dice Controller: We improved the way we updated picksData and immediately synchronized this update with the floater using MSG_SYNC_GAME_STATE. StatFloat: Adjustments were made to handle receiving and displaying updated pick data, ensuring that picks were displayed correctly on the float after each update. Dialog Handling: Proper dialogs were shown to players for pick choices, and feedback on their picks was sent back to update the floats in real-time. Outcome: The game now correctly updates and displays the player’s picks on their respective floats immediately after making a choice. The picks are reflected in the logs as well, with the correct updated pick being shown rather than 0. Final Result: The issue of picks not being displayed correctly has been resolved, and the flow of data between the scripts (game state synchronization, float updates, etc.) is working as intended.
100 lines
3.3 KiB
Text
100 lines
3.3 KiB
Text
// === StatFloat Enhanced ===
|
||
key target;
|
||
string displayText;
|
||
string myName;
|
||
|
||
integer MSG_SYNC_GAME_STATE = 107;
|
||
|
||
list lives;
|
||
list picksData;
|
||
string perilPlayer;
|
||
list names;
|
||
|
||
list getPicksFor(string nameInput) {
|
||
integer i;
|
||
for (i = 0; i < llGetListLength(picksData); i++) {
|
||
string entry = llList2String(picksData, i);
|
||
if (llSubStringIndex(entry, nameInput + "|") == 0) {
|
||
list parts = llParseString2List(entry, ["|"], []);
|
||
if (llGetListLength(parts) >= 2) {
|
||
return llParseString2List(llList2String(parts, 1), [","], []);
|
||
}
|
||
}
|
||
}
|
||
return [];
|
||
}
|
||
|
||
default {
|
||
state_entry() {
|
||
llSetText("⏳ Waiting...", <1,1,1>, 1.0);
|
||
llSetTimerEvent(1.0);
|
||
}
|
||
|
||
on_rez(integer start_param) {
|
||
llListen(start_param, "", NULL_KEY, "");
|
||
myName = llGetObjectDesc();
|
||
llOwnerSay("📱 Listening on channel " + (string)start_param + " for " + myName);
|
||
}
|
||
|
||
listen(integer channel, string name, key id, string message) {
|
||
if (llSubStringIndex(message, "FLOAT:") == 0) {
|
||
list parts = llParseString2List(message, ["|"], []);
|
||
if (llGetListLength(parts) >= 2) {
|
||
target = (key)llGetSubString(llList2String(parts, 0), 6, -1);
|
||
displayText = llList2String(parts, 1);
|
||
llSetText(displayText, <1,1,1>, 1.0);
|
||
llOwnerSay("✅ StatFloat updated for: " + (string)target);
|
||
}
|
||
}
|
||
else if (message == "CLEANUP") {
|
||
llOwnerSay("🪟 Cleaning up...");
|
||
llDie();
|
||
}
|
||
}
|
||
|
||
link_message(integer sender, integer num, string str, key id) {
|
||
if (num == MSG_SYNC_GAME_STATE) {
|
||
list parts = llParseString2List(str, ["~"], []);
|
||
if (llGetListLength(parts) < 4) return;
|
||
lives = llCSV2List(llList2String(parts, 0));
|
||
list rawPicks = llCSV2List(llList2String(parts, 1));
|
||
picksData = [];
|
||
integer i;
|
||
for (i = 0; i < llGetListLength(rawPicks); i++) {
|
||
string entry = llList2String(rawPicks, i);
|
||
if (llSubStringIndex(entry, "|") != -1) {
|
||
picksData += [entry];
|
||
} else {
|
||
llOwnerSay("⚠️ Ignored malformed picksData during sync: " + entry);
|
||
}
|
||
}
|
||
perilPlayer = llList2String(parts, 2);
|
||
names = llCSV2List(llList2String(parts, 3));
|
||
|
||
integer nameIdx = llListFindList(names, [myName]);
|
||
if (nameIdx == -1) return;
|
||
|
||
list picks = getPicksFor(myName);
|
||
integer lifeCount = llList2Integer(lives, nameIdx);
|
||
|
||
string perilDisplay;
|
||
if (perilPlayer != "") {
|
||
perilDisplay = perilPlayer;
|
||
} else {
|
||
perilDisplay = "Waiting for peril...";
|
||
}
|
||
|
||
string picksDisplay = llList2CSV(picks);
|
||
|
||
string txt = "🎲 Peril Dice\n👤 " + myName + "\n❤️ Lives: " + (string)lifeCount + "\n Peril: " + perilDisplay + "\n🔢 Picks: " + picksDisplay;
|
||
llSetText(txt, <1,1,1>, 1.0);
|
||
}
|
||
}
|
||
|
||
timer() {
|
||
if (target != NULL_KEY && llKey2Name(target) != "") {
|
||
vector pos = llList2Vector(llGetObjectDetails(target, [OBJECT_POS]), 0) + <1,0,1>;
|
||
llSetRegionPos(pos);
|
||
}
|
||
}
|
||
}
|