Ir para conteúdo
  • Cadastre-se

(Resolvido)[PEDIDO] World Boss System!


Ir para solução Resolvido por Bodak Reborn,

Posts Recomendados

 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! :wow::grin:

Link para o post
Compartilhar em outros sites

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.

Link para o post
Compartilhar em outros sites
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.

Link para o post
Compartilhar em outros sites
  • 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 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.

Link para o post
Compartilhar em outros sites

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.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo