從源碼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 編輯 ]