骑砍战团module system访问外部链接并获取信息

骑马与砍杀的module system脚本并不能算完善,在很多方面不方便使用。但是module system提供了一个强大的功能:访问外部链接并获取从这个链接返回的消息。骑砍有许多联机mod,例如永恒世界,都是使用此功能实现玩家数据的保存和复杂的银行、装备制作等功能。

本文主要以一个实现在线修改联机服务器内公告的系统介绍此功能的使用方法,包括访问链接和获取返回消息两个部分。

1.使用module system脚本访问链接

在header_operations.py中可以找到如下访问链接的操作:

str_encode_url                  = 2355 # (str_encode_url, <string_register>),

send_message_to_url = 380 # (send_message_to_url, <string_id>, <encode_url>), #result will be returned to script_game_receive_url_response
send_message_to_url_advanced  = 3019 
#(send_message_to_url_advanced, <url_string>, <user_agent_string>, [<success_callback_script_no>], [<failure_callback_script_no>], [<skip_parsing>], [<timeout>]),

send_message_to_url 函数:可以直接省略encode_url参数,访问链接。例如

(send_message_to_url, “@https://api.knightdusk.cn/warband/check_ban.php?uid={reg0}”),

注意到,和骑砍内其它字符串一样,使用{reg0}和{s0}等类似占位符来实现字符串格式化。直接使用HTTP GET的链接参数在此处是最为方便的。

        send_message_to_url_advanced高级链接访问操作,参数较多,如下:将user_agent_string发送至url_string处的链接。后面为成功(返回200),失败(返回404,403等错误码)时的回调脚本。skip_parsing表示跳过字符串解析,即不将返回数据解析为整数和字符串,而是得到原始字符串。返回数据的格式见后文。

        send_message_to_url中不能指定回调脚本,而是在访问成功后统一调用script_game_receive_url_response。因此,返回时需要添加一个标记用于区分不同的返回数据。

所有连接访问皆为异步操作,不需要过多担心脚本运行效率。

2.接收并处理返回数据

在module_scripts.py文件中可找到名为game_receive_url_response的脚本,将在send_message_to_url成功之后调用。

返回格式

数字或字符串|数字或字符串|数字或字符串…………

注意返回数据为单个字符串,切勿包含任何html标签。游戏将把返回数据由|分隔的数字和字符串分别储存于{regX}和{sX}中。

https://api.knightdusk.cn/warband/announcement.php

提供一个链接作为测试:此为联机服务器CN_Dusk使用的在线修改公告功能。数字1为固定值,方便程序认定此为公告消息。后面字符串是公告信息。为使用此功能,首先在module_mission_templates.py中添加一个定时执行的脚本,在其中访问此链接,再在game_receive_url_response添加如下代码:

(try_begin),
	(neq,":num_integers",0),
	(assign,":type",reg0),
	(try_begin),
		(eq,":type",1), #<-----type 1: Send a custom server announcement
		(try_for_players, ":player"), 
			(player_is_active,":player"),
            (multiplayer_send_string_to_player,":player",multiplayer_event_show_server_message,s0),  
		(try_end),
	(else_try),
		(eq,":type",2), #<-----type 1: Send server punishment ban info | content format --> 2|int unique_id|int is_player_banned|string info
		(try_for_players, ":player"), 
			(player_get_unique_id,":uid",":player"),
			(eq
        (try_end),
	(try_end),
(try_end),

即可将字符串显示到每个玩家的左下角。这样一来,不需要关闭服务器也可以通过修改网页使用的数据库内容来即时修改公告信息。

发表评论

电子邮件地址不会被公开。 必填项已用*标注