Ir para conteúdo
  • Cadastre-se

CreatureScript/GlobalEvent/MoveMent (Evento) Double Exp com Effect - Iniciado Manualmente


Posts Recomendados

Opah galera.. Tranquilo ?!.. :tongue:

Então, eu criei esse evento para meu WODBO, mas resolvi compartilhar com vocês.. Então, sem mais enrolação, como funciona:



1• O evento é iniciado por um administrador manualmente.
2• O DoubleExp dura X tempo (Determinado pelo administrador)
3• O DoubleExp irá continuar durante o tempo que o player estiver offline, ou seja, irá acabar no tempo determinado pelo administrador. Sem exceções.
4• O administrador irá determinar a quantia de exp dobrada.
5• O evento pode ser cancelado em qualquer momento pelo administrador.
6• O DoubleExp só se aplica aos jogadores online
7• O Ganho de Exp Padrão é alterado para 0.5
8• O Double Exp acaba ao deslogar.
AVISO: Eu criei o sistema já faz um bom tempo, então seria comum eu ter esquecido de comentar algo.


Então, para começar, crie doubleexpevent.lua em data/creaturescripts/scripts e dentro dele:

 

 


function onLogin(cid)
if getPlayerStorageValue(cid, 100002) == 1 then
doPlayerSendTextMessage(cid, 18, "Você perdeu o seu Double Exp!")
setPlayerStorageValue(cid, 100002, -1)
end
end
function onLogout(cid)
if getPlayerStorageValue(cid, 100001) > 1 then
setPlayerStorageValue(cid, 100001, -getPlayerStorageValue(cid, 100001))
if getPlayerStorageValue(cid, 223291) < 1 then
doPlayerSetExperienceRate(cid, 1)
else
doPlayerSetExperienceRate(cid, 0.5)
end
setPlayerStorageValue(cid, 100002, 1)
end
end
function onThink(cid, interval)
interval = 50 --Intervalo do efeito do double exp
if getPlayerStorageValue(cid, 100001) >= 1 then
local pos = getThingPos(cid)
local interval2 = 100
local poseff1 = {x=pos.x, y=pos.y, z=pos.z} --Posição do efeito
addEvent(doSendMagicEffect, interval, poseff1, 116) --116 É o número do efeito
addEvent(doSendAnimatedText, interval2, getCreaturePosition(cid), 'DoubleExp!', 144)
end
if getPlayerStorageValue(cid, 223291) >= 1 then
if getPlayerStorageValue(cid, 223492) < 1 then
doPlayerSetExperienceRate(cid, 0.5)
setPlayerStorageValue(cid, 223492, 1)
end
local pos = getThingPos(cid)
local poseff1 = {x=pos.x, y=pos.y-1, z=pos.z} -- posição do efeito
addEvent(doSendMagicEffect, interval, poseff1, 1) -- 1 é o número do efeito
end
return true
end

 

Agora, adicione as tags em creaturescripts.xml:

 


<event type="login" name="DoubleLogin" event="script" value="doubleexpevent.lua">
<event type="think" name="DoubleThink" event="script" value="doubleexpevent.lua">
<event type="logout" name="DoubleLogout" event="script" value="doubleexpevent.lua">

 

Em seguida, em data/creaturescripts/scripts, abra Login.lua e adicione em baixo de alguma tag parecida as tags:

 


registerCreatureEvent(cid, "DoubleLogin")
registerCreatureEvent(cid, "DoubleThink")
registerCreatureEvent(cid, "DoubleLogout")
 

Ok, agora o comando para iniciar o evento..

Em data/talkactions abra talkactions.xml e adicione a tag:

 

 


<talkaction log="yes" words="/doubleexp;!doubleexp" acess="5" event="script" value="doubleexp.lua"/>
 

 

E para terminar, crie doubleexp.lua em data/talkactions/scripts e dentro dele:

 

 


function onSay(cid, words, param)
local p = string.explode(param, ",")
if p[1] == "on" then
if not p[2] or not p[1] then
doPlayerSendCancel(cid, "Complete com o tempo e a quantia. \n Ex: /doubleexp on, 60, 2")
return true
end
local timeduration = p[2]*1000
local online = getPlayersOnline()
for i=1, #online do
doPlayerSetExperienceRate(online[1], p[3])
setPlayerStorageValue(online[1], 100001, 1)
addEvent(setGlobalStorageValue, timeduration, 200001, 1)
doBroadcastMessage("O Staff ".. getCreatureName(cid) .." iniciou o evento doubleexp. \n Tempo: ".. timeduration/1000 .." segundos \b Dobrando: "..p[3].."x mais de exp.", 21)
end
elseif param == "off" then
local online = getPlayersOnline()
for i=1, #online do
setGlobalStorageValue(200001, -getGlobalStorageValue(200001))
setPlayerStorageValue(online, 100001, 0)
doPlayerSetExperienceRate(online[1], 1)
doBroadcastMessage("O staff ".. getCreatureName(cid) .." desativou o evento double exp.", 21)
end
else
doPlayerSendCancel(cid, "Complete com ON ou OFF.")
return true
end
return true
end
 

 

 

Comando utilizado para iniciar o evento:

Citar

 

/doubleexp on, 60, 2

Ou também: !doubleexp on, 60, 2

Nesse caso seria:

ON- A função usada para ligar.

60- O tempo que o evento dura, em segundos

2- Quantas vezes vai dobrar

 

 

Editado por Vinicius Xxgamexx (veja o histórico de edições)

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Boa tarde, peço que utilize a bbcode de code ao invés de utilizar quotes para postar os códigos.

Após arrumar o tópico, aprovarei.

Link para o post
Compartilhar em outros sites

Editado* Boa tarde..

Obs: O script foi testado em um servidor da versão 8.54

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

YDmXTU2.png

 

Entenda tudo sobre VPS, DEDICADOS & HOSPEDAGENS. => Clique aqui

Global Full Download 10.9x - TFS 1.2/FERUMBRAS/KRAILOS. => Clique aqui

 

Muitos querem aquilo que você tem, 
mas vão desistir quando souberem o preço que você pagou.

 

skype-favicon.png lu.lukinha

message-16.png [email protected]

Link para o post
Compartilhar em outros sites
  • 1 month later...
  • 3 months later...

Muito Bom ! Toma MEu Rep+

Queria saber Uma Coisa

 

/doubleexp on, 60, 2

Ou também: !doubleexp on, 60, 2

Nesse caso seria:

ON- A função usada para ligar.

60- O tempo que o evento dura, em segundos

2- Quantas vezes vai dobrar

 

e Para Desliga /doubleexp off ( Se For isso no meu OT Aparece a Messagem Mais o Efeito ainda Fica )

 

e na Distro da esse error

 

 

[06/05/2017 02:59:43] [Error - TalkAction Interface]
[06/05/2017 02:59:43] data/talkactions/scripts/doubleexp.lua:onSay
[06/05/2017 02:59:43] Description:
[06/05/2017 02:59:43] (luaDoCreatureSetStorage) Creature not found
[06/05/2017 02:59:43] > Broadcasted message: "O staff {ADM-Yoshii} desativou o evento double exp.".

[06/05/2017 02:59:48] [Error - TalkAction Interface]
[06/05/2017 02:59:48] data/talkactions/scripts/doubleexp.lua:onSay
[06/05/2017 02:59:48] Description:
[06/05/2017 02:59:48] (luaDoCreatureSetStorage) Creature not found
[06/05/2017 02:59:48] > Broadcasted message: "O staff {ADM-Yoshii} desativou o evento double exp.".

Link para o post
Compartilhar em outros sites
  • 5 months later...
Em 06/05/2017 em 03:00, djteteh disse:

Muito Bom ! Toma MEu Rep+

Queria saber Uma Coisa

 

/doubleexp on, 60, 2

Ou também: !doubleexp on, 60, 2

Nesse caso seria:

ON- A função usada para ligar.

60- O tempo que o evento dura, em segundos

2- Quantas vezes vai dobrar

 

e Para Desliga /doubleexp off ( Se For isso no meu OT Aparece a Messagem Mais o Efeito ainda Fica )

 

e na Distro da esse error

 

 

[06/05/2017 02:59:43] [Error - TalkAction Interface]
[06/05/2017 02:59:43] data/talkactions/scripts/doubleexp.lua:onSay
[06/05/2017 02:59:43] Description:
[06/05/2017 02:59:43] (luaDoCreatureSetStorage) Creature not found
[06/05/2017 02:59:43] > Broadcasted message: "O staff {ADM-Yoshii} desativou o evento double exp.".

[06/05/2017 02:59:48] [Error - TalkAction Interface]
[06/05/2017 02:59:48] data/talkactions/scripts/doubleexp.lua:onSay
[06/05/2017 02:59:48] Description:
[06/05/2017 02:59:48] (luaDoCreatureSetStorage) Creature not found
[06/05/2017 02:59:48] > Broadcasted message: "O staff {ADM-Yoshii} desativou o evento double exp.".

Bom, como eu queimei a RAM do meu PC eu não posso verificar pessoalmente.

Mas acredito que o erro seja porque o evento foi iniciado com apenas o administrador online. Isso porque o administrador não conta como player, logo, ele vai contar como "nenhuma criatura online" ou algo parecido..

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Testado em TFS 0.3.6 Não Aprovado.  Executado a   instalação 3 Vezes.  

Alguem pode testar em outro servidor e comentar para eu ter certeza do mesmo.  ( Faça Backup ) Ou apenas remova caso necessario.

Testado Novamente em 0.3.6 Porem desta vez utilizando Site com as configurações do sha1 mysql. Funcional.

 

 

Editado por Cain Jorge (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

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

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

  • Conteúdo Similar

    • Por Neutraz
      Advanced Roulette System (TFS 0.3.6)
       
      Hi everyone! This is my first contribution to the Tibia community, and I hope you find it very useful. It's a gacha-style roulette system with dynamic speed mechanics and multi-key functionality.
       
      What's it about?
      This script adds a roulette (Tested on: Tibia 8.6 -- TFS 0.3.6) where players can use keys to spin the roulette and win rewards. The system includes:
      Multi-key support: using 1 to 4 keys per spin, increasing the chances of winning. Dynamic speed: The roulette gradually accelerates during the spin to make it more exciting. Configurable rewards: You can define which items can be won and with what probability. You can even add "reroll" value to increase the difficulty! Visual effects: Includes simple effects and text animations to make the experience more engaging. Activity log: Keeps a record of which players won which items.  
      Demo Video (x1.5 Speed)
      Roulette2.mp4
       
       
      Installation
      Copy the `Roulette.lua` file to the `data/actions/scripts` folder of your TFS server. --[[ ================================================================================ = ROULETTE SYSTEM FOR TFS = = = = Author: Neutras = = Version: 2.1 = = Description: Gacha-style roulette system with dynamic speed mechanics = = and multi-key feature. = = = = Features: = = - Multi-key support (1-4 keys per spin). = = - Dynamic speed animation with configurable initial and final speeds. = = - Persistent "Winner Slot" effects and animated texts. = = - Configurable rewards with reroll chances. = = - Logging system to track player rewards. = = = = Compatible with TFS 0.3.7 (Tibia 8.6). = ================================================================================ --]] -- ================= LOGGING SYSTEM ================= -- local logPath = "data/logs/" local logFileName = "roulette.log" -- Logs player rewards to a file. -- @param cid: Player ID. -- @param keyName: Name of the key used. -- @param items: Table of items won. -- @param keyCount: Number of keys used. local function logEntry(cid, keyName, items, keyCount) local file = io.open(logPath .. logFileName, "a") if file then local itemStrings = {} for _, item in ipairs(items) do table.insert(itemStrings, string.format("x%d %s", item.count, getItemNameById(item.id))) end file:write(string.format("[%s] %s used %d '%s' and won: %s\n", os.date("%Y-%m-%d %H:%M:%S"), getPlayerName(cid), keyCount, keyName, table.concat(itemStrings, ", "))) file:close() end end -- ================= BASE CONFIGURATION ================= -- -- Levers Action IDs to key item IDs. local keyByAid = { [1354] = 9971, -- Key for reward level 1 (Copper) [1355] = 9972, -- Key for reward level 2 (Silver) [1356] = 9973 -- Key for reward level 3 (Golden) } -- Levers Action IDs to reward levels. local rewardByAid = { [1354] = 1, -- Reward level 1 (Copper) [1355] = 2, -- Reward level 2 (Silver) [1356] = 3 -- Reward level 3 (Golden) } -- Relative positions of the slots in the roulette. local rouletteSpinOffset = { {1, -4}, {2, -4}, {3, -4}, {3, -3}, {4, -3}, {4, -2}, {4, -1}, {5, -1}, {5, 0}, {5, 1}, {4, 1}, {4, 2}, {4, 3}, {3, 3}, {3, 4}, {2, 4}, {1, 4}, {0, 4}, {-1, 4}, {-2, 4}, {-3, 4}, {-3, 3}, {-4, 3}, {-4, 2}, {-4, 1}, {-5, 1}, {-5, 0}, {-5, -1},{-4, -1},{-4, -2}, {-4, -3},{-3, -3},{-3, -4},{-2, -4},{-1, -4}, {0, -4} } -- ================= MAIN CONFIGURATION ================= -- local config = { rouletteCD = 30, -- Global cooldown in seconds. globalStoCd = 22600, -- Storage ID for cooldown. globalStoKeyCount = 22601, -- Storage ID for key count. maxLoops = 100, -- Maximum iterations per spin. initialSpeed = 50, -- Initial speed in milliseconds. finalSpeed = 400, -- Final speed in milliseconds. effectLever = 35, -- Effect when activating the lever. effectRewardPlayer = 28, -- Effect on the player when winning. effectReward = 28, -- Effect on the winning slot. -- Reward table by level. -- Formula: Real Probability = (Item Chance / Total Chances) * (1 - (Reroll % / 100)) items = { [1] = { {id = 1, chance = 80, count = 5}, }, [2] = { {id = 2, chance = 70, count = 1, porc_cambio = 30}, }, [3] = { {id = 3, chance = 25, count = 1, porc_cambio = 70} } } } -- ================= PROBABILITY CACHING ================= -- -- Precalculates cumulative probabilities for each reward level. local cumulativeChanceCache = {} for rewardId, items in pairs(config.items) do local total = 0 local cumulative = {} for _, item in ipairs(items) do total = total + item.chance table.insert(cumulative, {item = item, threshold = total}) end cumulativeChanceCache[rewardId] = {total = total, items = cumulative} end -- ================= UTILITY FUNCTIONS ================= -- -- Calculates the speed of the roulette animation based on progress. -- @param progress: Current progress (0 to 1). -- @return: Speed in milliseconds. local function calculateSpeed(progress) return config.initialSpeed + (config.finalSpeed - config.initialSpeed) * progress^3 end -- Selects a random item from the reward table, considering reroll chances. -- @param rewardId: Reward level ID. -- @return: Selected item. local function chooseRouletteItem(rewardId) local cache = cumulativeChanceCache[rewardId] local roll = math.random(cache.total) for _, entry in ipairs(cache.items) do if roll <= entry.threshold then if entry.item.porc_cambio and math.random(100) <= entry.item.porc_cambio then return chooseRouletteItem(rewardId) end return entry.item end end return cache.items[#cache.items].item end -- Rotates the slots in the roulette. -- @param slots: Table of slots. local function rotateSlots(slots) local last = slots[36] for i = 36, 2, -1 do slots[i] = slots[i-1] end slots[1] = last end -- Updates the visual display of the roulette. -- @param cpos: Center position of the roulette. -- @param slots: Table of slots. -- @param isFillingPhase: Whether the slots are being filled for the first time. local function updateRouletteDisplay(cpos, slots, isFillingPhase) for i = 1, 36 do local pos = { x = cpos.x + rouletteSpinOffset[i][1], y = cpos.y + rouletteSpinOffset[i][2], z = cpos.z } doCleanTile(pos) if slots[i] then doCreateItem(slots[i].id, slots[i].count, pos) -- Show puff effect only during the initial filling phase. if isFillingPhase then doSendMagicEffect(pos, 14) end end end end -- ================= WINNER SLOTS AND EFFECTS ================= -- -- Shows "Winner Slot" animated text on winning slots. -- @param cpos: Center position of the roulette. -- @param keyCount: Number of keys used. local function showWinnerSlots(cpos, keyCount) local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendAnimatedText(pos, "Winner Slot", TEXTCOLOR_YELLOW) end end -- Shows the number of keys in use. -- @param cpos: Center position of the roulette. local function showKeyCount(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount local pos = {x = 1013, y = 995, z = 7} doSendAnimatedText(pos, string.format("Keys: %d", keyCount), TEXTCOLOR_LIGHTBLUE) end -- ================= MAIN ROULETTE LOGIC ================= -- -- Main animation function, recursively called to simulate the roulette spin. -- @param cid: Player ID. -- @param cpos: Center position of the roulette. -- @param rewardId: ID of the reward level. -- @param nloop: Current iteration number. -- @param slots: Table of slots (items). -- @param keyName: Name of the key used. -- @param keyCount: Number of keys used. local function shuffle(cid, cpos, rewardId, nloop, slots, keyName, keyCount) if nloop > config.maxLoops then if isPlayer(cid) then -- Determine winning slots based on the number of keys used. local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end -- Get the winning items and their positions. local wonItems = {} local winPositions = {} for _, slot in ipairs(winningSlots) do if slots[slot] then table.insert(wonItems, slots[slot]) local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } table.insert(winPositions, pos) end end -- Award the items and display visual effects. if #wonItems > 0 then for _, pos in ipairs(winPositions) do doSendAnimatedText(pos, "Winner Slot", TEXTCOLOR_YELLOW) doSendMagicEffect(pos, config.effectReward) end for _, item in ipairs(wonItems) do doPlayerAddItem(cid, item.id, item.count) end doSendMagicEffect(getCreaturePosition(cid), config.effectRewardPlayer) -- Display a message to the player with all the rewards. local itemList = {} for _, item in ipairs(wonItems) do table.insert(itemList, string.format("x%d %s", item.count, getItemNameById(item.id))) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] You won: " .. table.concat(itemList, ", ")) -- Log the player's rewards. logEntry(cid, keyName, wonItems, keyCount) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] No items won.") end setGlobalStorageValue(config.globalStoCd, 0) end return end -- Initial filling phase of the roulette slots. if nloop <= 36 then slots[nloop] = chooseRouletteItem(rewardId) updateRouletteDisplay(cpos, slots, true) else -- Rotate the slots and update the display. rotateSlots(slots) updateRouletteDisplay(cpos, slots, false) -- Show effects on the winning slots every 5 iterations. if nloop % 5 == 0 then local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendMagicEffect(pos, config.effectReward) end end end -- Schedule the next iteration with dynamic speed. local progress = nloop / config.maxLoops addEvent(shuffle, calculateSpeed(progress), cid, cpos, rewardId, nloop + 1, slots, keyName, keyCount) end -- ================= PERIODIC EFFECTS AND TEXTS ================= -- -- Shows effects and texts periodically. -- @param cpos: Center position of the roulette. local function showEffectsAndTexts(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount -- Ensure keyCount is within range. -- Show "Winner Slot" on the winning slots. showWinnerSlots(cpos, keyCount) -- Show the number of keys in use. showKeyCount(cpos) -- Schedule the next execution. addEvent(showEffectsAndTexts, 1500, cpos) end -- ================= EFFECT SCRIPT INITIALIZATION ================= -- -- Start the periodic effects and texts when the script is loaded. local cpos = {x = 1012, y = 994, z = 7} -- Center position of the roulette. addEvent(function() showEffectsAndTexts(cpos) end, 5000) -- 5 seconds delay since server start. -- ================= MAIN OBJECT USE FUNCTION ================= -- -- Called when the roulette object is used. function onUse(cid, item, frompos, item2, topos) -- Handle the key change lever. if item.aid == 1360 then local current = getGlobalStorageValue(config.globalStoKeyCount) current = (current < 1 or current > 4) and 1 or (current % 4) + 1 setGlobalStorageValue(config.globalStoKeyCount, current) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string.format("Now using %d keys per spin.", current)) doSendMagicEffect(getThingPos(item.uid), CONST_ME_MAGIC_GREEN) return true end -- Handle the roulette levers. if not keyByAid[item.aid] then return false end local key = keyByAid[item.aid] local keyName = getItemNameById(key) local requiredKeys = getGlobalStorageValue(config.globalStoKeyCount) requiredKeys = (requiredKeys < 1 or requiredKeys > 4) and 1 or requiredKeys if getPlayerAccess(cid) < 5 and getPlayerItemCount(cid, key) < requiredKeys then doPlayerSendCancel(cid, string.format("You need %d %s to play!", requiredKeys, keyName)) doSendMagicEffect(topos, 14) return true end local rewardId = rewardByAid[item.aid] or 1 -- Get the reward level based on the lever. Default to 1 if not found. local pos = {x = 1012, y = 994, z = 7} -- Center position of the roulette. if getGlobalStorageValue(config.globalStoCd) > os.time() and getPlayerAccess(cid) < 5 then local remaining = getGlobalStorageValue(config.globalStoCd) - os.time() doPlayerSendCancel(cid, "Wait " .. remaining .. " seconds to play again.") return true end setGlobalStorageValue(config.globalStoCd, os.time() + config.rouletteCD) -- Set the cooldown. doTransformItem(item.uid, item.itemid == 9825 and 9826 or 9825) -- Change the lever's appearance. -- Clear the tiles around the roulette and add magic effects. for i = 1, 36 do local rpos = { x = pos.x + rouletteSpinOffset[i][1], y = pos.y + rouletteSpinOffset[i][2], z = pos.z } doCleanTile(rpos) doSendMagicEffect(rpos, config.effectReward) end if key > 0 then doPlayerRemoveItem(cid, key, requiredKeys) end -- Remove the keys from the player's inventory. doSendMagicEffect(pos, config.effectLever) -- Play the lever activation effect. math.randomseed(os.time() + getPlayerGUID(cid)) -- Seed the random number generator. addEvent(shuffle, config.initialSpeed, cid, pos, rewardId, 1, {}, keyName, requiredKeys) -- Start the roulette animation. return true end  
      Add the following lines within the `<actions>` tag in your `data/actions/actions.xml` file: <action actionid="XXX;YYYY;ZZZZ;AAAA" event="script" value="Roulette.lua"/> Replace `XXXX`, `YYYY`, and `ZZZZ` with the unique IDs of the levers that will activate the roulette (make sure they are not in use!).
      The ID `AAAA` is for the lever that changes the number of keys to use.
       
      Open the `Roulette.lua` file and adjust the `config.items` table with the items you want players to be able to win. Remember to balance the probabilities.  
       
      Code Explanation
      The script is divided into several sections to facilitate understanding:
      LOGGING SYSTEM: Handles logging the rewards obtained by players. BASE CONFIGURATION: Defines object IDs and reward levels. MAIN CONFIGURATION: Contains the main options of the system, such as the wait time between spins, the speed of the roulette, and the rewards. PROBABILITY CACHING: Optimizes the calculation of probabilities so that the system runs smoothly. UTILITY FUNCTIONS: Helper functions to calculate speed, choose items randomly, and update the roulette display. WINNER SLOTS AND EFFECTS: Displays the "Winner Slot" text and other visual effects in the winning spaces. MAIN ROULETTE LOGIC: The main function that controls the roulette animation and the delivery of rewards. PERIODIC EFFECTS AND TEXTS: Displays effects and texts periodically. SCRIPT INITIALIZATION: Initializes the effect system when the script is loaded. MAIN OBJECT USE FUNCTION: The function that is executed when a player interacts with a lever.

      I hope this roulette system is a great addition to your server! If you have any questions or suggestions, please feel free to leave a comment. Thank you for your support!  
       
    • Por Xagah
      Olá, bom dia a todos.
       
      Como tenho visto muitíssimos pedidos neste sentido, lhes apresento o LMS - Last Man Standing com BroadCast




       
    • Por Leohige
      Evento Loteria 
       
       
      Esse evento loteria é diferente dos demais que existem hoje nos servidores, é baseado em cima de um evento que ocorre no CraftLandia (um servidor de Minecraft).
      Quando o evento for iniciado o jogador poderá pagar um valor (configurável) para tentar acertar o número premiado (que vai de 1 até o número configurado). O evento tem um tempo de duração (configurável) e o primeiro jogador a acertar qual é o número premiado levará um premio em dinheiro (configurável) e o evento será encerrado.
       
      Demonstrações:
       
       
       
       
      Comandos:
       
       
      Configuração:
       
       
      Caso queira implementar este evento em seu servidor, crie os arquivos abaixo.
       
      data/lib/lottery/event.lua (as configurações ficam neste arquivo)
       
       
      data/globalevents/scripts/lottery.lua
       
       
      data/globalevents/globalevents.xml
       
      você pode por com um intervalo de tempo
       
       
      ou horário fixo
       
       
      data/talkactions/scripts/lottery.lua
       
       
      data/talkactions/talkactions.xml
       
       
      Tradução para PT-BR!
       
      Caso deseje traduzir o evento, substitua o Lottery.messages inteiro em data/lib/lottery/event.lua por este
       
       
      Qualquer problema, sugestão, bug ou dúvida utilize este tópico!!!
    • Por Sekk
      Bom, procurei esse Castle por MUITO TEMPO, mas não achei em NENHUM LUGAR DA INTERNET. Ontem, eu estava vendo alguns mapas do @Deathrocks, e vi nos prints, que o mapa possuia o evento que eu queria!
       
      Então baixei o mapa e extrai o evento, então venho lhes trazer!
       
       
      Nome: Castle 24H
      Cliente: 8.6
      Versão TFS: 0.4
      Tipo: Evento
       
      Bom, para começar, vamos em actions/scripts e crie 2 arquivos:
       
      castledoor1.lua
       
      castlewar1.lua
       
        Agora em actions.xml adicione as tags:
       
      Agora em monster/traps crie 3 arquivos:
       
      porta.xml
       
      protectcastle.xml  
      statue.xml  
      Agora em monsters.xml adicione as tags:    
      Vamos para movements/scripts e crie 2 arquivos:
       
      castlewar2.lua
       
      level.lua  
      Agora em movements.xml adicione as tags:  
       
      Pronto. Agora você só precisa baixar o mapa, inserir o mesmo ao seu servidor, configurar os teleports, e as hunts dentro do castle etc.
       
      PRINTS:
      1ª parte
       
      2ª parte:
       
      Obs.: Todos os ActionID e monsters já estão no mapa! Você só precisa configurar as coordenadas dos teleports, e o que possui no castle!
       
      Obs².: Tudo o que você pode configurar, já está escrito em cada script!
       
       
      Créditos:
      @DeathRocks
      PC98
      mapa.rar
    • Por Sarah Wesker
      >> Only TFS 1.X+ <<
      Oi tudo bem, espero que bem.
      Hoje, apenas começando o ano novo, quero dar-lhe um Firestorm event que eu criei com muito amor para você.
      Atualmente, há muitos eventos semelhantes, mas espero que você dê uma chance ao meu Firestorm event.
       
      Em seguida, vou explicar rapidamente como usar o Firestorm event.
      (( Passo 1 ))
      Crie um novo arquivo.lua na pasta: ( data/lib/ ) com o nome ( fire_storm.lua )
      Copie e cole o código no arquivo fire_storm.lua
      --[[ * Fire Storm Event * Evento creado por Sarah Wesker Dia 31 de Diciembre del 2018 a las 12:30 a.m. Version compatible con TFS 1.x+ ]]-- local DEBUG_ON = true local RELOAD_LIB_ON = true local SHOW_COPYRIGHT = true if RELOAD_LIB_ON or not FSE then if not FSE then print([[>>> The Firestorm Event lib loading...]]) end ---@Fire Storm Event FSE = {} ---@Room Properties FSE.room = {} FSE.room.from = Position(3095, 1847, 8) FSE.room.rangeX = 33 FSE.room.rangeY = 31 ---@Temple Position FSE.getTemplePosition = Position(3191, 1809, 7) ---@Attack Properties FSE.attackSignalEffect = CONST_ME_HITBYFIRE FSE.attackEffect = CONST_ME_FIREAREA FSE.attackDistEffect = CONST_ANI_FIRE ---@Player Counts FSE.players = {} FSE.players.min = 2 FSE.players.max = 30 FSE.players.win = 1 -- always less than FSE.players.min ---@Timers in seconds FSE.timer = {} FSE.timer.removeTp = 20 FSE.timer.checking = 2 FSE.timer.signal = {} FSE.timer.signal.min = 0.1 FSE.timer.signal.max = 0.5 FSE.timer.events = {} ---@Game Dificulty FSE.dificulty = {} FSE.dificulty.attacks = 30 FSE.dificulty.increment = 1 FSE.dificulty.D_attacks = FSE.dificulty.attacks FSE.dificulty.D_increment = FSE.dificulty.increment ---@Teleport Properties FSE.teleport = {} FSE.teleport.itemid = 1387 FSE.teleport.position = Position(3187, 1816, 7) FSE.teleport.destination = Position(3111, 1863, 8) FSE.teleport.actionid = 64500 -- movement script aid FSE.status = [[Stoped]] FSE.rewardContainerName = [[Firestorm Reward]] FSE.rewardContainerID = 2596 FSE.rewards = { -- { id = xxxx, count = 1 to 100 } { id = 2160, count = 100 }, { id = 2160, count = 100 } } function FSE:removeTp(seconds) local teleport = FSE.teleport.position:getTile():getItemById(FSE.teleport.itemid) if teleport then teleport:remove() FSE.teleport.position:sendMagicEffect(CONST_ME_POFF) end FSE:CheckControl() end function FSE:Init() if FSE.status == [[Stoped]] then FSE.status = [[Waiting]] local teleport = Game.createItem(FSE.teleport.itemid, 1, FSE.teleport.position) if not teleport then FSE:Stoped() return DEBUG_ON and print([[The Firestorm Event teleport could not be created.]]) else teleport:setActionId(FSE.teleport.actionid) end addEvent(FSE.removeTp, FSE.timer.removeTp * 1000) Game.broadcastMessage(string.format([[The Firestorm Event has been activated, waiting for participants, You have %s to enter.]], getStringTimeEnglish(FSE.timer.removeTp))) else return DEBUG_ON and print([[The Firestorm Event is trying to start, but an active instance already exists.]]) end end function FSE:Stoped(players, causeMessage, forceStoped) FSE.status = [[Stoped]] for index, eventID in pairs(FSE.timer.events) do stopEvent(eventID) end FSE.timer.events = {} for index, player in pairs(players) do player:teleportTo(FSE.getTemplePosition, false) end FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT) if forceStoped then Game.broadcastMessage([[The Firestorm Event was forced to close.]]) elseif causeMessage then Game.broadcastMessage(causeMessage) end FSE.dificulty.attacks = FSE.dificulty.D_attacks FSE.dificulty.increment = FSE.dificulty.D_increment return true end function FSE:Started(startMessage) FSE.status = [[Started]] if startMessage then Game.broadcastMessage(startMessage) end FSE:CheckControl() end function FSE:AddEvent(eventID) table.insert(FSE.timer.events, eventID) return eventID end local function getWinNames(players) local names = [[]] for index, player in pairs(players) do names = string.format([[%s%s%s]], names, player:getName(), next(players, index) == nil and '.' or [[, ]]) end return names end function FSE:CheckControl() if FSE.status == [[Stoped]] then -- Break Control elseif FSE.status == [[Waiting]] then local players = FSE:GetPlayers() if #players < FSE.players.min then FSE:Stoped(players, [[The Firestorm Event could not be started because there are not enough participants.]]) else FSE:Started() end elseif FSE.status == [[Started]] then local players = FSE:GetPlayers() if #players <= FSE.players.win then if #players == 0 then FSE:Stoped(players, [[The Firestorm Event has ended.]]) else FSE:Stoped(players, string.format([[The Firestorm Event has ended, the winners are: %s]], getWinNames(players))) FSE:SendRewardToPlayers(players) end FSE:AllRightReserve() -- only credits you can remove if want. else for index = 1, FSE.dificulty.attacks do addEvent(FSE.AttackSignal, math.random(FSE.timer.signal.min * 1000, FSE.timer.signal.max * 1000)) end FSE.dificulty.attacks = FSE.dificulty.attacks + FSE.dificulty.increment FSE:AddEvent(addEvent(FSE.CheckControl, FSE.timer.checking * 1000)) end end end function FSE:GetPlayers() local spectators = Game.getSpectators(FSE.room.from, false, true, 1, FSE.room.rangeX, 1, FSE.room.rangeY) local players = {} if spectators and #spectators > 0 then for index, player in pairs(spectators) do if not player:getGroup():getAccess() then players[#players + 1] = player end end end return players end local function getRewardNames(items) local names = [[]] for index, item in pairs(items) do local it = ItemType(item.id) names = string.format([[%s%u %s%s]], names, item.count, it:getName(), next(items, index) == nil and '.' or [[, ]]) end return names end function FSE:SendRewardToPlayers(players) for index, player in pairs(players) do local depotChest = player:getDepotChest(0, true) if depotChest then local rewardContainer = Game.createItem(FSE.rewardContainerID, 1) if rewardContainer then rewardContainer:setName(FSE.rewardContainerName) local rewardNames = getRewardNames(FSE.rewards) for index2, item in pairs(FSE.rewards) do rewardContainer:addItem(item.id, item.count) end if depotChest:addItemEx(rewardContainer, INDEX_WHEREEVER, FLAG_NOLIMIT) then player:sendTextMessage(MESSAGE_INFO_DESCR, string.format([[You have received on your depot chest: %s]], rewardNames)) end end end end end function FSE:GetRandomTile() local foundTile = Tile(FSE.room.from + Position(math.random(0, FSE.room.rangeX), math.random(0, FSE.room.rangeY), 0)) while not foundTile or not foundTile:getGround() or foundTile:hasProperty(CONST_PROP_BLOCKSOLID) do foundTile = Tile(FSE.room.from + Position(math.random(0, FSE.room.rangeX), math.random(0, FSE.room.rangeY), 0)) end return foundTile end function FSE:AttackSignal() local foundTile = FSE:GetRandomTile() if not foundTile then return DEBUG_ON and print([[Not tile could be found in the Firestorm Event area.]]) end local position = foundTile:getPosition() position:sendMagicEffect(FSE.attackSignalEffect) return addEvent(FSE.AttackTile, 500, self, { x = position.x, y = position.y, z = position.z }) end function FSE:AttackTile(tpos) local position = Position(tpos) local creatures = position:getTile():getCreatures() local fromposdist = (position-Position(5, 5, 0)) fromposdist:sendDistanceEffect(position, FSE.attackDistEffect) position:sendMagicEffect(FSE.attackEffect) if creatures and #creatures > 0 then for index, creature in pairs(creatures) do local player = creature:getPlayer() if player and not player:getGroup():getAccess() then position:sendMagicEffect(CONST_ME_POFF) player:teleportTo(FSE.getTemplePosition, false) FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT) Game.broadcastMessage(string.format([[The player %s has been eliminated from the Firestorm Event.]], player:getName())) end end end end function FSE:AllRightReserve() return SHOW_COPYRIGHT and print([[The Firestorm Event has ended, all rights reserved for Sarah Wesker.]]) end if type(FSE) == [[table]] then print([[>>> The Firestorm Event lib has successfully loaded.]]) end end (( Passo 2 ))
      Abra o arquivo ( data/lib/lib.lua ) e adicione esta linha:
      dofile('data/lib/fire_storm.lua')  (( Passo 3 ))
      Abra o arquivo ( data/movements/movements.xml ) e adicione esta linha:
      <movevent event="StepIn" actionid="64500" script="fire_storm.lua" /> (( Passo 4 ))
      Vá para a pasta ( data/movements/scripts ) e crie um novo arquivo.lua ( fire_storm.lua )
      Copie e cole o seguinte código nesse novo arquivo.lua
      function onStepIn(creature, item, position, fromPosition) local player = creature:getPlayer() if player then if #FSE:GetPlayers() >= FSE.players.max then player:teleportTo(FSE.getTemplePosition, false) FSE.getTemplePosition:sendMagicEffect(CONST_ME_TELEPORT) else player:teleportTo(FSE.teleport.destination, false) FSE.teleport.destination:sendMagicEffect(CONST_ME_TELEPORT) if not player:getGroup():getAccess() then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, [[Welcome to the Firestorm Event, you have to survive the rain of fire to win.]]) else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, [[Welcome, administrators can only participate as spectators.]]) end end else creature:teleportTo(fromPosition, false) end return true end (( Passo 5 ))
      Faça o evento começar em um determinado horário!
      Você abre o arquivo ( data/globalevents/globalevents.xml ) e adicione esta linha:
      <globalevent name="Firestorm Event" time="12:00:00" script="fire_strom.lua" /> (( Passo 6 ))
      Crie um novo arquivo.lua dentro da pasta ( data/globalevents/scripts/ ) -> ( fire_storm.lua )
      e adicione este código dentro desse arquivo:
      function onTime(interval) FSE:Init() return true end (( The End ))
      Aproveite
       
      (( Others ))
      FSE:Init() | Para iniciar o evento.
      FSE:Stoped() | Para parar o evento.
       
      (( REF IMAGES ))
      | https://prnt.sc/m2a6ov |
      | https://prnt.sc/m2a6gf |
      | https://prnt.sc/m2a7t5 |
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo