Ir para conteúdo

Yan Oliveira

Moderador
  • Total de itens

    2221
  • Registro em

  • Última visita

  • Dias Ganhos

    60

Tudo que Yan Oliveira postou

  1. Entendi! Obrigado pelo conselho e pelas dicas, estou aprimorando meu C++ (que ainda é básico). No caso da última condição que você disse que será sempre false, é porque o attacker (atacante) sempre será o player? Mesmo que ele tenha summons?
  2. Vá em Data/Items e abra o items.xml e procure o item desejado e coloca o slotType dele como head. Peguei um item de exemplo para você ver: <item id="2342" article="a" name="helmet of the ancients"> <attribute key="description" value="The gem of the helmet is burned out and should be replaced." /> <attribute key="weight" value="2760" /> <attribute key="armor" value="8" /> <attribute key="slotType" value="head" /> </item> Como pode ver, só mudar para o valor head do atributo slotType. Lembrando que o item precisa estar registrado como item de inventário (slot) nas sprites (Tibia.dat) e no items.otb.
  3. Olá pessoal! Esse é um tutorial bem simples para o player(master) não poder atacar seus summons e o summon do player(master) não atacar outros players. Esse tutorial é muito útil principalmente para quem está desenvolvendo derivados. *OBS: Esse tutorial só funciona para TFS 1.X (1.0+) Vamos ao tutorial!!! Siga os passos à seguir: 1- Abra sua source e procure o arquivo combat.cpp 2- Procure pela função: ReturnValue Combat::canTargetCreature(Player* attacker, Creature* target) 3- Insira o código à seguir dentro da função encontrada no passo anterior: // BLOCO QUE O PLAYER (MASTER) NÃO PODE ATACAR O SUMMON // if (target->isSummon()) { return RETURNVALUE_YOUMAYNOTATTACKTHISCREATURE; } // BLOCO QUE O SUMMON DO PLAYER (MASTER) NÃO PODE ATACAR OUTRO JOGADOR // if (attacker->isSummon() && target->getPlayer()) { return RETURNVALUE_YOUMAYNOTATTACKTHISPLAYER; } 4- Compile a source Pronto! Agora está terminado e você pode jogar! Um recurso simples, mas bem útil.
  4. Sobre a dúvida do tópico, você teria que postar seu monsters.xml e um arquivo xml de um Digimon que editou para ver qual o problema. Mas, isso provavelmente é o que o brazvct falou, deve ser o registro do arquivo xml errado em monsters.xml.
  5. De nada! Que bom que funcionou ?.
  6. Yan Oliveira

    !aol HELP

    Não sou o Vodkart e ele está bastante tempo ausente do fórum, mas vou te ajudar ?. Substitua o código por esse: local storage_buy = 475898 -- STORAGE QUE ARMAZENA O TEMPO local seconds = 10 -- SEGUNDOS PARA PODER COMPRAR NOVAMENTE function onSay(cid, words, param) if getPlayerStorageValue(cid, storage_buy) <= os.time() then if doPlayerRemoveMoney(cid, 10000) then doPlayerAddItem(cid, 12757, 1) doSendMagicEffect(getThingPos(cid),13) doCreatureSay(cid, "DBOHG - Voce comprou um BOL!", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, storage_buy, os.time() + seconds) return true else doPlayerSendCancel(cid, "DBOHG - Você não tem dinheiro suficiente para comprar uma BOL.") doSendMagicEffect(getThingPos(cid), 2) return true end else local tempo_restante = math.floor(getPlayerStorageValue(cid, storage_buy) - os.time()) if seconds <= 60 then doPlayerSendCancel(cid, "Você precisa esperar " .. tempo_restante .. " segundos para poder comprar uma BOL novamente.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa esperar " .. tempo_restante .. " segundos para poder comprar uma BOL novamente.") return true else doPlayerSendCancel(cid, "Você precisa esperar um tempo para poder comprar uma BOL novamente.") doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa esperar um tempo para poder comprar uma BOL novamente.") return true end end end Deixei 10 segundos já para comprar novamente, mas se quiser alterar o tempo, muda o valor na variável seconds. Testa e qualquer problema me avisa.
  7. Quando você diz que stuna em porcentagem quer dizer que você quer que tenha uma chance para stunar?
  8. Seu script parecia estar com erro, estava duplicado a função onCastSpel(). Substitui o código por esse: local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_MANADRAIN) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 0, 250, 0, 320) local id_magic_plate_armor = 2472 -- ID DO MAGIC PLATE ARMOR local message = false -- SE QUISER QUE TENHA UMA MENSAGEM PARA O PLAYER SABER QUE FOI CURADO A MAIS POR ESTAR EQUIPADO COM MAGIC PLATE ARMOR, MUDE PARA true local text = "Você teve +" .. mana_magic_plate_armor .. " de cura por estar equipado com " .. getItemName(getPlayerSlotItem(cid, CONST_SLOT_ARMOR).uid) .. "." -- TEXTO CASO TENHA MENSAGEM -------- CÓDIGO --------- function onCastSpell(cid, var) local mana_magic_plate_armor = math.random(20, 30) -- O TANTO DE MANA QUE VAI CURAR SE TIVER EQUIPADO COM MAGIC PLATE ARMOR. ESTÁ ENTRE 20-30 A MAIS DE CURA DA MANA local id_item_slot_armor = getItemIdByName(getItemName(getPlayerSlotItem(cid, CONST_SLOT_ARMOR).uid)) -- NÃO MEXER, ESSA VARIÁVEL PEGA O ID DO ITEM EQUIPADO NO SLOT DE ARMOR if getPlayerLevel(cid) > 200 then doSendAnimatedText(getPlayerPosition(cid), "Aaaaah...", TEXTCOLOR_BLUE) end if (((getPlayerLevel(cid))%10) == 0) then manaextra = (((getPlayerLevel(cid))/10)*3) else manaextra = ((((getPlayerLevel(cid))/10)+0.5)*3) end if id_magic_plate_armor == id_item_slot_armor then doCreatureAddMana(cid, math.floor(manaextra + mana_magic_plate_armor)) if message then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, text) end else doCreatureAddMana(cid, manaextra) end return doCombat(cid, combat, var) end Deixei tudo comentado, mas praticamente você vai precisar mexer no id do Magic Plate Armor, olhei aqui em uma base de Tibia e estava com esse ID 2472, precisa ver no itens.xml se é esse ID mesmo. Caso queira que tenha mensagem, só mudar a variável message de false para true e se quiser mudar o texto, só alterar na variável text, mas cuidado para não apagar os dois hífen (que é assim para se comentar em lua) que vai dar ruim kk. Você também pode alterar a quantidade mínima e máxima de cura extra alterando o valor entre parênteses da variável mana_magic_plate_armor mudando o valor dentro da função math.random. Procurei deixar o mais intuitivo possível, eu testei e funcionou, mas, qualquer problema me avisa.
  9. Qual base você utiliza?
  10. Que bom que conseguiu, de nada!
  11. Qual versão da TFS?
  12. Posta o seu script da pasta actions de potions.
  13. Yan Oliveira

    Event Boss

    Pelo que vi essa OTX é equivalente a TFS 1.X, então o código que fiz deve funcionar. Substitua o código por esse: -- BOSS SYSTEM TFS 1.X FEITO POR YAN18 -- -- TABELA COM OS MONSTROS QUE VAI SURGIR DE ACORDO COM O TEMPO QUE VOCÊ COLOCOU NO INTERVAL NA TAG XML DO GLOBALEVENTS -- local monsters = { {name = "Mew", pos = Position(1000, 1000, 7)}, {name = "Mewtwo", pos = Position(1000, 1000, 7)}, {name = "Articuno", pos = Position(1000, 1000, 7)}, {name = "Zapdos", pos = Position(1000, 1000, 7)}, {name = "Moltres", pos = Position(1000, 1000, 7)}, } -- CONFIGURAÇÃO DA ARENA COMO POSIÇÃO CENTRAL QUE COMEÇA A VERIFICAR E X E Y (X, -X, Y, -Y) QUE VAI VERIFICAR NA ARENA SE TEM MONSTROS -- local config_arena = { position_center = Position(1200, 1200, 7), -- POSIÇÃO CENTRAL DA ARENA x_left = 20, -- QUANTIDADE DE TILES A ESQUERDA QUE VAI VERIFICAR SE TEM MONSTRO A PARTIR DA POSIÇÃO CENTRAL x_right = 20, -- QUANTIDADE DE TILES A DIREITA QUE VAI VERIFICAR SE TEM MONSTRO A PARTIR DA POSIÇÃO CENTRAL y_up = 20, -- QUANTIDADE DE TILES A CIMA QUE VAI VERIFICAR SE TEM MONSTRO A PARTIR DA POSIÇÃO CENTRAL y_down = 20, -- QUANTIDADE DE TILES A BAIXO QUE VAI VERIFICAR SE TEM MONSTRO A PARTIR DA POSIÇÃO CENTRAL } local verifica_todos_andares = false -- SE SUA ARENA TIVER MAIS DE UM ANDAR, MUDE O VALOR PARA true local minutos_fim_evento = 25 -- TEMPO EM MINUTOS PARA ACABAR O EVENTO E REMOVER OS MONTROS RESTANTES DA ARENA local tempo_total_fim_evento = minutos_fim_evento * 60 * 1000 -- NÃO MEXER NESSA VARIÁVEL !!! -------------------- CÓDIGO -------------------- function onThink(interval) local evento_iniciado = false -- VERIFICA SE O EVENTO FOI INICIADO DA FORMA CORRETA if tempo_total_fim_evento >= interval then return print("Você configurou errado o tempo do início do evento com o final do evento.") end for index, monster in pairs(monsters) do if evento_iniciado then return print("Você configurou errado o tempo de iniciar o evento com o tempo em que ele acabou.") else if #monsters < 1 then return print("A tabela com os monstros para o evento está vazia!") end Game.createMonster(monster.name, monster.pos) if index == #monsters then broadcastMessage(#monsters == 1 and "A monster arrived in this world" or "Some monsters arrived in this world") end end end evento_iniciado = true if not evento_iniciado then return print("Você configurou o tempo errado no evento") else addEvent(function() local monsters_arena = {} local spectator = Game.getSpectators(config_arena.position_center, verifica_todos_andares, false, config_arena.x_left, config_arena.x_right, y_down, y_up) -- NÃO MUDAR O TERCEIRO PARÂMETRO, DEIXE FALSE for index, creature in pairs(spectator) do if creature:isMonster() then monsters_arena[#monsters_arena + 1] = creature:getName() end end if #monsters_arena < 1 then --return print("Houve alguma coisa errada ao remover os monstros do evento.") return true else for index, monster in pairs(spectator) do for i = 1, #monsters_arena do if monster:isMonster() and monster:getName() == monsters_arena[i] then monster:remove() end end if index == #monsters_arena then evento_iniciado = false return broadcastMessage(#monsters_arena == 1 and "A monster left this world" or "Some monsters left this world") end end end end, tempo_total_fim_evento) end end Eu comentei tudo, então deve ter ficado tudo claro. Fora que, no código que fiz para TFS 0.X acima, está tudo explicado, nesse código está mais otimizado para TFS 1.X. Só lembrando que a posição central da arena é muito importante, então se a arena sua vai ser por exemplo 50x50, faça 51x51 para que a posição central se ímpar e a range X,Y fica iguais (pares), pois nesse exemplo de 51x51, a posição central seria X= 26, Y=26. E também é importante colocar a quantidade de tiles que vai verificar a partir da posição central nas variáveis X,Y na tabela da configuração da arena, assim como a posição central. Caso não entenda algo ou fique com alguma dúvida, só falar. E ser der algum problema só falar também. * OBS: É muito importante que configure o tempo do início do evento de forma coerente com a variável com o tempo do fim do evento, se não vai dar ruim, mas tratei isso no código e vai te avisar na distro.
  14. Sem problemas haha, acontece. É chatinho mesmo as tags xml, qualquer coisa já da ruim kkk. Mas que bom que deu certo!
  15. Substitui o código por esse: function onSay(player, words, param) local total_players_online = #getOnlinePlayers() if total_players_online > 0 then if param == '' then return player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Seu Skill Club é " .. player:getSkillLevel(SKILL_CLUB) .. ".") else if player:isPremium() then if player:isInGhostMode() then return player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Não foi encontrado nenhum jogador online com esse nome.") else for index, name in pairs(getOnlinePlayers()) do if index <= total_players_online then if param == name then return player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Skill Club de [" .. name .. "] é " .. player:getSkillLevel(SKILL_CLUB) .. ".") else if index == total_players_online then return player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Não foi encontrado nenhum jogador online com esse nome.") end end end end end else return player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Somente jogadores VIP podem utilizar este comando para visualizar informações de outros jogadores.") end end else return true end end Testa e veja se continua dando problema ao tentar pegar skill de outro player online. Lembrando que ele tem que estar online e não pode estar em modo ghost (invisível).
  16. Sobre compilar TFS, vou aproveitar a PM que você me mandou e te respondo lá um bom tutorial para compilar TFS, muito melhor que OTX. Vou te passar lá o tutorial porque isso não tem relação com a dúvida não do tópico. A nomenclatura parece a mesma da TFS, estranho não ter funcionado, testei na minha e funcionou normal como mostrei na print. Você adicionou certinho no talkactions.xml?
  17. Yan Oliveira

    Help ITENS

    Esse erro geralmente tem relação com banco de dados. Provavelmente você deletou do servidor um item existente com esse id, ou inseriu no jogo um item que não existe com esse id.
  18. Yan Oliveira

    Event Boss

    Não consegui entender o que você quis dizer.
  19. Foi erro meu, bobiei. Arrumei o código e agora está funcionando normal: Substitua o código por esse: local pokemon_derrotar = "Charizard" -- NOME DO POKÉMON QUE PRECISA DERROTAR NA TASK local total = 50 -- TOTAL DE POKEMON QUE PRECISA DERROTAR local random_porcentagem = 50 -- PORCENTAGEM QUE TEM DO POKEMON SPAWNAR AO TERMINAR A TASK -- TABELA COM OS POKEMONS QUE APARECERÃO AO DERROTAR A QUANTIDADE DO POKÉMON QUE COLOCOU NA VARIÁVEL pokemon_derrotar -- local pokemons_spawn = { {pokemon = "Mewtwo", position = {x= 1000, y= 1000, z= 7}}, {pokemon = "Mew", position = {x= 1000, y= 1000, z= 7}}, {pokemon = "Articuno", position = {x= 1000, y= 1000, z= 7}}, {pokemon = "Zapdos", position = {x= 1000, y= 1000, z= 7}}, {pokemon = "Moltres", position = {x= 1000, y= 1000, z= 7}}, } ------------------------------- CÓDIGO ----------------------------- function onKill(cid, target) local random_chance = math.random(100) -- VARIÁVEL QUE GERA VALOR ALEATÓRIO local storage_contador = 336699 -- STORAGE QUE ARMAZENA QUANTAS VEZES O POKEMON FOI DERROTADOS local restante = total - getGlobalStorageValue(storage_contador) -- VARIÁVEL QUE GERA A DIFERENÇA ENTRE O TOTAL E O CONTADOR DOS POKEMONS DERROTADOS if getCreatureName(target) == pokemon_derrotar then if getGlobalStorageValue(storage_contador) < 1 then setGlobalStorageValue(storage_contador, 1) end setGlobalStorageValue(storage_contador, getGlobalStorageValue(storage_contador) + 1) if restante == 0 then if (random_chance >= random_porcentagem) then for _, pokes in pairs(pokemons_spawn) do doCreateMonster(pokes.pokemon, pokes.position) end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Você despertou a fúria de alguns pokémons, fuja para sobreviver!") setGlobalStorageValue(storage_contador, 1) return true else setGlobalStorageValue(storage_contador, 1) return true end else return true end else return true end end Mesmo esquema das outras vezes, só alterar os valores das variáveis, mas para te facilitar, recomendo copiar o código somente a partir da linha function onKill(cid, target). Conforme a imagem acima, está funcionando normal, mas qualquer problema só me avisar.
  20. Eo não conheço OTX (Recomendo TFS, bem melhor), mas se não deu erro na distro, então não é um problema. Está estranho isso, me mostra um script de uma talkaction que funciona normal do seu servidor.
  21. Estranho, eu testei aqui no meu server o mesmo script e funcionou normal: Você reiniciou o server desligando a distro e ligando novamente? Não é bom usar comandos reloads.
  22. Qual erro que deu? Mostra na Distro.
  23. De nada, que bom que deu certo ?.
  24. Boa noite, você testou o script que fiz acima?
  25. Eu estava dando uma olhada na fonte de onde você pegou esse script, e parece que estava faltando uma verificação. Substitui o código por esse: function Creature:onChangeOutfit(outfit) return true end function Creature:onAreaCombat(tile, isAggressive) return RETURNVALUE_NOERROR end function Creature:onTargetCombat(target) target:registerEvent("ItemSetsHealth") target:registerEvent("UpgradeSystemHealth") target:registerEvent("UpgradeSystemDeath") --[[if (self:getStorageValue(STORAGEVALUE_WAR_GREENPLAYER_BOOL) == nil) or (self:getStorageValue(STORAGEVALUE_WAR_REDPLAYER_BOOL) == nil) then print("There was an error, please verify the value of the storage [STORAGEVALUE_WAR_GREENPLAYER_BOOL] or [STORAGEVALUE_WAR_REDPLAYER_BOOL] because it them are nil.") return false end]]-- if self:isPlayer() then if self:getStorageValue(STORAGEVALUE_WAR_GREENPLAYER_BOOL) == 1 then if target:getStorageValue(STORAGEVALUE_WAR_REDPLAYER_BOOL) == 1 then return RETURNVALUE_NOERROR elseif target:getStorageValue(STORAGEVALUE_WAR_REDPLAYER_BOOL) == 0 then self:sendCancelMessage("You cannot attack someone that is on your team.") return false end elseif self:getStorageValue(STORAGEVALUE_WAR_REDPLAYER_BOOL) == 1 then if target:getStorageValue(STORAGEVALUE_WAR_GREENPLAYER_BOOL) == 1 then return RETURNVALUE_NOERROR elseif target:getStorageValue(STORAGEVALUE_WAR_GREENPLAYER_BOOL) == 0 then self:sendCancelMessage("You cannot attack someone that is on your team.") return false end end end end Testa e fala se deu problema.
  • Quem Está Navegando   0 membros estão online

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