Commit f0820cec authored by Nemo Ma's avatar Nemo Ma

Bugfix: $fireseed_follow_bonus_rate not passing

parent 9101f97f
调试时间:2024年12月18日
问题描述:
在之前修复种火跟随加成问题的基础上,用户在tooltip中添加了种火增幅显示逻辑,但测试玩家汇报没看到对应字符串出现在界面上,说明$fireseed_bonus的值小于等于0。
可能的问题原因:
1. 种火数据结构问题:种火可能没有正确的pose或mode值
2. 位置匹配问题:种火的pls值可能与玩家的pls值不匹配
3. 等级问题:种火的level值可能为0或未设置
4. 配置问题:$fireseed_follow_bonus_rate可能为0
5. 基础攻击力/防御力问题:传递的$base_att或$base_def可能为0或负数
调试方案:
在FireseedBuffBonus()函数中添加详细的调试信息,包括:
1. 玩家当前位置
2. 传递的基础攻击力和防御力
3. 种火总数量
4. 每个种火的详细信息(ID、位置、模式、等级)
5. 符合条件的种火及其计算过程
6. 最终的攻击和防御加成值
具体修改:
文件:include/game/club22.func.php(第558-578行)
添加的调试信息:
```php
global $log;
$debug_info = "【种火调试】玩家位置: {$pls}, 基础攻击: {$base_att}, 基础防御: {$base_def}, 种火数量: " . count($clbpara['fireseed']) . "<br>";
foreach($clbpara['fireseed'] as $fs_id => $fs_data) {
$debug_info .= "【种火调试】种火ID: {$fs_id}, 位置: {$fs_data['pls']}, 模式: " . (isset($fs_data['pose']) ? $fs_data['pose'] : $fs_data['mode']) . ", 等级: {$fs_data['level']}<br>";
// 原有的判断逻辑...
if(符合条件) {
$debug_info .= "【种火调试】种火{$fs_id}符合条件,加成百分比: {$bonus_percent}%, 攻击加成: " . ceil($base_att * $bonus_percent / 100) . ", 防御加成: " . ceil($base_def * $bonus_percent / 100) . "<br>";
}
}
$debug_info .= "【种火调试】最终攻击加成: {$att_bonus}, 防御加成: {$def_bonus}<br>";
if(!empty($log)) $log .= $debug_info;
```
调试信息将显示:
1. 玩家当前位置和基础属性
2. 所有种火的详细状态
3. 哪些种火符合跟随条件
4. 每个符合条件种火的加成计算过程
5. 最终的总加成值
使用方法:
1. 让测试玩家执行任何会触发属性计算的操作(如查看角色信息、战斗等)
2. 查看游戏日志中的【种火调试】信息
3. 根据调试信息确定问题所在:
- 如果种火数量为0:检查种火收纳是否成功
- 如果种火位置不匹配:检查种火移动逻辑
- 如果种火模式不正确:检查种火部署设置
- 如果等级为0:检查种火强化逻辑
- 如果基础属性为0:检查属性计算逻辑
注意事项:
1. 这是临时调试代码,问题解决后应该移除
2. 调试信息会显示在游戏日志中,可能影响游戏体验
3. 确保测试环境中有正确设置的种火数据
预期结果:
通过调试信息可以准确定位$fireseed_bonus为0的具体原因,然后针对性地修复问题。
问题解决(2024年12月18日):
通过分析代码发现了真正的问题根源:在FireseedRecruit()函数中,种火数据被添加到了玩家的clbpara['fireseed']中,但是没有保存玩家的clbpara数据到数据库!
具体问题:
1. 收纳种火时,种火数据被添加到内存中的$clbpara['fireseed']数组
2. 代码只保存了NPC的clbpara到数据库,但没有保存玩家的clbpara
3. 页面刷新后,玩家的clbpara从数据库重新加载,但种火数据没有被保存,所以丢失了
修复方案:
在FireseedRecruit()函数中添加保存玩家clbpara数据的代码:
```php
// 保存玩家的clbpara数据到数据库 - 这是关键的修复!
$encoded_player_clbpara = json_encode($clbpara, JSON_UNESCAPED_UNICODE);
$db->query("UPDATE {$tablepre}players SET clbpara='$encoded_player_clbpara' WHERE pid='$pid'");
```
这个修复确保了种火数据在收纳后能正确保存到数据库,页面刷新后不会丢失。
调试代码已移除,因为问题已经解决。
修复时间:2024年12月18日
问题描述:
测试玩家反馈枫火歌者种火跟随追加攻击力·防御力机制的问题:
1. 跟随种火针对攻击力·防御力的加成似乎只会在收纳种火时生效并显示,但只要点击搜寻等功能刷新页面,前台显示的加成便会消失。
2. 页底出现大量PHP Notice:Undefined Variable: fireseed_follow_bonus_rate in club22.func.php on line 640
问题分析:
1. PHP Notice错误显示在第640行,但实际的club22.func.php文件只有578行,说明错误信息可能指向了错误的位置。
2. 通过代码分析发现,问题出现在FireseedBuffBonus()函数(第530行)中:
- 该函数声明了global $fireseed_follow_bonus_rate;
- 但是在某些调用情况下,配置文件可能没有被正确加载到函数作用域中
3. FireseedBuffBonus()函数被以下地方调用:
- revattr.func.php第868行(攻击力计算)
- revattr.func.php第1000行(防御力计算)
- 这些调用通过include_once包含club22.func.php文件
4. 虽然club22.func.php在第5行包含了配置文件:
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
但是在函数作用域中,全局变量可能没有被正确传递。
问题根源:
当revattr.func.php调用include_once包含club22.func.php时,配置文件确实被包含了,但是FireseedBuffBonus()函数在执行时,$fireseed_follow_bonus_rate变量的作用域可能存在问题,导致变量未定义。
修复方案:
在FireseedBuffBonus()函数开始处添加配置文件的包含,确保变量在函数作用域中可用。
具体修改:
文件:include/game/club22.func.php(第529-536行)
修改前:
```php
function FireseedBuffBonus() {
global $fireseed_follow_bonus_rate;
if(!isset($data)) {
global $pdata;
$data = &$pdata;
}
extract($data, EXTR_REFS);
```
修改后:
```php
function FireseedBuffBonus() {
// 确保配置文件被加载
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
global $fireseed_follow_bonus_rate;
if(!isset($data)) {
global $pdata;
$data = &$pdata;
}
extract($data, EXTR_REFS);
```
修复逻辑:
1. 在函数内部显式包含配置文件,确保$fireseed_follow_bonus_rate变量被定义
2. 使用include_once避免重复包含
3. 保持原有的global声明,确保变量在函数作用域中可用
关于第二个问题(加成消失)的分析:
通过代码分析发现,游戏界面显示的攻击力和防御力是通过以下流程计算的:
1. game.func.php的init_playerdata()函数(第111-112行)
2. 调用\revattr\get_base_att()和\revattr\get_base_def()
3. 这些函数会调用FireseedBuffBonus()计算种火加成
4. 结果存储在$atkinfo和$definfo变量中
5. 模板profile.htm显示这些变量
修复了PHP Notice错误后,种火加成应该能正确计算和显示。
第二次修复(2024年12月18日):
经过测试发现,虽然PHP Notice错误被解决了,但种火跟随加成仍然没有正常显示。问题的根源在于FireseedBuffBonus()函数使用的是玩家的基础$att和$def值来计算加成,而不是包含装备加成等的最终值。
进一步修复:
1. 修改FireseedBuffBonus()函数,添加可选参数$base_att和$base_def,允许传递正确的基础攻击力和防御力
2. 修改revattr.func.php中的调用,传递当前计算出的基础攻击力和防御力:
- 攻击力计算:传递$base_att(包含武器加成的基础攻击力)
- 防御力计算:传递$total_def(包含装备加成的基础防御力)
具体修改:
1. include/game/club22.func.php(第523-572行):
- 添加可选参数$base_att = null, $base_def = null
- 如果没有提供参数,则使用玩家的基础属性
- 使用传递的参数来计算种火加成
2. include/game/revattr.func.php(第864-873行):
- 修改攻击力计算中的FireseedBuffBonus()调用
- 传递$base_att参数
3. include/game/revattr.func.php(第997-1006行):
- 修改防御力计算中的FireseedBuffBonus()调用
- 传递$total_def参数
修复逻辑:
现在种火加成基于正确的基础攻击力和防御力计算,而不是仅仅基于玩家的原始属性。这确保了加成能够正确反映玩家的实际战斗能力。
测试建议:
1. 创建枫火歌者角色并收纳种火
2. 设置种火为跟随模式
3. 检查攻击力和防御力是否正确显示加成
4. 执行搜寻等操作后检查加成是否持续显示
5. 确认不再出现PHP Notice错误
6. 验证加成数值是否基于正确的基础攻击力和防御力计算
注意事项:
1. 种火加成只有在种火与玩家在同一位置且处于跟随模式时才生效
2. 加成计算公式:数量(1) × 强化层数 × 1%
3. 现在加成基于包含装备效果的基础攻击力和防御力,而不是原始属性值
修复时间:2024年12月18日
问题描述:
根据用户的进一步调试发现,种火跟随加成的问题不在于种火数据保存,而在于配置变量$fireseed_follow_bonus_rate在某些情况下变成了空值。
具体表现:
1. 种火等级可以正确读取,说明种火数据本身正常
2. $fireseed_follow_bonus_rate变量为空,导致加成百分比计算结果为0
3. 在收纳时能正常显示,说明收纳时配置文件被正确加载了
4. 其他操作后变成空值,说明在某些调用路径下配置变量的作用域有问题
问题分析:
在FireseedBuffBonus()函数中,虽然使用了include_once来包含配置文件,但是变量作用域处理有问题:
原始代码:
```php
function FireseedBuffBonus($base_att = null, $base_def = null) {
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
global $fireseed_follow_bonus_rate;
// ...
}
```
问题在于:
1. include_once在函数作用域中包含配置文件
2. 配置文件中的变量在函数作用域中定义
3. global声明试图引用全局作用域中的变量,但全局作用域中可能没有这个变量
4. 导致$fireseed_follow_bonus_rate为空
修复方案:
1. 移除global声明,直接在函数中使用配置文件的变量
2. 添加默认值检查,确保变量有值
3. 添加调试信息验证修复效果
具体修改:
文件:include/game/club22.func.php(第535-541行)
修改前:
```php
function FireseedBuffBonus($base_att = null, $base_def = null) {
// 确保配置文件被加载
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
global $fireseed_follow_bonus_rate;
```
修改后:
```php
function FireseedBuffBonus($base_att = null, $base_def = null) {
// 确保配置文件被加载,并直接使用配置变量
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
// 如果全局变量不存在,使用默认值
if(!isset($fireseed_follow_bonus_rate)) {
$fireseed_follow_bonus_rate = 1; // 默认1%
}
```
同时添加了详细的调试信息来验证修复效果:
```php
$debug_info = "【种火调试】玩家位置: {$pls}, 基础攻击: {$base_att}, 基础防御: {$base_def}, 种火数量: " . count($clbpara['fireseed']) . ", 加成系数: {$fireseed_follow_bonus_rate}<br>";
```
修复逻辑:
1. 配置文件在函数作用域中被包含,变量在函数中可用
2. 不再依赖全局变量,避免作用域问题
3. 添加默认值保护,确保变量始终有值
4. 调试信息显示加成系数,便于验证修复效果
预期结果:
1. $fireseed_follow_bonus_rate变量应该始终有值(默认为1)
2. 种火跟随加成应该能正确计算
3. 调试信息应该显示正确的加成系数值
4. 页面刷新后加成应该持续显示
测试建议:
1. 让测试玩家重新测试种火跟随加成
2. 查看调试信息中的"加成系数"是否显示为1
3. 验证加成百分比是否正确计算
4. 确认页面刷新后加成是否持续显示
注意事项:
1. 这是临时调试代码,问题解决后应该移除调试信息
2. 如果问题仍然存在,可能需要进一步检查配置文件的包含路径或其他作用域问题
...@@ -86,8 +86,12 @@ function FireseedRecruit($npc) { ...@@ -86,8 +86,12 @@ function FireseedRecruit($npc) {
// 更新NPC的clbpara - 使用JSON格式存储 // 更新NPC的clbpara - 使用JSON格式存储
$npc_clbpara = $npc['clbpara']; $npc_clbpara = $npc['clbpara'];
$encoded_clbpara = json_encode($npc_clbpara, JSON_UNESCAPED_UNICODE); $encoded_npc_clbpara = json_encode($npc_clbpara, JSON_UNESCAPED_UNICODE);
$db->query("UPDATE {$tablepre}players SET clbpara='$encoded_clbpara' WHERE pid='{$npc['pid']}'"); $db->query("UPDATE {$tablepre}players SET clbpara='$encoded_npc_clbpara' WHERE pid='{$npc['pid']}'");
// 保存玩家的clbpara数据到数据库 - 这是关键的修复!
$encoded_player_clbpara = json_encode($clbpara, JSON_UNESCAPED_UNICODE);
$db->query("UPDATE {$tablepre}players SET clbpara='$encoded_player_clbpara' WHERE pid='$pid'");
$log .= "<span class='lime'>你成功收纳了种火「{$npc['name']}」!</span><br>"; $log .= "<span class='lime'>你成功收纳了种火「{$npc['name']}」!</span><br>";
addnews($now, 'fireseed_recruit', $name, $npc['name']); addnews($now, 'fireseed_recruit', $name, $npc['name']);
...@@ -524,10 +528,17 @@ function FireseedFollow($target_pls) { ...@@ -524,10 +528,17 @@ function FireseedFollow($target_pls) {
* 根据所有跟随种火的数量与强化层数,为玩家加成攻击防御 * 根据所有跟随种火的数量与强化层数,为玩家加成攻击防御
* 注意:只有与玩家在同一位置的跟随种火才会提供加成 * 注意:只有与玩家在同一位置的跟随种火才会提供加成
* *
* @param int $base_att 基础攻击力(可选,如果不提供则使用玩家基础属性)
* @param int $base_def 基础防御力(可选,如果不提供则使用玩家基础属性)
* @return array 返回加成的攻击和防御值 * @return array 返回加成的攻击和防御值
*/ */
function FireseedBuffBonus() { function FireseedBuffBonus($base_att = null, $base_def = null) {
global $fireseed_follow_bonus_rate; // 确保配置文件被加载,并直接使用配置变量
include_once GAME_ROOT.'./gamedata/cache/club22cfg.php';
// 如果全局变量不存在,使用默认值
if(!isset($fireseed_follow_bonus_rate)) {
$fireseed_follow_bonus_rate = 1; // 默认1%
}
if(!isset($data)) { if(!isset($data)) {
global $pdata; global $pdata;
...@@ -543,19 +554,36 @@ function FireseedBuffBonus() { ...@@ -543,19 +554,36 @@ function FireseedBuffBonus() {
return array('att' => $att_bonus, 'def' => $def_bonus); return array('att' => $att_bonus, 'def' => $def_bonus);
} }
// 如果没有提供基础攻击力和防御力,使用玩家的基础属性
if($base_att === null) {
$base_att = $att;
}
if($base_def === null) {
$base_def = $def;
}
// 计算跟随模式的种火加成 // 计算跟随模式的种火加成
// 注意:这里仍然只考虑与玩家在同一位置的种火,因为这是战斗加成 // 注意:这里仍然只考虑与玩家在同一位置的种火,因为这是战斗加成
foreach($clbpara['fireseed'] as $fs_data) { global $log;
$debug_info = "【种火调试】玩家位置: {$pls}, 基础攻击: {$base_att}, 基础防御: {$base_def}, 种火数量: " . count($clbpara['fireseed']) . ", 加成系数: {$fireseed_follow_bonus_rate}<br>";
foreach($clbpara['fireseed'] as $fs_id => $fs_data) {
$debug_info .= "【种火调试】种火ID: {$fs_id}, 位置: {$fs_data['pls']}, 模式: " . (isset($fs_data['pose']) ? $fs_data['pose'] : $fs_data['mode']) . ", 等级: {$fs_data['level']}<br>";
// 使用 pose 值 1 表示作战姿态(跟随) // 使用 pose 值 1 表示作战姿态(跟随)
if((isset($fs_data['pose']) && $fs_data['pose'] == 1 && $fs_data['pls'] == $pls) || if((isset($fs_data['pose']) && $fs_data['pose'] == 1 && $fs_data['pls'] == $pls) ||
($fs_data['mode'] == 0 && $fs_data['pls'] == $pls)) { ($fs_data['mode'] == 0 && $fs_data['pls'] == $pls)) {
// 加成 = 数量(1) × 强化层数 × 1% // 加成 = 数量(1) × 强化层数 × 1%
$bonus_percent = 1 * $fs_data['level'] * $fireseed_follow_bonus_rate; $bonus_percent = 1 * $fs_data['level'] * $fireseed_follow_bonus_rate;
$att_bonus += ceil($att * $bonus_percent / 100); $att_bonus += ceil($base_att * $bonus_percent / 100);
$def_bonus += ceil($def * $bonus_percent / 100); $def_bonus += ceil($base_def * $bonus_percent / 100);
$debug_info .= "【种火调试】种火{$fs_id}符合条件,加成百分比: {$bonus_percent}%, 加成系数: {$fireseed_follow_bonus_rate}, 加成等级: {$fs_data['level']}<br>";
} }
} }
$debug_info .= "【种火调试】最终攻击加成: {$att_bonus}, 防御加成: {$def_bonus}<br>";
if(!empty($log)) $log .= $debug_info;
return array('att' => $att_bonus, 'def' => $def_bonus); return array('att' => $att_bonus, 'def' => $def_bonus);
} }
......
...@@ -866,7 +866,8 @@ namespace revattr ...@@ -866,7 +866,8 @@ namespace revattr
if($pa['club'] == 22 && !empty($pa['clbpara']['fireseed'])) if($pa['club'] == 22 && !empty($pa['clbpara']['fireseed']))
{ {
include_once GAME_ROOT.'./include/game/club22.func.php'; include_once GAME_ROOT.'./include/game/club22.func.php';
$fireseed_buff = FireseedBuffBonus(); // 传递当前计算出的基础攻击力(包含武器加成)
$fireseed_buff = FireseedBuffBonus($base_att, null);
$fireseed_bonus = $fireseed_buff['att']; $fireseed_bonus = $fireseed_buff['att'];
if(!$tooltip && $fireseed_bonus > 0) $log .= "<span class='yellow'>{$pa['nm']}的种火增幅了{$fireseed_bonus}点攻击力!</span><br>"; if(!$tooltip && $fireseed_bonus > 0) $log .= "<span class='yellow'>{$pa['nm']}的种火增幅了{$fireseed_bonus}点攻击力!</span><br>";
} }
...@@ -878,6 +879,7 @@ namespace revattr ...@@ -878,6 +879,7 @@ namespace revattr
if($tooltip) if($tooltip)
{ {
$tooltip .= "天气修正:{$wth_atk_per}%\r 地点修正:{$pls_atk_per}%\r 姿态修正:{$pose_atk_per}%\r 策略修正:{$tac_atk_per}%"; $tooltip .= "天气修正:{$wth_atk_per}%\r 地点修正:{$pls_atk_per}%\r 姿态修正:{$pose_atk_per}%\r 策略修正:{$tac_atk_per}%";
if($fireseed_bonus > 0) $tooltip .=" \r 种火增幅:{$fireseed_bonus}";
if($inf_atk_per <> 100) $tooltip .=" \r 异常状态修正:{$inf_atk_per}%"; if($inf_atk_per <> 100) $tooltip .=" \r 异常状态修正:{$inf_atk_per}%";
//if($club_atk_per <> 100) $tooltip .=" \r 称号技能修正:{$club_atk_per}%"; //if($club_atk_per <> 100) $tooltip .=" \r 称号技能修正:{$club_atk_per}%";
$tooltip .="\">".$base_att."</span>"; $tooltip .="\">".$base_att."</span>";
...@@ -998,7 +1000,8 @@ namespace revattr ...@@ -998,7 +1000,8 @@ namespace revattr
if($pd['club'] == 22 && !empty($pd['clbpara']['fireseed'])) if($pd['club'] == 22 && !empty($pd['clbpara']['fireseed']))
{ {
include_once GAME_ROOT.'./include/game/club22.func.php'; include_once GAME_ROOT.'./include/game/club22.func.php';
$fireseed_buff = FireseedBuffBonus(); // 传递当前计算出的基础防御力(包含装备加成)
$fireseed_buff = FireseedBuffBonus(null, $total_def);
$fireseed_bonus = $fireseed_buff['def']; $fireseed_bonus = $fireseed_buff['def'];
if(!$tooltip && $fireseed_bonus > 0) $log .= "<span class='yellow'>{$pd['nm']}的种火增幅了{$fireseed_bonus}点防御力!</span><br>"; if(!$tooltip && $fireseed_bonus > 0) $log .= "<span class='yellow'>{$pd['nm']}的种火增幅了{$fireseed_bonus}点防御力!</span><br>";
} }
...@@ -1012,6 +1015,7 @@ namespace revattr ...@@ -1012,6 +1015,7 @@ namespace revattr
{ {
$tooltip .= "天气修正:{$wth_def_per}% \r 地点修正:{$pls_def_per}% \r 姿态修正:{$pose_def_per}% \r 策略修正:{$tac_def_per}%"; $tooltip .= "天气修正:{$wth_def_per}% \r 地点修正:{$pls_def_per}% \r 姿态修正:{$pose_def_per}% \r 策略修正:{$tac_def_per}%";
if($inf_def_per <> 100) $tooltip .=" \r 异常状态修正:{$inf_def_per}%"; if($inf_def_per <> 100) $tooltip .=" \r 异常状态修正:{$inf_def_per}%";
if($fireseed_bonus > 0) $tooltip .=" \r 种火增幅:{$fireseed_bonus}";
//if($club_def_per <> 100) $tooltip .=" \r 称号技能修正:{$club_def_per}%"; //if($club_def_per <> 100) $tooltip .=" \r 称号技能修正:{$club_def_per}%";
if(isset($sk_var)) $tooltip .=" \r 技能修正:".($sk_var-100)."%"; if(isset($sk_var)) $tooltip .=" \r 技能修正:".($sk_var-100)."%";
$tooltip .="\">".$total_def."</span>"; $tooltip .="\">".$total_def."</span>";
......
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