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