为支持半即时制服务器代码需做的改动 bool game::is_legal_command(...)
改为
bool game::process_turn(...)
改为
bool game::end_turn()
改为
![]() 修改原因 bool game::is_legal_command(...) 该函数用于判断客户端发来的是否是合法命令。合法指的是在当前玩家下、其它玩家可产生的命令。对于这些命令,直观可知道是他人发给当前玩家的聊天记录,也就是当中的“speak”。修改目的是要把新增的prefix_unit视为合法命令,只要下一轮到行动单位的玩家和之前不属同一个,那么此个命令就不会是当前玩家产生的。 注释掉“if (!command.one_child()) return false”,“prefix_unit”有可能是多个child。在command认为,random块也是一个和prefix_unit同级的的块。prefix_unit极可能会产生多个random。 修改2则是把prefix_unit增加到合法命令集。 bool game::process_turn(...) 回合制时,结束每个势力时都会发送“end_turn”,由于势力肯定按固定顺序操作,服务器就可根据收到的“end_turn”以及当前关卡的势力数判断出回合是否结束了(turn_ended)、接下是轮到哪势力(end_turn_)。 改为半即时制后,“prefix_unit”中的side字段指示接下轮到哪势力。“new_turn”指示接下轮到行动的单位是否是新回合的第一单位,要注意的是回合1时new_turn字段值是0。 end_turn_仍旧需沿袭韦诺设置,值不是回合数,而是考虑了当前势力、由它可计算出回合数的值。
bool game::end_turn() 在韦诺的回合制下,空势力是不会发“end_turn”的,因而计算end_turn_要继续跳。 改为半即时制后,当前轮到势力已被单位乱序,判断下一是空势力反而会使得“end_turn_”出现误错误。 |
该BUG不会造成程序非法退出,但由于数据不能即时发送,会造成玩家不得不耗时间在等。这个BUG只是延时,倒是不会漏发。 举个例子。要支持存档上继续对战,此种情况要开始游戏时,创建者短时间内要把BINARY_HEROS、BINARY_HEROS_START、BINARY_REPLAY、BINARY_SIDE这几个二进制数据包发送去客户端(这些包都没有应答),但由于BUG影响,等待玩家不能即时收到这些包,致使只能在大厅不断等待游戏开始。 如何解决BUG 方法一:修改代码 找到收发数据线程函数:static int process_queue(void* shard_num)
方法二:启动服务器(wesnothd)时,让至少线程数等于至多线程数,而且都不为0 像以下这个命令行。
BUG存在的一个客观原因是系统中并发存在多个收发线程(process_queue)。让看以下这个执行逻辑(假设至少线程数[min_threads]设的是2)。
虽然王国战争程序和对战服务器程序在收发网络数据使用的是同一个线程函数(process_queue),但王国战争程序不存在这BUG,只有对战服务器才存在。因为王国战争程序至少、至多线程数设的都是1。 |
|
配置文件 配置文件来自命令行参数“-c”指定的参数,当没有“-c”时使用空配置。如何使用“-c”分种两种情况。
mysql模块 玩家账号在韦诺官方论坛有注册时,韦诺对战服器有有可能去自动连接这个论坛、从而强制要求输入密码才能进入对战。 在程序中,称和这个自动连接相关叫mysql模块。对战服务器要调用mysql需同时满足以下三个条件。
希望不调用mysql,又不想改源代码,1)不要在配置文件中出现[user_handler]块;2)不得不出现[user_handler]时,当中的“user_handler”不要等于“forum”,也不要置空。 |
A:kingdomd需要多少个端口,TCP还是UDP,默认端口号多少? Q:kingdomd只需要一个端口,类型TCP。默认端口号是15000,可用命令行kingdomd -p <port>修改端口号。 A:运行kingdomd第二个实例,会不会在系统中存在两个kingdomd? Q:不会。kingdomd要绑定到指定端口,这个端口和第一个是一样的,致使绑定失败,kingdomd会报“Could not bind to port”失败而退出。 A:kingdomd会开多少个线程来处理客户端I/O请求? Q:min_threads=5,max_threads=0。关于min_threads/max_threads见4楼的“至少、至多收发线程数”。 |