Implement 40250 classic client port

This commit is contained in:
shenlei
2026-09-01 18:49:28 +09:00
parent 2277b1dd60
commit 8f61990a83
481 changed files with 169826 additions and 293 deletions
+22 -1
View File
@@ -17,17 +17,19 @@ class FakeClient extends Node:
signal vitals_changed(vid: int)
signal points_changed(points: Dictionary)
signal target_info(vid: int, hp_percent: int)
signal observer_mode_changed(enabled: bool)
signal chat(type: int, vid: int, text: String)
var ents := {}
var main := 0
var in_game := true
var calls := {"move": [], "attack": [], "set_target": []}
var calls := {"move": [], "attack": [], "set_target": [], "click_npc": []}
func is_in_game() -> bool: return in_game
func get_main_vid() -> int: return main
func get_entity(vid: int) -> Dictionary: return ents.get(vid, {})
func move(f, a, rot, x, y) -> bool: calls.move.append([f, a, rot, x, y]); return true
func attack(motion, vid) -> bool: calls.attack.append([motion, vid]); return true
func set_target(vid) -> bool: calls.set_target.append(vid); return true
func click_npc(vid) -> bool: calls.click_npc.append(vid); return true
class FakePC extends Node:
signal target_selected(node: Node3D)
@@ -119,6 +121,15 @@ func _run() -> void:
pc.target_selected.emit(mob)
_ck(fc.calls.set_target.size() == 1 and fc.calls.set_target[0] == 2000, "set_target(2000)")
# NPC/传送点/石头走 click_npc,而不是被误当成攻击目标;这是 Cube
# 窗口由服务端 cube_open 命令打开前的入口。
var npc := Node3D.new()
npc.set_meta("vid", 3000)
root.add_child(npc)
fc.ents[3000] = {"vid": 3000, "ch_type": 1, "name": "Cube NPC", "pos": npc.position}
pc.target_selected.emit(npc)
_ck(fc.calls.click_npc == [3000], "NPC selection -> click_npc(3000)")
# 5) 攻击距离内 -> 按 attack_period 自动 attack
for i in 4: await process_frame
_ck(fc.calls.attack.size() >= 1, "auto-attack fired, got %d" % fc.calls.attack.size())
@@ -150,3 +161,13 @@ func _run() -> void:
fc.ents[2000]["dead"] = true
fc.entity_dead.emit(2000)
_ck(hud.cleared >= 1, "target cleared on death")
# 10) 观战模式锁住本地移动/选目标,并清掉当前目标
fc.ents[2000]["dead"] = false
fc.observer_mode_changed.emit(true)
pc.player.position = Vector3(8, 0, -5)
pc.moved.emit(pc.player.position)
pc.target_selected.emit(mob)
_ck(fc.calls.move.size() == 2 and fc.calls.set_target.size() == 1,
"observer mode blocks local movement and targeting")
fc.observer_mode_changed.emit(false)