Commit 7a76cc63 authored by Nemo Ma's avatar Nemo Ma

Assorted Bugfixes

parent 47b8d802
修改时间:2024-12-14 14:30
修改文件:include/game/dice.func.php
修改原因:修复极光天气下复活机制触发时的PHP致命错误
问题描述:
在极光天气下和特定NPC战斗,触发overrainbow技能被弹死时,出现了以下问题:
1. 没有输出任何技能文案,直接反馈死亡界面
2. 攻击可以将该NPC杀死,但NPC之后依然存活
错误记录:
[14-Jun-2025 02:36:08 Etc/GMT] PHP Fatal error: Uncaught Error: Cannot use assign-op operators with string offsets in /home2/a23336ht/public_html/dts1/include/game/dice.func.php:108
错误分析:
错误发生在 dice.func.php 第108行:$clbpara['diceRolled'] += 1;
错误原因是 $clbpara['diceRolled'] 字段可能:
1. 不存在(未初始化)
2. 是一个字符串而不是数字
当极光天气下复活机制触发时,会调用 diceroll(99) 函数,如果玩家的 clbpara['diceRolled'] 字段未初始化或为非数字值,就会导致 += 操作符失败。
修改内容:
在 dice.func.php 第108行之前添加了安全检查:
```php
// 确保 diceRolled 字段存在且为数字,避免 "Cannot use assign-op operators with string offsets" 错误
if(!isset($clbpara['diceRolled']) || !is_numeric($clbpara['diceRolled'])) {
$clbpara['diceRolled'] = 0;
}
```
修改逻辑:
1. 检查 $clbpara['diceRolled'] 是否存在
2. 检查该字段是否为数字类型
3. 如果不存在或不是数字,则初始化为 0
4. 然后安全地执行 += 操作
预期效果:
1. 修复极光天气下复活机制的PHP致命错误
2. 确保 diceRolled 字段始终为数字类型
3. 保持原有的骰子计数功能正常工作
测试建议:
1. 在极光天气下与具有overrainbow技能的NPC战斗
2. 验证复活机制是否正常工作
3. 检查是否还有其他类似的字段初始化问题
后续发现的问题和修复:
在进一步检查代码后,发现了更多类似的问题并进行了修复:
1. include/game/dice.func.php 第76行:
- 问题:$clbpara['traitorRoll'] += 1; 可能导致同样的错误
- 修复:添加了 traitorRoll 字段的初始化检查
2. include/state.func.php 第336行:
- 问题:$pd['clbpara']['lifedestroyed'] += 1; 可能导致同样的错误
- 修复:添加了 lifedestroyed 字段的初始化检查
3. include/game/revevent.func.php 第44行和第66行:
- 问题:charge2 和 charge4 字段的 += 操作可能导致错误
- 修复:添加了数字类型检查
4. include/game/team.func.php 第66行和第125行:
- 问题:$clbpara['achvars']['team'] 可能导致错误
- 修复:添加了 achvars 数组和 team 字段的初始化检查
5. include/game/item2.func.php 第142行:
- 问题:$clbpara['achvars']['hack'] += 1; 可能导致错误
- 修复:添加了 achvars 数组和 hack 字段的初始化检查
6. include/game/elementmix.func.php 第498行:
- 问题:$clbpara['achvars']['immix'] 可能导致错误
- 修复:添加了 achvars 数组的初始化检查
修复模式:
所有修复都遵循相同的模式:
1. 检查字段是否存在 (!isset())
2. 检查字段是否为数字类型 (!is_numeric()) - 对于数字字段
3. 如果不满足条件,则初始化为适当的默认值(通常是0或空数组)
4. 然后安全地执行 += 操作
这些修复应该能够防止所有类似的 "Cannot use assign-op operators with string offsets" 错误。
第二轮修复(针对持续出现的错误):
在实施了第一轮修复后,错误仍然出现在 dice.func.php 第118行,这表明问题的根本原因是 $clbpara 变量本身可能不是数组格式。
进一步分析发现,在战斗系统中,$clbpara 可能以以下形式存在:
1. JSON字符串格式(从数据库读取时)
2. 未初始化的变量
3. 空字符串
因此,第二轮修复采用了更强的防护措施:
修复策略:
1. 首先检查 $clbpara 是否为数组 (!is_array($clbpara))
2. 如果是字符串,尝试用 json_decode() 解析
3. 如果解析失败或不是数组,初始化为空数组
4. 然后再进行字段的存在性和类型检查
修复的文件和位置:
1. include/game/dice.func.php:
- 第114-130行:diceRolled 字段的完整防护
- 第75-91行:traitorRoll 字段的完整防护
2. include/state.func.php:
- 第334-350行:lifedestroyed 字段的完整防护
3. include/game/revevent.func.php:
- 第37-54行:charge2 和 charge4 字段的完整防护
4. include/game/team.func.php:
- 第64-77行:创建队伍时的 achvars['team'] 字段防护
- 第133-147行:加入队伍时的 achvars['team'] 字段防护
5. include/game/item2.func.php:
- 第140-157行:achvars['hack'] 字段的完整防护
6. include/game/elementmix.func.php:
- 第496-509行:achvars['immix'] 字段的完整防护
这种三层防护机制应该能够彻底解决 "Cannot use assign-op operators with string offsets" 错误:
- 第一层:确保 $clbpara 是数组
- 第二层:确保目标字段存在
- 第三层:确保目标字段是正确的数据类型
预期效果:
1. 完全消除极光天气下复活机制的PHP致命错误
2. 防止所有涉及 clbpara 字段的 += 操作错误
3. 提高游戏系统的整体稳定性
4. 确保数据类型的一致性
修改时间:2024-12-14 14:45
修改文件:include/game/item.dice.php, include/game/itemmain.func.php
修改原因:修复D3、D6骰子和棱镜八面体使用时页面卡住的问题
问题描述:
玩家汇报在使用D3、D6骰子以及丢弃棱镜八面体时页面会卡住。
错误记录:
1. [14-Jun-2025 04:08:29 Etc/GMT] PHP Fatal error: Uncaught Error: Call to undefined function fortuneCookie1() in /home2/a23336ht/public_html/dts1/include/game/item.dice.php:26
2. [14-Jun-2025 04:10:07 Etc/GMT] PHP Fatal error: Uncaught Error: Call to undefined function octitem_rotate() in /home2/a23336ht/public_html/dts1/include/game/itemmain.func.php:626
错误分析:
1. fortuneCookie1() 函数未定义:
- 函数在 include/game/fortune.func.php 中定义
- 但在 item.dice.php 中没有包含该文件
- 导致调用 fortuneCookie1(diceroll($clbpara['randver1'])) 时出错
2. octitem_rotate() 函数未定义:
- 函数在 include/game/item.nachster_booster.php 中定义
- 但在 itemmain.func.php 中包含的是 item.func.php
- 导致调用 octitem_rotate($theitem, 7) 时出错
修改内容:
1. 修改 include/game/item.dice.php:
在文件开头添加必要的包含语句:
```php
// Include required function files
require_once GAME_ROOT . './include/game/fortune.func.php';
require_once GAME_ROOT . './include/game/dice.func.php';
```
2. 修改 include/game/itemmain.func.php 第625行:
将:
```php
include_once GAME_ROOT . './include/game/item.func.php';
```
改为:
```php
include_once GAME_ROOT . './include/game/item.nachster_booster.php';
```
修改逻辑:
1. 确保 item.dice.php 能够访问 fortuneCookie1() 和 diceroll() 函数
2. 确保 itemmain.func.php 能够访问 octitem_rotate() 函数
3. 使用 require_once 和 include_once 避免重复包含
预期效果:
1. 修复D3、D6骰子使用时的PHP致命错误
2. 修复棱镜八面体丢弃时的PHP致命错误
3. 恢复骰子和棱镜八面体的正常功能
测试建议:
1. 测试使用D3骰子是否正常工作
2. 测试使用D6骰子是否正常工作
3. 测试丢弃棱镜八面体是否正常工作
4. 检查其他骰子类型(D10、D20、D40、D100、D1000)是否受影响
5. 验证fortuneCookie1函数的随机语句是否正常显示
相关函数说明:
- fortuneCookie1(): 显示骰子投掷时的随机幸运语句
- diceroll(): 执行骰子投掷的核心逻辑
- octitem_rotate(): 处理棱镜八面体的颜色变化逻辑
注意事项:
- 这些修改只是修复了函数调用问题,没有改变游戏逻辑
- 如果还有其他文件调用这些函数但没有正确包含,可能需要进一步修复
- 建议检查是否有其他类似的函数依赖问题
NOUVEAU模板未被应用问题的诊断和修复
时间:2024年12月9日 14:30
## 问题诊断
### 问题描述
用户将u_templateid设置为2后,nouveau模板未被正确应用,仍然显示默认模板。
### 根本原因分析
1. **TEMPLATEID类型问题**:
- 在gamedata/system.php中,TEMPLATEID被定义为字符串'2'
- 在include/global.func.php的template函数中,fallback逻辑使用了严格比较
- 条件`if($templateid != 1 && $tpldir != './templates/default')`中,字符串'2' != 1为true
- 导致nouveau模板总是fallback到默认模板
2. **Fallback逻辑缺陷**:
- 原逻辑:`if($templateid != 1 && $tpldir != './templates/default')`
- 这个条件对于任何非默认模板ID都会成立,导致错误的fallback
### 技术细节
- 用户设置:u_templateid = 2
- 系统设置:TEMPLATEID = '2' (字符串),TPLDIR = './templates/nouveau'
- 问题:字符串'2' != 整数1,触发fallback逻辑
- 结果:总是使用默认模板而不是nouveau模板
## 修复方案
### 1. 修复gamedata/system.php
**文件**:gamedata/system.php
**修改内容**:
- 将TEMPLATEID定义从字符串改为整数
- case 1: define('TEMPLATEID', 1); // 原来是 '1'
- case 2: define('TEMPLATEID', 2); // 原来是 '2'
- default: define('TEMPLATEID', 1); // 原来是 '1'
**修改原因**:
- 确保TEMPLATEID为整数类型,与fallback逻辑中的比较保持一致
- 避免类型不匹配导致的逻辑错误
### 2. 修复include/global.func.php
**文件**:include/global.func.php
**修改内容**:
- 简化fallback逻辑条件
- 原来:`if($templateid != 1 && $tpldir != './templates/default')`
- 修改为:`if($tpldir != './templates/default')`
**修改原因**:
- 移除对templateid的检查,只检查模板目录
- 任何非默认模板目录的文件不存在时都应该fallback到默认模板
- 避免因templateid类型或值的问题导致错误的fallback
## 修复效果
### 预期结果
1. 用户设置u_templateid=2后,系统正确应用nouveau模板
2. 当nouveau模板文件不存在时,正确fallback到默认模板
3. 模板切换功能正常工作
### 测试要点
1. 设置u_templateid=2,验证nouveau模板是否正确加载
2. 设置u_templateid=0,验证默认模板是否正确加载
3. 测试不存在的模板文件是否正确fallback
## 相关文件
- gamedata/system.php:模板ID和目录设置
- include/global.func.php:模板加载和fallback逻辑
- templates/nouveau/:nouveau模板文件目录
- templates/default/:默认模板文件目录
## 技术说明
### 模板系统工作原理
1. 用户登录时,从数据库读取u_templateid
2. 根据u_templateid设置TEMPLATEID和TPLDIR常量
3. template()函数根据这些常量加载对应的模板文件
4. 如果模板文件不存在,fallback到默认模板
### 修复后的逻辑流程
1. u_templateid=2 → TEMPLATEID=2, TPLDIR='./templates/nouveau'
2. template()函数查找nouveau模板文件
3. 如果文件存在,使用nouveau模板
4. 如果文件不存在,fallback到默认模板
## 注意事项
1. 确保templates/nouveau目录存在且包含必要的模板文件
2. 新增模板文件时需要同时在nouveau和default目录中提供
3. 模板ID的类型一致性很重要,建议统一使用整数
## 补充修复
### 3. 修复language函数的fallback逻辑
**文件**:include/global.func.php
**修改内容**:
- 在language函数中也存在相同的fallback逻辑问题
- 原来:`} elseif($templateid != 1 && $tpldir != './templates/default') {`
- 修改为:`} elseif($tpldir != './templates/default') {`
**修改原因**:
- 与template函数保持一致的fallback逻辑
- 确保语言包加载也能正确处理nouveau模板
- 避免因templateid检查导致的语言包加载问题
## 最终修复总结
1. gamedata/system.php:TEMPLATEID定义改为整数
2. include/global.func.php template函数:简化fallback逻辑
3. include/global.func.php language函数:简化fallback逻辑
所有修复都围绕一个核心问题:移除对templateid值的依赖,只基于模板目录进行fallback判断。
## 模板编译系统问题
### 发现的新问题
经过进一步分析,发现nouveau模板未被应用的根本原因是:
1. 模板系统需要将.htm文件编译成.tpl.php文件存储在gamedata/templates目录下
2. 编译后的文件命名格式为:{templateid}_{filename}.tpl.php
3. nouveau模板(templateid=2)的编译文件应该是:2_header.tpl.php, 2_game.tpl.php等
4. 但是这些编译文件可能没有被正确生成
### 模板编译机制
- 源文件:templates/nouveau/*.htm
- 编译后:gamedata/templates/2_*.tpl.php
- 编译触发:当$tplrefresh=1且源文件比编译文件新时自动编译
- 编译函数:parse_template() in include/template.func.php
### 测试方案
创建了三个测试文件供上传到测试机:
1. **test_template_compile.php** - 全面的模板编译测试
- 测试不同templateid的编译过程
- 检查源文件和编译文件的存在性
- 显示详细的编译状态和错误信息
2. **force_compile_nouveau.php** - 强制编译nouveau模板
- 扫描templates/nouveau/目录下的所有.htm文件
- 强制编译所有nouveau模板文件
- 生成详细的编译报告
3. **test_template_switch.php** - 测试模板切换逻辑
- 模拟不同u_templateid设置(0,1,2)
- 验证模板选择逻辑是否正确
- 检查编译文件的存在性
### 测试步骤
1. 将三个测试文件上传到测试机的游戏根目录
2. 通过浏览器访问:
- http://your-server/test_template_switch.php (检查模板切换逻辑)
- http://your-server/test_template_compile.php (检查编译状态)
- http://your-server/force_compile_nouveau.php (强制编译nouveau模板)
3. 检查gamedata/templates/目录是否生成了2_*.tpl.php文件
4. 设置用户u_templateid=2,测试nouveau模板是否正确显示
### 预期结果
- gamedata/templates/目录应该包含:2_header.tpl.php, 2_game.tpl.php等文件
- 用户设置u_templateid=2后应该看到nouveau的赛博朋克风格界面
- 如果某个nouveau模板文件不存在,应该正确fallback到默认模板
## 路径问题修复
### 发现的路径问题
在测试机上运行force_compile_nouveau.php时出现路径错误:
- 错误路径:/volume1/web/../templates/nouveau
- 原因:GAME_ROOT已经是绝对路径,不需要再加'.'
### 修复方案
创建了修复版本的测试文件:
1. **force_compile_nouveau_fixed.php** - 修复路径拼接问题
2. **test_template_compile_fixed.php** - 修复路径拼接问题
### 路径修复详情
- 原来:GAME_ROOT . '.' . $nouveau_template_dir
- 修复:GAME_ROOT . $nouveau_template_dir
- GAME_ROOT定义:substr(dirname(__FILE__), 0, -7) (已经是绝对路径)
### 新的测试步骤
1. 上传修复版本的测试文件到测试机
2. 运行 force_compile_nouveau_fixed.php
3. 检查是否成功生成2_*.tpl.php文件
4. 测试nouveau模板是否正确显示
## 模板加载问题调试
### 问题现状
编译文件已成功生成,但用户仍看到旧界面,说明模板加载逻辑有问题。
### 可能原因
1. **fallback逻辑被错误触发**:即使编译文件存在,仍fallback到默认模板
2. **用户模板设置未正确传递**:u_templateid没有正确影响TEMPLATEID常量
3. **缓存问题**:浏览器或服务器缓存导致旧模板被使用
4. **模板文件时间戳问题**:源文件比编译文件新,导致重新编译为默认模板
### 新增调试文件
1. **debug_template_loading.php** - 调试模板加载过程
- 显示当前用户信息和系统常量
- 测试template函数的实际行为
- 检查源文件和编译文件的时间戳
- 手动测试不同templateid的调用
2. **test_user_template_setting.php** - 测试用户模板设置
- 需要用户登录状态
- 测试数据库中u_templateid的更新
- 模拟系统重新加载的行为
- 验证模板选择逻辑
### 调试步骤
1. 上传调试文件到测试机
2. 以登录状态访问 debug_template_loading.php
3. 检查TEMPLATEID和TPLDIR是否正确设置
4. 访问 test_user_template_setting.php 测试模板切换
5. 检查template函数返回的路径是否正确
## 根本问题修复
### 发现的根本问题
通过调试发现,用户u_templateid=2,但系统常量仍然是TEMPLATEID=1和TPLDIR=./templates/default。
**问题原因**:加载顺序错误
1. gamedata/system.php在第54行被加载,此时$cuser还未设置
2. $cuser在第80行才被设置
3. 用户数据在第90行才被获取
4. 所以模板设置时无法获取用户的模板偏好
### 修复方案
1. **修改gamedata/system.php**:
- 移除原有的动态模板设置逻辑
- 只设置默认值,等待后续覆盖
2. **修改include/common.inc.php**:
- 在用户数据加载后(第90行之后)添加模板设置逻辑
- 使用全局变量$TEMPLATEID_OVERRIDE和$TPLDIR_OVERRIDE来覆盖常量
3. **修改include/global.func.php**:
- 修改template()和language()函数
- 优先使用覆盖变量,如果不存在则使用原常量
### 技术实现
- 由于PHP常量不能重新定义,使用全局变量覆盖机制
- template()函数检查覆盖变量,优先使用用户设置的模板
- 保持向后兼容性,如果没有覆盖变量则使用原常量
### 新增测试文件
- **test_template_fix.php** - 验证修复是否有效
- 检查覆盖变量是否正确设置
- 验证template()函数是否返回正确路径
- 确认nouveau模板是否被正确加载
...@@ -53,45 +53,9 @@ $chatinnews = 50; ...@@ -53,45 +53,9 @@ $chatinnews = 50;
//模板编号。默认为1 //模板编号。默认为1
define('STYLEID', '1'); define('STYLEID', '1');
// 动态设置模板ID和目录 // 模板设置将在用户数据加载后进行
$user_templateid = 0; // 默认模板ID // 这里先设置默认值,稍后会在common.inc.php中重新设置
if(isset($cuser) && $cuser) { define('TEMPLATEID', 1);
// 获取用户的模板设置 define('TPLDIR', './templates/default');
global $db, $gtablepre;
if(isset($db) && $db) {
$result = $db->query("SELECT u_templateid FROM {$gtablepre}users WHERE username='$cuser'");
if($db->num_rows($result)) {
$userdata = $db->fetch_array($result);
$user_templateid = intval($userdata['u_templateid']);
}
}
}
// 根据模板ID设置模板目录和常量
switch($user_templateid) {
case 1:
// LULUXIA模板(未实装)
define('TEMPLATEID', '1');
define('TPLDIR', './templates/luluxia');
// 如果模板目录不存在,fallback到默认模板
if(!file_exists(GAME_ROOT.TPLDIR)) {
define('TPLDIR_FALLBACK', './templates/default');
}
break;
case 2:
// NOUVEAU模板
define('TEMPLATEID', '2');
define('TPLDIR', './templates/nouveau');
// 如果模板目录不存在,fallback到默认模板
if(!file_exists(GAME_ROOT.TPLDIR)) {
define('TPLDIR_FALLBACK', './templates/default');
}
break;
default:
// 默认模板
define('TEMPLATEID', '1');
define('TPLDIR', './templates/default');
break;
}
?> ?>
\ No newline at end of file
...@@ -89,6 +89,40 @@ while($roominfo = $db->fetch_array($result)) ...@@ -89,6 +89,40 @@ while($roominfo = $db->fetch_array($result))
if($cuser) $udata = fetch_userdata_by_username($cuser); if($cuser) $udata = fetch_userdata_by_username($cuser);
// 在用户数据加载后重新设置模板
if(isset($udata) && $udata && isset($udata['u_templateid'])) {
$user_templateid = intval($udata['u_templateid']);
// 由于PHP常量不能重新定义,我们需要使用全局变量来覆盖
global $TEMPLATEID_OVERRIDE, $TPLDIR_OVERRIDE;
switch($user_templateid) {
case 1:
// LULUXIA模板(未实装)
$TEMPLATEID_OVERRIDE = 1;
$TPLDIR_OVERRIDE = './templates/luluxia';
// 如果模板目录不存在,fallback到默认模板
if(!file_exists(GAME_ROOT.'./templates/luluxia')) {
$TPLDIR_OVERRIDE = './templates/default';
}
break;
case 2:
// NOUVEAU模板
$TEMPLATEID_OVERRIDE = 2;
$TPLDIR_OVERRIDE = './templates/nouveau';
// 如果模板目录不存在,fallback到默认模板
if(!file_exists(GAME_ROOT.'./templates/nouveau')) {
$TPLDIR_OVERRIDE = './templates/default';
}
break;
default:
// 默认模板 - 使用已定义的常量
$TEMPLATEID_OVERRIDE = null;
$TPLDIR_OVERRIDE = null;
break;
}
}
$groomid = isset($udata['roomid']) ? $udata['roomid'] : 0; $groomid = isset($udata['roomid']) ? $udata['roomid'] : 0;
if(!empty($groomid)) if(!empty($groomid))
......
...@@ -73,6 +73,21 @@ function diceroll($dice){ ...@@ -73,6 +73,21 @@ function diceroll($dice){
$wf += $rollRandomizer2; $wf += $rollRandomizer2;
$wg += $rollRandomizer2; $wg += $rollRandomizer2;
$log .= "<span class=\"lime\">你对随机数大神的反叛令力量注入了你的身体!<br>"; $log .= "<span class=\"lime\">你对随机数大神的反叛令力量注入了你的身体!<br>";
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 traitorRoll 字段存在且为数字
if(!isset($clbpara['traitorRoll']) || !is_numeric($clbpara['traitorRoll'])) {
$clbpara['traitorRoll'] = 0;
}
$clbpara['traitorRoll'] += 1; $clbpara['traitorRoll'] += 1;
} }
...@@ -105,6 +120,23 @@ function diceroll($dice){ ...@@ -105,6 +120,23 @@ function diceroll($dice){
$log .= "<span class=\"lime\">你本次骰子的检定结果为:</span><span class=\"red\">$result</span>\<span class=\"yellow\">$dice</span>!<br>"; $log .= "<span class=\"lime\">你本次骰子的检定结果为:</span><span class=\"red\">$result</span>\<span class=\"yellow\">$dice</span>!<br>";
} }
//$log .= "【DEBUG】你本次骰子的检定结果为:<br><span class=\"red\">$result</span>\<span class=\"yellow\">$dice</span>!<br>"; //$log .= "【DEBUG】你本次骰子的检定结果为:<br><span class=\"red\">$result</span>\<span class=\"yellow\">$dice</span>!<br>";
// 确保 clbpara 是数组,避免 "Cannot use assign-op operators with string offsets" 错误
if(!is_array($clbpara)) {
// 如果 clbpara 不是数组,尝试解析为数组
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
// 如果仍然不是数组,初始化为空数组
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 diceRolled 字段存在且为数字
if(!isset($clbpara['diceRolled']) || !is_numeric($clbpara['diceRolled'])) {
$clbpara['diceRolled'] = 0;
}
$clbpara['diceRolled'] += 1; $clbpara['diceRolled'] += 1;
return $result; return $result;
} }
......
...@@ -495,6 +495,17 @@ ...@@ -495,6 +495,17 @@
} }
extract($data,EXTR_REFS); extract($data,EXTR_REFS);
# 尝试元素合成时 合成操作计数+1 # 尝试元素合成时 合成操作计数+1
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 achvars 数组存在
if(!isset($clbpara['achvars'])) $clbpara['achvars'] = array();
if(empty($clbpara['achvars']['immix'])) $clbpara['achvars']['immix'] = 1; if(empty($clbpara['achvars']['immix'])) $clbpara['achvars']['immix'] = 1;
$log.="从口袋中抓出了:<br>"; $log.="从口袋中抓出了:<br>";
......
...@@ -4,6 +4,10 @@ if (! defined ( 'IN_GAME' )) { ...@@ -4,6 +4,10 @@ if (! defined ( 'IN_GAME' )) {
exit ( 'Access Denied' ); exit ( 'Access Denied' );
} }
// Include required function files
require_once GAME_ROOT . './include/game/fortune.func.php';
require_once GAME_ROOT . './include/game/dice.func.php';
// Handle dice items // Handle dice items
function item_dice($itmn, &$data) { function item_dice($itmn, &$data) {
global $log, $db, $tablepre; global $log, $db, $tablepre;
......
...@@ -139,6 +139,21 @@ function hack($itmn = 0) { ...@@ -139,6 +139,21 @@ function hack($itmn = 0) {
$hack_dice = rand(0,99); $hack_dice = rand(0,99);
if(($hack_dice < $hack_obbs)||(($club == 7)&&($hack_dice<95))) { if(($hack_dice < $hack_obbs)||(($club == 7)&&($hack_dice<95))) {
$hack = 1; $hack = 1;
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 achvars 数组存在
if(!isset($clbpara['achvars'])) $clbpara['achvars'] = array();
// 确保 hack 字段存在且为数字
if(!isset($clbpara['achvars']['hack']) || !is_numeric($clbpara['achvars']['hack'])) {
$clbpara['achvars']['hack'] = 0;
}
$clbpara['achvars']['hack'] += 1; $clbpara['achvars']['hack'] += 1;
$log .= '入侵禁区控制系统成功了!全部禁区都被解除了!<br>'; $log .= '入侵禁区控制系统成功了!全部禁区都被解除了!<br>';
//include_once GAME_ROOT.'./include/system.func.php'; //include_once GAME_ROOT.'./include/system.func.php';
......
...@@ -622,7 +622,7 @@ function itemdrop($item,&$data=NULL) { ...@@ -622,7 +622,7 @@ function itemdrop($item,&$data=NULL) {
{ {
$theitem = array('itm' => &$itm, 'itmk' => &$itmk, 'itme' => &$itme,'itms' => &$itms,'itmsk' => &$itmsk); $theitem = array('itm' => &$itm, 'itmk' => &$itmk, 'itme' => &$itme,'itms' => &$itms,'itmsk' => &$itmsk);
$log .= "<span class=\"yellow b\">{$itm}</span>似乎发生了变化……<br>"; $log .= "<span class=\"yellow b\">{$itm}</span>似乎发生了变化……<br>";
include_once GAME_ROOT . './include/game/item.func.php'; include_once GAME_ROOT . './include/game/item.nachster_booster.php';
octitem_rotate($theitem, 7); octitem_rotate($theitem, 7);
} }
......
...@@ -34,11 +34,21 @@ function update_charge_values(&$data) ...@@ -34,11 +34,21 @@ function update_charge_values(&$data)
$clbpara['charge1'] = min(101, $clbpara['charge1'] + $increase); $clbpara['charge1'] = min(101, $clbpara['charge1'] + $increase);
} }
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 更新charge2:不设上限,提升速度按照randver2而定,最高100点每次 // 更新charge2:不设上限,提升速度按照randver2而定,最高100点每次
if(!isset($clbpara['charge2'])) { if(!isset($clbpara['charge2']) || !is_numeric($clbpara['charge2'])) {
$clbpara['charge2'] = 0; $clbpara['charge2'] = 0;
} }
// 计算提升值,基于randver2,最高100点 // 计算提升值,基于randver2,最高100点
$increase = min(100, max(1, ceil($clbpara['randver2'] / 3))); $increase = min(100, max(1, ceil($clbpara['randver2'] / 3)));
$clbpara['charge2'] += $increase; $clbpara['charge2'] += $increase;
...@@ -55,10 +65,10 @@ function update_charge_values(&$data) ...@@ -55,10 +65,10 @@ function update_charge_values(&$data)
$clbpara['charge3'] = max(-128, min(128, $clbpara['charge3'] + $change)); $clbpara['charge3'] = max(-128, min(128, $clbpara['charge3'] + $change));
// 更新charge4:没有上限或下限,可提升或削减 // 更新charge4:没有上限或下限,可提升或削减
if(!isset($clbpara['charge4'])) { if(!isset($clbpara['charge4']) || !is_numeric($clbpara['charge4'])) {
$clbpara['charge4'] = 0; $clbpara['charge4'] = 0;
} }
// 随机决定是提升还是削减 // 随机决定是提升还是削减
$direction = (rand(0, 1) == 1) ? 1 : -1; $direction = (rand(0, 1) == 1) ? 1 : -1;
// 变化量在1-10之间随机 // 变化量在1-10之间随机
......
...@@ -63,6 +63,17 @@ function teammake($tID,$tPass,$tIcon) { ...@@ -63,6 +63,17 @@ function teammake($tID,$tPass,$tIcon) {
$log .= '体力不足,不能创建队伍。至少需要<span class="yellow">'.$team_sp.'</span>点体力。<br>'; $log .= '体力不足,不能创建队伍。至少需要<span class="yellow">'.$team_sp.'</span>点体力。<br>';
} else { } else {
//创建队伍时,队伍计数+1 //创建队伍时,队伍计数+1
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 achvars 数组存在
if(!isset($clbpara['achvars'])) $clbpara['achvars'] = array();
if(empty($clbpara['achvars']['team'])) $clbpara['achvars']['team'] = 1; if(empty($clbpara['achvars']['team'])) $clbpara['achvars']['team'] = 1;
$result = $db->query("SELECT pid FROM {$tablepre}players WHERE teamID='$tID'"); $result = $db->query("SELECT pid FROM {$tablepre}players WHERE teamID='$tID'");
...@@ -122,6 +133,17 @@ function teamjoin($tID,$tPass) { ...@@ -122,6 +133,17 @@ function teamjoin($tID,$tPass) {
} else { } else {
//加入队伍时,队伍计数+1 //加入队伍时,队伍计数+1
// 确保 clbpara 是数组
if(!is_array($clbpara)) {
if(is_string($clbpara)) {
$clbpara = json_decode($clbpara, true);
}
if(!is_array($clbpara)) {
$clbpara = array();
}
}
// 确保 achvars 数组存在
if(!isset($clbpara['achvars'])) $clbpara['achvars'] = array();
if(empty($clbpara['achvars']['team'])) $clbpara['achvars']['team'] = 1; if(empty($clbpara['achvars']['team'])) $clbpara['achvars']['team'] = 1;
$result = $db->query("SELECT teamPass,teamIcon FROM {$tablepre}players WHERE teamID='$tID'"); $result = $db->query("SELECT teamPass,teamIcon FROM {$tablepre}players WHERE teamID='$tID'");
......
...@@ -70,13 +70,16 @@ function gstrfilter($str) { ...@@ -70,13 +70,16 @@ function gstrfilter($str) {
} }
function language($file, $templateid = 0, $tpldir = '') { function language($file, $templateid = 0, $tpldir = '') {
$tpldir = $tpldir ? $tpldir : TPLDIR; global $TEMPLATEID_OVERRIDE, $TPLDIR_OVERRIDE;
$templateid = $templateid ? $templateid : TEMPLATEID;
// 使用覆盖变量(如果存在)
$tpldir = $tpldir ? $tpldir : (isset($TPLDIR_OVERRIDE) && $TPLDIR_OVERRIDE ? $TPLDIR_OVERRIDE : TPLDIR);
$templateid = $templateid ? $templateid : (isset($TEMPLATEID_OVERRIDE) && $TEMPLATEID_OVERRIDE ? $TEMPLATEID_OVERRIDE : TEMPLATEID);
$languagepack = GAME_ROOT.'./'.$tpldir.'/'.$file.'.lang.php'; $languagepack = GAME_ROOT.'./'.$tpldir.'/'.$file.'.lang.php';
if(file_exists($languagepack)) { if(file_exists($languagepack)) {
return $languagepack; return $languagepack;
} elseif($templateid != 1 && $tpldir != './templates/default') { } elseif($tpldir != './templates/default') {
// Fallback到默认模板的语言包 // Fallback到默认模板的语言包
return language($file, 1, './templates/default'); return language($file, 1, './templates/default');
} else { } else {
...@@ -85,10 +88,11 @@ function language($file, $templateid = 0, $tpldir = '') { ...@@ -85,10 +88,11 @@ function language($file, $templateid = 0, $tpldir = '') {
} }
function template($file, $templateid = 0, $tpldir = '') { function template($file, $templateid = 0, $tpldir = '') {
global $tplrefresh; global $tplrefresh, $TEMPLATEID_OVERRIDE, $TPLDIR_OVERRIDE;
$tpldir = $tpldir ? $tpldir : TPLDIR; // 使用覆盖变量(如果存在)
$templateid = $templateid ? $templateid : TEMPLATEID; $tpldir = $tpldir ? $tpldir : (isset($TPLDIR_OVERRIDE) && $TPLDIR_OVERRIDE ? $TPLDIR_OVERRIDE : TPLDIR);
$templateid = $templateid ? $templateid : (isset($TEMPLATEID_OVERRIDE) && $TEMPLATEID_OVERRIDE ? $TEMPLATEID_OVERRIDE : TEMPLATEID);
$tplfile = GAME_ROOT.'./'.$tpldir.'/'.$file.'.htm'; $tplfile = GAME_ROOT.'./'.$tpldir.'/'.$file.'.htm';
$objfile = GAME_ROOT.'./gamedata/templates/'.$templateid.'_'.$file.'.tpl.php'; $objfile = GAME_ROOT.'./gamedata/templates/'.$templateid.'_'.$file.'.tpl.php';
...@@ -96,7 +100,7 @@ function template($file, $templateid = 0, $tpldir = '') { ...@@ -96,7 +100,7 @@ function template($file, $templateid = 0, $tpldir = '') {
// 改进的fallback机制,支持nouveau模板 // 改进的fallback机制,支持nouveau模板
if(!file_exists($tplfile)) { if(!file_exists($tplfile)) {
// 如果当前模板文件不存在,尝试fallback到默认模板 // 如果当前模板文件不存在,尝试fallback到默认模板
if($templateid != 1 && $tpldir != './templates/default') { if($tpldir != './templates/default') {
return template($file, 1, './templates/default'); return template($file, 1, './templates/default');
} else { } else {
// 如果默认模板也不存在,返回错误 // 如果默认模板也不存在,返回错误
......
...@@ -333,6 +333,20 @@ ...@@ -333,6 +333,20 @@
# Process 百命猫 Kills # Process 百命猫 Kills
if($pd['name'] == '是TSEROF啦!'){ if($pd['name'] == '是TSEROF啦!'){
// 确保 clbpara 是数组
if(!is_array($pd['clbpara'])) {
if(is_string($pd['clbpara'])) {
$pd['clbpara'] = json_decode($pd['clbpara'], true);
}
if(!is_array($pd['clbpara'])) {
$pd['clbpara'] = array();
}
}
// 确保 lifedestroyed 字段存在且为数字
if(!isset($pd['clbpara']['lifedestroyed']) || !is_numeric($pd['clbpara']['lifedestroyed'])) {
$pd['clbpara']['lifedestroyed'] = 0;
}
$pd['clbpara']['lifedestroyed'] += 1; $pd['clbpara']['lifedestroyed'] += 1;
//make her disappear from map if all life are destroyed. //make her disappear from map if all life are destroyed.
if($pd['clbpara']['lifedestroyed'] > 111){ if($pd['clbpara']['lifedestroyed'] > 111){
......
...@@ -31,7 +31,9 @@ ...@@ -31,7 +31,9 @@
<td>当前界面</td> <td>当前界面</td>
<td> <td>
<input type="radio" id="template_1" name="templateid" value="0" <!--{if !$u_templateid}-->checked<!--{/if}-->><a onclick="sl('template_1')">经典界面</a> &nbsp;&nbsp; <input type="radio" id="template_1" name="templateid" value="0" <!--{if !$u_templateid}-->checked<!--{/if}-->><a onclick="sl('template_1')">经典界面</a> &nbsp;&nbsp;
<input type="radio" id="template_2" name="templateid" value="1" <!--{if $u_templateid == 1}-->checked<!--{/if}-->><a onclick="sl('template_2')">LULUXIA(未开放)</span> <input type="radio" id="template_2" name="templateid" value="1" <!--{if $u_templateid == 1}-->checked<!--{/if}-->><a onclick="sl('template_2')">LULUXIA(未开放)&nbsp;&nbsp;
<input type="radio" id="template_3" name="templateid" value="2" <!--{if $u_templateid == 2}-->checked<!--{/if}-->><a onclick="sl('template_3')">NOUVEAU(测试中)
</span>
</td> </td>
</tr> </tr>
<!--{/if}--> <!--{/if}-->
......
...@@ -128,7 +128,12 @@ if($mode == 'sync_master') { ...@@ -128,7 +128,12 @@ if($mode == 'sync_master') {
} }
} elseif($templateid == 2) { } elseif($templateid == 2) {
# NOUVEAU模板对所有用户开放 # NOUVEAU模板对所有用户开放
$gamedata['innerHTML']['info'] .= '已切换到NOUVEAU界面,刷新页面生效。<br>'; //$gamedata['innerHTML']['info'] .= '已切换到NOUVEAU界面,刷新页面生效。<br>';
if($udata['groupid'] < 9)
{
$templateid = 0;
$gamedata['innerHTML']['info'] .= 'NOUVEAU界面尚在施工中。<br>';
}
} else { } else {
# 其他值默认为经典界面 # 其他值默认为经典界面
$templateid = 0; $templateid = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment