找回密码
 register

QQ登录

只需一步,快速开始

查看: 1215|回复: 0

[魔改引擎] LuaFnMtl_CostMaterial() 同时扣除多个物品函数

[复制链接]

[魔改引擎] LuaFnMtl_CostMaterial() 同时扣除多个物品函数

[复制链接]
  • 打卡等级:热心大叔
  • 打卡总天数:94
  • 打卡月天数:17
  • 打卡总奖励:94
  • 最近打卡:2025-01-18 01:28:20
Waylee

主题

0

回帖

1万

积分

仙帝

积分
11929
Waylee 2021-5-23 19:48 | 显示全部楼层 |阅读模式

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?register

×

更新时间: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

返回值

  • 扣除失败返回0
  • 扣除成功返回1

特性: 是不管物品是否足够,一律扣除物品。多个物品参数时 优先扣除前一个,第一个不足时扣除个二个参数,以此类推。

***付费内容***

自写函数(纯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 金币 后可完整阅读
支持付费阅读,激励作者创作更好的作品。
您需要登录后才可以回帖 登录 | register

本版积分规则

雪舞知识库 | 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 |天天打卡

GMT+8, 2025-1-18 16:03 , Processed in 0.099226 second(s), 7 queries , Redis On.

Powered by XueWu Licensed

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表