Open ShiraGawaAnri opened 2 years ago
Ubuntu 18.04.6 LTS 編譯報錯如下:
/home/ubuntu/Pandas/src/common/socket.cpp: In function ‘int WFIFOSET(int, size_t)’:
/home/ubuntu/Pandas/src/common/socket.cpp:858:62: error: ‘packet_trace_id’ was not declared in this scope
ShowDebug("S Trace:%d,cmd:%d,p:0x%04x,len:%d,time:%d.\n", packet_trace_id++, cmd, cmd, len, gettick());
^~~~~~~
src/common/CMakeFiles/common_base.dir/build.make:231: recipe for target 'src/common/CMakeFiles/common_base.dir/socket.cpp.o' failed
make[2]: [src/common/CMakeFiles/common_base.dir/socket.cpp.o] Error 1
CMakeFiles/Makefile2:1189: recipe for target 'src/common/CMakeFiles/common_base.dir/all' failed
make[1]: [src/common/CMakeFiles/common_base.dir/all] Error 2
Makefile:151: recipe for target 'all' failed
make: *** [all] Error 2
嘗試#undef Pandas_Fake_Id_Check_Debug、#undef Pandas_Print_Trace_Packet報錯如下:
[ 76%] Linking CXX executable ../../../login-server CMakeFiles/login-server.dir/loginchrif.cpp.o: 於函式 logchrif_parse_upd_global_accreg(int, int, char*): /home/ubuntu/Pandas/src/login/loginchrif.cpp:499: 未定義參考到 get_real_id(int, bool) CMakeFiles/login-server.dir/loginchrif.cpp.o: 於函式 logchrif_parse_req_global_accreg(int): /home/ubuntu/Pandas/src/login/loginchrif.cpp:609: 未定義參考到 get_cs_id(int) /home/ubuntu/Pandas/src/login/loginchrif.cpp:610: 未定義參考到 is_cross_server /home/ubuntu/Pandas/src/login/loginchrif.cpp:610: 未定義參考到 is_cross_server /home/ubuntu/Pandas/src/login/loginchrif.cpp:612: 未定義參考到 get_real_id(int, bool) /home/ubuntu/Pandas/src/login/loginchrif.cpp:613: 未定義參考到 get_real_id(int, bool) /home/ubuntu/Pandas/src/login/loginchrif.cpp:609: 未定義參考到 get_cs_id(int) /home/ubuntu/Pandas/src/login/loginchrif.cpp:610: 未定義參考到 is_cross_server /home/ubuntu/Pandas/src/login/loginchrif.cpp:610: 未定義參考到 is_cross_server /home/ubuntu/Pandas/src/login/loginchrif.cpp:612: 未定義參考到 get_real_id(int, bool) /home/ubuntu/Pandas/src/login/loginchrif.cpp:613: 未定義參考到 get_real_id(int, bool) collect2: error: ld returned 1 exit status src/login/CMakeFiles/login-server.dir/build.make:201: recipe for target '../login-server' failed make[2]: [../login-server] Error 1 CMakeFiles/Makefile2:1224: recipe for target 'src/login/CMakeFiles/login-server.dir/all' failed make[1]: [src/login/CMakeFiles/login-server.dir/all] Error 2 Makefile:151: recipe for target 'all' failed make: *** [all] Error 2
测试的版本:RE(复兴后)
多个服务器玩家的跨服功能
日本官方已有先例,但实现方式略有不同,而且按照官方的实现有庞大的工作量。 因此,试着实现一个真正意义的跨服交互。
Ra架构简析
首先简析Ra目前多Map的架构 Login - Char - Map1(prt_fild08以外的地图) - Map2(prt_fild08)的地图 当玩家尝试进入prt_fild08的地图时,会按照以下流程
基于此架构下的新增功能
当加载此跨服功能后,除保留以上原架构外,利用Map与Char之间已经构建好的特性,实现了一个Map链接多个Char, 即A服与B服通过中立服,制造出一个交汇点,使得两个或多个服的玩家可以在其中,通过中立服的Map运算,达到多源服务器数据交互这一跨服行为。
※A服玩家是不可能到B服的,同理B服玩家也是。
测试场景
名词指代: 跨服 - 一般指A服<->中立服,B服<->中立服的行为。 源服 - 指在进行跨服前,来自哪个服务器(A,B,中立都有可能)
准备工作
测试时、请使用3份同样的源码以及DB
运行测试
※注意: 单机测试时A服、B服、中立服的各3个端口5121,6121,6900都必须不同 ※注意: 更多可选的配置位于conf/battle/crossserver.conf中
预期结果: 玩家1(来源A服),玩家2(来源B服)于中立服中的prt_fild08见面,并且可以进行各种交互。
架构细节
※1 客户端获得AID的时机,是从输入账号校验登陆后获得。此时无法区分将要登陆的是A服还是中立服,因此无法把伪装后的AID发给客户端
※2 细节上的一个例子,涉及客户端动画效果播放。 假设存在玩家A,怪物B,玩家C,其中A与B发生交互,C在观察。 服务端传来这样一段伤害的封包: A对B进行攻击并造成了伤害
因为按照RA的架构下,跨服架构下的各方ID如下所示
因此,要对参与互动的玩家对象,都得额外补发一个真实ID的封包,才能正确显示。 以表格为例,需要对玩家A补发一个 AID:200 对 GID:1 进行攻击的 封包。
以此得知,玩家A,玩家C交互时,需要对双方补发一个双方真实ID的封包。 由此会带来少量的宽带占用问题,但现在的网络环境来说是完全可以接受的。
※3
原架构如下
跨服架构后
Guild Clan方面也是相应的改动
ToDo:
本功能已经可以正常测试使用