Top.Mail.Ru

[Руководство по Java для L2J] Гайд по основным Java-файлам ядра сервер L2J_Mobius

[Скопировать ссылку]
admin Опубликовано 2024-9-21 10:39:29 | Показать все сообщения |Режим чтения Распечатать Назад Вперед

Зарегистрируйтесь сейчас чтобы найти еще больше друзей, и получить полноценный доступ ко всем функциям сайта!

Для просмотра Вам необходимо авторизоваться Если Вы еще не зарегистрированы, перейдите по ссылке:Зарегистрироваться

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius3 h: P- u! S  G' F
& R- h) o! k7 [, }: V
Разбор файла QuestManager.java& J2 t$ p+ K: A. A
% e9 O% L: k0 t# F" ?) ?- ?( U
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.% U0 g+ T/ D4 Y- {
Основные элементы; {$ c$ A# N1 g
  • Лицензия
    1 v9 \/ p+ B3 `; q# f+ i/ U
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.( G" ]0 L3 s+ Q. U2 M
  • Импорты
    , N5 i8 V0 {$ A: k  Q, ~; ?
1 c" Z6 O& W' c7 m/ S; Z
QuestManager.java — управление квестами и скриптами.: Z* ^' P; J' M. @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\& `8 f, X0 ]8 i, _6 Y- h

  m  c' b" B2 ~7 o7 [

" |! {2 _" ~# GДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 p' b+ S7 b. r
1. Лицензионное соглашение8 R4 m) \. z/ A+ h2 L
  1. /*
    $ g) z/ \( t# ^4 T6 b& ~
  2. * Этот файл является частью проекта L2J Mobius.
      r6 D6 p1 j  r$ y- [8 B( v: H
  3. *
    , F. d# M, L( a( k
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    - D  M! x% E( @- a
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    % L' Q) c: ?% H4 {2 E9 X# h0 O
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.1 r! `  i! l! `  D
  7. *
    2 y, X9 _) Y6 ?: G% J0 _
  8. * Эта программа распространяется в надежде, что она будет полезной,
    3 @6 J. S/ U# Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ' {+ ^$ B( m# C& M1 \
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    4 ?9 K& r1 i: z7 L& U( a* J
  11. * См. GNU General Public License для получения более подробной информации.- j0 w; [. M! o6 s
  12. * : K7 Q& R3 ]( G/ J* G; Z
  13. * Вы должны были получить копию GNU General Public License0 O' K( \  x8 Z( o! {9 D
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>./ n; S: @3 B" P" u- N% J
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
6 W  R: g/ X  v$ j/ @# t2 j7 r; h6 }# l; [8 E( o
* B) U; S2 ?. q; l6 ]9 ^0 F* l* O
2. Импортируемые библиотеки+ [/ e' C. Q$ u5 X

' Y( f9 Y! w0 ~
  1. package org.l2jmobius.gameserver.instancemanager;$ p: |+ w* p9 n! ]  l: U* m/ H

  2. $ T, e6 N9 ^# T3 L9 S  @
  3. import java.util.Map;& ?- r2 Z; ?& _% ^: L0 S
  4. import java.util.concurrent.ConcurrentHashMap;
    ( }: n. k# G9 }1 y) m, `
  5. import java.util.logging.Level;
    * h& _) [" I1 R. v
  6. import java.util.logging.Logger;
    # O0 c) J  _; x

  7. 1 b( L0 O; m% p/ ?& K5 W* w
  8. import org.l2jmobius.Config;6 G/ K4 C9 M: d; e* h( z
  9. import org.l2jmobius.commons.util.CommonUtil;
    8 z- [" j2 A/ F5 J6 _" Y8 v+ _6 ]
  10. import org.l2jmobius.gameserver.model.quest.Quest;, E5 G# ?; d% W) U
  11. import org.l2jmobius.gameserver.scripting.ScriptEngineManager;
Скопировать код
java.util.Map — интерфейс для работы с коллекциями, которые сопоставляют ключи со значениями.java.util.concurrent.ConcurrentHashMap — потокобезопасная реализация карты для использования в многопоточных приложениях.java.util.logging.Logger — класс для логирования информации (вывод сообщений в консоль или лог-файлы).org.l2jmobius.Config — класс конфигурации сервера.org.l2jmobius.commons.util.CommonUtil — утилиты, которые могут использоваться в различных частях программы.org.l2jmobius.gameserver.model.quest.Quest — базовый класс квеста, представляющий игровой квест.org.l2jmobius.gameserver.scripting.ScriptEngineManager — менеджер для работы с игровыми скриптами.8 ~5 d6 t1 `9 U' i

# i- G% a5 C& d3. Описание класса QuestManager1 H, a6 E: [% E( c1 p7 G8 \
  1. /**! s# L/ u0 k4 e
  2. * Менеджер квестов и скриптов.
    : e* i; b4 }! v
  3. * Автор: Zoey765 Y/ m' g5 ~1 V/ e# e' a8 G
  4. */$ ?" @8 }" R2 i) a" c, _0 ?6 E
  5. public class QuestManager+ {7 P2 M$ t: c$ a3 \% v) k, D
  6. {
    & q" P! y5 T: ]: R: o) v' F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());9 Z0 B" V  n% [0 {3 T* q' k
  8.    
    . F4 [' Y2 _0 N) u( g; u! e+ y
  9.     /** Карта, содержащая все квесты. */
    & |( ]% b9 V5 i; b
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    2 U3 }! z# \# |) k+ i9 Q
  11.     /** Карта, содержащая все скрипты. */- T9 A5 l% F9 [
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' {$ F' ^& |  l+ r5 ]
  13.    
    % t7 A% ~* e  P. ]" \% Z- b# `
  14.     protected QuestManager()
    ) ]! G- o! L9 r3 s. b
  15.     {
    + Z. E1 q0 d" T8 p% G; M& U' O9 e
  16.     }$ ]# U7 w  E4 I; B) P; X
  17. }
Скопировать код
4. Методы
' |- ~) n$ D$ uМетод reload(String questFolder)
7 ~! v2 [; j8 P% z( N. g4 F
  1. public boolean reload(String questFolder)/ }6 F5 |3 c3 a& R
  2. {
    2 {$ a( H$ `. K. f' G9 v
  3.     final Quest q = getQuest(questFolder);& r) `( |% P, s: w
  4.     if (q == null)
    0 H) l8 B; q2 [0 N
  5.     {
    7 ~6 f4 n, M$ ~$ ?6 y# o' g
  6.         return false;8 P: O( B. ?, ]! Q" i$ \
  7.     }
    4 m8 q6 p0 T6 N' Z9 H5 l# M
  8.     return q.reload();/ w9 O. U3 y, m" Q$ w" G% j8 e
  9. }
Скопировать код

0 i/ U9 b. y1 H% V
( I* k0 y! W8 [! v; n: c- G6 P2 XМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
! D6 ]4 s1 F/ e- CМетод reload(int questId)
0 l6 W: f2 \9 e) m  R7 H! W1 p+ P  e0 O) e+ L
  1. /**- R3 L1 Y; o6 E0 a) \: c6 h9 }
  2. * Перезагружает квест по ID.2 o6 c+ s8 L" Q- B! J
  3. * @param questId ID квеста для перезагрузки9 y: i! r/ ]3 w0 |
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ' U8 @( O2 M' W
  5. */
    % t5 l" R1 F: c" l! J# q2 G
  6. public boolean reload(int questId)# ~5 C$ {0 E; B+ G; l2 M" ^
  7. {+ N- [- K! D, N
  8.     final Quest q = getQuest(questId);
    " d1 W& @) S) }* Y* Z4 P
  9.     if (q == null)
    % N0 `/ A, U5 U/ q
  10.     {
    & B# a$ y  R" M) D! o
  11.         return false;
    * @5 {0 ^: @- }8 o
  12.     }& J0 V; O$ Q2 a2 M+ L1 F
  13.     return q.reload();
    5 _5 M, ]" g5 P/ T/ ^/ Q8 Z
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID./ i4 _1 T- j$ L" f8 D

5 S7 P' f( X& v' B) c$ ZМетод reloadAllScripts()+ Y; o, d3 l+ X$ s' M& g% w

9 l: G# K1 i. L1 O# \% O( B
  1. /**
    9 Y" o8 V% x* S( K4 j: }* u- d
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.  ?0 N6 _  ^! y
  3. */
      J- K3 M+ w1 M2 U* P. S+ K$ [
  4. public void reloadAllScripts()
    + b& N7 {/ c2 ~1 D( |3 b' `$ w
  5. {
      w) N/ B/ j: f5 U. Q4 B- N
  6.     unloadAllScripts();
    . o; P/ a' o% d$ h& c
  7.    
    / f+ J/ ^/ K. r3 l- W( L
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");# p! J9 X0 o3 D+ H7 U) b
  9.     try( k! u3 G' a+ v9 _
  10.     {- ]* u) J5 o  S( q0 M( _
  11.         ScriptEngineManager.getInstance().executeScriptList();; `7 x" m, G1 x( ^
  12.     }6 H# o$ z) C; h7 S$ b
  13.     catch (Exception e)2 ~7 F  Q" ]! j' B0 U
  14.     {
    & e" q: ], Z, a+ b% B
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 Y# s+ N- D8 T0 r5 `6 k3 I7 Q
  16.     }8 z: V$ x+ |- [% w( Y# g9 K
  17.    
    ! @* M- ~0 l, i
  18.     getInstance().report();- e( d7 P4 Q0 l
  19. }
Скопировать код
Метод unloadAllScripts()" p7 G3 R: E  _, m

6 J; W6 l, i: Z, b; E  o7 S
  1. /**
    9 v& ]! ?" ?  w( `$ J6 l2 j
  2. * Выгружает все квесты и скрипты.
    : \3 K1 a* ^( k+ h
  3. */5 T6 @2 h4 m% U* f
  4. public void unloadAllScripts()! Q9 {/ C) F8 n: ]* x3 B8 c
  5. {4 }$ `% ^9 k0 a2 b3 I
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");$ X+ u, B1 M; }
  7.    
    ) ^2 }6 W) v. f: ?5 @+ Q
  8.     // Выгрузка квестов.
    : n4 B# o3 f6 Q7 L8 M7 Y
  9.     for (Quest quest : _quests.values())" m0 o2 f: n7 c# f( ^  N
  10.     {
    3 W, @" p, i* G  l: V
  11.         if (quest != null)
    & M8 R- V) [, m& [; M
  12.         {
    $ d5 D8 q; E$ F2 T; T( |
  13.             quest.unload(false);* C* J! o- J* u
  14.         }, a" B0 v% \$ D4 \! e8 w: f
  15.     }
    5 w6 n& \" A0 p
  16.     _quests.clear();! q; y' i6 {9 r, d
  17.     // Выгрузка скриптов.) K' A, O$ x; `4 l2 Q
  18.     for (Quest script : _scripts.values())* z) X* M$ L( p2 f3 b
  19.     {9 d2 f  y) K" R* e, v. z  n
  20.         if (script != null)' [6 |4 C7 {% X
  21.         {
    - M5 g" w, f( {8 q
  22.             script.unload(false);
    2 Z6 c. F' N" p' Q5 F( F
  23.         }
    3 V1 Q2 @7 ^  L! ?: f  S
  24.     }
    % D* j3 M" h+ b5 m4 T! a
  25.     _scripts.clear();
    & O" j0 H8 N; R- y; U6 S
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    : ^% E/ q, D  Z

" m* t& ?7 Z+ p' Q' ^' ^) [1 g+ y2 ^Метод report()
3 n. ?& ?2 M, s* T+ O3 {; r8 z7 j- o& x
  1. /**$ E8 \+ Q4 F2 ]1 w; ]# A
  2. * Логирует количество загруженных квестов и скриптов.4 u% ^2 N! z& f
  3. */
    * e3 N9 e; J, {. r  m
  4. public void report(): l, Z' p& K% u8 D6 p' l2 C* j1 i
  5. {# u6 ~% s/ ], V% l2 g& `/ `6 `
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    6 a2 {- V7 L7 @5 l
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* L/ w4 n) V9 N" z$ l; |
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    0 X; f/ S$ N" ]7 t* @0 U

1 n/ q! w4 W( p" Q% ZМетод getQuest(String name)" g4 T" ?; q1 b, x; Q) S/ G
8 G8 t9 ]& q( T$ L& g$ V+ D7 U0 h
  1. /**
    $ q( I( q; E+ f( k
  2. * Получает квест по имени.! z$ `* }7 J+ \! a% i; @0 Y4 ?
  3. * @param name имя квеста
    % r4 }5 |, m' w0 _6 p& A2 u
  4. * @return квест1 P5 `: @5 P7 x0 M- d% r( T
  5. */
    , {- d: U, N5 |1 [9 E
  6. public Quest getQuest(String name)
    , Q5 p. h6 ?, N5 _0 H8 L
  7. {
    6 O. ]4 I8 \( L4 K
  8.     if (_quests.containsKey(name))9 r6 T6 s2 e$ }# b
  9.     {
    ! o) o& G# j8 x3 P0 `0 f
  10.         return _quests.get(name);4 D5 E* `0 n' M0 _: g
  11.     }- B7 h, s* K3 b* R$ Q
  12.     return _scripts.get(name);
    + T& |4 c  [4 `: L+ J
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( F1 c5 g/ Z, p( I& L9 O
8 j8 |4 z3 Q3 X9 {: _
Метод getQuest(int questId)
; M6 |1 f' q0 R9 _  V+ `  ^5 S
/ b- f& K# m% i8 _- F* `$ ]
  1. /**/ ?* i( q2 y4 L3 n
  2. * Получает квест по ID.1 e6 [! G6 N" l
  3. * @param questId ID квеста  X0 b; m6 _$ A# ^, _
  4. * @return квест, если найден, {@code null} в противном случае3 Q0 `7 n# X; [( A- H- a
  5. */( Q* c9 w" h' B8 V. [- S
  6. public Quest getQuest(int questId)
    # a4 D- Y" f& P5 i$ o4 k
  7. {
    : Y; u/ k8 o* d5 L
  8.     for (Quest q : _quests.values())
    # H) v+ p' L8 B, ^7 ]& n
  9.     {' ?) R0 @) n9 _# e; T
  10.         if (q.getId() == questId)
    5 M$ _* e% R1 D) L
  11.         {
    , K& N( u$ m' p/ p; P/ C
  12.             return q;
    ; G9 R- ~. n; o" ]& s) _( ~! n0 z
  13.         }) N. d2 @' D& k  `( D- N
  14.     }4 `% U. W+ d3 ?; h+ p& f3 a1 n
  15.     return null;
    ' d+ J$ i( `2 U' V3 q
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.8 m  y$ w% D  ^' u" Z+ W

/ H- A2 N" m& P4 fМетод addQuest(Quest quest)
) F" n! N9 s; p" t: s) H/ q. C: |4 Z! |: v+ w$ [2 C
  1. /**
    7 Y: V+ l. b  M- T
  2. * Добавляет новый квест.+ h, S* U8 w$ C  j) H4 c. f/ C1 H) K8 L
  3. * @param quest квест для добавления: c- Y2 j# A# M$ ?' C8 r& Q
  4. */! m$ s$ Z- ]+ |. {; I
  5. public void addQuest(Quest quest)
    + Y+ V: v) C$ W0 ^
  6. {" G! A( v1 y% ]* K& ]
  7.     if (quest == null), y; e" [, I  A) A' _# q
  8.     {
    ! w+ I- O+ s9 r# s3 A# P
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    * Z: T( @% @6 }) Z# c% L
  10.     }' ?/ D0 @, ~! s& w8 ?9 ^$ C
  11.     2 M# |! _$ i; U) x2 T
  12.     final Quest old = _quests.put(quest.getName(), quest);
    ( p4 M. A. g' b9 l/ l
  13.     if (old != null)1 ^5 ]+ R' Q& Z8 U
  14.     {7 s& {$ M( G) f% y" S" d
  15.         old.unload();$ W# n' C) N9 j8 l* T$ _
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 U0 r+ k+ I  K) ~# J# Z! j
  17.     }4 D8 Z0 i6 e/ @
  18.     ' d: \1 b  `) T! u3 U
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    1 g* v8 G, S" q& v
  20.     {
    , i* E- R1 c/ X6 U! E
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 t; R  `* c% {
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");, ~8 }7 k% F' X# d* y
  23.     }
    ( Q% V- l( u2 s) _/ b7 _
  24. }
    * R; ]7 g( Q1 P* p8 N
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., N: w, Q+ t6 K" \# r9 B" {; e4 p
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
& c; V8 L9 X) H5 G6 [8 d6 }* {2 v( m8 `8 |/ _, p  A9 o4 z
. D1 N$ d0 [& t- e
+ r7 T4 h% c, b3 {
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

Правил начисления баллов

Опубликовать
Сектор творческих людей
Горячая линия

638638758

С понедельника по воскресенье с 9:00 до 23:00

Обратной связь

admin@artace.ru Онлайн

QR-код

Powered by Discuz! X3.5© 2001-2021 Comsenz Inc.