Omega 377 Postado Setembro 14, 2013 Share Postado Setembro 14, 2013 (editado) 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 completosDescriçã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 simplesDescriçã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 ZeroDescriçã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 CassinoDescriçã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 MonstrosDescriçã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 SecretaDescriçã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çõesDescriçã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 informativoDescriçã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: AvronexDescriçã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ícioDescriçã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 Editado Abril 2, 2014 por Omega Link para o comentário Compartilhar em outros sites More sharing options...
Alexclusive 687 Postado Setembro 14, 2013 Share Postado Setembro 14, 2013 Muito bom cara!! Obrigado por contribuir com a comunidade Link para o comentário Compartilhar em outros sites More sharing options...
Lumus 254 Postado Setembro 21, 2013 Share Postado Setembro 21, 2013 U.u como eu disse achei Seu script, como você são fodas omg *-* rep+++++ bjs no suvaco Link para o comentário Compartilhar em outros sites More sharing options...
titon 0 Postado Dezembro 29, 2013 Share Postado Dezembro 29, 2013 Cara , gostei muito , bem variável as Script, testei todas, estão nas mais perfeitas condições, com certeza irei usar , valeu . REP++ Link para o comentário Compartilhar em outros sites More sharing options...
Avronex 104 Postado Fevereiro 2, 2014 Share Postado Fevereiro 2, 2014 Bom saber que gostaram da minha action! Link para o comentário Compartilhar em outros sites More sharing options...
Luffluf 0 Postado Junho 23, 2019 Share Postado Junho 23, 2019 Show de bola! Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados