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