Jump to content

Pacote de Scripts [Simples e Úteis] I - Actions


Omega

Recommended Posts

Esse é um pacote com actions úteis para se usar nos servidores e, a menos que esteja indicado o contrário, são de minha autoria.
[Testado em servidor 8.6]

Para colocar essas actions no jogo, você deve colocar uma TAG no arquivo actions.xml do seu servidor, com um actionid e o nome do arquivo .lua (contendo o script) na pasta de scripts. Então, você deve colocar um item com aquele actionid no mapa.

[ACTION #1] Baús de quests completos

Descrição:

  • Com essa action, você pode colocar vários baús simples de quest em apenas um script de forma rápida e organizada.
  • Basta apenas registrar diferentes actionIDs no actions.xml, colocar eles em cada baú e depois inserir no script, conforme o padrão.

 

 

function onUse(cid, item, fromPos, item2, toPos)
local _ = {
[1] = {aid = 1234, item = 2121},
[2] = {aid = 1354, item = 2122},
[3] = {aid = 1231, item = 3121},
}

-- Reservando os storages a partir de 202049 até o 202049 + número de baús nessa action
	for i = 1, #_ do
		_[i].storage = 202049 + i
	end

	for i, valor in ipairs(_) do
		if item.actionid == valor.aid then
			if getPlayerFreeCap(cid) >= getItemWeightById(valor.item, 1) then
				if getPlayerStorageValue(cid, valor.storage) == -1 then
					if doPlayerAddItem(cid, valor.item, 1, false) then
						doPlayerSendTextMessage(cid, 22, 'You have found a '..getItemNameById(valor.item)..'.')
						setPlayerStorageValue(cid, valor.storage, 1)
					else
						doPlayerSendTextMessage(cid, 22, 'You have found a '..getItemNameById(valor.item)..', but you need a free slot.')
					end
				else
					doPlayerSendTextMessage(cid, 22, 'It is empty.')
				end
			else
				doPlayerSendTextMessage(cid, 22, 'You have found a '..getItemNameById(valor.item)..'. It weighs '..getItemWeightById(valor.item, 1)..'.00 and it is too heavy.')
			end
			break
		end
	end
	return true
end

 




[ACTION #2] Summon simples


Descrição:

  • Dessa forma você pode criar um pequeno sistema de summon com um monstro. No primeiro uso, ele invoca o monstro à comando do jogador, gastando a mana definida.
  • Então, caso outro uso seja realizado até o exhaust terminar, o monstro será removido.
  • Quando o jogador usar novamente, se o monstro invocado existir, ele será removido e outro monstro será invocado, reiniciando o ciclo.
  • OBS.: os ataques em área do summon ainda vão tirar vida do jogador. Para uma correção, vide final do tópico.

 

 

function onUse(cid, item, fromPos, item2, toPos)
    local config = {
        storage = 7550,
        storage2 = 7551,
        monster = 'demon',
        exhaust = 10, -- em segundos
		mana = 500
    }
	local group = getPlayerGroupId(cid)
    if getPlayerStorageValue(cid, config.storage) <= os.time(t) then
        if isCreature(getPlayerStorageValue(cid, config.storage2)) then
            doSendMagicEffect(getCreaturePosition(getPlayerStorageValue(cid, config.storage2)), 2)
            doRemoveCreature(getPlayerStorageValue(cid, config.storage2))
        end
		setPlayerGroupId(cid, 6)
        local monster = doSummonCreature(config.monster, fromPos)
        doConvinceCreature(cid, monster)
        setPlayerStorageValue(cid, config.storage2, monster)
        setPlayerStorageValue(cid, config.storage, os.time(t) + config.exhaust)
		doCreatureAddMana(cid, -config.mana)
		doPlayerAddSpentMana(cid, config.mana)
		setPlayerGroupId(cid, group)
    elseif isCreature(getPlayerStorageValue(cid, config.storage2)) then
        doSendMagicEffect(getCreaturePosition(getPlayerStorageValue(cid, config.storage2)), 2)
        doRemoveCreature(getPlayerStorageValue(cid, config.storage2))        
    else
        doSendMagicEffect(getCreaturePosition(cid), 2)
        doPlayerSendCancel(cid, 'You\'re exhausted.')
	end
    return true
end

 




[ACTION #3] Fome Zero

Descrição:

  • Script simples: você registra o actionID dele em algum item e então o jogador ganhará uma comida sorteada entre as que constam em foodID (deve ser configurado)
  • Pode ser usado à vontade pelo jogador para conseguir comida.

 

 

function onUse(cid, item, fromPos, item2, toPos)
	local foodID = {2666, 2671} -- IDs da comida que o jogador irá receber
	
	local food_final = foodID[math.random(#foodID)]
	if getPlayerFreeCap(cid) >= getItemWeightById(food_final) then
		if doPlayerAddItem(cid, food_final, 1, false) then
			doSendAnimatedText(getCreaturePosition(cid), 'FOOD!', math.random(255))
		else
			doPlayerSendCancel('You don\'t have enough room!')
		end
	else
		doPlayerSendCancel(cid, 'It is too heavy!')
	end
	return true
end

 




[ACTION #4] Alavanca do Cassino

Descrição:

  • Um script de alavanca: nesse você define as possíveis recompensas, o quanto de dinheiro a pessoa vai precisar e as chances!

 

 

function onUse(cid, item, fromPos, item2, toPos)
	local ITEMS = {
	[0] = {chance = 0}, -- chance de não ganhar nada
	[1] = {itemid = 2666, count = 10, chance = 10}, -- as chances estão em porcentagens e devem somar 100% daqui pra baixo
	[2] = {itemid = 2671, count = 15, chance = 20},
	[3] = {itemid = 2345, count = 1, chance = 70},
}
	local exhaust = 2 -- em segundos (não zerar para garantir a aleatoriedade)

	local price = 5000 -- Preço para jogar 1 vez em GPs

	local _rand = math.random(1,100)
	
	if getPlayerStorageValue(cid, 51725) > os.time() then
		doPlayerSendCancel(cid, "Wait a second!.")
		return true
	elseif not doPlayerRemoveMoney(cid, price) then
		doPlayerSendCancel(cid, "You need "..price.."gps to play in the casino.")
		return true
	elseif _rand <= ITEMS[0].chance then
		doPlayerSendTextMessage(cid, 22, 'Oooh, bad luck... try again!')
		if item.itemid % 2 == 1 then
			doTransformItem(item.uid, item.itemid+1)
		else
			doTransformItem(item.uid, item.itemid-1)
		end
		return true
	else
		_rand = math.abs(math.random(-100,-1))
		setPlayerStorageValue(cid, 51725, os.time() + exhaust)
		local chance_ = 0
		for i = 1, (#ITEMS) do
			ITEMS[i].chance = ITEMS[i].chance + chance_
			chance_ = ITEMS[i].chance
		end
		
		for p = 1, (#ITEMS) do
			if _rand <= ITEMS[p].chance then
				local iteminfo = ITEMS[p]
				doPlayerAddItem(cid, iteminfo.itemid, iteminfo.count)
				doPlayerSendTextMessage(cid, 22, 'Yeey! You have won '..iteminfo.count..' '..getItemNameById(iteminfo.itemid)..'.')
				break
			end
		end
	end
	if item.itemid % 2 == 1 then
		doTransformItem(item.uid, item.itemid+1)
	else
		doTransformItem(item.uid, item.itemid-1)
	end
	return true
end

 



[ACTION #5] Fantasias de Monstros

Descrição:

  • Quando o jogador clicar em um item, será sorteada uma outfit entre as definidas.

 

 

function onUse(cid, item, frompos, item2, topos)	
	local storage = 23589
	local time = 5 -- Tempo de exhaust
	local monstros = {
	[1] = 'orc',
	[2] = 'orc rider',
	[3] = 'demon',
	[4] = 'hand of cursed fate',
	[5] = 'dragon',
	[6] = 'minotaur',
	[7] = 'sandcrawler',
	[8] = 'medusa',
	[9] = 'omruc',
	[10] = 'fire devil',
	[11] = 'elf arcanist',
	[12] = 'snake',
	[13] = 'pig',
	[14] = 'minotaur mage',
	[15] = 'skeleton'
	}
	local costume = math.random(1,#monstros)
	if exhaustion.check(cid,storage) == false then
		doSetMonsterOutfit(cid, monstros[costume])
		exhaustion.set(cid,storage,time)
		doSendMagicEffect(getCreaturePosition(cid),13)
		return true
	else
		doSendMagicEffect(getCreaturePosition(cid),2)
		doPlayerSendCancel(cid,'You\'re exhausted.')
		return true
	end
end

 



[ACTION #6] Passagem Secreta

Descrição:

  • Ao puxar a alavanca, o jogador removerá uma parede do lugar, abrindo uma passagem secreta. Ela se fechará em alguns segundos.

 

 

function onUse(cid, item, fromPos, item2, toPos)
	local wallPos = {x=123, y=324, z=7}
	local safePos = {x=123, y=325, z=7} -- Caso existam itens ou jogadores no momento em que a wall deve ser recriada, essa é a posição para a qual eles serão movidos
	local wallId = 9999 -- itemid da parede que será removida
	
	local i = 0
	for stack = 1, 254 do
		if getThingFromPos({x=wallPos.x, y=wallPos.y, z=wallPos.z, stackpos=255-stack}).itemid == wallId then
			doRemoveItem(getThingFromPos({x=wallPos.x, y=wallPos.y, z=wallPos.z, stackpos=255-stack}).uid, 1)
		i = i + 1
		end
	end
	if i == 0 then
		doSendMagicEffect(getCreaturePosition(cid), 2)
		return true
	elseif item.itemid % 2 == 0 then
		doTransformItem(item.uid, item.itemid-1)
	else
		doTransformItem(item.uid, item.itemid+1)
	end
	addEvent(doClosePassage, 5000, wallPos, safePos, wallId)
	return true
end

function doClosePassage(wallPos, safePos, wallId)
	for stack = 1, 254 do
		if getThingFromPos({x=wallPos.x, y=wallPos.y, z=wallPos.z, stackpos=255-stack}).uid > 0 then
			doTeleportThing(getThingFromPos({x=wallPos.x, y=wallPos.y, z=wallPos.z, stackpos=255-stack}).uid, safePos)
		end
	end
	doCreateItem(wallId, 1, wallPos)
	return true
end

 



[ACTION #7] Baús de vocações

Descrição:

  • Bem óbvio pelo nome, essa action dá prêmios diferentes para cada vocação

 

 

function onUse(cid, item, fromPos, item2, toPos)
	local vocs = { -- Os nomes devem estar em letras minúsculas
	[1] = {name = {'sorcerer', 'master sorcerer'}, reward = {1234, 1}}, -- {itemid, quantidade}
	[2] = {name = {'druid', 'elder druid'}, reward = {2345, 2}},
	[3] = {name = {'paladin', 'royal paladin'}, reward = {3456, 3}},
	[4] = {name = {'knight', 'elite knight'}, reward = {4567, 4}},
	}
	
	if getPlayerStorageValue(cid, 34561) == -1 then
		for vocId, voc in ipairs(vocs) do
			if isInArray(voc.name, string.lower(getPlayerVocationName(cid))) then
				doPlayerAddItem(cid, voc.reward[1], voc.reward[2])
				doPlayerSendTextMessage(cid, 22, 'You have found '..voc.reward[2]..' '..getItemNameById(voc.reward[2])..'.')
				setPlayerStorageValue(cid, 34561, 1)
				break
			end
		end
	else
		doPlayerSendTextMessage(cid, 22, 'It is empty.')
	end
	return true
end

 



[ACTION #8] SUSTO!

Descrição:

  • Essa action super engraçada fará o seguinte: o jogador se transformará num cadáver e aparecerá a mensagem You were downgraded from level... (igual a msg do tibia mesmo).
  • Depois de TRÊS segundos, o jogador voltará a sua outfit normal e receberá a mensagem Gotcha! (te peguei em inglês)

 

 

function onUse(cid, item, fromPos, item2, toPos)
	if getPlayerStorageValue(cid, 81237) <= os.time() then
		local corpse = getPlayerSex(cid) == 1 and 3058 or 3065
		doSetItemOutfit(cid, corpse, 3000)
		mayNotMove(cid, true)
		doSendAnimatedText(getCreaturePosition(cid), '-'..getCreatureHealth(cid), 180)
		doPlayerSendTextMessage(cid, 22, 'You were downgraded from level '..getPlayerLevel(cid)..' to level '..getPlayerLevel(cid)-10 ..'.')
		addEvent(mayNotMove, 3000, cid, false)
		addEvent(doPlayerSendTextMessage, 3000, cid, 25, 'Gotcha!')
		setPlayerStorageValue(cid, 81237, os.time() + 5)
	end
	return true
end

 



[ACTION #9] Painel informativo

Descrição:

  • Com essa action você pode fazer aparecer uma mensagem em popup para o jogador contendo as informações que você quiser.

 

 

function onUse(cid, item, fromPos, item2, toPos)
	-- use \n para pular linhas
	local info = "Bem vindo ao meu servidor!" 
	doShowTextDialog(cid, 1950, info)
end

 



[ACTION #10] Armários realistas!
Autor: Avronex

Descrição:

  • Colocando esse script em armários, os jogadores irão receber a janela de trocar outfit quando clicarem!

 

 

--------------------------------------
-- Script by Smowking (Victor Laio) --
--------------------------------------
function onUse(cid, item, fromPosition, itemEx, toPosition)
	doPlayerSendOutfitWindow(cid)
end

 

 

[ACTION #11] Fogos de Artifício

Descrição:

  • Um novo script para fogos de artifício, com efeitos, número de explosões e tempo entre as explosões configuráveis.

 

 

local ini_effect = 6 -- Efeito inicial ao explodir
local effects = {28, 29, 30} -- Efeitos que serão usados nas explosões
local blows = 20 -- Número de explosões
local delay = 500 -- Tempo entre as explosões (milissegundos)

function onUse(cid, item, fromPos, itemEx, toPos)
	local positions = {}
	local main_pos = getThingPos(item.uid)
	for a = -2, 2 do
		for b = -2, 2 do
			local tmp_pos = {x = main_pos.x + a, y = main_pos.y + b, z = main_pos.z}
			if not (hasProperty(getThingFromPos(tmp_pos).uid, 3) or hasProperty(getThingFromPos(tmp_pos).uid, 7)) then
				positions[#positions + 1] = tmp_pos
			end
		end
	end
	doSendMagicEffect(main_pos, ini_effect)
	local tmp_delay = 1000
	for i = 1, blows do
		local blow_pos = positions[math.random(#positions)]
		local tmp_effect = effects[math.random(#effects)]
		addEvent(doSendMagicEffect, tmp_delay, blow_pos, tmp_effect)
		tmp_delay = tmp_delay + delay
	end
	doRemoveItem(item.uid)
	return true
end

 

 

 

 

E aqui a lista termina por enquanto. Me avise se você achar/tiver uma action útil que possa entrar para a lista.

 

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

Correção para que o summon não dê dano em quem o invocou:

 

  • Crie essa tag em creaturescripts.xml
<event type="statschange" name="correcsummon" event="script" value="correcsummon.lua"/>
  • Adicione isso em login.lua entre os outros registerCreatureEvent
registerCreatureEvent(cid, "correcsummon")
  • Crie um arquivo com o nome de correcsummon.lua em creaturescripts/scripts com o seguinte código
function onStatsChange(cid, attacker, type, combat, value)
	if getPlayerStorageValue(cid, 7551) == attacker then
		return false
	end
	return true
end

 

 

Edited by Omega
Link to comment
Share on other sites

  • 3 months later...
  • 1 month later...
  • 5 years later...
×
×
  • Create New...