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
f0820cec
Commit
f0820cec
authored
Jun 12, 2025
by
Nemo Ma
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Bugfix: $fireseed_follow_bonus_rate not passing
parent
9101f97f
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
321 additions
and
9 deletions
+321
-9
doc/etc/20241218_debug_fireseed_bonus.txt
doc/etc/20241218_debug_fireseed_bonus.txt
+87
-0
doc/etc/20241218_fix_fireseed_bonus_bug.txt
doc/etc/20241218_fix_fireseed_bonus_bug.txt
+111
-0
doc/etc/20241218_fix_fireseed_config_scope.txt
doc/etc/20241218_fix_fireseed_config_scope.txt
+82
-0
include/game/club22.func.php
include/game/club22.func.php
+35
-7
include/game/revattr.func.php
include/game/revattr.func.php
+6
-2
No files found.
doc/etc/20241218_debug_fireseed_bonus.txt
0 → 100644
View file @
f0820cec
调试时间: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'");
```
这个修复确保了种火数据在收纳后能正确保存到数据库,页面刷新后不会丢失。
调试代码已移除,因为问题已经解决。
doc/etc/20241218_fix_fireseed_bonus_bug.txt
0 → 100644
View file @
f0820cec
修复时间: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. 现在加成基于包含装备效果的基础攻击力和防御力,而不是原始属性值
doc/etc/20241218_fix_fireseed_config_scope.txt
0 → 100644
View file @
f0820cec
修复时间: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. 如果问题仍然存在,可能需要进一步检查配置文件的包含路径或其他作用域问题
include/game/club22.func.php
View file @
f0820cec
...
...
@@ -86,8 +86,12 @@ function FireseedRecruit($npc) {
// 更新NPC的clbpara - 使用JSON格式存储
$npc_clbpara
=
$npc
[
'clbpara'
];
$encoded_clbpara
=
json_encode
(
$npc_clbpara
,
JSON_UNESCAPED_UNICODE
);
$db
->
query
(
"UPDATE
{
$tablepre
}
players SET clbpara='
$encoded_clbpara
' WHERE pid='
{
$npc
[
'pid'
]
}
'"
);
$encoded_npc_clbpara
=
json_encode
(
$npc_clbpara
,
JSON_UNESCAPED_UNICODE
);
$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>"
;
addnews
(
$now
,
'fireseed_recruit'
,
$name
,
$npc
[
'name'
]);
...
...
@@ -524,10 +528,17 @@ function FireseedFollow($target_pls) {
* 根据所有跟随种火的数量与强化层数,为玩家加成攻击防御
* 注意:只有与玩家在同一位置的跟随种火才会提供加成
*
* @param int $base_att 基础攻击力(可选,如果不提供则使用玩家基础属性)
* @param int $base_def 基础防御力(可选,如果不提供则使用玩家基础属性)
* @return array 返回加成的攻击和防御值
*/
function
FireseedBuffBonus
()
{
global
$fireseed_follow_bonus_rate
;
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%
}
if
(
!
isset
(
$data
))
{
global
$pdata
;
...
...
@@ -543,19 +554,36 @@ function FireseedBuffBonus() {
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 表示作战姿态(跟随)
if
((
isset
(
$fs_data
[
'pose'
])
&&
$fs_data
[
'pose'
]
==
1
&&
$fs_data
[
'pls'
]
==
$pls
)
||
(
$fs_data
[
'mode'
]
==
0
&&
$fs_data
[
'pls'
]
==
$pls
))
{
// 加成 = 数量(1) × 强化层数 × 1%
$bonus_percent
=
1
*
$fs_data
[
'level'
]
*
$fireseed_follow_bonus_rate
;
$att_bonus
+=
ceil
(
$att
*
$bonus_percent
/
100
);
$def_bonus
+=
ceil
(
$def
*
$bonus_percent
/
100
);
$att_bonus
+=
ceil
(
$base_att
*
$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
);
}
...
...
include/game/revattr.func.php
View file @
f0820cec
...
...
@@ -866,7 +866,8 @@ namespace revattr
if
(
$pa
[
'club'
]
==
22
&&
!
empty
(
$pa
[
'clbpara'
][
'fireseed'
]))
{
include_once
GAME_ROOT
.
'./include/game/club22.func.php'
;
$fireseed_buff
=
FireseedBuffBonus
();
// 传递当前计算出的基础攻击力(包含武器加成)
$fireseed_buff
=
FireseedBuffBonus
(
$base_att
,
null
);
$fireseed_bonus
=
$fireseed_buff
[
'att'
];
if
(
!
$tooltip
&&
$fireseed_bonus
>
0
)
$log
.=
"<span class='yellow'>
{
$pa
[
'nm'
]
}
的种火增幅了
{
$fireseed_bonus
}
点攻击力!</span><br>"
;
}
...
...
@@ -878,6 +879,7 @@ namespace revattr
if
(
$tooltip
)
{
$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($club_atk_per <> 100) $tooltip .=" \r 称号技能修正:{$club_atk_per}%";
$tooltip
.=
"
\"
>"
.
$base_att
.
"</span>"
;
...
...
@@ -998,7 +1000,8 @@ namespace revattr
if
(
$pd
[
'club'
]
==
22
&&
!
empty
(
$pd
[
'clbpara'
][
'fireseed'
]))
{
include_once
GAME_ROOT
.
'./include/game/club22.func.php'
;
$fireseed_buff
=
FireseedBuffBonus
();
// 传递当前计算出的基础防御力(包含装备加成)
$fireseed_buff
=
FireseedBuffBonus
(
null
,
$total_def
);
$fireseed_bonus
=
$fireseed_buff
[
'def'
];
if
(
!
$tooltip
&&
$fireseed_bonus
>
0
)
$log
.=
"<span class='yellow'>
{
$pd
[
'nm'
]
}
的种火增幅了
{
$fireseed_bonus
}
点防御力!</span><br>"
;
}
...
...
@@ -1012,6 +1015,7 @@ namespace revattr
{
$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
(
$fireseed_bonus
>
0
)
$tooltip
.=
"
\r
种火增幅:
{
$fireseed_bonus
}
"
;
//if($club_def_per <> 100) $tooltip .=" \r 称号技能修正:{$club_def_per}%";
if
(
isset
(
$sk_var
))
$tooltip
.=
"
\r
技能修正:"
.
(
$sk_var
-
100
)
.
"%"
;
$tooltip
.=
"
\"
>"
.
$total_def
.
"</span>"
;
...
...
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