Hide near trees drawn as PC blockers when trees are switched off
A tree close to the camera is drawn by RenderPCBlocker, not RenderTree, so background.SetVisiblePart(PART_TREE, 0) left it on screen. Skip tree blockers while PART_TREE is hidden. Live screenshots on the 203 test core confirm the tree, the GM mark and the weapon glow now disappear. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
e546f91e03
commit
aeb67f3c9c
@@ -29,6 +29,7 @@
|
||||
- `CPythonSystem::Get/SetEffectLevel`,越界值按 0 处理;不写入 metin2.cfg。
|
||||
- `systemSetting.SetEffectLevel/GetEffectLevel`。
|
||||
- `CInstanceBase::__UpdateEffectShown`,每帧在 `Update` 开头按上表判断。
|
||||
- `CMapOutdoor::RenderPCBlocker`:离镜头近、挡住角色的树会作为遮挡物(PC blocker)单独绘制,不经过 `RenderTree`,所以原来关闭树木后这类树仍然显示。现在隐藏树木时跳过遮挡物中的树。AVA2 有同样的问题。
|
||||
- 模块 `mt_display`(`src/platform/ScriptLib/DisplayScript.inc`),在 `PythonBoot.cpp` 中安装:
|
||||
- 入口是小地图旁“拾取”下方的“显示”按钮。
|
||||
- 窗口“显示设置”包含 5 个特效等级、显示树木、显示云、总是显示名字、显示伤害数字,`【】` 表示当前选中。
|
||||
@@ -44,11 +45,12 @@
|
||||
- `test_pickup.py`(7 项)和 `test_switchbot.py`(6 项)仍然通过。
|
||||
- 2026-10-15 联机测试(203 测试核心 channel5,macOS 原生客户端,账号 admin):
|
||||
- 切到等级 4 并关闭树木后,配置为 `4 0 1`;恢复后为 `0 1 1`。
|
||||
- 截图确认窗口布局正常。等级 4 的截图里角色被窗口挡住,特效隐藏没有截图对比,只有日志确认等级已设置。
|
||||
- 截图确认窗口布局正常。
|
||||
- 用 `/goto 646 798` 走到离树约 7 米的位置截图对比:等级 4 时 GM 标志和武器光效消失;关闭树木后树消失(修复遮挡物问题之前,这棵树仍然显示);恢复后都回来。
|
||||
|
||||
## 限制和未完成
|
||||
|
||||
- 只控制挂载在角色上的特效(装备光效、buff、种族特效)。单独播放的特效和飞行特效(技能弹道、命中特效)不受影响。
|
||||
- macOS 桌面客户端没有中文字体,窗口文字显示为 `?`(原版界面同样乱码);Android 使用 CFF FreeType,不受影响。
|
||||
- 测试点附近没有树木,树木开关只通过日志和配置确认,没有截图对比。
|
||||
- 树的影子烘焙在地形阴影图里,关闭树木后地面上仍有树影(与 AVA2 相同)。
|
||||
- Android 真机测试未做。
|
||||
|
||||
@@ -640,7 +640,13 @@ void CMapOutdoor::RenderPCBlocker()
|
||||
STATEMANAGER.SaveTransform(D3DTS_TEXTURE1, &m_matBuildingTransparent);
|
||||
STATEMANAGER.SetTexture(1, m_BuildingTransparentImageInstance.GetTexturePointer()->GetD3DTexture());
|
||||
|
||||
std::for_each(m_PCBlockerVector.begin(), m_PCBlockerVector.end(), FRenderPCBlocker());
|
||||
// PORT: a tree near the camera is drawn here as a PC blocker, outside RenderTree, so hiding
|
||||
// PART_TREE (mt_display) left it on screen. Skip it the same way RenderTree does.
|
||||
const bool bTreeVisible = IsVisiblePart(PART_TREE);
|
||||
FRenderPCBlocker kRenderPCBlocker;
|
||||
for (CGraphicObjectInstance * pInstance : m_PCBlockerVector)
|
||||
if (bTreeVisible || TREE_OBJECT != pInstance->GetType())
|
||||
kRenderPCBlocker(pInstance);
|
||||
|
||||
STATEMANAGER.SetTexture(1, NULL);
|
||||
STATEMANAGER.RestoreTransform(D3DTS_TEXTURE1);
|
||||
|
||||
@@ -86,6 +86,9 @@ class DisplayTests(unittest.TestCase):
|
||||
self.assertIn('IsEnemy() || IsStone()',body);self.assertIn('IsPC()',body)
|
||||
system=(ROOT/'src/port/UserInterface/PythonSystem.h').read_text(encoding='latin1')
|
||||
self.assertIn('iLevel > 4',system)
|
||||
render=(ROOT/'src/port/GameLib/MapOutdoorRender.cpp').read_text(encoding='latin1')
|
||||
blocker=render.split('void CMapOutdoor::RenderPCBlocker()',1)[1].split('\n}\n',1)[0]
|
||||
self.assertIn('TREE_OBJECT != pInstance->GetType()',blocker) # near trees are drawn as PC blockers
|
||||
|
||||
|
||||
if __name__=='__main__':unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user