Fala galerinha linda do XTibia, hoje estou trazendo um evento que andei modificando e otimizando, é o evento City WAR, este evento tem no servidorglobalwar e outros.
A autoria vem de um membro da otland, portante havia o mesmo aqui em um datapack e decidi otimizar este evento para vocês do XTibia.
Observação: É um pouco parecido com o evento do meu amigo e scripter DuH, porém com mais funções e regras, mas o objetivo é praticamente o mesmo.
Como funciona:
Quando um GM executar o comando para abrir o evento, abrirá um teleport no lugar configurada onde os membros entraram em uma arena onde não perde level nem skills, o evento terá o tempo de 20 minutos (configurável), caso o player morra poderá voltar novamente pelo teleport que estará localizado no lugar até o termino do evento, a regra é clara produção, quando der os X minutos, o que mais matou levará para a casa backpack o prêmio do evento.
Vamos lá;
Primeiramente, em sua pasta data/lib crie um arquivo com o nome de city war.lua e dentro do mesmo coloque:
configCW = {timetostart = 500, -- tempo para iniciar o evento em segundos
telpos = {x=32340, y=32213, z=7}, -- onde aparecerá o teleport
stats = 201201201701,
kill = 201201201702,
death = 201201201703,
ostime = 201201201704,
evttime = 20, -- quanto tempo irá rolar o evento
topleftPos = {x=32722, y=31336, z=6}, -- canto esquerdo superior
botrightPos = {x=32791, y=31384, z=6}, -- canto direito inferior
templepos = {x=32369, y=32241, z=7}, -- posição do templo principal
arenapos = {{x=32722, y=31340, z=6}, {x=32786, y=31336, z=6}, {x=32722, y=31380, z=6}, {x=32783, y=31374, z=6}}, -- posição dos 4 tronos
times = 8, -- não precisa mexer
finaltime = 300 -- não precisa mexer
}
function configCW:new()
local newevt = {}
setmetatable(newevt, self)
self.__index = self
doBroadcastMessage("The City War will be open in " .. self.timetostart .. " seconds.")
setGlobalStorageValue(self.stats, 0)
addEvent(function () newevt:start() end, self.timetostart*1000)
end
function configCW:start()
if getGlobalStorageValue(self.stats) == 0 then
setGlobalStorageValue(self.ostime, os.time())
local teleport = doCreateItem(1387, self.telpos)
doItemSetAttribute(teleport, "aid", 5540)
setGlobalStorageValue(self.stats, 1)
doBroadcastMessage("The City War is starting...")
for _, posi in pairs(self.arenapos) do
local item = getTileItemById(posi, 1387)
if(item.uid ~= 0) then
doRemoveItem(item.uid)
end
end
addEvent(function () self:preclose() end, self.evttime*1000*60)
addEvent(function () self:announce(0) end, (self.evttime/self.times)*1000*60)
end
end
function configCW:announce(times)
if times < self.times then
if #self:getTopFrags(true) >= 1 then
doBroadcastMessage("Top City War fraggers: " .. self:getTopFrags())
end
addEvent(function () self:announce(times+1) end, (self.evttime/self.times)*1000*60)
end
end
function configCW:preclose()
if getGlobalStorageValue(self.stats) == 1 then
setGlobalStorageValue(self.stats, 2)
doBroadcastMessage("The City War will end in " .. self.finaltime .. " seconds.")
addEvent(function () self:close() end, self.finaltime*1000)
local item = getTileItemById(self.telpos, 1387)
if(item.uid ~= 0) then
doRemoveItem(item.uid)
end
end
end
function configCW:close()
if getGlobalStorageValue(self.stats) == 2 then
if #self:getTopFrags(true) >= 1 then
doBroadcastMessage("The City War has ended. The winners are: " .. self:getTopFrags())
else
doBroadcastMessage("The City War has ended. There were no winners.")
end
doRemovePlayersFromArea(self.topleftPos, self.botrightPos, self.templepos)
for _, posi in pairs(self.arenapos) do
doCreateTeleport(1387, self.templepos, posi)
end
for place, info in ipairs(self:getTopFrags(true)) do
if place > 5 then
break
end
local cid = getPlayerByName(info)
doPlayerSendTextMessage(cid, 4, "Congratulations, you were the " .. place .. "º place in the City War.")
doPlayerAddItem(cid, 6571, 1)
end
setGlobalStorageValue(self.stats, -1)
end
end
function configCW:isPlayerInEvent(cid)
if getPlayerStorageValue(cid, self.stats) == -1 or getPlayerStorageValue(cid, self.stats) - os.time() <= -5 or getGlobalStorageValue(self.stats) < 1 then
return false
end
return true
end
function configCW:getTopFrags(tab)
local frag = {}
for _, pid in pairs(getPlayersOnline()) do
if (getPlayerStorageValue(pid, self.kill) ~= -1 or getPlayerStorageValue(pid, self.death) ~= -1) and self:isPlayerInEvent(pid) then
local kill = getPlayerStorageValue(pid, self.kill)+1
local death = getPlayerStorageValue(pid, self.death)+1
print(getCreatureName(pid), kill-death)
table.insert(frag, {getCreatureName(pid), kill-death})
end
end
print(#frag)
local frag, str, n = doOrderTab(frag, 0), nil, 5
print(#frag)
if tab then
return frag
else
if #frag < 5 then
n = #frag
end
for i = 1, n do
local cid = getPlayerByName(frag[i])
local kill = getPlayerStorageValue(cid, self.kill)+1
local death = getPlayerStorageValue(cid, self.death)+1
str = str and str .. ", " .. frag[i] .. "[" .. kill .. "/" .. death .. "]" or frag[i] .. "[" .. kill .. "/" .. death .. "]"
end
end
return str
end
function doOrderTab(tabela, value)
local max, index = {}, nil
for i = 1, #tabela do
valor = value
for a, b in ipairs(tabela) do
if b[2] > valor then
valor = b[2]
valor2 = b[1]
index = a
end
end
table.remove(tabela, index)
if valor ~= value then
table.insert(max, valor2)
end
end
return max
end
Configuração do arquivo:
telpos = {x=32340, y=32213, z=7}, -- POSIÇÃO ONDE NASCE O TP DO EVENTO!
topleftPos = {x=32722, y=31336, z=6}, -- AQUI COLOQUE A POSIÇÃO DO CANTO ESQUERDO LA EM CIMA DO MAPA
botrightPos = {x=32791, y=31384, z=6}, -- AQUI A POSIÇÃO DO CANTO DIREITO EM BAIXO DO MAPA
templepos = {x=32369, y=32241, z=7}, -- POSIÇÃO DO TEMPLO ONDE OS JOGADORES NASCERAM PÓS A MORTE
arenapos = {{x=32722, y=31340, z=6}, {x=32786, y=31336, z=6}, {x=32722, y=31380, z=6}, {x=32783, y=31374, z=6}}, --
ATENÇÃO, NO MAPA QUE ESTAREI DISPONIBILIZANDO VISIVELMENTE TERÁ 4 BASES, VOCÊ TERA QUE COLOCAR A POSIÇÃO DAS BASES AÍ NESSES 3 LUGARES.
doPlayerAddItem(cid, 6571, 1) -- AQUI VOCÊ COLOCARÁ O PRÊMIO DO GANHADOR, NO CASO QUEIRA ADICIONAR POR EXEMPLO 1kk, COLOQUE 2160,1 - Primeiro ID depois quantia.
Segundo passo, crie um arquivo com o nome de citywarCreature.lua e coloque dentro da pasta creaturescripts/scripts com o seguinte conteúdo:
function onPrepareDeath(cid, lastHitKiller, mostDamageKiller)
if isInRange(getCreaturePosition(cid), configCW.topleftPos, configCW.botrightPos) then
setPlayerStorageValue(cid, configCW.death, getPlayerStorageValue(cid, configCW.death) +1)
setPlayerStorageValue(lastHitKiller[1], configCW.kill, getPlayerStorageValue(lastHitKiller[1], configCW.kill) +1)
end
return true
end
E adicione em creaturescripts.xml a seguinte tag
<event type="preparedeath" name="CityWar" event="script" value="citywarCreature.lua"/>
Terceiro passo, crie um arquivo em movements/scripts com o nome de citywarMovements.lua com o seguinte conteúdo:
function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition)
if isPlayer(cid) and getGlobalStorageValue(configCW.stats) == 1 then
doTeleportThing(cid, configCW.arenapos[math.random(1, #configCW.arenapos)])
doSendMagicEffect(getPlayerPosition(cid), 28)
if not(configCW:isPlayerInEvent(cid)) then
setPlayerStorageValue(cid, configCW.stats, getGlobalStorageValue(configCW.ostime) + configCW.evttime*60 + configCW.finaltime)
setPlayerStorageValue(cid, configCW.kill, -1)
setPlayerStorageValue(cid, configCW.death, -1)
end
else
doTeleportThing(cid, fromPosition)
end
return true
end
Em Movements.xml adicione a seguinte linha
<movevent type="StepIn" actionid="5540" event="script" value="citywarMovements.lua"/>
Quarto e último passo, em talkactions/scripts crie um arquivo com o nome de citywarTalkactions.lua e coloque o seguinte conteúdo:
function onSay(cid, words, param)
if getGlobalStorageValue(configCW.stats) == -1 then
configCW:new()
else
doPlayerSendCancel(cid, "The event is already running.")
end
return true
end
Em talkactions/talkactions.xml adicione a seguinte linha:
<talkaction log="yes" words="/citywar" access="3" event="script" value="citywarTalkactions.lua"/>
Este mapa é para o evento!
Download : http://www.mediafire...ld City War.rar
Scan : https://www.virustot...sis/1402539782/
Créditos: Absolute. Collocor.
Quem Está Navegando
0 membros estão online
Nenhum usuário registrado visualizando esta página.