1. O que é?
Script que controla a rateLoot. Significa que pode conceder um bonus de loot (double loot) sem reiniciar o servidor, pode dar mais loot pra premium, mais loot se o player tiver tal item, ou tal storage.
2. Script
Citar--[[rateLoot handled in Lua by felzanno config.lua deixar o rateloot = 0player:getRateLoot()player:setRateLoot()]]local rateLoot = 2 -- chance do lootlocal divideByNewLine = true -- dividir texto de loot com nova linha a cada itemlocal sumItems = true -- soma items iguais (ex: 187 gold coins)local showPartyPrefix = true -- mostrar quem matou na partylocal reduceRateLootOnLowStamina = false -- reduzir o loot se sem staminalocal bonusWithStorageRateLoot = 1.05 -- multiplicador de loot por storagelocal bonusStorage = 99889 -- storage do multiplicadorlocal bonusWithItemRateLoot = 1 --multiplicador de loot por itemlocal bonusItemId = 2357 -- item do multiplicador por itemlocal bonusItemSlot = CONST_SLOT_RING -- slot do itemlocal bonusPremium = 1.3 -- multiplicador de loot se premiumlocal showEffectRareItem = true -- mostrar efeito ao dropar item rarolocal chanceToBeRare = 1000 -- quantidade para ser rarolocal effectRareItem = CONST_ME_FIREWORK_BLUE -- efeito do item raromath.randomseed(os.time()) --deafult seedlocal function addSameId(lootArray) for t,i in pairs(lootArray.item) do for k,v in pairs(lootArray.item) do if k ~= t then if lootArray.item[k] == lootArray.item[t] then lootArray.count[t] = lootArray.count[t] + lootArray.count[k] table.remove(lootArray.item, k) table.remove(lootArray.count, k) end end end end return lootArrayendlocal function sendTextLootMessage(parameters, lootArray) local lootMessage = '' local lootMessageParty = '' local lootMessagePrefix = '' local lootMessageItems = ' ' local divisor = ', ' local final = '.' local init = '' local prefixParty = '' if divideByNewLine then divisor = '\n' init = '\n' end if showPartyPrefix then prefixParty = string.upper(string.sub(parameters.cid:getName(), 1, 1)) .. (string.sub(parameters.cid:getName(), 2)) .. '--> ' end lootMessagePrefix = 'Loot of ' .. parameters.name .. ':' if #lootArray.item == 0 then if parameters.cid:getStamina() <= 800 then lootMessageItems = ' nothing (due to low stamina)' .. final else lootMessageItems = ' nothing' .. final end else lootMessageItems = lootMessageItems .. init for y = #lootArray.item, 1, -1 do local count = lootArray.count[y] local pluralName = ItemType(lootArray.item[y]):getPluralName() local article = ItemType(lootArray.item[y]):getArticle() local name = ItemType(lootArray.item[y]):getName() if count == 1 then count = '' pluralName = '' else article = '' name = '' end lootMessageItems = lootMessageItems .. count .. article .. ' ' .. pluralName .. name if y == 1 then lootMessageItems = lootMessageItems .. final else lootMessageItems = lootMessageItems .. divisor end end end lootMessage = lootMessagePrefix .. lootMessageItems lootMessageParty = prefixParty .. lootMessage if parameters.cid:getId() == parameters.corpse:getAttribute(ITEM_ATTRIBUTE_CORPSEOWNER) then if parameters.party then for i = 1, #parameters.partyMembers do if parameters.partyMembers[i] == parameters.cid then parameters.partyMembers[i]:sendTextMessage(MESSAGE_INFO_DESCR, lootMessage) else parameters.partyMembers[i]:sendTextMessage(MESSAGE_INFO_DESCR, lootMessageParty) end end else parameters.cid:sendTextMessage(MESSAGE_INFO_DESCR, lootMessage) end endendlocal function addItem(parameters) local lootArray = {item = {}, count = {}} parameters.corpse = Tile(parameters.position):getItemById(parameters.corpseId) local maxChance = 100000 -- default -- sem loot devido stamina if reduceRateLootOnLowStamina then if parameters.cid:getStamina() <= 800 then return sendTextLootMessage(parameters, lootArray) end end for item = #parameters.loot, 1, -1 do local chosed = math.random(1, maxChance/(rateLoot * bonusPremium * bonusWithItemRateLoot * bonusWithStorageRateLoot)) local count = chosed % parameters.loot[item].maxCount + 1 if count > parameters.loot[item].maxCount then count = parameters.loot[item].maxCount end if chosed <= parameters.loot[item].chance then --mostra efeito raro if showEffectRareItem then if chosed <= chanceToBeRare and parameters.loot[item].chance <= chanceToBeRare then print(chanceToBeRare, chosed, parameters.loot[item].chance) parameters.position:sendMagicEffect(effectRareItem) end end -- adiciona itens no corpse parameters.corpse:addItem(parameters.loot[item].itemId, count) table.insert(lootArray.item, parameters.loot[item].itemId) table.insert(lootArray.count, count) end end if sumItems then sendTextLootMessage(parameters, addSameId(lootArray)) else sendTextLootMessage(parameters, lootArray) endendfunction onKill(cid, target, lastHit) if getConfigInfo("rateLoot") > 0 then return false end if not target:isMonster()then return true end if target:getMaster() then return false end local parameters = {} parameters.cid = cid parameters.position = target:getPosition() parameters.name = MonsterType(target:getName()):getNameDescription() parameters.corpseId = MonsterType(target:getName()):getCorpseId() parameters.corpse = Tile(parameters.position):getItemById(parameters.corpseId) parameters.loot = MonsterType(target:getName()):getLoot() parameters.party = cid:getParty() parameters.partyMembers = {} if not ItemType(parameters.corpseId):isContainer() then return false end if parameters.corpseId < 1 then return false end if ItemType(target:getName()):isContainer() then return false end if parameters.party then local leader = parameters.party:getLeader() local member = parameters.party:getMembers() local party = member table.insert(party, leader) for i = 0, #party do parameters.partyMembers[i] = party[i] end end addEvent(addItem, 1, parameters) return trueendfunction onLogin(player) player:registerEvent("rateLoot") return trueend
2.1 Configurar
Para configurar é bem simples, tem a maior parte das variáveis no topo do script com explicações
em creaturescripts.lua
Citar<event type="kill" name="rateLoot" script="rateloot.lua"/>
<event type="login" name="rateLootLogin" script="rateloot.lua"/>
Citarno config.lua deixar o rateloot = 0
3. Imagem