ftd
发表于 2013-7-31 23:28:10
好复杂,避免指令之间产生间隔其实可以用to alias
ftd
发表于 2013-7-31 23:34:14
每个心跳节点发生的事件:食物饮水的减少、精神气血的自然回复、busy和其它异常状态结束的判定、晕倒的判定
hijacker
发表于 2013-8-1 00:17:15
好复杂,避免指令之间产生间隔其实可以用to alias
ftd 发表于 2013-7-31 11:28 PM http://pkuxkx.com/forum/images/common/back.gif
是的,good ideattk_03
zues
发表于 2013-8-1 11:44:19
// 这是书剑打坐命令主函数的一部分:
msg = SKILL_D(force)->exercise_msg(me);
if (!msg || undefinedp(msg["start_my_msg"]))
write("你坐下来运气用功,一股内息开始在体内流动。\n");
else
write(msg["start_my_msg"]);
me->set_temp("pending/exercise", 1);
me->set_temp("exercise_cost", exercise_cost);
if (!msg || undefinedp(msg["start_other_msg"]))
tell_room(environment(me),
me->name() + "盘膝坐下,开始运功打坐。\n", ({ me }));
else
tell_room(environment(me),
msg["start_other_msg"], ({ me }));
me->start_busy((: exercising :), (:halt_exercise:)); //这里开始打坐过程,通过exercising的返回值来看是否继续start_busy.
//halt_exerciset, 是halt的时候调用的。
//下面是exercising函数:
int exercising(object me)
{
string force;
mapping msg;
int exercise_cost = (int)me->query_temp("exercise_cost"); //你dazuo花的气血;
int neili_gain = 1 + (int)me->query_skill("force") / 10 //本次打坐所能获得的内力,和北侠一样,是enable/10;
// int max = (me->query_skill("force") * me->query("con")*2/3) + (me->query_skill("beiming-shengong", 1)*20);
//if players wanna get max_neili after force*10, the only way is drugs, quests and age :)
// yes, add some max_neili each year they grow up :)
// yuj please fix it if i made any mistake :)
int max = me->query_skill("force")*8 + me->query("combat_exp")/1000;
if (neili_gain > exercise_cost) neili_gain = exercise_cost; //如果内力增加值>dazuo所花气血,内力增加值=dazuo所花气血
me->receive_damage("qi", neili_gain); //扣掉dazuo所花气血
me->add("neili", neili_gain); //内力增加
me->set_temp("exercise_cost", exercise_cost -= neili_gain); //重新计算dazuo所花气血,扣掉之前的内力增加值
force = me->query_skill_mapped("force");
if (force) msg = SKILL_D(force)->exercise_msg(me);
if (exercise_cost > 0) { //判断dazuo气血,大于0则继续busy
if (msg && !undefinedp(msg["exec_my_msg"]))
tell_object(me, msg["exec_my_msg"]);
if (!random(3) && msg && !undefinedp(msg["exec_other_msg"]))
tell_room(environment(me), msg["exec_other_msg"], ({me}));
return 1;
} //判断dazuo气血,不大于0则结束busy,结束dazuo
//下面是结束dazuo
me->delete_temp("pending/exercise");
if (!msg || undefinedp(msg["end_my_msg"]))
tell_object(me, "你运功完毕,站了起来。\n");
else
tell_object(me, msg["end_my_msg"]);
if (!msg || undefinedp(msg["end_other_msg"]))
tell_room(environment(me),
me->name()+"运功完毕,站了起来。\n", ({me}));
else
tell_room(environment(me),
msg["end_other_msg"], ({me}));
if (me->query("neili") < me->query("max_neili") * 2)
return 0;
if (me->query("max_neili") >= max){
tell_object(me, "你的内力修为已经无法靠打坐来提升了。\n");
me->set("neili", me->query("max_neili") * 2);
return 0;
}
me->set("neili", me->add("max_neili", 1));
tell_object(me, "你的内力修为增加了!\n");
return 0;
}
1)从上面我们可以看出,打坐内功有效等级/10的整数倍都很高效:1)有网络延迟时,dazuo多倍会好点,2)网络良好,还怕超过内力上限2倍多的浪费,dazuo一倍好。
因为dazuo的恢复时start_busy来控制的,而start_busy又调用set_heart_beat(),所以,假设系统的心率是齐的,楼主说的dazuo那部分应该有道理。
2)至于爬塔,我觉得主要有两个方面:你的网络延时和NPC的心跳。
见面就kill的NPC应该是在init()定义了auto_kill, 即见面就杀,但是perform通过一个叫chat()的函数控制,通过参数chat_combat_msg 100拉设置100%每个心跳发perform。
所以,你的网络延迟很高,肯定被先手,你的网络延迟够好的话,基本就是拼人品了。看你的perform命令是否先于npc的心跳。
3)关于指令堆积,应该和心跳没有关系。
系统判断你单位时间内输入的指令数量大于单位时间最大许可指令数量,给你警告,屏蔽指令而已。
erq
发表于 2013-8-1 11:48:09
回复 2# hijacker
按照LZ说的, 是不是应该这样:
这是 tt++ 脚本,
#alias {kill} {
#action {你运功完毕,深深吸了口气,站了起来。} {
#send kill %0;
perform sword.chan;
#delay {1} {
perform dodge.zong;
#ticker {chan} {perform sword.chan} {2};
};
#unaction {你运功完毕,深深吸了口气,站了起来。}
} {1};
yun powerup;
dazuo 10;
};
hijacker
发表于 2013-8-1 18:50:56
回复 24# yhzzyahoo
凡是我想到的网络因素,都写在文里了。。。那种好几百ms延迟的破网络,神仙也搞不定
hijacker
发表于 2013-8-1 18:58:46
回复 26# zues
公开揣测源代码太危险了{:8_312:}
when
发表于 2013-8-2 08:20:26
我来砸个场子,最讨厌一倍基数打坐刷屏了
不过要是综合了噩梦休息狂欢周和特技等特殊情况机器人要发我一份啊
niwawa
发表于 2014-3-1 16:57:52
新手认真学习前辈神贴。
lydao
发表于 2014-3-1 17:56:52
这么老的帖子啊