Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! F5 M. j( y( v  {  l
) z- T' N! Y/ }# e9 D9 ~2 o: I8 h5 |1 B! Z
Разбор файла QuestManager.java* \8 K2 d( h# d4 }- ?( Z

5 V# y7 O. V; w- I) Z% V2 [, ]Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.2 k( w/ n' p, I6 I0 \- Y
Основные элементы* n8 R3 \7 V' K% @
  • Лицензия" A0 q! A" {3 W% r& G  X
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.& J# n5 g3 \- M
  • Импорты
    + A( s( \$ a1 C
. O& N% ]5 ?& S0 C1 {
QuestManager.java — управление квестами и скриптами.3 I& \; h7 S  {6 y3 i6 |& y+ A
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 |  M+ E1 ], m9 ~$ B7 K" z! l9 `: a0 U
0 E8 ]4 i  {% e9 r. [" q
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 K9 O- E7 S, O+ H6 q1 ^+ ]
1. Лицензионное соглашение4 p% k$ e* u- R0 `
  1. /*
    + n, |8 o8 w  {+ [) Q  @
  2. * Этот файл является частью проекта L2J Mobius.. b3 b' L7 v& F' u. F) }- b
  3. * ! w  D* V# T* }
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 i; P; }  p: A
  5. * её в соответствии с условиями GNU General Public License, опубликованной5 r9 |7 X, ?+ G* X0 u/ b& V0 B% Z
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.; E# S$ G. b- e
  7. * 6 e7 _$ h! D, g# {
  8. * Эта программа распространяется в надежде, что она будет полезной,% z# b& E' H0 B3 x0 a* V
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) O4 h8 ]" ]+ I
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    & q0 c  [& E+ G2 u
  11. * См. GNU General Public License для получения более подробной информации.( M: A0 M; d1 p" M
  12. *
    + X7 u8 Q7 y5 g3 f% o1 _. T
  13. * Вы должны были получить копию GNU General Public License* j1 {' m5 F* P( `7 b& P  B
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    - H! E' Q6 Q; P; `) t4 O" J
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.0 W' E- Z6 ^, f/ B$ O/ U
; f9 \2 N) C2 k% ~( P4 c

" m/ x) @  T/ E* @4 ]2. Импортируемые библиотеки% D7 s) k) U3 a1 B

* R6 o& |+ x% h1 L" X5 F; @+ V
  1. package org.l2jmobius.gameserver.instancemanager;3 @: L* P, e. G; b! ]$ x0 M

  2. : o6 w5 U) f8 C6 Y. `
  3. import java.util.Map;' S6 b/ G7 ?3 {1 n3 w1 z; ~3 q
  4. import java.util.concurrent.ConcurrentHashMap;
    8 k$ \6 c& b; q0 A
  5. import java.util.logging.Level;
    % s$ l3 S: k' x- _7 z% C. |. W
  6. import java.util.logging.Logger;
    4 F* v# h- S9 G
  7. " r- T" v  k5 Y5 O  f! O/ g3 A! G8 z
  8. import org.l2jmobius.Config;/ F8 Q& c* e( }, K3 x$ e7 u7 Q
  9. import org.l2jmobius.commons.util.CommonUtil;
    # v3 v7 e% I. C5 |" ?- F" K
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    $ A  m$ V3 u% [8 X1 Z
  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 — менеджер для работы с игровыми скриптами.0 i# N+ K7 F7 w" t) i
9 E' b5 @/ E* l5 v
3. Описание класса QuestManager
# w$ ^, j! a- n, U& r7 i
  1. /**' ^$ g3 Z; c( {  R/ \
  2. * Менеджер квестов и скриптов.6 v0 d* x- x" x& D4 P4 A+ K% m4 I9 p8 U+ |
  3. * Автор: Zoey76
    3 c+ o  f+ [4 p% B3 e
  4. */; d+ ?9 b% M2 ?: Y
  5. public class QuestManager" e/ j" K( y% E( L4 @, b; [
  6. {" G+ y- ^( F0 ?0 o* s
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
      u" E+ T/ O/ X
  8.    
    & d* s5 r( p2 p  \) j8 t
  9.     /** Карта, содержащая все квесты. */
    ( }0 {' I. n) z+ ]8 h* L+ @
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ( F$ t- M# b# B# ?
  11.     /** Карта, содержащая все скрипты. */
    1 A( X/ A8 q8 i# E- P) k
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : F/ r7 [6 g9 Z& r! Z3 M
  13.    
    7 i% Z/ S- M: D+ ^, k- p3 H
  14.     protected QuestManager(): B$ I& A* z# M; ~# l
  15.     {0 x, @' K" |, e; }  z' F2 U. P
  16.     }
    / p3 F+ ?, e2 T9 D1 _- i/ W
  17. }
Скопировать код
4. Методы- ~: V+ q6 ]8 _4 c. J
Метод reload(String questFolder)# h) {  a) F* q/ ~$ V' S% u, ^
  1. public boolean reload(String questFolder)
    9 K9 Q$ N; S# R* t+ p: q
  2. {
    % c4 |" N/ B- Y3 l* R1 p
  3.     final Quest q = getQuest(questFolder);
    - P- V7 X! D3 ~( O
  4.     if (q == null)5 q. D. g! Y9 L8 {' C1 d; A* F  ~
  5.     {% m  W: j) P9 I
  6.         return false;
    3 @0 F6 S: @. N
  7.     }
    0 v! Q1 @! F' s1 N8 K" c
  8.     return q.reload();8 |+ y3 V1 {) Q+ ?$ K
  9. }
Скопировать код
0 H" Y5 E. j7 E7 h; z+ B" @' ]
  c! s2 b. m+ g4 _1 _$ u
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( H9 G- m4 Y9 I2 a4 u, }
Метод reload(int questId)
& B& N7 v3 E9 T9 Y2 R
9 {: L4 C7 D0 {$ j" A
  1. /**
    ; `2 N/ e( }, O& w4 X# _" R- p: ?
  2. * Перезагружает квест по ID.
    ! N* j! ^3 a% {: `7 B' S3 S
  3. * @param questId ID квеста для перезагрузки
    5 z! k2 }  \1 l2 n. ~8 u
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае/ u5 q7 K* ?4 f/ Z
  5. */1 H( i1 b& m" V. d9 w" F
  6. public boolean reload(int questId)
    ( o9 ^5 y* r: l3 z  E1 h
  7. {
    $ f) z+ `! L6 K- }, r+ R# _, ]
  8.     final Quest q = getQuest(questId);% V  r' X- }& d9 t
  9.     if (q == null)
    * S' G' I: N, E: h7 r
  10.     {
    2 |( {" }+ L# t$ D. |4 N. e/ o
  11.         return false;
    3 f/ C; u) W3 `
  12.     }: U& }2 l& p; |' W& {
  13.     return q.reload();# J  @: ~* F7 `4 [
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    + F( ^! \% O* j  q  H! s7 F

7 g4 y* |- K! U7 w; ~Метод reloadAllScripts(): e6 y6 p0 Z$ r8 D) C' D& ?0 G

% p. v* J* c% b# C4 b% K" _
  1. /**
    $ C; e% C- G/ \, N7 E0 J; x
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    3 v: Q& i+ z" @7 o3 \1 \
  3. */' g, m6 r1 f: |8 d5 {1 d; I4 Y% U
  4. public void reloadAllScripts()
    / F: c: E; \. ]$ R- z; Y$ E! S: z: o
  5. {
      M/ p$ C- s3 k& A6 b. r0 L: i
  6.     unloadAllScripts();
    4 I/ f: ~' M4 Y- V. E+ m6 V
  7.     / _- ]7 N* t, f6 J, ?$ A' ?
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");( ~4 u6 Q2 X$ W# H
  9.     try# ?: [% F/ h6 Q
  10.     {4 N% S( ~+ Q6 N! X' q" N' J
  11.         ScriptEngineManager.getInstance().executeScriptList();
    / q. d; ^" t4 r  M7 ]$ ~* @
  12.     }, |8 s3 i) V7 g' y( b$ d& ?" ~% C
  13.     catch (Exception e)
    - A4 l' M% p) e  d' s4 k- {- u& ~
  14.     {: v9 W' @+ F: y5 {' g9 h8 P1 @
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);/ X3 m! A, E0 k1 k9 M+ W; Y
  16.     }& o) R5 E9 Q3 Y% @; O
  17.     6 [; x+ Z$ h+ X) u. Z4 t
  18.     getInstance().report();
    ! t& V$ s3 q! J6 ]% i- X2 f. v
  19. }
Скопировать код
Метод unloadAllScripts()! H7 C- j( n& ?4 V. f

: Y5 o3 L+ ^: V5 d( g* n
  1. /**
    5 R, B3 |4 W3 o; N! |! K
  2. * Выгружает все квесты и скрипты.
    2 F1 a7 d% n$ e5 ]( Z1 L4 M
  3. */
    * c1 B5 {! m6 Y0 k- ?
  4. public void unloadAllScripts()
    # m1 y8 A+ {& S
  5. {$ p6 n( K/ K* g9 |+ |" O
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    - V; W% z+ y8 N) A$ T8 q) j
  7.     1 d6 y+ ^( P( a/ u" @+ f. |( P6 M6 c
  8.     // Выгрузка квестов.
    9 C' v6 R, x: [& |+ @2 A
  9.     for (Quest quest : _quests.values())
    7 T% m* G: d9 O9 f: f
  10.     {+ c+ S" h- y. r9 X* |
  11.         if (quest != null)
    6 ^; U( }# {; V& C+ W
  12.         {
    + ?6 L5 d; u( u! e$ L
  13.             quest.unload(false);
    " v' y, S  @; ~. J2 o, j
  14.         }
    * \- D- H' }# ]! \. `- n7 a7 F
  15.     }5 H2 K. H" I- u; T% {; |6 P
  16.     _quests.clear();
    5 C0 {  [4 ^- \7 ?& V, h
  17.     // Выгрузка скриптов.& o% f4 a2 i" m
  18.     for (Quest script : _scripts.values())4 _! ~! N8 h. [$ Q
  19.     {& o( Q- y( C, C; Y- J+ i
  20.         if (script != null)0 U. n: I; M9 B2 s& H) M6 q6 B
  21.         {4 F  {2 d: I) F" z. f. i
  22.             script.unload(false);
    " X+ `4 @' l0 k0 l
  23.         }3 I/ V: z9 y0 ~: A
  24.     }& f# T/ b: q- K# t6 H; }9 x$ W8 P
  25.     _scripts.clear();
      R) i; R' [: J; N0 M; x' J3 ?
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ! V; G, f0 \' N& |6 z% ~5 c
* E' S' H4 }" |# T. c- L$ D/ y5 B
Метод report()3 |: _& P- v8 \; D

4 \# j& s: g4 w+ T* u
  1. /**- W3 @5 ?9 U3 C) |5 l1 c0 }" ^
  2. * Логирует количество загруженных квестов и скриптов.
    8 M' n. M& ?, u
  3. */2 n; o6 U  C, o
  4. public void report()1 Q! T9 L  `8 H3 y
  5. {
    6 L+ c4 Z5 h; d' N. l8 \' @4 [
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    0 O8 o; i  ?" r; y- ?
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    . ~/ \2 Z$ `$ ?7 o" D
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.: A. C5 Q, W1 x9 C) a+ C" o

+ D/ c/ n/ G3 n) r$ y( n& j# z3 mМетод getQuest(String name)+ Q) [) X; Z4 O4 [
( |) F6 Z' S6 T) r( o& T- W
  1. /**7 Z& [8 T; W7 I$ _
  2. * Получает квест по имени.: o6 r& I$ n( u5 p1 n$ \* \' j
  3. * @param name имя квеста  K, V9 c  i/ p
  4. * @return квест
    0 r4 b" t2 D# t7 C/ z
  5. */
    / h1 F8 g, t/ c. s; S
  6. public Quest getQuest(String name)
    # [& R$ Y' m; f5 `3 l
  7. {
    5 S! j; E- [* j. G! B: n
  8.     if (_quests.containsKey(name))
    6 f  s# Z) J9 n! K$ Z1 |* f
  9.     {
    ) A4 R+ o  T  S5 b  ?4 O/ p
  10.         return _quests.get(name);9 t% G+ V2 a9 c, F5 ^/ s$ N5 U
  11.     }
    % P7 m- u2 o. z: d% r5 {
  12.     return _scripts.get(name);+ r0 {' q1 z  S4 N1 ~* u5 W% q7 D' ~3 o
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. |% x4 I. B' |" ]* {5 r2 N
$ j- `/ Q" Y; o% P
Метод getQuest(int questId)
  Y- M/ \- B. K! n4 h3 r8 D1 m8 d  n; y3 Z7 }& P! C8 @9 A
  1. /**
    + i" \( ?/ M/ H" \: x/ q6 t, Y0 [
  2. * Получает квест по ID.
    ) M& d+ B/ Y# D- H9 A
  3. * @param questId ID квеста; Y% a; G1 O. k5 V  R
  4. * @return квест, если найден, {@code null} в противном случае
    3 j8 e4 H4 J2 g, |
  5. */- [( C9 K0 f- o: z. v
  6. public Quest getQuest(int questId)
    4 f9 ?0 `. Q0 B  G/ t
  7. {
    6 D& M$ n& @9 h
  8.     for (Quest q : _quests.values())5 Z, \5 E8 G  a; X8 ^- t
  9.     {+ V+ h+ }/ J8 ~2 Z: Q% ?. [  \
  10.         if (q.getId() == questId)
    7 c& _, L3 K4 ]6 w
  11.         {" W, |' j! U# e1 g- p/ G
  12.             return q;7 K! [4 E! j5 y
  13.         }: n7 t8 Z' ?" I% |. ?5 S" Y
  14.     }5 a8 R. `( F' y9 Q( T* {
  15.     return null;
    5 {) n& s+ s! t" o3 A& s
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.* Y" j' ~3 J% \, ]
" b2 P* a, R% J4 F4 }
Метод addQuest(Quest quest)
+ D" G8 N- L2 [0 q9 v% }7 X/ Y
3 j8 n# H$ D) M- K, h6 |7 a
  1. /**
    + g' }9 Q) Z# G7 O. O
  2. * Добавляет новый квест.% E( \& z0 i2 ?: o1 l7 R, k
  3. * @param quest квест для добавления1 V8 N' w) P4 p2 k4 H3 l
  4. */. Y" o1 Y; E* F9 N
  5. public void addQuest(Quest quest)
    ( Y6 m3 \0 J3 w4 e
  6. {9 O3 c7 Z& D! q6 f, ]+ l2 a9 c
  7.     if (quest == null); M6 M$ F& N2 p" Z
  8.     {  |9 x5 u  A/ R; s: B! [
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");6 r3 N# z0 @- P( B
  10.     }
    6 a) [4 Y, m5 E1 j* M+ D' h7 C- H
  11.     & o( q5 a! o: D! F
  12.     final Quest old = _quests.put(quest.getName(), quest);) I) n3 ^8 q# [) e
  13.     if (old != null)
    % t5 y! f) E. B) l4 O% @
  14.     {0 Y' U0 m9 |1 z& }
  15.         old.unload();
    9 r1 }* U1 e8 g5 |
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ( B$ C. Z# ^) d' @% ]9 Q  x- w
  17.     }
    : @. m5 l+ {$ Z, }8 U  t
  18.     5 ?0 R+ ^1 u2 o
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    & C, \! _" |0 c3 W
  20.     {) k' f$ b3 K/ T& i
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 d; P( V  i2 a* Y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 R- C3 E5 K! z9 W# w( o# O
  23.     }. Y/ L/ C" M5 l/ h- n- u* J
  24. }
    / G% i4 C1 g9 b3 @# I( ^6 P
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
5 a7 s  a3 a, KЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.2 K9 i5 A& |) M" u5 e

0 Z) o# f% O7 S; @+ _4 l) S; T8 T& i4 S$ ?: B3 U: l; |! J3 V

/ b  m8 C0 \' ~/ x- f
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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