⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 npcsdk.lua

📁 top web admin panel (tales of pirates)
💻 LUA
📖 第 1 页 / 共 5 页
字号:
	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 + -