fix(drop): 修正打怪掉落间距过大、掉落物与背包丢弃物元数据不一致、背包丢弃物品重叠三大问题 #479
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述
打怪掉落的物品图标间隔太大,和原版不符合
COLLISION_GetFreeCoordinatesImpl@0x6FD9D140/D2GAME_DropItem@0x6FC45670) 中,地面掉落物按 子格 (sub-tile,16×8px) 菱形晶格就近散落。GameEngine.triggerMonsterDrop和net-scene.ts将怪物死亡坐标通过worldToCell转为 宏格子 (80×40px = 5×5 子格) 并调用findSafeDropPosition,每次步进整整一个80×40地板宏格,导致掉落物间距比原版放大了 5 倍。打怪掉落物品和从身上扔下来的物品逻辑不一致(比如名字一个是纯英文一个是中英)
createDroppedItem生成的原始Item只有纯英文name、无nameZh,且符文的quality为数值ItemQuality.NORMAL (2)。itemToUiInventoryItem转换后包含中英双语nameZh(如"轻度治疗药剂 (Light Healing Potion)")以及字符串品质(如符文为rune)。resolveGroundItemMetadata直接回退到item.nameZh ?? item.name,导致怪物掉落显示纯英文、符文显示白字,而从身上扔下显示中英双语、符文显示橙字。身上扔下来的不同物品图标不应该叠在一起(比如血瓶)
act-scene.ts的onDropItemToGround调用findSafeDropPosition时未传入第 5 个参数occupied(当前地面物品列表),永远返回玩家脚下 Ring 0 坐标,随后将固定的playerCell.x, playerCell.y显式传给engine.dropItem。engine.dropItem中const cx = cellX ?? dropPos.cellX被传入的playerCell覆盖,导致已散落物品记录的cellX/cellY始终停留在玩家原点,后续扔出的第 2~N 个血瓶/物品全部叠在同一个 Ring 1 坐标上。修复方案
GameEngine.triggerMonsterDrop、GameEngine.dropItem、GameEngine.dropGold及net-scene.ts使用findIsometricDropPosition(16×8px 子格菱形晶格散落 +COLLIDE_MASK_SPAWN/COLLIDE_MASK_SPAWN_LOS碰撞与视线校验)。resolveGroundItemMetadata中统一双语名称构建逻辑 (formatBilingualGroundItemName) 与符文品质识别 (isRuneCode->rune),保证怪物掉落与玩家丢弃的地面物品名称、品质颜色、音效与贴图元数据完全一致。act-scene.ts中多余的无占用预寻点与cellX/cellY覆盖,使玩家连续丢弃物品时按16×8子格螺旋散开,绝不重叠。