|
Criando Quest

04-04-2011, 11:51 PM
Bom ... resolvi postar um tutorial de como criar quest, já está na hora de ajudar as pessoas que me ajudaram... E acho que vai ser bastante útil para todos aqueles que começam a fazer servidores e mecher em java, já que fiz exclusivamente para o SE.
IMPORTANTE: também freqüento outros fóruns, mas a que me tratou melhor foi a da equipe da Secret... por isso fiz esse tutorial especialmente e exclusivamente para vocês que adoram o fórum e gostam de Lineage II Java!
Meus Parabéns ao Equipe da Secret!
então ... chega de falar então vamos ao tutorial ... 
A primeira coisa a fazer é adicionar as classes Java necessárias na busca. ex:(com.l2jdemonniac.gameserver.model.quest).
# Quest Search Created Mr. by allanalcantarA
import sys
from com.l2jdemonniac.gameserver.model.quest import State
from com.l2jdemonniac.gameserver.model.quest import QuestState
from com.l2jdemonniac.gameserver.model.quest.jython import QuestJython as JQuest
Citação:
Class QuestJython --> (importado sob o nome JQuest) contém informações sobre as buscas.
Class State --> usou isso para descrever o estado da quest.
Class QuestState --> aplicado diretamente para controlar o status de um jogador na missão ou quest.
|
Em seguida, adicione algumas constantes que vai fazer a busca mais fácil de ler. Se não, pode haver dificuldades com a edição a busca no futuro.
Constantes de nossa busca - NPC ID e itens.
KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE = 500000
WORLD_MAP_ITEM_ID = 1665
Em seguida, declarar uma função auxiliar.
Função do número de itens de quest (keltir presas) jogador. (St deve ser QuestState):
getCount def (r):
st.getQuestItemsCount return (FANGS_ITEM_ID)
Citação:
|
--> Função para completar a quest (r deve ser QuestState):
|
def COMPLETED (r):
st.setState (COMPLETED)
st.clearQuestDrops ()
st.takeItems (FANGS_ITEM_ID, -1)
st.giveItems (WORLD_MAP_ITEM_ID, 1)
st.exitQuest (False)
return
Em seguida,ao declarar COMPLETED, tiramos todos os itens que ele juntou do jogador e dar-lhe uma recompensa. Em seguida, informa o servidor que a busca está concluída e não serão repetidas. (St.exitQuest (False))
Finalmente, a função auxiliar para verificar o número de itens no jogador para completar a quest. (St deve ser QuestState):
check def (r):
se 4 = getCount (r)>:
COMPLETED (r)
return
]Em seguida, declarar-se a própria busca class. Quest - a classe do python, que estende a classe java no com.l2jdemonniac.gameserver.model.quest.jython.Que stJyth Então, nós declaramos um onEvent, o método que é chamado java, se alguém começou a busca.
classe Quest (JQuest):
def __init__ (self, id, name descr): (descr self, name, id) JQuest.__init__
onEvent def (event, self, r):
st.getState id = ()
se id == created: st.setState (started)
elif id == COMPLETED: pass
elif id == STARTED: check (r)
return
Citação:
O método init - para este construtor da classe Jython que chama a classe Java. Tem os seguintes parâmetros:
|
Citação:
OnEvent o método é chamado de Java. Executa início a busca. Tem os seguintes parâmetros:
|
Citação:
A primeira linha é uma verificação sobre o estado atual da busca diretamente para o jogador eo estado de lavada em 'id' uma variável.
Se a busca só é tomada, então anuncia o início da busca (se id == created em: st.setState (started)).
Se a busca é feita, então faça nada elif id == COMPLETED: pass)
Se a quest já começou (started), então chama a função check (check (), definido acima) dos itens que têm caráter para completar a quest. Nós não verificamos "evento" a variável, porque No nosso exemplo (quest Tutorial) são para todos os eventos que ocorrem. O Método é chamado de (OnEvent).
|
E finalmente, quando o esqueleto é determinada na quest, estamos a criar a busca em si (e defini-lo no servidor) e declará-lo.
QUEST = Quest (201, "Tutorial", "Search Tutorial")
CREATED = State ("Start" QUEST)
STARTED = State ('Introduction', QUEST)
COMPLETED State = ('Completed' Quest)
Citação:
|
Quest vai ter um ID de cliente - 201 ID «Tutorial» e descrição «busca Tutorial».
|
Também terá três estados: created, started, completed. Os nomes dos estados pode ser usado para localizar automaticamente o necessário. HTM.
Por exemplo, para CRIADOR vai corresponder "Start.htm", por PASSOS - "Started.htm e será mostrado 'Completed.htm" CONCLUÍDO. Os nomes dos estados usado da mesma forma para armazenar o estado da busca no banco de dados, quando um jogador sai do jogo, para que os nomes não devem ser repetidos na mesma busca.
Precisamos também determinar o estado inicial da busca, quando um jogador levou apenas, e só a partir do NPC.
QUEST.setInitialState (created)
QUEST.addStartNpc (7056)
Aviso: no inicio do htm ao NPC tem que ser uma referência para a busca:
<a action="bypass npc_%objectId%_Quest"> -h
Agora você precisa adicionar um goto(ir) para esta busca por estado STARTED, por que iria ficar nas coisas necessárias.
STARTED.addQuestDrop (KELTIR_NPC_ID, FANGS_ITEM_ID, DROP_RATE)
Esta quest terá nada mais. Tudo que você necessita para funcionar correctamente a busca já foi adicionado. Aqui está o texto integral da busca:
import sys
from com.l2jdemonniac.gameserver.model.quest State
from com.l2jdemonniac.gameserver.model.quest QuestState
from com.l2jdemonniac.gameserver.model.quest.jython QuestJython as JQuest
KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE = 500000
WORLD_MAP_ITEM_ID = 1665
getCount def (r):
st.getQuestItemsCount retur (FANGS_ITEM_ID)
def completed (r):
st.setState (completed)
st.clearQuestDrops ()
st.takeItems (FANGS_ITEM_ID, -1)
st.giveItems (WORLD_MAP_ITEM_ID, 1)
st.exitQuest (false)
return
check def (r):
se 4 = getCount (r)>:
completed (r)
return
class Quest (JQuest):
def __init__ (self, id, name descr): (descr self, name, id) JQuest.__init__
onEvent def (event, self, r):
st.getState id = ()
se id == created: st.setState (started)
elif id == COMPLETED: pass
elif id == STARTED: check (r)
return
QUEST = Quest (201, "Tutorial", "busca Tutorial")
CREATED = State ("Start" QUEST)
STARTED = State ('Introduction', QUEST)
COMPLETED State = ('Completed' Quest)
QUEST.setInitialState (created)
QUEST.addStartNpc (7056)
STARTED.addQuestDrop (KELTIR_NPC_ID, FANGS_ITEM_ID, DROP_RATE)
Agora olha como ele funciona.
Spoiler
O jogador vem para o NPC inicial (neste caso, 7056), clique em "Quest". Quest será criado e do estado da quest irá prosseguir para criado eo jogador será apresentado ao Start.htm página com uma descrição da quest. Em seguida, o método onEvent, a caixa Start.htm abrira uma página de abertura traduzida em busca de status e INICIADOS, o jogador será apresentado com uma pagina Started.htm, onde será optado a como encontrar e keltirs. Etc.
Se o estado STARTED será registado as «presas», keltirs cair matando. O jogador pode voltar para o NPC de partida e perguntar sobre a quest - onEvent método será chamado novamente. Se um jogador não tem o número necessário de itens, o método de seleção () não traduz a busca para o próximo estado e Started.htm será mostrada novamente. Mas se um jogador tiver o número necessário de indivíduos (neste caso, 4 itens), a verificação do método () chama a conclusão () vai traduzir a busca de um novo estado preenchido, tirar todos os caninos, dará o mapa do mundo, porque uma recompensa para a busca, vai Completed.htm e completar a quest.
Agora vamos fazer a nossa busca mais parecido com o que deveria, por si só fornecer.
Primeiro de tudo, temos 3 métodos para declará-las em Java - onKill onTalk e onEvent. Se os métodos e onKill onTalk não declarados, em seguida, todos eles vão fazer o onEvent método, ou seja, identificar monstros busca e desencadear conversas NPC. Há uma nota, os métodos e onKill onTalk fará apenas com diálogos NPC, dependendo do estado atual da busca. OnKill método será invocado apenas quando matar um monstro quest.
Vamos ver como o método que é chamado com o keltir onKill assassinato capaz de buscar INICIADOS:
STARTED.addKillId (KELTIR_NPC_ID)
e do método na classe onKill Quest:
class Quest (JQuest):
onKill def (self, r, NPCID):
se NPCID == KELTIR_NPC_ID:
n = getCount (r)
se n == 0:
return "Chat0.htm"
elif n == 1:
return "Chat1.htm"
elif n> = 4:
return "Chat4.htm"
return "Collected" + str (n) + "de 4 dentes"
return
Citação:
Método onKill (assim como um método onTalk) tem as seguintes opções:
|
Neste método, verificar e observar se os mortos keltir'om NPC. Basicamente, este teste não é necessária porque Temos apenas KELTIR_NPC_ID.
Em seguida, verifique o número de objetos (neste caso, o número de caninos) e, se não o fizerem, em seguida, retornar a string "Chat0.htm", se apenas um item, em seguida, retornar a string "Chat1.htm", se os mesmos itens 4 ou mais ", Chat4.htm ". Se a string retornada dos métodos onEvent onKill ou onTalk, em seguida, o servidor htm será relevantes. Em Chat0.htm pode ter o seguinte texto: "Você não tem uma única presa, volte mais tarde, quando coletar 4 partes e blá, blá, blá ..." no Chat1.htm pode ser o seguinte texto: "Você tem apenas uma presa em recolher essa ainda .... " Em Chat4.htm - "Você tem o número necessário de itens, volte ao seu treinador que iria completar a quest ..."
Nota: Se uma linha começa com o return ", ele irá mostrar a página html com o texto que vale mais. Então, em vez de:
pode ser fornecido:
return "<html> <body> Volte para o seu treinador para completar a quest </ body> </ html>"
Citação:
Além disso, se a string termina sem Htm. Ou no começo lá, o texto será exibido como um sistema de mensagem na janela de chat. No nosso caso, vamos fazê-lo, isso seria para cada assassinato keltik mensagens do sistema: "N coletados a partir dos 4 dentes".
Nosso código para onKill tem uma desvantagem. Ele vai mostrar constantemente Chat0.htm, Chat1.htm e Chat4.htm, também precisamos que Chat0.htm e Chat1.htm aparecer apenas uma vez. Como vamos fazer? Com a ajuda de variáveis.
Em cada linha de busca podem ser armazenados usando variáveis. Essas variáveis ?? são armazenadas no seu banco de dados. Em cada método, podemos definir, ler e excluir variáveis. Vamos mudar método do onKill , para que o diálogo seja chamado apenas uma vez.
|
onKill def (self, r, NPCID):
if NPCID == KELTIR_NPC_ID:
n = getCount (r)
if n == 0:
None if st.get == ("chat0 '):
st.set ("chat0", "true")
return "Chat0.htm"
elif n == 1:
None if st.get == ("chat1 '):
st.set ("chat1", "true")
return "Chat1.htm"
elif n> = 4:
return "Chat4.htm"
return "Collected" + str (n) + "de 4 dentes"
return
Citação:
|
Se o jogador não tem dentes (n = 0), então nós começamos com variável 'chat0. Quando o método onKill é chamado pela primeira vez, ainda não é o que as variáveis ?? não estão disponíveis e nenhum retorno python. Neste caso, declarar uma variável e mostra diálogo de uma (Chat0.htm) . Quando matamos keltir, mas não saia sua presa, o st.get função ('chat0') retorna a seqüência True, mas não if. E o segundo tempo da janela Chat0.htm não aparece, mas na janela do chat irá linha «Collected 0 de 4 dentes». Seguindo o mesmo princípio é feito com Chat1.htm.
|
Aqui está a versão final do trabalho da busca:
import sys
from com.l2jdemonniac.gameserver.model.quest import State
from com.l2jdemonniac.gameserver.model.quest import QuestState
from com.l2jdemonniac.gameserver.model.quest.jython import QuestJython as JQuest
KELTIR_NPC_ID = 12082
FANGS_ITEM_ID = 1859
DROP_RATE = 500000
WORLD_MAP_ITEM_ID = 1665
def __init__ (self, id, name descr): JQuest.__init__(descr, self, name, id)
getCount def (r):
st.getQuestItemsCount retur (FANGS_ITEM_ID)
def completed (r):
st.setState (completed)
st.clearQuestDrops ()
st.takeItems (FANGS_ITEM_ID, -1)
st.giveItems (WORLD_MAP_ITEM_ID, 1)
st.exitQuest (false)
return
check def (r):
se 4 = getCount (r)>:
completed (r)
return
class Quest (JQuest):
onEvent def (event, self, r):
st.getState id = ()
se id == created: st.setState (started)
elif id == COMPLETED: pass
elif id == STARTED: check (r)
return "1.htm"
QUEST = Quest(201, "Tutorial" , "Busca Tutorial")
CREATED = State('Start', QUEST)
QUEST.setInitialState(CREATED)
for npc in NPCS:
QUEST.addStartNpc(npc)
QUEST.addTalkId(npc)
PRONTO!
então é isso ...
Acho que fiz tudo certo ...
então se tiver faltando algo, e quem poder me corriga!
Abraço forte.
em breve mais tutoriais, e mais mods.
Citação:
|
AVISO: Teste feito como Base no meu Projeto na Quest e Na criação do tutorial..
|
credits allanalcantarA
ATENÇÃO: Caso alguem poste em outro Fórum não remova os créditos ...
são totalmente meus.
Exclusivamente para Equipe Secret Experience
|
allanalcantara
Banido
Registrado em: Nov 2009
Localização: Fortaleza-ce
Posts: 325
Nome Real: Allan Alcântara de Alencar
|
|