Ir para conteúdo

Yan Oliveira

Moderador
  • Total de itens

    2187
  • Registro em

  • Última visita

  • Dias Ganhos

    58

Tudo que Yan Oliveira postou

  1. Minha resposta depende da pergunta que te fiz e você não respondeu, que é, como essa atribuição de pontos será feita? Manual no banco ou por script? Porque, se a bag do player estiver cheia, ele não vai conseguir receber item ao clicar no baú de qualquer forma. E o player receber item ao invés clicar no baú como falei, é até mais fácil nessa condição de ele estar offline, porque por script você envia diretamente no banco ou no onLogin ele recebe ao logar. Tem várias formas de fazer, mas preciso entender como é essa atribuição de pontos para mentalizar uma forma boa e eficaz para resolver seu problema.
  2. E como isso de atribuir os pontos será feito? Você tem um script pronto ou você irá atribuir pelo banco automaticamente? Você já jogou poketibia? No poketibia, tem as pokémon box, que é um item (como se fosse um presente) que o player ganha ao realizar alguma coisa (ou por sorteio dependendo do ot). Acho que seria interessante usar para essa funcionalidade que você quer, porque desse jeito que você pediu eu acho pior, você vai consumir espaço no mapa atoa para um baú que tem o uso circunstancial dos player e que nem é de quest. Mas se quiser com baú, vamos tentar, mas acho que seria interessante isso de usar box, pois o player já recebe na bag e ele clica no item, ganha o que tiver que ganhar e a box some, aí você poupa espaço no mapa e item na bag.
  3. A versão da sua OTX atual é equivalente à TFS 0.4? Ou você só colocou por colocar TFS 0.4 como versão no tópico?
  4. Posta print do erro completo na distro. Sobre o player matar um pokemon selvagem sem um dele fora da ball, é em situações do tipo quando o pokémon selvagem está sob algum efeito de status negativo, como burn por exemplo?
  5. Qual a maneira que você vai colocar os pontos no baú para determinado player poder resgatar?
  6. Eu não tinha muito tempo, e só fazia durante a noite. Gastei no total uns 3 dias mais ou menos.
  7. Eu acho legal a admiração que muitos tem pela PXG e pelo seu mapa (eu também tenho). Mas, acho que é um esforço grande para uma baixa recompensa, pois, você vai gastar muito tempo para copiar, sendo que seu server não vai conter os mesmos sistemas, balanceamento e funcionalidades que a PXG tem. O diferencial de um Open Tibia é os sistemas e o mapa, e se você fizer um mapa igual da PXG, sendo que já tem o da própria PXG, que tem o jogo à muitos anos, com muitos sistemas e um jogo estabilizado, por que alguém jogaria o seu com o mesmo mapa deles se tem o jogo deles? Talvez você possa me falar ou pensar que não vai colocar online, vai copiar por ser fã, ou querer brincar sozinho, mas o legal é a criatividade. Seja criativo, cria áreas, hunts e cidades diferente, pode até se basear ou usar os da PXG como inspiração, mas copiar o mundo todo de Kanto vai levar muito tempo, eu falo isso porque à anos atrás para brincar eu copiei Saffron e fiz o CP de Pewter, e eu gastei muito tempo. Fora que precisa das sprites deles.
  8. Qual foi o último NPC que você criou/mexeu que começou dar esses problemas? Esses erros normalmente é erro de sintaxe em tag xml do npc: <parameters> <parameter> ... <parameter/> <parameters/> Tem que ver o último NPC que você mexeu antes de começar dar esses erros porque provavelmente o problema está no arquivo dele.
  9. Eu acho que o problema está nesse escopo mesmo. Mas a questão é que não tem informação da área total onde vai matar o Boss para poder verificar pelo Game.getSpectators, e essa função sem um tamanho delimitado da área é problemático, porque dependendo o valor que colocar nos parâmetros da função, pode ferrar a verificação e pegar coisas a mais como creatures. @ashidaruta Qual o tamanho total em X,Y,Z da área que fica o boss? Veja se é um local fechado, como por exemplo 30x30. Se for aberta fica mais complicado. Se puder mostrar uma print da área onde fica esse boss, fica mais fácil de te ajudar.
  10. O problema é que seu servidor está tentando chamar uma função ou variável global que não existe ou não tem nele, que é a megaEvolutions. Pode ser duas coisas, ou você copiou esse sistema de outra base e não seguiu todos os passos, ou então não colocou corretamente a nomenclatura da função/variável que faz parte do sistema de megas.
  11. Olá amigo! Vou te dar alguns conselhos sobre sua divulgação, pois, na minha concepção tem alguns pontos à serem ressaltados para uma melhor atração de pessoas para jogar o seu jogo. Primeiramente, é muito importante colocar imagens ilustrativas que mostre sistemas, funcionalidades e diferencial do seu jogo. Você também listou que o seu jogo tem catch persistente, o que seria isso e o que isso significa? Isso quer dizer que ao capturar o pokémon você já atualiza no banco de dados? Isso pode ser problemático, pois imagina que o player fez várias coisas no jogo, avançou vários níveis, e um desses níveis que ele alcançou foi para conseguir utilizar o pokémon capturado, e o servidor da crash após o último save ter sido há muito tempo. Então tudo que o player conseguiu ele perdeu mas o pokémon continua com ele? Seria muito estranho na visão do player, fora que é uma vantagem que não é saudável. Acho muito importante você levar em consideração os pontos que citei acima, pois você precisa dar mais informações sobre seu jogo, precisa explicar o quer dizer com "catch persistente" para quem está querendo jogar o seu jogo entender o que isso quer dizer. E você precisa ilustrar melhor os sistemas, funcionalidades e diferencias do seu jogo, pois, as imagens fazem muita diferença e tem muito impacto, tanto é que as empresas investem muito em marketing, divulgação e propagandas de seus produtos, e o principal do marketing são as imagens. Por fim, você precisa responder algumas perguntas como: Por que eu jogaria o seu jogo? Qual o diferencial do seu jogo? O que o seu jogo tem de diferente dos outros? Essa são perguntas que fazem toda diferença na seleção de jogadores, pois, o por que o cara iria jogar seu jogo sendo que no que ele está atualmente ele já tem um progresso, tem uma estabilidade e gastou tempo (e ou recursos). Fora que a maioria dos outros poketibias tem a maioria dessas coisas, então tem que convencer e atrair o player a querer jogar o seu. Siga essas dicas e conselhos, e você fará com seu jogo tem uma exposição e divulgação melhor e maior ?.
  12. Opa, é porque faltou verificar se existe item no slot. 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 -------- CÓDIGO --------- function onCastSpell(cid, var) local item = getPlayerSlotItem(cid, CONST_SLOT_ARMOR) -- PEGA O ITEM DO SLOT (PARA VERIFICAR SE TEM ITEM) 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 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 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 item and 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 Testa e se der problema me avisa.
  13. Sobre o erro, foi bobeira minha, acabei invertendo a ordem das variáveis e como a variável mana_magic_plate_armor não existia na concatenação do texto, então deu erro. Sobre ele mandar a mensagem do "Aaahh" é porque Lua é uma linguagem interpretada, então ela executa linha por linha até a linha com erro. Diferente de uma linguagem compilada que se tem erro ele nem executa. Troca 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 -------- 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 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 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
  14. Sim, é um script só. Mas, então amigo, você não comentou se deu erro na distro(que provavelmente deu), mas eu vi que fiz uma coisa errada, troca 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 -------- CÓDIGO --------- function onCastSpell(cid, var) 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 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 É para funcionar, testei aqui e está funcionando. Qualquer problema avisa.
  15. Entendi, interessante. Ai no caso para o meu summon não atacar outro summon de outro player ou outro player, eu faço verificação no arquivo creatures.lua da pasta Data/Events correto?
  16. 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?
  17. 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.
  18. 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.
  19. 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.
  20. 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.
  21. Quando você diz que stuna em porcentagem quer dizer que você quer que tenha uma chance para stunar?
  22. 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.
  • Quem Está Navegando   0 membros estão online

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