【轉】MUD教程--巫師入門教程4


我們再次復習一下clean_up()函數返回1的含義,如果clean_up()函數返回1,則MUDOS在這一次的調用時不會做其的任何舉動,但到了下一次想調用的時間里,還將再次調用這個對象的clean_up()函數。那么從這可以看出,有以下四種情況不會將其清除出內存:
一、非clone出來並且有no_clean_up參數的對象;
二、玩家永遠不會
三、處於一個還存在的環境里
四、自己里面存在着玩家
  也就是MUDOS定時摧毀內存不需要的對象是由外向內的,比如一個房間,系統只要檢查這個房間里沒有no_clean_up參數、里面沒有玩家就可清除它,而房間里的物品、NPC都會因環境的不存在而消失。這個清除的定時時間一般都為兩個小時。當然要視不同的MUDOS里的設置而看的。
  再說一點題外話,如果一個房間長時間沒有玩家走進來,當然會被MUDOS清出內存,而突然又有玩家進來呢?很簡單,它會在一瞬間被編譯進內存,進入一個已經存在在內存里的房間與進入一個剛剛編譯出來進入內存的房間對於我們的玩家來說,是察覺不出它們之間的差異的。 


一 CONDITION系統分析 


  condition是利用系統的心跳來解決關於在一個不算太長的時間里,定時觸發種現象的解決方法。在MUD中,為了解決定時觸發某種現象,一般有兩種方法,一種是通過call_out()延時呼叫,另一種就是通過心跳。在spock翻譯的LPC及教材中曾對這兩種方法進行了比較,好象是說:如果時間較長的話采用心跳比較好,時間短的話采用call_out()。緊接着又說了句,其個人看不出這兩者有什么必要的區別,反正稀里糊塗的。不過,在實際運用中,兩者都有不同的效果,大家看明白了本文之后,可以有自己的理解,並進行正確的選擇。
  call_out(other_fun,t)這個外部函數就是起一種延時呼叫的作用,后面必須要加第一個參數,指定延時呼叫的函數名,第二個參數表示延時幾秒,再之后加上的參數可以作為呼叫的那個函數的參數。象這一個也就是設定在t秒鍾后,呼叫other_fun這個事先指定的函數,你可以在這個函數里設定好應該進行的事情。比如,你在一個玩家進入監獄后,要做牢五分鍾,如果一定要用call_out()進行的話,你可以設定成:
call_out("out_jianyu",300,ob);
  意思就是在300秒后呼叫out_jianyu()這個函數,ob作為這個玩家的變量傳遞過去,然后在這個函數里進行將玩家從牢中放出來,告訴他做牢結束等等處理。但是,有的巫師看到這里,就會問了,如果五分鍾沒到,這個玩家退出游戲了怎么辦?對,如果這個玩家退出游戲,這個call_out()一到時間就會找不到這個操作對象,如果程序寫得不好就容易出錯,即使是不會出錯,那個玩家再次進入游戲后也就無法繼續剛才的延時過程,也就不能夠出牢。於是,對於要跨起離線前后的象做牢這類的事,大多都是采用condition。
  condition的處理方法,就是在開始的時候在玩家身上設定一定的點數的記號,這些記號會通過save()保存進玩家的檔案中。然后通過系統的心跳,每一次心跳就執行一次這個固定的condition的函數,函數每被執行一次就減一點記號,直至這個記號為0后,就可以觸發某種效果。比如做牢,就在進牢時設定一定點數,每一次心跳減一點,減為0時,將玩家放出。由於這個記號在玩家身上,因此,在玩家離線時不會發生到有關函數對這個玩家的操作。
  在ES系列MUD中。一個完整的condition系統包括三個部分: 
一、首先就是調用或者說是觸發它的程序,也就是/inherit/char/char.c這個
文件,這是所有玩家與NPC都共同繼承的文件,在里面的heart_beat()函數,就是每一次心跳時調用執行的函數。里面有這么幾句:
  if( tick-- ) return; 
  else tick = 5 + random(10); 
  cnd_flag = update_condition(); 
解釋:tick是這個文件里的一個全局變量,假設它只要>1,那么tick--就不會等於0,那么tick值就會減1,並且立即return;中止這個函數向下執行。假想如此這樣經過幾次減1之后,終有一次tick--就會為0,那么這時,程序就不會中止而是執行下一句的else。這時,tick被重新賦值為5+random(10)。並執行update_condition()函數,update_condition()是一個什么函數呢?在char.c里怎么也找不到。
  那么我們再回頭看看char.c這個文件的開頭,就會看到,這個文件已經繼承了/feature/condition.c文件,update_condition()這個函數正是在這個文件里面。所以下面我們就開看這個文件。
  附:由於大多數MUD里的心跳是每兩秒調一次,5+random(10)是5至14次,因此可以看出每一個condition被調用的時間是平均19秒。知道了這此,你才能更加有數地設定一些毒的發作時間,一些做牢的時間長短了。

二、下面就是主程序,feature目錄下的condition.c文件。 
程序詳解:

#include "condition.h"//繼承一些宏定義
mapping conditions;//定義一個映射集

/*更新函數 update_condition()
  這個函數首先要檢查玩家身上的每一個condition是否有效,如果出現了無效的condition,它會記錄進/log/condition.err這個文件里,經常性地檢查一下這個文件,可以發現並排除相當多的錯誤,因為一旦有一個錯誤,會在每一次的心跳中經常性地發生。然后它會按照condition的名字,也就是str這個變量去/kungfu/condition(某些MUDLIB下的路徑是/daemon/condition)目錄下去 尋找同名的.c文件進行執行。*/
nomask int update_condition() 

  mixed *cnd, err;
  int i, flag, update_flag;
  object cnd_d;
  if( !mapp(conditions) || !(i=sizeof(conditions)) ) return 0; 
//判斷玩家有無condition的映射,沒有就中止,畢竟不會每人都會有
  cnd = keys(conditions); 
//從這個映射中把關鍵詞取出組成一個數組,實際上就是不同condition的名字
  update_flag = 0;//初始化這個變量 
  while(i--)
//如果有1個以上的condition,就會一個個地循環執行 
  { 
    cnd_d = find_object(CONDITION_D(cnd[i]));
//到放condition的目錄下尋找這個文件名,這個目錄路徑有宏定義的文件指定,一般在XKX風格里大多是kungfu/condition/下,xyj等放在/daemons/condition/下 
    if( !cnd_d )//如果沒有的話,再嘗試 
    { 
      err = catch(call_other(CONDITION_D(cnd[i]), "???"));//強制檢驗 
      cnd_d = find_object(CONDITION_D(cnd[i]));//再次尋找 
      if( err || !cnd_d )//如果強制檢驗與再次尋找中仍找不到,表示不存在這個condition 
      { 
        log_file("condition.err",sprintf("Failed to load condition daemon %s, removed from %O\nError: %s\n",CONDITION_D(cnd[i]), this_object(), err) );
//記錄下來 
        map_delete(conditions, cnd[i]);
//刪除玩家身上的這個condition 
        continue;//繼續循環下一個 
      } 
    } 
    flag = call_other(cnd_d, "update_condition", this_object(), conditions[cnd[i]]); 
//這個就開始執行這個conditon的設定文件里的update_condition()函數了,flag就是返回值,這個要看下面的具體設定文件的詳解 
    if( !( flag & CND_CONTINUE ) )
      map_delete(conditions, cnd[i]); 
//返回值為0就表示這個conditon完畢了,就刪掉 
    update_flag |= flag;
  } 
  if( !sizeof(conditions) ) conditions = 0;
//檢查一個也沒有了,就清零 
  return update_flag; 
}

/*改變大小函數 apply_codition(cnd,info),通過這個函數將玩家身上名叫的cnd的condition的值設為info,info可以為0,所以可以得用這個函數對玩家身上的condition進行增減。 */ 
nomask void apply_condition(string cnd, mixed info)
{
  if( !mapp(conditions) )
    conditions = ([ cnd : info ]);
//如果沒有的話,就添加上,以cnd為鍵名,info為內容值
  else
    conditions[cnd] = info;
//有的話,直接改變內容值 
}

/*取值函數 query_codition(cnd)通過這個函數,可以調出某個玩家身上名叫cnd的這種condition的值有多少。*/
nomask mixed query_condition(string cnd)
{
  if( !mapp(conditions)||undefinedp(conditions[cnd]) )
    return 0;
//如果沒有conditions或者沒有這個cnd的condition,就返回為0 
  return conditions[cnd];//否則返回具體值
}

/*清除函數 clear_condition()這個主要是在/feature/damage.c里的die()函數里調用,意思是一旦死亡,死者就會被清除所有的comdition。*/ 
nomask void clear_condition()
{
  conditions = 0;
}
//END

三、下面就是上面說的與cnd同名.c文件--具體設定文件。一般每一種condition種類都要對應一個文件。里面只有一個update_condition()函數,通過/feature/condition.c這個程序來調用它的這個函數,可以添加一些效果或信息,比如,中毒的就會減精減氣。但最主要是就每調用一次,將鍵名為這個cnd的內容值減少1點或多點。然后到了設定的點數,一般是到了0之后,會出現一些特殊的現象。象做牢的到了0就會被放出來,等等。
  下面看一個例子:少林的做牢的condition的詳解:
//kungfu/condition/bonze_jial.c 
#include <ansi.h> 
#include <login.h>

/*參照前面調用這個函數的/feature/condition.c文件,就可以發現,調用它的時候會傳遞一個玩家與他的名為bonze_jia1的這個condition的值*/
int update_condition(object me, int duration) 

  if (duration < 1)
//如果這個點數參數小於1,就表示做牢時間夠了
  { 
    me->move("/d/shaolin/guangchang1"); 
//從牢房里直接移到少林大門口 
    message("vision","只聽乒地一聲,你嚇了一跳,定睛一看,\n" 
    "原來是一個昏昏沉沉的家伙從大門里被扔了出來!\n",environment(me), me); 
    tell_object(me, HIY "只覺一陣騰雲駕霧般,你昏昏沉沉地被扔出了少林寺!\n" NOR);
//出一些信息 
    me->set("startroom", START_ROOM); 
    return 0; 
  }
//如果不小於1,則設定減去一點,返回1,下次還會再執行 
  me->apply_condition("bonze_jail", duration - 1); 
  return 1; 
}


  到這里,condition的三大部分介紹完了,我們就以這少林寺的做牢為例,看一看condition執行調用的流程。
  程序大約是在松林里被僧兵抓住后,進了戒律院,這個房間文件會通過apply_condition()這個函數在玩家身上被加上了名為bonze_jail的condition。於是玩家身上會多了這樣的一個映射: 
  condition([({"bonze_jial":35},.....)]) 
  那么通過前面的文件,就會看到,由於我們玩家是繼承了char.c文件,每一個心跳中,就會檢查tick,如果tick為1時,那么就會開始調用update_conditon()函數了。 
  這個函數首先取出玩家身上conditions映射中的關鍵詞組成一個數組cnd: 
  cnd = ({"bonze_jial",......});
  首先發現了bonze_jia1,於是開始到/kungfu/condition/目錄下尋找名為bonze_jial.c的文件,也就是上面帖出的第三部分的文件,如果沒有找到這個文件就會被記錄進/log/condition.err文件里,有的話,開始傳遞時這個玩家與這個conditon的值,開始執行bonze_jial.c里的update_condition()函數 。第一次執行時duration也就是35,只要它大於或等1,就會被減出一點,返回值是1。會在下次tick為1的心跳是再次呼叫。這樣經過若干次調用后,duration已經等於0了,那么也就是durtion < 1,於是me被move到少林的廣場,出現信息:只聽乒地一聲,你......me又被覆蓋了startroom然后返回值為0。玩家身上就會被刪除這個condition。由於返回是0,那么/feature/condition.c文件里的update_condition()函數就會刪除玩家身上的這個bonze_jia1的內容。


  除了做牢之外,通過這樣的隨機調用,可以實現象毒這樣不定時發作的特殊效果,每調用一次就讓玩家減一些精呀氣之類的,卻出現一些恐怖的中毒信息症狀之類的。其實,你還以設計一些特殊的毒,不但在發作的過程中傷害人體。而且要求必須在這段時間找到解毒方法或解葯,否則,一旦到了最后一兩點還沒有徹底解毒,這個人就OVER死翹翹。呵呵,看起來有點恐怖呀,實際上我覺得這樣才是最符合實際情況的呢!

  采用condition處理的好處就在於,這個屬性是加在玩家身上的,通過在游戲中的心跳進行調用。如果玩家離了游戲就不會調用得到。一旦玩家進入游戲中又會開始繼續執行。這比call_out()一旦主呼叫者或呼叫中的參數失也就無法繼續執行的缺點要靈活得多。此外,它由心跳調用,不管玩家在做什么事情,它都可以即時地主動反饋情況。

  而如果你無需即時反映變化,比如說去領工資,只需要規定玩家在一定時間的間隔之內不能領兩次工資的話。可以在第一次領的時候,在玩家身上記下領的時間,第二次再去領時,將當前時間與記錄時間進行上減,看間隔夠不夠就行。象這樣子就很簡單,也幾乎沒有任何系統負責,比采用condition林節約得多。而如果你需要有時間一到就立即通知玩家去領下一次工資的話。那就必須要采用conditon。
  它的缺點也顯而易見,放在每一次的心跳里呼叫。如果一個MUD系統里的生物與玩家身上的condition過多過長的話,系統的負擔也是不小的。

  最后談一談有關的BUG。許多新巫師沒有正確或完全理解condition的用法,就開始大范圍地使用。在一些不應該用的地方也使用condition。舉例,在某一個可以使玩家得到金錢等東西地方,設定任何玩家都必須間隔在線一定的時間才能去拿一次。如果這個通過condition來實現。就有可能利用死亡后清除所有condition的特點,讓一個玩家反復去死亡再立即重新去拿錢拿東西。象這種情況,你或者要修改死亡后會清除所有condition,或者就不能采用它來做那些拿錢等東西的效果。
  其二,象上面所講的少林監獄的condition文件中,就隱藏着一個BUG。因為在XKX的文件里,少林的監獄並非是一定要等時間到了才會被放出來,可以通過賄賂獄卒,走五行洞先出來。而這樣的話,一旦這個conditon到了最后的時候,不論這個玩家在哪里,都會被一下子Move到少林廣場,然后出現你被扔出監獄等的字樣。仔細想一想:如果MUD有不讓你隨便帶東西或正常出來的地方,那么你就可以通過這個BUG跑到這種地方,把那些不能帶出的東西放在身上,專心等時間一到,就會象乘飛機一樣,一下子從那個地方飛到少林的廣場。(例如誰與爭鋒里演武場) 
  解決方法很簡單,只要在if(duration < 1)下面再加一個條件: 
  if(environment(me)->query("short")=="監獄") 
  才會move玩家出現信息。否則直接reuturn 0;就解決了。

  最后,舉一個毒的例子進行詳解作為結束吧: 
// /kungfu/condition/ice_poison.c

#include <ansi.h> 
#include <condition.h>

inherit F_CLEAN_UP;

int update_condition(object me, int duration) 

  if( duration < 1 ) return 0; 
  if( !living(me) ) 
//如果對象不是清醒着,出的信息
  { 
    message("vision", me->name() + "渾身顫抖,痛苦地哼了一聲。\n", environment(me), me); 
  } 
  else//否則就清醒着
  { 
    tell_object(me, HIB "忽然一陣奇寒從丹田升起,沁入四肢百骸,你中的寒冰綿掌發作了!\n" NOR ); 
    message("vision", me->name() + "的身子突然晃了兩晃,牙關格格地響了起來。\n",environment(me), me); 
  } 
  me->receive_wound("qi",15 + random(10)); 
  me->receive_wound("jing", 10); 
//傷一定的精與氣 
  me->apply_condition("ice_poison", duration - 1); 
//這個值減一點 
  if ( (int)me->query_temp("powerup") ) 
  { 
    me->add_temp("apply/attack", -(int)(me->query_skill("force")/3)); 
    me->add_temp("apply/dodge", -(int)(me->query_skill("force")/3)); 
//降低他的攻擊力與躲避力 
    me->delete_temp("powerup"); 
//結束他的powerup 
  } 
  if( duration < 1 ) return 0; 
//如果到了0,就返回,什么也不做,表示毒發結束,好了 
  return CND_CONTINUE; 
}


下篇專題 系統刷新與清除分析


返回前頁
三 詳談add_action()及其BUG 

           
  幾年前,add_action()的當機BUG是令眾多巫師極為頭痛的事情,如今各顯神通,有從MUDOS上解決,有從MUDLIB里調整。基本上已經看不到這種問題了。但是,如果未能了解這個BUG的產生原理,那么還有可能在其它的很多地方再次產生各種各樣的新BUG,結合本人的摸索感受,試圖全面介紹一下這方面的知識。

  首先我們來了解一下MUD對玩家輸入信息的處理流程。玩家在客戶端的指令行里輸入一些或長或短的字符后,系統接收到之后首先會調用在/feature/目錄下的alias.c里的process_input(string str)函數
進行預處理。而那些字符也就是參數str。
(例一:玩家輸入gall str==gall
 例二:玩家輸入c 我要go str==我要go
 例三:玩家輸入out  str==out
 例四:玩家輸入kill llm str==kill llm)
  這個函數首先要對玩家的信息進行一些過濾判斷,例如對於連續重復指令方面的判斷呀之類的,主要是對機器人的限制。然后就是調用玩家自己設定的alias以及系統設定的alias(主要由/adm/daemons/下的aliasd.c定義)看看str里面是否有事先設定的alias,有的話就要轉換成原先真正的指令,最后返回
這個經過處理過的新的字符串str。
(例一:gall 經檢查發現與玩家設定gall==get all,因此str==get all
例二:c 我要go 經檢查發現玩家設定c==chat,因此str==chat 我要go
例三:out 檢查沒發現alias,因此out==out
 例四:kill llm 檢查后沒發現alias,因此str==kill llm )

  在玩家進入MUD之后,連線程序logind.c在成功創造玩家的身體之后,會調用一個函數enable_player(),這個函數原型是在/feature/command.c里。該函數首先調用一個外部函數enable_commands(),允許它使用 add_action()所加入的命令。然后就add_action("command_hook", "", 1);
  add_action()這是一個外部函數,格式如add_action(A,B,C);就是表示如果玩家輸入指令第一個空格之前的單詞與B相同的話,就是調用函數A,后面的參數C一般用不着,這里不細講了。那么我們看看這里的就表示,如果玩家輸入的第一個單詞是"",其實就是所有的指令都符合這個條件的,那么就會調用到
函數command_hook()。而command_hook()函數就是在command.c里。str如果超過一個單詞,也就是有空格,就會分成第一個為verb,后面的為arg。開始按順序判斷verb是否是方向、固定指令、emote動作、頻道指令,如果是的話,就會把arg作為相應的參數傳入。如果都不是,就會返回0,也就是出現“什麽”的
字樣。
(例一:str==get all,get為一固定指令,調用get.c->main()參數是"all"
例二:str==chat 我要go,chat為頻道名,調用channeld.c里的do_chat,
  參數arg是"我要go"
例三:str==out,玩家所在場景發現有名叫out的出口,因此調用go.c->main()
  參數arg是"out"
 例四:str==kill llm,kill是一固定指令,調kill.c->main(),arg是"llm" )

  以上是MUD處理信息的經過。
  因此,MUD里所有的指令都是通過add_action()來實現的。而add_action()可以增加相同名稱的指令,如果指令相同,則后加的會先執行,請注意這里,並不是說后加的“覆蓋”先加的,而是“先執行”。關於一個同樣的動作單詞就可以有好幾層的add_action。那么在上一層調用的函數如果是返回0的情況下,系統會自動再去執行下一層的add_action()調用的函數,如果是其中任意一層返回是1,就表示到此中止,不會再執行下一層的add_action(),關於這一點特性可以靈活地使用。比如一個kill指令,本身通過command_hook已經加了一個,有的房間里再次調用一個add_action("do_kill","kill"),后來進來一個NPC,NPC身上也帶有一個新的add_action("do_kill","kill"),那么只要進入這個房間后,玩家身上就會有了三層有關kill的add_action()。如果這里輸入kill,自然是先執行NPC身上的do_kill()。返回是0的話,再執行房間里的do_kill(),再是0的話再執行kill.c。所以,在一般我們在房間,NPC以及OBJ里做的add_action()如果與/cmds目錄下的指令相同的話,都會優先於指令先行。而且如果是后加的,肯定優先於前加的。而其中任意一層一旦有返回1的話,就會立即中止。
  LPMUD里基本上所有的謎題和很多特殊效果都需要借助add_action()來實現,認真理解並掌握它的用法是相當重要的。
  下面我們來談談add_action()的 BUG吧!很多老的玩家都知道它的用法,先由一個A買一只雞腿(包子也可以),由另一個B打昏它,然后B從A身上搜走雞腿,再吃光雞腿扔掉。等A醒來輸入eat jitui指令,系統便會立即當機。
  原因分析,傳統MUDLIB的eat是一個add_action(),做在食物的標准繼承food.c里。玩家買下一只雞腿,那么這個eat的add_action()就加到了玩家身上。在正常情況下,這個物體消失(比如吃掉)或離開玩家所處環境(比如扔掉並離開),那么add_action()都會正常去掉。但是在玩家昏迷時,其它人從它身上拿走這個帶add_action()的物體,這個add_action()並不能正常地從玩家身上去掉。而當玩家蘇醒后,這個eat的add_action()依舊存在於他身上,他依舊可以執行這個指令,如果執行的對象,比如雞腿還在游戲中,不論這只雞腿被玩家B帶到了多遠的地方,A都可以通過eat jitui吃得到這只雞腿。這種情況只是有點滑稽而已。但是如果這個雞腿已經消失了,比如B吃掉了,那么它只能消除在B身上的add_action(),這時A再執行eat,系統一下子找不到jitui這個物體,就會從內存中載入一大堆莫名其妙亂七八糟的東西,迅速進入死循環,直接導致當機。所以要實現這個BUG的條件有二,一是找一件有add_action()並且可以通過正常方法摧毀的,比如食物,不值錢的東西。二是用兩個ID執行。
  目前新版本的MUDOS據說已經從底層上修改掉了這個BUG。同時明白了其中的原理也可以在MUDLIB上用很多方法來避免這種情況的發生。
  再下面就談一下較少有人知的另一個BUG,這個BUG表面上看起來問題不大,實際運用中有時會產生很大的問題,就是sleep對add_action()的影響。大家可以仔細看看sleep.c文件,玩家進入睡眠狀態就會調用一個函數me->disable_player();這個函數原型在/feature/command.c里,最終調用disable_commands();這個外部函數,disable_commands()的用處就是讓一個活物件變成「非活着」,一是add_actions 失效,二是livingp()返回0值......也就是說,去掉了身上所有的add_action()。然
后在醒來之后,再次調用me->enable_player();這個函數我在前面文章的第五段里介紹過用法與作用,它只是恢復了玩家的add_action("command_hook", "", 1);也就是所有的系統固定指令。比如玩家身上物品的add_action,所處環境的add_action都是在init()里加載的,玩家在sleep之后並沒有呼叫到init(),自然就沒有這些。那么問題就會出現了。假如我們在一個房間里或是在一個物體上作了一個企圖覆蓋掉正常指令的add_action(想覆蓋掉正常指令,只要讓這個add_action()調用的函數總是返回1就行)。那么,玩家只需sleep一下之后,就會讓這個覆蓋無效。無效之后產生的問題大小就與你當初覆蓋的目的有關了。要解決這一問題,可以修改sleep.c,在玩家醒來后的一瞬間,讓玩家離開原地再重新move回到所處的環境,再讓玩家身上所有的東西也同樣移出去再重新move回到玩家身上,這樣就讓系統再次加載玩家身上應該加載的add_action。
  總之,MUDOS當初對於add_action的考慮並不是很完善。再加MUDLIB里的處理手法,對於象過去的昏迷、睡覺以及今后要發展的點穴、捆綁等等的處理都需要屏蔽掉指令,那么處理的前后則一定要小心,否則新東東一上,新BUG也就隆重登場。
         誰與爭鋒 叮當 2001、04、21

新手常見問題
(本欄目歡迎江湖菜鳥來信提問:)

一、當我第一次登錄誰與爭鋒,為何總是顯示密碼不正確?

二、在新人物注冊時,隨便填一個假的email要不要緊?

三、我密碼忘了,該怎么辦?

四、我在MUD中發現可以看到別人說的話,卻看不到自己chat出來的話,怎么辦?

五、我有一個人物突然不能get東西了,無論get什么東西,都是顯示“什么?”

六、我在建一個新人時,由於選天賦,超時被踢出來,然后再連時,怎么也連不上了怎么辦?

 

一、當我第一次點擊“連線”后進入“誰與爭鋒”初始頁面,要求我輸入英文名稱和密碼,在我輸入了ID和密碼后,就顯示我密碼錯誤,同時跳出一個對話框,告訴我“你退出 MUD主機當了 網絡斷開 如果你使用的是SLIP/PPP:MEDOM斷線或呼叫等待功能使線路斷 線”,10秒后讓我再次連線。但我總是無法連上線。無奈!請指教。

答:連線后,當系統要求你輸入英文名時,就象是申請免費email一樣,你先輸入一個英文名,系統就會檢查是否已經有了這個用戶存在。如果你是第一次來這里,它還要求你輸入密碼的話,就表示這個英文名已經被別人注冊了,你如果強行輸入一個密碼的話,一般是不會正確的,即顯示密碼錯誤,然后系統會強制你與MUD斷開,一般ZMUD會彈出你所說的那個窗口,當然你不必要等10秒,直接點擊“重新連線”,再輸入一個新的英文名,直到系統告訴你:你所選的英文名將創造一個新人物,您確定嗎?(Y/N) 就表示你可以用這個名字了,然后你輸入Y就可以進行新人物的創立了! 如果你的確是從前注冊過的這個名字,那么則會有三種情況:一,你密碼忘記了;二,你密碼被別人盜用后並改了;三、你超過三個月未連線被系統清理掉后又被別人搶注了。如果是前兩種情況,可以參照第三條進行解決。

二、在新人物注冊時,系統會提示要我輸入一個電子郵件地址,我發現隨便輸一個,只要里面包含@就可以了,不知對以后會不會有影響。
答:這個電子郵件地址的作用,在於如果你的用戶密碼遺忘或者被別人盜用,你就可以通過這個地址向巫師組發信,請求改變成一個臨時密碼。巫師組受理后,會核對地址,並將新密碼向你注冊時的地址發去。也就是說:如果你注冊時的地址是一個錯誤或不存在或你自己無法收到的話,那你就只能保佑你的密碼不要遺忘或被人盜用了。因為這個信箱地址在注冊后是不允許改動,是對於是否是你本人申請的唯一認證。為了保證這個地址的權威性與嚴格性,玩家注冊的信箱地址在任何情況下不允許改動,(否則,只要盜用者再改一下注冊信箱地址,原玩家就無法要回自己的ID了)。一旦失竊或遺忘了密碼的ID的注冊信箱地址是錯誤的,那么則不可能要回自己的密碼的。同時,巫師組承諾對玩家的這些郵箱地址保密,絕不用於其它任何用途。


三、我密碼忘了,該怎么辦?
答:這個首先參照第二條,在玩家注冊時,系統有明確提示要輸入確切本人能夠收到的電子郵件地址,此地址作為巫師確認玩家身份的唯一有效證據; 玩家若密碼發生問題,可使用該信箱地址向我們的巫師信箱:
mud@wst.net.cn發去申請要回密碼的郵件,並寫明玩家id及原因。 
  巫師收到信后在核實該信箱地址確實是此id的注冊信箱,便會在游戲中的無錫東林書院三樓post出受理玩家的姓名以及根據其經驗標出該交納的黃金數,之所以要交費,是想通過這個手段提醒玩家:記牢密碼的重要性。三天兩頭地忘記密碼,損失的就是黃金與時間。玩家可用任何ID去交費。交費后,巫師就會用臨時密碼覆蓋掉該ID的舊密碼,並發往向該信箱地址,由玩家登錄后自行修改。而凡是郵件地址不符或無效地址的id,巫師則無法確認,請予以理解。一般來說,巫師在線不處理任何與密碼有關的事情。

四、我在MUD中發現可以看到別人說的話,卻看不到自己chat出來的話,是怎么一回事?
答:如果你用的是ZMUD4.62以下版本的話,這應該是zmud軟件沒有安裝好的緣故。你可以再向別人問一下,問他們是不是能看到你的話。如果他們能而你自己不能,那十有八九就是這個原因了。解決的辦法很簡單:將ZMUD刪掉,重新安裝一遍即可。如果是同一個ZMUD,別的ID正常,而某一個ID不正常,就表明這兩個ID用的不是同一個設置文件,將ZMUD里這個用戶設置刪掉即可。

五、我有一個人物突然不能get東西了,無論get什么東西,都是顯示“什么?”問別的玩家,他們都是好的,為什么?
答:一般來說,類似的情況還很多,突然地不能wear了,不能give了,而其它玩家都是好的,甚至自己連一個搬搬來看都是好的,那就說明問題出在你自己的人物身上。而十有八九就是出在alias,你可以鍵入“alias”指令,查看一下自己設定了哪些alias。有的玩家為了圖方便,用alias把get 設成get all from corpse之類的簡化式。那么當他再次輸入“get silver”時,實際上系統已將這里的get解釋為“get all from corpse”,全句就成了“get all from corpse silver”,當然覺得有些莫名其妙的了。常用的指令出了問題,記住先查看alias,再問巫師。

六、建新人超時后,就無法再連入,怎么辦?
答:這是MUD里建新人時,存檔方面的一個毛病,產生了一個廢了的帳號,有點象一些程序屍體一樣。在以前時常發生,目前應該已經從程序上解決了,不過,萬一再發生,你只有向巫師發信,由巫師經確認后將這個廢帳號手工清除掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM