更新时间:2024-12-10
编写人员:雪舞
适用版本:经典版本的逍遥子引擎(怀旧版一般是纯Lua版本)
引擎版本
示例:
--参考格式
local nRet = LuaFnMtl_CostMaterial(sceneId,selfId,nNum,Material,Material2,Material3,Material4,Material5,Material6,Material7,Material8)
--实际演示
local nRet = LuaFnMtl_CostMaterial(sceneId,selfId,1,38000856)
if nRet ~= 1 then
BeginEvent( sceneId )
AddText( sceneId, "扣除失败" )
EndEvent( sceneId )
DispatchMissionTips( sceneId, selfId )
return
end
返回值
特性: 是不管物品是否足够,一律扣除物品。多个物品参数时 优先扣除前一个,第一个不足时扣除个二个参数,以此类推。
***付费内容***
自写函数(纯Lua版本)
函数用法:
local nRet = LuaFnMtl_CostMaterial(sceneId,selfId,uNeedItemNum,nMaterialID_1,nMaterialID_2)
nRet = LuaFnMtl_CostMaterial(sceneId,selfId,5,20310177, 20310186, 20310178, 20310187, 20310179, 20310188)
一、常见怀旧带的纯Lua写法(直接使用此代码有BUG):
--扣除物品函数
function LuaFnMtl_CostMaterial(sceneId,selfId,nNum,nMaterial1,nMaterial2,nMaterial3,nMaterial4,nMaterial5,nMaterial6,nMaterial7,nMaterial8,nMaterial9)--材料扣除函数
local ret = 0
local nAllNum = nNum
local nCostMaterial = {nMaterial1,nMaterial2,nMaterial3,nMaterial4,nMaterial5,nMaterial6,nMaterial7,nMaterial8,nMaterial9}
for i = 1,getn(nCostMaterial) do
if nCostMaterial[i] ~= nil and nCostMaterial[i] > 0 then
local nHaveNum = LuaFnGetAvailableItemCount(sceneId, selfId, nCostMaterial[i])
if nHaveNum > nAllNum then
nHaveNum = nAllNum
end
LuaFnDelAvailableItem(sceneId,selfId,nCostMaterial[i],nHaveNum)
nAllNum = nAllNum - nHaveNum
if nAllNum <= 0 then
return 1
end
end
end
return ret
end
BUG说明并解决方法:如果道具数量有3个,但是要扣除4个的时候,会直接把道具全部扣完了,结果返回0的是扣除失败,这导致完全钱财道具两失。所以使用这个函数之前必须先用LuaFnMtl_GetCostNum函数检查数量。
三、目前推荐使用的(此代码解决了上述的弊端)
--多材料扣除函数
function LuaFnMtl_CostMaterial(sceneId,selfId,nNum,nMaterial1,nMaterial2,nMaterial3,nMaterial4,nMaterial5,nMaterial6,nMaterial7,nMaterial8,nMaterial9)
local ret = 0 -- 最终返回结果,0表示扣除失败,1表示扣除成功
local nAllNum = nNum -- 剩余需要扣除的数量
local nHaveNum = 0 -- 当前材料的实际可用数量
-- 将所有材料放入一个列表中,方便循环处理
local nCostMaterial = {nMaterial1,nMaterial2,nMaterial3,nMaterial4,nMaterial5,nMaterial6,nMaterial7,nMaterial8,nMaterial9}
-- 获取当前所有材料拥有的总和数量
local nMaterialNum = LuaFnMtl_GetCostNum(sceneId,selfId,nMaterial1,nMaterial2,nMaterial3,nMaterial4,nMaterial5,nMaterial6,nMaterial7,nMaterial8,nMaterial9)
-- 如果需求的材料数量不足,直接返回0表示扣除失败
if nMaterialNum < nAllNum then
return 0
end
-- 遍历所有材料
for i = 1,getn(nCostMaterial) do
if nCostMaterial[i] ~= nil and nCostMaterial[i] > 0 then
local nHaveNum = LuaFnGetAvailableItemCount(sceneId,selfId,nCostMaterial[i])
if nHaveNum > nAllNum then
nHaveNum = nAllNum
end
LuaFnDelAvailableItem(sceneId,selfId,nCostMaterial[i],nHaveNum)
nAllNum = nAllNum - nHaveNum
if nAllNum <= 0 then
return 1 -- 如果剩余的需求数量已经为0,表示所有需求已经完成,返回1表示扣除成功
end
end
end
-- 如果遍历所有材料后仍未满足需求,返回0表示扣除失败
return ret
end
剩余 51% 内容需要支付 30.00
金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。