Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Gente gostaria de ajuda pra passar esse código para funcionar no TFS 1.0

REWARD_CHEST = {
BOSSES = {"Bibby Bloodbath", "Chizzoron the Distorter", "Ferumbras",
"Furyosa", "Gaz'haragoth", "Ghazbaran", "Hirintror",
"Jaul", "Mad Mage", "Mawhawk", "Morgaroth", "Obujos",
"Ocyakao", "Omrafir", "Orshabaal", "Raging Mage",
"Tanjis", "The Mutated Pumpkin", "The Pale Count",
"The Welter", "Tyrn", "White Pale", "Zulazza the Corruptor",
"Zushuka"},
LOOT = {},
DECAY = {},
DEPOT_ID = 99,
CONTAINER = 21518,
EXPIRE = 7*24*60*60, --days to erase stored rewards
STORAGE = 18394, --player storage for chest exhaustion
EXHAUST = 5*60, --time allowed to use again the chest
}

function table.find(t, value, sensitive)
local sensitive = sensitive or true
if(not sensitive and type(value) == 'string') then
for i, v in pairs(t) do
if(type(v) == 'string') then
if(v:lower() == value:lower()) then
return i
end
end
end
return nil
end
for i, v in pairs(t) do
if(v == value) then
return i
end
end
return nil
end

function table.serialize(x, recur)
local t = type(x)
recur = recur or {}
if(t == nil) then
return "nil"
elseif(t == "string") then
return string.format("%q", x)
elseif(t == "number") then
return tostring(x)
elseif(t == "boolean") then
return x and "true" or "false"
elseif(getmetatable(x)) then
error("Can not serialize a table that has a metatable associated with it.")
elseif(t == "table") then
if(table.find(recur, x)) then
error("Can not serialize recursive tables.")
end
table.insert(recur, x)
local s = "{"
for k, v in pairs(x) do
s = s .. "[" .. table.serialize(k, recur) .. "]" .. " = " .. table.serialize(v, recur) .. ", "
end
return s:sub(0, s:len() - 2) .. "}"
end
error("Can not serialize value of type '" .. t .. "'.")
end

function table.unserialize(str)
return loadstring('return ' .. str)()
end

function addContainerItems(container, items)
for k, v in pairs(items) do
if ItemType(k):isContainer() then
local newBag = Container(doCreateItemEx(k, 1))
addContainerItems(newBag, v)
container:addItemEx(newBag)
else
container:addItem(v[1], v[2])
end
end
end

function MonsterType.createLootItem(self, lootBlock, chance)
local lootTable, itemCount = {}, 0
local randvalue = math.random(0, 100000) / (getConfigInfo("rateLoot") * chance)
if randvalue < lootBlock.chance then
if (ItemType(lootBlock.itemId):isStackable()) then
itemCount = randvalue % lootBlock.maxCount + 1
else
itemCount = 1
end
end

while itemCount > 0 do
local n = math.min(itemCount, 100)
itemCount = itemCount - n
table.insert(lootTable, {lootBlock.itemId, n})
end

return lootTable
end

function MonsterType.getBossReward(self, chance)
local result = {}
if getConfigInfo("rateLoot") > 0 then
for _, loot in pairs(self:getLoot()) do
local itemList = self:createLootItem(loot, chance)
if itemList then
for _, item in ipairs(itemList) do
table.insert(result, item)
end
end
end
end
return result
end

function getDecayTime(id)
local decayTime = 0
do
local o = io.open('data/items/items.xml','r')
file = o:read('*a')
o:close()
end
local function sumDecayTime(corpse)
for attr in file:gmatch('<item.-id="' .. corpse ..'"(.-)</item>') do
local decayTo = attr:match('<attribute.-key="decayTo".-value="(.-)".-/>')
local duration = attr:match('<attribute.-key="duration".-value="(.-)".-/>')
decayTime = decayTime + duration
if tonumber(decayTo) > 0 then
sumDecayTime(decayTo)
end
break
end
end
sumDecayTime(id)
return decayTime
end

function loadCorpses()
for _, name in ipairs(REWARD_CHEST.BOSSES) do
if MonsterType(name) ~= nil then
REWARD_CHEST.DECAY[name] = getDecayTime(MonsterType(name):getCorpseId())
end
end
end
addEvent(loadCorpses, 0)

function getPlayerByGUID(guid)
for _, player in ipairs(Game.getPlayers()) do
if guid == player:getGuid() then
return player
end
end
return nil
end

function Player.addReward(self, reward, time, id)
local LootBag = Container(doCreateItemEx(REWARD_CHEST.CONTAINER, 1))
LootBag:setAttribute('text', time)
addContainerItems(LootBag, reward)
if id then
db.query('DELETE FROM player_rewardchest WHERE id = ' .. id .. ';')
end
return self:getDepotChest(REWARD_CHEST.DEPOT_ID, true):addItemEx(LootBag)
end

function doSaveReward(uid, name)
for GUID, items in pairs(REWARD_CHEST.LOOT[uid]) do
local player = getPlayerByGUID(GUID)
if player ~= nil then
player:addReward(items, os.time())
player:sendTextMessage(MESSAGE_INFO_DESCR, 'Your reward container from ' .. name .. ' was moved to your reward chest.')
else
db.query('INSERT INTO player_rewardchest VALUES (NULL, ' .. GUID ..', "' .. table.serialize(items) ..'", ' .. os.time() ..');')
end
end
REWARD_CHEST.LOOT[uid] = nil
end

function Player.updateRewardChest(self)
db.query('DELETE FROM player_rewardchest WHERE TIME_TO_SEC(TIMEDIFF(NOW(), FROM_UNIXTIME(date))) >= '.. REWARD_CHEST.EXPIRE ..';')
local Query = db.storeQuery('SELECT id, reward, date FROM player_rewardchest WHERE player_id = '.. self:getGuid() ..';')
if Query ~= false then
repeat
local rewardBag = table.unserialize(result.getDataString(Query, 'reward'))
self:addReward(rewardBag, result.getDataInt(Query, 'date'), result.getDataInt(Query, 'id'))
until not result.next(Query)
result.free(Query)
end
local depotChest = self:getDepotChest(REWARD_CHEST.DEPOT_ID, true)
for index = (depotChest:getSize() - 1), 0, -1 do
local container = depotChest:getItem(index)
if (container:getAttribute('text') ~= nil) and (tonumber(container:getAttribute('text')) + REWARD_CHEST.EXPIRE < os.time()) then
container:remove()
end
end
return self:setExhaustion(REWARD_CHEST.STORAGE, REWARD_CHEST.EXHAUST)
end

function string.diff(self)
local format = {
{'day', self / 60 / 60 / 24},
{'hour', self / 60 / 60 % 24},
{'minute', self / 60 % 60},
{'second', self % 60}
}

local out = {}
for k, t in ipairs(format) do
local v = math.floor(t[2])
if(v > 0) then
table.insert(out, (k < #format and (#out > 0 and ', ' or '') or ' and ') .. v .. ' ' .. t[1] .. (v ~= 1 and 's' or ''))
end
end
local ret = table.concat(out)
if ret:len() < 16 and ret:find('second') then
local a, b = ret:find(' and ')
ret = ret:sub(b+1)
end
return ret
end

function doBossReward(monster, corpse)
REWARD_CHEST.LOOT[corpse:getUniqueId()] = {}
corpse:setAttribute('aid', 21584)
corpse:setAttribute('text', corpse:getUniqueId())
for killer, damage in pairs(monster:getDamageMap()) do
local player, str = Player(killer), 'Loot of ' .. MonsterType(monster:getName()):getNameDescription() .. ': '
if player ~= nil then
local rewardBag = doCreateItemEx(REWARD_CHEST.CONTAINER)
if player:getStamina() > 840 then
local loot = MonsterType(monster:getName()):getBossReward(damage.total/monster:getMaxHealth())
if #loot > 0 then
addContainerItems(Container(rewardBag), loot)
REWARD_CHEST.LOOT[corpse:getUniqueId()][player:getGuid()] = loot
str = str .. Container(rewardBag):getContentDescription()
else
str = str .. 'nothing'
end
else
str = str .. 'nothing (due to low stamina)'
end
player:sendTextMessage(MESSAGE_INFO_DESCR, str .. '.')
end
end
addEvent(doSaveReward, REWARD_CHEST.DECAY[monster:getName()]*1000, corpse:getUniqueId(), MonsterType(monster:getName()):getNameDescription())
end

function onKill(creature, target)
if (Monster(target) ~= nil) and isInArray(REWARD_CHEST.BOSSES, target:getName()) then
local corpse = Item(doCreateItem(MonsterType(target:getName()):getCorpseId(), 1, target:getPosition()))
corpse:decay()
target:setDropLoot(false)
doBossReward(target, corpse)
end
end

Aparece o seguinte erro:

Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/reward_chest.lua:onKill
data/creaturescripts/scripts/reward_chest.lua:249: attempt to index local 'target' (a number value)
stack traceback:
    [C]: in function '__index'
    data/creaturescripts/scripts/reward_chest.lua:249: in function <data/creaturescripts/scripts/reward_chest.lua:248>

Estou tentando fazer o sistema de reward boss igual do tibia RL.

Me ajudem ai

Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por LasseXeterno
      Então, estou tentando adicionar uma nova "race" no meu Ot de base Cyan, tentei seguir 3 tutoriais aqui do tibiaking, um sobre race, porém nos códigos do meu servidor não tem o constant.h e nem o monster.cpp. E o outro tutorial, eu fiz tudo que ele pediu e quando entrei no game para testar, funcionava os golpes e as imunidades, porém não aparecia o número do dano e nem a cor.  Usei esse tutorial como base: 
      Pois ele é derivado. E o outro tutorial que usei foi: 
      Porém nesse, não consegui achar a const.h, e quando fui nos arquivos do creaturescript e adicionei uma cor nova a "COLOR_FAIRY", quando abro o jogo, os pokemons que seriam teoricamente "fada", o que eu usei de teste foi a Clefable. A Clefable tomava IK e dava IK no seu atk do tipo fada. 
      Além de que, o meu erro principal é esse: Warning - Monsters::loadMonster] Unknown race type fairy. (data/monster/pokes/geracao 1/Clefable.xml)
       Pois como eu já disse, não consigo achar onde adicionar uma nova race.

    • Por yuriowns
      Salve rapazes, tranquilo? Preciso de ajuda pra colocar para os npc's que vendem pots verificarem quantos itens possuem no tile em que o player está e se tiver com +80 itens no sqm, o npc avisa e não vende nada até o player ir em um sqm com menos de 80 itens no chão.
       
    • Por A.Mokk
      .Qual servidor ou website você utiliza como base? 
      TFS 0.4
      Qual o motivo deste tópico? 
      Bom pessoal, a algumas semanas atras eu joguei um servidor que havia sistema de imbuimento sendo 8.60, no servidor se utilizava a spellwand para encantar as armas, os comandos eram dado no canal Imbuiment... Gostaria de saber se alguém teria como disponibilizar algum sistema de imbuimento, já procurei pra caramba aqui no fórum mas tudo que encontro é pra versões acima da que eu uso.
       
    • Por Mateus Robeerto
      Não sei se aqui é a área ou algum local para solicitar a alteração do email antigo... Não lembro mais a senha dele, nem a resposta secreta para acessar. Peço a algum administrador ou moderador para, por favor, alterar o email para o novo.
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo