Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
phpdts
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Packages
Packages
List
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issues
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nemo Ma
phpdts
Commits
7a76cc63
Commit
7a76cc63
authored
Jun 14, 2025
by
Nemo Ma
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Assorted Bugfixes
parent
47b8d802
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
611 additions
and
54 deletions
+611
-54
doc/etc/20241214_1430_dice_func_fix.txt
doc/etc/20241214_1430_dice_func_fix.txt
+128
-0
doc/etc/20241214_1445_dice_octitem_fix.txt
doc/etc/20241214_1445_dice_octitem_fix.txt
+68
-0
doc/etc/nouveau_template_fix_20241209_1430.txt
doc/etc/nouveau_template_fix_20241209_1430.txt
+244
-0
gamedata/system.php
gamedata/system.php
+4
-40
include/common.inc.php
include/common.inc.php
+34
-0
include/game/dice.func.php
include/game/dice.func.php
+32
-0
include/game/elementmix.func.php
include/game/elementmix.func.php
+11
-0
include/game/item.dice.php
include/game/item.dice.php
+4
-0
include/game/item2.func.php
include/game/item2.func.php
+15
-0
include/game/itemmain.func.php
include/game/itemmain.func.php
+1
-1
include/game/revevent.func.php
include/game/revevent.func.php
+14
-4
include/game/team.func.php
include/game/team.func.php
+22
-0
include/global.func.php
include/global.func.php
+11
-7
include/state.func.php
include/state.func.php
+14
-0
templates/default/usergdicon.htm
templates/default/usergdicon.htm
+3
-1
user.php
user.php
+6
-1
No files found.
doc/etc/20241214_1430_dice_func_fix.txt
0 → 100644
View file @
7a76cc63
修改时间: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. 确保数据类型的一致性
doc/etc/20241214_1445_dice_octitem_fix.txt
0 → 100644
View file @
7a76cc63
修改时间: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(): 处理棱镜八面体的颜色变化逻辑
注意事项:
- 这些修改只是修复了函数调用问题,没有改变游戏逻辑
- 如果还有其他文件调用这些函数但没有正确包含,可能需要进一步修复
- 建议检查是否有其他类似的函数依赖问题
doc/etc/nouveau_template_fix_20241209_1430.txt
0 → 100644
View file @
7a76cc63
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模板是否被正确加载
gamedata/system.php
View file @
7a76cc63
...
@@ -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
include/common.inc.php
View file @
7a76cc63
...
@@ -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
))
...
...
include/game/dice.func.php
View file @
7a76cc63
...
@@ -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
;
}
}
...
...
include/game/elementmix.func.php
View file @
7a76cc63
...
@@ -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>"
;
...
...
include/game/item.dice.php
View file @
7a76cc63
...
@@ -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
;
...
...
include/game/item2.func.php
View file @
7a76cc63
...
@@ -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';
...
...
include/game/itemmain.func.php
View file @
7a76cc63
...
@@ -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
);
}
}
...
...
include/game/revevent.func.php
View file @
7a76cc63
...
@@ -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之间随机
...
...
include/game/team.func.php
View file @
7a76cc63
...
@@ -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
'"
);
...
...
include/global.func.php
View file @
7a76cc63
...
@@ -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
(
$t
emplateid
!=
1
&&
$t
pldir
!=
'./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
(
$t
emplateid
!=
1
&&
$t
pldir
!=
'./templates/default'
)
{
if
(
$tpldir
!=
'./templates/default'
)
{
return
template
(
$file
,
1
,
'./templates/default'
);
return
template
(
$file
,
1
,
'./templates/default'
);
}
else
{
}
else
{
// 如果默认模板也不存在,返回错误
// 如果默认模板也不存在,返回错误
...
...
include/state.func.php
View file @
7a76cc63
...
@@ -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
){
...
...
templates/default/usergdicon.htm
View file @
7a76cc63
...
@@ -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>
<input
type=
"radio"
id=
"template_1"
name=
"templateid"
value=
"0"
<!
--
{
if
!$
u_templateid
}
--
>
checked
<!--{/if}-->
>
<a
onclick=
"sl('template_1')"
>
经典界面
</a>
<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(未开放)
<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}-->
...
...
user.php
View file @
7a76cc63
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment