Board logo

標題: 從源碼C底層中,增加 callback API [打印本頁]

作者: 寇丁gm    時間: 2026-5-24 19:54     標題: 從源碼C底層中,增加 callback API

LNS LUA 在石器原始碼中是非常靈活的存在
但很多時候想運用卻不知道如何運用,或者是既有的setup.cf不夠靈活時常有數量上的限制 (EX:不能組隊地圖)

今天就以限制 "禁止逃跑地圖" 來當作拓展示範
不走setup.cf,靠幾行CODE 可以無限制設定擺攤地圖,甚至可以自訂逃跑時顯示的文字訊息
非常好用

1.宣告函式 (npc_lua_interface.h)
在檔案最上方 #include "common.h" 的下面 FUNCNAME 處增加
#define FUNCNAME_NOESCAPE                                                "NPC_Lua_Noescape"

並在約150行左右新增
BOOL NPC_Lua_Noescape(int _playindex);

2.增加函式 (function.c)
在static CorrespondStringAndFunctionTable correspondStringAndFunctionTable[]=
裡面增加以下函式
{ {FUNCNAME_NOESCAPE} ,                                NPC_Lua_Noescape,0 },

3.函式實例設計 (npc_lua.c)
加入以下函式
BOOL NPC_Lua_Noescape(int _playindex)
{
        if(M_Script_Lua == NULL){
                print("M_Script_Lua Null!");
                return FALSE;
        }
        
        lua_getglobal(M_Script_Lua, "LuaNoEscape");

        if (!lua_isfunction(M_Script_Lua, -1)) {
                lua_pop(M_Script_Lua, 1);
                return TRUE;
        }
        //依次放入參數
        lua_pushnumber(M_Script_Lua,_playindex);
        int TM_Ret = 0;
        TM_Ret = lua_pcall(M_Script_Lua, 1, 1, 0);
        //
        if(TM_Ret != 0){
                //失敗-輸出錯誤信息
                print("NPC_Lua_Noescape Lua Err :%d(%s)\n", TM_Ret, lua_tostring(M_Script_Lua, -1));
                //出棧
                lua_pop(M_Script_Lua, 1);
                return FALSE;
        }
        //
        int ret = lua_tonumber(M_Script_Lua, -1);
        //
        lua_pop(M_Script_Lua, 1);
        
        return ret;
}

4.函式使用 (battle_command.c)
在void BattleCommandDispach 這個函式中

註解 //設定逃跑 處
CHAR_setWorkInt( charaindex, CHAR_WORKDBATTLEESCAPE, 1); 的上方

增加以下程式

if ( NPC_Lua_Noescape(charaindex) < 0 ) {
        BattleCommandDispach( fd, "N");
// <- 這裡很重要,一定要加入"N"的command 才會讓逃跑真正失效
        return;        
}
5.最重要的,LUA呼叫
init.lua 增加自己定義的檔案,應該不用特別說明了

隨意lua檔案內加入function

--不可逃跑地圖
function LuaNoEscape(_PlayerIndex)

local map = Char.GetData(_PlayerIndex,%對像_地圖%);



local noescapemap = {1000,2000,3000,4000};
//這裡自行定義陣列,裡面可以放你要的地圖編號





for i = 1, #noescapemap do

if map == noescapemap then

NLG.TalkToCli(_PlayerIndex, "在此地圖內禁止逃跑哦", %紅色%);
//自訂顯示文字,

return -1;
//要返回 -1 C底層才會認定這邊無法繼續運行下去

end

end


return 1;
//若沒有任何返回值,表示檢查通過,可以逃跑
end


以上,分享給大家

[ 本帖最後由 寇丁gm 於 2026-5-24 19:55 編輯 ]




歡迎光臨 We Love SA 石器時代研討中心 (http://lab.welovesa.com/) Powered by Discuz! 6.0.0