## [2.5.0] - 2025-08-08
This commit is contained in:
parent
0e713136d2
commit
5c87a51fad
5 changed files with 100 additions and 8 deletions
22
CHANGELOG.md
22
CHANGELOG.md
|
|
@ -2,6 +2,28 @@
|
||||||
|
|
||||||
All notable changes to Peril Dice will be documented in this file.
|
All notable changes to Peril Dice will be documented in this file.
|
||||||
|
|
||||||
|
## [2.5.0] - 2025-08-08
|
||||||
|
|
||||||
|
### 🛡️ Registration Security Fixes
|
||||||
|
- **Duplicate Registration Prevention**: Fixed critical bug where players could register multiple times by rapid clicking
|
||||||
|
- Added `pendingRegistrations` list to track registration requests in progress
|
||||||
|
- Prevents duplicate registration messages from being sent while first registration processes
|
||||||
|
- Automatic cleanup of pending registrations after completion or timeout
|
||||||
|
- **Startup Sequence Protection**: Fixed bug allowing player joins during game initialization
|
||||||
|
- Added `gameStarting` flag to block registrations immediately when "Start Game" is clicked
|
||||||
|
- Eliminates timing window between game start and `roundStarted` flag activation
|
||||||
|
- Maintains owner exception for admin menu access during gameplay
|
||||||
|
|
||||||
|
### 🎮 Improved Game Flow Control
|
||||||
|
- **Enhanced Touch Handler**: Better handling of registration status with user feedback
|
||||||
|
- **State Management**: Proper cleanup of both `gameStarting` and `pendingRegistrations` during reset
|
||||||
|
- **User Experience**: Clear messaging when registration attempts are blocked during active periods
|
||||||
|
|
||||||
|
### 🐛 Critical Bug Fixes
|
||||||
|
- **Race Condition Resolution**: Eliminated duplicate player entries from rapid multiple touches
|
||||||
|
- **Game Disruption Prevention**: Stopped unwanted joins during critical game startup phase
|
||||||
|
- **Consistent Game State**: All registration paths now properly validate timing and prevent duplicates
|
||||||
|
|
||||||
## [2.4.0] - 2025-08-08
|
## [2.4.0] - 2025-08-08
|
||||||
|
|
||||||
### 📍 Position Management System
|
### 📍 Position Management System
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,29 @@ PERIL DICE CHANGELOG
|
||||||
|
|
||||||
All notable changes to Peril Dice are documented in this file.
|
All notable changes to Peril Dice are documented in this file.
|
||||||
|
|
||||||
|
[2.5.0] - 2025-08-08
|
||||||
|
====================
|
||||||
|
|
||||||
|
🛡️ REGISTRATION SECURITY FIXES
|
||||||
|
- Duplicate Registration Prevention: Fixed critical bug where players could register multiple times by rapid clicking
|
||||||
|
* Added pendingRegistrations list to track registration requests in progress
|
||||||
|
* Prevents duplicate registration messages from being sent while first registration processes
|
||||||
|
* Automatic cleanup of pending registrations after completion or timeout
|
||||||
|
- Startup Sequence Protection: Fixed bug allowing player joins during game initialization
|
||||||
|
* Added gameStarting flag to block registrations immediately when "Start Game" is clicked
|
||||||
|
* Eliminates timing window between game start and roundStarted flag activation
|
||||||
|
* Maintains owner exception for admin menu access during gameplay
|
||||||
|
|
||||||
|
🎮 IMPROVED GAME FLOW CONTROL
|
||||||
|
- Enhanced Touch Handler: Better handling of registration status with user feedback
|
||||||
|
- State Management: Proper cleanup of both gameStarting and pendingRegistrations during reset
|
||||||
|
- User Experience: Clear messaging when registration attempts are blocked during active periods
|
||||||
|
|
||||||
|
🐛 CRITICAL BUG FIXES
|
||||||
|
- Race Condition Resolution: Eliminated duplicate player entries from rapid multiple touches
|
||||||
|
- Game Disruption Prevention: Stopped unwanted joins during critical game startup phase
|
||||||
|
- Consistent Game State: All registration paths now properly validate timing and prevent duplicates
|
||||||
|
|
||||||
[2.4.0] - 2025-08-08
|
[2.4.0] - 2025-08-08
|
||||||
====================
|
====================
|
||||||
|
|
||||||
|
|
|
||||||
34
Main.lsl
34
Main.lsl
|
|
@ -198,10 +198,12 @@ resetGame() {
|
||||||
// Reset all game state variables
|
// Reset all game state variables
|
||||||
players = names = lives = picksData = globalPickedNumbers = readyPlayers = [];
|
players = names = lives = picksData = globalPickedNumbers = readyPlayers = [];
|
||||||
floaterChannels = []; // Clear the tracked channels
|
floaterChannels = []; // Clear the tracked channels
|
||||||
|
pendingRegistrations = []; // Clear pending registrations
|
||||||
perilPlayer = "";
|
perilPlayer = "";
|
||||||
pickQueue = [];
|
pickQueue = [];
|
||||||
currentPickerIdx = 0;
|
currentPickerIdx = 0;
|
||||||
roundStarted = FALSE; // Reset round flag
|
roundStarted = FALSE; // Reset round flag
|
||||||
|
gameStarting = FALSE; // Reset game starting flag
|
||||||
currentPicker = NULL_KEY; // Reset current picker
|
currentPicker = NULL_KEY; // Reset current picker
|
||||||
timeoutTimer = 0; // Reset timeout timer
|
timeoutTimer = 0; // Reset timeout timer
|
||||||
lastWarning = 0; // Reset warning timer
|
lastWarning = 0; // Reset warning timer
|
||||||
|
|
@ -412,6 +414,11 @@ showNextPickerDialog() {
|
||||||
}
|
}
|
||||||
|
|
||||||
integer roundStarted = FALSE;
|
integer roundStarted = FALSE;
|
||||||
|
integer gameStarting = FALSE; // Track when game is in startup sequence
|
||||||
|
|
||||||
|
// Prevent duplicate registration by tracking pending registrations
|
||||||
|
list pendingRegistrations = []; // Keys of players who have registration in progress
|
||||||
|
integer REGISTRATION_TIMEOUT = 10; // Seconds to keep pending registration
|
||||||
|
|
||||||
default {
|
default {
|
||||||
state_entry() {
|
state_entry() {
|
||||||
|
|
@ -485,6 +492,12 @@ if (toucher == llGetOwner() && roundStarted) {
|
||||||
// Determine if this will be the first registered player (starter) before registration
|
// Determine if this will be the first registered player (starter) before registration
|
||||||
integer isStarter = FALSE;
|
integer isStarter = FALSE;
|
||||||
if (idx == -1) {
|
if (idx == -1) {
|
||||||
|
// Check if registration is already pending for this player
|
||||||
|
if (llListFindList(pendingRegistrations, [toucher]) != -1) {
|
||||||
|
llOwnerSay("⏳ Registration already in progress for " + llKey2Name(toucher));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// No index found; the owner is not yet registered.
|
// No index found; the owner is not yet registered.
|
||||||
// Owner becomes starter if there are no existing human players (excluding bots)
|
// Owner becomes starter if there are no existing human players (excluding bots)
|
||||||
isStarter = TRUE; // Default to TRUE for owner
|
isStarter = TRUE; // Default to TRUE for owner
|
||||||
|
|
@ -497,6 +510,8 @@ if (toucher == llGetOwner() && roundStarted) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
string ownerName = llKey2Name(toucher);
|
string ownerName = llKey2Name(toucher);
|
||||||
|
// Add to pending registrations
|
||||||
|
pendingRegistrations += [toucher];
|
||||||
// Send a registration request; Main.lsl will handle adding them and rezzing a float
|
// Send a registration request; Main.lsl will handle adding them and rezzing a float
|
||||||
llMessageLinked(LINK_SET, MSG_REGISTER_PLAYER, ownerName + "|" + (string)toucher, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_REGISTER_PLAYER, ownerName + "|" + (string)toucher, NULL_KEY);
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -534,6 +549,14 @@ if (toucher == llGetOwner() && roundStarted) {
|
||||||
// Unregistered non-owner player - register them and show menu
|
// Unregistered non-owner player - register them and show menu
|
||||||
string playerName = llKey2Name(toucher);
|
string playerName = llKey2Name(toucher);
|
||||||
if (playerName != "") {
|
if (playerName != "") {
|
||||||
|
// Check if registration is already pending for this player
|
||||||
|
if (llListFindList(pendingRegistrations, [toucher]) != -1) {
|
||||||
|
llOwnerSay("⏳ Registration already in progress for " + playerName);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add to pending registrations
|
||||||
|
pendingRegistrations += [toucher];
|
||||||
// Send a registration request; Main.lsl will handle adding them and rezzing a float
|
// Send a registration request; Main.lsl will handle adding them and rezzing a float
|
||||||
llMessageLinked(LINK_SET, MSG_REGISTER_PLAYER, playerName + "|" + (string)toucher, NULL_KEY);
|
llMessageLinked(LINK_SET, MSG_REGISTER_PLAYER, playerName + "|" + (string)toucher, NULL_KEY);
|
||||||
// Determine if this will be the first human player (starter)
|
// Determine if this will be the first human player (starter)
|
||||||
|
|
@ -660,8 +683,8 @@ if (toucher == llGetOwner() && roundStarted) {
|
||||||
string newName = llList2String(parts, 0);
|
string newName = llList2String(parts, 0);
|
||||||
key newKey = (key)llList2String(parts, 1);
|
key newKey = (key)llList2String(parts, 1);
|
||||||
|
|
||||||
// Prevent joining game in progress (except owner accessing menu)
|
// Prevent joining game in progress or during startup (except owner accessing menu)
|
||||||
if (roundStarted && newKey != llGetOwner()) {
|
if ((roundStarted || gameStarting) && newKey != llGetOwner()) {
|
||||||
llOwnerSay("🚫 " + newName + " cannot join - the killing game has begun!");
|
llOwnerSay("🚫 " + newName + " cannot join - the killing game has begun!");
|
||||||
llRegionSayTo(newKey, 0, "🚫 The killing game has already begun! Wait for the current game to end.");
|
llRegionSayTo(newKey, 0, "🚫 The killing game has already begun! Wait for the current game to end.");
|
||||||
return;
|
return;
|
||||||
|
|
@ -713,6 +736,12 @@ if (toucher == llGetOwner() && roundStarted) {
|
||||||
// Notify owner of registration
|
// Notify owner of registration
|
||||||
llOwnerSay("🔔 Added player: " + newName);
|
llOwnerSay("🔔 Added player: " + newName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Remove from pending registrations whether successful or not
|
||||||
|
integer pendingIdx = llListFindList(pendingRegistrations, [newKey]);
|
||||||
|
if (pendingIdx != -1) {
|
||||||
|
pendingRegistrations = llDeleteSubList(pendingRegistrations, pendingIdx, pendingIdx);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Handle elimination requests
|
// Handle elimination requests
|
||||||
|
|
@ -1242,6 +1271,7 @@ llRegionSay(-12345, "RESET_LEADERBOARD"); // Reset leaderboard scores
|
||||||
}
|
}
|
||||||
|
|
||||||
// All checks passed, start the game
|
// All checks passed, start the game
|
||||||
|
gameStarting = TRUE; // Prevent new players from joining during startup
|
||||||
llSay(0, "⚡ ALL PARTICIPANTS READY! THE DEADLY PERIL DICE GAME BEGINS! ⚡");
|
llSay(0, "⚡ ALL PARTICIPANTS READY! THE DEADLY PERIL DICE GAME BEGINS! ⚡");
|
||||||
|
|
||||||
// Change controller display to show game is active
|
// Change controller display to show game is active
|
||||||
|
|
|
||||||
14
README.md
14
README.md
|
|
@ -87,7 +87,15 @@ Dice type is automatically chosen to ensure at least 3 picks per player:
|
||||||
| 5–6 | d20 |
|
| 5–6 | d20 |
|
||||||
| 7–10 | d30 |
|
| 7–10 | d30 |
|
||||||
|
|
||||||
## Recent Improvements (v2.4.0)
|
## Recent Improvements (v2.5.0)
|
||||||
|
|
||||||
|
### 🛡️ Registration Security Fixes
|
||||||
|
- **Duplicate Registration Prevention**: Fixed critical bug where rapid clicking could create duplicate player entries
|
||||||
|
- **Startup Sequence Protection**: Eliminated timing window allowing unwanted joins during game initialization
|
||||||
|
- **Enhanced Game Flow Control**: Better state management and user feedback during registration processes
|
||||||
|
- **Race Condition Resolution**: Comprehensive fixes for all registration-related race conditions
|
||||||
|
|
||||||
|
## Previous Improvements (v2.4.0)
|
||||||
|
|
||||||
### 📍 Position Management System
|
### 📍 Position Management System
|
||||||
- **Master-Follower Architecture**: Controller object manages position of all game components
|
- **Master-Follower Architecture**: Controller object manages position of all game components
|
||||||
|
|
@ -126,9 +134,9 @@ Dice type is automatically chosen to ensure at least 3 picks per player:
|
||||||
|
|
||||||
## Version
|
## Version
|
||||||
|
|
||||||
**Current Version**: 2.4.0
|
**Current Version**: 2.5.0
|
||||||
**Last Updated**: August 8, 2025
|
**Last Updated**: August 8, 2025
|
||||||
**Status**: Production Ready - Debug-free codebase with comprehensive visual systems
|
**Status**: Production Ready - Enhanced security with registration protection and race condition fixes
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -87,9 +87,18 @@ Player Count | Dice Type
|
||||||
5–6 | d20
|
5–6 | d20
|
||||||
7–10 | d30
|
7–10 | d30
|
||||||
|
|
||||||
RECENT IMPROVEMENTS (V2.4.0)
|
RECENT IMPROVEMENTS (V2.5.0)
|
||||||
============================
|
============================
|
||||||
|
|
||||||
|
🛡️ REGISTRATION SECURITY FIXES
|
||||||
|
- Duplicate Registration Prevention: Fixed critical bug where rapid clicking could create duplicate player entries
|
||||||
|
- Startup Sequence Protection: Eliminated timing window allowing unwanted joins during game initialization
|
||||||
|
- Enhanced Game Flow Control: Better state management and user feedback during registration processes
|
||||||
|
- Race Condition Resolution: Comprehensive fixes for all registration-related race conditions
|
||||||
|
|
||||||
|
PREVIOUS IMPROVEMENTS (V2.4.0)
|
||||||
|
==============================
|
||||||
|
|
||||||
📍 POSITION MANAGEMENT SYSTEM
|
📍 POSITION MANAGEMENT SYSTEM
|
||||||
- Master-Follower Architecture: Controller object manages position of all game components
|
- Master-Follower Architecture: Controller object manages position of all game components
|
||||||
- Automatic Position Sync: Scoreboard, leaderboard, and displays move with main controller
|
- Automatic Position Sync: Scoreboard, leaderboard, and displays move with main controller
|
||||||
|
|
@ -105,9 +114,9 @@ RECENT IMPROVEMENTS (V2.4.0)
|
||||||
|
|
||||||
VERSION INFORMATION
|
VERSION INFORMATION
|
||||||
===================
|
===================
|
||||||
Current Version: 2.4.0
|
Current Version: 2.5.0
|
||||||
Last Updated: August 8, 2025
|
Last Updated: August 8, 2025
|
||||||
Status: Production Ready - Debug-free codebase with comprehensive visual systems
|
Status: Production Ready - Enhanced security with registration protection and race condition fixes
|
||||||
|
|
||||||
ORIGINAL GAME RULES CREDIT
|
ORIGINAL GAME RULES CREDIT
|
||||||
==========================
|
==========================
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue