Postado Maio 18, 2016 9 anos Bom dia família TK! Vim fazer hoje um pedido de um system que ainda não vi em nenhum servidor de pokemon e que seria bem interessante! A ideia é a seguinte: Um pokemon mais forte que o normal spawna a cada 4 horas num lugar aleatorio, exemplo, nas spawns de Primeape, spawna um Giant Primeape, que seria um primeape com tamanho maior que seria o "Mestre dos Primeapes". A ideia é que esse pokemon dê respawn a cada 4 horas em umas 3 posições do mapa determinadas por mim, exemplo: floresta de viridian, ilha dos primeapes, e golden island, mas dai eu escolheria o X,Y e Z saca? Outras particularidades que gostaria de pedir é: - Quando um World Boss do tipo do Giant Primeape spawnasse, aparecesse no servidor inteiro a mensagem "Um World Boss acaba de aparecer!" pois assim todos iriam caçar pra saber qual nascer, interagirem juntos e tudo mais; - O World Boss desaparecer depois de 1 hora, pra caso ninguem encontra-lo ele num ficar no mapa vagando, pois a ideia é que seja um monstro realmente forte e com bons loots, porém se ele ficar lá vagando pode atrapalhar e tbm depois de um tempo outro vai dar respaw e vao ficar 2, 3 e assim sucessivamente, o que não seria a ideia ... - A ideia é que ele não nasça toda vez que o servidor reiniciar também, pois nesse caso, a cada reset no servidor, todos os world boss estariam vivos, a ideia é que realmente eles tenham um horário fixo de 4 em 4 horas. - Não sei se isso é possivel, mas a ideia é que o corpse desses World Bosses funcionem como baú de quest, nesse caso o player da use no corpse e pega o prêmio, porém, eu gostaria que essa storage que ele ganha por pegar o prêmio não fosse fixa, e sim, durasse somente umas horas, pra quando nascer outro do mesmo world boss ele possa brincar novamente, vou dar um exemplo que deve facilitar: "EXEMPLO: Matei o world boss, dei use no corpinho dele e peguei meu premio, eu não posso clicar denovo nesse e pegar outro premio porque ganhei uma storage, porém essa storage seria passageira, e daqui a 4 horas eu poderia competir pelo loot novamente..." Bom essa é minha ideia pessoal, acho que isso seria uma ótima interação diferenciada pros players, que ficam só nessa rotina de PVP, UP e Quests, agradeço desde ja quem puder ajudar ai!
Postado Maio 18, 2016 9 anos O storage temporário seria para qualquer boss ou apenas para um boss específico que o player matou? Não dou suporte via PM, crie um tópico caso tenha dúvidas. Isso previne que outras pessoas com a mesma dúvida criem tópicos desnecessários.
Postado Maio 18, 2016 9 anos Autor 6 minutos atrás, Talesigorvr disse: O storage temporário seria para qualquer boss ou apenas para um boss específico que o player matou? Seria para cada um específico, por exemplo, matei o Giant Primeape, peguei a storage dele, porém se nesse meio tempo que o cara ta com a storage outros world boss aparecerem, ele pode participar também, cada um teria a sua storage específica.
Postado Maio 18, 2016 9 anos Solução Bom, vamos lá. Não consegui fazer de um jeito "automático", demorei por isso. Só consegui fazer automático com o storage para todos os pokémons. Espero que fazer "manualmente" não te atrapalhe tanto. Para cada Giant pokémon, um novo arquivo e uma nova tag deve ser criada em actions. O ID do item invisível/baú deve ser diferente também. Lembrando que pelo jeito que eu fiz, você deve criar um item novo. Se não fizer, ao clicar em um item com o mesmo ID que este, você receberá a recompensa. globalevents/scripts nome_arquivo.lua Este vai fazer o monstro aparecer. function onThink(cid, interval, lastExecution) local bosses = { [1] = {name = "Giant Primeape", times = 3, pos = {[1] = {x=1050, y=1054, z=7}, [2] = {x=1051, y=1054, z=7}, [3] = {x=1052, y=1054, z=7}}}, [2] = {name = "Giant Wigglytuff", times = 1, pos = {[1] = {x=1045, y=1053, z=7}}}, -- [um numero maior que o de cima] = nome do monstro, quantas vezes ele vai spawnar (deve ser igual ao numero de posições), posições que ele vai spawnar. } local boss = math.random (#bosses) for i = 1, bosses[boss].times do doSummonCreature(bosses[boss].name, bosses[boss].pos[i]) end doBroadcastMessage("Um World Boss acaba de aparecer!") return true end globalevents/scripts nome_arquivo.lua Este vai fazer o monstro desaparecer. function onThink(cid, interval, lastExecution) local from1 = {x = 1046, y = 1048, z = 7} -- canto superior esquerdo da área que irá spawnar o Giant. local to1 = {x = 1055, y = 1059, z = 7} -- canto inferior direito da área que irá spawnar o Giant. for x = from1.x, to1.x do for y = from1.y, to1.y do for z = from1.z, to1.z do local pos = {x = x, y = y, z = z, stackpos = 253} local monsterTile = getThingfromPos(pos).uid if isMonster(monsterTile) and getCreatureName (monsterTile) == "Giant Primeape" then doRemoveCreature(monsterTile) end end end end doBroadcastMessage ("O World Boss sumiu!") return true end XML: <globalevent name="spawnWorldBoss" interval="14400" script="nome_arquivo.lua"/> <globalevent name="removeWorldBoss" interval="3600" script="nome_arquivo.lua"/> creaturescripts/scripts nome_arquivo.lua local bosses = { [1] = {name = "Giant Primeape", item = 12163, storage = 6151321}, [2] = {name = "Giant Wigglytuff", item = 12170, storage = 6151322}, -- [um número mais que o de cima] = {nome do monstro, ID do item, storage para verificar se o player matou o monstro. O storage deve ser diferente dos demais, recomendo ser 1 número maior que o de cima}, -- lembre-se de colocar a vírgula no final. } local timeToRemove = 60 -- tempo em segundos para remover o item invisível/baú. local effect = 27 -- efeito que vai sair do player ao matar o pokémon. local function doCreateItemWithDelay (item, position) doCreateItem(item, 1, position) return true end local function doRemoveItemWithDelay (item, position) local tileItem = getTileItemById(position, item).uid if tileItem ~= 0 then doRemoveItem(tileItem, 1) end return true end function onKill(cid, target) for i = 1, #bosses do if isInArray(bosses[i].name, getCreatureName(target)) then if getPlayerStorageValue (cid, bosses[i].storage) ~= 1 then doPlayerSendTextMessage (cid, 19, "Agora você pode pegar a sua recompensa!") doSendMagicEffect (getThingPos (cid), effect) setPlayerStorageValue (cid, bosses[i].storage, 1) end addEvent(doCreateItemWithDelay, 1, bosses[i].item, getCreaturePosition(target)) addEvent(doRemoveItemWithDelay, timeToRemove * 1000, bosses[i].item, getCreaturePosition(target)) end end return true end XML: <event type="kill" name="worldBoss" event="script" value="nome_arquivo.lua"/> Registre o evento em login.lua. registerCreatureEvent(cid, "worldBoss") actions/scripts nome_arquivo.lua local config = { item = 2160, -- ID do item que será adicionado. qnt = 5, -- quantidade de itens que será adicionado. timeOut = 4, -- tempo em horas para poder pegar o prêmio deste pokémon novamente. exhausted = 102548, -- esse é o storage do exhausted, um monstro sempre tem que ser diferente do outro. Recomendo colocar um número maior. storage = 6151321, -- storage para verificar se o jogador matou o monstro. Deve ser o mesmo do creaturescripts, para cada monstro. effect = 28, -- efeito que vai sair em cima do player ao dar use no item. } local function timeToCheckIfKillMonster (cid, storage) setPlayerStorageValue (cid, storage, -1) return end function onUse(cid, item, frompos, item2, topos) if getPlayerStorageValue (cid, config.storage) == 1 then if getPlayerStorageValue (cid, config.exhausted) < os.time() then doPlayerAddItem (cid, config.item, config.qnt) doPlayerSendTextMessage (cid, 19, "Parabéns! Você derrotou o Giant Primeape!") doSendMagicEffect (getThingPos(cid), config.effect) setPlayerStorageValue (cid, config.exhausted, config.timeOut * 60 * 60 + os.time()) addEvent(timeToCheckIfKillMonster, config.timeOut * 1000 * 60 * 60 , cid, config.storage) else doPlayerSendTextMessage (cid, 19, "Você só poderá receber o prêmio do Giant Primeape em algumas horas.") end else doPlayerSendTextMessage (cid, 19, "Você não derrotou o Giant Primeape.") end return true end XML: <action itemid="ID_DO_ITEM_QUE_SERÁ_DROPADO_NA_POSIÇÃO_DO_MONSTRO" event="script" value="nome_arquivo.lua"/> OBS: No XML do globalevents, o interval é em segundos. 14400 = 4 horas em segundos, 3600 = 1 hora em segundos. OBS2: No script que remove o monstro, caso queira adicionar mais áreas, você deve criar uma nova variável, ficando assim: local from1, from2, from3 = posição do canto superior esquerdo da área (from1), posição do canto superior esquerdo da área (from2), posição do canto superior esquerdo da (from3) local to1, to2, to3 = posição do canto inferior direito da área (to1), posição do canto inferior direito da área (t2), posição do canto inferior direito da área (to3) Exemplo: local from1, from2, from3 = {x = 1046, y = 1048, z = 7}, {x = 1046, y = 1048, z = 7}, {x = 1030, y = 1032, z = 7} local to1, to2, to3 = {x = 1055, y = 1059, z = 7}, {x = 1055, y = 1059, z = 7}, {x = 1020, y = 1025, z = 7} Lembre-se: sempre separado por vírgulas. E também, criar um novo bloco de for, copiando o de cima e trocando apenas o número do from/to e o nome do monstro, exemplo: for x = from1.x, to1.x do for y = from1.y, to1.y do for z = from1.z, to1.z do local pos = {x = x, y = y, z = z, stackpos = 253} local monsterTile = getThingfromPos(pos).uid if isMonster(monsterTile) and getCreatureName (monsterTile) == "Giant Primeape" then doRemoveCreature(monsterTile) end end end end for x = from2.x, to2.x do for y = from2.y, to2.y do for z = from2.z, to2.z do local pos = {x = x, y = y, z = z, stackpos = 253} local monsterTile = getThingfromPos(pos).uid if isMonster(monsterTile) and getCreatureName (monsterTile) == "Giant Wigglytuff" then doRemoveCreature(monsterTile) end end end end for x = from3.x, to3.x do for y = from3.y, to3.y do for z = from3.z, to3.z do local pos = {x = x, y = y, z = z, stackpos = 253} local monsterTile = getThingfromPos(pos).uid if isMonster(monsterTile) and getCreatureName (monsterTile) == "Giant Scyther" then doRemoveCreature(monsterTile) end end end end Espero que tenha entendido. =) Para remover os pokémons automaticamente, adaptei um script de Jamison Collins/IagoNp. Editado Maio 18, 2016 9 anos por Talesigorvr (veja o histórico de edições) Não dou suporte via PM, crie um tópico caso tenha dúvidas. Isso previne que outras pessoas com a mesma dúvida criem tópicos desnecessários.
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.