Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Olá pessoa, hoje vim trazer pra vocês um script bem requisitado que inclusive é vendido por alguns scripters. Algumas versões "pioradas" dessse script podem ser encontradas em servidores cópias do Fox World porém nenhum desses scripts chegará aos pés desse daqui que foi arrumado por mim.
Eu não sou o criador do Script, eu peguei qualquer um na internet e só fui arrumando e adicionando coisas que as pessoas reclamavam que não tinha.
O cara que criou a versão que eu editei é esse daqui:

Spoiler


PROGRAMADOR: ROKSAS NUNEZ. (EDUARDO NUNEZ)


Não vou me prolongar e nem falar mal da versão do Roksas, apenas saibam que eu editei ela praticamente inteira e que agora está 100%.

Aqui tem um pequeno vídeo de como funciona o evento:

 

 


Explicação: Gran Castle é um evento para ser feito sozinho ou com a guild, há um limite configurável no script de membros que podem entrar da mesma guild. Em dias determinados é aberto o evento e os players podem entrar ao falar com o NPC Melkrapo. Uma vez dentro do castelo os players batalharão para subir os andares e chegar até a Gran Tower, um monstro lendário que dará glória para aqueles que o derrotarem. Será que você é capaz? Instale no seu server e descubra! Um evento para redefinir o conceito de PVP e onde o seu maior inimigo serão seus semelhantes.


Sem mais delongas vamos começar  a instalar esse monstrinho.. porque ele é grande pra caralho.

 

 

 

Spoiler

 


Comece abrindo seu data\creaturescripts.xml e adicionando essas linhas:

 

Spoiler

	<!-- Gran FUCKING Aura -->
	<event type="death" name="Gran Tower" event="script" value="Gran Tower.lua"/>
	<event type="login" name="Gran Aura" event="script" value="Gran Aura.lua"/>
	<event type="statschange" name="Gran Aura Stats" event="script" value="Gran Aura.lua"/>
	<event type="logout" name="Gran Aura Logout" event="script" value="Gran Aura.lua"/>
	<event type="target" name="Gran Tower Target" event="script" value="Gran Tower.lua"/>
	<event type="statschange" name="Gran Tower Stats" event="script" value="Gran Tower.lua"/>
	<event type="statschange" name="Barrier Stats" event="script" value="Barrier.lua"/>



Agora crie um arquivo em creaturescripts\scripts chamado Gran Tower.lua e adicione o seguinte:

Spoiler

function onDeath(cid, corpse, lastHitKiller, mostDamageKiller)
local killer = lastHitKiller[1]
 if isPlayer(killer) and (getCreatureName(cid) == "Gran Tower") then
    if (getGlobalStorageValue(GRANTOWER.FINALWINNER) ~= getCreatureName(killer)) then
     if getPlayerGuildId(killer) >= 1 then
      for index, creature in ipairs(getGranTowerPlayers()) do
       if getPlayerGuildId(creature) ~= getPlayerGuildId(killer) then
        doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)), true)
		end
      end
     else
      for index, creature in ipairs(getGranTowerPlayers()) do
       if getPlayerStorageValue(creature, GRANTOWER.AURA) ~= -1 then
        doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)), true)
       end              
      end
     end
     if (getPlayerGuildId(killer) >= 1) then
      setGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID, getPlayerGuildId(killer))
      for index, creature in ipairs(getGranTowerGuild(getPlayerGuildId(killer))) do
       setPlayerStorageValue(creature, GRANTOWER.AURA, 1)
      end
     end
     setPlayerStorageValue(killer, GRANTOWER.AURA, 1)
     addEvent(changeOutfit, 0, killer)
     setGlobalStorageValue(GRANTOWER.SAVELASTWINNER, getCreatureName(killer))
     addEvent(doCreateMonster, 2 * 1000, "Gran Tower", GRANTOWER.TOWERPOSITION)
     setGlobalStorageValue(GRANTOWER.FINALWINNER, getCreatureName(killer))
     setGlobalStorageValue(GRANTOWER.DESTROYCOUNT, (getGlobalStorageValue(GRANTOWER.DESTROYCOUNT) + 1))
     doBroadcastMessage("[Gran Tower] The Gran Aura is with "..getCreatureName(killer)..", run to destroy the Grand Tower and take it.")
    end
 end
 return true
end

function onTarget(cid, target)
 if isPlayer(cid) and isMonster(target) and (getCreatureName(target) == "Gran Tower") then
    if (getGlobalStorageValue(GRANTOWER.FINALWINNER) == getCreatureName(cid)) then
     doPlayerSendCancel(cid, "Você não pode atacar o Gran Tower, proteja ele!")
     return false
    end
 end
 return true
end

function onStatsChange(cid, attacker, type, combat, value)
 if (type == STATSCHANGE_HEALTHLOSS) and isMonster(cid) and isPlayer(attacker) and (getCreatureName(cid) == "Gran Tower") then
     if (getGlobalStorageValue(GRANTOWER.FINALWINNER) == getCreatureName(attacker)) then
      return false
     end
  end
 return true
end


em data\lib crie um arquivo chamado 046-Gran Tower.lua e adicione o seguinte dentro dele:

Spoiler

GRANTOWER = {}
GRANTOWER.PREPARETIME = 2 -- Tempo até liberar a entrada para o evento.
GRANTOWER.CLOSETIME = 10 -- Tempo em minutos de duração do evento.
GRANTOWER.LEVEL = 80 -- Mínimo de level para participar do evento.
GRANTOWER.MAXGUILD = 7 -- Máximo de players por guild dentro do evento.     
GRANTOWER.DATES = {{"Monday", "19:00"}, {"Tuesday", "19:00"}, {"Saturday", "19:00"}, {"Sunday", "22:30"}} -- Dias e horários que ocorrem o evento.
GRANTOWER.ENTER = {x = 245, y = 641, z = 7} -- A posição da entrada do castelo, aonde os players são mandados pelo NPC.
GRANTOWER.TOWERPOSITION = {x = 264, y = 613, z = 6} -- Posição aonde fica o Gran Tower (o monstro).
GRANTOWER.AREA = {{x = 236, y = 587, z = 7}, {x = 283, y = 643, z = 5}} --[[A primeira posição é o canto superior esquerdo do mapa do castelo, e a segunda é o canto direito inferior
OBSERVAÇÃO IMPORTANTE: O script foi modificado por mim (xWhiteWolf) para aguentar diferentes andares, apenas coloque a posição dos cantos e o primeiro até o ultimo andar que ele irá remover todo mundo
em todos os andares quando alguém matar a gran tower, pra remover isso apenas coloque o z do mesmo andar da gran tower e apenas os membros que estão nesse andar serão teleportados,
contudo isso pode ocasionar que pessoas consigam ficar dentro do castelo mesmo após o evento ter sido encerrado!]]
GRANTOWER.AURAPERCENT = 0.8 --- porcentagem do dano que irá levar (0.8 = 80%) significa que ele ignora 20% de dano! (adicionado por xWhiteWolf)
GRANTOWER.SHURIAURA = true --- colocar true/false se quiser ativar/desativar a aura de shurikens pro player que tem a gran aura. (adicionado por xWhiteWolf)


--// Favor não mexer daqui para baixo se não souber oque está fazendo!!!
GRANTOWER.EMPTYWINNER = "# [Nobody] #"
GRANTOWER.PREPARE = 201405051746
GRANTOWER.RUNNING = 201405051747
GRANTOWER.AURA = 201405052018
GRANTOWER.DESTROYCOUNT = 201405051800
GRANTOWER.FINALWINNER = 201405051805
GRANTOWER.SAVELASTWINNER = 201405061333 
GRANTOWER.SAVEWINNERGUILDID = 201405061403

function doPrepareGranTower()
 if ((getGlobalStorageValue(GRANTOWER.PREPARE) ~= 1) and (getGlobalStorageValue(GRANTOWER.RUNNING) ~= 1)) then
  setGlobalStorageValue(GRANTOWER.PREPARE, 1)
  addEvent(doStartGranTower, GRANTOWER.PREPARETIME * 60 * 1000)
  addEvent(doBroadcastMessage, ((GRANTOWER.PREPARETIME / 2) * 60 * 1000), "[Gran Tower] Missing "..tostring((GRANTOWER.PREPARETIME / 2)).." minutes NPC Melkrapo will release the entrance to the event, get ready!")
  doBroadcastMessage("[Gran Tower] The event will be started in "..tostring(GRANTOWER.PREPARETIME).." minutes, please prepare your weapons and your team.")
 else
  print("[Erro] Gran Tower tentou ser iniciado ja ligado, favor verificar o codigo. (Roksas).")
 end
 return true
end

function doStartGranTower()
 if ((getGlobalStorageValue(GRANTOWER.PREPARE) ~= -1) and (getGlobalStorageValue(GRANTOWER.RUNNING) ~= 1)) then
  setGlobalStorageValue(GRANTOWER.RUNNING, 1)
  setGlobalStorageValue(GRANTOWER.PREPARE, -1)
  setGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID, -1)
  setGlobalStorageValue(GRANTOWER.FINALWINNER, GRANTOWER.EMPTYWINNER)
  setGlobalStorageValue(GRANTOWER.SAVELASTWINNER, GRANTOWER.EMPTYWINNER)
  setGlobalStorageValue(GRANTOWER.DESTROYCOUNT, 0)
  doCreateMonster("Gran Tower", GRANTOWER.TOWERPOSITION)
  addEvent(doBroadcastMessage, ((GRANTOWER.CLOSETIME - 1) * 60 * 1000), "[Gran Tower] The event will be closed in one minute. Hurry up!")
  addEvent(doCloseGranTower, GRANTOWER.CLOSETIME * 60 * 1000)
  doBroadcastMessage("[Gran Tower] Open event! Run to destroy the Gran Tower.")
 else
  print("[Erro] Gran Tower tentou ser iniciado já ligado, favor verificar o código.")
 end
 return true
end

function doCloseGranTower()
 if ((getGlobalStorageValue(GRANTOWER.PREPARE) ~= 1) and (getGlobalStorageValue(GRANTOWER.RUNNING) ~= -1)) then
  for index, creature in ipairs(getGranTowerPlayers()) do
   doTeleportThing(creature, getTownTemplePosition(getPlayerTown(creature)))
  end
  for index, creature in ipairs(getPlayersOnline()) do
   if (getPlayerGuildId(creature) >= 1) then
    if getPlayerGuildId(creature) ~= getGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID) then
     setPlayerStorageValue(creature, GRANTOWER.AURA, -1)
    end
   end 
  end
  setGlobalStorageValue(GRANTOWER.RUNNING, -1)
  if (getCreatureByName("Gran Tower")) then
   doRemoveCreature(getCreatureByName("Gran Tower"), true)
  end
  local TMP_WINNER = getGlobalStorageValue(GRANTOWER.FINALWINNER)
  doBroadcastMessage("[Gran Tower] The event was completed with "..tostring(getGlobalStorageValue(GRANTOWER.DESTROYCOUNT)).." wrecks to Gran Tower, the final winner was "..(TMP_WINNER)..".")
  setGlobalStorageValue(GRANTOWER.DESTROYCOUNT, -1)
  setGlobalStorageValue(GRANTOWER.SAVELASTWINNER, TMP_WINNER)
  setGlobalStorageValue(GRANTOWER.FINALWINNER, -1)
  local TMP_WINNER = nil
 end
 return true
end

function getGranTowerPlayers() -- xWhiteWolf
local players = {}	
local andares = math.abs(GRANTOWER.AREA[1].z - GRANTOWER.AREA[2].z)
	for index, creature in ipairs(getPlayersOnline()) do		
		local z = 0
		local pos1 = {x = GRANTOWER.AREA[1].x, y = GRANTOWER.AREA[1].y, z = GRANTOWER.AREA[1].z}
		local pos2 = {x = GRANTOWER.AREA[2].x, y = GRANTOWER.AREA[2].y, z = GRANTOWER.AREA[2].z}
		
		for i = 0, andares do
			z = z or 0
			pos1.z = pos1.z > pos2.z and pos2.z + z or pos1.z + z
			pos2.z = pos1.z
			z = 1
	
			if isInArea(getThingPos(creature), pos1, pos2) then
					table.insert(players, creature)
			end
		end
	end
return players
end

function getGranTowerGuild(guild_id) -- xWhiteWolf
local players = {}	
local andares = math.abs(GRANTOWER.AREA[1].z - GRANTOWER.AREA[2].z)
	for index, creature in ipairs(getPlayersOnline()) do		
		local z = 0
		local pos1 = {x = GRANTOWER.AREA[1].x, y = GRANTOWER.AREA[1].y, z = GRANTOWER.AREA[1].z}
		local pos2 = {x = GRANTOWER.AREA[2].x, y = GRANTOWER.AREA[2].y, z = GRANTOWER.AREA[2].z}
		
		for i = 0, andares do
			z = z or 0
			pos1.z = pos1.z > pos2.z and pos2.z + z or pos1.z + z
			pos2.z = pos1.z
			z = 1
	
			if isInArea(getThingPos(creature), pos1, pos2) then
				if (getPlayerGuildId(creature) == guild_id) then
					table.insert(players, creature)
				end
			end
		end
	end
return players
end

-- // Gran Aura \/
 
function newColor(n)  
 local n = tonumber(n) or 0
 local n = n + 19
 return tonumber(n) or 0
end

function newColor(n) 
 local n = tonumber(n) or 132
 local n = n - 19
 return tonumber(n) or 132
end
 
-- comentario: se a cor for preta o addon vai para branco sendo que o certo é diminuir 19..
 
local events = {}
function changeOutfit(uid) -- arrumado por xWhiteWolf e adicionado a opção da Shuri
 local sec = 0.5
 local temp = getCreatureOutfit(uid) 

 if (type(temp) == "number") then 
  return true 
 end
   
if getGlobalStorageValue(GRANTOWER.SAVELASTWINNER) ~= getCreatureName(uid) then
	if getGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID) ~= getPlayerGuildId(uid) then
			return true
	end
end
 
if GRANTOWER.SHURIAURA then
 local pos = getCreaturePosition(uid)
	local effectPos = {
	[1] = {x = pos.x - 2, y = pos.y - 2, z = pos.z},
	[2] = {x = pos.x + 2, y = pos.y + 2, z = pos.z}
	}

	for i = 1, #effectPos do
	position = effectPos[i + 1] or effectPos[i - 1]
	doSendDistanceShoot(effectPos[i], position, 18)
	end
end
 
 local outfit = {
  lookType = temp.lookType,
  lookHead = newColor(temp.lookHead),
  lookBody = newColor(temp.lookBody),
  lookLegs = newColor(temp.lookLegs),
  lookFeet = newColor(temp.lookFeet),
  lookAddons = getCreatureOutfit(uid).lookAddons,
 }
 doSetCreatureOutfit(uid, outfit, sec)
 local event = addEvent(function()
	 if isCreature(uid) then
	 changeOutfit(uid)
	 end
 end, 3.0 * sec * 450)
 events[uid] = event 
 return true
end

Agora voltando aos creaturescripts crie um arquivo em scripts chamado Gran Aura.lua e adicione:

Spoiler

local events = {}
function onLogin(cid) 
 if (getPlayerStorageValue(cid, GRANTOWER.AURA) ~= -1) then
  if getGlobalStorageValue(GRANTOWER.SAVELASTWINNER) ~= getCreatureName(cid) then
   if (getPlayerGuildId(cid) ~= getGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID)) then
    setPlayerStorageValue(cid, GRANTOWER.AURA, -1)
   end
  end
  local event = addEvent(function()
	 if isCreature(cid) then
	 changeOutfit(cid)
	 end
 end, 0)
  events[cid] = event
 end 
 return true
end
 
function onLogout(cid) 
 if (getGlobalStorageValue(GRANTOWER.FINALWINNER) == getCreatureName(cid)) then
  doPlayerSendCancel(cid, "You cannot logout while Gran Tower is running.")
  return false
 end
 if events[cid] then
  stopEvent(events[cid])
 end
 return true
end

function onStatsChange(cid, attacker, type, combat, value)
	if isPlayer(cid) and isCreature(attacker) and (not (attacker == cid)) and (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_MANALOSS) then
		if getGlobalStorageValue(GRANTOWER.SAVELASTWINNER) ~= getCreatureName(cid) and getGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID) ~= getPlayerGuildId(cid) then
				return true
		end
		
		value = value - (math.ceil(value*(GRANTOWER.AURAPERCENT)))
		doTargetCombatHealth(cid, attacker, type, -value, -value, 255)
		doCreatureAddHealth(cid, value)
		return true
	end
return true
end



E um arquivo chamado Barrier.lua na mesma pasta com o seguinte conteúdo:

Spoiler

function onStatsChange(cid, attacker, type, combat, value)
	if (type == STATSCHANGE_HEALTHLOSS or type == STATSCHANGE_HEALTHGAIN) and isMonster(cid) then
		if (getCreatureName(cid) == "Barrier") then
			a = getCreatureHealth(cid) >= (getCreatureMaxHealth(cid)/2) and doSetItemOutfit(cid, 3766, -1) or doSetItemOutfit(cid, 3767, -1)
		end
	end
 return true
end

Agora em globalevents\globalevents.xml adicione a seguinte linha:

<globalevent name="Gran Tower" interval="60" event="script" value="Gran Tower.lua"/>

E adicione o script associado em globalevents\scripts com o nome de Gran Tower.lua:

Spoiler

function onThink(interval, lastExecution, thinkInterval)
 for index, dates in ipairs(GRANTOWER.DATES) do
  if table.find(dates, os.date("%A")) then
   if table.find(dates, os.date("%H:%M")) then
    doPrepareGranTower()
   end
  end
 end
 return true
end

Agora na pasta monster procure o seu monsters.xml e adicione essas duas linhas:

<monster name="Gran Tower" file="8.4/Gran Tower.xml"/>
<monster name="Barrier" file="8.4/barrier.xml"/>

Feito isso crie os monstros na pasta data\monster\8.4:
O primeiro se chama barrier.xml e deverá conter:

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Barrier" nameDescription="a Barrier" race="undead" experience="1" speed="0" manacost="0">
  <health now="100000" max="100000"/>
  <look typeex="3766" head="20" body="30" legs="40" feet="50" corpse="0"/>
  <targetchange interval="5000" chance="20"/>
  <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="0"/>
    <flag canpushcreatures="0"/>
    <flag targetdistance="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="0"/>
  </flags>
	 <defenses armor="2" defense="2"/>
	<script>
		<event name="Barrier Stats"/>
	</script> 
</monster>



O segundo se chamará Gran Tower.xml e deverá conter:

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<monster name="Gran Tower" nameDescription="Gran Tower" race="undead" experience="50000" speed="0" manacost="0">
  <health now="1500000" max="1500000"/>
  <look typeex="7823" head="20" body="30" legs="40" feet="50" corpse="0"/>
  <targetchange interval="5000" chance="10"/>
  <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="1"/>
    <flag staticattack="90"/>
    <flag runonhealth="0"/>
  </flags>
  <attacks>
	<attack name="tower" interval="500" range="7" chance="99"/>
  </attacks>
  <defenses armor="165" defense="150">
  <defense name="healing" interval="1000" chance="10" min="2000" max="3000">
			<attribute key="areaEffect" value="blueshimmer"/>
		</defense>
  </defenses>
	<elements>
		<element phyisicalPercent="20"/>
		<element holyPercent="-20"/>
	</elements>
  <immunities>
    <immunity lifedrain="1"/>
    <immunity invisible="1"/>
    <immunity paralyze="1"/>
  </immunities>
  	<script>
<event name="Gran Tower"/>
<event name="Gran Tower Stats"/>
</script> 
</monster>

Agora vamos para NPC, vá em data\npc e crie um arquivo chamado Melkrapo.xml com o seguinte conteúdo:

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Melkrapo" script="data/npc/scripts/Melkrapo.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100"/>
<look type="297"/>
<parameters>
    <parameter key="message_greet" value="Sou Melkrapo, o atual guardiao dos portais do Gran Castle! Quer tentar {entrar} no castelo ou preferes {saber mais} sobre ele antes?"/>
    <parameter key="message_farewell" value="Até mais, nobre |PLAYERNAME|."/>
	<parameter key="message_walkaway" value="Até mais, nobre." />
</parameters>
</npc>



Agora em npc\scripts crie um arquivo chamado Melkrapo.lua e adicione o seguinte:

Spoiler

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

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(msgcontains(msg, 'entrar') or msgcontains(msg, 'evento')) then	 
	 if (getGlobalStorageValue(GRANTOWER.RUNNING) ~= -1) then
	  if (getPlayerLevel(cid) >= GRANTOWER.LEVEL) then 
	   if (getPlayerGuildId(cid) >= 1) then
	    if (#getGranTowerGuild(getPlayerGuildId(cid)) >= GRANTOWER.MAXGUILD) then
	     selfSay("Já estão participando, "..(GRANTOWER.MAXGUILD).." membros de sua guild. Esse é o limite, tente mais tarde.", cid)
	     return true
     end
    end
    doTeleportThing(cid, GRANTOWER.ENTER, true)
    selfSay("Boa sorte, faça um bom trabalho guerreiro!", cid)
   else
    selfSay("Você não tem o level necessário para participar do evento. Volte quando estiver no level "..tostring(GRANTOWER.LEVEL).."+.", cid)
 	 end
	 else
	  local dates = {
    ["Monday"] = "Segunda-Feira", 
    ["Tuesday"] = "Terça-Feira",
    ["Wednesday"] = "Quarta-Feira",
    ["Thursday"] = "Quinta-Feira",
    ["Friday"] = "Sexta-Feira",
    ["Saturday"] = "Sábado",
    ["Sunday"] = "Domingo",
   }
   msg = ""
   selfSay("O portal está fechado. Eu o abro nestes respectivos horários:\n", cid)
   for index, date in ipairs(GRANTOWER.DATES) do
	 	 msg = msg .. " - "..dates[date[1]].." às "..date[2].."."
   end
   selfSay(msg, cid)
  end
 elseif(msgcontains(msg, 'no') and isInArray({1, 2, 3}, talkState[talkUser])) then
		talkState[talkUser] = 0
		selfSay('Ok, até logo.', cid)
	end
	
	if(msgcontains(msg, 'saber mais') or msgcontains(msg, 'info')) then
 	selfSay("Sobre o que queres saber? {Gran Castle}, {Gran Tower}, {Gran Aura} ou algumas {dicas} úteis?", cid)
  talkState[talkUser] = 1
 elseif(msgcontains(msg, 'Gran Castle') and isInArray({1, 2}, talkState[talkUser])) then
  selfSay("O castelo tem vida própria e se protege sozinho. Porém, se um ser humano se mostrar forte e conseguir destruir a Gran Tower que fica no último andar do castelo, ganha {Gran Aura}!", cid)
 elseif(msgcontains(msg, 'Gran Tower') and isInArray({1, 2}, talkState[talkUser])) then
  selfSay("Se você chegar no centro do 6º (sexto) / último andar do castelo, haverá uma espécie de estátua com imenso poder visível a olho nú. Se você a destruir, ganhará a {Gran Aura}! Então seu objetivo passa a ser o de proteger a Gran Tower, pois se alguém destruí-la novamente antes do tempo do Melkrapo fechar o portal, você perde a aura adquirida. Quer {saber mais}?", cid)
 elseif(msgcontains(msg, 'Gran Aura') and isInArray({1, 2}, talkState[talkUser])) then
  selfSay("Com a Gran Aura, o guerreiro fica brilhando e reflete 20% de todo dano recebido, além de ficar imune as B.Skill King Teleport e Changer Corpse. Quer {saber mais}?", cid)
 elseif(msgcontains(msg, 'dicas') and isInArray({1, 2}, talkState[talkUser])) then    
  talkState[talkUser] = 2
  selfSay("Leia as placas que ver, elas lhe darão informações importantes da ilha do Gran Castle. Quer {saber mais} ou quer outra {dica}?", cid)
 elseif(msgcontains(msg, 'dica') and talkState[talkUser] == 2) then
  selfSay("Você pode healar (encher a vida) da {Gran Tower} ou das Walls (paredes de proteção no último andar), para dificultar que outros guerreiros dominem o {Gran Castle}.", cid)         
 elseif(msgcontains(msg, 'no') and isInArray({1, 2, 3}, talkState[talkUser])) then
		talkState[talkUser] = 0
		selfSay('Ok até logo.', cid)
	end
 return true
end


npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())


 

Agora partindo pra spells vá em data\spells e adicione no spells.xml essas linhas:

Spoiler

<!-- MONSTER SPELLS -->
<instant name="tower" words="tower" lvl="0" mana="0" prem="0" aggressive="1" exhaustion="1500" needlearn="1" event="script" value="monsters/tower.lua">
</instant> 



E agora crie o respectivo arquivos em data\spells\scripts\monsters chamado tower.lua (se seu server não possuir uma pasta chamada monsters na pasta script, apenas crie e coloque o arquivo dentro dela)

tower.lua:

Spoiler

 


local function atk(cid)
     doSendDistanceShoot(pos5, pos6, 3)
     doSendDistanceShoot(pos7, pos8, 3)
end

local function atkself(cid)
     doSendDistanceShoot(pos9, selfpos, 3)
     doSendDistanceShoot(pos10, selfpos, 3)
     doSendDistanceShoot(pos11, selfpos, 3)
     doSendDistanceShoot(pos12, selfpos, 3)
     doSendDistanceShoot(pos13, selfpos, 3)
     doSendDistanceShoot(pos14, selfpos, 3)
     doSendDistanceShoot(pos15, selfpos, 3)
     doSendDistanceShoot(pos16, selfpos, 3)
end

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
setCombatFormula(combat, COMBAT_FORMULA_DAMAGE, -500, -7000, -300, -9000, 200, 200, 100, 400) --- formula de dano que tira o ataque da gran tower

local area = createCombatArea(AREA_TOWER)
setCombatArea(combat, area)

function onCastSpell(cid, var)

selfpos = getCreaturePosition(cid)
pos1 = {x=getCreaturePosition(cid).x + 2, y=getCreaturePosition(cid).y + 2, z=getCreaturePosition(cid).z}	
pos2 = {x=getCreaturePosition(cid).x -  2, y=getCreaturePosition(cid).y + 2, z=getCreaturePosition(cid).z}
pos3 = {x=getCreaturePosition(cid).x - 2, y=getCreaturePosition(cid).y - 2, z=getCreaturePosition(cid).z}
pos4 = {x=getCreaturePosition(cid).x + 2, y=getCreaturePosition(cid).y - 2, z=getCreaturePosition(cid).z}
pos5 = {x=getCreaturePosition(cid).x - 2, y=getCreaturePosition(cid).y + 2, z=getCreaturePosition(cid).z}	
pos6 = {x=getCreaturePosition(cid).x - 2, y=getCreaturePosition(cid).y - 2, z=getCreaturePosition(cid).z}
pos7 = {x=getCreaturePosition(cid).x + 2, y=getCreaturePosition(cid).y - 2, z=getCreaturePosition(cid).z}
pos8 = {x=getCreaturePosition(cid).x + 2, y=getCreaturePosition(cid).y + 2, z=getCreaturePosition(cid).z}
pos9 = {x=getCreaturePosition(cid).x - 1, y=getCreaturePosition(cid).y + 1, z=getCreaturePosition(cid).z}
pos10 = {x=getCreaturePosition(cid).x, y=getCreaturePosition(cid).y + 1, z=getCreaturePosition(cid).z}
pos11 = {x=getCreaturePosition(cid).x + 1, y=getCreaturePosition(cid).y + 1, z=getCreaturePosition(cid).z}
pos12 = {x=getCreaturePosition(cid).x - 1, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z}
pos13 = {x=getCreaturePosition(cid).x+ 1, y=getCreaturePosition(cid).y, z=getCreaturePosition(cid).z}
pos14 = {x=getCreaturePosition(cid).x - 1, y=getCreaturePosition(cid).y - 1, z=getCreaturePosition(cid).z}
pos15 = {x=getCreaturePosition(cid).x, y=getCreaturePosition(cid).y - 1, z=getCreaturePosition(cid).z}
pos16 = {x=getCreaturePosition(cid).x + 1, y=getCreaturePosition(cid).y - 1, z=getCreaturePosition(cid).z}

doSendDistanceShoot(pos1, pos2, 3)
doSendDistanceShoot(pos3, pos4, 3)
addEvent(atkself, 350)
addEvent(atk, 350)

	return doCombat(cid, combat, var)
end



Feito isso vá em spells\lib e no seu arquivo spells.lua adicione a seguinte area:

Spoiler

 


AREA_TOWER = {
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 3, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1}
}


Agora nós vamos criar a talkaction que vai te permitir ligar o evento a hora que vc quiser.
Vá em data\talkactions\talkactions.xml e adicione a seguinte linha:


<talkaction hide="yes" words="/grantower" access="5" event="script" value="cleargrantower.lua"/>

e em talkactions\scripts adicione o arquivo cleargrantower.lua com o seguinte conteúdo dentro:

Spoiler

 


function onSay(cid, words, param, channel) 
	if(param == '') then
		doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Command param required.")
		return true
	end		
	local t = string.explode(param, " ")
	
	if (tonumber(t[1]) == 1) then
		doPrepareGranTower()
		doSendMagicEffect(getCreaturePosition(cid), 14)
	elseif (tonumber(t[1]) == 0) then
		doCloseGranTower()
		doSendMagicEffect(getCreaturePosition(cid), 14)
	elseif (tonumber(t[1]) == 2) then
		print(getGlobalStorageValue(GRANTOWER.SAVELASTWINNER))
		doSendMagicEffect(getCreaturePosition(cid), 14)
	elseif (tonumber(t[1]) == 3) then
		print(getGlobalStorageValue(GRANTOWER.SAVEWINNERGUILDID))
		doSendMagicEffect(getCreaturePosition(cid), 14)
	end	
return true
end



Agora vá em data\creaturescripts\scripts\login.lua e adicione essas linhas antes do ultimo return true:


		-----------GRAN CASTLE -----------
		registerCreatureEvent(cid, "Gran Tower")
		registerCreatureEvent(cid, "Gran Aura")
		registerCreatureEvent(cid, "Gran Aura Stats")
		registerCreatureEvent(cid, "Gran Aura Logout")
		registerCreatureEvent(cid, "Gran Tower Target")

Por último eu acho que eu usei uma das funções da minha lib nesse script, então se der qualquer erro eu recomendo que vcs instalem ela antes de me mandar o print do erro do servidor haha. (Pra instalar é só criar um arquivo em data.lib e coloca aquilo dentro, veja o tópico no meu perfil)


Eu testei o script e tá funcionando perfeitamente, a única coisa que não consegui testar foi as guilds e como fica a aura qnd alguém da guild ganha mas acho que vcs podem fazer esse trabalhinho de testar pra mim...

Pra finalizar gostaria de dizer que um membro do fórum pagou por esse script e ele não estava funcionando, não comprem scripts, venham ao fórum e peçam por eles. Que fique de lição.

Todas as configurações são feitas pelo arquivo 046- Gran Aura que está na LIB (exceto as coisas relacionadas aos monstros/spells que eles tiram) mas está tudo bem explicadinho nos scripts e acho que vocês já sabem editar um monstro, não é mesmo? haha

Espero que façam bom proveito, pretendo lançar uma versão 1.0 em breve juntamente com a versão 1.0 do Magnus Challenger. Fiquem ligados!
e claro, se você gostou não faz mal clicar em "Gostei". Abraços do lobo.  :cool: 


NOTA FINAL: Sei que a maioria dos caras que queriam esse script queriam pra servers 8.4 porém a forma de fazer a barreira ter essa modificação na outfit qnd estiver quebrando é só por statschange. É só modificar a source e adicionar a function onStatsChange do creaturescripts que vai pegar no seu server 8.4. Já vi server 7.6 com statschange então não creio que seja algo dificil. 

 

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

  • Respostas 175
  • Visualizações 19.9k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • só um adendo: Eu coloquei aquele mesmo efeito das shurikens que tem no vídeo (pelo que eu soube o fox fez essa atualização recentemente mas eu nunca entrei no server deles pra ver como é e resolvi faz

  • curtiu o evento? Se achar mais algum erro pode me falar que eu arrumo, to dando suporte pra esses meus scripts tb

  • troca a linha do broadcast por isso aqui:   if getPlayerGuildId(killer) >= 1 and getPlayerGuildName(killer) then         doBroadcastMessage("[Gran Tower] "..getCreatureName(killer).." just de

Posted Images

Postado

O pedido do evento gran castle foi eu quem fiz pro roksas, ai ele fez completamente BUGADO e eu paguei R$ 30,00 por ele, depois fui pedir suporte...

 

..Nunca mais!

 

 

@topic

Parabéns pelo script, obrigado por compartilhar. 

"Derrotar o inimigo em cem batalhas não é a excelência suprema; a excelência suprema consiste em vencer o inimigo sem ser preciso lutar."

 

mcYVuRL.png

 


 

logo_SS.png

Postado
  • Autor

só um adendo: Eu coloquei aquele mesmo efeito das shurikens que tem no vídeo (pelo que eu soube o fox fez essa atualização recentemente mas eu nunca entrei no server deles pra ver como é e resolvi fazer dessa maneira).

Se alguém quiser liberar um mapa pro castle ou fazer um é só me enviar pm que eu edito o tópico e anexo o link do download

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo