Ir para conteúdo

Toruk

Membro
  • Registro em

  • Última visita

Tudo que Toruk postou

  1. Deve ser feito na pasta events/scripts/monsters. Local onde faz a geração do loot: https://github.com/opentibiabr/canary/blob/main/data/events/scripts/monster.lua#L23-L34 Basta adicionar o item no "local item"
  2. Poste a alteração feita e os erros obtidos, pra que eu possa ajudar.
  3. Não precisa fazer essa gambiarra não. Tfs 1+ tem a função Monster:onDropLoot(corpse), da pra alterar nela direto.
  4. Só ir na pasta em que está a pasta "src" e dar o comando: mkdir build && cd build && cmake .. && make
  5. Entedi, só mudar o target:transform(12706), por: target:remove() Game.createItem(12706, 1, toPosition) Script inteiro: local rewards = { { item = 8298, count = 1, chance = 50 }, { item = 8299, count = 1, chance = 50 }, { item = 8301, count = 1, chance = 50 }, { item = 8302, count = 1, chance = 50 }, { item = 8303, count = 1, chance = 50 }, { item = 8310, count = 1, chance = 50 }, { item = 9971, count = 1, chance = 50 }, { item = 5944, count = 1, chance = 100 } } local storage = 5000 local delay_timer = 5 function onUse(player, item, fromPosition, target, toPosition, isHotkey) local cur_time, cur_storage = os.time(), player:getStorageValue(storage) if cur_storage > cur_time then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can mining again in " .. os.date("!%Hh %Mm %Ss", cur_storage - cur_time) .. ".") return true end local function addBackStone() local tRocks = getTileItemById(toPosition, 12706) if tRocks then doRemoveItem(tRocks.uid, 1) local stones = {12705} local stone = Game.createItem(stones[math.random(#stones)], 1, toPosition) if stone then stone:setActionId(40041) end end end if not target then return false end if not target:isItem() then return false end if target.actionid ~= 40041 then local pos = player:getPosition() player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You cannot use it here.') return false end if target.actionid == 40041 then local ran = math.random(100) if ran <= 10 then toPosition:sendMagicEffect(3) target:remove() Game.createItem(12706, 1, toPosition) addEvent(addBackStone, 120000) return true end end local text = "You have found " for i = 1, #rewards do local rand = math.random(1000) if rand <= rewards[i].chance then player:addItem(rewards[i].item, rewards[i].count) if text ~= "You have found " then text = text .. ", " end text = text .. rewards[i].count .. " " .. ItemType(rewards[i].item):getName() end end if text == "You have found " then text = text .. "nothing" end player:sendTextMessage(36, text .. ".") cur_time = cur_time + delay_timer player:setStorageValue(storage, cur_time) return true end
  6. N sei se eu entnendi, mas ele n ta setando o AID? Se for isso, tente por um if no createItem da stone, na função addBackStone(): Se n for isso, tente explicar melhor oque ta ocorrendo, pq eu n to com nenhum sv baixado pra testar local function addBackStone() local tRocks = getTileItemById(toPosition, 12706) if tRocks then doRemoveItem(tRocks.uid, 1) local stones = {12705} local stone = Game.createItem(stones[math.random(#stones)], 1, toPosition) if stone then stone:setActionId(40041) end end end
  7. Da uma testada ai. Eu acho q vai funcionar assim. local rewards = { { item = 8298, count = 1, chance = 50 }, { item = 8299, count = 1, chance = 50 }, { item = 8301, count = 1, chance = 50 }, { item = 8302, count = 1, chance = 50 }, { item = 8303, count = 1, chance = 50 }, { item = 8310, count = 1, chance = 50 }, { item = 9971, count = 1, chance = 50 }, { item = 5944, count = 1, chance = 100 } } local storage = 5000 local delay_timer = 5 function onUse(player, item, fromPosition, target, toPosition, isHotkey) local cur_time, cur_storage = os.time(), player:getStorageValue(storage) if cur_storage > cur_time then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can mining again in " .. os.date("!%Hh %Mm %Ss", cur_storage - cur_time) .. ".") return true end local function addBackStone() local tRocks = getTileItemById(toPosition, 12706) if tRocks then doRemoveItem(tRocks.uid, 1) local stones = {12705} local stone = Game.createItem(stones[math.random(#stones)], 1, toPosition) stone:setActionId(40041) end end if not target then return false end if not target:isItem() then return false end if target.actionid ~= 40041 then local pos = player:getPosition() player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You cannot use it here.') return false end if target.actionid == 40041 then local ran = math.random(100) if ran <= 10 then toPosition:sendMagicEffect(3) target:transform(12706) addEvent(addBackStone, 120000) return true end end local text = "You have found " for i = 1, #rewards do local rand = math.random(1000) if rand <= rewards[i].chance then player:addItem(rewards[i].item, rewards[i].count) if text ~= "You have found " then text = text .. ", " end text = text .. rewards[i].count .. " " .. ItemType(rewards[i].item):getName() end end if text == "You have found " then text = text .. "nothing" end player:sendTextMessage(36, text .. ".") cur_time = cur_time + delay_timer player:setStorageValue(storage, cur_time) return true end
  8. Só por o script em data/scripts/creaturescripts: ** Lembre que o script tem que ser escrito em lua (sem por nada em XML) ** local table = { -- [level] = type = "item", id = {ITEM_ID, QUANTIDADE}, msg = "MENSAGEM"}, -- [level] = type = "bank", id = {QUANTIDADE, 0}, msg = "MENSAGEM"}, -- [level] = type = "addon", id = {ID_ADDON_FEMALE, ID_ADDON_MALE}, msg = "MENSAGEM"}, -- [level] = type = "mount", id = {ID_MOUNT, 0}, msg = "MENSAGEM"}, [20] = {type = "item", id = {2160, 2}, msg = "Voce ganhou 2 crystal coins por alcancar o level 20!"}, [30] = {type = "bank", id = {20000, 0}, msg = "Foi depositado em seu bank 20000 gold coints!"}, [40] = {type = "addon", id = {136, 128}, msg = "Voce ganhou o addon citizen full por alcancar o level 40!"}, [60] = {type = "mount", id = {2, 0}, msg = "Voce ganhou a montaria x!"}, } local storage = 15000 local event = CreatureEvent("advanceRewards") function event.onAdvance(player, skill, oldLevel, newLevel) if skill ~= SKILL_LEVEL or newLevel <= oldLevel then return true end for level, _ in pairs(table) do if newLevel >= level and player:getStorageValue(storage) < level then if table[level].type == "item" then player:addItem(table[level].id[1], table[level].id[2]) elseif table[level].type == "bank" then player:setBankBalance(player:getBankBalance() + table[level].id[1]) elseif table[level].type == "addon" then player:addOutfitAddon(table[level].id[1], 3) player:addOutfitAddon(table[level].id[2], 3) elseif table[level].type == "mount" then player:addMount(table[level].id[1]) else return false end player:sendTextMessage(MESSAGE_EVENT_ADVANCE, table[level].msg) player:setStorageValue(storage, level) end end player:save() return true end event:register()
  9. Poste o script para que alguém consiga ajuda-lo.
  10. Só ir em data/events/scripts/players.lua e na função player::onMoveItem vc adiciona: local tile = Tile(toPosition) if tile then if tile:getDownItemCount() >= 10 then return false end end
  11. Na verdade ta td certo, a unica coisa que fez “bugar” a compilação é q o ubuntu 18.04 instala o libfmt-dev na versão 4.0.0, sendo que no Cmakelists.txt está setado a versão mínima 6.1.2 (que é a versão do libfmt-dev no ubuntu 20.04). Você tem 2 opções para corrigir isso: a primeira seria usar o OS ubuntu 20.04 que evitaria bugs e não precisaria alterar nada. A segunda seria mudar a versão do libfmt no Cmakelists.txt para a versão do ubuntu e compilar o servidor em debug e ver se funcionará td certinho.
  12. Primeiramente, qual o motivo de usar o ID de uma parede na store? Se for isso, logicamente não irá ser adicionado no store inbox. Vc deve escolher um item que tenha a propriedade móvel, só procurar em data/items/items.xml, um exemplo é o premium scroll (id: 14758), que é um item sem funcionalidade atualmente e pode ser usadp para o vip. Em relação a action, não tem como eu saber oque está ocorrendo errado. Como vc pode ver no script, tem uma função custom "player:addVipDays(days)", portanto você deverá postar essa function para que eu consiga ver oque está errado e talvez dar uma ideia em como resolver.
  13. Tmj man. Mas infelizmente eu não consigo ficar ajudando em pv. Entro aqui de vez em nunca pra ajudar alguém por ai, até porque eu já fui um adm que fazia as perguntas e não sabia nada de lua. Mas é isso ai. Desejo sucesso com o seu server! Abraço man.
  14. Tem, basta criar um "local" para determinar a somatória de proteção dos itens e ir acrescentando conforme o item, vou dar um exemplo em seu script. Usei 3 exemplos: armor, legs e backpack. Raciocínio do script: O se o player n tiver nenhum dos itens, vai passar "armorProtection = 1" para o final do scripts e vai tomar o dano multiplicado por 1, que seria o dano por inteiro. Conforme ele vai tendo as partes do set, ele vai diminuindo o "armorProtection em 0,1", isso fará com que o dano final seja multiplicado por 1 valor menor ainda (Ex: se tiver 2 itens, vai ser multiplicado por 0.8, ou seja, 80% do valor total). Para adicionar mais partes da armadura é só ir seguindo o mesmo raciocínio e ir colocando conforme desejar. O nome de cada slot pode ser visto em creature.h do seu tfs, mas em geral, são sempre os mesmos: https://github.com/otland/forgottenserver/blob/master/src/creature.h#L24-L41 local areas = { {leftUpPoint = {x = 31815, y = 32206, z = 7}, rightDownPoint = {x = 32070, y = 32425, z = 7}, minHit = 300, maxHit = 600, armorID = 15000, legsID = 15001, backpackID = 15002, }, } function onThink(interval, lastExecution, thinkInterval) for id, arr in pairs(areas) do for x = arr.leftUpPoint.x, arr.rightDownPoint.x do for y = arr.leftUpPoint.y, arr.rightDownPoint.y do for z = arr.leftUpPoint.z, arr.rightDownPoint.z do local pos = {x = x, y = y, z = z} local uid = getTopCreature(pos).uid if isPlayer(uid) then local player = Player(uid) --- START ARMOR PROTECTION --- local armorProtection = 1 -- 100% damage --- Check Armor --- local armor = player:getSlotItem(CONST_SLOT_ARMOR) if armor and armor:getId() == arr.armorID then armorProtection = armorProtection - 0.1 -- remove 10% end --- Check Legs --- local legs = player:getSlotItem(CONST_SLOT_LEGS) if legs and legs:getId() == arr.legsID then armorProtection = armorProtection - 0.1 -- remove 10% end --- Check Backpack --- local bp = player:getSlotItem(CONST_SLOT_BACKPACK) if bp and bp:getId() == arr.backpackID then armorProtection = armorProtection - 0.1 -- remove 10% end --- END PROTECTION --- local finalDamage = math.random(arr.minHit, arr.maxHit) doCreatureAddHealth(uid, -finalDamage*armorProtection) doSendMagicEffect(pos, 8) end end end end end return true end
  15. Eu n entendi bem oque você quer fazer, mas respondendo a uma das dúvidas pontudas (duplicate action): O id duplicado sempre acontece quando 2 scripts distintos estiverem sendo executados em um mesmo item, ex: o id 16101 está sendo executado no script de VIP e nesse muck remover. E para corrigir isso é só remover a action em algum script. Observação: Esse ID (16101) está incorretamente setado no scripts muck_remover, como mostra no link: (O ID correto do muck remover é 18395, portanto basta vc corrigir isso e usar o outro ID em seu script). https://github.com/opentibiabr/otservbr-global/blob/main/data/scripts/actions/other/muck_remover.lua#L40
  16. Exemplo de como fazer um "check" de armadura: Sendo 2500 o id do item que está no slot da armor e 0.5 a porcentagem do dano que o player irá receber (nesse caso, 50%). local player = Player(uid) local random = math.random(arr.minHit, arr.maxHit) local armor = player:getSlotItem(CONST_SLOT_ARMOR) if armor and armor:getId() == 2500 then doCreatureAddHealth(uid, -random*0.5) doSendMagicEffect(pos, 8) return true end
  17. Ao fazer o upgrade de tfs, você terá que adaptar várias coisas, como a nova pasta data/events, e grande parte dos scripts (alguns poderão até funcionar normalmente, porém outros podem gerar erros e não executarem de forma incorreta). Para fazer a adaptação desses scripts não demanda de um grande conhecimento, mas é algo trabalhoso. Concluindo, eu meu ponto de vista, se você não deseja editar a parte lua do server, recomendo que não realize a troca da versão do tfs. Pois scripts não compatível poderão causar crashs, lags e bugs.
  18. Negativo. Foi o “else+return” que fez travar. Explicação: você fez uma condição que apenas o top 1 ao logar passasse pela condição de forma correta. Porem, ao adicionar um else, todos que não fossem top 1 iriam dar return ao logar, ou seja, o creaturescript iria fazer com que não fosse possivel logar.
  19. local config = { effect = 30, -- Efeito que vai usar storage = 998899, -- Storage que o player precisa ter tempo = 3, -- Tempo em segundos 1200 - 20 minutos text = 'TRK' } local PremiumEfect = CreatureEvent("PremiumEfect") function PremiumEfect.onLogin(player) player:registerEvent("PremiumEfect") if player:getStorageValue(config.storage) == 1 then SendEffect(player:getId()) end return true end function SendEffect(cid) local player = Player(cid) if not player then return end player:getPosition():sendMagicEffect(config.effect) player:say(config.text, TALKTYPE_MONSTER_SAY) addEvent(SendEffect, config.tempo*1000, player:getId()) return true end PremiumEfect:register()
  20. ALTER TABLE `z_shop_offer` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
  21. Link da src q eu falei: https://github.com/TGODIAS/optimized_forgottenserver
  22. Na minha opinião, a melhor coisa a se fazer se for iniciar um projeto é buscar um executável base mais otimizado e estável possível. Isso irá poupar muita dor de cabeça futuramente. (Recomendo o tfs 1.3 do saiyansking) Em relação as linguagens, eu aconselho a focar na parte da edição da src (para fazer implementações ou edits) e na linguagem lua (creio q será a mais usada por você). A XML vai usar bem pouco. E, a PHP e HTML não será usado no início do projeto, visto que, da pra usar um website base para fazer as funções essenciais, como criação de conta, personagem, etc.
  23. Toruk postou uma resposta no tópico em Suporte Tibia OTServer
    Uma mudança simples q eu ja vi muitos servidores usando é utilizar “exp * 0.1” na função Player: onGainExperience. Isso fará com q o stage seja apenas 10% do valor indicado por você. Portanto, se vc quiser uma exp 10x, teria q por o stage 100x. Ou então, exp rate de 0.5x, apenas por 5x nos stages.
  24. Se for fazer pela src deverá ser editado o "bool Game::combatChangeHealth" no game.cpp.
  25. Toruk postou uma resposta no tópico em Suporte Tibia OTServer
    Use “db.storeQuery”.

Informação Importante

Confirmação de Termo