--类似开箱子的道具,按怪物的掉落爆出物品 --添加配置 --#include "data\config\item\scriptItemConfig\RollItem.txt" once --#include "data\config\item\scriptItemConfig\PreUseItemConfig.txt" once --#include "data\functions\ItemEvent\ItemUseCount.txt" once function PreUseItem(sysarg, itemId, itemPtr, ItemTable) local cfg = PreUseItemConfig[itemId] if cfg then if cfg.startDt then local nNowDt = System.getCurrMiniTime() if nNowDt < cfg.startDt then Actor.sendTipmsg(sysarg, OldLang.Script.comm008, ttFlyTip) return false end end end return true end --[[ --按怪物掉落类似的配置Roll一个物品 --sysarg:实体的指针 --itemidx: 物品的ID --itemPtr: 物品的指针 --ItemTable: 配置的参数列表,如果单独调用的话,这里是需要背包格子的数量 --]] function RollItemFunc(sysarg,count,itemidx,itemPtr,ItemTable) for idx = 1, count do RollItemFuncImp(sysarg,itemidx,itemPtr,ItemTable) end return true end function RollItemFuncImp(sysarg,itemidx,itemPtr,ItemTable) --获取玩家目前有多少个空格子,如果格子不够,就返回 local count = Item.getBagEmptyGridCount(sysarg) local needGridCount=1 if( type( ItemTable ) == 'number' ) then needGridCount = ItemTable else needGridCount = ItemTable.needMinBagGrid end if(itemidx == 791)then --銮金宝箱 local nMyGuildId = Actor.getGuildId(sysarg) if(nMyGuildId < 1)then Actor.sendTipmsg( sysarg,OldLang.NoticeStr.n029, ttFlyTip ) return false end end --判断物品需要消耗的数目 local nNeedItemCount = ItemTable.itemCount if nNeedItemCount == nil then nNeedItemCount = 1 end local myItemCount = Actor.getItemCount(sysarg,itemidx,-1,-1) if myItemCount < nNeedItemCount then local tipMsg = string.format(OldLang.Script.comm009, nNeedItemCount) Actor.sendTipmsg( sysarg,tipMsg, ttFlyTip ) return false end if needGridCount and count < needGridCount then if ItemTable.needDelete and nNeedItemCount == myItemCount and (count +1)>= needGridCount then --允许删除item之后多空出一个格子来放roll出来的物品 else local tipMsg = string.format(OldLang.Script.comm001,needGridCount) Actor.sendTipmsg( sysarg,tipMsg,ttFlyTip ) return false end end if not PreUseItem(sysarg, itemidx,itemPtr,ItemTable) then return false end --需要roll一个物品 local dropName = "roll"..tostring(itemidx) --按名字索引的 local drop = System.getObjectVar(dropName) if (not drop) then System.trace("getObjectVar is nil"..itemidx) return end --[[ drop:drop(sysarg),怪物掉落模式,对于group>0的,是否出道具,除了判断propability的比率, 还受怪物死亡次数影响,即同group不一定必出; drop:proabilityDrop(sysarg),宝箱掉落模式,对于groupid>0的,是否出道具,仅判断propability的比率, 即同group必出一个 ]] --local items = drop:drop(sysarg) local items = drop:proabilityDrop(sysarg) --print("drop:proabilityDrop()...") for i = items.itemCount - 1, 0, -1 do local result = Actor.canGiveAward(sysarg, items.itemList[i].btAwardType, items.itemList[i].wItemId, items.itemList[i].btCount, items.itemList[i].btQuality, items.itemList[i].btStrong, items.itemList[i].btBind, true) if not result then return false end end --如果需要删除物品的话就删除 if ItemTable.needDelete then if ItemUseCountCfg[itemidx] then local lastTimes, maxTimes = getItemUseCount(sysarg, itemidx) if lastTimes <= 0 then Actor.sendTipmsg( sysarg, OldLang.Script.ItemUseCount001, ttFlyTip ) return end end local logDesc = OldLang.Script.comm007 local logId = 3 if itemPtr then local delCount = Actor.removeItemByPtr(sysarg,itemPtr,nNeedItemCount,true,logDesc, logId) local otherDelCount = nNeedItemCount - delCount if otherDelCount > 0 then Actor.removeItem(sysarg,itemidx,otherDelCount,-1,-1,-1, logDesc, logId) end else if nNeedItemCount ~= Actor.removeItem(sysarg,itemidx,nNeedItemCount,-1,-1,-1, logDesc, logId) then return false end end if ItemUseCountCfg[itemidx] then AddDailyItemUseCount(sysarg, itemidx, nNeedItemCount) end end --遍历掉落列表,并添加玩家的物品 if items.itemCount > 0 then for i=0, items.itemCount -1 do Actor.giveAward(sysarg, items.itemList[i].btAwardType, items.itemList[i].wItemId, items.itemList[i].btCount, items.itemList[i].btQuality, items.itemList[i].btStrong, items.itemList[i].btBind, items.itemList[i].nTime, 337, "roll", items.itemList[i].nQualityDataIndex) --nQualityDataIndex默认为0,此值需要>0才有效 if(items.itemList[i].btAuxParam ==1) then local count = items.itemList[i].btCount local name = Item.getAwardDesc(items.itemList[i].btAwardType,items.itemList[i].wItemId) if(name ~= nil and name ~= "") then if(items.itemList[i].btAwardType == 20) then --按经验表里配置经验的 count = Actor.getActivityExp(sysarg,items.itemList[i].wItemId,items.itemList[i].btCount,items.itemList[i].btQuality) end local tipMsg = string.format(OldLang.Script.comm006,Actor.getName(sysarg),Item.getItemName(itemidx),name,count ) --要全服广播 System.broadcastTipmsg(tipMsg, ttChatWindow ) end end end end return true end function RollItemsInit(sysarg) for i = 1,table.getn(RollItemConfig) do local x = RollItemConfig[i] --如果只执行爆率的话,那么就注册调用函数 if x.onlyDoRoll then GlobalItemFn[x.item_id] = { func = RollItemFunc,params =x } end --在初始化的时候全部装载进来 ,避免后期临时去加载 local dropName = "roll"..tostring(x.item_id) local boxdrop = System.getObjectVar(dropName) if not boxdrop then boxdrop = CBoxDropMgr:getSingleton():createBoxDrop(dropName) -- 这里会返回一个宝箱掉落对象(CBoxDrop) end if boxdrop then boxdrop:load(x.dropName) end end end table.insert(InitFnTable,RollItemsInit)