常言笑的家

          Spring, Hibernate, Struts, Ajax, RoR

          [MUD]Mudlib詳解/Mudos運(yùn)行流程/最小Mudlib

          mud服務(wù)器目錄下的文件夾的作用?

          現(xiàn)在大部分中文MUD都是在東方故事(esII)基礎(chǔ)上發(fā)展起來(lái)的,其目錄結(jié)構(gòu)基本一樣,
          也有個(gè)別MUD為了標(biāo)新立異對(duì)個(gè)別目錄換了個(gè)名字以示不同,但其實(shí)質(zhì)沒(méi)有什么變化。
          這個(gè)做的最可惡的是xkx,把一個(gè)好好的daemon目錄換成了一個(gè)不土不洋的kungfu,
          里邊卻還是skill,condition這些洋名,簡(jiǎn)直讓人faint!我實(shí)在看不出這種修改有什么好處,
          除了添麻煩(xkx對(duì)一些命令的漢化,什么cha,du...也是如此)。不過(guò),
          也有一些是為了系統(tǒng)更合理而修改的。
          對(duì)MUDLIB目錄的解釋已經(jīng)有許多版本了,基本也沒(méi)什么區(qū)別,下邊是我的解釋?zhuān)?
          以我自己整理的一份MUDLIB為基礎(chǔ),如果有目錄不同的地方適當(dāng)貫通就是了。

          /adm 這里是最基本,最底層的程序,是整個(gè)MUD的控制樞紐。
          這個(gè)目錄只有admin權(quán)限可以修改。
          /adm/daemons 守護(hù)程序目錄。守護(hù)程序是指游戲中頻繁調(diào)用的控制類(lèi)程序,
          MUD里各種基本功能都是由這些程序控制的。這些程序一般在游戲一啟動(dòng)就自動(dòng)載入內(nèi)存。
          按照unix下文件命名習(xí)慣,這里的程序多以d.c結(jié)尾,
          比如combatd.c就是控制戰(zhàn)斗的程序。另外由于這些程序調(diào)用非常頻繁,
          一般都做了宏定義(查看/include/globals.h),例如/adm/daemons/combatd.c
          定義為COMBAT_D,在其它程序里可以適用這些宏定義代替這些文件名。
          /adm/etc 系統(tǒng)配置目錄,此目錄定義為CONFIG_DIR 這里放的是游戲的系統(tǒng)文檔文件,
          比如游戲的歡迎畫(huà)面,巫師列表,BAN掉的IP記錄等。
          /adm/obj 這里只有兩個(gè)文件,但卻是整個(gè)MUD最重要的東西。
          master.c:這是MudOS主控物件,也就是整個(gè)MUD的總司令。
          simul_efun.c:防真函數(shù)加載精靈,這是MUD啟動(dòng)時(shí)第一個(gè)要載入的東西。
          所謂efun,是指系統(tǒng)函數(shù),也就是mudos中定義的函數(shù)。
          這些函數(shù)不必做任何說(shuō)明可以在MUD的任何程序里直接調(diào)用,
          而且由于他們是預(yù)先定義的,也就是mudos早已經(jīng)知道他們是做什么的,
          所以比其它在MUDLIB里定義的函數(shù)執(zhí)行效率要高。但他們的缺點(diǎn)是修改非常不方便,
          對(duì)任何一個(gè)efun函數(shù)的修改必須重新編譯mudos才能生效。因此,
          在MUDLIB中又有了防真函數(shù)的定義,也就是simul_efun,
          這些函數(shù)的作用跟efun完全一樣,不同的是他們定義在UDLIB中,可以隨時(shí)修改,
          但必須重新啟動(dòng)游戲才能生效。
          順便講一下一個(gè)MUD啟動(dòng)的過(guò)程,MUD啟動(dòng)的初始化過(guò)程分以下幾步:
          1.載入防真函數(shù)simul_efun
          2.載入主控物件master,這里是調(diào)用master的create()函數(shù)將其載入內(nèi)存。
          3.載入需要預(yù)先載入的守護(hù)程序,這里調(diào)用master的preload()函數(shù),
          需要預(yù)先載入的文件定義在/adm/etc/preload里。
          4.MUD進(jìn)入多用戶(hù)狀態(tài),允許玩家登錄。
          以上過(guò)程必須正確無(wú)誤的執(zhí)行完,否則游戲無(wú)法正確啟動(dòng)。
          master.c和simul_efun.c這兩個(gè)文件只能在游戲啟動(dòng)時(shí)由mudos自動(dòng)載入,
          不可以在游戲中用update的方法載入,而且這兩個(gè)物件也不
          允許非ROOT權(quán)限的物件摧毀(destruct)它,因?yàn)樗麄兊拇輾Ь偷扔谟螒蜿P(guān)閉 。
          /adm/simul_efun 防真函數(shù)目錄,這里放的是定義各類(lèi)防真函數(shù)的文件,
          這些文件由SIMUL_EFUN_OB(也就是/adm/obj/simul_efun)來(lái)載入內(nèi)存。

          /cmds 游戲命令目錄,這里放的是游戲中可以使用的各種命令,
          只有admin才可以修改這個(gè)目錄
          /cmds/adm 只有天神(admin)可以使用的命令
          /cmds/arch 只有大巫師(arch)以上才可以使用的命令
          /cmds/wiz 只有巫師(wizard)以上才可以使用的命令
          /cmds/app 只有巫師學(xué)徒(wizard)以上才可以使用的命令
          /cmds/imm 只有榮譽(yù)玩家(immortal)以上才可以使用的命令
          /cmds/usr 只有普通玩家(player)以上才可以使用的命令
          /cmds/std 所有生物(npc and player)都可以使用的命令命令目錄采用子集格式,
          權(quán)限高的命令完全包含權(quán)限低的命令,比如天神可以使用所有游戲命令,
          普通玩家只能使用/cmds/usr和/cmds/std目錄下的命令。

          /data 游戲數(shù)據(jù)目錄,只有arch以上權(quán)限才可以修改這個(gè)目錄
          /data/board 各個(gè)留言板的數(shù)據(jù)
          /data/login 玩家登錄數(shù)據(jù)
          /data/user 玩家檔案,呵呵,這里記錄的是每個(gè)玩家的所有勞動(dòng)成果
          /data/npc 一些特殊npc的數(shù)據(jù),比如商店老板
          /data/daemon 重要的系統(tǒng)數(shù)據(jù),比如emote詞,英漢翻譯詞典
          /data/mail 玩家信件

          /feature 標(biāo)準(zhǔn)繼承函數(shù)。只有admin才可以對(duì)這個(gè)目錄進(jìn)行修改這些函數(shù)是非常重要的,
          是MUD里各種物件,包括玩家,NPC,物品,房間等的各種功能的標(biāo)準(zhǔn)定義,
          這些函數(shù)反映了整個(gè)MUD的與眾不同之處,一個(gè)好的MUDLIB必然要對(duì)這些函數(shù)進(jìn)行優(yōu)化。
          而要設(shè)計(jì)新的程序,必須對(duì)這個(gè)目錄所有文件有所了解。

          /obj 系統(tǒng)物件,這是經(jīng)常在MUD里被調(diào)用的各種物件。
          這個(gè)目錄下的物件被復(fù)制后跟調(diào)用他的物件具有相同的euid,
          也就是說(shuō)具有相同的權(quán)限,所以,這里的一個(gè)npc如果經(jīng)admin編譯后復(fù)制出來(lái),
          也具有了admin權(quán)限。這點(diǎn)非常重要,有些物件必須具有跟玩家相同的euid才能正常使用
          ,比如符紙。而出于安全考慮,這個(gè)目錄下的物件不可以隨便復(fù)制。
          只有arch以上才可以修改此目錄。
          /obj/board 游戲中各個(gè)留言板
          /obj/npc 一些特殊的NPC
          /obj/sheet 各種符紙
          /obj/weapons 兵器
          /obj/misc 其它亂七八糟的東西,比如信箱等

          /quest 游戲里各種任務(wù)quest的文件,此目錄需要wizard以上權(quán)限才可以修改

          /binaries 文件編譯過(guò)程生成的二進(jìn)制文件,此目錄ROOT權(quán)限才可以修改

          /d 區(qū)域目錄,游戲的地圖門(mén)派和NPC存放的地方。此目錄wizard以上權(quán)限可以修改。
          這里是整個(gè)MUDLIB最簡(jiǎn)單最常用的東西,也是玩家可以直接接觸到的東西。
          玩家所呆的任何一個(gè)房間都應(yīng)該對(duì)應(yīng)這個(gè)目錄下的一個(gè)文件,
          房間里每個(gè)NPC也都對(duì)應(yīng)一個(gè)文件。這個(gè)目錄下存在許多子目錄,
          分別對(duì)應(yīng)游戲的不同區(qū)域(domain)。
          /d/domain/npc 該區(qū)域中的npc
          /d/domain/npc/obj 該區(qū)域中npc身上的物品
          /d/domain/obj 該區(qū)域中的物品

          /data_bak 檔案?jìng)浞菽夸洠4嫘枰獋浞莸闹匾獢?shù)據(jù)。admin可以修改

          /include 頭文件目錄,只有admin可以修改。這里放的是游戲中各個(gè)文件所需要的頭文件,
          其中以下幾個(gè)特別重要:
          globals.h:全局定義的頭文件,這是一個(gè)特殊的頭文件,
          他不需要在任何一個(gè)文件里被調(diào)用,但是這里定義的所有變量可以在任何一個(gè)文件里直接使用。
          這里一般用來(lái)定義非常重要的或者許多地方需要調(diào)用
          的變量。對(duì)這個(gè)文件的修改必須重新啟動(dòng)游戲才可以生效。command.h:
          這里定義的是各個(gè)權(quán)限等級(jí)所能夠使用的命令目錄,所以,除了admin,
          應(yīng)該絕對(duì)禁止任何人修改此文件。
          /include/race 種族的頭文件
          /include/net 網(wǎng)絡(luò)功能的頭文件

          /open 系統(tǒng)臨時(shí)目錄,ftp登陸目錄,任何人都具有寫(xiě)權(quán)限。

          /questobj FY3的task專(zhuān)門(mén)目錄,存放各個(gè)task物品文件。wizard以上權(quán)限可以修改。

          /u 巫師工作目錄,存放各個(gè)巫師開(kāi)發(fā)過(guò)程的半成品。
          這里的子目錄名只能為各個(gè)巫師的euid,
          而只有對(duì)應(yīng)euid的人才有對(duì)相應(yīng)目錄的修改權(quán)限。比如一個(gè)目錄是lion,
          那么只有l(wèi)ion這個(gè)ID或者比lion權(quán)限高的人
          才可以修改它下邊的內(nèi)容。

          /clone 物品目錄,存放游戲中需要經(jīng)常復(fù)制的各種物品,wizard以上權(quán)限可以寫(xiě)。
          這個(gè)目錄下的物品一般被其他地方復(fù)制(clone)出來(lái),但他們的euid是固定的,
          不會(huì)隨調(diào)用它的物件的不同而改變,這就是這個(gè)目錄和/obj目錄的最大不同。
          此目錄arch以上等級(jí)可以修改
          /clone/armor 裝備
          /clone/drug 藥品
          /clone/fruit 水果,水果跟食物的不同是吃了可以同時(shí)加食物和飲水,
          而且有些水果具有養(yǎng)顏美容之功效。
          /clone/liquid 容器,象酒袋茶壺一類(lèi)
          /clone/money 顧名思義,人見(jiàn)人愛(ài)的東西
          /clone/user 玩家物件,包括login.c(link_ob)和user.c(body),
          此目錄只有admin可以修改
          /clone/books 各種秘籍
          /clone/food 吃的
          /clone/gift 各種禮物,一般是好東東
          /clone/weapon 兵器
          /clone/misc 其他雜物,比如尸體,頭顱。

          /daemon 呵呵,這個(gè)目錄為什么叫這個(gè)名字我一直沒(méi)明白,看下邊的說(shuō)明吧。
          此目錄只有arch以上可以修改。
          /daemon/skill 游戲中所有的技能
          /daemon/condition 人物各種狀態(tài),比如中毒,恢復(fù)等。
          /daemon/class 這個(gè)應(yīng)該理解為“組織”或“工會(huì)”,是ESII從外國(guó)MUD里保留下來(lái)的東西,
          不過(guò)隨著中文MUD的發(fā)展,工會(huì)的概念逐漸被淡化,其含義已經(jīng)跟以前完全不同,
          現(xiàn)在他的意思有點(diǎn)象“身份”,比如道士,和尚,喇嘛,官兵,老百姓。。。。
          個(gè)人有個(gè)人的身份。很多情況下,這個(gè)跟門(mén)派類(lèi)似,但又不完全相同。
          這里存放的是各種不同身份的人所具有的特殊東西,
          不過(guò)現(xiàn)在一般用來(lái)存放各種特殊技能的特殊用法(perform)

          /doc 文檔。 游戲中的各種文本文件,arch以上可以修改
          /doc/help 各種幫助文件
          /doc/efuns 各種系統(tǒng)函數(shù)的用法
          /doc/story 各種背景故事

          /log 系統(tǒng)日記,記錄游戲過(guò)程各種重要事件,是巫師處理糾紛和剔除bug的主要依據(jù)來(lái)源。
          一個(gè)好的巫師應(yīng)該養(yǎng)成經(jīng)常看系統(tǒng)日記的習(xí)慣。本目錄只有ROOT權(quán)限可以修改。

          /p 玩家目錄,這個(gè)目錄下內(nèi)容玩家具有寫(xiě)的權(quán)限。主要存放需要玩家修改的內(nèi)容,
          比如玩家房間,自創(chuàng)武功等。

          /std 標(biāo)準(zhǔn)對(duì)象目錄,游戲中各種標(biāo)準(zhǔn)物件,
          只有admin可以修改游戲里其他物件都需要繼承這里的相應(yīng)文件。
          /std/armor 裝備物品的標(biāo)準(zhǔn)繼承,比如衣服,盔甲等
          /std/board 留言板
          /std/char 生物的標(biāo)準(zhǔn)繼承,MUD里的生物包含兩種:玩家(player)和非玩家(
          npc)他們都需要繼承/std/char/char.c這個(gè)對(duì)象,
          他們與其他物件的區(qū)別是具有心跳(heartbeat)。
          /std/drug 藥品的標(biāo)準(zhǔn)繼承,其實(shí)這個(gè)現(xiàn)在一般不用了,這部分功能都放到了
          /feature的相應(yīng)文件里,保留這個(gè)是為了跟舊的系統(tǒng)兼容。
          /std/item 物品的標(biāo)準(zhǔn)繼承
          /std/room 房間的標(biāo)準(zhǔn)繼承
          有人曾問(wèn)房間和物品到底有什么區(qū)別?說(shuō)實(shí)話(huà),這個(gè)問(wèn)題還真不好說(shuō),
          這兩個(gè)物件基本結(jié)構(gòu)差不多,也沒(méi)有什么可以區(qū)分的特征。
          現(xiàn)在的常用判斷方法是房間是沒(méi)有環(huán)境(environment)的,但也不是所有物品
          (包括生物)都有環(huán)境,所以,呵呵,這個(gè)問(wèn)題還有待MUD程序的進(jìn)一步完善,
          現(xiàn)在基本上無(wú)法判斷。
          /std/skill 技能的標(biāo)準(zhǔn)繼承
          /std/weapon 武器的標(biāo)準(zhǔn)繼承
          /std/misc 其他物件,比如錢(qián),符紙。
          值得注意的是,/std這個(gè)目錄跟一般MUDLIB的結(jié)構(gòu)不太一樣,
          一般MUDLIB并沒(méi)有如此歸類(lèi)存放,大家可以根據(jù)自己的認(rèn)識(shí)加以判斷。

          以上是根據(jù)我的理解對(duì)各個(gè)目錄的解釋?zhuān)幢厥菣?quán)威的說(shuō)法,
          只是為了讓大家有所認(rèn)識(shí),如果有什么錯(cuò)誤請(qǐng)指正。
          作為剛?cè)腴T(mén)的新巫師,準(zhǔn)確理解各個(gè)目錄的作用是非常重要的,
          必須知道哪個(gè)目錄下的東西是做什么的,哪個(gè)目錄你可以去改,哪個(gè)目錄你不能動(dòng)。
          一般來(lái)說(shuō),要成為一個(gè)合格的巫師,至少要花半月時(shí)間來(lái)“讀”程序,
          了解整個(gè)MUDLIB的結(jié)構(gòu),了解各個(gè)文件的作用
          (未必要完全看懂,但至少應(yīng)該知道他是干什么的),
          這樣不至于再以后的程序開(kāi)放過(guò)程中不知道什么功能該如何實(shí)現(xiàn),從而走許多彎路。
          當(dāng)你了解了整個(gè)MUDLIB后就可以試著自己寫(xiě)程序了,
          一般你只能在自己的工作目錄里寫(xiě)東西。剛開(kāi)始不妨試著寫(xiě)一個(gè)簡(jiǎn)單的房間,
          然后試著寫(xiě)一個(gè)簡(jiǎn)單的npc,然后試著把這個(gè)npc放到這個(gè)房間里。。。。。。
          這樣逐漸提高,你很快就成為一個(gè)合格的巫師了。
          參考資料:烈火西游 http://218.200.132.6:6666/list.asp?id=248

          --------------------------------------------

          mudos運(yùn)行流程

          今天我看了站上的一些文章,加上查看原程序,把mudos啟動(dòng)后,程序運(yùn)行的流程搞清楚了。小弟覺(jué)得只要有一個(gè)好的mudos,就可寫(xiě)出新的mudlib 框架。我拿用戶(hù)連接來(lái)解釋程序的運(yùn)行流程。

          在config.xxx文件中指出了master和global兩個(gè)文件,這是十分重要的文件。
          mudos啟動(dòng)后會(huì)加載上述兩個(gè)文件(其它文件也有,但上述文件為主要 )
          進(jìn)入內(nèi)存,mudos中定義了一些特殊的函數(shù),例如create()、init()等等,
          這些函數(shù)都是在特定事件中由mudos自動(dòng)調(diào)用的。
          當(dāng)用戶(hù)在port口請(qǐng)求連接的時(shí)候:
          ——mudos自動(dòng)調(diào)用master.c中的connect()函數(shù)
          ——然后connect()函數(shù)調(diào)用 LOGIN_OB這個(gè)物件,[而LOGIN_OB是個(gè)物件常量,在global.h中定義LOGIN_OB 的值是"/clone/user/login.c",也就是說(shuō)connect()調(diào)用了login.c這個(gè)物件]
          ——在login.c中有一些特殊函數(shù),如果按照用戶(hù)正確登陸的流程,mudos自動(dòng)調(diào)用login.c中l(wèi)ogon()這個(gè)特殊函數(shù)。
          ——在logon()中由調(diào)用LOGIN_D這一物件常量,LOGIN_D在global.h文件中所定義的值是"/adm/daemons/logind",
          ——于是 mudos又把logind.c調(diào)入內(nèi)存并運(yùn)行。

          我們一般認(rèn)為mudos在編譯前在它的設(shè)置文件中定義了用戶(hù)login的程序 路徑及文件名,
          編譯后路徑和文件名不可改,在用戶(hù)連入的時(shí)候,mudos根據(jù) 路徑自動(dòng)啟動(dòng)用戶(hù)登陸程序。
          其實(shí)非也,mudos只是一個(gè)對(duì)mud進(jìn)行低級(jí)支持 的程序。

          我們可以利用mudos,完全拋棄已有的mudlib框架,進(jìn)行新的創(chuàng)作。
          這樣 才能使中國(guó)的mud種類(lèi)走向多樣化。

          -------------------------------------------=

          最小Mudib有多大?

          這個(gè)最小的是說(shuō)能驅(qū)動(dòng)MUDOS,能成功Connected.
          現(xiàn)在以網(wǎng)上下載的單機(jī)專(zhuān)用MUDOS和其配制的config.cfg為標(biāo)準(zhǔn)說(shuō)明:
          先找一個(gè)單獨(dú)的MUDOS運(yùn)行,需要配置文件,加載config.cfg...運(yùn)行后提示:open log/debug.log file failed.OK,根椐配置我們建目錄:/log,再運(yùn)行,現(xiàn)在提示:The simul_efun file adm/obj/simul_efun.c was not loaded.OK,我們建目錄:/adm/obj,并在obj目錄中建一個(gè)空文件simul_efun.c,再運(yùn)行,現(xiàn)在是:adm/obj/simul_efun.c line 0: Cannot #i nclude globals.h
          adm/obj/simul_efun.c line 1: parse error
          No error handler for error: *Error in loading object '/adm/obj/simul_efun'
          program: (none), object: (none), ..file: (none)
          The simul_efun (/adm/obj/simul_efun) and master (/adm/obj/master) objects must be loadable.
          看來(lái)現(xiàn)要config.h文件,根椐配置文件,我們建一個(gè)目錄:/include,并在此目錄中加一個(gè)空文件globals.h,再運(yùn)行:The master file /adm/obj/master was not loaded.,現(xiàn)在我們?cè)趏bj目錄中建一個(gè)空文件master.運(yùn)行:No function get_root_uid() in master object; possibly the mudlib doesn't want PACKAGE_UIDS to be defined.看來(lái)空的master.c不行了,我們?cè)趍aster.c中加上如下語(yǔ)句:string get_root_uid() { return "Root"; }
          string get_bb_uid() { return "Backbone"; }
          string creator_file(string file) { return "Root"; },現(xiàn)在再運(yùn)行,OK,MUDOS成功跑起來(lái)了.

          但現(xiàn)在用zMUD連線(xiàn)connected后就lose了,怎么辦,現(xiàn)在在master.c中加一如下語(yǔ)句:object connect(int port)
          {
               object ob;

               ob = new(__DIR__"user.c");
               return ob;
          }.同時(shí)在master.c相同目錄中新建一個(gè)空文件user.c,現(xiàn)在運(yùn)行mudos,并連線(xiàn),成功...

                現(xiàn)在看看一共用了哪些文件和目錄?
          1. /log
          2. /adm/obj/simul_efun.c
          3. /include/globals.h
          4. /adm/obj/master.c
          5. /adm/obj/user.c

          其中只有master.c中有內(nèi)容,其它的都是空的,這5個(gè)加起來(lái)有多大?237字節(jié),怎么樣?

          posted on 2011-09-08 16:08 常言笑 閱讀(4665) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          My Links

          Blog Stats

          常用鏈接

          留言簿(5)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          積分與排名

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 富锦市| 鸡泽县| 梓潼县| 乌恰县| 沙坪坝区| 哈尔滨市| 婺源县| 玛纳斯县| 内江市| 达拉特旗| 安顺市| 深泽县| 松原市| 临潭县| 泸溪县| 绥江县| 香河县| 昭苏县| 新化县| 磐安县| 七台河市| 大同县| 刚察县| 天峻县| 松原市| 牟定县| 古田县| 望城县| 汾阳市| 固阳县| 旺苍县| 屯留县| 资中县| 客服| 沅江市| 长治市| 仁化县| 蒙城县| 资兴市| 个旧市| 吴旗县|