📄 npcsdk.lua
字号:
return LUA_TRUE
end
--购买货物
function BuyGoods( character, npc, trade, boatid, itemtype, index1, index2, count )
PRINT( "BuyGoods" )
itemtype = itemtype + 1
index1 = index1 + 1
if boatid == nil or trade[itemtype] == nil or trade[itemtype].item == nil or trade[itemtype].item[index1] == nil or trade[itemtype].price[index1] == nil then
--信息错误
PRINT( "BuyGoods:Function parameter error!" )
SystemNotice( character, "BuyGoods:Function parameter error!" )
return LUA_FALSE
end
local ret = BoatTrade( character, trade.berth )
if ret ~= LUA_TRUE then
return LUA_FALSE
end
if trade[itemtype].item[index1].count <= 0 then
BickerNotice( character, "Item is sold out. Please wait!" )
return LUA_TRUE
end
PRINT( "BuyGoods:1" )
if trade[itemtype].item[index1].level > 0 then
local ret, level, cess = GetTradeItemData( character )
if ret ~= LUA_TRUE then
SystemNotice( character, "BuyGoods: GetTradeItemData: function transfer failed! Check if Commerce Permit exist!" )
LG( "trade_error", "BuyGoods: GetTradeItemData: function transfer failed! Check if Commerce Permit exist!" )
return LUA_FALSE
end
PRINT( "BuyGoods:GetTradeItemData: level = , cess = ", level, cess )
if level < trade[itemtype].item[index1].level then
BickerNotice( character, "Required"..trade[itemtype].item[index1].level.."Lv Commerce Permit to buy this product!" )
return LUA_FALSE
end
end
PRINT( "BuyGoods:2" )
--检查数量是否足够
if trade[itemtype].item[index1].count < count then
count = trade[itemtype].item[index1].count
end
local itemid = trade[itemtype].item[index1].id
local price = trade[itemtype].price[index1].curprice
local ret = SafeBuyGoods( character, boatid, itemid, index2, count, price )
if ret == LUA_TRUE then
trade[itemtype].item[index1].count = trade[itemtype].item[index1].count - count
PRINT( "BuyGoods:index, id, count, price", index1, itemid, trade[itemtype].item[index1].count, price )
SendGoodsData( npc, index1 - 1, itemid, trade[itemtype].item[index1].count, price )
end
PRINT( "BuyGoods:4, price = ", price )
return LUA_TRUE
end
--货物信息同步
function SendGoodsData( npc, index, id, count, price )
if npc == nil or index == nil or id == nil or count == nil or price == nil then
PRINT( "SendGoodsData:Function parameter error!npc, index, id, count, price", npc, index, id, count, price )
LG( "npctrade_error", "SendGoodsData:Function parameter error!npc, index, id, count, price", npc, index, id, count, price )
return
end
PRINT( "SendGoodsData: npc, index, id, count, price", npc, index, id, count, price )
local packet = GetPacket()
WriteCmd( packet, CMD_MC_TRADE_DATA )
local npcid = GetCharID( npc )
WriteDword( packet, npcid )
WriteByte( packet, 0 ) --第一页为销售物品页信息
WriteByte( packet, index )
WriteWord( packet, id )
WriteWord( packet, count )
WriteDword( packet, price )
SynPacket( npc, packet )
return LUA_TRUE
end
function SendAllGoodsData( npc, trade )
if trade == nil or npc == nil then
PRINT( "SendAllGoodsData: Function parameter error!" )
return LUA_ERROR
end
PRINT( "SendAllGoodsData:" )
SendUpdateTradePage( npc, npc, CMD_MC_TRADE_ALLDATA, trade, TRADE_GOODS, 0 )
return LUA_TRUE
end
--货物打包到船舱
function PackBagGoods( character, boat, tp, level )
PRINT( "PackBagGoods: character, boat, tp, level ", character, boat, tp, level )
if character == nil or boat == nil or level == nil or tp == nil then
PRINT( "PackBagGoods:functionparameter error , character, boat, tp, level ", character, boat, tp, level )
LG( "goods_error", "PackBagGoods:functionparameter error , character, boat, tp, level ", character, boat, tp, level )
return LUA_FALSE
end
--打包各种等级资源类型
if tp == RES_WOOD then -- 木材资源
if ResourceList == nil or ResourceList.wood == nil or ResourceList.wood[level] == nil then
PRINT( "PackBagGoods: invalid resource loading notice!" )
return LUA_FALSE
end
PRINT( "PackBagGoods: 1" )
if ResourceList.wood[level].itemid == nil or ResourceList.wood[level].count == nil or ResourceList.wood[level].pileid == nil then
PRINT( "PackBagGoods: Invalid wood resource loading notice!level, Itemid, count, pileid", level, ResourceList.wood[level].itemid, ResourceList.wood[level].count, ResourceList.wood[level].pileid )
LG( "goods_error", "PackBagGoods: Invalid wood resource loading notice!level, Itemid, count, pileid", ResourceList.wood[level].itemid, ResourceList.wood[level].count, ResourceList.wood[level].pileid )
return LUA_FALSE
end
PRINT( "PackBagGoods: PackBag:RES_WOOD: itemid = , count = , pileid = ", ResourceList.wood[level].itemid, ResourceList.wood[level].count, ResourceList.wood[level].pileid )
local ret, numpack = PackBag( character, boat, ResourceList.wood[level].itemid, ResourceList.wood[level].count, ResourceList.wood[level].pileid )
if ret ~= LUA_TRUE then
PRINT( "PackBagGoods: load wood resource failed!level, itemid, count, pileid", level, ResourceList.wood[level].itemid, ResourceList.wood[level].count, ResourceList.wood[level].pileid )
return LUA_FALSE
end
PRINT( "Successfully loaded"..numpack.."pile"..level.."level Wood!" )
if numpack > 0 then
BickerNotice( character, "Successfully loaded"..numpack.."pile"..level.."level Wood!" )
end
elseif tp == RES_MINE then -- 矿石资源
if ResourceList.mine[level].itemid == nil or ResourceList.mine[level].count == nil or ResourceList.mine[level].pileid == nil then
PRINT( "PackBagGoods: Invalid ore resource loading notice! level, Itemid, count, pileid", ResourceList.mine[level].itemid, ResourceList.mine[level].count, ResourceList.mine[level].pileid )
LG( "goods_error", "PackBagGoods: Invalid ore resource loading notice! level, Itemid, count, pileid", ResourceList.mine[level].itemid, ResourceList.mine[level].count, ResourceList.mine[level].pileid )
return LUA_FALSE
end
PRINT( "PackBagGoods: PackBag:RES_MINE: itemid = , count = , pileid = ", ResourceList.mine[level].itemid, ResourceList.mine[level].count, ResourceList.mine[level].pileid )
local ret, numpack = PackBag( character, boat, ResourceList.mine[level].itemid, ResourceList.mine[level].count, ResourceList.mine[level].pileid )
if ret ~= LUA_TRUE then
PRINT( "PackBagGoods: load wood resource failed!level, itemid, count, pileid", level, ResourceList.mine[level].itemid, ResourceList.mine[level].count, ResourceList.mine[level].pileid )
return LUA_FALSE
end
PRINT( "Successfully loaded"..numpack.."pile"..level.."level Ore!" )
if numpack > 0 then
BickerNotice( character, "Successfully loaded"..numpack.."pile"..level.."level Ore!" )
end
else
PRINT( "PackBagGoods: Invalid resource loading type, character, boat, tp, level ", character, boat, tp, level )
LG( "goods_error", "PackBagGoods: Invalid resource loading type, character, boat, tp, level ", character, boat, tp, level )
return LUA_FALSE
end
PRINT( "PackBagGoods: return true" )
return LUA_TRUE
end
--调整贸易税率
function AdjustTradeCess( character, cess, cessrange )
if cess == nil or cessrange == nil then
SystemNotice( character, "AdjustTradeCess:Function parameter error!" )
LG( "mission_error", "AdjustTradeCess:Function parameter error!" )
return LUA_ERROR
end
local ret, level, cessdata = GetTradeItemData( character )
if ret ~= LUA_TRUE then
SystemNotice( character, "AdjustTradeCess:GetTradeItemData function transfer failed, check if Commerce Permit exists!" )
LG( "mission_error", "AdjustTradeCess:GetTradeItemData function transfer failed, check if Commerce Permit exists!" )
return LUA_FALSE
end
--检查贸易证等级
if level == 1 then
return AdjustTradeItemCess( character, 200, cess + Rand( cessrange ) )
elseif level == 2 then
return AdjustTradeItemCess( character, 500, cess + Rand( cessrange ) )
elseif level == 3 then
return AdjustTradeItemCess( character, 60000, cess + Rand( cessrange ) )
else
SystemNotice( character, "AdjustTradeCess: Commerce Permit level exceeded! level = "..level )
LG( "mission_error", "AdjustTradeCess: character ["..GetCharName( character ).."] commerce permit level exceeded!level = "..level )
return LUA_FALSE
end
end
--荣誉值兑换道具
function CreditExchange( character, npc, tp )
if tp == nil then
PRINT( "CreditExchange: function parameter error!" )
SystemNotice( character, "CreditExchange: function parameter error!" )
return LUA_ERROR
end
PRINT( "CreditExchange, p1 = "..tp )
CreditExchangeImpl( character, tp )
return LUA_TRUE
end
--船只升级处理函数
function BoatLevelUp( character, boat, levelup )
PRINT( "BoatLevelUp: levelup", levelup )
if levelup == nil or BoatLevelList == nil then
PRINT( "BoatLevelUp:Function parameter error!" )
SystemNotice( character, "BoatLevelUp:Function parameter error!" )
return LUA_ERROR
end
if BoatLevelList[levelup] == nil or BoatLevelList[levelup].money == nil or BoatLevelList[levelup].exp == nil then
BickerNotice( character, "Your ship has reached maximum level!" )
return LUA_TRUE
end
PRINT( "BoatLevelUp: levelup, exp, moeny", levelup, BoatLevelList[levelup].exp, BoatLevelList[levelup].money )
--判断经验和钱升级条件是否足够
local ret = BoatLevelUpProc( character, boat, levelup, BoatLevelList[levelup].exp, BoatLevelList[levelup].money )
if ret == 0 then
PRINT( "BoatLevelUpProc:function transfer return failed!" )
end
return LUA_TRUE
end
--对话命令消息处理
function MsgProc( character, npc, rpk, page, trade, missionlist )
if character == nil or npc == nil or rpk == nil then
PRINT( "MsgProc:Function parameter error!" )
EXLG( "NpcSdk_error", "MsgProc:Function parameter error!" )
return
end
PRINT( "MsgProc:Net message process." )
local usCmd = ReadWord( rpk );
if usCmd == CMD_CM_TALKPAGE then --对话页命令信息处理
local byTalkID = ReadByte( rpk ) --读取页指令索引信息
if byTalkID == ROLE_FIRSTPAGE then --和npc第一次交流对话
RefreshMissionState( character, npc )
if page.start == MultiTrigger then
PRINT( "MsgProc:MultiTrigger, page, p1, p2", page, page.p1, page.p2 )
return MultiTrigger( character, npc, page, page.p1, page.p2 )
end
if page.start == PopupWindow then
PRINT( "MsgProc:PopupWindow, page, p1, p2", page, page.p1, page.p2 )
return PopupWindow( character, npc, page, page.p1, page.p2 )
end
return JumpPage( character, npc, page, 1 ) --发送第一页对话信息
elseif byTalkID == ROLE_CLOSEPAGE then
return SendClosePage( character, npc ) --关闭对话
elseif page[byTalkID] == nil or page[byTalkID][1] == nil then --错误的页数据,报警
return SystemNotice( character, "MsgProc: request a dialogue with npc but target npc does not have page data notice!" )
else
local talkpage = page[byTalkID][1]
local funcpage = page[byTalkID][2]
--执行页链接功能指令
if talkpage.func == JumpPage then
return JumpPage( character, npc, page, talkpage.p1 )
elseif talkpage.func == FuncPage then
return FuncPage( character, npc, page, talkpage.p1 )
elseif talkpage.func == CloseTalk then
return CloseTalk( character, npc )
elseif talkpage.func == HasRecord then
local ret = HasRecord( character, talkpage.p1 )
if ret == LUA_TRUE then
return JumpPage( character, npc, page, talkpage.p2 )
else
return JumpPage( character, npc, page, talkpage.p3 )
end
elseif funcpage ~= nil then --判断是否有功能信息
return FuncPage( character, npc, page, byTalkID )
else --跳转到下一页
local PageID = byTalkID + 1
if page[PageID] == nil then
EXLG( "NpcSdk_error", "MsgProc: page notice link incorrect, does not have next page or unknown link function! NpcName = %s, PageID = %d", GetCharName( npc ), PageID )
return SystemNotice( character, "MsgProc: page notice link error, does not have next page or unknown link function!" )
end
return JumpPage( character, npc, page, PageID )
end
end
return
elseif usCmd == CMD_CM_FUNCITEM then --功能页选项命令信息处理
local byPage = ReadByte( rpk ); --读取功能页索引信息
local byItem = ReadByte( rpk ); --读取功能选项索引信息
PRINT( "MsgProc: pageid = , itemid = ", byPage, byItem )
if page[byPage] == nil or page[byPage][1] == nil then
EXLG( "NpcSdk_error", "MsgProc:unknown function page index notice error or target page notice does not exist! NpcName = %s, PageID = %d, ItemID = %d", GetCharName( npc ), byPage, byItem )
return SystemNotice( character, "MsgProc:unknown function page index notice error or target page does not exist!" )
end
if page[byPage][1].talk ~= nil then --是否既有对话页信息也有功能页信息
if page[byPage][1].func ~= nil then
PRINT( "MultiTrigger" )
byItem = 1 --如果对话信息有执行函数则优先执行
else
byItem = byItem + 2 --跳到选择项功能函数执行
end
elseif page[byPage][1].text ~= nil then
byItem = byItem + 1
end
--处理功能项目选择命令
local item = page[byPage][byItem]
if item == nil or item.func == nil then
EXLG( "NpcSdk_error", "MsgProc: target page does not have function option notice or function notice! NpcName = %s, PageID = %d, ItemID = %d", GetCharName( npc ), byPage, byItem )
return SystemNotice( character, "MsgProc: Target page does not have function page notice nor function notice!" )
end
if item.func == JumpPage then
return JumpPage( character, npc, page, item.p1 )
elseif item.func == FuncPage then
return FuncPage( character, npc, page, item.p1 )
elseif item.func == CloseTalk then
return CloseTalk( character, npc )
elseif item.func == GoTo then
return GoTo( character, item.p1, item.p2, item.p3 )
elseif item.func == RandToMap then
return RandToMap( character, npc, item.p1, item.p2 )
elseif item.func == RandFunction then
return RandFunction( character, npc, page, item.p1, item.p2 )
elseif item.func == MultiFunc then
return MultiFunc( character, npc, page, item.p1, item.p2 )
elseif item.func == SalePage then
return SalePage( character, npc, trade )
elseif item.func == BuyPage then
return BuyPage( character, npc, trade )
elseif item.func == TradeGoods then
return TradeGoods( character, npc, trade, item.p1 )
elseif item.func == MultiTrigger then
return MultiTrigger( character, npc, page, item.p1, item.p2 )
elseif item.func == MultiTrigger_0 then
return MultiTrigger_0( character, npc, page, item.p1, item.p2 )
elseif item.func == MultiTrigger_1 then
return MultiTrigger_1( character, npc, page, item.p1, item.p2 )
elseif item.func == MultiTrigger_2 then
return MultiTrigger_2( character, npc, page, item.p1, item.p2 )
elseif item.func == MultiTrigger_3 then
return MultiTrigger_3( character, npc, page, item.p1, item.p2 )
elseif item.func == OpenForge then
return OpenForge( character, npc )
elseif item.func == OpenUnite then
return OpenUnite( character, npc )
elseif item.func == OpenMilling then
return OpenMilling( character, npc )
elseif item.func == OpenHair then
return OpenHair( character, npc )
elseif item.func == OpenRepair then
return OpenRepair( character, npc )
elseif item.func == OpenFusion then
return OpenFusion( character, npc )
elseif item.func == OpenUpgrade then
return OpenUpgrade( character, npc )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -