Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, v9 d( v  r  C: [) j& _$ ^; Q; @  [5 c' v: F
Разбор файла QuestManager.java  m0 l3 H5 D8 H2 h3 R

5 X- s$ m- Q# f2 T; R: a9 Z  _  |Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов." A. T0 P$ b, U
Основные элементы
1 I5 ^4 r6 U& H3 |, `
  • Лицензия8 l- _+ j' e1 b9 Q" k
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.. P- H' ^; g4 N, @; \9 ~
  • Импорты& C; ~  ^1 ?- f5 ~* _3 R
5 w  t, ]/ [( z4 U) M2 ^
QuestManager.java — управление квестами и скриптами.7 \: @! S/ K; }5 P
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ Q# {; o/ _9 f2 m; z) X
* q( T: p7 @" C) @, }+ o
/ U, I4 Z; o: V% ?6 Z0 r: u
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.) p) A! @6 a- F( X+ A! G
1. Лицензионное соглашение
5 Z& s, w5 y+ G# ]' X
  1. /*  r4 s) i$ K  n! |' [
  2. * Этот файл является частью проекта L2J Mobius.
    0 Y- H+ c9 @% U9 ]  N6 O# _
  3. *
    2 B& H( h1 o) C# U. A( X# ]
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 P4 O0 i. c4 M! C
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    . i! g0 i4 Y. e
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 R$ e: g' h) R8 V* O* L  t
  7. * . u2 @( `" n1 ~- I  f+ R# ]) Q
  8. * Эта программа распространяется в надежде, что она будет полезной,. v* g" t' B& z( A- X
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии1 r5 i: L# ?9 s0 m/ o2 v
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.1 n, A' v$ }' \2 z4 x
  11. * См. GNU General Public License для получения более подробной информации.
    - c' q$ h2 m% z% b9 O/ D: [$ C
  12. *
    ; J4 B4 P- L4 V- o) w$ S* E6 c
  13. * Вы должны были получить копию GNU General Public License' N0 u' y# ~: ?! A2 M
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.6 c& c9 Z! G8 {
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
. N; E+ C) d% m+ I! |, C% D
- [  ~5 B  i" X) B% E& Q' n9 p! I1 }# s
2. Импортируемые библиотеки0 [$ E% ]2 v5 B! ]% g
  Q0 X, E# r2 ~8 h0 E
  1. package org.l2jmobius.gameserver.instancemanager;$ t& P# |- y: U% y

  2. & o9 H7 w! X% ~* B/ b) i  k
  3. import java.util.Map;
    7 b$ T1 |2 Z3 |
  4. import java.util.concurrent.ConcurrentHashMap;$ v# V/ T* K4 e' O+ x
  5. import java.util.logging.Level;4 `3 ^% W3 A9 w  O4 J% P0 f
  6. import java.util.logging.Logger;
    % L( z1 _0 I) @. n! \5 y
  7. 3 k: T# h; L+ @( v2 m7 S, e2 i; ?
  8. import org.l2jmobius.Config;/ R, b! g' \7 u
  9. import org.l2jmobius.commons.util.CommonUtil;. L* B( M' B% R& Y( d; j
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ; [1 [7 h+ F1 b# q8 b% U4 `
  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 — менеджер для работы с игровыми скриптами.
9 U) j0 o/ O0 F4 B: @1 }. I+ r4 j7 q0 @6 g
3. Описание класса QuestManager5 h) J% \/ ?" J) D7 H
  1. /**# E4 X8 P2 q+ w4 A8 N
  2. * Менеджер квестов и скриптов.9 O9 E, D+ Y4 e1 j
  3. * Автор: Zoey76" T& x7 g) N. s
  4. */
    $ n0 \7 ?% E) V0 U2 y6 d
  5. public class QuestManager3 `+ d4 M( K- z7 j/ x
  6. {
    2 W: ^3 `" F% }
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ( m5 n: \7 t7 K5 _" z
  8.    
    9 [) R0 I+ ]- b
  9.     /** Карта, содержащая все квесты. */) z9 p6 R2 v8 \! u" E+ k' _- v
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- Y. o  x2 N. O8 M$ N$ T5 q
  11.     /** Карта, содержащая все скрипты. */
      l( j' Y2 L; j3 K+ p) }. B- X" d
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
      ?/ C, \  T2 M1 Y* N! D+ k9 w
  13.    
    % p6 m& T% e& D# ~( w) _" m( \
  14.     protected QuestManager()4 |) t" T2 Z  W) I0 [1 \. S/ s
  15.     {
    : h& C) {- t- p0 P" I& s. |
  16.     }
    % f+ c, f% b$ C2 G' ?: U
  17. }
Скопировать код
4. Методы: _  z) E2 \* Y: [9 k& R7 ?
Метод reload(String questFolder), k2 f& o1 ^: _8 y# a3 {2 i! g
  1. public boolean reload(String questFolder)
    1 Q/ K: I$ T) s2 U2 g% ?5 t. z
  2. {
    6 b* `/ u0 B8 n2 }6 s
  3.     final Quest q = getQuest(questFolder);& p0 q' l6 o2 {3 J
  4.     if (q == null)
    ( ^$ ]% J$ }' N) o7 n! a
  5.     {0 s* Y3 _: y; l/ _0 F6 J) E, s
  6.         return false;; ]( b$ M, Z4 _) @" h# A1 k
  7.     }
    - q. c8 N' S# A% G9 Y5 [+ o
  8.     return q.reload();
    7 P3 h# z2 d/ x! }& b) m! |* C8 j
  9. }
Скопировать код

! V/ d4 a6 |1 R6 U2 A1 Y8 C3 |$ \' z& R3 n* l
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ l: F( _0 v, l8 V7 v4 nМетод reload(int questId)
+ i0 n* h% q$ y/ D* r5 J2 b  v& b& R! R+ p) b/ }  p7 r+ G6 w
  1. /**
    * V. r# @8 m" T% {+ Z
  2. * Перезагружает квест по ID.
    , ]6 g' i" Z* v: S0 G
  3. * @param questId ID квеста для перезагрузки
    # D- B7 @7 m  l: j0 C4 m) y1 I0 Q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    . N  W" }! H& k7 x
  5. */
    8 O: W+ m8 G. Y* M  Y% ^" G( P7 ?6 {
  6. public boolean reload(int questId)! |7 c) g" T% d/ |" H
  7. {1 b' E& f" m; |
  8.     final Quest q = getQuest(questId);: ], {, ?, f0 [
  9.     if (q == null); \; M( t$ Y4 ]' k: r, s
  10.     {+ A  O2 V4 y9 m1 H" S2 {; v
  11.         return false;
    . h0 P4 _: S. t% z, @% N* y
  12.     }
    % _- \$ W* U+ i4 c/ S1 c# M
  13.     return q.reload();
    4 n3 n7 q. A9 }1 H0 y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    2 e6 |0 T% t2 F2 o/ P
7 ^) R# B: k3 f. R, }: o
Метод reloadAllScripts()/ M6 g4 G1 p6 u5 A

; N/ L* b! |1 d) P2 P( O
  1. /**5 {3 U$ I" B, l
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    " ~4 w: n" A, I; X9 Q9 e* S7 C
  3. */9 m1 j1 ^$ V4 n8 u; `; \  W
  4. public void reloadAllScripts()
    / g" L% S; K  v
  5. {3 c! ~1 I3 Z2 i2 ^8 l, }
  6.     unloadAllScripts();7 d6 n9 |2 u. D/ g
  7.    
    $ _7 C9 ~; ?- V  h5 C- x
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ) G; m! J1 q4 d6 w8 K* G  z
  9.     try, t# J+ P5 }- y  I" Z% p3 W
  10.     {( @# ~0 {1 n) a7 W( c5 q+ q# k; w$ C
  11.         ScriptEngineManager.getInstance().executeScriptList();3 j3 w- q4 y  D0 F
  12.     }
    * A: {) {0 M7 |$ k
  13.     catch (Exception e)
    + R# F5 y# a$ P& G' y1 k
  14.     {
    / Y" ]% Y8 b, V: F+ E
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ; @% P2 v! b" M' }5 x/ ~/ A
  16.     }" Y& }9 u; D0 P% H, T! k5 i
  17.     1 Y8 V0 k, S+ d4 g4 B
  18.     getInstance().report();" @( |; o6 f/ J. U' e  ^( Z7 I
  19. }
Скопировать код
Метод unloadAllScripts()/ M" O" J% s% K1 B' d0 I

2 ~% a0 `0 _: h5 x/ g" Y
  1. /**/ i8 l" I' |. I0 ]0 V; w
  2. * Выгружает все квесты и скрипты.
    + G$ p% [- a9 n! H0 X0 Y
  3. */3 u: U. _& t7 U
  4. public void unloadAllScripts()
    5 x, C$ a1 V+ Q. N3 ?' U% ~3 K2 |
  5. {
    ! ~" @* j3 @! f% b
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 M; q) G9 g$ q5 Y: E5 A6 v
  7.    
    $ q) G9 \9 m0 A9 i! K
  8.     // Выгрузка квестов.
    4 }" F& s& o! x) P1 T5 z$ ~8 Q0 M
  9.     for (Quest quest : _quests.values())
    ; W9 }  p/ {% C7 Y9 I
  10.     {& l, ^2 b- o  j" c( ?  c
  11.         if (quest != null)
    - d% c6 h! V% [. o
  12.         {
    2 m; W4 R( k8 \2 R$ A1 Z
  13.             quest.unload(false);
      w/ |  e1 }3 P, O- ]3 A
  14.         }* r9 F! X0 b& o* U' ]
  15.     }0 D2 d% {; @6 g* I" u
  16.     _quests.clear();
    8 R$ B8 B* y6 {. T! E  @
  17.     // Выгрузка скриптов.% ~- H( s' Q$ D9 ]" y: {
  18.     for (Quest script : _scripts.values())
    5 B% V( m+ r9 ?* Q  R
  19.     {8 [  U* H  y+ K& ?) T6 g
  20.         if (script != null)* U# `, Q$ B. V$ j0 I
  21.         {
    $ D2 v+ |  i/ o5 Q6 c, x
  22.             script.unload(false);
    / A3 E$ \$ L) U0 M9 b. B
  23.         }+ A9 W# E( V1 R; ^
  24.     }
    . ~) U" L9 x5 @; b: ?5 z
  25.     _scripts.clear();# e  O) k; M' g0 ]
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 s% z2 D2 f# ~) o0 N* O6 c0 W2 Q
1 Z7 S; ~* z: z- ^, S
Метод report()# ?5 y8 e, W' b; |! d) u/ h

1 V3 ^1 L. q3 v9 Z$ L
  1. /**- G* H  c# b, q$ W2 u# W- f
  2. * Логирует количество загруженных квестов и скриптов.+ k( G7 a$ y# f: q! \: |3 _8 _
  3. */' ~0 ^7 u1 }7 w3 I9 y% F
  4. public void report()
    7 M* z  ?2 I& @7 j8 G- K
  5. {7 [: R+ l8 H- l1 i  a- o) k- r
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");$ e; B0 J% q/ e: d# [
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");* h; Y- z- w$ L4 z
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    8 v9 q7 U2 Q" q0 r2 \
, p3 e& j: j0 B& V; z4 U0 I% j0 B
Метод getQuest(String name)' E0 F0 f5 `$ g  W% ~

  ^" |& F& U% @; @
  1. /**
    3 u9 W' Y& W2 `6 V5 C( R
  2. * Получает квест по имени.
    5 P0 K* d+ G. c* U9 O+ K; c
  3. * @param name имя квеста
    2 \: _; ?2 K0 Z' s
  4. * @return квест# S$ c( K" M! G5 X) g) |
  5. */' @* i/ z' K- v$ `2 _# I
  6. public Quest getQuest(String name)( U5 D. ~! I& d- l0 ^" l$ w7 p6 h
  7. {
    7 j: A. K! \) }# I
  8.     if (_quests.containsKey(name))
    $ p* D# {2 }1 z9 K/ @
  9.     {
    . H# X/ N1 K; N/ b
  10.         return _quests.get(name);$ _* I: D! B% b0 A
  11.     }! @$ y1 P" y3 U9 x5 E* o, c
  12.     return _scripts.get(name);$ A! \5 s; x( ^
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    " m. X# F$ X; u7 z7 }) t8 {  z
/ T! s1 r! D2 e3 J) Q" R
Метод getQuest(int questId)8 Z7 J( `( D- x
& |8 h3 u' A2 P3 r
  1. /**! Q4 H# q9 g4 ]" ]( P! @4 q6 X. z8 P
  2. * Получает квест по ID.2 E* T9 N6 [+ G: S5 ^$ a
  3. * @param questId ID квеста
    * [3 q4 Z1 s. \& `
  4. * @return квест, если найден, {@code null} в противном случае
    9 f) ]. W1 E* s- O! l
  5. */% L8 S; ^5 I; g0 A' b
  6. public Quest getQuest(int questId)- q$ `9 a+ f" P, {8 c
  7. {" q3 t9 b2 F! g, s" F/ q  b
  8.     for (Quest q : _quests.values())+ a8 Q- i" N' V7 w+ F/ e" {5 ~
  9.     {3 |% w% M, |! b" j% Q) X
  10.         if (q.getId() == questId)0 _' t, ~: F2 E+ B- U$ y" h  ~# x
  11.         {6 c# q; R" I- L: b. v6 {3 Y
  12.             return q;
    ( s- o5 y, S% ~6 Y4 F$ z$ N
  13.         }
    . r) Z0 O  U2 ]$ I5 \( B9 i
  14.     }. ?/ A. S0 ?/ K! r* o( N/ ]# U
  15.     return null;( E: D8 t" p3 `- M& N
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.2 l* e- Y& d! }3 p
* @3 \/ |/ X: F2 o$ o9 Y8 ]
Метод addQuest(Quest quest)# a4 X* E- Q' l/ _3 x

( z1 u- |( V* T. z5 G/ f
  1. /**
      z; Q8 y& E' W% i9 B0 L" c3 o& }
  2. * Добавляет новый квест.
    * w' X- s) ?- _  X$ i( @
  3. * @param quest квест для добавления* X- v! {; `& B
  4. */
    % o. K3 p' g) d& c4 K& u2 q; D
  5. public void addQuest(Quest quest)
    : s  y; }9 G, w' Q5 f( A5 G0 q
  6. {& P: Y( \6 a; {6 Y! F
  7.     if (quest == null)
    % P! |/ g2 D6 n
  8.     {
    1 n6 m: X0 T7 u, f! }0 @6 L
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    # r% ~; ?6 X. A0 n' j: W2 X
  10.     }
    - m. E& [" m2 X4 U
  11.     7 H: [% ^$ M$ |, ~
  12.     final Quest old = _quests.put(quest.getName(), quest);
    2 }1 {& j* I5 B( Q# u
  13.     if (old != null)' I. c" ^6 X: V, H1 k; m' x
  14.     {6 [  C+ P7 [7 j7 u5 U, _4 N
  15.         old.unload();
    + l; G' `9 r. Z& v  _+ m
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 r: b  \: g4 L+ W
  17.     }, q8 P  }) O3 x5 ]. l
  18.    
    - K2 x! V6 l) N, I8 W
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)) q' k8 Q0 o. F) u5 r( @* N2 M
  20.     {( a9 a9 a% H2 X, w7 h$ Y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    * O' I, z! q, c% x5 Y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");# k. g7 e3 a& }: W
  23.     }" g1 K1 Y/ a0 i5 p" f
  24. }
    # z& k7 ~  |" p* d1 F5 Q! {
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& l( g# o, [2 F" m: m9 z8 y
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.8 x1 X/ S8 v! k3 r% H! A

: J' v: k+ g$ M. _# {& |3 l8 x1 b
& n5 ~# L+ o# O
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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