一.多人联机模式网络拓扑图
<1.局域网网络拓扑图:
<2.互联网网络拓扑图:
二.多人联机模式打开方式
#module.ini配置文件新增配置has_multiplayer = 1
has_single_player = 1
三.服务端创建(引擎内部有CDKey校验,故必须拥有CDKey才可联机)
<1.专用服务器和普通服务器:
专用服务器:mb_warband_dedicated.exe,引擎将通信能力剥离成为独立程序,是一个只有控制台的后台服务器,不会初始化player,不会进入游戏场景.
普通服务器:mb_warband.exe,通过多人联机模式->创建新游戏,会在服务端初始化player_no
#判断当前服务器类型
multiplayer_is_server = 417 # (multiplayer_is_server),multiplayer_is_dedicated_server = 418 # (multiplayer_is_dedicated_server),
<2.互联网专用服务器搭建(dedicated server):
霸王•吕布 / mb_warband_dedicated_1174 · GitCodehttps://gitcode.net/qq_35829452/mb_warband_dedicated_1174
运行mb_warband_dedicated.exe [-r commands_file] [-m module_name] 配置服务器参数.
#启动服务命令
mb_warband_dedicated.exe [-r commands_file] [-m module_name].#设置scene
set_map multi_scene_1#设置mission_template
set_mission multiplayer_duel
<3.局域网服务器搭建(server) 用户->创建游戏
引擎内置presentation页面: prsnt_game_multiplayer_admin_panel
# 服务器参数配置(客户端无效)server_set_password = 484 # (server_set_password, <string_id>),server_get_add_to_game_servers_list = 485 # (server_get_add_to_game_servers_list, <destination>),server_set_add_to_game_servers_list = 486 # (server_set_add_to_game_servers_list, <value>),server_set_name = 489 # (server_set_name, <string_id>),server_get_max_num_players = 490 # (server_get_max_num_players, <destination>),server_set_max_num_players = 491 # (server_set_max_num_players, <value>),save_ban_info_of_player = 467 # (save_ban_info_of_player, <player_id>),ban_player_using_saved_ban_info = 468 # (ban_player_using_saved_ban_info),# 联机模式下mission_template新增回调#多人模式下玩家退出
ti_on_player_exit = -29.0
# Trigger Param 1: player_id#多人模式下玩家加入
ti_server_player_joined = -15.0
# Trigger Param 1: player_id#多人模式人物关闭
ti_on_multiplayer_mission_end = -16.0
四.客户端搜索并加入
多人联机模式->搜索->加入游戏
<1.本体中mb_warband.exe为1.174版本且已激活.
<2.本体启动MOD与服务端MOD必须相同.
<3.服务器搜索:
局域网:局域网广播
互联网:互联网访问服务器中心已经注册的服务器列表:
<4.选择联机游戏场景进入:
1.客户端发出请求包:询问任务,任务场景
2.服务端接收请求包,回复任务,任务场景
3.客户端收包解析获得对应任务,对应任务场景
发包
multiplayer_send_int_to_server = 389 # (multiplayer_send_int_to_server, <message_type>, <value>),收包
#script_game_receive_network_message
# This script is called from the game engine when a new network message is received.
# INPUT: arg1 = player_no, arg2 = event_type, arg3 = value, arg4 = value_2, arg5 = value_3, arg6 = value_4
("game_receive_network_message", [#打开业务场景
start_multiplayer_mission = 470 # (start_multiplayer_mission, <mission_template_id>, <scene_id>, <started_manually>),
五.同步机制
<1.player_agent同步机制:引擎内部进行实时同步
<2.scene_prop/item/金币等同步机制:通过MOD实现收发包实现.
发包:
multiplayer_send_message_to_server = 388 # (multiplayer_send_message_to_server, <message_type>),multiplayer_send_int_to_server = 389 # (multiplayer_send_int_to_server, <message_type>, <value>),multiplayer_send_2_int_to_server = 390 # (multiplayer_send_2_int_to_server, <message_type>, <value>, <value>),multiplayer_send_3_int_to_server = 391 # (multiplayer_send_3_int_to_server, <message_type>, <value>, <value>, <value>),multiplayer_send_4_int_to_server = 392 # (multiplayer_send_4_int_to_server, <message_type>, <value>, <value>, <value>, <value>),multiplayer_send_string_to_server = 393 # (multiplayer_send_string_to_server, <message_type>, <string_id>),
收包:
#script_game_receive_network_message# This script is called from the game engine when a new network message is received.# INPUT: arg1 = player_no, arg2 = event_type, arg3 = value, arg4 = value_2, arg5 = value_3, arg6 = value_4"game_receive_network_message"
六.数据持久化
存储用户金币,等级,装备,坐标等信息,服务端通过访问固定URL存储数据至数据库,可实现大地图联机等相关功能
send_message_to_url = 380 # (send_message_to_url, <string_id>, <encode_url>),#script_game_receive_url_response
#response format should be like this:
#[a number or a string]|[another number or a string]|[yet another number or a string] ...
#here is an example response:
#12|Player|100|another string|142|323542|34454|yet another string
#INPUT: arg1 = num_integers, arg2 = num_strings
#reg0, reg1, reg2, ... up to 128 registers contain the integer values
#s0, s1, s2, ... up to 128 strings contain the string values
("game_receive_url_response",