Ir para conteúdo

zipter98

Membro
  • Registro em

  • Última visita

Tudo que zipter98 postou

  1. Provavelmente você configurou errado as posições fromPos e toPos na lib. Já desenvolvi o rank. Está nesta página mesmo. Sobre a premiação, farei esta edição para você (junto com a possibilidade de invocar quantos monstros quiser na wave).
  2. Se for VIP, por favor, informe o sistema VIP que você está utilizando. Caso seja premium days: Em data/creaturescripts/scripts, crie um arquivo com extensão .lua, nomeie-o premiumlogin, e coloque o seguinte conteúdo: local days = 60 --Aqui você configura a quantidade de dias premium que o jogador vai receber. local storage = 80191 local message = "You received %d premium day%s." function onLogin(cid) if getPlayerStorageValue(cid, storage) < 1 then doPlayerAddPremiumDays(cid, days) doPlayerSendTextMessage(cid, 27, message:format(days, days > 1 and "s" or "")) setPlayerStorageValue(cid, storage, 1) end return true end Depois, em data/creaturescripts, abra o arquivo creaturescripts.xml e coloque a seguinte tag, abaixo de semelhantes: <event type="login" name="premiumLogin" event="script" value="premiumlogin.lua"/>
  3. Esse erro aí é problema do seu servidor, infelizmente. Como pode-se notar, não há referência alguma a queries no sistema de arena. E provavelmente os bosses não estão desaparecendo devido, indiretamente, ao erro acima.
  4. Esse bug que você citou, na verdade, eu já havia corrigido faz tempo. É só você trocar sua lib pela atualizada (adicionei uma nova função e removi outra que não era funcional). Sobre o preço, vou arrumar. Na verdade, isso que eu fiz foi intencional: o "sistema" de dinheiro/cash/gold do meu servidor é diferente dos servidores convencionais de Tibia. Aí, enquanto eu testava, adaptei o preço do NPC para ser coerente com meu server. EDIT: Pronto, NPC "corrigido".
  5. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    @Gabuuh Você fez uma pergunta, eu respondi, ué.
  6. edit: nvm, era só umas variáveis coincidindo aqui. Problema do meu servidor rs. O sistema tá funcionando perfeitamente.
  7. Há servidores, como o seu, que existe a função onTimer. Já, em outros servidores, esta função não existe ou adota o nome de onTime. Se você cria um arquivo com o callback onTimer num servidor que o correto seria onTime, vai acusar este erro que o autor postou.
  8. zipter98 postou uma resposta no tópico em Suporte Tibia OTServer
    Depende da função que você se refere. Um callback? Sempre. Uma função criada puramente em lua? Isso varia. Há funções que executam ações sem necessidade de retornar algo. Exemplo: function Example(cid) doSendMagicEffect(getThingPos(cid), 21) addEvent(function() if isPlayer(cid) then Example(cid) end end, 1000) end
  9. É como tivesse vários itens empilhados? while getTileItemById(position, itemid).uid > 0 do doRemoveItem(getTileItemById(position, itemid).uid) end
  10. Muda: function onTimer() para: function onTime() E vê se o erro continua.
  11. Foi mal a demora, estava viajando. Editei meu comentário na primeira página com o sistema completo. Agora eu definitivamente o testei e removi um outro bug. Se possível, substitua seu antigo killboss.lua pelo novo (também adicionei uma nova tag, e é necessário registrar mais um evento em login.lua). Desculpa pelos erros e tal.
  12. local players = {"Test", "Tester", "Testinha"} --Aqui você configura o nome dos jogadores que o script ignorará. function onKill(cid, target, lastHit) if cid ~= target and isPlayer(target) then if not isInArray(players, getCreatureName(cid)) and getPlayerIp(cid) == getPlayerIp(target) then doCreatureAddHealth(cid, -500) doCreatureAddMana(cid, -500) doPlayerAddExperience(cid, -20000000) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Punished for killing player with the same IP!!') else doSendAnimatedText(getPlayerPosition(cid), "Orgasmic~", 198) end end return true end
  13. Hm, vamos alterar o valor da storage no jogo mesmo. Muda o conteúdo do killboss.lua para este: function onKill(cid, target) if isPlayer(target) and getPlayerStorageValue(target, ARENA.STORAGES.wave_sto) > -1 then setPlayerStorageValue(target, ARENA.STORAGES.wave_sto, -1) setGlobalStorageValue(1000, -1) elseif isPlayer(cid) and getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) > -1 then local new_wave = getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) + 1 if ARENA.WAVES[new_wave] then setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, new_wave) doWave(cid, new_wave) else local tp = doCreateTeleport(ARENA.TELEPORT.tpId, ARENA.TELEPORT.tpToPos, ARENA.TELEPORT.tpPos) doItemSetAttribute(tp, "aid", ARENA.TELEPORT.aid) end end return true end function onLogout(cid) if getTileInfo(getThingPos(cid)).protection and getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) > -1 then return setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, -1) end if getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) > -1 then doPlayerSendCancel(cid, "You can't logout now.") return false end return true end Tente deslogar em uma protection zone. Agora sobre o ranking que havia sido pedido: No código do NPC, abaixo de: setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, 1) adicione: setPlayerStorageValue(cid, 90183, 1) No creaturescript, abaixo de: local new_wave = getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) + 1 adicione: if new_wave > getPlayerStorageValue(cid, 90183) then setPlayerStorageValue(cid, 90183, new_wave) end Agora o código da talkaction: function onSay(cid, words) local query = db.getResult("SELECT player_id, value FROM player_storage WHERE key = 90183 AND value > -1 ORDER BY value DESC LIMIT 10") local str = "Rank da Arena:" local a = 0 if query:getID() == -1 then return doPlayerPopupFYI(cid, str.."\nNodoby went to the arena until now.") end repeat a = a + 1 local id = query:getDataInt("player_id") local waves = query:getDataInt("value") str = str.."\n"..a..". "..getPlayerNameByGUID(id).." / "..waves.." waves" until not query:next() query:free() doPlayerPopupFYI(cid, str) return true end PS: A wave record do jogador só vai aparecer no ranking após ele deslogar (para a storage ser salva na database).
  14. Sim. Sobre você não estar podendo deslogar em qualquer área, provavelmente seu personagem está com um valor maior que -1 na storage da arena. Executa o seguinte comando na sua database: UPDATE player_storage SET value = -1 WHERE key = 90182
  15. data/creaturescripts/scripts, crie um arquivo com extensão .lua, nomeie-o bonusloot.lua e adicione o seguinte conteúdo: local monsters = { ["Demon"] = {90181, 100, {item_id, count}}, --["nome_do_monstro"] = {storage, quantidade_para_matar, {item_id, quantidade}}, } function onDeath(cid, corpse, deathList) local killer = deathList[1] if #deathList > 1 then killer = deathList[2] end if isMonster(cid) and isPlayer(killer) and monsters[getCreatureName(cid)] then local monster = monsters[getCreatureName(cid)] local storage = monster[1] local value = getPlayerStorageValue(killer, storage) < 1 and 1 or getPlayerStorageValue(killer, storage) + 1 if value >= monster[2] then local id = monster[3][1] local count = monster[3][2] setPlayerStorageValue(killer, storage, -1) if isItemStackable(id) then doAddContainerItem(corpse.uid, id, count) else for i = 1, count do doAddContainerItem(corpse.uid, id, 1) end end else local left = monster[2] - value setPlayerStorageValue(killer, storage, value) doPlayerSendTextMessage(killer, MESSAGE_STATUS_CONSOLE_ORANGE, left.." "..getCreatureName(cid)..(left > 1 and "s" or "").." left to kill.") end end return true end Tag: <event type="death" name="bonusLoot" event="script" value="bonusloot.lua"/> No arquivo XML dos monstros configurados na tabela monsters (ou seja, aqueles que droparão um item bônus após matar quantia x deles), você adicione, antes de </monster>, isso: <script> <event name="bonusLoot"/> </script>
  16. Mas como vai decidir qual summon vai falar?
  17. Exato, modifiquei apenas este arquivo. Já concertei também o erro de morrer na arena. Pelo menos na teoria eu concertei, veremos na prática.
  18. Como você pode notar, eu deixo tanto a variável quanto o nome do monstro em letra minúscula na comparação. Caso seja configurado na variável monster, por exemplo, "demon", e eu chame esta variável na mensagem, aparecerá demon, e não Demon. E nomes próprios começam com letra maiúscula. É apenas por estética mesmo.
  19. Corrigi o erro do logout. Agora o jogador não pode deslogar na arena. Sobre o sistema de rank, ok, farei essa modificação logo. Mas vai ser top o que? Top 5? Top 10?
  20. Ops, my bad. Não tem que registrar no arquivo XML do monstro, e sim no login.lua.
  21. Esqueci de avisar, mas eu também alterei a lib. Sem essa alteração, vai dar erro no NPC mesmo. Abaixo de: delay = 15, --Segundos para o boss aparecer. adicione: level = 100, --Level mínimo. Sobre a remoção da storage global: altere seu creaturescript para este: function onKill(cid, target) if isPlayer(target) and getPlayerStorageValue(target, ARENA.STORAGES.wave_sto) > -1 then setPlayerStorageValue(target, ARENA.STORAGES.wave_sto, -1) setGlobalStorageValue(1000, -1) elseif isPlayer(cid) and getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) > -1 then local new_wave = getPlayerStorageValue(cid, ARENA.STORAGES.wave_sto) + 1 if ARENA.WAVES[new_wave] then setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, new_wave) doWave(cid, new_wave) else local tp = doCreateTeleport(ARENA.TELEPORT.tpId, ARENA.TELEPORT.tpToPos, ARENA.TELEPORT.tpPos) doItemSetAttribute(tp, "aid", ARENA.TELEPORT.aid) end end return true end function onLogout(cid) if isInArea(getThingPos(cid), ARENA.fromPos, ARENA.toPos) then doPlayerSendCancel(cid, "You can't logout now.") return false end return true end e seu movement para este: function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return true end setPlayerStorageValue(cid, ARENA.STORAGES.storage, 1) setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, -1) setGlobalStorageValue(1000, -1) addEvent(function() if getTileItemById(position, ARENA.TELEPORT.tpId).uid > 0 then doRemoveItem(getTileItemById(position, ARENA.TELEPORT.tpId).uid, 1) end end, 50) return true end E o novo NPC: local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg:lower(), "arena") or msgcontains(msg:lower(), "enter") then if getPlayerLevel(cid) < ARENA.level then selfSay("You do not have enough level ["..ARENA.level.."].", cid) talkState[talkUser] = 0 return true elseif isThereSomeone(ARENA.fromPos, ARENA.toPos) or getGlobalStorageValue(1000) > -1 then selfSay("Someone is at the arena right now, please wait.", cid) talkState[talkUser] = 0 return true elseif getPlayerStorageValue(cid, ARENA.STORAGES.storage) > -1 then selfSay("You already completed the arena.", cid) talkState[talkUser] = 0 return true else selfSay("You really want enter in the arena? It will cost you {"..ARENA.NPC.price.."}.", cid) talkState[talkUser] = 1 return true end elseif msgcontains(msg:lower(), "yes") and talkState[talkUser] == 1 then if doPlayerRemoveMoney(cid, ARENA.NPC.price * 100) then selfSay("Good luck! ^.^", cid) doTeleportThing(cid, ARENA.NPC.position) setPlayerStorageValue(cid, ARENA.STORAGES.wave_sto, 1) setGlobalStorageValue(1000, 1) doWave(cid, 1) talkState[talkUser] = 0 return true else selfSay("You do not have enough money.", cid) talkState[talkUser] = 0 return true end elseif msgcontains(msg:lower(), "no") and talkState[talkUser] == 1 then selfSay("Ok, then...", cid) talkState[talkUser] = 0 return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
  22. Pronto, alterei o NPC com level mínimo para entrar na arena. Estranho não estar funcionando a função que fiz, mas enfim. Faça como o Frenesy disse: checagem por global storage.
  23. edit: agora que li que não tá funcionando.
  24. Pronto, tudo funcionando perfeitamente agora. Editei aquele meu comentário com o sistema com as novas configurações. A lib e o NPC não mudaram. Você não precisa mais registrar o evento no XML do monstro, porém agora é necessário registrá-lo em login.lua. Fiz uma alteração no creaturescript e no movement (meu servidor tem um probleminha quanto a alguns funções que estava utilizando, então as removi e usei outro metódo).
  25. Essa coordenada que você citou não precisa ser configurada. Faz parte de uma função. Sobre seu erro, farei uns testes aqui. EDIT: Já encontrei este erro e o corrigi. Estou apenas fazendo alguns últimos ajustes e testes.

Informação Importante

Confirmação de Termo