Re: [闲聊] tmi2-mudlib 的更改

楼主: laechan (挥泪斩马云)   2014-06-20 10:32:54
这里闲聊一下 makewiz 的 issue。
目前用以判断是不是为 adm 或 wiz 主要有两种:
1. wizardp(物件)
2. adminp("使用者id")
少了一种,就是以 使用者id 判断是否为 wizard 的做法。
我的想法是,adm 的资格要透过修改系统档案的方式才能取得,但
是 wiz 的资格是可以软性处理的,以 tmi_v3 的做法是
/cmds/adm/_makewiz.c
// Activate wizard flag
link->set("wizard", 1);
player->set("PATH", NEW_WIZ_PATH);
player->enable_me() ;
player->save_data();
link->save_data();
> makewiz testing
You have promoted Testing to wizard level.
Path now set to:
/cmds/std:/cmds/object:/cmds/xtra:/cmds/file:/cmds/wiz:/cmds/adm
(嘛,红色的部份日后会改掉,不过其实我认为设定参数 PATH 比
使用 data 字段的 PATH 更好,这个日后也会尽可能改掉)
也就是说,这里其实就存在了 set("wizard", Lv几) 的运作空间
,也就是说,就算同样都是 wiz,也可以依 wizard 的数值差异来
判断它是 Lv 几的。
但总之,目前需要一个用 使用者ID 来判断是否为 wiz 的方法,
所以我打算使用 wiz_lv 这个 sanc 也有的函数,我的做法如下
/adm/simul_efun/adminp.c
==========================================================
int wiz_lv(string str)
{
int lv;
str=lower_case(str);
// 通过上面的 adminp 判断的一定是 wiz
// 将来这里就是 return 看 adm 是归类在第几级
if(adminp(str)) return 1;
str="/data/std/connection/"+str[0..0]+"/"+str+".o";
if(!str=read_file(str)) return 0;
lv=strsrch(str,"wizard ");
// 没有 wizard 参数
if(lv<1) return 0;
// 读取 "wizard " 后面接的那个数字
sscanf(str[lv+7..lv+7],"%d",lv);
return lv;
}
==========================================================
然后修改 /adm/daemons/logind.c 里面我原先用来判断 ppl 区
与 wiz 区的段落,将 adminp 改成 wiz_lv 判断:
if(mud_name()!="TMI-2 Win32" && wiz_lv(str)<1)
{
write("\n\n\n【"+mud_name()+" 只允许\ wiz 进入。】\n\n\n");
ob->remove_user();
return ;
}
实际“启动 wiz”区测试
【TMI-2 Wiz 采用了 TMI-2 1.4alpha mudlib 并运行于 FluffOS v2.16-ds05w】
请输入您的角色帐号或是您欲注册的新帐号: laechan
请输入您的登入密码: <= 可进到输入密码画面
【TMI-2 Wiz 采用了 TMI-2 1.4alpha mudlib 并运行于 FluffOS v2.16-ds05w】
请输入您的角色帐号或是您欲注册的新帐号: testing
【TMI-2 Wiz 只允许 wiz 进入。】 <= 非 wiz 就会看到这个并断线
这样就能修改 makewiz,将 link->set("wizard",1); 改成 set n,
makewiz xxx 改成 makewiz xxx n,并对每一位被 makewiz 的 wiz 做
资料存盘,再撰写 wizlist 指令,就能读取各 wiz 的等级资料。
但是不这样做也是可以的,也就是说你可以让整个 mud 只有三种身份
1.一般玩家
2.wiz (透过 makewiz 并注意 PATH 的给予)
3.adm (唯有透过修改系统档案才行, 管理者才办得到)
因为 tmi2_v3_改 实际上并不需要 wizard 的存在,比方依照区域生产
组合的规划,一般玩家也能投稿区域,再由 adm 将其内容写进 mud 内
再动几个指令、编一下 area_room.c,这样基本上区域就算完成了。
但考量到“若实际上还是希望有 wiz 参与的空间”的情况,tmi2_v3_改
还是会做相关的修改。
投稿的实际例子:
● 194 2/01 laechan □ [手稿]0.炙蚁地狱(redant)-区域背景介绍
195 2/01 laechan □ [手稿]1.炙蚁地狱(redant)-area.h
196 2/01 laechan □ [手稿]2.炙蚁地狱(redant)-longX.h
197 2/01 laechan □ [手稿]3.炙热地狱(redant)-script_area
198 2/01 laechan □ [手稿]4.炙蚁地狱(redant)-script_mob
199 2/01 laechan □ [手稿]5.炙蚁地穴(redant)-map
(tmi2_v3_改 更简化,将 area.h 与 longX.h 整合到 area_room.h)
so,我不会花太多时间在 wizard 的相关配置上,我只新增 wiz_lv 这
个可将 使用者id 做为判断 wiz 依据的函数于 adminp 里头。
这边顺便说明一下为什么需要有 wiz 区,我一般会建议使用者如果要
架站,就同时启动这两区,它的最大好处,就是 ppl 区因故当掉时,
wiz 区有时还会存活。
这时候,如果 ppl 区在当掉之后无法顺利重启,那比起瞎子摸象般地
“去看启动讯息抓 bug”,至少 wiz 区你还能下指令做一些 update
、grep、mv 等动作,尤其是当你明确记得你刚刚是做了什么更动并且
update 后才导致当掉的情况,则因为 wiz 区你尚未对档案 update,
就至少还能运作,你就能做最起码的测试。
又或者当你不确定更动某个档案后 update 是否会造成问题时,你也
可以先在 wiz 区 update 看看,确定没问题,ppl 区再 update。
wiz 区还有一个好处,就是提供一个比较安静的 coding 环境,有事
的时候再透过 tmi2 频道或其它偷吃步的做法互通两边的频道即可。
(这样就可以完全不甩 I3 及相关 intermud 的做法)
LAechan

Links booklink

Contact Us: admin [ a t ] ucptt.com