Jump to content

rateLoot em lua

Rate this topic


Recommended Posts

 

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"/>
Citar

no config.lua deixar o rateloot = 0

3. Imagem

6bHc2D4.png

 

Edited by felzan
Link to comment
https://xtibia.com/forum/topic/239190-rateloot-em-lua/
Share on other sites

A ideia foi: melhorar o que tem

independente se o servidor usa sistema de vip/premium, a criatividade pra usar o loot em lua é muito maior

 

Novo recorde de players = 2x exp/loot

faz quest e ganha anel da sorte, que da 5x loot

durante evento, tem chance de dropar crystal coin de qualquer monstro

 

basta criatividade agora.

Link to comment
https://xtibia.com/forum/topic/239190-rateloot-em-lua/#findComment-1684299
Share on other sites

Pessoal ficou parado no 0.x pois é "mais fácil" de iniciar o servidor.

 

Esse sistema (de loot via Lua) vai ser padrão do TFS daqui um tempo, pois eles (o Mark) pretendem passar tudo que não for da engine pra Lua.

Link to comment
https://xtibia.com/forum/topic/239190-rateloot-em-lua/#findComment-1684644
Share on other sites

  • 7 months later...
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...