This commit is contained in:
aixianling
2024-12-13 13:41:02 +08:00
commit 06658f112f
3887 changed files with 2687822 additions and 0 deletions

View File

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