Ir para conteúdo

rateLoot em lua


felzan

Posts Recomendados

 

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

 

Editado por felzan
Link para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros 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 para o comentário
Compartilhar em outros sites

  • 7 months later...
  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...