mud吧 关注:20,934贴子:98,866
  • 13回复贴,共1

请教个mud中被基本忽略的team组队跟随的问题

只看楼主收藏回复

一般的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指令也行,我不知道代码改怎么写……


IP属地:上海1楼2014-09-16 21:22回复
    又测试了nt2,发现居然能组队跟随了……可能是我当时测试时交叉team with导致的不能跟随吧。正在研究怎么把这个跟随功能移植到大唐上……


    IP属地:上海2楼2014-09-16 22:00
    收起回复
      2025-06-13 01:35:19
      广告
      首先你要仔细看代码,要通读要多读更要多写,这是学习lpc或者其他任何编程语言最快的方法。
      不同lib中的定义和函数很可能不能通用(当然同源的可能会可以)。
      话说在你的这个例子中,没有一个特定的必须使用的条件书写方式,要看你的目标lib的这部分函数是如何写的。
      ob==leader单纯来看是没问题的,只要代码中正确定义了leader变量,用来判断没问题;
      ob->is_leader()或者is_team_leader()之类的也是没问题的,只要你在ob变量所指向的物件(例子中是一个人物,即玩家或npc)本身或者所继承(inherit)的物件(当然继承可能很深)中正确定义了is_leader()或者is_team_leader()函数。
      建议仔细读代码,不必着急,不必从其他lib中copy,看懂了代码,想要扩展或修正都是很容易的。


      IP属地:黑龙江4楼2014-09-17 08:01
      收起回复
        建议, 底层的东西, 先别急着混在一个mud里面.
        看不懂的, 现在一个mud code里面搜用法.
        推荐 终极地狱hell的 代码师范阅读
        东西不杂, 代码优美, 规范.


        IP属地:河北5楼2014-09-17 09:10
        收起回复
          水个
          ——现在谁能够在你心里面
                      你就多对谁好一点
           


          IP属地:湖南来自Android客户端6楼2014-09-20 10:43
          回复
            虽然是借别人的光混的精华,但也要对得起这点“青米”啊,补上我的解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});基本就正常了……


            IP属地:上海7楼2014-09-28 19:07
            回复