Fonte: Otland - Doggynub
Modificações e tradução de algumas falas do npc e do MOD: Hudsin
Testado em tfs 0.4
O que faz o script:
Sistema de guerra entre 2 times(vermelho e azul),para que a war se inicie é necessário 2 times de 20 players(pode ser mudado no script) além de todos que forem participar precisar falar com o npc Eventer.
Atualizações:
1- GM pode resetar o evento.
2- Players nao pode mudar a cor do outfit durante o evento.
3- Cada 40 segundos é enviado a mensagem avisando quantos players estão participando.
Crie um novo npc em npc/Eventer.xml:
<?xml version="1.0" encoding="UTF-8"?> <npc name="Eventer" script="event.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="129" head="79" body="113" legs="105" feet="86" addons="0"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Para entrar na batalha diga {Battle} e para sair diga leave."/> <parameter key="message_farewell" value="Good bye."/> <parameter key="message_walkaway" value="Farewell then.." /> </parameters> </npc>
Agora em npc/script crie Event.lua e cole:
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end --[[start edit]]-- local mingroup = 4 --(updated) minimum group to reset the event local joined = 10000 ---must be like the storage in mod local maxPlayerEachTeam = 20 ---must be like max number in mod local team1Name = "Blue" ---must be like team number i mod local team2Name = "Red" local minlevel = 130 --(added) min lvl for a player to join. --[[storage like in the mod file]]-- local running1 = 12000 --just add a non ussed storage local running2 = 12001 --just add a non ussed storage local sto = 12223 --just add a non ussed storage --[[storage end]]-- --[[End of edit]]-- local function getBlue() return getGlobalStorageValue(9888) end local function removeBlue() return setGlobalStorageValue(9888, getGlobalStorageValue(9888) - 1) end local function addBlue() return setGlobalStorageValue(9888, getGlobalStorageValue(9888) + 1) end local function resetBlue() return setGlobalStorageValue(9888,0) end local function getRed() return getGlobalStorageValue(9887) end local function removeRed() return setGlobalStorageValue(9887, getGlobalStorageValue(9887) - 1) end local function addRed() return setGlobalStorageValue(9887, getGlobalStorageValue(9887) + 1) end local function resetRed() return setGlobalStorageValue(9887,0) end --[[script start]]-- function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if getPlayerGroupId(cid) >= mingroup then npcHandler:say("Oh! Hail, sire. Do you want to reset my event?", cid) talkState[talkUser] = 1 if msgcontains(msg, 'yes') and talkState[talkUser] == 1 then resetBlue() resetRed() setGlobalStorageValue(running1,-1) setGlobalStorageValue(running2,-1) setGlobalStorageValue(sto,-1) npcHandler:say("Event was reseted, sire.", cid) doBroadcastMessage("Eventer: Meu evento foi resetado por ordens do "..getCreatureName(cid)..". Para participar fale comigo outra vez,estou na arena pvp.") for _,cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid, joined) > 0 then setPlayerStorageValue(cid, joined,-1) doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) end end elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then npcHandler:say("As You wish, sire.", cid) talkState[talkUser] = 0 end else if msgcontains(msg, 'battle') then if getGlobalStorageValue(running2) == 1 then npcHandler:say("Ja tem batalha em andamento,tente mais tarde.", cid) elseif getPlayerLevel(cid) < minlevel then npcHandler:say("Apenas level 130+ pode participar.",cid) else npcHandler:say("Voce esta preparado para a abatalha? Por enquanto temos " .. getBlue() .. "/" .. maxPlayerEachTeam .. " players no {" .. team1Name .. "} team e " .. getRed() .. "/" .. maxPlayerEachTeam .. " players no {" .. team2Name .. "} team,vc quer escolher algum?", cid) talkState[talkUser] = 1 end elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then if getPlayerStorageValue(cid, joined) ~= 1 and getPlayerStorageValue(cid, joined) ~= 2 then npcHandler:say("Vc quer ser do {" .. team1Name .. "} team ou {" .. team2Name .. "} team?", cid) talkState[talkUser] = 2 else npcHandler:say("Vc esta cadastrado!", cid) talkState[talkUser] = 0 end elseif msgcontains(msg, 'no') and talkState[talkUser] == 1 then npcHandler:say("Okay then.", cid) talkState[talkUser] = 0 elseif msgcontains(msg, team1Name) and talkState[talkUser] == 2 then if getBlue() ~= maxPlayerEachTeam then --fixed setPlayerStorageValue(cid, joined, 1) addBlue() npcHandler:say("Vc entrou no " .. team1Name .. " team! Quando ambas equipes tiverem " .. maxPlayerEachTeam .. " os players serao teleportados para arena de batalha.", cid) talkState[talkUser] = 0 else npcHandler:say("{" .. team1Name .. "} team esta cheio, entre no {" .. team2Name .. "} team ou espere alguem sair do {" .. team1Name .. "} team.", cid) --fixed talkState[talkUser] = 1 end elseif msgcontains(msg, team2Name) and talkState[talkUser] == 2 then if getRed() ~= maxPlayerEachTeam then --fixed setPlayerStorageValue(cid, joined, 2) --fixed addRed() npcHandler:say("Vc esta no " .. team2Name .. " team! Quando ambas equipes tiverem " .. maxPlayerEachTeam .. " os players serao teleportados para arena de batalha.", cid) talkState[talkUser] = 0 else npcHandler:say("{" .. team2Name .. "} team esta cheio, entre no {" .. team1Name .. "} team ou espere alguem sair do {" .. team2Name .. "} team.", cid) talkState[talkUser] = 1 end elseif msgcontains(msg, 'leave') then npcHandler:say("Vc quer sair da lista de espera para batalha?", cid) talkState[talkUser] = 3 elseif msgcontains(msg, 'yes') and talkState[talkUser] == 3 then if getPlayerStorageValue(cid,joined) == 1 then setPlayerStorageValue(cid, joined, -1) -- fixed removeBlue() npcHandler:say("Vc saiu da batalha.", cid) doBroadcastMessage("Event: " .. getPlayerName(cid) .. " saiu da batalha " .. team1Name .. " e " .. team2Name .. "!") elseif getPlayerStorageValue(cid,joined) == 2 then --fixed setPlayerStorageValue(cid,joined,-1) removeRed() npcHandler:say("Vc saiu da batalha.", cid) doBroadcastMessage("Event: " .. getPlayerName(cid) .. " saiu da batalha " .. team1Name .. " e " .. team2Name .. "!") else npcHandler:say("Vc nao esta cadastrado!", cid) end talkState[talkUser] = 0 -- moved end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
Agora para instalar o MOD crie um novo arquivo Event.xml na pasta mods de seu ot e coloque o seguinte codigo:
<?xml version="1.0" encoding="UTF-8"?> <mod name="Team Event" version="1.0" author="Damadgerz" contact="support@lualand.net" enabled="yes"> <description> This is a full auto Team BattleEvent(missing part for site) : 1- Player will get the ability to talk to the npc event starter to start the event every x times(time between each event) 2- players will go to npc and say battle and then join their desired team(you adjust team names) , they also have ability to leave team 3- You have ability to set max players per each team, npc will not tp the players to arena except when both teams are full 4- Script automatically set the place of event to a pvp arena (players no lose items,levels,geet msg who killed them).Place cant be a non-pvp area. 5- if player logged out they will automatically be lifted out from event. 6- players in same team cant attack each others even with spells 7- each team will have a uniform 8-you choose where the first team be tped and where the second team be tped 9-when event start, you set a max time for event.So if ppl couldnt kill each other( if players in first team = players in second team when event times finish) They will automatically be sent to temple and no one will take reward and broadcast 10 -during event if max time didnt finish and player of team 1 killed all of those of team2 then players of team1 will be tped to temple broadcasting they won by killing all other members and will recieve a random reward taht you set 11 -Then the event will be on hold untill time between each event pass(you set that) , and when it pass a auto broadcast is made every minute to tell player that event is open. </description> <config name="tutorial_m"><![CDATA[ running1 = 12000 --just add a non ussed storage running2 = 12001 --just add a non ussed storage joined = 10000 --just add a non ussed storage sto = 12223 --just add a non ussed storage check = 5454 -- empty storage redpotision = {x=19068, y=18978, z=7} --place where the red team player be teleported to blueposition = {x=19060, y=19052, z=7} --place where the blue team player be teleported to stoptime = 2 --in minutes team1name = "Blue" --just put the name without <team> team2name = "Red" timebetween = 5 -- time between each event arena = { frompos = {x=19068,y=18978,z=7}, topos = {x=19060,y=19052,z=7} } ----Put you event area here conf = { rewards_id = {2472}, -- Rewards ID maxplayers = 20 ---maxplayers per team } ]]></config> <lib name="football-lib"><![CDATA[ function getBlue() return getGlobalStorageValue(9888) end function removeBlue() return setGlobalStorageValue(9888, getGlobalStorageValue(9888) - 1) end function addBlue() return setGlobalStorageValue(9888, getGlobalStorageValue(9888) + 1) end function resetBlue() return setGlobalStorageValue(9888,0) end function getRed() return getGlobalStorageValue(9887) end function removeRed() return setGlobalStorageValue(9887, getGlobalStorageValue(9887) - 1) end function addRed() return setGlobalStorageValue(9887, getGlobalStorageValue(9887) + 1) end function resetRed() return setGlobalStorageValue(9887,0) end function onStop() if getGlobalStorageValue(running1) == 1 then setGlobalStorageValue(running1, -1) setGlobalStorageValue(sto,1) end return true end function onStopp() if getGlobalStorageValue(running2) > 0 then setGlobalStorageValue(running2,-1) doBroadcastMessage("Event : event is started again , go talk to the Evnet's Npc.") end end ]]></lib> <event type="login" name="Tutorial Login" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onLogin(cid) if getPlayerStorageValue(cid,check) > 0 then if isInRange(getCreaturePosition(cid), arena.frompos, arena.topos) then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) setPlayerStorageValue(cid,check,-1) else setPlayerStorageValue(cid,check,-1) end end registerCreatureEvent(cid, "Log") registerCreatureEvent(cid, "Arena") registerCreatureEvent(cid, "Attk") return true end ]]></event> <event type="combat" name="Attk" event="script"><![CDATA[ domodlib('tutorial_m') domodlib('football-lib') function onCombat(cid, target) if getPlayerStorageValue(cid, joined) == 1 and getPlayerStorageValue(target, joined) == 1 then return false end if getPlayerStorageValue(cid, joined) == 2 and getPlayerStorageValue(target, joined) == 2 then return false end return true end ]]></event> <event type="logout" name="Log" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onLogout(cid) if getPlayerStorageValue(cid,joined) == 1 then doBroadcastMessage(""..getPlayerName(cid).." have left the War-Event") setPlayerStorageValue(cid,joined,-1) setPlayerStorageValue(cid,check,1) removeBlue() return true end if getPlayerStorageValue(cid,joined) == 2 then doBroadcastMessage(""..getPlayerName(cid).." have left the War-Event") setPlayerStorageValue(cid,check,1) removeRed() return true end return true end ]]></event> <event type="statschange" name="Arena" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') local corpse_ids = { [0] = 3065, -- female [1] = 3058 -- male } function onStatsChange(cid, attacker, type, combat, value) if combat == COMBAT_HEALING then return true end if getCreatureHealth(cid) > value then return true end if isInRange(getCreaturePosition(cid), arena.frompos, arena.topos) then doItemSetAttribute(doCreateItem(corpse_ids[getPlayerSex(cid)], 1, getThingPos(cid)), "description", "You recognize "..getCreatureName(cid)..". He was killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item")..".\n[War-Event kill]") doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doRemoveConditions(cid, FALSE) doCreatureAddHealth(cid, getCreatureMaxHealth(cid) - getCreatureHealth(cid)) doCreatureAddMana(cid, getCreatureMaxMana(cid) - getCreatureMana(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You got killed by "..(isMonster(attacker) and "a "..string.lower(getCreatureName(attacker)) or isCreature(attacker) and getCreatureName(attacker) or "a field item").." in the war event.") if isPlayer(attacker) then doPlayerSendTextMessage(attacker, MESSAGE_STATUS_CONSOLE_BLUE, "You killed "..getCreatureName(cid).." in the war event.") end if getPlayerStorageValue(cid,joined) == 1 then removeBlue() setPlayerStorageValue(cid,10000,-1) elseif getPlayerStorageValue(cid,joined) == 2 then removeRed() setPlayerStorageValue(cid,10000,-1) end end return true end ]]></event> <globalevent name="reset" type="start" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onStartup() resetBlue() resetRed() setGlobalStorageValue(running1,-1) setGlobalStorageValue(running2,-1) setGlobalStorageValue(sto,-1) return true end ]]></globalevent> <globalevent name="TeamBattle" interval="7" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') local bmale = createConditionObject(CONDITION_OUTFIT) setConditionParam(bmale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(bmale, {lookType = math.random(128,134), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3}) local bfemale = createConditionObject(CONDITION_OUTFIT) setConditionParam(bfemale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(bfemale, {lookType = math.random(136,142), lookHead = 88, lookBody = 88, lookLegs = 88, lookFeet = 88, lookTypeEx = 0, lookAddons = 3}) local rmale = createConditionObject(CONDITION_OUTFIT) setConditionParam(rmale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(rmale, {lookType = math.random(128,134), lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3}) local rfemale = createConditionObject(CONDITION_OUTFIT) setConditionParam(rfemale, CONDITION_PARAM_TICKS, -1) addOutfitCondition(rfemale, {lookType = math.random(136,142),lookHead = 94, lookBody = 94, lookLegs = 94, lookFeet = 94, lookTypeEx = 0, lookAddons = 3}) function onThink(interval, lastExecution) local random_item = conf.rewards_id[math.random(1, #conf.rewards_id)] if (getBlue() == conf.maxplayers and getRed() == conf.maxplayers) then if (getGlobalStorageValue(running1) == -1 and getGlobalStorageValue(sto) == -1) then setGlobalStorageValue(running1,1) doBroadcastMessage("The Team Battle Event have started.And will end in "..stoptime.." minutes, unless one of the teams has killed all the oponents") addEvent(onStop, stoptime * 60 * 1000) for _, cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid, joined) == 1 then if getPlayerSex(cid) == 1 then doAddCondition(cid, bmale) elseif getPlayerSex(cid) ~= 1 then doAddCondition(cid, bfemale) end doTeleportThing(cid, blueposition, FALSE) doSendMagicEffect(blueposition, 10) elseif getPlayerStorageValue(cid, joined) == 2 then if getPlayerSex(cid) == 1 then doAddCondition(cid, rmale) elseif getPlayerSex(cid) ~= 1 then doAddCondition(cid, rfemale) end doTeleportThing(cid, redpotision, FALSE) doSendMagicEffect(redpotision, 10) end end end end if getGlobalStorageValue(running1) == 1 then setGlobalStorageValue(running2,1) if (getBlue() >= 1 and getRed() < 1) then addEvent(onStopp, timebetween * 60 * 1000) doBroadcastMessage("The War-Event has finished as the " ..team1name.. " team has killed all players in oponnent team ,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes") elseif (getBlue() < 1 and getRed() >= 1) then doBroadcastMessage("The War-Event has finished as the " ..team2name.. " team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes") addEvent(onStopp, timebetween * 60 * 1000) end for _, cid in ipairs(getPlayersOnline()) do if (getBlue() >= 1 and getRed() < 1) then if getPlayerStorageValue(cid,joined) == 1 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doRemoveConditions(cid, FALSE) doPlayerAddItem(cid, random_item, 1) doRemoveConditions(cid, FALSE) doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, joined,-1) setGlobalStorageValue(running1,-1) resetBlue() end end if (getBlue() < 1 and getRed() >= 1) then if getPlayerStorageValue(cid,joined) == 2 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doRemoveConditions(cid, FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doRemoveConditions(cid, FALSE) doPlayerAddItem(cid, random_item, 1) doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1) setGlobalStorageValue(running1,-1) setPlayerStorageValue(cid, joined,-1) resetRed() end end end end return true end ]]></globalevent> <globalevent name="Team" interval="3" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onThink(interval, lastExecution) local random_item = conf.rewards_id[math.random(1, #conf.rewards_id)] if getGlobalStorageValue(sto) == 1 then if (getRed() > getBlue()) then doBroadcastMessage("The War-Event has finished as the " ..team2name.. " team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes") for _, cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid,joined) == 2 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doRemoveConditions(cid, FALSE) doPlayerAddItem(cid, random_item, 1) doRemoveConditions(cid, FALSE) doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, joined,-1) end if getPlayerStorageValue(cid,joined) == 1 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doPlayerSendTextMessage(cid,24, "Your team has lost in the war event war event") setPlayerStorageValue(cid, joined,-1) doRemoveConditions(cid, FALSE) end end addEvent(onStopp, timebetween * 60 * 1000) end if (getRed() < getBlue()) then doBroadcastMessage("The War-Event has finished as the " ..team1name.. " team has killed all players in oponnent team,they will recieve their rewards.Event will be reopened in ".. timebetween .." minutes") for _, cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid,joined) == 1 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doPlayerAddItem(cid, random_item, 1) doRemoveConditions(cid, FALSE) doRemoveConditions(cid, FALSE) doCreatureSay(cid, "You have won a "..getItemNameById(random_item).." as a reward from war event", TALKTYPE_ORANGE_1) setPlayerStorageValue(cid, joined,-1) end if getPlayerStorageValue(cid,joined) == 2 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doRemoveConditions(cid, FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doPlayerSendTextMessage(cid,24, "Your team has lost in the war event war event") setPlayerStorageValue(cid, joined,-1) end end addEvent(onStopp, timebetween * 60 * 1000) end if (getRed() == getBlue()) then for _, cid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(cid,joined) == 2 or getPlayerStorageValue(cid,joined) == 1 then doTeleportThing(cid, getTownTemplePosition(getPlayerTown(cid)), FALSE) doRemoveConditions(cid, FALSE) doSendMagicEffect(getCreaturePosition(cid), 10) doRemoveConditions(cid, FALSE) setPlayerStorageValue(cid, joined,-1) doBroadcastMessage("Event max time ended.And niether of the teams won the event.Event will be reopened in ".. timebetween .." minutes") end end addEvent(onStopp, timebetween * 60 * 1000) end resetBlue() resetRed() setGlobalStorageValue(sto, -1) end return true end ]]></globalevent> <globalevent name="Broad" interval="90" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onThink(interval, lastExecution) if getGlobalStorageValue(running2) == -1 then doBroadcastMessage("O evento de batalha está aberto.O npc Eventer precisa de 2 times de 20 pessoas para iniciar a batalhe,ele esta na Arena Pvp que vai por teleport de Carlin. Ja tem "..getBlue().." players no blue team vs "..getRed().." players no Red team,o time vencedor sera premiado.") return true end return true end ]]></globalevent> <globalevent name="Karim" interval="40000" event="script"><![CDATA[ domodlib('football-lib') domodlib('tutorial_m') function onThink(interval, lastExecution) if getGlobalStorageValue(running1) > 0 then local blue = {} local green = {} for _, pid in ipairs(getPlayersOnline()) do if isInRange(getCreaturePosition(pid),arena.frompos, arena.topos) then if getPlayerStorageValue(pid, joined) == 1 then table.insert(blue,getCreatureName(pid)) elseif getPlayerStorageValue(pid, joined) == 2 then table.insert(green,getCreatureName(pid)) end end end local greenn = table.concat(green,', ') local bluee = table.concat(blue,', ') for _, tid in ipairs(getPlayersOnline()) do if getPlayerStorageValue(tid, joined) > 0 then doPlayerSendTextMessage(tid,19,'<<!-- Players left --!>>\n '..team1name..' team ('..#blue..') : '..bluee..'.\n '..team2name..' team ('..#green..') : '..greenn..'.') end end end return true end ]]></globalevent> </mod>
Aqui você pode editar a recompensa:
rewards_id = {2472}, -- Rewards ID
Para adicionar mais ficaria assim:
rewards_id = {ID DO ITEM,ID DO ITEM,ID DO ITEM}, -- Rewards ID
espero que gostem e comentem!
bjs :XTibia_smile:
:tux: