Secret Experience

Secret Experience (https://secretexperience.net/index.php)
-   [L2J] Tutoriais (https://secretexperience.net/forumdisplay.php?f=39)
-   -   Criando Quest (https://secretexperience.net/showthread.php?t=30641)

allanalcantara 04-04-2011 11:51 PM

Criando Quest
 
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 ... :1a:

A primeira coisa a fazer é adicionar as classes Java necessárias na busca. ex:(com.l2jdemonniac.gameserver.model.quest).


Código:

# 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.


Código:

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):

Código:

getCount def (r):
  st.getQuestItemsCount return (FANGS_ITEM_ID)

Citação:

--> Função para completar a quest (r deve ser QuestState):

Código:

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):


Código:

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.

Código:

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:

Spoiler
• self - uma referência a si mesmo.
• ID - um identificador numérico da busca para o cliente.
• name - O nome da quest, que será emitida diretamente do próprio servidor.
• descr - o nome da descrição de busca que é exibida para o jogador quando a busca tem um NPC, para que possamos tomar, mas essa busca, e ainda outra.

Citação:

OnEvent o método é chamado de Java. Executa início a busca. Tem os seguintes parâmetros:
Spoiler
• self - link diretamente para a Quest Tutorial
• event - a seqüência de caracteres para identificar o evento de abertura para Java.
• ST - uma referência ao QuestState, para acompanhar o estado atual do jogador.

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.


Código:

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.



Código:

QUEST.setInitialState (created)
QUEST.addStartNpc (7056)

Aviso: no inicio do htm ao NPC tem que ser uma referência para a busca:


Código:

<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.

Código:

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:

Código:

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:

Código:

STARTED.addKillId (KELTIR_NPC_ID)
e do método na classe onKill Quest:
Código:

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:
Spoiler
• self - a busca
• NPCID - ID NPC, que nós temos que matar (se ele é um método onTalk, então o ID do NPC, com quem devemos falar).
• ST - o estado atual do jogador.

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:


Código:

return "Chat4.htm"

pode ser fornecido:

Código:

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.
Código:

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:

Código:

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

Código:

ATENÇÃO: Caso alguem poste em outro Fórum não remova os créditos ...
são totalmente meus.
Exclusivamente para Equipe Secret Experience


Mazokista 05-04-2011 04:13 PM

[ATTENTION]Movido para area de Tutorial[/ATTENTION]

razor999 24-08-2011 11:54 AM

[SIZE="3"]deveria ganhar fixo :1a:
tem muita gente que não sabe fazer quest ;/
eu mesmo fui aprender um dias desses ;D
e ainda erro muito ainda passo horas revendo aonde errei ^^
com tuto desse ai concerteza meu problema e doz outros Já eram sobre criação de
quest parabéns allan :policeman:[/SIZE]

allanalcantara 25-08-2011 03:31 PM

obrigado meu amigo, vendo esse tutorial da pra criar uma ótima quest, custom.
isso fica ao critério do criador né.
rsrsrs :D

sheah 05-01-2012 12:05 PM

Poderia ter um volume 2 ai explicando com iimgs,A primeira coisa a fazer é adicionar as classes Java necessárias na busca. ex:(com.l2jdemonniac.gameserver.model.quest).
isso eu não entendir onde fazer,é com eclipse? como onde coloco isso? :S

OliverSykes 05-01-2012 01:21 PM

Na pasta java você vai proucurar a pasta com e seguindo a pasta com se vai achar um arquivo com.l2jdemonniac.gameserver.model.quest porem o nome l2jdemonniac é apenas exemplo no lugar dele vai ta nome da revisão que você usa é como se tive se alterando import de um buffer to apenas pondo um exemplo vocÊ so vai alterar nome !


Horários baseados na GMT -3. Agora são 11:28 PM.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.