Commit 934ac1a1 authored by Nemo Ma's avatar Nemo Ma

Bugfixes

parent a13c3bfb
......@@ -1019,6 +1019,23 @@ if($teamID){
//writeover('a.txt',$w);
ob_clean();
$jgamedata = compatible_json_encode($gamedata);
// 检查 JSON 编码是否成功
if($jgamedata === false || $jgamedata === null) {
// JSON 编码失败,尝试清理数据
$error_msg = json_last_error_msg();
error_log("JSON encoding failed in command.php: " . $error_msg);
// 创建简化的错误响应
$error_gamedata = array(
'innerHTML' => array(
'cmd' => '<span class="red">数据处理错误,请刷新页面重试。错误信息:' . htmlspecialchars($error_msg) . '</span>'
),
'mode' => 'command'
);
$jgamedata = compatible_json_encode($error_gamedata);
}
//$json = new Services_JSON();
//$jgamedata = $json->encode($gamedata);
//if(!strstr($_SERVER['HTTP_REFERER'], 'php')) {
......
# 枫火歌者种火强化功能修复记录
时间:2024-12-20
## 问题描述
枫火歌者使用焰火道具对种火进行强化时,提示操作失败,控制台显示以下错误:
- command.php 返回 500 状态码(内部服务器错误)
- JSON 序列化相关错误
- 跳过无效种火数据的提示
## 问题分析
通过分析代码和错误信息,发现以下问题:
1. **配置文件未加载**:FireseedEnhance 函数中使用了 $fireseed_enhance_multipliers 变量,但该变量定义在 club22cfg.php 配置文件中,而函数没有加载该配置文件。
2. **数据库更新不完整**:函数只更新了 clbpara 字段,但没有同时更新玩家的物品数据(itm1-6, itmk1-6, itms1-6 等字段)。
3. **错误处理不足**:缺少对 JSON 编码失败、数据库操作失败等情况的处理。
4. **数据验证不充分**:没有检查物品数量是否足够,没有处理种火 level 字段不存在的情况。
5. **除零风险**:在计算属性倍率时可能出现除零错误。
## 修复方案
### 1. 加载配置文件
在 FireseedEnhance 函数开始处添加:
```php
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
```
### 2. 完善数据验证
- 检查物品数量是否足够
- 检查种火 level 字段是否存在,不存在则初始化为 1
- 避免除零错误
### 3. 完整的数据库更新
同时更新 clbpara 和物品相关字段:
```php
$update_query = "UPDATE {$tablepre}players SET
clbpara='$encoded_clbpara',
$item_var='" . addslashes($$item_var) . "',
$itemk_var='" . addslashes($$itemk_var) . "',
$itemsk_var='" . addslashes($$itemsk_var) . "',
$iteme_var='" . intval($$iteme_var) . "',
$items_var='" . intval($$items_var) . "'
WHERE pid='$pid'";
```
### 4. 增强错误处理
- 检查 JSON 编码是否成功
- 检查数据库操作是否成功
- 提供更详细的错误信息
### 5. 数据类型处理
将计算结果转换为整数,避免浮点数精度问题:
```php
$clbpara['fireseed'][$fireseed_id]['hp'] = intval($clbpara['fireseed'][$fireseed_id]['hp'] * $ratio);
```
## 修复结果
修复后的 FireseedEnhance 函数具有以下改进:
1. 正确加载配置文件
2. 完整的数据验证和错误处理
3. 同时更新 clbpara 和物品数据
4. 防止 SQL 注入和数据类型错误
5. 提供详细的错误信息和调试支持
## 额外修复
### 1. 其他函数的配置文件加载问题
发现 FireseedDeploy、FireseedSearch、FireseedDrainNPC、FireseedBuffBonus 等函数也使用了配置文件中的变量,但没有加载配置文件。已在这些函数中添加配置文件加载:
```php
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
```
### 2. JSON 编码错误处理
在 command.php 中添加了 JSON 编码失败的错误处理,当 JSON 编码失败时会:
- 记录错误日志
- 返回简化的错误响应而不是导致 500 错误
- 提供用户友好的错误信息
### 3. compatible_json_encode 函数优化
修复了 compatible_json_encode 函数,确保正确处理中文字符:
- 在 PHP 5.4+ 版本中使用 JSON_UNESCAPED_UNICODE 标志
- 避免中文字符被错误编码导致的问题
### 4. 数据库连接检查
根据服务器错误日志显示的 "Call to a member function query() on null" 错误,在所有使用数据库的函数中添加了数据库连接检查:
- FireseedRecruit 函数
- FireseedDeploy 函数
- FireseedSearch 函数
- FireseedDrainNPC 函数
- FireseedEnhance 函数
- FireseedFollow 函数
每个函数都会在使用 $db 对象前检查其是否有效,如果无效则返回错误信息。
### 5. 变量作用域修复
根据服务器错误日志 "Call to a member function query() on null",发现问题是变量作用域导致的。
修复了 FireseedEnhance 函数的变量声明:
- 直接使用 global 声明所有需要的变量,而不是通过 extract() 函数
- 确保 $db、$pid、$clbpara 和所有物品变量都能正确访问
- 移除了可能导致变量作用域混乱的 $pdata 和 extract() 调用
## 测试建议
1. 测试正常的种火强化流程
2. 测试物品数量不足的情况
3. 测试使用非焰火物品的情况
4. 测试种火不存在的情况
5. 验证数据库数据是否正确更新
6. 测试种火部署功能是否正常
7. 测试种火探物和索敌功能
8. 验证种火跟随加成是否正确计算
修复耐久度为∞的消耗道具被错误消耗的问题 - 最终修复 v2
时间:2025年1月19日
## 问题描述
玩家汇报使用了一件耐久度为∞(itms='∞')的🎆H物品时,该物品被直接消耗。
耐久度∞的道具正确的处理是可以无限使用。
## 根本原因分析
通过玩家提供的调试信息发现,问题的根本原因有两个:
1. **PHP类型转换问题**:当`$itms`为'∞'时,执行`$itms--`后,PHP会将'∞'转换为数字(通常是-1),
然后`if($itms <= 0) destory_single_item($data,$itmn,1)`条件为真,导致物品被销毁。
2. **最关键问题**:在item.main.php第227行的最终检查中,使用了被修改后的`$itms`值而不是原始值:
```php
if ($itms <= 0 && $itms != $nosta && $itm)
```
当原始`$itms`为'∞'时,执行`$itms--`后变成-1,然后:
- `$itms <= 0` 为 true(因为-1 <= 0)
- `$itms != $nosta` 为 true(因为-1 != '∞')
所以这个条件为true,导致∞耐久物品被错误清空!
## 修复内容
### 1. include/game/item.other.php 第375行
**问题**:🎆B类型道具(Fireseed Box)使用时直接消耗道具
**修复前**:
```php
$itms--; $oitm = $itm; $oitmk = $itmk;
```
**修复后**:
```php
$oitm = $itm; $oitmk = $itmk;
if ($itms != $nosta) {
$itms--;
}
```
### 2. include/game/item.tool.php 第29行
**问题**:电池道具使用时直接消耗道具
**修复前**:
```php
if (${'itm' . $i} == '移动PC') {
${'itme' . $i} += $itme;
$itms--;
$flag = true;
$log .= "为<span class=\"yellow\">{${'itm'.$i}}</span>充了电。";
break;
}
```
**修复后**:
```php
if (${'itm' . $i} == '移动PC') {
${'itme' . $i} += $itme;
if ($itms != $nosta) {
$itms--;
}
$flag = true;
$log .= "为<span class=\"yellow\">{${'itm'.$i}}</span>充了电。";
break;
}
```
### 3. include/game/item.other.php 第282行
**问题**:🎆O类型道具的else分支中变量使用错误
**修复前**:
```php
}else{
$addw = $itme;
$mhp += $addmhp;
// $addmhp 变量未定义,导致功能异常
}
```
**修复后**:
```php
}else{
$addmhp = $itme;
$mhp += $addmhp;
// 正确设置变量
}
```
### 4. include/game/item.other.php 第401行(关键修复)
**问题**:🎆B类型道具的destory_single_item调用没有检查$nosta
**修复前**:
```php
if($itms <= 0) destory_single_item($data,$itmn,1);
```
**修复后**:
```php
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
```
### 5. include/game/item.other.php 第435行(关键修复)
**问题**:🎆C类型道具的destory_single_item调用没有检查$nosta
**修复前**:
```php
if($itms <= 0) destory_single_item($data,$itmn,1);
```
**修复后**:
```php
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
```
### 6. include/game/item.main.php 第227行(最关键修复)
**问题**:物品使用后的最终检查使用了被修改后的$itms值而不是原始值
**修复前**:
```php
if ($itms <= 0 && $itms != $nosta && $itm) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
```
**修复后**:
```php
if ($itms <= 0 && $is != $nosta && $itm) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
```
**说明**:使用$is(原始耐久度值)而不是$itms(可能被修改的值)来检查是否为无限耐久
## 修复原理
在旧版本的item.func.old中,所有的物品消耗都正确地使用了以下模式:
```php
if ($itms != $nosta) {
$itms--;
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
}
```
关键在于:
1. 首先检查`$itms != $nosta`,只有非无限耐久的物品才会被消耗
2. 在`destory_single_item`调用时也要检查`$nosta`,防止∞耐久物品被错误销毁
## 影响的物品类型
此修复影响以下物品类型:
1. 🎆B类型道具(Fireseed Box/Silent Box)
2. 🎆C类型道具(Weird Fireseed Box/Weird Box)
3. 电池道具(为移动PC充电)
4. 🎆O类型道具(生命最大值提升)- 修复了变量错误
## 测试建议
1. 创建一个耐久度为∞的🎆H类型道具,使用后确认道具不会被消耗
2. 创建一个耐久度为∞的🎆B类型道具,使用后确认道具不会被消耗
3. 创建一个耐久度为∞的🎆C类型道具,使用后确认道具不会被消耗
4. 创建一个耐久度为∞的电池道具,使用后确认道具不会被消耗
5. 测试🎆O类型道具(☼级别)的生命最大值提升功能是否正常工作
6. 测试正常耐久度的道具仍然会正常消耗
## 注意事项
此修复确保了所有消耗道具在使用时都会正确检查耐久度是否为无限,
特别是在调用`destory_single_item`函数时也要检查`$nosta`,
保持了与旧版本item.func.old的一致性。
## 修复完成状态
✓ 所有已知的∞耐久度物品消耗问题已修复
✓ 🎆H物品的耐久度检查确认正确
✓ 🎆B和🎆C物品的destory_single_item调用已修复
✓ 代码与旧版本逻辑保持一致
✓ 不影响正常耐久度物品的使用
## 技术细节
PHP在处理字符串'∞'进行数学运算时会将其转换为数字,通常结果是-1。
因此`if($itms <= 0)`条件会对∞耐久物品返回true,导致物品被错误销毁。
修复方法是在所有可能销毁物品的地方都添加`&& $itms != $nosta`检查。
修复所有item文件中$nosta变量传递问题
时间:2025年1月19日
## 问题描述
在修复∞耐久物品被错误消耗的问题时,发现item_fireworks()函数中缺少`global $nosta;`声明,
导致$nosta变量在函数内部无法访问,从而使∞耐久度检查失效。
经过全面检查,发现多个item文件中都存在类似的问题。
## 检查范围
遍历了include/game/目录下所有item开头的文件:
- item.weapon.php ✓ 无$nosta使用
- item.recovery.php ✓ 无$nosta使用
- item.poison.php ✓ 无$nosta使用
- item.trap.php ✓ 无$nosta使用
- item.ammo.php ✓ 无$nosta使用
- item.radar.php ✓ 无$nosta使用
- item.cure.php ✓ 无$nosta使用
- item.skillbook.php ✓ 无$nosta使用
- item.enhance.php ✓ 无$nosta使用
- item.weather.php ❌ 使用$nosta但缺少global声明
- item.electronic.php ✓ 无$nosta使用
- item.giftbox.php ❌ 多个函数使用$nosta但缺少global声明
- item.dice.php ✓ 无$nosta使用
- item.platform.php ❌ 使用$nosta但缺少global声明
- item.tool.php ✓ 已正确声明global $nosta
- item.other.php ❌ item_fireworks函数缺少global声明(已知问题)
## 修复内容
### 1. include/game/item.weather.php
**问题**:item_weather函数使用$nosta但没有声明为global
**修复前**:
```php
function item_weather($itmn, &$data) {
global $log;
```
**修复后**:
```php
function item_weather($itmn, &$data) {
global $log, $nosta;
```
### 2. include/game/item.giftbox.php
**问题**:4个函数都使用$nosta但没有声明为global,且destory_single_item调用缺少$nosta检查
#### 2.1 item_giftbox函数
**修复前**:
```php
function item_giftbox($itmn, &$data) {
global $log, $db, $tablepre, $now, $gamecfg;
```
**修复后**:
```php
function item_giftbox($itmn, &$data) {
global $log, $db, $tablepre, $now, $gamecfg, $nosta;
```
#### 2.2 item_ygo_box函数
**修复前**:
```php
function item_ygo_box($itmn, &$data) {
global $log, $now, $gamecfg;
```
**修复后**:
```php
function item_ygo_box($itmn, &$data) {
global $log, $now, $gamecfg, $nosta;
```
#### 2.3 item_fy_box函数
**修复前**:
```php
function item_fy_box($itmn, &$data) {
global $log, $now, $gamecfg;
```
**修复后**:
```php
function item_fy_box($itmn, &$data) {
global $log, $now, $gamecfg, $nosta;
```
#### 2.4 item_debug_box函数
**修复前**:
```php
function item_debug_box($itmn, &$data) {
global $log, $now, $gamecfg;
```
**修复后**:
```php
function item_debug_box($itmn, &$data) {
global $log, $now, $gamecfg, $nosta;
```
#### 2.5 destory_single_item调用修复
**修复前**(4处):
```php
if($itms <= 0) destory_single_item($data,$itmn,1);
```
**修复后**:
```php
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
```
### 3. include/game/item.platform.php
**问题**:item_platform函数使用$nosta但没有声明为global
**修复前**:
```php
function item_platform($itmn, &$data) {
global $log, $db, $tablepre;
```
**修复后**:
```php
function item_platform($itmn, &$data) {
global $log, $db, $tablepre, $nosta;
```
### 4. include/game/item.other.php
**问题**:item_fireworks函数使用$nosta但没有声明为global(已在远端修复)
## 修复原理
$nosta变量在gamedata/resources_1.php中定义为'∞',用于标识无限耐久度。
在item.main.php中已声明为global变量,但各个item处理函数是独立的函数作用域,
需要在每个使用$nosta的函数中单独声明global。
## 影响的物品类型
此修复影响以下物品类型:
1. 天气控制类物品(item.weather.php)
2. 各种礼品盒类物品(item.giftbox.php)
3. NPC平台类物品(item.platform.php)
4. 烟花类物品(item.other.php中的item_fireworks函数)
## 测试建议
1. 创建耐久度为∞的天气控制物品,使用后确认不会被消耗
2. 创建耐久度为∞的各种礼品盒,使用后确认不会被消耗
3. 创建耐久度为∞的NPC平台物品,使用后确认不会被消耗
4. 创建耐久度为∞的烟花类物品,使用后确认不会被消耗
## 注意事项
1. 此修复确保了所有item处理函数都能正确访问$nosta变量
2. 同时修复了destory_single_item调用中缺少$nosta检查的问题
3. 保持了与旧版本item.func.old的一致性
4. 不影响正常耐久度物品的使用
## 修复完成状态
✓ 所有item文件中的$nosta变量传递问题已修复
✓ 所有destory_single_item调用都已添加$nosta检查
✓ 代码与旧版本逻辑保持一致
✓ 不影响正常耐久度物品的使用
## 技术细节
PHP函数作用域规则要求在函数内部使用全局变量时必须显式声明global。
即使在调用函数的上下文中已经声明了global变量,被调用的函数仍然需要单独声明。
这是PHP语言的基本特性,确保了变量作用域的明确性和安全性。
## 额外发现的问题
### 7. include/game/item.trap.php 第67行
**问题**:item_trap_detector函数直接使用$itms--而没有检查$nosta
**修复前**:
```php
$trapresult = $db->query("SELECT * FROM {$tablepre}maptrap WHERE pls = '$pls' AND itme>='$itme'");
$trpnum = $db->num_rows($trapresult);
$itms--;
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
```
**修复后**:
```php
$trapresult = $db->query("SELECT * FROM {$tablepre}maptrap WHERE pls = '$pls' AND itme>='$itme'");
$trpnum = $db->num_rows($trapresult);
if ($itms != $nosta) {
$itms--;
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
}
```
### 8. include/game/item.ammo.php 第81行
**问题**:item_ammo_bullets函数直接使用$itms -= $bullet而没有检查$nosta
**修复前**:
```php
} elseif ($bullet >= $itms) {
$bullet = $itms;
}
$itms -= $bullet;
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
```
**修复后**:
```php
} elseif ($bullet >= $itms) {
$bullet = $itms;
}
if ($itms != $nosta) {
$itms -= $bullet;
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
} else {
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
}
```
### 9. include/game/item.cure.php 第53行
**问题**:item_cure函数缺少global $nosta声明,且直接使用$itms--
**修复前**:
```php
function item_cure($itmn, &$data) {
global $log, $exdmginf, $ex_inf;
...
$itms --;
```
**修复后**:
```php
function item_cure($itmn, &$data) {
global $log, $exdmginf, $ex_inf, $nosta;
...
if ($itms != $nosta) {
$itms --;
}
```
## 检查结果总结
### ✅ 正确的文件(已有适当的global声明和$nosta检查):
- item.weapon.php(已正确声明global $nosta)
- item.recovery.php(已正确声明global $nosta)
- item.poison.php(已正确声明global $nosta)
- item.enhance.php(已正确声明global $nosta并正确检查)
- item.skillbook.php(已正确声明global $nosta并正确检查)
- item.tool.php(已正确声明global $nosta)
- item.electronic.php(不使用$nosta)
- item.radar.php(不使用$nosta)
- item.dice.php(不使用$nosta)
- item.ending.php(不使用$nosta)
- item.special_effect.php(不使用$nosta)
- item.npc.php(不使用$nosta)
- item.synthesis.php(不使用$nosta)
- item.club_card.php(不使用$nosta)
- item.nachster_booster.php(不使用$nosta)
- item.nouveau_booster1.php(不使用$nosta)
- item.test.php(不使用$nosta)
### ❌ 已修复的文件:
- item.weather.php(添加global $nosta)
- item.giftbox.php(4个函数添加global $nosta,4处destory_single_item调用添加$nosta检查)
- item.platform.php(添加global $nosta)
- item.other.php(item_fireworks函数添加global $nosta,已在远端修复)
- item.trap.php(修复耐久度减少逻辑)
- item.ammo.php(修复子弹消耗逻辑)
- item.cure.php(添加global $nosta并修复耐久度减少逻辑)
## 相关文件修改列表
- include/game/item.weather.php(添加global $nosta)
- include/game/item.giftbox.php(4个函数添加global $nosta,4处destory_single_item调用添加$nosta检查)
- include/game/item.platform.php(添加global $nosta)
- include/game/item.other.php(item_fireworks函数添加global $nosta,已在远端修复)
- include/game/item.trap.php(修复耐久度减少逻辑)
- include/game/item.ammo.php(修复子弹消耗逻辑)
- include/game/item.cure.php(添加global $nosta并修复耐久度减少逻辑)
......@@ -13,6 +13,15 @@ include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
function FireseedRecruit($npc) {
global $log, $now, $fireseed_recruit_rate, $db, $tablepre;
// 检查数据库连接是否有效
if(!$db) {
global $db;
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
}
if(!isset($data)) {
global $pdata;
$data = &$pdata;
......@@ -104,7 +113,19 @@ function FireseedRecruit($npc) {
* @return bool 是否成功部署
*/
function FireseedDeploy($fireseed_id, $mode, $deploypls = 0) {
global $log, $fireseed_deploy_modes, $plsinfo, $deepzones, $db, $tablepre, $poseinfo;
global $log, $plsinfo, $deepzones, $db, $tablepre, $poseinfo;
// 检查数据库连接是否有效
if(!$db) {
global $db;
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
}
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
if(!isset($data)) {
global $pdata;
......@@ -183,7 +204,19 @@ function FireseedDeploy($fireseed_id, $mode, $deploypls = 0) {
* @return void
*/
function FireseedSearch($pls) {
global $log, $fireseed_search_rate, $db, $tablepre, $plsinfo;
global $log, $db, $tablepre, $plsinfo;
// 检查数据库连接是否有效
if(!$db) {
global $db;
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
}
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
if(!isset($data)) {
global $pdata;
......@@ -281,7 +314,19 @@ function FireseedSearch($pls) {
* @return void
*/
function FireseedDrainNPC($pls) {
global $log, $fireseed_drain_rate, $db, $tablepre, $plsinfo;
global $log, $db, $tablepre, $plsinfo;
// 检查数据库连接是否有效
if(!$db) {
global $db;
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
}
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
if(!isset($data)) {
global $pdata;
......@@ -375,13 +420,21 @@ function FireseedDrainNPC($pls) {
* @return bool 是否成功强化
*/
function FireseedEnhance($fireseed_id, $item_index) {
global $log, $fireseed_enhance_multipliers;
if(!isset($data)) {
global $pdata;
$data = &$pdata;
global $log, $db, $tablepre, $pid, $clbpara;
global $itm1, $itm2, $itm3, $itm4, $itm5, $itm6;
global $itmk1, $itmk2, $itmk3, $itmk4, $itmk5, $itmk6;
global $itme1, $itme2, $itme3, $itme4, $itme5, $itme6;
global $itms1, $itms2, $itms3, $itms4, $itms5, $itms6;
global $itmsk1, $itmsk2, $itmsk3, $itmsk4, $itmsk5, $itmsk6;
// 检查数据库连接是否有效
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
extract($data, EXTR_REFS);
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
// 检查种火是否存在
if(!isset($clbpara['fireseed'][$fireseed_id])) {
......@@ -401,38 +454,50 @@ function FireseedEnhance($fireseed_id, $item_index) {
return false;
}
// 检查物品数量
if($$items_var <= 0) {
$log .= "<span class='red'>该物品数量不足!</span><br>";
return false;
}
// 检查物品是否为焰火类物品
$item_name = $$item_var;
if(!isset($fireseed_enhance_multipliers[$item_name])) {
$log .= "<span class='red'>这不是可用于强化的焰火物品!</span><br>";
$log .= "<span class='red'>这不是可用于强化的焰火物品!可用物品:" . implode('、', array_keys($fireseed_enhance_multipliers)) . "</span><br>";
return false;
}
// 获取强化倍率
$multiplier = $fireseed_enhance_multipliers[$item_name];
// 检查种火是否有level字段,如果没有则初始化为1
if(!isset($clbpara['fireseed'][$fireseed_id]['level'])) {
$clbpara['fireseed'][$fireseed_id]['level'] = 1;
}
// 更新种火属性
$old_level = $clbpara['fireseed'][$fireseed_id]['level'];
$clbpara['fireseed'][$fireseed_id]['level'] = $multiplier;
$clbpara['fireseed'][$fireseed_id]['hp'] *= $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['mhp'] *= $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['sp'] *= $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['msp'] *= $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['att'] *= $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['def'] *= $multiplier / $old_level;
// 更新武器和防具效果
if(!empty($clbpara['fireseed'][$fireseed_id]['wepe'])) {
$clbpara['fireseed'][$fireseed_id]['wepe'] *= $multiplier / $old_level;
}
if(!empty($clbpara['fireseed'][$fireseed_id]['arbe'])) {
$clbpara['fireseed'][$fireseed_id]['arbe'] *= $multiplier / $old_level;
// 避免除零错误
if($old_level > 0) {
$ratio = $multiplier / $old_level;
$clbpara['fireseed'][$fireseed_id]['hp'] = intval($clbpara['fireseed'][$fireseed_id]['hp'] * $ratio);
$clbpara['fireseed'][$fireseed_id]['mhp'] = intval($clbpara['fireseed'][$fireseed_id]['mhp'] * $ratio);
$clbpara['fireseed'][$fireseed_id]['sp'] = intval($clbpara['fireseed'][$fireseed_id]['sp'] * $ratio);
$clbpara['fireseed'][$fireseed_id]['msp'] = intval($clbpara['fireseed'][$fireseed_id]['msp'] * $ratio);
$clbpara['fireseed'][$fireseed_id]['att'] = intval($clbpara['fireseed'][$fireseed_id]['att'] * $ratio);
$clbpara['fireseed'][$fireseed_id]['def'] = intval($clbpara['fireseed'][$fireseed_id]['def'] * $ratio);
// 更新武器和防具效果
if(!empty($clbpara['fireseed'][$fireseed_id]['wepe'])) {
$clbpara['fireseed'][$fireseed_id]['wepe'] = intval($clbpara['fireseed'][$fireseed_id]['wepe'] * $ratio);
}
if(!empty($clbpara['fireseed'][$fireseed_id]['arbe'])) {
$clbpara['fireseed'][$fireseed_id]['arbe'] = intval($clbpara['fireseed'][$fireseed_id]['arbe'] * $ratio);
}
}
// 将更新后的 clbpara 保存到数据库
$encoded_clbpara = json_encode($clbpara, JSON_UNESCAPED_UNICODE);
$db->query("UPDATE {$tablepre}players SET clbpara='$encoded_clbpara' WHERE pid='$pid'");
// 消耗物品
$$items_var--;
if($$items_var <= 0) {
......@@ -440,6 +505,31 @@ function FireseedEnhance($fireseed_id, $item_index) {
$$iteme_var = $$items_var = 0;
}
// 构建更新查询,同时更新物品和clbpara
$encoded_clbpara = json_encode($clbpara, JSON_UNESCAPED_UNICODE);
if($encoded_clbpara === false) {
$log .= "<span class='red'>数据编码失败!</span><br>";
return false;
}
// 转义单引号以防SQL注入
$encoded_clbpara = addslashes($encoded_clbpara);
$update_query = "UPDATE {$tablepre}players SET
clbpara='$encoded_clbpara',
$item_var='" . addslashes($$item_var) . "',
$itemk_var='" . addslashes($$itemk_var) . "',
$itemsk_var='" . addslashes($$itemsk_var) . "',
$iteme_var='" . intval($$iteme_var) . "',
$items_var='" . intval($$items_var) . "'
WHERE pid='$pid'";
$result = $db->query($update_query);
if(!$result) {
$log .= "<span class='red'>数据库更新失败:" . $db->error() . "</span><br>";
return false;
}
$log .= "<span class='lime'>你使用「{$item_name}」强化了种火「{$clbpara['fireseed'][$fireseed_id]['name']}」!</span><br>";
$log .= "<span class='yellow'>种火的强化倍率提升到了{$multiplier}倍!</span><br>";
......@@ -455,6 +545,15 @@ function FireseedEnhance($fireseed_id, $item_index) {
function FireseedFollow($target_pls) {
global $log, $db, $tablepre, $plsinfo;
// 检查数据库连接是否有效
if(!$db) {
global $db;
if(!$db) {
$log .= "<span class='red'>数据库连接错误!</span><br>";
return false;
}
}
if(!isset($data)) {
global $pdata;
$data = &$pdata;
......@@ -515,7 +614,8 @@ function FireseedFollow($target_pls) {
* @return array 返回加成的攻击和防御值
*/
function FireseedBuffBonus() {
global $fireseed_follow_bonus_rate;
// 加载配置文件
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
if(!isset($data)) {
global $pdata;
......
......@@ -78,13 +78,18 @@ function item_ammo_bullets($itmn, &$data) {
} elseif ($bullet >= $itms) {
$bullet = $itms;
}
$itms -= $bullet;
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
if ($itms != $nosta) {
$itms -= $bullet;
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
} else {
$weps += $bullet;
$log .= "为<span class=\"red\">$wep</span>装填了<span class=\"red\">$itm</span>,<span class=\"red\">$wep</span>残弹数增加<span class=\"yellow\">$bullet</span>。<br>";
}
}
......
......@@ -6,7 +6,7 @@ if (! defined ( 'IN_GAME' )) {
// Handle cure/medicine items
function item_cure($itmn, &$data) {
global $log, $exdmginf, $ex_inf;
global $log, $exdmginf, $ex_inf, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -49,8 +49,10 @@ function item_cure($itmn, &$data) {
}else{
$log .= "服用了<span class=\"red\">$itm</span>……发生了什么?<br>";
}
$itms --;
if ($itms != $nosta) {
$itms --;
}
/*if (strpos ( $itm, '烧伤药剂' ) === 0) {
if (strpos ( $inf, 'u' ) !== false) {
$inf = str_replace ( 'u', '', $inf );
......
......@@ -6,7 +6,7 @@ if (! defined ( 'IN_GAME' )) {
// Handle gift box items
function item_giftbox($itmn, &$data) {
global $log, $db, $tablepre, $now, $gamecfg;
global $log, $db, $tablepre, $now, $gamecfg, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -114,7 +114,7 @@ function item_giftbox($itmn, &$data) {
list($in,$ik,$ie,$is,$isk) = explode(',',$plist[$rand]);
}
//global $itm0,$itmk0,$itme0,$itms0,$itmsk0,$mode;
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$itm0 = $in;$itmk0=$ik;$itme0=$ie;$itms0=$is;$itmsk0=$isk;
addnews($now,'present',$name,$oitm,$in,$nick);
......@@ -124,7 +124,7 @@ function item_giftbox($itmn, &$data) {
// Handle YGO box items
function item_ygo_box($itmn, &$data) {
global $log, $now, $gamecfg;
global $log, $now, $gamecfg, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -138,7 +138,7 @@ function item_ygo_box($itmn, &$data) {
if ($itms != $nosta) {
$itms--;
}
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$file1 = config('box',$gamecfg);
$plist1 = openfile($file1);
......@@ -154,7 +154,7 @@ function item_ygo_box($itmn, &$data) {
// Handle FY box items
function item_fy_box($itmn, &$data) {
global $log, $now, $gamecfg;
global $log, $now, $gamecfg, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -168,7 +168,7 @@ function item_fy_box($itmn, &$data) {
if ($itms != $nosta) {
$itms--;
}
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$file1 = config('fy',$gamecfg);
$plist1 = openfile($file1);
......@@ -184,7 +184,7 @@ function item_fy_box($itmn, &$data) {
// Handle debug box items
function item_debug_box($itmn, &$data) {
global $log, $now, $gamecfg;
global $log, $now, $gamecfg, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -198,7 +198,7 @@ function item_debug_box($itmn, &$data) {
if ($itms != $nosta) {
$itms--;
}
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$file1 = config('f99',$gamecfg);
$plist1 = openfile($file1);
......
......@@ -224,7 +224,7 @@ function itemuse($itmn,&$data=NULL) {
}
// 消耗物品
if ($itms <= 0 && $itms != $nosta && $itm) {
if ($itms <= 0 && $is != $nosta && $itm) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
......
......@@ -6,7 +6,7 @@ if (! defined ( 'IN_GAME' )) {
// Handle fireworks items
function item_fireworks($itmn, &$data) {
global $log;
global $log, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......@@ -279,7 +279,7 @@ function item_fireworks($itmn, &$data) {
}
}else{
$addw = $itme;
$addmhp = $itme;
$mhp += $addmhp;
$log.="你将<span class=\"yellow\">{$itm}</span>吞下了肚。<br>
......@@ -372,7 +372,10 @@ function item_fireworks($itmn, &$data) {
# Officially dubbed Silent Box.
$log.="你打开了<span class=\"yellow\">$itm</span>。<br>";
$itms--; $oitm = $itm; $oitmk = $itmk;
$oitm = $itm; $oitmk = $itmk;
if ($itms != $nosta) {
$itms--;
}
include_once config('randomFS',$gamecfg);
......@@ -395,7 +398,7 @@ function item_fireworks($itmn, &$data) {
list($in,$ik,$ie,$is,$isk) = explode(',',$itemflag[$rand]);
}
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$itm0 = $in;$itmk0=$ik;$itme0=$ie;$itms0=$is;$itmsk0=$isk;
if($itemflag = $sundata) addnews($now,'present',$name,$oitm,$in,$nick);
......@@ -429,7 +432,7 @@ function item_fireworks($itmn, &$data) {
list($in,$ik,$ie,$is,$isk) = explode(',',$itemflag[$rand]);
}
if($itms <= 0) destory_single_item($data,$itmn,1);
if($itms <= 0 && $itms != $nosta) destory_single_item($data,$itmn,1);
$itm0 = $in;$itmk0=$ik;$itme0=$ie;$itms0=$is;$itmsk0=$isk;
if($itemflag = $sundata) addnews($now,'present',$name,$oitm,$in,$nick);
......
......@@ -12,7 +12,7 @@ if (! defined('IN_GAME')) {
* @param array &$data 玩家数据
*/
function item_platform($itmn, &$data) {
global $log, $db, $tablepre;
global $log, $db, $tablepre, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......
......@@ -64,11 +64,13 @@ function item_trap_detector($itmn, &$data) {
$trapresult = $db->query("SELECT * FROM {$tablepre}maptrap WHERE pls = '$pls' AND itme>='$itme'");
$trpnum = $db->num_rows($trapresult);
$itms--;
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
if ($itms != $nosta) {
$itms--;
if ($itms <= 0) {
$log .= "<span class=\"red\">$itm</span>用光了。<br>";
$itm = $itmk = $itmsk = '';
$itme = $itms = 0;
}
}
if ($trpnum>0){
$itemno = rand(0,$trpnum-1);
......
......@@ -6,7 +6,7 @@ if (! defined ( 'IN_GAME' )) {
// Handle weather control items
function item_weather($itmn, &$data) {
global $log;
global $log, $nosta;
extract($data, EXTR_REFS);
$itm = & ${'itm' . $itmn};
......
......@@ -201,7 +201,12 @@ function compatible_json_encode($data){ //自动选择使用内置函数或者
$json = new Services_JSON();
$jdata = $json->encode($data);
} else{
$jdata = json_encode($data);
// 使用 JSON_UNESCAPED_UNICODE 标志以正确处理中文字符
if(version_compare(PHP_VERSION, '5.4.0', '>=')) {
$jdata = json_encode($data, JSON_UNESCAPED_UNICODE);
} else {
$jdata = json_encode($data);
}
}
return $jdata;
}
......
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