小貓的世界 telnet://catworld.muds.me/
小貓的世界 討論區 http://catworld.muds.me/forum/
小貓的世界 網頁版 http://catworld.muds.me/web/
小貓的世界 telnet://catworld.muds.me/
小貓的世界 討論區 http://catworld.muds.me/forum/
小貓的世界 網頁版 http://catworld.muds.me/web/
這是 anfernee 提供給我的解法, 僅在此作一個記錄 !
修改 src/ed.c 的 prntln()
找到
if (*str < ' ' || *str >= DEL) {
(大約在627行的地方) 改成
if (*str >= 0 && *str < ' ') {
在剛開始測試 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
這個問題在小貓的話, 就是 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))) {
在 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);
}
小貓目前是採用 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))