请教个mud中被基本忽略的team组队跟随的问题
mud吧
全部回复
仅看楼主
level 8
xiuliinlove 楼主
一般的mud都会有team组队功能。而且我查看了几个mudlib的team文件源代码发现里面一般都定义了follow_path和follow_me,但是经我测试没发现可以真正做到跟随的(我测试过的lib有大唐双龙、海洋2、泥潭2)。请问怎么才能做到跟随?
附上team文件中和跟随有关的代码:
一、大唐、海洋类:
int follow_path(string dir)
{
this_object()->remove_all_enemy();
return GO_CMD->main(this_object(), dir);
}
int follow_me(object ob, string dir)
{
//if( !living(this_object()) || ob==this_object() ) return 0;
if( ob==leader )
||(query("pursuer") && this_object()->is_killing(ob->query("id")))) {
if( random(ob->query_skill("move")) > this_object()->query_skill("move") ) {
remove_call_out("follow_path");
call_out("follow_path", 1, dir);
return 1;
}
return follow_path(dir);
}
}
我把中间的都注释掉只保留if( ob==leader ) {return follow_path(dir;)}测试也没通过……
二、泥潭、中华、炎黄类:
int follow_path(string dir)
{
reset_eval_cost();
command("go " + dir);
}
int follow_me(object ob, string dir)
{
object me;
me = this_object();
if (! living(me) || ob == me) return 0;
if (ob == leader)
{
// 跟着别人走
if (ob->query("env/no_follow") &&
me->query_dex() / 2 + random(me->query_dex()) < ob->query_dex())
{
tell_object(me, ob->name() +
"走得好快,你一疏神就跟不上了。\n");
return 0;
}
return follow_path(dir);
} else
if (in_team() && ob == oteam->leader)
// 跟着队伍的领袖行走
return follow_path(dir);
else
if (in_array() && ob == zhen->master)
return follow_path(dir);
}
好不容易把大唐的组队显示异常的bug修复了,顺便修复了大唐teamkill指令无效的问题(都是同一个数组引用的问题,卡了我四五天- -),但是这个follow试了很多次感觉难度很大……
曾经以为是行走时输入的方向简写的问题,但经测试即使输入完整的west、east之类的队员也不跟随,甚至我带着go输入go east也不行。求高手帮忙解决组队跟随问题。
team follow设计初衷是要和follow独立,但是如果同向行走解决不了,退一步能强制给队友个follow leader指令也行,我不知道代码改怎么写……
2014年09月16日 13点09分 1
level 8
xiuliinlove 楼主
又测试了nt2,发现居然能组队跟随了……可能是我当时测试时交叉team with导致的不能跟随吧。正在研究怎么把这个跟随功能移植到大唐上……
2014年09月16日 14点09分 2
搞定。服了,->能写成==。这是给我猜中代码的机会么?- -
2014年09月16日 15点09分
回复 xiuliinlove :晕了,不对啊,怎么npc也跟着队长到处跑啊- -
2014年09月16日 15点09分
还是不行。把第一段代码的if( ob==leader(被我改得多了半个括号)改成if( ob->is_team_leader()能实现跟随行走了,但关键是npc和玩家都跟着走了。npc可以在follow_path里限制掉,但是玩家我限制不掉啊[汗]。现在不管玩家是不是在队伍里都跟着走……
2014年09月16日 16点09分
level 15
首先你要仔细看代码,要通读要多读更要多写,这是学习lpc或者其他任何编程语言最快的方法。
不同lib中的定义和函数很可能不能通用(当然同源的可能会可以)。
话说在你的这个例子中,没有一个特定的必须使用的条件书写方式,要看你的目标lib的这部分函数是如何写的。
ob==leader单纯来看是没问题的,只要代码中正确定义了leader变量,用来判断没问题;
ob->is_leader()或者is_team_leader()之类的也是没问题的,只要你在ob变量所指向的物件(例子中是一个人物,即玩家或npc)本身或者所继承(inherit)的物件(当然继承可能很深)中正确定义了is_leader()或者is_team_leader()函数。
建议仔细读代码,不必着急,不必从其他lib中copy,看懂了代码,想要扩展或修正都是很容易的。
2014年09月17日 00点09分 4
谢谢。代码方面我的水平连半瓶水都不到,但是看见lib里有bug或者我认为不合时宜的地方就忍不住要修正,也算是一种强迫症了。然后自己水平又渣,就只好连学带抄加猜想领悟一点一点弄。没想着会自己写mudlib,只求能把自己认为是bug或者不合理的部分改好就好。
2014年09月17日 03点09分
回复 xiuliinlove :有兴趣会学得很快,都是这么进步来的,加油[吐舌]
2014年09月17日 16点09分
level 13
建议, 底层的东西, 先别急着混在一个mud里面.
看不懂的, 现在一个mud code里面搜用法.
推荐 终极地狱hell的 代码师范阅读
东西不杂, 代码优美, 规范.
2014年09月17日 01点09分 5
谢谢。有时间我会看着学习一下。其实我只要能够修改lib的一部分就好。没想着能达到wiz的水平,有个单机lib能折腾得合心意了也就知足了。但有时有些想法但不会用代码表现出来确实也有点憋得慌。等修改完大唐我把想法整理一下发出来,估计能写出我在贴吧的第一个长篇帖子……
2014年09月17日 03点09分
level 13
水个
——现在谁能够在你心里面
            你就多对谁好一点
 
2014年09月20日 02点09分 6
level 8
xiuliinlove 楼主
虽然是借别人的光混的精华,但也要对得起这点“青米”啊,补上我的解i决方法和一点心得,但不保证正确性(虽然我测试通过了,但对代码不熟即使蒙对了也没什么底气……)。
我摸索修改过的dtsl的team能正常跟随的代码:
int follow_path(string dir)
{
//if (userp(this_object()))
//{
this_object()->remove_all_enemy();
return GO_CMD->main(this_object(), dir);
//}
}
int follow_me(object ob, string dir)
{
object me;
me = this_object();
if (! living(me) || ob == me) return 0;
if (ob == leader)
{
// 跟着别人走
if (ob->query("env/no_follow") &&
me->query_dex() / 2 + random(me->query_dex()) < ob->query_dex())
{
tell_object(me, ob->name() +
"走得好快,你一疏神就跟不上了。\n");
return 0;
}
return follow_path(dir);
} else
if (arrayp(team) && team[0] == ob)
// 跟着队伍的领袖行走
return follow_path(dir);
}
主要就是最后的if判断加了个team[0] == ob的判断,也许该写成ob==team[0]?我不知道这两种写法区别在哪里反正按照上面的代码自己测试了几种情况都表现正常。
至于team的其他毛病主要出在数组的赋值上:
(在前面先声明变量object *team;)
team=me->query_team();
team=team-({0});
for(i=1; i<sizeof(team); i++)
team[i]->delete_temp("team_mark");
刚开始主要是少写了一句 team=team-({0});结果team赋值不正常导致解散时队伍中其他成员的team_mark标记没有成功删除,就造成了队伍解散后预留N-1个独立的1人队伍的问题……teamkill指令里是同样的问题。
所以知道以后操作数组给数组赋值的话要照葫芦画瓢的添上一句“数据变量=数组变量-({0});基本就正常了……
2014年09月28日 11点09分 7
1