Boa noite,
Bom, quem me conhece sabe que eu era Spriter/Client Maker, e fiz ate 2 apostilas sobre o assunto.
Derrepente me deu vontade de aprender script, e fiquei lendo tutoriais em varios Foruns. E hoje estou aqui pra mostrar meu primeiro trabalho medio divulgado!
Nome do Script: Castle War 2.0 ultimate
Versão testada: Tfs 0.3.6 ( deve funcionar em versões anteriores )
Descriçao: Um sistema de Guerra de castelos para guilds, deferente :]!
Como funciona: O Player vai no castelo, e puxa uma lavanca, e automaticamente, todos da guild dele, tem acesso ao castelo ( porta ). Alem de contar pontos pra ganhar premios por vezes que ele conseguiu conquistar Castelos!
Bom, eu sei que já existe muitos scripts deste tipo, porem eu melhorei ele, com algumas novidades. Como o monstro guarda, que é invocado, caso um player que não é da guild , tentar abrir a porta, ou andar sobre algum local pre definido ( Se alguem pedir, eu faço este script simples ). Ou simplesmente voce pode colocaar ele como respawn em algum lugar no castelo.
ps: esse guarda é configurado para não atacar os ‘donos’ do castelo! :fail:
Features:
- Guerra entre 2 Castelos ( por alavanca )
- Monstro ‘Guarda’, que só ataca membro de guilds rivais!
- Premios por pontuaçao. ( por player, somente.)
- Sala especial, dentro do castelo, para membros da guild*. ( depende da sua criatividade) bloquiada por um Porta.
- Broadcast.
* É a porta que eu tinha falado.
Instalação
Actions
Va na pasta Data/action/action.xml e adicione isto:
<action actionid="9999" event="script" value="castlewar1.lua"/><action actionid="9998" event="script" value="castledoor1.lua"/>
<action actionid="8888" event="script" value="castlewar2.lua"/>
<action actionid="8887" event="script" value="castledoor2.lua"/>
Agora vá em Data/actions/scripts , crie esses 4 arquivos abaixo:
castlewar1.lua
----------------------------------- ---------SCRIPT por PC98------------ NAO REMOVA OS CREDITOS ----------------------------------- function onUse(cid, item, frompos, item2, topos) ------------------ Inicio das Config ------------ local castle_one_name = "Ratim Bum" -- Nome do castelo 1 local storages = {154154,54321,123123} -- Storages ( se vc eh iniciante, deixe como está...) -------PREMIOs I N D I V I D U A L --------- local premio_por_vezes = 1 -- Premio por vezes de conquista de castelo. (1) = Ativo (0) = Desativa. local premio_vezes = 13 -- Caso ativo, a quantidade de conquista que o player tem, para ganhar PREMIO. local premio = 2472 -- ID do Premio local premio_cont = 1 -- Quantidade do Premio local premio_reset = 1 -- Resetar o contador do premio depois que atingir a meta?? (1) = SIM (0) = NAO -------FIM PREMIOs I N D I V I D U A L --------- ----------------- FIM DAS CONFIG ----------------- local sto_ativ = getGlobalStorageValue(storages[2]) position = getCreaturePosition(cid) if isPlayerGuild(cid) == TRUE then if sto_ativ == 1 or sto_ativ == -1 then guildname = getPlayerGuildName(cid) guild = getPlayerGuildId(cid) guild_sto = getGlobalStorageValue(storages[3]) if guild ~= guild_sto then setPlayerStorageValue(cid,guild_sto,guild) if getPlayerStorageValue(cid,storages[1]) == -1 then setPlayerStorageValue(cid,storages[1],0) end sto_vezes = getPlayerStorageValue(cid,storages[1]) setGlobalStorageValue(storages[3],getPlayerGuildId(cid)) setPlayerStorageValue(cid,storages[1], sto_vezes + 1) sto_vezes_total = getPlayerStorageValue(cid,storages[1]) doBroadcastMessage("O(a) "..getCreatureName(cid).." acabou de conquistar o castelo "..castle_one_name.." para a guild \""..guildname.."\" pela "..sto_vezes_total.."ª vez(s).", 22) doSendMagicEffect(position, 39) if premio_por_vezes == 1 then if getPlayerStorageValue(cid,storages[1]) == premio_vezes then if getItemWeightById(premio,1) <= getPlayerFreeCap(cid) then doBroadcastMessage("O "..getCreatureName(cid).." ganhou uma(o) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!", 21) doPlayerAddItem(cid, premio,premio_cont) doPlayerSendTextMessage(cid, 18, "Voce recebeu o(a) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!") ----------------------------------------------- -- if premio_reset == 1 then -- setPlayerStorageValue(cid,storages[1],0) -- Resetar a contagem end -- ----------------------------------------------- -- else doPlayerSendTextMessage(cid, 18, "Voce nao tem capacidade para ganhar o item. Vamos verificar novamente em 10 segundos!") addEvent(additem,10000,cid,premio,premio_cont,premio_reset) end end end else doPlayerSendCancel(cid,"Este castelo ja foi conquistado pela sua guild!") doSendMagicEffect(position, 2) end else doPlayerSendCancel(cid,"O sistema está desativado") end else doPlayerSendCancel(cid,"É nescessario ter guild para dominar o castelo!") doSendMagicEffect(position, 2) end end ------------------------- por pc98 function additem(cid,premio,premio_cont,premio_reset) if getItemWeightById(premio,1) <= getPlayerFreeCap(cid) then doPlayerAddItem(cid, premio,premio_cont) doPlayerSendTextMessage(cid, 18, "Voce recebeu o(a) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!") if premio_reset == 1 then setPlayerStorageValue(cid,storages[1],0) end stopEvent(additem) else doPlayerSendTextMessage(cid, 18, "Voce nao tem capacidade para ganhar o item. Verificando novamente em 10 segundos!") addEvent(additem,10000,cid) end end ------------------------- por pc98 function isPlayerGuild(cid) if getPlayerGuildName(cid) ~= "" then return TRUE else return FALSE end end
castlewar2.lua
----------------------------------- ---------SCRIPT por PC98------------ NAO REMOVA OS CREDITOS ----------------------------------- function onUse(cid, item, frompos, item2, topos) ------------------ Inicio das Config ------------ local castle_two_name = "do Dracula" -- Nome do castelo 2 local storages = {154154,54321,321321} -- Storages ( se vc eh iniciante, deixe como está...) -------PREMIOs I N D I V I D U A L --------- local premio_por_vezes = 1 -- Premio por vezes de conquista de castelo. (1) = Ativo (0) = Desativa. local premio_vezes = 13 -- Caso ativo, a quantidade de conquista que o player tem, para ganhar PREMIO. local premio = 2472 -- ID do Premio local premio_cont = 1 -- Quantidade do Premio local premio_reset = 0 -- Resetar o contador do premio depois que atingir a meta?? (1) = SIM (0) = NAO -------FIM PREMIOs I N D I V I D U A L --------- ----------------- FIM DAS CONFIG ----------------- local sto_ativ = getGlobalStorageValue(storages[2]) position = getCreaturePosition(cid) if isPlayerGuild(cid) == TRUE then if sto_ativ == 1 or sto_ativ == -1 then guildname = getPlayerGuildName(cid) guild = getPlayerGuildId(cid) guild_sto = getGlobalStorageValue(storages[3]) if guild ~= guild_sto then setPlayerStorageValue(cid,guild_sto,guild) ----------------------------------------------------- if getPlayerStorageValue(cid,storages[1]) == -1 then setPlayerStorageValue(cid,storages[1],0) end ----------------------------------------------------- sto_vezes = getPlayerStorageValue(cid,storages[1]) setGlobalStorageValue(storages[3],getPlayerGuildId(cid)) setPlayerStorageValue(cid,storages[1], sto_vezes + 1) sto_vezes_total = getPlayerStorageValue(cid,storages[1]) doBroadcastMessage("O(a) "..getCreatureName(cid).." acabou de conquistar o castelo "..castle_two_name.." para a guild \""..guildname.."\" pela "..sto_vezes_total.."ª vez(s).", 22) doSendMagicEffect(position, 39) if premio_por_vezes == 1 then if getPlayerStorageValue(cid,storages[1]) == premio_vezes then if getItemWeightById(premio,1) <= getPlayerFreeCap(cid) then doBroadcastMessage("O "..getCreatureName(cid).." ganhou uma(o) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!", 21) doPlayerAddItem(cid, premio,premio_cont) doPlayerSendTextMessage(cid, 18, "Voce recebeu o(a) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!") ----------------------------------------------- -- if premio_reset == 1 then -- setPlayerStorageValue(cid,storages[1],0) -- Resetar a contagem end -- ----------------------------------------------- -- else doPlayerSendTextMessage(cid, 18, "Voce nao tem capacidade para ganhar o item. Vamos verificar novamente em 10 segundos!") addEvent(additem,10000,cid,premio,premio_cont,premio_reset) end end end else doPlayerSendCancel(cid,"Este castelo ja foi conquistado pela sua guild!") doSendMagicEffect(position, 2) end else doPlayerSendCancel(cid,"O sistema está desativado") end else doPlayerSendCancel(cid,"É nescessario ter guild para dominar o castelo!") doSendMagicEffect(position, 2) end end ------------------------- Por PC98. function additem(cid,premio,premio_cont,premio_reset) if getItemWeightById(premio,1) <= getPlayerFreeCap(cid) then doPlayerAddItem(cid, premio,premio_cont) doPlayerSendTextMessage(cid, 18, "Voce recebeu o(a) "..getItemNameById(premio).." como recompensa das suas "..premio_vezes.." conquistas!") if premio_reset == 1 then setPlayerStorageValue(cid,storages[1],0) end stopEvent(additem) else doPlayerSendTextMessage(cid, 18, "Voce nao tem capacidade para ganhar o item. Verificando novamente em 10 segundos!") addEvent(additem,10000,cid) end end ------------------------- por pc98 function isPlayerGuild(cid) if getPlayerGuildName(cid) ~= "" then return TRUE else return FALSE end end
castledoor1.lua
--------------- -----BY PC98------- --------------- function onUse(cid, item, frompos, item2, topos) -------------------------Config----------------------------------------------------------------- door_opened = 1228 -- ID da porta aberta storage_guild = getGlobalStorageValue(123123) -- A 3ª storage configurada em Castle.lua guarda_ativ = 1 -- Caso um invasor tente abrir a porta, sumonar o Monstro "Guarda"?? | (1) = SIM (0) = NAO guarda_cont = 2 -- Caso ativo: a quantidade de guardas a sumonar guarda_pos = {x=123,y=123,y=7} -- Posiçao a ser sumonada os guardas! -------------------------Fim de Config----------------------------------------------------------- if getPlayerGuildId(cid) == storage_guild then doTeleportThing(cid,getThingPos(item.uid)) doTransformItem(item.uid, door_opened) doPlayerSendTextMessage(cid, 22, "Seja bem vindo a vosso castelo!") return TRUE else if guarda_ativ == 1 then doPlayerSendTextMessage(cid, 22, "Guaaaardas, tirem esses invasores daqui!!") for i=1, guarda_cont do doSummonCreature("Guarda", guarda_pos) end return FALSE else doPlayerSendTextMessage(cid, 22, "Este castelo nao pertence a sua guild") return FALSE end end end
castledoor2.lua
--------------- -----BY PC98------- --------------- function onUse(cid, item, frompos, item2, topos) -------------------------Config----------------------------------------------------------------- door_opened = 1228 -- ID da porta aberta storage_guild = getGlobalStorageValue(321321) -- A 3ª storage configurada ( ja esta configurada o PADRAO ) guarda_ativ = 1 -- Caso um invasor tente abrir a porta, sumonar o Monstro "Guarda"?? | (1) = SIM (0) = NAO guarda_cont = 4 -- Caso ativo: a quantidade de guardas a sumonar guarda_pos = {x=321,y=321,y=7} -- Posiçao a ser sumonada os guardas! -------------------------Fim de Config----------------------------------------------------------- if getPlayerGuildId(cid) == storage_guild then doTeleportThing(cid,getThingPos(item.uid)) doTransformItem(item.uid, door_opened) doPlayerSendTextMessage(cid, 22, "Seja bem vindo a vosso castelo!") return TRUE else if guarda_ativ == 1 then doPlayerSendTextMessage(cid, 22, "Guaaaardas, tirem esses invasores daqui!!") for i=1, guarda_cont do doSummonCreature("Guarda", guarda_pos) end return FALSE else doPlayerSendTextMessage(cid, 22, "Este castelo nao pertence a sua guild") return FALSE end end end
Talkactions
Va na pasta Data/talkaction/talkactions.xml , clique com o botao direito e depois editar.
Adicione esta linha:
<talkaction words="/war" event="script" value="castlesystem.lua"/>
Agora va na pasta scripts , e crie um arquivo lua chamado castlesystem.lua.
castlesystem.lua
function onSay(cid, words, param) access = 4 -- Coloque aqui o access requirido para Ativar/Desativar o sistema if param == "start" then if getPlayerAccess(cid) == access then setGlobalStorageValue(54321,1) doPlayerSendTextMessage(cid, 20, "Voce ativou o Castle Wars com suscesso!") return TRUE end elseif param == "stop" then if getPlayerAccess(cid) == access then setGlobalStorageValue(54321,2) doPlayerSendTextMessage(cid, 20, "Voce desativou o Castle Wars com suscesso!") return TRUE end end end
Monster
O mostro Guarda... aquele que eu disse que pode ficar dentro do castelo :]
Instalaçao:
va na pasta data/monsters e edite o arquivo Monster.xml , adicionando esta linha:
<monster name="Guarda" file="guarda.xml"/>
e depois crie um arquivo na mesma pasta chamado guarda.xml
guarda.xml
<?xml version="1.0"?> <monster name="Guarda" nameDescription="the guard" experience="6000" speed="268" race="Blood"> <health now="20000" max="20000"/> <look type="73" corpse="6080"/> <strategy attack="200" defense="300"/> <targetchange speed="420" chance="1"/> <flags> <flag canpushitems="1"/> <flag canpushcreatures="1"/> <flag attackable="1"/> <flag pushable="0"/> <flag staticattack="90"/> <flag targetdistance="1"/> </flags> <attacks> <attack name="melee" interval="2000" chance="100" min="-400" max="-800" range="1"/> <attack name="physical" interval="4000" chance="25" min="-600" max="-700" range="7" radius="8" target="1"> <attribute key="shootEffect" value="arrow"/> </attack> </attacks> <defenses defense="45" armor="40"/> <immunities> <immunity name="paralyze"/> <immunity name="invisible"/> </immunities> <voices speed="2200" chance="75"> <voice sentence="Grrrrrrrrrr" yell="1"/> <voice sentence="Saia daqui intrusos!" yell="1"/> <voice sentence="Sua resistencia e inutil!" yell="1"/> <voice sentence="Voce vai ser preso!" yell="1"/> </voices> <script> <event name="guard"/> </script> <elements/> <loot/> </monster>
Creatures Scripts
Bom, agora a gente tem de configurar pra esse bixo nao atacar os donos do castelo neh, se nao ele vai sair porai matando GERAL :fuu:. Vamo nessa.
Va na pasta data/creaturescripts e edite o arquivo creaturescripts.xml adicionando esta linha:
<event type="combat" name="guard" script="guard.lua"/>
agora abra a pasta scripts, que esta na mesma pasta e crie um arquivo chamado guard.lua.
guard.lua
function onCombat(cid, target) if(not isPlayer(target)) then return TRUE else targets = getMonsterTargetList(cid) if getPlayerGuildId(target) == getGlobalStorageValue(123123) then addEvent(check,1000,cid,targets) return FALSE else return TRUE end end end function check(cid,targets) for i=1, #targets do if getPlayerGuildId(targets[i]) == getGlobalStorageValue(123123) then addEvent(check,1000,cid,targets) return FALSE else stopEvent(check) return TRUE end end end
Esta configurado o Monstro! Vamos pra proxima etapa!
Instalaçao no MapaEditor
Va ate no primeiro castelo, e adicione uma lavanca ( id recomendado: 1945 ) e coloque aonde voce quiser. Depois de colocado a lavanca, clique nela com o botao direito do mouse e va em property.
No campo "ActionID:" coloque 9999.
Faça a mesma coisa com o segundo castelo, crie la a lavanca, e coloque actionID 8888.
Se voce quiser voce pode criar uma porta especial, por onde so os 'donos' do castelo pode entrar, afinal, ja ta instalado! :fail:
Coloque ActionID 9998 na porta no primeiro castelo, e actionID 8887 na porta do segundo castelo.
Comandos
/war start - Para Ativar o sistema ( ja vem ativado por padrao)
/war stop - Para desativar o sistema.
Bom, eh isso ai. Eh meu primeiro Script ( de muitos ) pro forum XTibia, e espero ta ajudando o forum.
Creditos:
PC98 - Pelo script
MonsterEditor - Pelo mosntro Guarda. ( blackdemon)
obs: Esse mesmo script foi postado em outro forum, porem fui eu mesmo que postei ( PC98 - mesmo nick ).
abraços!