小貓的世界  telnet://catworld.muds.me/

小貓的世界 討論區  http://catworld.muds.me/forum/

小貓的世界 網頁版  http://catworld.muds.me/web/

文章標籤

jrealm 發表在 痞客邦 留言(0) 人氣()

這是 anfernee 提供給我的解法, 僅在此作一個記錄 !


修改 src/ed.c 的 prntln()


找到


if (*str < ' ' || *str >= DEL) {


(大約在627行的地方) 改成


if (*str >= 0 && *str < ' ') {

 

jrealm 發表在 痞客邦 留言(0) 人氣()

在剛開始測試 fluffos 2.27 時, 遇到了一個很大的麻煩 !

就是角色昏倒, 再醒過來之後, 原先經由 add_action() 得到的指令, 都會消失無法使用 !


網路上有看到不少種解決方案, 後來我決定參考 fluffos 3.0 的做法:


修改 src/add_action.c 的 enable_commands()


找到


if (num) {
current_object->flags |= O_ENABLE_COMMANDS;
set_command_giver(current_object);


(大約在234行的地方) 在後面加上


#ifndef NO_ENVIRONMENT
if (current_object->super) {
setup_new_commands(current_object->super, current_object);
}
for (pp = current_object->contains; pp; pp = pp->next_inv) {
setup_new_commands(current_object, pp);
}
#endif

 

jrealm 發表在 痞客邦 留言(0) 人氣()

這個問題在小貓的話, 就是 quit 的時候會看不到 "歡迎下次再來﹗" 這個訊息 !

只是一個小問題, 但既然有解, 就修一下吧 !


以下是參考 fluffos 3.0 的改法:

修改 src/comm.c 的 flush_message()

找到


if (!ip || !ip->ob || !IP_VALID(ip, ip->ob) ||
(ip->ob->flags & O_DESTRUCTED) || (ip->iflags & (NET_DEAD | CLOSING))){


(大約在773行的地方) 改成


if (!ip || (ip->iflags & (NET_DEAD | CLOSING))) {

 

jrealm 發表在 痞客邦 留言(0) 人氣()

在 LPC 有兩個很重要的常數:

__FILE__ : 代表當前這個檔案的完整檔名。

__DIR__ : 代表 __FILE__ 所在之目錄的完整檔名。


在小貓, 還有 __DIR_DIR__ : 代表 __DIR__ 所在之目錄的完整檔名, 這在開發區域時特別有用。


舉例:

若 __FILE__ = "/d/snow/room/inn"

則 __DIR__ = "/d/snow/room"

而 __DIR_DIR__ = "/d/snow"


要在 LPC 中使用 __DIR_DIR__ 需要 mudos 的支援:

修改 src/lex.c 的 start_new_file()


找到


add_define("__DIR__", -1, dir);


(大約在2251行的地方) 在後面加上


tmp[0] = '"';
tmp[1] = 0;
tmp = strrchr(dir, '/');
if (tmp != NULL) {
tmp[1] = '"';
tmp[2] = 0;
add_define("__DIR_DIR__", -1, dir);
}

 

jrealm 發表在 痞客邦 留言(0) 人氣()

小貓目前是採用 subversion 來做版本的控管 !

但是有一個比較困擾的問題是, get_dir() 回傳的檔案列表中, 會包含 subversion 的 .svn 目錄, 導致一些功能發生異常。


mudlib 的解法是在所有 get_dir() 的地方加上 filter_array() 將 .svn 過濾掉 !

不過這做法有效能上的缺點, wiz 在寫作時也要多注意, 才能避免問題的發生。



比較治本的做法就是修改 mudos, 直接在 efun 裡面過濾, 以下是我的改法:

修改 src/file.c 的 get_dir()


找到


if (!do_match && (strcmp(de->d_name, ".") == 0 ||
strcmp(de->d_name, "..") == 0))


(大約在200行與255行的地方) 改成


if (!do_match && !strncmp(de->d_name, ".", 1))

 

jrealm 發表在 痞客邦 留言(0) 人氣()