Implement 40250 classic client port
This commit is contained in:
@@ -19,11 +19,14 @@ class FakeClient extends Node:
|
||||
signal vitals_changed(vid: int)
|
||||
signal entity_dead(vid: int)
|
||||
signal damage(vid: int, amount: int, flag: int)
|
||||
signal motion(vid: int, victim_vid: int, motion: int)
|
||||
signal pvp_changed(src_vid: int, dst_vid: int, mode: int)
|
||||
signal duel_changed(duel: Dictionary)
|
||||
var ents := {}
|
||||
func get_entity(vid: int) -> Dictionary: return ents.get(vid, {})
|
||||
func get_entities() -> Array: return ents.values()
|
||||
func get_pvp_relations() -> Array: return []
|
||||
func get_duel() -> Dictionary: return {}
|
||||
func spawn(vid, nm, pos, is_main := false):
|
||||
ents[vid] = {"vid": vid, "name": nm, "pos": pos, "is_main": is_main,
|
||||
"func": 0, "moving": false, "angle_deg": 0.0,
|
||||
@@ -70,18 +73,32 @@ func _test_m2client_surface() -> void:
|
||||
return
|
||||
var c: Object = ClassDB.instantiate("M2Client")
|
||||
get_root().add_child(c)
|
||||
for m in ["move", "character_position", "sync_positions", "request_warp", "fishing", "request_dungeon", "attack", "set_target", "say", "shoot", "add_fly_targeting", "change_name", "download_guild_symbol", "get_guild_symbol", "script_select_item", "quest_cancel", "party_use_skill", "get_skill_group", "get_entity", "get_entities",
|
||||
"get_main_vid", "get_points", "get_target", "select_character", "reconnect",
|
||||
"suspend", "resume", "move_item", "use_item", "drop_item", "pickup_item",
|
||||
"get_inventory", "get_equipment", "get_item", "get_ground_items", "get_pvp_relations", "get_lover", "get_land_areas", "get_observers", "whisper"]:
|
||||
for m in ["move", "character_position", "sync_positions", "request_warp", "fishing", "request_dungeon", "attack", "set_target", "say", "shoot", "add_fly_targeting", "change_name", "select_empire", "download_guild_symbol", "get_guild_symbol", "script_select_item", "quest_cancel", "party_use_skill", "get_skill_group", "get_entity", "get_entities",
|
||||
"get_main_vid", "get_main_pid", "get_points", "get_target", "select_character", "reconnect",
|
||||
"suspend", "resume", "move_item", "use_item", "drop_item", "drop_item_count", "use_item_to_item", "give_item", "pickup_item",
|
||||
"get_inventory", "get_equipment", "get_belt_inventory", "get_view_equipment", "get_item", "get_ground_items", "get_pvp_relations", "get_duel", "get_lover", "get_land_areas", "get_observers", "is_observer_mode", "get_observer_count", "has_mobile_flag", "combo_skill_enabled", "get_stamina_state", "whisper",
|
||||
"party_invite", "party_answer", "party_leave", "party_set_distribute", "party_set_state", "get_party", "get_party_distribute_mode",
|
||||
"add_friend", "remove_friend", "friend_answer", "get_friends",
|
||||
"shop_buy", "shop_sell", "shop_close", "is_shop_open", "get_shop_items", "get_shop",
|
||||
"exchange_start", "exchange_add_item", "exchange_add_gold", "exchange_accept", "exchange_cancel", "get_exchange",
|
||||
"safebox_checkin", "safebox_checkout", "safebox_move", "is_safebox_open", "get_safebox_size", "get_safebox_gold", "get_safebox_items",
|
||||
"is_mall_open", "get_mall_size", "get_mall_items", "mall_checkout", "mall_password", "open_private_shop", "close_private_shop", "safebox_password",
|
||||
"get_cube", "cube_make", "cube_request_result_list", "cube_request_materials", "cube_open", "cube_close", "cube_list", "cube_add_item", "cube_delete_item",
|
||||
"get_guild", "get_guild_members", "get_guild_grades", "guild_add_member", "guild_remove_member", "guild_offer", "guild_charge_gsp", "guild_change_grade_name", "guild_change_grade_authority", "guild_change_member_grade", "guild_change_member_general", "guild_post_comment", "guild_delete_comment", "guild_refresh_comments", "guild_answer_invite", "guild_answer_make", "get_guild_comments", "get_guild_skill", "get_guild_wars", "get_guild_war", "get_guild_name", "use_guild_skill", "declare_guild_war",
|
||||
"download_guild_marks", "are_guild_marks_ready", "get_mark_server", "get_guild_mark", "get_guild_mark_image", "upload_guild_mark", "upload_guild_symbol",
|
||||
"refine", "ds_refine", "get_dragon_souls", "get_channel", "get_server_time", "get_npc_marks", "get_world_markers"]:
|
||||
_ck(c.has_method(m), "M2Client.%s bound" % m)
|
||||
for s in ["entity_spawned", "entity_despawned", "entity_moved", "entity_main_set",
|
||||
for s in ["entity_spawned", "entity_despawned", "entity_moved", "entity_main_set", "empire_changed",
|
||||
"chat", "suspended", "resumed", "vitals_changed", "entity_dead", "damage",
|
||||
"motion", "points_changed", "target_info", "inventory_changed",
|
||||
"ground_item_added", "ground_item_removed", "item_picked_up", "item_used", "whisper_received",
|
||||
"entity_info", "warp", "time_changed", "channel_changed", "npc_marks_changed",
|
||||
"land_areas_changed", "observer_event", "world_markers_changed", "mount_changed", "pvp_changed", "duel_started", "view_equipment", "lover_changed",
|
||||
"fly_targeting", "dig_motion", "fishing_event", "dungeon_event", "skill_group_changed", "guild_make_requested", "guild_symbol_ready"]:
|
||||
"land_areas_changed", "observer_event", "observer_mode_changed", "observer_count_changed", "stone_detected", "stamina_changed", "mobile_flag_changed", "mobile_auth_required", "combo_changed", "world_markers_changed", "mount_changed", "pvp_changed", "duel_changed", "duel_started", "view_equipment", "lover_changed",
|
||||
"fly_targeting", "dig_motion", "fishing_event", "dungeon_event", "skill_group_changed", "guild_make_requested", "guild_symbol_ready",
|
||||
"party_changed", "party_invite_ask", "party_request_denied", "friends_changed", "friend_invite_ask", "shop_opened", "shop_closed", "shop_error",
|
||||
"exchange_changed", "safebox_changed", "safebox_password_required", "safebox_wrong_password", "mall_opened", "mall_changed", "mall_password_required", "private_shop_open_requested", "my_shop_price_list", "block_mode_changed", "gift_available", "cube_opened", "cube_closed", "cube_changed", "cube_result",
|
||||
"guild_changed", "guild_skill_changed", "guild_war_changed", "guild_comments_changed", "guild_invite_ask", "guild_war_event", "guild_war_point",
|
||||
"guild_marks_ready", "guild_mark_uploaded", "guild_mark_updated", "refine_ask", "refine_result", "ds_window_open", "ds_refine_result"]:
|
||||
_ck(c.has_signal(s), "M2Client.%s signal" % s)
|
||||
# not in game -> intents refused, snapshot empty
|
||||
_ck(c.call("move", 1, 0, 90.0, 1000, 2000) == false, "move refused pre-game")
|
||||
@@ -162,6 +179,11 @@ func _test_netbridge() -> void:
|
||||
await process_frame
|
||||
_ck(not nw.node_for(2000).has_meta("fishing_item_vnum"),
|
||||
"fishing fish outcome is not treated as entity motion")
|
||||
fc.motion.emit(2000, 1000, 325) # CRaceMotionData::NAME_DANCE_1
|
||||
await process_frame
|
||||
_ck(int(nw.node_for(2000).get_meta("last_motion", 0)) == 325
|
||||
and int(nw.node_for(2000).get_meta("motion_victim_vid", 0)) == 1000,
|
||||
"GC_MOTION -> entity motion metadata and bridge signal")
|
||||
|
||||
# GC_CHAR_ADD_INFO late name -> 3D label refreshes (name_resolver optional)
|
||||
var mob0: Node3D = nw.node_for(2000)
|
||||
@@ -172,6 +194,15 @@ func _test_netbridge() -> void:
|
||||
await process_frame
|
||||
_ck((mob0.get_node("Label3D") as Label3D).text == "Angry Mob",
|
||||
"entity_info -> label refreshed via name_resolver")
|
||||
fc.ents[2000]["shop_sign"] = "Potion shop"
|
||||
fc.entity_info.emit(2000, fc.ents[2000])
|
||||
await process_frame
|
||||
var shop_sign := mob0.get_node_or_null("ShopSign") as Label3D
|
||||
_ck(shop_sign != null and shop_sign.text == "Potion shop", "entity_info -> shop sign label")
|
||||
fc.ents[2000]["shop_sign"] = ""
|
||||
fc.entity_info.emit(2000, fc.ents[2000])
|
||||
await process_frame
|
||||
_ck(mob0.get_node_or_null("ShopSign") == null, "empty shop sign removes label")
|
||||
fc.pvp_changed.emit(1000, 2000, 2)
|
||||
await process_frame
|
||||
var pvp_tag := mob0.get_node_or_null("PvpTag") as Label3D
|
||||
@@ -179,6 +210,13 @@ func _test_netbridge() -> void:
|
||||
fc.pvp_changed.emit(1000, 2000, 0)
|
||||
await process_frame
|
||||
_ck(mob0.get_node_or_null("PvpTag") == null, "pvp none -> removes world tag")
|
||||
fc.duel_changed.emit({"active": true, "cannot_attack": false, "opponents": [2000]})
|
||||
await process_frame
|
||||
var duel_tag := mob0.get_node_or_null("PvpTag") as Label3D
|
||||
_ck(duel_tag != null and duel_tag.text == "决斗", "duel opponent -> world duel tag")
|
||||
fc.duel_changed.emit({"active": false, "cannot_attack": true, "opponents": []})
|
||||
await process_frame
|
||||
_ck(mob0.get_node_or_null("PvpTag") == null, "duel cleared -> removes world tag")
|
||||
|
||||
fc.move_to(2000, Vector3(10, 0, 40))
|
||||
for i in 3: await process_frame
|
||||
|
||||
Reference in New Issue
Block a user