Fala pessoal, esse é meu primeiro script que posto aqui na comunidade, não sou muito bom nisso, mas depois de um tempo eu consegui fazer com que funcionasse 100%.
-----------------------------------------
Descrição:
É uma quest que, ao falar com um NPC, você deve matar 1000 monstros, e depois de feito, você ganha um prêmio em experiência e acesso a um local, onde randomicamente, um monstro é sumonado para você enfrentar (no caso, um boss pirate)
Mais infos, aqui.
Distro utilizado:
The Forgotten Server 0.2.2/0.2.3/0.2.4
Primeiro, vamos fazer o NPC.
Vá em data/npc e cria um arquivo .xml com o nome de Captain Alfred. Copie isso dentro do arquivo e salve:
<?xml version="1.0"?><npc name="Captain Alfred" script="data/npc/scripts/killing_quest.lua" access="3" lookdir="2" walkinterval="2000">
<mana now="800" max="800"/>
<health now="200" max="200"/>
<look type="151" head="115" body="76" legs="35" feet="117" addons="2" corpse="6080"/>
<parameters>
<parameter key="message_greet" value="Hiho! Do you want to do a {quest}? "/>
</parameters>
</npc>
Agora, em data/npc/scripts, crie um arquivo .lua chamado killing_quest e copie isto dentro dele:
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
local quest = 86669 ---storage value utilizado
if msgcontains(msg, 'quest') then
selfSay("Ok, you have to kill some monsters. Do you want to kill {pirates}?", cid)
talkState[talkUser] = 2
elseif(getPlayerStorageValue(cid, quest) == 2) then
selfSay("You have some more pirates to kill.", cid)
elseif(getPlayerStorageValue(cid, quest) == 3) then --pirates
selfSay("Wow, you did it! Now, you can enter in quest door of nargor!", cid)
doPlayerAddExp(cid, 300000)
setPlayerStorageValue(cid, quest, 4)
setPlayerStorageValue(cid, 696969, 1) ---questdoor storage---
elseif(getPlayerStorageValue(cid, quest) == 4) or (getPlayerStorageValue(cid, 696969) == 2) then
selfSay("You have already done my quest.", cid)
elseif msgcontains(msg, 'pirates') and talkState[talkUser] == 2 then
selfSay("So you wanna kill 1200 pirates yeah?", cid)
talkState[talkUser]= 3
elseif msgcontains(msg, 'yes') and talkState[talkUser] == 3 then
selfSay("Ok, now go and kill pirates. And after that go back and report!", cid)
setPlayerStorageValue(cid, quest, 2)
end
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Altere apenas o que está em vermelho, no caso as falas do NPC, suas respostas e o storagevalue da quest.
Você pode modificar também o prêmio da quest, ao invés de doPlayerAddExp(cid, quantidade), coloque doPlayerAddItem(cid, IDDOITEM, QUANTIDADE).
Agora vá na pasta data/creaturescripts/scripts e crie um arquivo com o nome de kill_counter.lua, em seguida, adicione isto nele:
local monsters = {--name = storage
["pirate buccaneer"] = 45004,
["pirate corsair"] = 45004,
["pirate cutthroat"] = 45004,
["pirate marauder"] = 45004,
["pirate ghost"] = 45004
}
function onKill(cid, target)
if(isPlayer(target) ~= TRUE) then
local name = getCreatureName(target)
local monster = monsters[string.lower(name)]
if(monster) then
local killedMonsters = getPlayerStorageValue(cid, monster)
if(killedMonsters == -1) then
killedMonsters = 1
end
if(name == "pirate buccaneer" or name == "pirate corsair" or name == "pirate cutthroat" or name == "pirate marauder" or name == "pirate ghost") and getPlayerStorageValue(cid, 86669) == 2 then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have killed " .. killedMonsters .. " of 1200 pirate's.")
setPlayerStorageValue(cid, monster, killedMonsters + 1)
if getPlayerStorageValue(cid, 45004)>=1200 then
setPlayerStorageValue(cid, 86669, 3)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "You have killed enought pirate's.")
end
end
end
return TRUE
end
end
Você pode alterar os nomes dos monstros a serem enfrentados, caso queira fazer uma quest diferente. Neste exemplo foram utilizados piratas
Ahh, para mudar a quantidade de monstros que o jogador deve matar, mude aqui onde está em vermelho:
if getPlayerStorageValue(cid, 45004)>=1200
1200 = quantidade de monstros
Caso modifique a quantidade, não se esqueça de mudar as mensagens destacadas em vermelho para o número correto de monstros a serem enfrentados, senão fica non-sense né?
Ainda na pasta creaturescripts/scripts, abra o arquivo login.lua e adicione o seguinte comando abaixo de "function onLogin(cid)":
registerCreatureEvent(cid, "KillingInTheNameOf")
Abra o arquivo onkill.lua e adicione o mesmo comando:
registerCreatureEvent(cid, "KillingInTheNameOf")
Agora vá em data/creaturescripts e abra o arquivo creaturescripts.xml, adicione a seguinte tag:
<event type="kill" name="KillingInTheNameOf" script="kill_counter.lua"/>
Para finalizar, vá em data/actions/scripts, crie um arquivo chamado piratedoor.lua e adicione isto:
local bossroom = {x=880, y=617, z=2} ---coordenadas da sala onde o jogador será teleportado ao clicar na portalocal spawn = {x=886, y=608, z=2} ---coordenadas de onde irá nascer o boss
function onUse(cid, item, pos, frompos, item2, topos)
local randommonsters = {"brutus bloodbeard", "deadeye devious", "lethal lissy", "ron the ripper"}
local randomboss = math.random(1,4)
if getPlayerStorageValue(cid,696969) == 1 then
doTeleportThing(cid, bossroom)
doSendMagicEffect(bossroom,10)
doSummonCreature(randommonsters[randomboss], spawn)
setPlayerStorageValue(cid, 696969, 2)
else
if item.uid == 8735 and item.itemid == 5290 then
if getPlayerStorageValue(cid,696969) == 0 or getPlayerStorageValue(cid,696969) == 2 then
doPlayerSendTextMessage(cid,MESSAGE_INFO_DESCR,'The door seems to be sealed against unwanted intruders.')
end
end
end
end
Depois abra o arquivo actions.xml, e adiciona a tag:
<action uniqueid="8735" script="piratedoor.lua" />
Altere apenas o que está em vermelho, lembrando que no final, 8735 é o uniqueid que você colocará na porta pelo map editor, 5290 é o id da porta, ambos podem ser alterados!
Crie uma área parecida com essa da screenshot, e não se esqueça de adiciona o NPC no mapa né.
Screenshot:

Caso encontrem algum erro, por favor postem aqui!
Agradecimentos ao slawkens (otfans) por criar parte do script, e ao Val por tirar uma dúvida
Abraços. :smile_positivo: