Ir para conteúdo

Featured Replies

Postado

TFS 0.3.6 Crying Damson;

Base: NTO Server

 

 

Primeiramente, boa tarde/dia/noite, eu sou Henrique, mapeio derivados de Tibia (especificamente Nto e DBO).

 

Tenho uma dificuldade ENORME em programação, tanto em C, quanto LUA, Python, etc. E como todos nós sabemos, para ter um servidor de qualidade não basta fazer um mapa bonitinho, é IMPORTANTÍSSIMO sistemas de qualidade, conhecimento em LUA, para também resolver bugs com scripts, etc. Gostaria de saber, como posso modificar o mod The Ultimate Survivor, eu traduzi algumas mensagens enviadas a jogadores, exemplo: "Parabéns você fez tall..." isso é simples, configurar/editar não requer conhecimento. O problema está justamente na forma de funcionamento. Não me agrada o fato de apenas UM jogador poder fazer o Ultimate Survivor por vez, e é isso que quero modificar.

 

Oque eu quero à final?

 

Essa modificação no MOD The Ultimate Survivor, quem conhece sabe como funciona: O limite de jogadores na arena seja de 1 para 4. Se 1 clicar na alavanca, e se esse 1 jogador apenas estiver em uma das tiles determinadas para os 4 jogadores, apenas esse 1 vai, se dois estiverem na tile, os dois vão pra arena e da mesma forma quem estiver fora terá de esperar, independente da quantidade que entrou, não é tipo: um entrou, depois outro entrou, até dar 4, não, podem ir 2, 1, 3, 4, quem estiver fora terá que esperar independente da quantidade que entrou na arena. Detalhe: quero que apenas estenda o limite de jogadores a entrar por vez, não APENAS PODEM 4, OU APENAS PODEM 1, limite estendido até 4, se for grupo de 3 a entrar, que entre 3 e qualquer um fora da arena teria de esperar. Irei destacar os pisos que receberão as tiles de quem for entrar será uma fileira de 4 pisos, os 4 teriam de estar lá, se fossem 3, 2, 1 a mesma coisa, e o primeiro tile de frente pra alavanca, o primeiro da fila e lider do grupo clicará na alavanca e levará todos que estiverem junto dele pra arena, TODOS TERIAM DE ESTAR EM Party (PT), se não apareceria um aviso bem na tela dele assim como um BroadCast global (porém só pros jogadores que estiverem na tile, eu disse: "Assim como um broadcast", não um broadcast global sacou? Uma mensagem pra eles "Vocês tem que estar em Party" por exemplo, repito: NÃO é GLOBAL! Só eles vão ver, creio até que é: doPlayerTextMessage (creio eu, como disse sou apenas um mapper em busca de conhecimento na área de scripting). Detalhei bem aqui mais não é uma modificação grande, aliás bem simples, é porque alguém pode fazer errado, ou me fazer algum questionamento por justamente culpa minha, que não detalhei bem oque queria.

 

Script (mod) que quero que modifiquem:

 

 

<?xml version="1.0" encoding="UTF-8"?>
<!--
                ULTIMATE SURVIVAL - Codigo feito por Omega / Pedido por vinnevinne
					
                      Informacoes: http://www.xtibia.com/forum/topic/221415-ultimate-survival/
-->
 
<mod name="Ultimate Survival" version="1.0" author="Omega" enabled="yes">
<config name="ultimatelib"><![CDATA[
USurvival = {
	posi = {x=104, y=210, z=7}, -- parte esquerda superior da arena
	posf = {x=115, y=221, z=7}, -- parte direita inferior da arena
	posc = {x=109, y=215, z=7}, -- onde o player entra na arena
	
	waves = {
	[1] = {monsters = {'dragon', 'dragon lord'}, count = 30, reward = {exp = 0, item = 2148, amount = 1, money = 100}},
	[2] = {monsters = {'dragon lord', 'frost dragon'}, count = 6, reward = {exp = 0, item = 2152, amount = 1, money = 1000}},
	[3] = {monsters = {'hydra', 'serpent spawn'}, count = 10, reward = {exp = 0, item = 2160, amount = 1, money = 10000}},
	},
	exhaust = 1 * 24 * 60 * 60, -- Tempo em segundos ate poder entrar novamente na arena (1 * 24 * 60 * 60 = 1 dia)
	
	final_reward = {item = 2160, amount = 100, exp = 10000, money = 100000},
	
	storage_ex = 607069,
	storage_wave = 607089,
}

function isWalkable(pos)-- by Nord / editado por Omega
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then
        return false
    elseif isCreature(getTopCreature(pos).uid) then
        return false
    elseif getTileInfo(pos).protection then
        return false
    elseif hasProperty(getThingFromPos(pos).uid, 3) or hasProperty(getThingFromPos(pos).uid, 7) then
        return false
    end
return true
end

function doSpawnMonsters(monsters, pos, radius, limit)
	if not pos.x or not pos.y or not pos.z or not type(monsters) == 'table' then
		return false
	end
		local radius = tonumber(radius)
	if radius > 5 then
		radius = 5
	elseif radius < 2 then
		radius = 2
	end
	if not limit or limit < 1 then
		limit = 1
	elseif limit > radius ^ 2 then
		limit = math.floor((radius*1.5) ^ 2)
	end
	
	local k = 0
	local tries = 0
	repeat
		for x = pos.x - radius, pos.x + radius do
			for y = pos.y - radius, pos.y + radius do
				if isWalkable({x=x, y=y, z=pos.z}) then
					local monster = monsters[math.random(1, #monsters)]
					local chance = math.random(1, 100)
					if k == limit then
						break
					elseif chance <= 8 and doCreateMonster(monster, {x=x, y=y, z=pos.z}) then
						k = k + 1
					end
				end
			end
		end
		tries = tries + 1
	until k >= limit or tries >= 500
	return k >= limit and true or false
end

function getPlayersInArea(pos1,pos2)
	local players = {}
	if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
		for a = pos1.x, pos2.x do
			for b = pos1.y,pos2.y do
				local pos = {x=a,y=b,z=pos1.z}
				if isPlayer(getTopCreature(pos).uid) then
					table.insert(players,getTopCreature(pos).uid)
				end
			end
		end
		return players
	else
		return false
	end
end	

function getMonstersInArea(pos1,pos2)
	local players = {}
	if pos1.x and pos1.y and pos2.x and pos2.y and pos1.z == pos2.z then
		for a = pos1.x, pos2.x do
			for b = pos1.y,pos2.y do
				local pos = {x=a,y=b,z=pos1.z}
				if isMonster(getTopCreature(pos).uid) then
					table.insert(players,getTopCreature(pos).uid)
				end
			end
		end
		return players
	else
		return false
	end
end

function doCleanArena()
	local monsters = getMonstersInArea(USurvival.posi, USurvival.posf)
	for _, cid in pairs(monsters) do
		doRemoveCreature(cid)
	end
end

function doStartWave(waveID, cid)
	if not isCreature(cid) then return false end
	if USurvival.waves[waveID] then
		wave = USurvival.waves[waveID]
		doSpawnMonsters(wave.monsters, USurvival.posc, 5, wave.count)
		doPlayerSendTextMessage(cid, 21, 'A onda '..waveID..' acabou de comecar! LUTE!')
	end
end
]]></config>

<action actionid="4599" event="script" override="yes"><![CDATA[
domodlib('ultimatelib')
function onUse(cid, item)
	if getPlayerStorageValue(cid, USurvival.storage_ex) <= os.time() then
		if #getPlayersInArea(USurvival.posi, USurvival.posf) == 0 then
			doCleanArena()
			doTeleportThing(cid, USurvival.posc)
			doPlayerSendTextMessage(cid, 21, 'O Evento Sobrevivencia ira comecar em 10 segundos! Esteja pronto para enfrentar o seu destino!')
			addEvent(doStartWave, 10000, 1, cid)
			setPlayerStorageValue(cid, USurvival.storage_wave, 1)
			setPlayerStorageValue(cid, USurvival.storage_ex, os.time() + USurvival.exhaust)
			if item.itemid % 2 == 1 then
				doTransformItem(item.uid, item.itemid+1)
			else
				doTransformItem(item.uid, item.itemid-1)
			end
		else
			doPlayerSendCancel(cid, 'Alguem ja esta na arena! Aguarde!')
			doSendMagicEffect(getThingPos(cid), 2)
		end
	else
		local left = getPlayerStorageValue(cid, USurvival.storage_ex) - os.time()
		left = {hour = math.floor(left/3600), minutes = math.ceil((left % 3600)/60)}
		doPlayerSendCancel(cid, 'Voce tem que esperar '.. left.hour ..'h and '..left.minutes..'min.')
		doSendMagicEffect(getThingPos(cid), 2)
	end
	return true
end
]]></action>

<event type="login" name="US Login" event="script"><![CDATA[
domodlib('ultimatelib')
function onLogin(cid)
	registerCreatureEvent(cid,'UltimateSurvival1')
	registerCreatureEvent(cid,'UltimateSurvival2')
	if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
		doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
		doSendMagicEffect(getThingPos(cid), 10)
	end
	return true
end
]]></event>

<event type="kill" name="UltimateSurvival1" event="script"><![CDATA[
domodlib('ultimatelib')
function onKill(cid, target)
	if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
		if #getMonstersInArea(USurvival.posi, USurvival.posf) == 1 then
			local wave = getPlayerStorageValue(cid, USurvival.storage_wave)
			if USurvival.waves[wave+1] then
				setPlayerStorageValue(cid, USurvival.storage_wave, wave + 1)
				addEvent(doStartWave, 5000, wave + 1, cid)
				doPlayerSendTextMessage(cid, 22, 'Parabens voce sobreviveu a essa onda! A proxima onda comecara em 5 segundos!')
			else
				doPlayerSendTextMessage(cid, 22, 'PARABEBS! VOCE SOBREVIVEU A TODAS AS ONDAS DO EVENTO SOBREVIVENCIA!')
				local reward = USurvival.final_reward
				if reward.item then
					doPlayerAddItem(cid, reward.item, (reward.amount or 1), false)
				end
				if reward.exp then
					doPlayerAddExp(cid, reward.exp)
				end
				if reward.money then
					doPlayerAddMoney(cid, reward.money)
				end
				local medal = doPlayerAddItem(cid, 5785, 1, false)
				if medal then
					doItemSetAttribute(medal, 'description', 'Lhe foi concedido '..getCreatureName(cid)..' Por completar O Evento Sobrevivencia.')
					doItemSetAttribute(medal,'name', 'Medalha do Sobrevivente')
				end
				doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
			end
		end
	end
	return true
end

]]></event>

<event type="preparedeath" name="UltimateSurvival2" event="script"><![CDATA[
domodlib('ultimatelib')
function onPrepareDeath(cid, killers)
	if isInArea(getThingPos(cid), USurvival.posi, USurvival.posf) then
		doCreatureAddHealth(cid, getCreatureMaxHealth(cid), 65535, 256, true)
		doRemoveConditions(cid, false)
		doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)))
		doPlayerSendTextMessage(cid, 21, 'Too bad, you couldn\'t defeat the Ultimate Survival... Better luck next time.')
		local reward = USurvival.waves[getPlayerStorageValue(cid, USurvival.storage_wave)].reward
		if reward.item then
			doPlayerAddItem(cid, reward.item, reward.amount or 1)
		end
		if reward.exp then
			doPlayerAddExp(cid, reward.exp)
		end
		if reward.money then
			doPlayerAddMoney(cid, reward.money)
		end
		return false
	end
	return true
end
]]></event>

</mod>

 

Obrigado pela sua atenção até aqui! Um abraço e muitíssimo obrigado!

UP - Necessito bastante disso.

UPPP

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.

Conteúdo Similar

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo