這裡閒聊一下 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