Ir para conteúdo

zipter98

Herói
  • Total de itens

    2553
  • Registro em

  • Última visita

  • Dias Ganhos

    72

Tudo que zipter98 postou

  1. Tente algo seguindo a seguinte lógica: local config = { [1] = { upper_left = {x = x, y = y, z = z}, bottom_right = {x = x, y = y, z = z}, toPos = {x = x, y = y, z = z} }}for i = 1, #config do local upper, bottom = config[i].upper_left, config[i].bottom_right if #getPlayersInArea(upper, bottom) == 0 then doTeleportThing(cid, config[i].toPos) return true endenddoPlayerSendCancel(cid, "Try again later.") Imagino que a estruturação da tabela seja bem fácil de entender, porém qualquer dúvida basta perguntar. PS: Essa função getPlayersInArea você pode encontrar pela internet (incluindo aqui no fórum), portanto não vejo necessidade de postá-la.
  2. A conclusão que tirei a partir da estrutura apresentada por você é que os índices da tabela representam até que nível a vocação apresentará a dada corpse. local table = { --[vocation_id] = { [1] = { --[MAX_LEVEL] = itemid, [100] = 2930, [250] = 2931, [350] = 2932, },}local function transform(pos, id, voc, level) local item = getTileItemById(pos, id) if item and item.uid > 1 then local corpse_id, ref_lv, ret_id = table[voc], 9999 if not corpse_id then return true end for corpse_level, itemid in pairs(corpse_id) do if level <= corpse_level and corpse_level < ref_lv then ret_id = itemid ref_lv = corpse_level end end doTransformItem(item.uid, ret_id) doDecayItem(item.uid or 0) endendfunction onDeath(cid, corpse) if not isPlayer(cid) or not table[getPlayerVocation(cid)] then return true end addEvent(transform, 15, getThingPos(cid), corpse.itemid, getPlayerVocation(cid), getPlayerLevel(cid)) return trueend
  3. Opa, se o podcast no Discord ainda for rolar, posso dar uma gankada lá com vocês.
  4. local config = { money = xxx, --Preço cobrado para cada jogador. daily = "no", -- allow only one enter per day? (like in global Tibia) level = 450, storage = 30015, entry = { {x = 4464, y = 1288, z = 6}, {x = 4466, y = 1288, z = 6}, {x = 4465, y = 1289, z = 6}, {x = 4464, y = 1290, z = 6}, {x = 4466, y = 1290, z = 6} }, destination = { {x = 189, y = 650, z = 13}, {x = 189, y = 651, z = 13}, {x = 189, y = 652, z = 13}, {x = 189, y = 653, z = 13}, {x = 1554, y = 1826, z = 4} }} config.daily = getBooleanFromString(config.daily)function onUse(cid, item, fromPosition, itemEx, toPosition) if(item.itemid == 1946) then if(config.daily) then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) else doTransformItem(item.uid, item.itemid - 1) end return true end if(item.itemid ~= 1945) then return true end local players = {} for _, position in ipairs(config.entry) do local pid = getTopCreature(position).uid if pid == 0 or not isPlayer(pid) or getCreatureStorage(pid, config.storage) > 0 or getPlayerLevel(pid) < config.level or getPlayerMoney(pid) < config.money then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) return true end table.insert(players, pid) end for i, pid in ipairs(players) do doPlayerRemoveMoney(pid, config.money) doSendMagicEffect(config.entry, CONST_ME_POFF) doTeleportThing(pid, config.destination[i], false) doSendMagicEffect(config.destination, CONST_ME_ENERGYAREA) end doTransformItem(item.uid, item.itemid + 1) return trueend
  5. O Psy Pulse está funcionando? Se preferir, pode voltar os códigos a antes do meu último comentário (quando o Miracle Eye, apesar de não perfeitamente, estava funcionando). É meio ruim ficar testando as correções desse jeito, mas não tenho essa base instalada e não pretendo baixá-la tão cedo.
  6. zipter98

    catch

    Abaixo de: if getItemAttribute(item2.uid, "golden") and getItemAttribute(item2.uid, "golden") == 1 then return doPlayerSendCancel(cid, "You can't try to catch a pokemon in the Golden Arena!") end coloque: local storage = 9381if getPlayerStorageValue(cid, storage) > os.time() then doPlayerSendCancel(cid, "You are exhausted.") return trueend Depois, acima de: addEvent(doSendPokeBall, d * 70 + 100 - (d * 14), cid, catchinfo, false, false, typeee, smeargleID) coloque: setPlayerStorageValue(cid, storage, os.time() + 1) --Intervalo de 1s para jogar outra pokeball.
  7. Primeiramente, é acima do que está sozinho. No código do Psy Pulse, abaixo de: if not isCreature(cid) then return true end coloque: if tostring(getPlayerStorageValue(cid, 21102)) ~= spell then setPlayerStorageValue(cid, 21102, spell)end No código do Miracle Eye, é melhor manter essa linha: setPlayerStorageValue(cid, 21102, -1) E, no stats change, voltar essas linhas: if getPlayerStorageValue(attacker, 21102) ~= "Miracle Eye" and getPlayerStorageValue(attacker, 21102) ~= "Dark Eye" then setPlayerStorageValue(attacker, 21102, -1)end para essa: setPlayerStorageValue(attacker, 21102, -1) Se não, o auto ataque pode acabar sendo influenciado pelo efeito dessa spell. Depois, em pokemon moves, troque: if getPlayerStorageValue(cid, 4389) > -1 and getPlayerStorageValue(cid, 21102) ~= "Miracle Eye" and getPlayerStorageValue(cid, 21102) ~= "Dark Eye" then setPlayerStorageValue(cid, 4389, -1)end por: if getPlayerStorageValue(cid, 4389) > -1 and getPlayerStorageValue(cid, 21102) ~= "Miracle Eye" and getPlayerStorageValue(cid, 21102) ~= "Dark Eye" and getPlayerStorageValue(cid, 21102) ~= -1 then setPlayerStorageValue(cid, 4389, -1)end Não tenho certeza se vão corrigir o erro do Psyshock da frente, mas são proteções para outros casos. Estou com um pouco de pressa agora, então depois raciocino mais sobre o problema.
  8. Troque o código da spell Psyshock por: elseif spell == "Psyshock" then local p = getThingPosWithDebug(cid) local d = isCreature(target) and getCreatureDirectionToTarget(cid, target) or getCreatureLookDir(cid) local storage, keep = getPlayerStorageValue(cid, 4389) if storage > os.time() then keep = true end function sendAtk(cid, area, eff, k) if isCreature(cid) then if not isSightClear(p, area, false) then return true end if k then setPlayerStorageValue(cid, 4389, os.time() + 1) end doAreaCombatHealth(cid, psyDmg, area, 0, 0, 0, eff) --alterado v1.4 doAreaCombatHealth(cid, psyDmg, area, whirl3, -min, -max, 255) --alterado v1.4 end end for a = 0, 4 do local t = { [0] = {250, {x=p.x, y=p.y-(a+1), z=p.z}}, --alterado v1.4 [1] = {250, {x=p.x+(a+1), y=p.y, z=p.z}}, [2] = {250, {x=p.x, y=p.y+(a+1), z=p.z}}, [3] = {250, {x=p.x-(a+1), y=p.y, z=p.z}} } addEvent(sendAtk, 370*a, cid, t[d][2], t[d][1], keep) end Depois, em pokemon moves.lua, acima de: setPlayerStorageValue(cid, 21102, spell) coloque: if getPlayerStorageValue(cid, 4389) > -1 and getPlayerStorageValue(cid, 21102) ~= "Miracle Eye" and getPlayerStorageValue(cid, 21102) ~= "Dark Eye" and getPlayerStorageValue(cid, 21102) ~= -1 then setPlayerStorageValue(cid, 4389, -1)end E, no código da função: getEffectvineSpell remova: setPlayerStorageValue(attacker, 4389, -1) Porém, o Miracle Eye provavelmente vai apresentar problemas em spells de addEvent, como aquele que enfrentamos antes neste tópico. Tudo, é lógico, seria mais fácil se o servidor não tivesse o problema do combat. Três simples linhas resolveriam o problema.
  9. Deu erro porque você conseguiu copiar o script errado. lol Olhe a configuração do código que postei: local config = { itemid = {xxx, xxx, xxx, ...}, --Configure nessa tabela o ID dos itens. edges = { fromPos = {x = x, y = y, z = z}, --Coordenadas da posição superior esquerda. toPos = {x = x, y = y, z = z} --Coordenadas da posição inferior direita. }}
  10. Outras spells com addEvent apresentam o mesmo problema (tanto fantasma quanto psíquico)? O Psyshock, normalmente, aplica dano tanto pela frente quanto pelos lados? Pode refazer aquele teste de imprimir informações com o Miracle Eye + Psyshock, dessa vez apenas pela frente? Pode colocar os print no mesmo lugar.
  11. Troque o código do Miracle Eye por este: elseif spell == "Dark Eye" or spell == "Miracle Eye" then doSendMagicEffect(getThingPosWithDebug(cid), 47) setPlayerStorageValue(cid, 21102, -1) setPlayerStorageValue(cid, 4389, os.time() + 10) E troque: if spellRace == "psychic" and (pokeElement1 == "dark" or pokeElement2 and pokeElement2 == "dark") and getPlayerStorageValue(attacker, 999457) > -1 then multiplier = 0.75 setPlayerStorageValue(attacker, 999457, -1) por: if (isInArray(typeTable[spellRace].non, pokeElement1) or pokeElement2 and isInArray(typeTable[spellRace].non, pokeElement2)) and getPlayerStorageValue(attacker, 4389) > os.time() then multiplier = 0.75 setPlayerStorageValue(attacker, 4389, -1) Para fins de testes, mantenha os prints apenas.
  12. Primeiramente, troque: addEvent(removeSpell, 1500, cid) por: setPlayerStorageValue(cid, 21102, -1)addEvent(removeSpell, 10 * 1000, cid) O Miracle Eye apresenta um problema semelhante aquele enfrentado inicialmente neste tópico - mais necessariamente, em spells com addEvent. Peço que teste, com a mudança acima, apenas spells instantâneas. Miracle Eye -> Spell. Espere um pouco. Teste de novo. Quando estiver funcionando adequadamente neste tipo de spell, partiremos para a solução das demais.
  13. local a = { ITEM = {2145, 10}, -- ITEM, QUANTIDADE}function onSay(cid) if getPlayerStorageValue(cid, 181713) > -1 then doPlayerSendCancel(cid, "Você já tem essa outfit.") return true elseif not doPlayerRemoveItem(cid, a.ITEM[1], a.ITEM[2]) then doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Desculpe mas voce nao tem Diamonds suficientes para Este Item.") doSendMagicEffect(getCreaturePosition(cid), 2) return true end doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Voce recebeu o outfit halloween.") setPlayerStorageValue(cid, 181713, 1) doSendMagicEffect(getCreaturePosition(cid), 28) return trueend
  14. Substitua o bloco do Miracle Eye pelo seguinte: if spellRace == "psychic" and (isInArray(typeTable[spellRace].non, pokeElement1) or pokeElement2 and isInArray(typeTable[spellRace].non, pokeElement2)) and getPlayerStorageValue(attacker, 999457) > -1 then print("Miracle Eye ativado.") multiplier = multiplier - 0.3 setPlayerStorageValue(attacker, 999457, -1) print("multiplier = "..multiplier)else print("Miracle eye não ativado.") if isInArray(typeTable[spellRace].non, pokeElement1) then multiplier = multiplier * 0 end if pokeElement2 and isInArray(typeTable[spellRace].non, pokeElement2) then multiplier = multiplier * 0 endend Depois, troque: value = value * multiplier por: print("Multiplier final: "..multiplier)print("Value antes da fórmula: "..value)value = value * multiplierprint("Value depois da fórmula: "..value) Depois, no creatureevent, abaixo de: value = getEffectvineSpell(attacker, spellNameFromAttacker, value, cid) -- checagem de efetividades de magia coloque: print("Value após getEffectvineSpell: "..value) Faça o teste novamente e informe o que for imprimido (peço que especifique, quando for postar as informações, quando o Miracle Eye foi ou não usado). Quanto ao problema do offense, há várias fórmulas usando este fator em, imagino, alguns arquivos. A função que o obtém retorna: pokes["nome_do_pokémon"].offense * heldBonusAttack Que é, basicamente, o valor configurado na tabela pokes multiplicado pelo bônus do held item. Imagino que não seja um bug, mas sim cálculos mal formulados. Recomendaria pegar um PDA e basear-se nas fórmulas nele presentes.
  15. Acho que foi erro de interpretação seu, eu não disse em momento algum para testá-lo em pokémons fantasmas (eu disse para testar o melee neles). De qualquer jeito, fiz uma pequena edição no bloco do Miracle Eye. Teoricamente está certo, mas peço que o teste e confirme. Nunca baixei essa base ou li outros códigos dela além dos que você postou, e, mesmo neles, li apenas o que era necessário para as correções. Por isso, não sei dizer o motivo disso. Talvez seja devido às fórmulas usadas no servidor, quem sabe.
  16. Abaixo de: function doMoveInArea2(cid, eff, area, element, min, max, spell, ret)if not isCreature(cid) then return true end coloque: if tostring(getPlayerStorageValue(cid, 21102)) ~= spell then setPlayerStorageValue(cid, 21102, spell)end Depois, abaixo de: function doMoveDano2(cid, pid, element, min, max, ret, spell) coloque: if tostring(getPlayerStorageValue(cid, 21102)) ~= spell then setPlayerStorageValue(cid, 21102, spell)end Quanto ao Miracle Eye, teoricamente, com ele ativado, uma magia psíquica pode atingir tipos dark. Não é isso que está acontecendo?
  17. OK. Primeiramente, testou o Miracle Eye e o melee em tipo fantasmas? Todas as spells que apresentam erro tem alguma relação com addEvent - ou seja, são executadas num momento posterior ao que foram conjuradas. Nas storms, Psyshock, Shockwave e Psy Pulse isso é mais óbvio. Entretanto, em spells como Fury Swipes, Nightmare e Shadow Punch, apenas lendo o código você irá reparar nisso. Nessas duas primeiras, há uma função em comum: doDanoWithProtectWithDelay Ao ler o código desta função, você irá perceber que há um addEvent também. É possível padronizar uma correção aplicando-a diretamente no código da função (há várias funções de dano escritas em Lua, encontradas na lib). Porém, há sempre exceções: funções escritas em C++ e funções que não tem a spell como argumento. No primeiro caso, há sim formas de simplificar a correção. No entanto, C++ não é muito minha praia e, além do mais, as spells que as usam dentro de um addEvent são pouquíssimas (como o Psyshock e o Shockwave; basta um CTRL + F para conferir). Em uns 10 minutos (no máximo), já seria possível aplicar a correção. Basicamente, acima do: doAreaCombatHealth(...) você colocaria: if tostring(getPlayerStorageValue(cid, 21102)) ~= spell then setPlayerStorageValue(cid, 21102, spell)end No caso das funções em Lua, há funções como doMoveInArea2 e doMoveDano2 que tem como um dos argumentos o nome da spell. Por causa disso, é possível colocar a proteção acima diretamente no código da função. Nas spells que usam estas funções, há o perigo do elemento ser substituído enquanto são executadas, por isso peço-lhe que poste o código de ambas as funções para que a proteção seja colocada. Entretanto, em funções como doDanoWithProtect e doDanoInTargetWithDelay, não temos este luxo. Seria até possível fazer algumas gambiarras usando o combat, mas isso atrapalharia situações como do Reflect. Então, sem a correção adequada na própria source do servidor (já que apresentar sempre o mesmo tipo de combat é um problema na fonte), resta apenas o trabalho braçal. Leve em consideração que jogadores normais NÃO têm a liberdade de usar spells sem cooldown algum, como você fez nos testes. Caso, em condições normais de gameplay, não houverem problemas como estes, não vejo muito porque se preocupar.
  18. O melee bater em pokémon fantasma e o Miracle Eye não funcionar não estão ligados diretamente a esse problema. De fato, não há proteções que anulam o melee em fantasmas e não há um código que ative o efeito do Miracle Eye. No código da função: function getEffectvineCombat(cid, attacker, value) Abaixo de: if getCreatureName(cid) == "Venusaur" and value ~= 0 and isMega(cid) and isInArray({"ice", "fire"}, pokeRaceAttacker)then -- Passiva thick fat value = value / 2end coloque: if pokeRaceDefender == "ghost" then --Melee ser anulado vs ghost type. value = 0end Depois, no código da função: function getEffectvineSpell(attacker, spellNameFromAttacker, value, cid) Troque: if isInArray(typeTable[spellRace].non, pokeElement1) then multiplier = multiplier * 0endif pokeElement2 and isInArray(typeTable[spellRace].non, pokeElement2) then multiplier = multiplier * 0end por: --Miracle eyeif spellRace == "psychic" and (pokeElement1 == "dark" or pokeElement2 and pokeElement2 == "dark") and getPlayerStorageValue(attacker, 999457) > -1 then multiplier = 0.75 setPlayerStorageValue(attacker, 999457, -1) else if isInArray(typeTable[spellRace].non, pokeElement1) then multiplier = multiplier * 0 end if pokeElement2 and isInArray(typeTable[spellRace].non, pokeElement2) then multiplier = multiplier * 0 endend Quanto às spells spammadas, você poderia fazer um teste com as spells Super Fang e Tackle? Preciso confirmar uma (espero) última coisa.
  19. Este erro acontece apenas com magias do tipo elétrico em tipos imunes? Ou, por exemplo, spammar magias psíquicas em tipo dark ou terrestres em tipo voador também acaba causando dano? Isto só acontece spammando magias iguais (temos que considerar que, se for o caso, jogadores normais não terão a liberdade de usar magias sem cooldown)? Por enquanto, este é o único problema? Após responder estas perguntas, peço que faça o teste imprimindo as informações conforme indiquei no meu primeiro comentário desta página (mantendo, contudo, as mudanças que fizemos posteriormente).
  20. Troque: return doSendMagicEffect(getThingPos(cid), effect) por: return doSendMagicEffect(getThingPos(getCreatureMaster(cid)), effect)
  21. Imagino que você não tenha lido meu primeiro comentário. Enfim, remova no creatureevent (NÃO na lib) essa linha: setPlayerStorageValue(cid, _Lib_Battle_Info.TeamOne.storage, -1) e essa: setPlayerStorageValue(cid, _Lib_Battle_Info.TeamTwo.storage, -1)
  22. Tem certeza que esse dano causado durante o spam de Electric Storms não foi originado pela passiva? É bem difícil enxergar, mas é uma possibilidade. Já quanto ao código dela, tente o seguinte: elseif spell == "Shock-Counter" then local function sendStickEff(cid, dir) if not isCreature(cid) then return true end if tostring(getPlayerStorageValue(cid, 21102)) ~= spell then setPlayerStorageValue(cid, 21102, spell) end doAreaCombatHealth(cid, ELECTRICDAMAGE, getPosByDir(getThingPosWithDebug(cid), dir), 0, -min, -max, 207) end local function doStick(cid) if not isCreature(cid) then return true end local t = { [1] = SOUTHWEST, [2] = SOUTH, [3] = SOUTHEAST, [4] = EAST, [5] = NORTHEAST, [6] = NORTH, [7] = NORTHWEST, [8] = WEST, [9] = SOUTHWEST, } for a = 1, 9 do addEvent(sendStickEff, a * 140, cid, t[a]) end end doStick(cid, false, cid) setPlayerStorageValue(cid, 98654, 1) Se não funcionar, parece que teremos que voltar a imprimir algumas informações.
  23. Na action, troque todos os: return false por: return true
  24. local revive = {itemid = 12344, max_count = 20}local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)NpcSystem.parseParameters(npcHandler)function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) endfunction onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) endfunction onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) endfunction onThink() npcHandler:onThink() endfunction Saffari(cid, message, keywords, parameters, node) if not npcHandler:isFocused(cid) then return false end if getPlayerItemCount(cid, revive.itemid) > revive.max_count then npcHandler:say("To enter here, you can only carry "..revive.max_count.." revive(s). Deposit the rest on the DP, please.", cid) return true end if not parameters.premium and not isPremium(cid) then npcHandler:say('Sorry, you need to be premium account!', cid) return true elseif not doPlayerRemoveMoney(cid, parameters.price) then npcHandler:say('Sorry, you dont have enought money!', cid) return true end doPlayerSendTextMessage(cid, 22, 'Good Luck!.') doTeleportThing(cid, parameters.enter) npcHandler:resetNpc() return trueendlocal node1 = keywordHandler:addKeyword({'tower'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Nessa {tower} possui monstros muito fortes você esta pronto para enfrenta-los?? Mais antes guarde suas pokebolas no DP....ah você so tem 60 minutos de tempo para realizar essa quest!!!!'})node1:addChildKeyword({'yes'}, Saffari, {premium = no, price = 0, enter = {x = 1235, y = 630, z = 8}, exit = {x = 1235, y = 630, z = 8}, minutes = 60})node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Ok, then.', reset = true})npcHandler:addModule(FocusModule:new())
  • Quem Está Navegando   0 membros estão online

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