Ir para conteúdo

zipter98

Herói
  • Total de itens

    2553
  • Registro em

  • Última visita

  • Dias Ganhos

    73

Tudo que zipter98 postou

  1. OK, já sabemos onde o erro está. Agora, veremos qual é o erro. local function isSummon(cid) if not isCreature(cid) then return false end if getCreatureMaster(cid) ~= cid then return true end return false end function onDeath(cid, corpse, deathList) local stoTime = 96586 local stoKill = 96587 local stoName = 96587 local task = { ["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000}, ["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000}, ["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000}, ["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000}, ["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000}, ["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000}, ["multi"] = {kill = "Multi", qnt = 600, exp = 200000}, ["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000}, } for a = 1, #deathList do local pk = deathList[a] local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))] local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60)) print(myTask or "Task não existente: "..getPlayerStorageValue(pk, stoName)) print("Task do jogador "..getPlayerStorageValue(pk, stoName)) print("Nome do monstro: "..getCreatureName(cid)) if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then print("Primeira condição sendo executada.") if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then print("Segunda condição sendo executada.") setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1) local sto = getPlayerStorageValue(pk, stoKill) local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qntdade) if sto == 0 then doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")") else doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qntdade..")") end end end end return true end
  2. Por favor, teste outro script e veja se o mesmo erro acontece. O código do ptdg está funcionando perfeitamente, pelo menos aqui.
  3. Sim, o que me leva a indagar do porquê não tem aparecido erro algum na distro. É sempre informado no console quando uma variável inexistente é declarada. Mesmo assim, a storage responsável por armazenar os dados da task é ainda alterada.
  4. Por gentileza, informe se alguma mensagem é imprimida na distro. Assim, saberemos onde exatamente se encontra o erro. local function isSummon(cid) if not isCreature(cid) then return false end if getCreatureMaster(cid) ~= cid then return true end return false end function onDeath(cid, corpse, deathList) print("Script sendo executado.") local stoTime = 96586 local stoKill = 96587 local stoName = 96587 local task = { ["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000}, ["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000}, ["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000}, ["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000}, ["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000}, ["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000}, ["multi"] = {kill = "Multi", qnt = 600, exp = 200000}, ["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000}, } for a = 1, #deathList do print("Loop iterando jogadores sendo executado.") local pk = deathList[a] local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))] local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60)) if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then print("Primeira condição sendo executada.") if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then print("Segunda condição sendo executada.") setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1) local sto = getPlayerStorageValue(pk, stoKill) local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qntdade) if sto == 0 then doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")") else doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qntdade..")") end end end end return true end
  5. zipter98

    Erro Estranho

    Você provavelmente está usando um creatureevent executado quando um monstro morre, com uma de suas características a modificação de valores em duas tabelas da database que estão faltando no seu servidor (killed_monsters e player_advances). Talvez seja um onDeath ou um onKill. Recomendaria dar uma olhada nos códigos de data/creaturescripts/scripts e procurar por aqueles que ou chamam a função db.executeQuery ou db.query. Se você não os estiver usando, basta deletá-los que o erro não mais acontecerá. Caso contrário, responda a pergunta do Adriano.
  6. Tópico movido para dúvidas / pedidos resolvidos.
  7. Tópico movido para dúvidas / pedidos resolvidos.
  8. Troque: if getTileInfo(getThingPos(mypoke)).protection then por: if getTileInfo(getThingPos(cid)).protection then
  9. zipter98

    Moveevents ERRO

    Troque: doTransformItem(item.uid, 7697) por: if item.uid > 0 then doTransformItem(item.uid, 7697) end
  10. Usando a correção que postei, o servidor não caiu e os monstros não me atacaram mais. Mas, se preferir, você pode fazer o que disse e fazer com que o item só possa ser usado fora de combate.
  11. Apesar de não ser a maneira mais adequada para corrigir esse erro, é o que pude pensar no momento. Na parte em que a storage é alterada no código da food de proteção: local name = "monster_name" --Nome do monstro. function Substitute(cid) for _, pid in pairs(getSpectators(getThingPos(cid), 8, 8)) do if isMonster(pid) and getCreatureName(pid) == name then local healthNow, posNow = getCreatureHealth(pid), getThingPos(pid) doRemoveCreature(pid) local newMonster = doCreateMonster(name, posNow) doCreatureAddHealth(newMonster, -(getCreatureMaxHealth(newMonster) - healthNow)) end end end setPlayerStorageValue(cid, key, -1) Substitute(cid)
  12. Caso o código do Adriano ainda não funcione, peço que me responda uma coisa: você possui as sources do seu servidor? Gostaria de tentar uma coisa diferente.
  13. Os status do PDA sem level são calculados de maneira diferente da versão com esta característica. Os fatores que influenciam na fórmula do cálculo de defesa, vida, ataque e etc são poucos, como boost e nível do jogador, visto que os status de cada pokémon são constantes. Já na versão com level, os atributos são variáveis, sendo avançar de nível um fator que os alteram. Mas como ninguém se importa com esta explicação, vou direto ao ponto: você quer que os atributos sejam aumentos por valores fixos ou percentuais? Por exemplo, um aumento de ataque em 10% ou um aumento de defesa em 300 (para o segundo caso, eu recomendaria um estudo sobre as fórmulas de status para ter uma melhor noção dos valores apropriados).
  14. Minha alteração é basicamente a mesma do Slicer. A única diferença é que, na minha versão, eu retorno falso antes da dele.
  15. Com o exemplo corrigido não funcionou? Você instalou tudo corretamente? O jogador por acaso está usando um summon? Tudo está funcionando como deve, inclusive testei a modificação na mesma versão da sua distro.
  16. Gostei do resultado apresentado no vídeo. Sério, ficou muito legal. Tópico aprovado e movido para a área adequada. Obrigado pelo conteúdo. )
  17. Fiz uma pequena correção nos códigos que postei anteriormente. Se possível, atualizem-nos. Realizei inúmeros testes a procura deste erro que vocês encontraram, porém não o enfrentei em ocasião alguma. O servidor não fechou nem nada.
  18. Se a speed do monstro for igual a 0, ele não irá se mover em ocasião alguma. Logo, para fazer o que você quer, seriam necessárias outras modificações. Em monster.cpp: No código da função: void Monster::onThink(uint32_t interval) Abaixo de: updateIdleStatus(); if(isIdle) return; coloque: if(Creature* creature = static_cast<Creature*>(this)) { if(!attackedCreature && !isSummon() && creature->getNoMove()) creature->setNoMove(true); } Depois, abaixo de: //We just spawned lets look around to see who is there. if(isSummon()) isMasterInRange = canSee(getMaster()->getPosition()); coloque: creature->setNoMove(true); Código lua: local storage = xxx function onTarget(cid, target) if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then doCreatureSetNoMove(cid, false) return true end return false end
  19. data/creaturescripts/scripts: local storage = xxx function onTarget(cid, target) if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then return true end return false end Tag: <event type="target" name="allowTarget" event="script" value="nome_do_arquivo.lua"/> No arquivo .XML do monstro, acima de: </monster> coloque: <script> <event name="allowTarget"/> </script>
  20. Qual o erro que aparece? Para todo caso, teste aquele código que exemplifiquei no tópico e informe se ele funciona adequadamente no seu servidor ou não. Se funcionar, é problema no código lua. Se não, o erro encontra-se na instalação da modificação nas sources.
  21. Tópico movido para dúvidas / pedidos resolvidos.
  22. Obrigado pelos comentários, pessoal. @Xtudomuito Basta deixar a speed dele igual a 0 (arquivo .XML do monstro).
  23. Para fazer isso seriam necessárias outras alterações. Retornando falso você vai impedir com que monstros ataquem summons e/ou players, e retornando verdadeiro a ação será realizada normalmente. E obrigado pela observação. Falta de atenção minha.
  24. Você não vai conseguir fazer isso sem modificações nas sources. http://www.xtibia.com/forum/topic/236635-ontarget-tambem-executado-por-monstros/
  25. Serei breve: com esta pequena modificação, o creatureevent onTarget poderá ser executado por monstros. Nas sources do seu servidor, abra o arquivo monster.cpp e procure por: if(it == targetList.end()) { //Target not found in our target list. #ifdef __DEBUG__ std::cout << "Target not found in targetList." << std::endl; #endif return false; } Abaixo deste bloco de código, coloque: CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET); for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it) { if(!(*it)->executeTarget(this, creature)) return false; } Depois, no código da função: void Monster::doAttacking(uint32_t interval) Abaixo de: if(!attackedCreature || (isSummon() && attackedCreature == this)) return; coloque: if(Creature* creature = attackedCreature->getCreature()) { CreatureEventList targetEvents = getCreatureEvents(CREATURE_EVENT_TARGET); for(CreatureEventList::iterator it = targetEvents.begin(); it != targetEvents.end(); ++it) { if(!(*it)->executeTarget(this, creature)) { setFollowCreature(NULL); setAttackedCreature(NULL); searchTarget(TARGETSEARCH_NEAREST); break; } } } Exemplo do que pode ser feito com esta alteração: Monstro não atacando jogador com X storagedata/creaturescripts/scripts: local storage = xxx function onTarget(cid, target) if isMonster(cid) and isPlayer(target) and getPlayerStorageValue(target, storage) > -1 then return false end return true end Tag: <event type="target" name="blockTarget" event="script" value="nome_do_arquivo.lua"/> No arquivo .XML do monstro, acima de: </monster> coloque: <script> <event name="blockTarget"/> </script>
  • Quem Está Navegando   0 membros estão online

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