Fala galera linduxa do TK; hoje trago a vocês o tão desejado CASTLE WAR 24 HORAS, isto gera disputa intensa entre as guilds de seu servidor, atraindo assim mais jogadores que se interessam por guerras e seus demais sistemas! Modificado e com funções diferentes, no tópico ensinarei como instalar e como funciona.
Como funciona? WOOOOOOOOW!
Há um portal 24h aberto em algum lugar do seu mapa que ficará com o castle disponível 24h (avá).
Quando uma guild qualquer acessar o portal do castelo, irá aparecer para o servidor que a X guild está tentando dominar o castelo, então o líde da guild dominante atual irá dizer !gocastle para teleportar ao castelo e defende-lo.
O Objetivo para conquista do mesmo é invadi-lo derrotar os defensor da guild atual para abrir passagem, digamos assim, e subir ao trono, quando um membro da guild invadir o templo do trono e subir no mesmo a antiga guild dominadora é teleportada para o templo e o castelo fica sob domínio da nova guild.
Você poderá colocar como premiação acesso a áreas exclusivas do castelo, no caso hunts e cia. (Fica a vosso critério)
Evento testado nas versões 8.6; 9.6; 9.83; 9.86!
Observação:
Comando !gocastle faz com que o líder possa teleportar
todos os membros da sua guild online para perto dele,
desde que ele esteja no castle. Comando pode ser usado
a cada 3 horas (exhausted).
Vamos aos scripts do sistema;
Em data/actions/scripts crie um arquivo com o nome de naviocastle.lua e coloque dentro:
function onUse(cid, item, fromPosition, itemEx, toPosition)
if(item.actionid == 65500) then
if getTopCreature({x=32464,y=32378,z=5}).uid > 0 then
doTeleportThing(getTopCreature({x=32464,y=32378,z=5}).uid, {x=32526,y=32421,z=5})
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
else
doPlayerSendCancel(cid, "Você precisa estar em cima do tapete.")
return true
end
elseif (item.actionid == 65501) then
if getTopCreature({x=32526,y=32421,z=5}).uid > 0 then
doTeleportThing(getTopCreature({x=32526,y=32421,z=5}).uid, {x=32464,y=32378,z=5})
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
else
doPlayerSendCancel(cid, "Você precisa estar em cima do tapete.")
end
end
return true
end
Em actions.xml adicione a seguinte linha:
<action actionid="65500-65501" event="script" value="naviocastle.lua"/>
Pós feito isto, em data/lib crie um arquivo com o nome de 015-COH e adicione dentro dele:
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- //
COH_PUSHTIME = 10800 -- Tempo (em segundos) de exhausted para usar o comando !gocastle - Padrão (3 horas)
COH_AREA = {{x = 32458, y = 32332, z = 7}, {x = 32558, y = 32429, z = 7}} -- Canto superior esquerdo / inferior direito do Castle
-- // Não mexa daqui para baixo
COH_STATUS = 201320111714
COH_PREPARE1 = 201320111715
COH_PUSHSTOR = 201320111716
COH_PREPARE2 = 201320111717
function doCastleRemoveEnemies()
for index, creature in ipairs(getPlayersOnline()) do
if isInArea(getThingPos(creature), COH_AREA[1], COH_AREA[2]) then
if getPlayerGuildName(creature) ~= getGlobalStorageValue(COH_STATUS) then
doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)))
end
end
end
return true
end
Proximo passo, em data/monster.xml adicione a seguinte linha:
<monster name="Castle Guardian" file="Castle Guardian.xml"/>
Em data/monsters crie um arquivo com o nome de Castle Guardian.xml e adicione o seguinte:
<?xml version="1.0" encoding="UTF-8"?>
<monster name="Castle Guardian" nameDescription="a castle guardian" race="blood" experience="0" speed="0" manacost="0">
<health now="800000" max="800000"/>
<look type="131" head="57" body="19" legs="57" feet="95" addons="1" corpse="6080"/>
<targetchange interval="5000" chance="30"/>
<strategy attack="100" defense="0"/>
<flags>
<flag summonable="0"/>
<flag attackable="1"/>
<flag hostile="1"/>
<flag illusionable="0"/>
<flag convinceable="0"/>
<flag pushable="0"/>
<flag canpushitems="1"/>
<flag canpushcreatures="1"/>
<flag targetdistance="4"/>
<flag staticattack="90"/>
<flag runonhealth="800"/>
</flags>
<attacks>
<attack name="melee" interval="2000" min="-60" max="-180"/>
<attack name="physical" interval="1000" chance="35" range="7" min="-205" max="-385">
<attribute key="shootEffect" value="energy"/>
</attack>
<attack name="manadrain" interval="1000" chance="17" range="7" min="-205" max="-560"/>
<attack name="speed" interval="1000" chance="12" range="7" speedchange="-600" duration="40000">
<attribute key="areaEffect" value="redshimmer"/>
</attack>
<attack name="fire" interval="2000" chance="45" range="7" radius="3" target="1" min="-250" max="-420">
<attribute key="shootEffect" value="burstarrow"/>
<attribute key="areaEffect" value="firearea"/>
</attack>
<attack name="firefield" interval="1000" chance="20" range="7" radius="2" target="1">
<attribute key="shootEffect" value="fire"/>
</attack>
<attack name="energy" interval="2000" chance="25" length="8" spread="0" min="-265" max="-445">
<attribute key="areaEffect" value="energy"/>
</attack>
<attack name="speed" interval="6000" chance="10" range="5" speedchange="-600" duration="20000">
<attribute key="areaEffect" value="redshimmer"/>
</attack>
</attacks>
<defenses armor="1" defense="1"/>
<elements>
<element firePercent="100"/>
<element energyPercent="100"/>
<element icePercent="100"/>
<element earthPercent="90"/>
<element holyPercent="-25"/>
<element physicalPercent="-33"/>
</elements>
<immunities>
<immunity paralyze="1"/>
<immunity invisible="1"/>
</immunities>
<summons maxSummons="2">
<summon name="deathspawn" interval="1500" chance="0" max="0"/>
</summons>
<loot>
<item id="2148" countmax="20" chance1="100000" chancemax="0"/>
</loot>
</monster>
Pós isto;
Em data/movements/scripts crie um arquivo com o nome de COH.lua e adicione o seguinte:
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- //
function onStepIn(cid, item, pos, fromPosition)
local pos = getThingPos(cid)
if item.actionid == 16203 then
if not isPlayer(cid) then
return true
end
if getGlobalStorageValue(COH_STATUS) == getPlayerGuildName(cid) then
doSendMagicEffect(getThingPos(cid), 14)
doSendAnimatedText(pos, "CoH", math.random(1, 255))
else
doSendMagicEffect(getThingPos(cid), 2)
doTeleportThing(cid, fromPosition, false)
doPlayerSendCancel(cid, "[CoH] Você não pertence á guild "..getGlobalStorageValue(COH_STATUS)..".")
end
return true
end
if item.actionid == 16202 then
if not isPlayer(cid) then
return true
end
if getPlayerGuildId(cid) > 0 then
if (getGlobalStorageValue(COH_STATUS) ~= getPlayerGuildName(cid)) then
doPlayerSendTextMessage(cid, 20, "[Castle of Honor] Você e sua guild estão no comando, os antigos donos ["..tostring(getGlobalStorageValue(COH_STATUS)).."] podem se vingar!")
setGlobalStorageValue(COH_PREPARE1, -1)
setGlobalStorageValue(COH_PREPARE2, -1)
setGlobalStorageValue(COH_STATUS, getPlayerGuildName(cid))
doCastleRemoveEnemies()
doBroadcastMessage("[Castle of Honor] O jogador ["..getCreatureName(cid).."] e sua guild ["..getPlayerGuildName(cid).."] estão no comando do castelo, vá dominar e impedir isso!")
end
else
doSendMagicEffect(pos, 2)
doTeleportThing(cid, fromPosition, false)
doPlayerSendCancel(cid, "[CoH] Você não possui uma guild.")
end
return true
end
if item.actionid == 16200 then
if not isPlayer(cid) then
return true
end
if getPlayerGuildId(cid) > 0 then
doSendAnimatedText(pos, "CoH", math.random(1, 255))
if (getGlobalStorageValue(COH_PREPARE1) ~= getPlayerGuildName(cid)) and ((getGlobalStorageValue(COH_PREPARE2) ~= getPlayerGuildName(cid))) then
setGlobalStorageValue(COH_PREPARE1, getPlayerGuildName(cid))
doBroadcastMessage("[Castle of Honor] Atenção! A guild "..getPlayerGuildName(cid).." está tentando dominar o castelo, preparem-se!")
end
else
doSendMagicEffect(pos, 2)
doTeleportThing(cid, fromPosition, false)
doPlayerSendCancel(cid, "[CoH] Você não possui uma guild.")
return true
end
end
if item.actionid == 16201 then
if not isPlayer(cid) then
return true
end
doSendAnimatedText(pos, "CoH", math.random(1, 255))
if (getGlobalStorageValue(COH_PREPARE2) ~= getPlayerGuildName(cid)) then
setGlobalStorageValue(COH_PREPARE2, getPlayerGuildName(cid))
doBroadcastMessage("[Castle of Honor] Atenção! A guild "..getPlayerGuildName(cid).." está muito próxima do domínio, ataquem!")
end
end
return true
end
Em data/movements/movements.xml adicione a seguinte linha:
<movevent type="StepIn" actionid="16200-16203" event="script" value="COH.lua"/>
Próximo passo:
Em data/talkactions/scripts crie um arquivo com o nome de COHABSOLUTE.lua e adicione o seguinte:
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
-- //
function onSay(cid, words, param)
if getPlayerGuildLevel(cid) == GUILDLEVEL_LEADER then
if getPlayerStorageValue(cid, COH_PUSHSTOR) < os.time() then
if getGlobalStorageValue(COH_STATUS) == getPlayerGuildName(cid) then
if isInArea(getThingPos(cid), COH_AREA[1], COH_AREA[2]) then
if #getMembersOnline(getPlayerGuildId(cid)) > 0 then
for index, creature in ipairs(getMembersOnline(getPlayerGuildId(cid))) do
if (getTileInfo(getThingPos(creature)).protection ~= true) then
return doPlayerSendCancel(cid, "[CoH] Os membros devem estar em área PZ.")
end
doTeleportThing(creature, getThingPos(cid))
end
setPlayerStorageValue(cid, COH_PUSHSTOR, os.time() + COH_PUSHTIME)
doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "[Castle of Honor] Você teleportou seus membros, comando pode ser usado a cada "..tostring(COH_PUSHTIME / 60).." minuto(s).")
else
doPlayerSendCancel(cid, "[CoH] Para executar isso, sua guild deve ter 2 ou mais membros online.")
end
else
doPlayerSendCancel(cid, "[CoH] Você deve estar no castelo.")
end
else
doPlayerSendCancel(cid, "[CoH] Sua guild não é dona do castelo.")
end
else
doPlayerSendCancel(cid, "[CoH] Você deve aguardar "..tostring(math.ceil((getPlayerStorageValue(cid, COH_PUSHSTOR) - os.time()) / 60)).." minuto(s) para usar este comando.")
end
else
doPlayerSendCancel(cid, "[CoH] Você deve ser líder de uma guild para executar este comando.")
end
return true
end
function getMembersOnline(id)
local mbr = {}
for index, creature in ipairs(getPlayersOnline()) do
if getPlayerGuildId(creature) == id then
if getCreatureSkullType(creature) < 3 then
table.insert(mbr, creature)
end
end
end
return mbr or #mbr
end
Em data/talkactions/talkactions.xml adicione a seguinte linha:
<talkaction words="!castlepush;!pushmembers;!gocastle" event="script" value="COHABSOLUTE.lua"/>
Quem disponibiliza o mapa do castelo a vocês é nosso amigo ViitinG, segue o link do tópico para download do mesmo já adaptado para este Castle:
http://www.tibiaking.com/forum/topic/35730-mapa-evento-war-castle/
Explicação das actions e demais (caso não use o mapa disponibilizado pelo Viiting lembre de adicionar ao castelo);
ActionID 16200 - No meio do caminho para o castelo,
ActionID 16201 - Perto do castelo,
ActionID 16202 - No piso, trono que faz com que domine,
e ActionID 16203 - Para a passagem de acesso ás
hunts / city exclusivas da guild vencedora.
Importante: Para colocar uma passagem para as hunts ou o que for a premiação da guild vencedora, coloque um caminho único com os actionIDS 16203, assim só a guild dominante do castelo poderá passar neste local.
É importante lembrar que este script é de autoria do Roksas Nunez, ex scripter da empresa chaitosoft, fiz simples modificações de otimização.
Qualquer dúvida peço que entre em contato comigo e poste aqui no tópico.
Créditos:
Absolute
Roksas
ViitinG
Espero que gostem, afinal raro alguém disponibilizar algo tão desejado e útil assim!
Até o próximo sistema.
Absolute on tibiaking =p