Files
chuanqi-server-instance/LogicServer/data/functions/ItemEvent/RollItem.txt
2024-12-16 20:45:03 +08:00

195 lines
6.3 KiB
Plaintext
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--类似开箱子的道具,按怪物的掉落爆出物品
--添加配置
--#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)