Ir para conteúdo

Featured Replies

Postado

 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:

Resolvido por Bodak Reborn

Ir para solução
Postado
  • 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
  • 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.

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo