Ir para conteúdo

Tower quest


Posts Recomendados

Hail Xtibianos!

 

Eu fiz essa quest há um tempo atrás como uma forma diferente da paradox tower quest.

 

Existem sete níveis  (pode ser modificado), cada nível terá uma série de monstros, ao matar todos os monstros os players são teleportados para o andar acima, no último andar será a sala da recompensa.

 

Deixo aqui um exemplo de como montar a tower quest.

 

Parte superior (sala da recompensa)

tile_full_1.jpg.70e2c52539f2642e198be5d71c298f7e.jpg

 

Parte inicial com escada.

tile_first_7.jpg.1d510d161eb12dc972133bacce091f8b.jpg

 

Primeira sala com monstros (aqui o sistema começa a funcionar).

second_tile_6.jpg.165e4c97b8255b1a3ecc681627843870.jpg

 

Implementando o sistema.

 

Na escada tu coloca uma aid qualquer, registra no arquivo movements.xml

Ex:

Citar

<movevent type="StepIn" actionid="1000" event="script" value="tower.lua"/>

 

Agora crie um arquivo lua e põe esse código nele.

 

tower.lua

Spoiler

local events,towers,QuantPlayersTower = {},{
	{x=908,y=925,z=6,firstNivel=6,ultimoNivel=1},--posição central e primeira sala da torre 1. firstNivel mesmo valor do z; ultimoNivel é o ultimo nivel da torre; sala da recompensa.
	{x=926,y=921,z=7,firstNivel=7,ultimoNivel=5},--posição central e primeira sala da torre 2.  firstNivel mesmo valor do z;  ultimoNivel é o ultimo nivel da torre; sala da recompensa.
	--{x=0,y=0,z=0},--posição central e primeira sala da torre 3 e assim sucessivamente...
},2 -- quantidade de players por sala da tower

function rollUpLevelTower(tower,id,players)
	tower.z = tower.z-1
	for _,cid in pairs(players) do
		if(isPlayer(cid))then
		local Ppos = getCreaturePosition(cid)
			Ppos.z = Ppos.z-1
			doTeleportThing(cid,Ppos)
		end
	end
	events[id] = addEvent(upDateLevelKTower,1000,tower,id)
end

function upDateLevelKTower(tower,id)
local search = getCreaturesInRange(tower, 3, 3, true, showPlayers)
local players = getCreaturesInRange(tower, 3, 3, showMonsters, true)
	if(#players > 0 and search[1])then
		events[id] = addEvent(upDateLevelKTower,1000,tower,id)
	elseif(tower.z > tower.ultimoNivel)then
		for _,cid in pairs(players) do
			doPlayerSendCancel(cid,"10 segundos para o proximo nivel.")
		end
		events[id] = addEvent(rollUpLevelTower, 10*1000, tower,id,players) -- 10 segundos para ir para o proximo nivel.
		return
	else
		for _,cid in pairs(players) do	
			setPlayerStorageValue(cid,getStoreString("towerQuest"),tonumber(os.date("%d"))) 
		end	
	end
	events[id] = nil
	tower.z = tower.firstNivel	
end

function onStepIn(cid, item, pos)
	if not isPlayer(cid) then return true end
	for k,tower in pairs(towers) do
	local pp = getCreaturesInRange(tower, 3, 3, showMonsters, true)
		if(getPlayerStorageValue(cid,getStoreString("towerQuest")) == tonumber(os.date("%d")))then
			doPlayerSendCancel(cid,"Tu já fizeste essa quest hoje. Amanhã poderás faze-la de novo.")
		elseif(#pp < QuantPlayersTower)then 
			doTeleportThing(cid,tower)
			if not events[k] then table.insert(events,addEvent(upDateLevelKTower,1000,tower,k)) end
			return true
		elseif(#towers == k)then
			doPlayerSendCancel(cid,"Todas as torres estão ocupadas.")
		end
	end
	return false
end 

 

 

Espero que gostem e qualquer dúvida ou problema no script, deixe nos comentários. 

 

 

Editado por Poccnn
Link para o comentário
Compartilhar em outros sites

  • 4 months later...
Em 07/10/2017 at 02:46, PuW disse:

poderia explicar como funciona esse script? como adicionar no server como fazer modificações e tal?

É uma torre na qual o player tem que eliminar todos os monstros da sala antes de passar para uma sala superior e por fim a ultima sala que é a da recompensa.

No script tu não modifica nada. o que tu pode modificar é os monstros da sala, a sala, as recompensas e tudo o que não precise alterar no script.

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...
Em 12/10/2017 at 16:55, PuW disse:

"event = addEvent(upDateLevelParadox,1000) " esta parte do script seria a aid que eu registraria no movements? @Poccnn

No script tu não meche em nada. vai no mapa e adiciona uma aid qualquer na escada e essa aid tu coloca no arquivo movements.xml

Link para o comentário
Compartilhar em outros sites

@Poccnn, poderia me ajudar com uma coisa? Preciso de três modificações simples nesse script (pra mim não é tão simples mas pra você deve ser ksjdskaj)
A primeira modificação é a seguinte, o script detectar se tem alguma pessoa na tower e se caso tiver o script mandar pra outro mapa que será semelhante ao primeiro (somente para que as pessoas não possam entrar juntos no mesmo mapa) ou que o script detectasse quando tivesse uma pessoa e aparecesse uma frase de que já existe uma pessoa lá dentro qualquer uma dessas soluções seria legal pra mim mas se for pra escolher prefiro a primeira :D (agora se tu fizesse pra ter como eu configurar quantas pessoas iriam entrar seria muito foda)
e a segunda modificação é, do script deixar o player fazer uma vez a cada 24 horas, e não ser uma coisa que fez e não pode fazer mais.
e a terceira modificação é ter um tempo de 10~15 segundos para teleportar o player e não assim que derrotar o monstro
se puder me ajudar com essas coisas ficarei grato

Editado por PuW
Link para o comentário
Compartilhar em outros sites

Em 20/10/2017 at 20:41, PuW disse:

@Poccnn, poderia me ajudar com uma coisa? Preciso de três modificações simples nesse script (pra mim não é tão simples mas pra você deve ser ksjdskaj)
A primeira modificação é a seguinte, o script detectar se tem alguma pessoa na tower e se caso tiver o script mandar pra outro mapa que será semelhante ao primeiro (somente para que as pessoas não possam entrar juntos no mesmo mapa) ou que o script detectasse quando tivesse uma pessoa e aparecesse uma frase de que já existe uma pessoa lá dentro qualquer uma dessas soluções seria legal pra mim mas se for pra escolher prefiro a primeira :D (agora se tu fizesse pra ter como eu configurar quantas pessoas iriam entrar seria muito foda)
e a segunda modificação é, do script deixar o player fazer uma vez a cada 24 horas, e não ser uma coisa que fez e não pode fazer mais.
e a terceira modificação é ter um tempo de 10~15 segundos para teleportar o player e não assim que derrotar o monstro
se puder me ajudar com essas coisas ficarei grato

Fiz as modificações. verifica se é isso que tu quer.

Link para o comentário
Compartilhar em outros sites

@Poccnn Muito obrigado manoooooooo <3.
Deu esse error :( OBS: USO TFS 0.3.6 

Spoiler

[25/10/2017 00:45:14] [Error - MoveEvents Interface] 
[25/10/2017 00:45:14] data/movements/scripts/tower1.lua:onStepIn
[25/10/2017 00:45:14] Description: 
[25/10/2017 00:45:14] data/movements/scripts/tower1.lua:42: attempt to call global 'getCreaturesInRange' (a nil value)
[25/10/2017 00:45:15] stack traceback:
[25/10/2017 00:45:15]     data/movements/scripts/tower1.lua:42: in function <data/movements/scripts/tower1.lua:39>


agora umas dúvidas se não for incomodo.

Spoiler

local search = getCreaturesInRange(tower, 50, 50, true, showPlayers)
local players = getCreaturesInRange(tower, 50, 50, showMonsters, true)
    local pp = getCreaturesInRange(tower, 50, 50, showMonsters, true)

Caso eu coloque essa parte do creature range assim, ela irá procurar monstros a 50x50 da posição inicial da quest que no caso é:
{x=1950,y=2232,z=8,firstNivel=8,ultimoNivel=10}
Ou da posição atual do player? E só irá teleportar o player para o outro andar caso todos os monstros dessa área de 50x50 estejam mortos, correto?

Se caso for da posição inicial da quest que é "{x=1950,y=2232,z=8,firstNivel=8,ultimoNivel=10}" poderia colocar pra ser da posição do player, precisaria que o script fosse checando conforme o player andasse pois queria fazer uma tower maior em tamanho mas mesmo assim com vários andares.


e também para colocar um limite de tempo (configurável se der) dentro da sala pra que não haja players que fiquem lá dentro prendendo por exemplo "você tem 60 minutos para completar a tower" e se o player deslogar quando ele logar novamente ele aparecer no cp ou em uma posição escolhida por mim. E além dessas coisas eu também gostaria de te pedir (juro que é a última coisa kajsdkajsdkj) para que eu possa limitar alguns itens lá dentro, por exemplo, você pode entrar com quantos itens de id 2394 quiser, mas só poderá usar 10 lá dentro, uma tabelinha configuravel de id's com + de 1 e quantidades ficaria bom (só se der pra tu fazer)

Editado por PuW
Link para o comentário
Compartilhar em outros sites

Em 24/10/2017 at 04:24, PuW disse:

@Poccnn Muito obrigado manoooooooo <3.
Deu esse error :( OBS: USO TFS 0.3.6 

  Ocultar conteúdo

[25/10/2017 00:45:14] [Error - MoveEvents Interface] 
[25/10/2017 00:45:14] data/movements/scripts/tower1.lua:onStepIn
[25/10/2017 00:45:14] Description: 
[25/10/2017 00:45:14] data/movements/scripts/tower1.lua:42: attempt to call global 'getCreaturesInRange' (a nil value)
[25/10/2017 00:45:15] stack traceback:
[25/10/2017 00:45:15]     data/movements/scripts/tower1.lua:42: in function <data/movements/scripts/tower1.lua:39>


agora umas dúvidas se não for incomodo.

  Mostrar conteúdo oculto

local search = getCreaturesInRange(tower, 50, 50, true, showPlayers)
local players = getCreaturesInRange(tower, 50, 50, showMonsters, true)
    local pp = getCreaturesInRange(tower, 50, 50, showMonsters, true)

1 - Caso eu coloque essa parte do creature range assim, ela irá procurar monstros a 50x50 da posição inicial da quest que no caso é:
{x=1950,y=2232,z=8,firstNivel=8,ultimoNivel=10}
Ou da posição atual do player?

 

2 -E só irá teleportar o player para o outro andar caso todos os monstros dessa área de 50x50 estejam mortos, correto?

 

3 - Se caso for da posição inicial da quest que é "{x=1950,y=2232,z=8,firstNivel=8,ultimoNivel=10}" poderia colocar pra ser da posição do player, precisaria que o script fosse checando conforme o player andasse pois queria fazer uma tower maior em tamanho mas mesmo assim com vários andares.


4 - e também para colocar um limite de tempo (configurável se der) dentro da sala pra que não haja players que fiquem lá dentro prendendo por exemplo "você tem 60 minutos para completar a tower" e

 

5 - se o player deslogar quando ele logar novamente ele aparecer no cp ou em uma posição escolhida por mim.

 

6 - E além dessas coisas eu também gostaria de te pedir (juro que é a última coisa kajsdkajsdkj) para que eu possa limitar alguns itens lá dentro, por exemplo, você pode entrar com quantos itens de id 2394 quiser, mas só poderá usar 10 lá dentro, uma tabelinha configuravel de id's com + de 1 e quantidades ficaria bom (só se der pra tu fazer)

 

O erro se deu pela falta dessa função:

Spoiler

function getCreaturesInRange(position, radiusx, radiusy, showMonsters, showPlayers) 
    local creaturesList,radiusx,radiusy = {},radiusx or 0,radiusy or 0
    for x = -radiusx, radiusx do
        for y = -radiusy, radiusy do
		local creature = getTopCreature({x = position.x+x, y = position.y+y, z = position.z, stackpos = STACKPOS_TOP_CREATURE})
			if (creature.type == 1 and showPlayers == true) or (creature.type == 2 and showMonsters == true) then
				table.insert(creaturesList, creature.uid)
			end
        end
    end
    return creaturesList
end

 

 

1 - Da posição da sala da tower.

2 - Sim.

3 - Se for dessa forma, ao matar os monstros próximos do player ele será teleportado para o próximo andar sem ter que eliminar todos os monstros do andar.

4 - Irei fazer isso.

5 - Pelo mapper editor existe um negocio que adiciona em uma área que impede do player deslogar e caso o servidor caia, ele irá voltar no templo. faça isso na área da tower.

6 - Essa dai já é uma grande alteração que tem que ser feita. não sei se vou fazer isso pra tu.

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Poccnn disse:

 

O erro se deu pela falta dessa função:

  Mostrar conteúdo oculto


function getCreaturesInRange(position, radiusx, radiusy, showMonsters, showPlayers) 
    local creaturesList,radiusx,radiusy = {},radiusx or 0,radiusy or 0
    for x = -radiusx, radiusx do
        for y = -radiusy, radiusy do
		local creature = getTopCreature({x = position.x+x, y = position.y+y, z = position.z, stackpos = STACKPOS_TOP_CREATURE})
			if (creature.type == 1 and showPlayers == true) or (creature.type == 2 and showMonsters == true) then
				table.insert(creaturesList, creature.uid)
			end
        end
    end
    return creaturesList
end

 

 

1 - Da posição da sala da tower.

2 - Sim.

3 - Se for dessa forma, ao matar os monstros próximos do player ele será teleportado para o próximo andar sem ter que eliminar todos os monstros do andar.

4 - Irei fazer isso.

5 - Pelo mapper editor existe um negocio que adiciona em uma área que impede do player deslogar e caso o servidor caia, ele irá voltar no templo. faça isso na área da tower.

6 - Essa dai já é uma grande alteração que tem que ser feita. não sei se vou fazer isso pra tu.

Coloquei a função que você me indicou, e agora não dá nenhum erro na distro até envia pra sala da tower, porém não envia pro segundo andar mesmo após matar todos os bixos da sala

Link para o comentário
Compartilhar em outros sites

1 hora atrás, PuW disse:

Coloquei a função que você me indicou, e agora não dá nenhum erro na distro até envia pra sala da tower, porém não envia pro segundo andar mesmo após matar todos os bixos da sala

Já certificou-se de ter posto as posições corretas? Sua distro é de derivados?

Link para o comentário
Compartilhar em outros sites

4 horas atrás, Poccnn disse:

Já certificou-se de ter posto as posições corretas? Sua distro é de derivados?

Sim ele até teleporta pro primeiro nível, porém ao matar todos os bixos do nível ele não é teleportado para o segundo nível.

E sim minha distro é a DxP 0.3.6.

Editado por PuW
Link para o comentário
Compartilhar em outros sites

Em 29/10/2017 at 19:01, PuW disse:

minha distro é a DxP 0.3.6.

O problema pode ser sua distro.

Essas distros modificadas sempre são problemáticas.

Link para o comentário
Compartilhar em outros sites

Em 31/10/2017 at 20:16, Poccnn disse:

O problema pode ser sua distro.

Essas distros modificadas sempre são problemáticas.

acho que o erro é devido a falta da função: 

getStoreString

deu um erro com a função, porém, eu coloquei uma função getStoreString que achei aqui pelo fórum mas não sei se é a correta você poderia me mandar a função?

----Edit

acho que achei o motivo do erro, tipo, se eu colocar:

Spoiler

local search = getCreaturesInRange(tower, 70, 70, true, showPlayers)
local players = getCreaturesInRange(tower, 70, 70, showMonsters, true)
local pp = getCreaturesInRange(tower, 70, 70, showMonsters, true)


ele não funciona, mas, se eu colocar:

Spoiler

local search = getCreaturesInRange(tower, 3, 3, true, showPlayers)
local players = getCreaturesInRange(tower, 3, 3, showMonsters, true)
local pp = getCreaturesInRange(tower, 3, 3, showMonsters, true)


como tava no script inicial ele funciona normalmente, mas, como minha tower é grande ele teleporta o player sem o player precisar matar todos os bixos

Editado por PuW
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...