Ir para conteúdo

xWhiteWolf

Héroi
  • Registro em

  • Última visita

Tudo que xWhiteWolf postou

  1. seu reset system é por storage? Se for é editar todas as suas spells pra tirarem um dano multiplicado por k onde esse k seja o valor do storage (numero de resets) +1 multiplicado por um coeficiente de resets (que vai definir o quão influente é o dano em relação aos resets)
  2. xWhiteWolf postou uma resposta no tópico em Suporte Tibia OTServer
    a lógica é a seguinte local playerid = getPlayerGUID(cid) local ml = 7 local skillnew = 20 ​ if isInArray({5,6}, getPlayerVocation(cid)) then db.executeQuery("UPDATE `players` SET `maglevel` = `maglevel` + ".. newml .." WHERE `players`.`id`= ".. playerid .."") elseif isInArray({8}, getPlayerVocation(cid)) then local club = getPlayerSkillLevel(cid, SKILL_CLUB) local sword = getPlayerSkillLevel(cid, SKILL_SWORD) local axe = getPlayerSkillLevel(cid, SKILL_AXE) db.executeQuery("UPDATE `player_skills` SET `value` = " .. (axe + skillnew) .. ", `count` = 0 WHERE `skillid` = 3 and `player_id` = " .. playerid .. ";") db.executeQuery("UPDATE `player_skills` SET `value` = " .. (sword + skillnew) .. ", `count` = 0 WHERE `skillid` = 2 and `player_id` = " .. playerid .. ";") db.executeQuery("UPDATE `player_skills` SET `value` = " .. (club + skillnew) .. ", `count` = 0 WHERE `skillid` = 1 and `player_id` = " .. playerid .. ";") elseif isInArray({7}, getPlayerVocation(cid)) then local distance = getPlayerSkillLevel(cid, SKILL_DISTANCE) db.executeQuery("UPDATE `player_skills` SET `value` = " .. (distance + skillnew) .. ", `count` = 0 WHERE `skillid` = 4 and `player_id` = " .. playerid .. ";") end se seu server for 8.6 ou maior use db.query no lugar de db.executeQuery
  3. pq vc criou outro tópico cara? http://www.tibiaking.com/forum/topic/33043-spell-kamui/
  4. xWhiteWolf postou uma resposta no tópico em Suporte Tibia OTServer
    qual seu servidor? vc quer que adicione +7 de ML ou que dê uma quantidade equivalente do 0 até o 7?
  5. isso é dificil de fazer cara... eu faria assim: criaria um storage onde seria os pontos e um creaturescript onAdvance pra ganhar os pontos, o resto seria por talkactions pra distribuir os pontos nas skills q vc gostaria mas aí vc precisaria mexer nas sources pra criar funções que mudem a attack speed pois isso só é possível pelas armas atualmente. Sobre a redistribuição dá pra fazer um npc ou até mesmo por talkaction mas acho q npc fica mais legal, e voce poderia imitar a história do Kingdom of Amalur: Reckoning e chamar ele de Fateweaver. Mas não sei como vc impediria os players de treinarem normalmente e ser só por esse sistema (como eu disse, precisaria mexer nas sources) e tb não sei como fazer a parte q brilha ou clica pra distribuir mas acredito q seja pelas sources tb.
  6. xWhiteWolf postou uma resposta no tópico em Suporte Tibia OTServer
    depende doque vc quiser, onAdvance acho que serve só pra skills/ml/level, se fizer com storage vc vai ter que upar pra ele checar o storage e ativar o dano por segundo. Se fizer por login, o player ganha o storage mas só vai tomar o dano quando relogar. Eu faria por onThink que é uma função que fica se repetindo de 1 em 1 segundo a checagem mas dá pra vc mudar esse intervalo. aqui nesse link dá pra vc checar todos os callbacks de acordo com o tipo de script, espero que te ajude: http://www.tibiaking.com/forum/topic/8603-callbacks edit2: aqui eu vou te dar um exemplo de como utilizar por onThink (esse script eu fiz prum amigo mas ele me deu permissão pra postar) Funciona assim: vc clica no escudo da medusa e ativa essa skill (quem olhar pra medusa vira pedra), só que enquanto vc tiver utilizando a skill vc fica perdendo 20 de vida por segundo. Perceba que no meu caso eu não precisei mudar o interval, eu só coloquei interval e foi o tempo padrão, que é 1 segundo. Espero que vc consiga fazer esse script que vc quer, e se possível, compartilhe ele conosco! Seu server não vai deixar de ser original só porque outras pessoas irão utilizar um script feito por você, lembre-se disso.
  7. logico que deu erro cara, vc não leu nada doque eu te falei? o script não tá completo, é só a logica que a pessoa que for te ajudar tem que seguir.. eu não sei como fazer pra voltar de uma forma que não bugue, mas enfim, o erro é aqui: -- storage que vai salvar a posição do target (isso é possível?) tira o (isso é possível?)
  8. olha cara, eu pensei em várias coisas mas a maioria delas vai bugar o seu servidor, então eu decidi fazer uma coisa que eu nunca fiz antes (e não sei se é possível) que foi salvar a posição num storage. Caso isso funcione, só vai faltar a função teleportback que eu não consegui pensar em como fazer mas em todo caso vou disponibilizar o script pra quem for tentar te ajudar: Nota 1: Não usem "for" na área teleportada pra encontrar o player porque se mais de um player usar essa magia ao mesmo tempo corre o risco dos targets serem trocados local combat = createCombatObject() local config = { exhaustStorage = 1338010, -- storage do exhaust exhaustTime = 5, -- Seconds duration = 20, -- tempo em segundos que ele vai ficar na outra dimensão postorage = 1338011 -- storage que vai salvar a posição do target (isso é possível?) } function teleportback(cid, var, targetpos, target) ​ if isPlayer(target.uid) then doTeleportThing(target, getPlayerStorageValue(target.uid, config.postorage)) doPlayerSendTextMessage(target.uid,25, "You are back, time for a twist!") end end function onCastSpell(cid, var) local mypos = getCreaturePosition(cid) local target = getCreatureTarget(cid) local targetpos = getCreaturePosition(target) local place = {x = 160, y=54, z= 7} setPlayerStorageValue(target.uid, config.postorage, targetpos) if not exhaustion.get(cid, config.exhaustStorage) then if isPlayer(cid) and isPlayer(target.uid) then doPlayerSendTextMessage(cid,25, "You teleported ".. getCreatureName(target.uid) ..". He will be back in "..config.duration.." seconds.") doTeleportThing(target, place) doSendDistanceShoot(mypos, targetpos, CONST_ANI_ENERGYBALL) doSendMagicEffect(targetpos, CONST_ME_ENERGYHIT) doPlayerSendTextMessage(target.uid,25, "You have been teleported by ".. getCreatureName(cid) ..". You'll be back in "..config.duration.." seconds.") addEvent(teleportback, config.duration*1000, cid, var, targetpos, target) exhaustion.set(cid, config.exhaustStorage, config.exhaustTime) else doPlayerSendCancel(cid, "You can only use this spell in players!") return false else doPlayerSendCancel(cid, "You have to wait " .. exhaustion.get(cid, config.exhaustStorage) .. " seconds to send player to another dimension!") return false end end doCombat(cid, combat, var) return true end
  9. I could try to help you further if you post the scripts and explain what is this that you're talking about. It's a script on the server or some editing at sources?
  10. rateExperienceFromPlayers = 100 coloca 1 ou 0
  11. Nossa mano, que lógica mais fodenda mas tipo, oque fodeu minha mente mesmo foi isso daqui: local amuleto_novo = amuletos[lower_lvls[#lower_lvls]] table amuletos[table de lower_lvls[tamanho do ultimo lower_lvls(que no caso seria o maior, ou seja, o anterior ao meu)]] Eu nunca tinha visto esse tipo de lógica, vou até colocar nos favoritos aqui pra tentar utilizar depois auhauhauh tableception
  12. não entendi essa segunda parte, seria pros players já criados no server terem seus amuletos atualizados?
  13. ele quis dizer que os players conseguem subir em cima dos baús, se ele colocar o item atrás do baú de mostruário dá pros players roubarem. Ele quer saber como fazer para que os players não consigam subir em cima do baú.
  14. que otserv é o seu, o meu é 8.45, usa o meu reload: local reloadInfo = { {RELOAD_ACTIONS, "actions", "action"}, {RELOAD_CHAT, "chat", "channels"}, {RELOAD_CONFIG, "config", "configuration"}, {RELOAD_CREATUREEVENTS, "creatureevents", "creature events", "creaturescripts", "creature scripts", "creatureevent", "creature event", "creature script", "creaturescript"}, {RELOAD_GAMESERVERS, "gameservers", "game servers", "servers"}, {RELOAD_GLOBALEVENTS, "globalevents", "global events", "globalevent", "global event"}, {RELOAD_GROUPS, "groups", "playergroups", "group"}, {RELOAD_HIGHSCORES, "highscores", "scores", "highscore", "score"}, {RELOAD_HOUSEPRICES, "houseprices", "house prices", "prices"}, {RELOAD_ITEMS, "items", "item"}, {RELOAD_MONSTERS, "monsters", "monster"}, {RELOAD_MOVEEVENTS, "moveevents", "move events", "movements", "move", "movement"}, {RELOAD_NPCS, "npcs", "npc"}, {RELOAD_OUTFITS, "outfits", "outfit"}, {RELOAD_QUESTS, "quests", "quest"}, {RELOAD_RAIDS, "raids", "raid"}, {RELOAD_SPELLS, "spells", "spell"}, {RELOAD_STAGES, "stages", "experience"}, {RELOAD_TALKACTIONS, "talkactions", "talk actions", "talk", "commands", "talkaction", "talk action"}, {RELOAD_VOCATIONS, "vocations", "vocation"}, {RELOAD_WEAPONS, "weapons", "weapon"}, {RELOAD_MODS, "mods", "modifications"}, {RELOAD_ALL, "all", "everything"} } function onSay(cid, words, param, channel) if(param == '') then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.") return true end param = param:lower() local str = "Reload type not found." for _, v in ipairs(reloadInfo) do if(table.isStrIn(param, v)) then doReloadInfo(v[1], cid) str = "Reloading " .. v[2] .. "..." break end end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, str) return true end se o server ficar na sua casa, é mais fácil dar reload pelo próprio console doque por comando de gm.
  15. xWhiteWolf postou uma resposta no tópico em Suporte Tibia OTServer
    bater muito forte é uma frase muito abrangante, um monte de gente me pede ajuda pra balancear classes mas o balanceamento não é dado somente pelo vocations.xml e sim de uma série de fatores que eu vou listar abaixo na ordem de importancia: 1) Spells - Certifique de que caso você faça magia novas, atente-se às formúlas para não acabar tornando uma classe muito OP e procure sempre que criar uma magia, criar outras pra outras classes e tentar manter o balanceamento 2) Vocations.xml - Aqui você pode alterar o ataque speed, o quão rápido sobe a skill de cada classe, quanto de vida ganha.. não faça valores muito distoantes doque é o tibia global para evitar oque acontece na maior dos OT's: Magia que tira 200 e players que tem 50k de life, tornando os PVP's chatos e praticamente infinitos... tb não cometa o erro de acabar caindo no contrário, magia que tira 57347683876348 milhão e o melhor player tem 5k de life. 3) Áreas de Hunt - Pouca gente se liga nisso mas as áreas do seu server influenciam diretamente qual classe será melhor, mapas do tipo yourots são horriveis para paladin porque a grande parte dos bixos em que dá pra upar são rápidos e conseguem grudar fácil, muitos monstros também tem imunidades contra poison e isso acaba prejudicando os druids num early game. Pra late game lembre-se de fazer áreas condizentes e preste sempre atenção tanto na quantidade de monstros que você coloca numa área (pra não juntar tudo e acabar trapando um sorc) quanto na topografia da área (áreas pequenas tentem a dificultar escapadas) quanto para os tipos de monstros (é importante ler as imunidades deles) 4) Scripts em geral - Uma action que transforma uma espada em outra com 500 a mais de ataque provavelmente facilitaria a vida dos knights, fique ligado nisso pois muitos scripts e quests espalhadas pelo mapa as vezes acabam sendo exclusivos (no sentido de excluir mesmo), não adianta criar uma quest nova mó dificil que no final dá magic plate armor (uma armadura somente para Knights). Lembre-se que a graça de um jogo é quando todas as classes utilizando itens equivalentes tem a mesma capacidade destrutiva só que de maneiras diferentes, se o seu server tá tendo mais players sorcereres doque players de outras classes, desconfie! Faça updates regulares e crie magias novas para continuar balanceando sempre!
  16. /reload funciona apenas para certos tipos de arquivos: Spells, movements, actions, npc e deve ter mais algum que funcione.. os outros só abrindo e fechando o server mesmo.
  17. xWhiteWolf postou uma resposta no tópico em Suporte Tibia OTServer
    acho q é só mudar a frase pelo parametro <talkaction words="!afk;/afk" script="afk.lua" /> local function doSendAutoMessage(cid, pos) if (isCreature(cid) == true) then npos = getThingPos(cid) if (pos.x == npos.x) and (pos.y == npos.y) and (pos.z == npos.z) then doSendAnimatedText(pos, param) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) addEvent(doSendAutoMessage, 2*1000, cid, npos) end end end function onSay(cid, words, param) pos = getThingPos(cid) doSendAnimatedText(pos, param) doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE) doCreatureSay(cid, "AFK: "..param..".", TALKTYPE_ORANGE_1) doPlayerPopupFYI(cid, "Voce esta afk! Ande para sair!") addEvent(doSendAutoMessage, 2*1000, cid, pos) return true end digite /afk Andando de skate que o player vai ficar repetindo: AFK: Andando de skate.
  18. acabei esquecendo desse post aqui: function onKill(cid, target, lastHit) local monster = "Zombie" -- nome do zombie local storage = 78956 -- deixa o mesmo storage pra todos os zombies, daí o final do script vai ser pegar o valor desse storage de cada player local points = 1 -- qnts pontos vai dar if isPlayer(cid) and getCreatureName(target) == monster then setPlayerStorageValue(cid, storage, getPlayerStorageValue(cid,storage)+points) return true end end em creaturescripts.xml <event type="kill" name="zombie1" event="script" value="zombie1.lua"/> coloca no arquivo xml do monstro que vai dar esse ponto assim: <script> <event name="zombie1"/> </script> e coloca no creaturescripts\login.lua registerCreatureEvent(cid, "zombie1") agora é só repetir isso pra todos os zombies que você for usar! ===================== PARTE II Pra fazer as raids você dá uma pesquisada no fórum e após criá-las vc pode colocar pra executar esse script aqui créditos ao MaXwEllDeN porque isso daqui foi ele que fez pra ajudar um cara em outro tópico: local storage = 78956 function getPoints(cid) return getPlayerStorageValue(cid, storage) end function getPlayersThatHavePoints() local players = {} for _, cid in pairs(getPlayersOnline()) do if(getPoints(cid) > 5) then table.insert(players, cid) end end return players end if #getPlayersThatHavePoints() > 1 then local x = 6 while #players > 1 do for _, cid in pairs(players) do if(getPoints(cid) < x) then table.remove(players, cid) end end x = x + 1 end elseif #players == 1 then doBroadcastMessage("Temos um vencedor.", 18) elseif #players == 0 then doBroadcastMessage("Não houve nenhum vencedor.", 18) end Lembre-se que você vai ter que adicionar no login.lua local storage = 78956 if getPlayerStorageValue(cid,storage) > 0 then setPlayerStorageValue(cid, storage, 0) agora preciso dormir, não testei nada e fiz tudo me baseando em suposições que podem estar erradas. Sou péssimo com tables e suas respectivas funções então se tiver algo errado aí a culpa é da minha ignorância haha; Note que ainda falta um "..players[1].." na table pra retornar o nome do vencedor e um script que adicione um prêmio a esse vencedor. Note ainda que não há prêmios e nem mensagens de erro caso empatem mas acho que isso daqui ja dá uma ideia forte de como fazer esse script, qualquer coisa vou tentando te ajudar com o tempo
  19. eu tinha visto os erros e corrigido no meu script mas esqueci de avisar aqui: local amuletos = { [1] = 7887, [2] = 7888, [5] = 7889, [7] = 7890, [10] = 2129, [13] = 2130, [16] = 2131, [20] = 2132, [25] = 2133, [30] = 2134, [35] = 2135 } function onAdvance(cid, skill, oldlevel, newlevel) if skill == 8 and amuletos[newlevel] then doTransformItem(getPlayerSlotItem(cid, CONST_SLOT_NECKLACE).uid, amuletos[newlevel]) doPlayerSendTextMessage(cid, 22, "You received "..getItemNameById(amuletos[newlevel]).." for reaching level "..newlevel..".") end return true end agora é só completar com os ids seguindo a ordem, e lembre-se que não tem virgula depois do ultimo valor da table! O erro era na linha 9, mais precisamente aqui: getItemNameById(amuletos[newlevel) tava faltando fechar o colchetes do newlevel. De quebra ainda coloquei um espaço que o max havia comido na mensagem que manda ao player, tava saindo "for reaching level25" mas isso não é nada comparado com oque ele fez pro script ser possível.
  20. valeu mesmo pela explicação cara, ajudou muito!
  21. <movevent type="StepOut" itemid="12165" event="script" value="closingdoor.lua"/> pelo menos no meu servidor o nome do script em movements que fecha a porta se chama closingdoor.lua e tem isso daqui dentro dele:
  22. é só editar as áreas: e no final vc muda quantas vezes vc quer que isso aconteça e de quanto em quanto tempo: addEvent(onCastSpell1, 500, parameters) -- faz a area 1 em 0,5 segundo addEvent(onCastSpell2, 700, parameters) -- faz a area 2 em 0,7 segundo, 0,2 segundo a mais que a anterior addEvent(onCastSpell3, 900, parameters) -- . addEvent(onCastSpell4, 1200, parameters)-- . addEvent(onCastSpell5, 1300, parameters)-- . addEvent(onCastSpell6, 1500, parameters)-- . addEvent(onCastSpell7, 1700, parameters)-- . addEvent(onCastSpell8, 1800, parameters) -- faz a area 8 em 1,8 segundo, 0,1 segundo a mais que a anterior a lógica da coisa é essa daqui: adicionarevento(lançarAMagiadeNumero1, em 500 milisegundos (1000 milisegundos = 1 segundo), utilizando os parametros definidos anteriormente)
  23. ficou bem melhor assim mesmo, eu não parei pra pensar que o amuleto é irremovível e que era muito mais fácil transformar >.>, só uma pergunta max, if skill == 8 and amuletos[newlevel] then ele vai substituir meu amuleto antigo pelo amuleto novo sempre que a table amuletos[meu level novo] existir? então nesse caso o valor amuletos[10] seria o valor da table quando meu nivel for 10? Achei que amuletos[10] retornava o décimo valor da minha table que no caso seria [30]= 2134
  24. o pessoal não pode fechar o tópico mas você pode: Clique em "Melhor Resposta" e obrigado pelo REP
  25. testa assim local voc20 = local voc21_40 = local voc41 = local strg = 84849 local cap = {20, 21, 40, 41} function onEquip(cid, item, slot) local check = getItemWeight(item, 1) local save = getPlayerVocation(cid) setPlayerStorageValue(cid, strg, save) if check < cap[1] then doPlayerSetVocation(cid, voc20) doPlayerSendTextMessage(cid, 20, "Parabens, sua vocacao mudou para ".. getPlayerVocationName(cid) ..".") elseif check >= cap[2] and check <= cap[3] then doPlayerSetVocation(cid, voc21_40) doPlayerSendTextMessage(cid, 20, "Parabens, sua vocacao mudou para ".. getPlayerVocationName(cid) ..".") elseif check > cap[4] then doPlayerSetVocation(cid, voc41) doPlayerSendTextMessage(cid, 20, "Parabens, sua vocacao mudou para ".. getPlayerVocationName(cid) ..".") end return true end function onDeEquip(cid, item, slot) local back = getPlayerStorageValue(cid, strg) doPlayerSetVocation(cid, back) doPlayerSendTextMessage(cid, 20, "Sua vocacao foi resetada.") return true end se isso não der certo experimenta declarar local item = IDdoitem em questão (o mesmo do movements.xml)

Informação Importante

Confirmação de Termo