Tudo que Toruk postou
-
Global Loot (Adicionar drop em todos os monsters onDeath)
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"
-
Global Loot (Adicionar drop em todos os monsters onDeath)
Poste a alteração feita e os erros obtidos, pra que eu possa ajudar.
-
Global Loot (Adicionar drop em todos os monsters onDeath)
Não precisa fazer essa gambiarra não. Tfs 1+ tem a função Monster:onDropLoot(corpse), da pra alterar nela direto.
-
Ajudar para compilar source
Só ir na pasta em que está a pasta "src" e dar o comando: mkdir build && cd build && cmake .. && make
-
[Ajuda] Modificar script de mineração!
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
-
[Ajuda] Modificar script de mineração!
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
-
[Ajuda] Modificar script de mineração!
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
-
(Ajuda) creaturescripts
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()
-
(PROMOTION) SERVER 12.61
Poste o script para que alguém consiga ajuda-lo.
-
TFS 1.3 - Limite de itens no sqm
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
-
(Resolvido)Erro ao compilar TFS 1.X Ubuntu 18.04
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.
-
[AJUDA] Criação de item para adicionar VIP, Adquirido na Store do jogo com Tibia Coin
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.
-
[Ajuda] Criar uma armadura que diminui em porcentagem o dano desse script:
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.
-
[Ajuda] Criar uma armadura que diminui em porcentagem o dano desse script:
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
-
[AJUDA] Criação de item para adicionar VIP, Adquirido na Store do jogo com Tibia Coin
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
-
[Ajuda] Criar uma armadura que diminui em porcentagem o dano desse script:
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
-
(Resolvido)Duvida Sobre Upgrade de TFS
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.
-
(Resolvido)Top Effect Problema só top loga
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.
-
effect player vip/premium
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()
-
Erro database... Gerando sempre o mesmo id
ALTER TABLE `z_shop_offer` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=1;
-
Pokétibia do Zero
Link da src q eu falei: https://github.com/TGODIAS/optimized_forgottenserver
-
Pokétibia do Zero
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.
-
Exp stage
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.
-
Nao aparece hp e mp - so mp
Se for fazer pela src deverá ser editado o "bool Game::combatChangeHealth" no game.cpp.
-
db.getResult TFS 1.2
Use “db.storeQuery”.