文字MUD游戏论坛-天下泥潭群英会-水泊梁山  

返回   文字MUD游戏论坛-天下泥潭群英会-水泊梁山 > 西游之旅 > 『 巫师天下 』

『 巫师天下 』 学习如何挂MUD,如何制作MUD。讨论如何管理好一个MUD,做好一个巫师。

发表新主题 回复
 
LinkBack 主题工具 主题评分 显示模式
旧 2011-12-03   #1
高级会员
级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时级别:6 | 在线时长:109小时 | 升级还需:31小时
 
Odysseus 的头像
 
注册: 08年04月11日
来自: 盘丝洞
帖子: 311
声望力: 20
声望: 50 Odysseus 初领妙道
现金:29两梁山币
资产:1245两梁山币
致谢数: 0
获感谢文章数:0
获会员感谢数:0
server-side trigger

发信人: yeung (流星雨), 信区: Mud_Builder
标 题: server-side trigger
发信站: BBS 水木清华站 (Mon Jul 26 07:00:39 1999)


每当网络速度太慢而导致你的指令无法及时送出的时候,你一定会有
把机器砸掉的冲动,尤其是看到屏幕突然不动,等传过来的时候已经
在黄泉路上,实在是很不爽的一种事情.

基于这种考虑,我们提出server-side trigger的概念,即允许用户自
定义一些简单的trigger,在服务器对用户发出这些信息之前就有机会触发
这些trigger,执行一系列事先定义好的命令.

和server-side alias一起,client端可以变的更"瘦",最终能彻底淘汰
zmud是最好了,不过,相信80%的时候,zmud都是在用来快速走路和触发一些
简单的trigger,然后是timer.

这样一来,虽然比zmud还差些,不过也已经可以用个最破的telnet来舒服的玩
mud了,包括计划中的简单java-applet-client(当然是放在主页里面啦)

目前server-side trigger只支持子串匹配和正则表达式的匹配,还不能够
把匹配的变量取出来.

可以匹配带颜色的pattern

int help (object me)
{
write(@HELP
指令格式 : trigger <触发信息> <触发后欲执行之命令>

当你从系统接收到<触发信息>的时候,可以让系统自动执行一个
或者一系列预先定义好的指令(可以是你定义的alias).

例如:
'trigger 英俊男子身着布衣走了过来。 hi' 会在
出现“英俊男子身着布衣走了过来。”的时候自动执行一个 "hi" 的指令。
'trigger' 後不加参数则列出你所有的trigger。
'trigger sc' 会消除 sc 这个trigger。 (如果你设定过这个trigger的话)
'trigger on' 会打开trigger触发。
'trigger off'会关闭trigger的触发。
'trigger xxxx $gag' 会不显示所有包含xxxx的信息。比如敲这个指令
'trigger 流星雨 $gag',这样你就看不到他的一切话了。
'trigger OnDisconnect quit' 会在你断线的时候自动执行 'quit' 指令,
当然也可以是别的指令
HELP
);
return 1;
}


发信人: yeung (流星雨), 信区: Mud_Builder
标 题: 程序实现(1)
发信站: BBS 水木清华站 (Mon Jul 26 07:02:02 1999)


/cmds/usr/trigger.c

// trigger.c
#include

inherit F_CLEAN_UP;

int main(object me, string arg)
{
int i;
mapping trigger;
string verb, replace, *vrbs,cname;

if( !arg ) {
trigger = me->query_all_trigger();
if( !sizeof(trigger) ) {
write("你目前并没有设定任何 trigger。\n");
me->disable_trigger();
} else {
i = me->query_trigger_enabled();
me->disable_trigger();
write("你目前设定的 trigger 有:\n");
vrbs = keys(trigger);
for(i=0; i < sizeof(vrbs); i++)
printf("%-40s 将触发如下命令: %s\n", vrbs[i]+NOR, trigger[vrbs[i]]);
write("\n你的触发器目前是"+(i?"打开的":"关闭的")+"。\n");
if( i ) me->enable_trigger();
}
return 1;
}

if( arg=="on" )
{
me->enable_trigger();
write("打开trigger触发。\n");
return 1;
}
if( arg=="off" )
{
me->disable_trigger();
write("关闭trigger触发。\n");
return 1;
}
cname = arg;
cname = replace_string(cname, "$BLK$", BLK);
cname = replace_string(cname, "$RED$", RED);
cname = replace_string(cname, "$GRN$", GRN);
cname = replace_string(cname, "$YEL$", YEL);
cname = replace_string(cname, "$BLU$", BLU);
cname = replace_string(cname, "$MAG$", MAG);
cname = replace_string(cname, "$CYN$", CYN);
cname = replace_string(cname, "$WHT$", WHT);
cname = replace_string(cname, "$HIR$", HIR);
cname = replace_string(cname, "$HIG$", HIG);
cname = replace_string(cname, "$HIY$", HIY);
cname = replace_string(cname, "$HIB$", HIB);
cname = replace_string(cname, "$HIM$", HIM);
cname = replace_string(cname, "$HIC$", HIC);
cname = replace_string(cname, "$HIW$", HIW);
cname = replace_string(cname, "$NOR$", NOR);
arg = cname;

if( sscanf(arg, "%s %s", verb, replace)!=2 )
me->set_trigger(arg, 0);
else if( verb=="trigger" )
return notify_fail("你不能将 \"trigger\" 指令设定为 pattern 。\n");
else if( verb=="" )
return notify_fail("你要设什麽 trigger?\n");
else
{
return me->set_trigger(verb, replace);
}

write("Ok.\n");
return 1;
}

int help (object me)
{
write(@HELP
指令格式 : trigger <触发信息> <触发后欲执行之命令>

当你从系统接收到<触发信息>的时候,可以让系统自动执行一个
或者一系列预先定义好的指令(可以是你定义的alias).

例如:
'trigger 英俊男子身着布衣走了过来。 hi' 会在
出现“英俊男子身着布衣走了过来。”的时候自动执行一个 "hi" 的指令。
'trigger' 後不加参数则列出你所有的trigger。
'trigger sc' 会消除 sc 这个trigger。 (如果你设定过这个trigger的话)
'trigger on' 会打开trigger触发。
'trigger off'会关闭trigger的触发。
'trigger xxxx $gag' 会不显示所有包含xxxx的信息。比如敲这个指令
'trigger 流星雨 $gag',这样你就看不到他的一切话了。
'trigger OnDisconnect quit' 会在你断线的时候自动执行 'quit' 指令,
当然也可以是别的指令
HELP
);
return 1;
}

发信人: yeung (流星雨), 信区: Mud_Builder
标 题: 程序实现(2)
发信站: BBS 水木清华站 (Mon Jul 26 07:03:21 1999)


/feature/trigger.c

#define MAX_TRIGGERS 10

mapping trigger;
static int allow_trigger;

int set_trigger(string verb, string replace)
{
if( !replace ) {
if( mapp(trigger) ) map_delete(trigger, verb);
return 1;
} else {
if( !mapp(trigger) ) trigger = ([ verb:replace ]);
else if( sizeof(trigger) > MAX_TRIGGERS )
return notify_fail("您设定的 trigger 太多了,请先删掉一些不常用的。\n");
else trigger[verb] = replace;
return 1;
}
}

mapping query_all_trigger()
{
return trigger;
}

void disable_trigger()
{
allow_trigger = 0;
}

void enable_trigger()
{
allow_trigger = 1;
}

int query_trigger_enabled()
{
return allow_trigger;
}

int fire_trigger(string pattern)
{
string cmd,*patterns;
int i,s;
object me;

if( !allow_trigger ) return 0;
me = this_object();
if( me->query_temp("parseing") ) return 0;
if( !mapp(trigger) ) return 0;
pattern = replace_string(pattern,"> ","");

patterns = keys(trigger);
s = sizeof(patterns);
for(i=0;i < s;i++)
{

if( strsrch(pattern,patterns[i]) != -1 || regexp(pattern,patterns[i]) )
{
cmd = trigger[patterns[i]];
if( stringp(cmd) )
{
if( cmd == "$gag" ) return -999;
//防止有人用quit来避免死亡
me->check_status();
me->set_temp("parseing",1);
tell_object(me,"触发指令:"+cmd+"\n");
me->fcommand( me->process_input(cmd) );
me->delete_temp("parseing");
return 1;
}
}
}
return 0;

}

发信人: yeung (流星雨), 信区: Mud_Builder
标 题: 程序实现(3)
发信站: BBS 水木清华站 (Mon Jul 26 07:05:18 1999)


/include/globals.h的改动
加一个
#define F_TRIGGER "/feature/trigger"

/std/char.c的改动.
加一个
inherit F_TRIGGER;

/feature/message.c的改动

void receive_message(string msgclass, string msg)
{
string subclass, *ch;

if( !interactive(this_object()) ) {
this_object()->relay_message(msgclass, msg);
return;
}

if( sscanf(msgclass, "%s:%s", subclass, msgclass)==2 ) {
switch(subclass) {
case "channel":
if( !pointerp(ch = query("channels"))
|| member_array(msgclass, ch)==-1 )
return;
break;
case "outdoor":
if( !environment() || !environment()->query("outdoors") )
return;
break;
// default:
// error("Message: Invalid Subclass " + subclass + ".\n");
}
}

if( query_temp("block_msg/all") || query_temp("block_msg/" + msgclass) )
return;

if( stringp(msg) )
{
//支持server-side trigger
if( (this_object()->fire_trigger(msg)) == -999) return;
}

if( in_input(this_object()) || in_edit(this_object()) ) {
if( sizeof(msg_buffer) < MAX_MSG_BUFFER )
msg_buffer += ({ msg });
} else
receive( msg );
}

发信人: yeung (流星雨), 信区: Mud_Builder
标 题: 关于以上文档的声明
发信站: BBS 水木清华站 (Mon Jul 26 07:07:54 1999)


未经许可不得用于商业用途.
非盈利性组织可以基于GNU的精神随意修改及使用上述文档,但是请注明原作者.
作者:YEUNG
Odysseus 当前离线  
回复时引用此帖

发表新主题 回复

添加到书签


发帖规则
不可以发表主师
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子

论坛启用 vB 代码
论坛启用 表情图标
论坛启用 [IMG] 代码
论坛禁用 HTML 代码
Trackbacks are 启用
Pingbacks are 启用
Refbacks are 启用


相似的主题
主题 主题作者 论坛 回复 最后发表
用LPC做SERVER Odysseus 『 巫师天下 』 0 2011-12-03 22:49
杀小童trigger wilewoof 『 机器人制作及下载 』 1 2010-07-08 11:53
颜色触发trigger cool_levis 『 机器人制作及下载 』 9 2010-05-15 21:37
【总站】【机器】原创的trigger flycry 『 机器人制作及下载 』 6 2008-12-19 17:07
Server Error icuras 『 站务公告区 』 1 2003-05-13 07:36


所有时间均为格林尼治时间 +9, 现在的时间是 15:40.


Powered by SPLS
版权所有 2001-2023 水泊梁山
皖ICP备05012024号

站长 fengyue

Content Relevant URLs by vBSEO 3.6.1