Jump to content
  1. mastof

    mastof

  2. Bruno Maciell

    Bruno Maciell

  3. samlecter

    samlecter

  4. Igorzerah

    Igorzerah

  5. Thiago Rulexz

    Thiago Rulexz

  6. tcheco1994

    tcheco1994

  7. ducb

    ducb

  8. FlamesAdmin

    FlamesAdmin

  9. Aksz

    Aksz

  • Recently Browsing   0 members

    No registered users viewing this page.


  • Similar Content

    • By 161996
      SIM! NÓS ESTAMOS DE VOLTA!
      http://psoul.com.br/
       
      Depois de mais de uma década, o melhor Poketibia da história esta devolta, de cara nova! É isso mesmo!, segue como o jogo se encontra atualmente:

      - Fly, Ride, Surf e Teleport = FREE !!
      - Host brasileiro, ping mais baixo possível;
      - Torneios automáticos todos os dias;
      - Pokémons com level.
      - Evolução por level e por stones.
      - Sistema de Market do jogador.
      - Sistema de arvore de talentos.
      - Sistema de autoloot ao clicar no pokémon.
      - Pokémons da 1ª a 3ª geração completa com todos os Shinys;
      - 4ª geração em construção;
      - Pokémons totalmente balanceados;
      - Muitas quests;
      - Ranger club (tasks diárias);
      - Sistema de Nature, IVs e EVs;
      - Sistema de Helds;
      - Sistema de vitaminas;
      - Sistema de Eggs;
      - Sistema de Berries e plantio;
      - Sistema de TM;
      - Sistema de Safari baseado na franquia;
      - Sistema de pokémons boss;
      - Cliente totalmente otimizado.
      - Cliente mobille sendo implantado;
      E muito mais!

      [PRINTS]:
        

      Venha jogar conosco! Acesse: https://psoul.com.br/
      Dicord: https://discord.gg/kPFAA8PgPK
      Fan clube: http://www.psoulcmm.com.br/
      Facebook: https://facebook.com/psoul
    • By usoparagames
      Boa tarde galera ,estou com um problema no meu servidor, é o seguinte ,qualquer npc de duelo que eu enfrentr ,quando eu derroto o pokemon do npc ,o pokemon morre e vira corpo de pokemon selvagem ,sendo possível jogar ball e etc,  porém n sei oq é, ou se é algo que eu fiz errado no script de npc .
      Porém n sei como resolver já que fiquei uns 4 anos com o projeto parado .
       
      Quem puder me ajudar ficarei grato 
       
      Obs: n da nenhum erro na distro em relação a isso!!

    • By Fearlet
      Tibia Infinity
       
      Olá Tibianos, é com grande satisfação e orgulho que apresento a vocês meu novo projeto consistente em diversas ideias para vários temas de servidores alternativos, com o propósito de ser a primeira equipe a desenvolver servidores, onde o servidor e o player tenham rendas num ciclo econômico a ideia principal é um servidor usando no momento apenas nosso dinheiro real BRL, porém futuramente com o capital em mãos criar nosso token TINF.
       
      No momento estamos a procura de colaboradores, desenvolvedores e patrocinadores corajosos afim de enfrentar aventuras e desafios em nossa equipe, procuramos pessoas que tenham disponibilidade de horário, disponibilidade de contato, prontos para trabalharem dedicadamente aos servidores, pessoas com facilidade de trabalho em equipe, trabalho com metas a serem cumpridas e entregues.
       
       
      Quais projetos iniciados está a caminho ?
      Temos três servidores, em desenvolvimento.

       
      TibiaLands – Este servidor é baseado na fazenda feliz para quem já jogou, ou para quem está no mundos dos NFTs uma das formas de farm é igual ao PVU (Plant vs Undead) que consiste também na plantação, mineração, gastronomia e agropecuária e até a caça de presas.
      Tibia Infinity - Servidor de Tibia alternativo baseado no Tibia 7.4. O jogo tem um verdadeiro mapa global 7.4, com todas as missões daquela época e muito mais. O RPG de Tibia Infity vai além. Na época em que Tibia 7.4 (2005) foi jogado, havia uma magia em torno de itens extremamente raros. Pessoas se reúnem ao redor do mapa tentando resolver mistérios que até hoje não foram resolvidos a nostalgia e o tempo gastos valerão a pena. Não há nenhum item intocável. Mas não será fácil, servidor está sendo 24hrs sendo pensado em como será a economia do jogo, pois sabemos que é dificil, dentro de impostos e má intenções de pessoas que existem hoje em dia.
      PokeInfinity – Servidor alternativo de pokémon onde os players entram para duelarem, com torneios diários, recompensas, tokens, porém com a principal ideia do player pagar para adquirir seu time principal e participar de torneios rankeados, para quem já jogo o torneio global (TG) da pokexgames, será basicamente aqui porém o player irá ter uma renda extra caso ele resolva investir em seu time e pense estrategicamente.

       

       
      Quer saber mais do projeto? entre no nosso Discord.
      Quer ser parte da equipe? Entre no nosso discord e chamem o ADM no pv.
      Lippe#7652
       
      https://discord.gg/53KWSBgYUc

      Alguns spoiler de uns dos projetos
       
       

      OBRIGADO A TODOS PELA ATENÇÃO !!!

       

       
    • By L3K0T
      Bom pessoal eu resolvi compartilhar o meu sistema de torneio para poketibia que fiz para meu projeto, ele tem a função de ocorrer 4 vezes ao dia....Falando apenas com o 1 NPC Nick da cidade aonde você por....
       
      Como funciona ? Mata todos e o ultimo que sobrar na arena de batalha é o ganhador!
       
      1° Pasta LIB copie um arquivo e deverá renomear para torneio ficando torneio.lua apaga tudo que tem dentro e add
       
      torneio = { awardTournament = 2148, ---moeda usada para entra no torneio-- awardAmount = 1000, -- quantidade de moeda que o player vai ganhar ao vencer o torneio-- playerTemple = {x = 893, y = 499, z = 15}, --pra onde vai o player quando morrer ?-- tournamentFight = {x = 894, y = 538, z = 15}, --centro da arena torneio combate-- area = {fromx = 866, fromy = 508, fromz = 15, tox = 922, toy = 572, toz= 15},--canto acima direito da arena combate-canto esquerdo abaixo da arena combate-- waitPlace = {x = 969, y = 544, z = 15}, --centro da sala de espera-- waitArea = {fromx = 957, fromy = 536, fromz = 15, tox = 983, toy = 552, toz= 15}, --canto esquerdo acima da sala de espera--canto abaixo esquerdo da sala de espera-- startHour1 = "07:50:00", --horario do aviso?-- endHour1 = "08:00:00",--horario que começa?-- startHour2 = "11:50:00",--horario do aviso?-- endHour2 = "12:00:00",--horario do aviso?-- startHour3 = "17:50:00",--horario do aviso?-- endHour3 = "18:00:00",--horario do aviso?-- startHour4 = "22:50:00",--horario do aviso?-- endHour4 = "23:00:00",--horario do aviso?-- price = 500,--valor para entrar no torneio ? 500 dollar no caso-- revivePoke = 12344,--aqui é revive se tiver e se não tiver não precisa mexer-- } function getPlayersInArea(area) local players = {} for x = area.fromx,area.tox do for y = area.fromy,area.toy do for z = area.fromz,area.toz do local m = getTopCreature({x=x, y=y, z=z}).uid if m ~= 1 and isPlayer(m) then table.insert(players, m) end end end end return players end apaga os coments do scripts acima com --blablabla--
       
       
       
      2° GLOBALEVENTS vá na pasta globalevents/scripts copia um arquivo que voc?ê deverá renomear para torneio ficando torneio.lua e add
       
      function onTime() if #getPlayersInArea(torneio.area) > 1 then doBroadcastMessage("O Torneio dessa vez não teve vencedor, tente na proxima vez") return true end for _, pid in ipairs(getPlayersInArea(torneio.waitArea)) do puxar = math.random(-2, 2) doTeleportThing(pid, {x = torneio.tournamentFight.x + puxar, y = torneio.tournamentFight.y + puxar, z = torneio.tournamentFight.z}) end doBroadcastMessage("O torneio Iniciou!") return true end ou dependendo do tfs pode ser
       
      function onTimer() if #getPlayersInArea(torneio.area) > 1 then doBroadcastMessage("O Torneio dessa vez não teve vencedor, tente na proxima vez") return true end for _, pid in ipairs(getPlayersInArea(torneio.waitArea)) do puxar = math.random(-2, 2) doTeleportThing(pid, {x = torneio.tournamentFight.x + puxar, y = torneio.tournamentFight.y + puxar, z = torneio.tournamentFight.z}) end doBroadcastMessage("O torneio Iniciou!") return true end  
       
       
      agora em globalevents.xml add as tag
       
      <globalevent name="TournamentStart1" time="08:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart2" time="12:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart3" time="18:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart4" time="23:00" event="script" value="torneio.lua"/>
      ou
       
      <globalevent name="TournamentStart1" timer="08:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart2" timer="12:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart3" timer="18:00" event="script" value="torneio.lua"/> <globalevent name="TournamentStart4" timer="23:00" event="script" value="torneio.lua"/>  
       
      ainda em globalevents vá em globalevents/scripts copie outro arquivo e renomeia para, msgtorneio ficando msgtorneio.lua e add
       
      local i = { ["07:50"] = {nome = "O Torneio vai começar em 10 minutos, fale com o NPC Nike no CP de sua cidade, vai custar 500 Dollar's para participar!"}, ["07:55"] = {nome = "Faltam 5 minutos para fechar as inscrições do torneio!"}, ["07:59"] = {nome = "As inscrições do Torneio fecharam!"}, ["11:50"] = {nome = "O Torneio vai começar em 10 minutos, fale com o NPC Nike no CP de sua cidade, vai custar 500 Dollar's para participar!"}, ["11:55"] = {nome = "Faltam 5 minutos para fechar as inscrições do torneio!"}, ["11:59"] = {nome = "As inscrições do Torneio fecharam!"}, ["17:50"] = {nome = "O Torneio vai começar em 10 minutos, fale com o NPC Nike no CP de sua cidade, vai custar 500 Dollar's para participar!"}, ["17:55"] = {nome = "Faltam 5 minutos para fechar as inscrições do torneio!"}, ["17:59"] = {nome = "As inscrições do Torneio fecharam!"}, ["22:50"] = {nome = "O Torneio vai começar em 10 minutos, fale com o NPC Nike no CP de sua cidade, vai custar 500 Dollar's para participar!"}, ["22:55"] = {nome = "Faltam 5 minutos para fechar as inscrições do torneio!"}, ["22:59"] = {nome = "As inscrições do Torneio fecharam!"}, } function onThink(interval, lastExecution) hours = tostring(os.date("%X")):sub(1, 5) tb = i[hours] if tb then doBroadcastMessage(hours .. " - " .. tb.nome .. "") end return true end agora as tag globalevents.xml add
       
      <globalevent name="msg torneio" interval="60000" event="script" value="msgtorneio.lua"/>  
      pronto agora vamos mexer com actions...
       
      3° ACTIONS para o player receber a recompensa... vá em actions/scripts copie um arquivo lá e renomeia para torneio ficando torneio.lua e add
       
      function onUse(cid, item) local torneios = 1 if #getCreatureSummons(cid) >= 1 then doPlayerSendCancel(cid, "Volte seu pokémonDBR!") else if #getPlayersInArea(torneio.area) > 1 then doPlayerSendTextMessage(cid, 20 ,"Só o ultimo que ficar na arena, poderá abrir está porta! ") return true end doTeleportThing(cid, torneio.playerTemple) doBroadcastMessage("[Torneio] Parabéns ao treinador "..getCreatureName(cid).." foi o ganhador do torneio de hoje, verifique o rank em nosso site www.seusite.com!") doPlayerAddItem(cid,2148,300) addTopt(cid, torneios) doPlayerSendTextMessage(cid,MESSAGE_EVENT_ORANGE,"[Torneio] Você já venceu "..(getTopt(cid,torneio)).."x, Parabéns.") doPlayerAddItem(cid, torneio.awardTournament, torneio.awardAmount) return true end end agora a tag de actions.xml add
       
      <action uniqueid="18279" event="script" value="torneio.lua"/>  
      *18279 é unique ID que vc terá que por numa porta alavanca o que for pra depois o ultimo player clicar...
       
       
       
      4° NPC vá na pasta npc/scripts copia um arquivo e você deverá renomear para torneio ficando torneio.lua e add
       
      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, 'torneio') or msgcontains(msg, 'enter') then if getPlayerItemCount(cid, torneio.revivePoke) >= 1 then selfSay('Voce nao Pode entrar no torneio com {revives}, por favor guarde eles e volte a falar comigo novamente.', cid) return true end selfSay('Voce quer Participar no torneio por '..torneio.price..' de Dollars?', cid) talkState[talkUser] = 2 elseif talkState[talkUser] == 2 then if msgcontains(msg, 'yes') or msgcontains(msg, 'sim') then if os.date("%X") < torneio.startHour1 or os.date("%X") > torneio.endHour1 then if os.date("%X") < torneio.startHour2 or os.date("%X") > torneio.endHour2 then if os.date("%X") < torneio.startHour3 or os.date("%X") > torneio.endHour3 then if os.date("%X") < torneio.startHour4 or os.date("%X") > torneio.endHour4 then selfSay('As inscrições para o torneiro ainda não abriram, volte ás 07:50 AM, 11:50 AM, 17:50 AM ou ás 22:50 PM todo os dias', cid) return true end end end end if doPlayerRemoveMoney(cid, torneio.price) then doTeleportThing(cid, torneio.waitPlace) doPlayerSendTextMessage(cid, 21, "Bem vindo, esta e a sala de espera, voce espera aqui enquanto o torneio nao começa.") else selfSay('Voce não tem ('..torneio.price..') Dollars.', cid) end else selfSay('Certeza que voce não quer Participar? Ok, ate a Proxima', cid) talkState[talkUser] = 0 end end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) bom agora volte um pasta e copia um arquivo.xml e renomeia para torneio ficando torneio.xml e add
       
      <?xml version="1.0" encoding="UTF-8"?> <npc name="Nick" script="torneio.lua" walkinterval="999000" floorchange="0"> <health now="150" max="150"/> <look type="1245" head="20" body="100" legs="50" feet="99" corpse="2212"/>] <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Sou o NIKE, Encarregado pelo Torneio diario caso queira entrar diga: {torneio}."/> </parameters> </npc> 5° importa para seu mysql o código
       
      ALTER TABLE `players` ADD `torneio` int(11) NOT NULL default '0'; agora a vá na pasta lib copia um arquivo.lua e renomeia para torneio e add ficando torneio.lua
       
      function getTopt(cid) local check4 = db.getResult("SELECT `torneio` FROM `players` WHERE `id` = " .. getPlayerGUID(cid) .. " LIMIT 1") return check4:getDataInt("torneio") <= 0 and 0 or check4:getDataInt("torneio") end function addTopt(cid,amount) db.executeQuery("UPDATE `players` SET `torneio` = "..getTopt(cid).."+"..amount.." WHERE `id` = "..getPlayerGUID(cid)) end function removeTopt(cid,amount) db.executeQuery("UPDATE `players` SET `torneio` = "..getTopt(cid).."-"..amount.." WHERE `id` = "..getPlayerGUID(cid)) end function setTopt(cid,value) db.executeQuery("UPDATE `players` SET `torneio` = "..value.." WHERE `id` = "..getPlayerGUID(cid)) end 6° pronto torneio 4 vezes ao dia + npc + rank para site como usar o rank no site ? vai em htdocs/template/seulayout/index.tpl e add em algum lugar lá
       
      <div class="top-box"> {include_php file='torneio.php'} </div>  
      agora vá em htdocs criar um novo text com nome torneio.php e add
       
      <?PHP //** Connection to the database **// $ots = POT::getInstance(); $ots->connect(POT::DB_MYSQL, connection()); $SQL = POT::getInstance()->getDBHandle(); //** Top Players + online status By Kavvson **// $money_list = $SQL->query('SELECT name,torneio FROM players ORDER BY torneio DESC LIMIT 5')->fetchAll(); $i = 1; foreach($money_list as $money_chr){ echo '<center>'; echo $i.'. <a href="/pt/index.php/character/view/'.urlencode($money_chr['name']).'">'; $player = $ots->createObject('Player'); $player->find($money_chr['name']); echo '<font color="'; echo ($player->isOnline()) ? 'green' : 'green'; echo '">'; echo ''.$money_chr['name'].'</b></a></font>'; echo' Torneio Ganhos: '.$money_chr['torneio'].'</B>'; $i++; } for( $i; $i <= 1; $i++ ){ echo $i.'. <br><i>Empty</i><br /><br />'; } echo '</center>';  
       
      isso ai pessoal é completo eu fiz pro meu PokémonDBR que tinha fechado então resolvi compartilhar.... qualquer copia favor bote devido créditos e não quero ver ninguém vendendo meu scripts....
       
      Créditos a mim... qualquer dúvida falando que não sou o dono aqui minha página da PokémonDBR e agora somos otPokémon World Online  http://facebook.com/otpwonline
       
    • By Diego767
      Boa tarde, estou com o problema no meu Prey System, onde todos os chares sempre ficam com a mesma Prey independente do monstro.
      Alguem sabe o que pode ter de errado?
       
      Prey = {
          Credits = "System remake: Westwol ~ Packet logic: Cjaker ~  Formulas: slavidodo",
          Version = "4.0",
          LastUpdate = "07/07/19",
      }
      CONST_PREY_SLOT_FIRST = 0
      CONST_PREY_SLOT_SECOND = 1
      CONST_PREY_SLOT_THIRD = 2
      CONST_MONSTER_TIER_BRONZE = 0
      CONST_MONSTER_TIER_SILVER = 1
      CONST_MONSTER_TIER_GOLD = 2
      CONST_MONSTER_TIER_GOLD = 3
      CONST_MONSTER_TIER_PLATINUM = 4
      CONST_BONUS_DAMAGE_BOOST = 0
      CONST_BONUS_DAMAGE_REDUCTION = 1
      CONST_BONUS_XP_BONUS = 2
      CONST_BONUS_IMPROVED_LOOT = 3
      Prey.Config = {
          ListRerollPrice = 2000
      }
      Prey.S_Packets = {
          ShowDialog = 0xED,
          PreyRerollPrice = 0xE9,
          PreyData = 0xE8,
          PreyTimeLeft = 0xE7
      }
      Prey.StateTypes = {
          LOCKED = 0,
          INACTIVE = 1,
          ACTIVE = 2,
          SELECTION = 3,
          SELECTION_CHANGE_MONSTER = 4
      }
      Prey.UnlockTypes = {
          PREMIUM_OR_STORE = 0,
          STORE = 1,
          NONE = 2
      }
      Prey.Actions = {
          NEW_LIST = 0,
          NEW_BONUS = 1,
          SELECT = 2,
      }
      Prey.C_Packets = {
          RequestData = 0xED,
          PreyAction = 0xEB
      }
      Prey.Bonuses = {
          [CONST_BONUS_DAMAGE_BOOST] = {step = 2, min = 7, max = 25},
          [CONST_BONUS_DAMAGE_REDUCTION] = {step = 2, min = 12, max = 30},
          [CONST_BONUS_XP_BONUS] = {step = 3, min = 13, max = 40},
          [CONST_BONUS_IMPROVED_LOOT] = {step = 3, min = 13, max = 40}
      }
      Prey.MonsterList = {
          [CONST_MONSTER_TIER_BRONZE] = {
              "Rotworm", "Carrion Worm", "Skeleton", "Ghoul", "Cyclops", "Cyclops Drone", "Cyclops Smith", "Dark Magician",
              "Beholder", "Dragon", "Dragon Hatchling", "Dwarf", "Dwarf Guard", "Dwarf Geomancer", "Dwarf Soldier", "Earth Elemental",
              "Fire Elemental", "Gargoyle", "Merlkin", "Minotaur", "Minotaur Guard", "Minotaur Mage", "Minotaur Archer", "Nomad",
              "Amazon", "Hunter", "Orc", "Orc Berserker", "Orc Leader", "Orc Shaman", "Orc Spearman", "Orc Warlord", "Panda",
              "Rotworm Queen", "Tarantula", "Scarab", "Skeleton Warrior", "Smuggler"
          },
          [CONST_MONSTER_TIER_SILVER] = {
               "Pirate Buccaneer", "Pirate Ghost", "Pirate Marauder", "Pirate Skeleton", "Dragon Lord Hatchling", "Frost Dragon Hatchling",
              "Behemoth", "Faun", "Dark Faun", "Dragon Lord", "Frost Dragon", "Hydra", "Hero", "Bullwark", "Giant Spider", "Crystal Spider",
              "Deepling Brawler", "Deepling Elite", "Deepling Guard", "Deepling Master Librarian", "Deepling Tyrant", "Deepling Warrior",
              "Wyrm", "Elder Wyrm", "Fleshslicer", "Frost Giant", "Ghastly Dragon", "Ice Golem", "Infernalist", "Warlock", "Lich",
              "Lizard Chosen", "Lizard Dragon Priest", "Lizard High Guard", "Lizard Legionnaire", "Lizard Zaogun", "Massive Energy Elemental",
              "Massive Fire Elemental", "Massive Water Elemental", "Minotaur Amazon", "Execowtioner", "Minotaur Hunter", "Mooh'Tah Warrior",
              "Mutated Bat", "Mutated Human", "Necromancer", "Nightmare", "Nightmare Scion", "Ogre Brute", "Ogre Savage", "Ogre Shaman",
              "Orclops Doomhauler", "Orclops Ravager", "Quara Constrictor", "Quara Constrictor Scout", "Quara Hydromancer", "Quara Mantassin",
              "Quara Pincher", "Quara Predator", "Sea Serpent", "Shaper Matriarch", "Silencer", "Spitter", "Worker Golem", "Werewolf",
              "Hellspawn", "Shadow Tentacle", "Vampire Bride", "Dragonling", "Shock Head", "Frazzlemaw",
          },
          [CONST_MONSTER_TIER_GOLD] = {
              "Plaguesmith", "Demon", "Crystal Spider", "Defiler", "Destroyer", "Diamond Servant", "Draken Elite",
              "Draken Spellweaver", "Draken Warmaster", "Draken Abomination", "Feversleep", "Terrorsleep", "Draptor",
              "Grim Reaper", "Guzzlemaw", "Hellfire Fighter", "Hand of Cursed Fate", "Hellhound", "Juggernaut",
              "Sparkion", "Dark Torturer", "Undead Dragon", "Retching Horror", "Choking Fear", "Choking Fear",
              "Shiversleep", "Sight Of Surrender", "Demon Outcast", "Blightwalker", "Grimeleech", "Vexclaw", "Grimeleech",
              "Dawnfire Asura", "Midnight Asura", "Frost Flower Asura", "True Dawnfire Asura", "True Frost Flower Asura",
              "True Midnight Asura"
          }
      }
      -- Communication functions
      function Player.sendResource(self, resourceType, value)
          local typeByte = 0
          if resourceType == "bank" then
              typeByte = 0x00
          elseif resourceType == "inventory" then
              typeByte = 0x01
          elseif resourceType == "prey" then
              typeByte = 0x0A
          end
          local msg = NetworkMessage()
          msg:addByte(0xEE)
          msg:addByte(typeByte)
          msg:addU64(value)
          msg:sendToPlayer(self)
      end
      function Player.sendErrorDialog(self, error)
          local msg = NetworkMessage()
          msg:addByte(Prey.S_Packets.ShowDialog)
          msg:addByte(0x15)
          msg:addString(error)
          msg:sendToPlayer(self)
      end
      -- Core functions
      function Player.setRandomBonusValue(self, slot, bonus, typeChange)
          local type = self:getPreyBonusType(slot)
          local min = Prey.Bonuses[type].min
          local max = Prey.Bonuses[type].max
          local step = Prey.Bonuses[type].step
          if bonus then
              if typeChange then
                  self:setPreyBonusValue(slot, math.random(min, max))
              else
                  local oldValue = self:getPreyBonusValue(slot)
                  if (oldValue + step >= max) then
                      self:setPreyBonusValue(slot, max)
                  else
                      while (self:getPreyBonusValue(slot) - oldValue < step) do
                          self:setPreyBonusValue(slot, math.random(min, max))
                      end
                  end
              end
          else
              self:setPreyBonusValue(slot, math.random(min, max))
          end
          self:setPreyBonusGrade(slot, math.floor((self:getPreyBonusValue(slot) - min) / (max - min) * 10))
          if (self:getPreyBonusGrade(slot) == 10 and self:getPreyBonusValue(slot) < max) then
              self:setPreyBonusGrade(slot, self:getPreyBonusGrade(slot) - 1)
          end
      end
      function Player.getMonsterTier(self)
          if self:getLevel() > 0 and self:getLevel() < 60 then
              return CONST_MONSTER_TIER_BRONZE
          elseif self:getLevel() >= 60 and self:getLevel() < 160 then
              return CONST_MONSTER_TIER_SILVER
          elseif self:getLevel() >= 160 then
              return CONST_MONSTER_TIER_GOLD
          end
      end
      function Player.createMonsterList(self)
          -- Do not allow repeated monsters
          local repeatedList = {}
          for slot = CONST_PREY_SLOT_FIRST, CONST_PREY_SLOT_THIRD do
              if (self:getPreyCurrentMonster(slot) ~= '') then
                  repeatedList[#repeatedList + 1] = self:getPreyCurrentMonster(slot)
              end
              if (self:getPreyMonsterList(slot) ~= '') then
                  local currentList = self:getPreyMonsterList(slot):split(";")
                  for i = 1, #currentList do
                      repeatedList[#repeatedList + 1] = currentList
                  end
              end
          end
          -- Generating monsterList
          local monsters = {}
          while (#monsters ~= 9) do
              local randomMonster = Prey.MonsterList[self:getMonsterTier()][math.random(#Prey.MonsterList[self:getMonsterTier()])]
              -- Verify that monster actually exists
              if MonsterType(randomMonster) and not table.contains(monsters, randomMonster) and not table.contains(repeatedList, randomMonster) then
                  monsters[#monsters + 1] = randomMonster
              end
          end
          return table.concat(monsters, ";")
      end
      function Player.resetPreySlot(self, slot, from)
          self:setPreyMonsterList(slot, self:createMonsterList())
          self:setPreyState(slot, from)
          return self:sendPreyData(slot)
      end
      function Player.getMinutesUntilFreeReroll(self, slot)
          local currentTime = os.time()
          if (self:getPreyNextUse(slot) <= currentTime) then
              return 0
          end
          return math.floor((self:getPreyNextUse(slot) - currentTime) / 60)
      end
      function Player.getRerollPrice(self)
          return (self:getLevel() / 2) * 100
      end
      function onRecvbyte(player, msg, byte)
          if (byte == Prey.C_Packets.RequestData) then
              player:sendPreyData(CONST_PREY_SLOT_FIRST)
              player:sendPreyData(CONST_PREY_SLOT_SECOND)
              player:sendPreyData(CONST_PREY_SLOT_THIRD)
          elseif (byte == Prey.C_Packets.PreyAction) then
              player:preyAction(msg)
          end
      end
      function Player.preyAction(self, msg)
          local slot = msg:getByte()
          local action = msg:getByte()
          if not slot then
              return self:sendErrorDialog("Sorry, there was an issue, please relog-in.")
          end
          -- Verify whether the slot is unlocked
          if (self:getPreyUnlocked(slot) ~= 1) then
              return self:sendErrorDialog("Sorry, you don't have this slot unlocked yet.")
          end
          -- Listreroll
          if (action == Prey.Actions.NEW_LIST) then
              -- Verifying state
              if (self:getPreyState(slot) ~= Prey.StateTypes.ACTIVE and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION_CHANGE_MONSTER) then
                  return self:sendErrorDialog("This is slot is not even active.")
              end
              -- If free reroll is available
              if (self:getMinutesUntilFreeReroll(slot) == 0) then
                  self:setPreyNextUse(slot, os.time() + 20 * 60 * 60)
              elseif (not self:removeMoneyNpc(self:getRerollPrice())) then
                  return self:sendErrorDialog("You do not have enough money to perform this action.")
              end
              self:setPreyCurrentMonster(slot, "")
              self:setPreyMonsterList(slot, self:createMonsterList())
              self:setPreyState(slot, Prey.StateTypes.SELECTION_CHANGE_MONSTER)
          -- Bonus reroll
          elseif (action == Prey.Actions.NEW_BONUS) then
              -- Verifying state
              if (self:getPreyState(slot) ~= Prey.StateTypes.ACTIVE) then
                  return self:sendErrorDialog("This is slot is not even active.")
              end
              if (self:getPreyBonusRerolls() < 1) then
                  return self:sendErrorDialog("You don't have any bonus rerolls.")
              end
              -- Removing bonus rerolls
              self:setPreyBonusRerolls(self:getPreyBonusRerolls() - 1)
              -- Calculating new bonus
              local oldType = self:getPreyBonusType(slot)
              self:setPreyBonusType(slot, math.random(CONST_BONUS_DAMAGE_BOOST, CONST_BONUS_IMPROVED_LOOT))
              self:setRandomBonusValue(slot, true, (oldType ~= self:getPreyBonusType(slot) and true or false))
          -- Select monster from list
          elseif (action == Prey.Actions.SELECT) then
              local selectedMonster = msg:getByte()
              local monsterList = self:getPreyMonsterList(slot):split(";")
              -- Verify if the monster exists.
              local monster = MonsterType(monsterList[selectedMonster + 1])
              if not monster then
                  return self:sendPreyData(slot)
              end
              -- Verifying slot state
              if (self:getPreyState(slot) ~= Prey.StateTypes.SELECTION and self:getPreyState(slot) ~= Prey.StateTypes.SELECTION_CHANGE_MONSTER) then
                  return self:sendErrorDialog("This slot can't select monsters.")
              end
              -- Proceeding to prey monster selection
              self:selectPreyMonster(slot, monsterList[selectedMonster + 1])
          end
          -- Perfom slot update
          return self:sendPreyData(slot)
      end
      function Player.selectPreyMonster(self, slot, monster)
          -- Verify if the monster exists.
          local monster = MonsterType(monster)
          if not monster then
              return self:sendPreyData(slot)
          end
          local msg = NetworkMessage()
          -- Only first/expired selection list gets new prey bonus
          if (self:getPreyState(slot) == Prey.StateTypes.SELECTION) then
              -- Generating random prey type
              self:setPreyBonusType(slot, math.random(CONST_BONUS_DAMAGE_BOOST, CONST_BONUS_IMPROVED_LOOT))
              -- Generating random bonus stats
              self:setRandomBonusValue(slot, false, false)
          end
          -- Setting current monster
          self:setPreyCurrentMonster(slot, monster:getName())
          -- Setting preySlot state
          self:setPreyState(slot, Prey.StateTypes.ACTIVE)
          -- Cleaning up monsterList
          self:setPreyMonsterList(slot, "")
          -- Time left
          self:setPreyTimeLeft(slot, 7200) -- 2 hours
      end
      function Player.sendPreyData(self, slot)
          if not slot then
              return true
          end
          local slotState = self:getPreyState(slot)
          local msg = NetworkMessage()
          msg:addByte(Prey.S_Packets.PreyData) -- packet header
          msg:addByte(slot) -- slot number
          msg:addByte(slotState) -- slot state
          -- This slot will preserve the same bonus and % but the monster might be changed
          if slotState == Prey.StateTypes.SELECTION_CHANGE_MONSTER then
              -- This values have to be stored on each slot
              msg:addByte(self:getPreyBonusType(slot))
              msg:addU16(self:getPreyBonusValue(slot))
              msg:addByte(self:getPreyBonusGrade(slot))
              -- MonsterList already exists in the slot
              local monsterList = self:getPreyMonsterList(slot):split(";")
              msg:addByte(#monsterList)
              for i = 1, #monsterList do
                  local monster = MonsterType(monsterList)
                  if monster then
                      msg:addString(monster:getName())
                      msg:addU16(monster:getOutfit().lookType or 21)
                      msg:addByte(monster:getOutfit().lookHead or 0x00)
                      msg:addByte(monster:getOutfit().lookBody or 0x00)
                      msg:addByte(monster:getOutfit().lookLegs or 0x00)
                      msg:addByte(monster:getOutfit().lookFeet or 0x00)
                      msg:addByte(monster:getOutfit().lookAddons or 0x00)
                  else
                      -- Reset slot as it got bugged
                      return self:resetPreySlot(slot, Prey.StateTypes.SELECTION_CHANGE_MONSTER)
                  end
              end

          -- This slot will have a new monsterList and a random bonus
          elseif slotState == Prey.StateTypes.SELECTION then
              -- If list is empty, then we will create a new one and assign it to the monsterList or timeleft = 0
              local preyMonsterList = self:getPreyMonsterList(slot)
              if preyMonsterList == '' then
                  self:setPreyMonsterList(slot, self:createMonsterList())
                  -- Resending this preySlot as there was a change.
                  return self:sendPreyData(slot)
              end
              local monsterList = preyMonsterList:split(";")
              msg:addByte(#monsterList)
              for i = 1, #monsterList do
                  local monster = MonsterType(monsterList)
                  if monster then
                      msg:addString(monster:getName())
                      msg:addU16(monster:getOutfit().lookType or 21)
                      msg:addByte(monster:getOutfit().lookHead or 0x00)
                      msg:addByte(monster:getOutfit().lookBody or 0x00)
                      msg:addByte(monster:getOutfit().lookLegs or 0x00)
                      msg:addByte(monster:getOutfit().lookFeet or 0x00)
                      msg:addByte(monster:getOutfit().lookAddons or 0x00)
                  else
                      -- Reset slot as it got bugged
                      return self:resetPreySlot(slot, Prey.StateTypes.SELECTION)
                  end
              end
          -- This slot is active and will show current monster and bonus
          elseif slotState == Prey.StateTypes.ACTIVE then
              -- Getting current monster
              local monster = MonsterType(self:getPreyCurrentMonster(slot))
              if monster then
                  msg:addString(monster:getName())
                  msg:addU16(monster:getOutfit().lookType or 21)
                  msg:addByte(monster:getOutfit().lookHead or 0x00)
                  msg:addByte(monster:getOutfit().lookBody or 0x00)
                  msg:addByte(monster:getOutfit().lookLegs or 0x00)
                  msg:addByte(monster:getOutfit().lookFeet or 0x00)
                  msg:addByte(monster:getOutfit().lookAddons or 0x00)
                  msg:addByte(self:getPreyBonusType(slot))
                  msg:addU16(self:getPreyBonusValue(slot))
                  msg:addByte(self:getPreyBonusGrade(slot))
                  msg:addU16(self:getPreyTimeLeft(slot))
              else
                  -- Reset slot as it got expired or bugged.
                  return self:resetPreySlot(slot, Prey.StateTypes.SELECTION)
              end
          -- This slot is inactive and will not take any extra bytes
          elseif slotState == Prey.StateTypes.INACTIVE then

          elseif slotState == Prey.StateTypes.LOCKED then
              msg.addByte(Prey.UnlockTypes.PREMIUM_OR_STORE) -- Store unlock method
          end
          -- Resources and times are always sent
          msg:addU16(self:getMinutesUntilFreeReroll(slot)) -- next prey reroll here
          -- Client 11.9+ compat, feature unavailable.
          if self:getClient().version >= 1190 then
              msg:addByte(0x00) -- preyWildCards
          end
          msg:addByte(0xEC)
          self:sendResource("prey", self:getPreyBonusRerolls())
          self:sendResource("bank", self:getBankBalance())
          self:sendResource("inventory", self:getMoney())
          -- List reroll price
          msg:addByte(Prey.S_Packets.PreyRerollPrice)
          msg:addU32(self:getRerollPrice())
          -- Client 11.9+ compat, feature unavailable.
          if self:getClient().version >= 1190 then
              msg:addByte(0x00)
              msg:addByte(0x00)
          end
          -- Sending message to client
          msg:sendToPlayer(self)
      end
       

×
×
  • Create New...

Important Information

Confirmação de Termo