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










