Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 u* ?. P8 A7 B

& E+ V& b8 `3 ]% |! }; v0 VРазбор файла QuestManager.java/ ]9 H( K" z7 ~2 ?) Q1 ?. b
3 {. m( S+ m! P! M* }0 D- M
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
+ h' a( E, ]. J  Y* l8 iОсновные элементы" _- D  r. C3 L6 h5 D  }
  • Лицензия
    8 e& y0 [: K; u( L" j# ]
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.# _' s" z+ k# u4 I4 P9 ?
  • Импорты& b6 T) C- ~1 |% W2 Q$ K5 a3 S

: Z1 F* J$ g2 n% lQuestManager.java — управление квестами и скриптами.
3 I8 b, W1 x- b( GПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
7 X% d. P. m' O8 X; U" z
- Q$ g; z, _; S7 W- R% c0 H4 R
2 T. X9 l' X) |
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.3 [7 ~- G9 s5 i, _- t* [0 c
1. Лицензионное соглашение
% p, E: `- K! o8 P0 h/ V
  1. /*
    ) \; B9 j' f, x7 Q& r( o5 a
  2. * Этот файл является частью проекта L2J Mobius.
    , c/ N, |! o  P
  3. *
    , H& n+ f3 X, _( P; [
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять3 s3 |/ x/ |6 e
  5. * её в соответствии с условиями GNU General Public License, опубликованной7 T0 V5 q: B8 a5 u
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.. }( J& Q2 v/ |: ]( E
  7. *
    % B2 j& b2 @9 x
  8. * Эта программа распространяется в надежде, что она будет полезной,9 d/ @1 Z. c- f% {! Z, q
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    2 K* x3 s" m3 n% T2 @- c: f3 `
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 H9 Z+ b8 |; Q% i
  11. * См. GNU General Public License для получения более подробной информации.
    # v! \4 u! C& f
  12. *
    % J9 E+ a. t3 N
  13. * Вы должны были получить копию GNU General Public License: f0 W; _6 l+ Q2 {# x+ l
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 K8 y+ e' V2 O$ S& U! m
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
9 M2 T3 W" v* l7 n- ]/ W- [, ~7 C6 n4 \2 J

- b: r  M/ P; N! U' y2. Импортируемые библиотеки  i2 S  K- A4 b9 B+ j5 b
" x$ a) t- q# E
  1. package org.l2jmobius.gameserver.instancemanager;- @& J0 d" }! I3 y) s. {
  2. 6 {" w& T2 i. L  W0 I0 m9 E2 e
  3. import java.util.Map;
    2 m; [+ x+ c: b2 t0 `- h0 n
  4. import java.util.concurrent.ConcurrentHashMap;
    - c/ I- T1 b0 ?* s5 l
  5. import java.util.logging.Level;
    + z! X! ^5 ]# I
  6. import java.util.logging.Logger;
    0 i0 P( w4 s9 Y% ^: N7 i
  7. ! N, b! T% B) c) ]' f9 S
  8. import org.l2jmobius.Config;
    7 z% H+ U% H, q& B
  9. import org.l2jmobius.commons.util.CommonUtil;# D8 S" n* E/ X8 X. \& s
  10. import org.l2jmobius.gameserver.model.quest.Quest;* P' T: ]/ E  e4 }' W7 {" t+ v* I
  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/ E- \  K3 B: D
$ S, K8 o& Y5 ^3. Описание класса QuestManager6 s. c+ Q/ d1 d+ n) E2 ~5 ?
  1. /**6 w$ M8 ^* d6 p$ Z, m" b
  2. * Менеджер квестов и скриптов.
    , l! ^) i) C3 _  ~1 u$ y
  3. * Автор: Zoey76
    3 a" _$ I3 M. V3 P( V7 C- A( j+ d- z
  4. */! H6 R2 u  B# @6 b* g( s
  5. public class QuestManager
    ( y; W! H* H) a6 r) V2 q+ k
  6. {
    ( Q, {- @# q8 u- @; q' B) M
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());2 d" j' R  U# L5 m9 G/ ]) S. K, @
  8.     8 o3 S& M* U6 u1 b% h" n9 @' q
  9.     /** Карта, содержащая все квесты. */, \) j, V& @; N
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    5 \- o' y) C$ O) C& r* X+ a
  11.     /** Карта, содержащая все скрипты. */
    2 D% c" \' o  t% i+ g- |2 i' \
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    # y8 x! F# s: Z' A& D% k. b
  13.     " `* t  H) C- ]6 z  I6 n
  14.     protected QuestManager()
    * S8 K  f" P& ^  E
  15.     {
    ! |& D7 k! v9 y! r9 R' R9 w% v
  16.     }: `1 a, s( h7 v% C
  17. }
Скопировать код
4. Методы
* \( r1 v' l6 _& JМетод reload(String questFolder)
) U" S8 F9 M9 d6 p4 b
  1. public boolean reload(String questFolder)
    : F& f4 J2 p9 D
  2. {+ L8 B: X) n' R; |2 _% v5 @" n
  3.     final Quest q = getQuest(questFolder);9 @8 `+ v' g, x! I3 h7 t
  4.     if (q == null)
    : u( u2 m4 K1 Z: ], y9 _% }( w
  5.     {; N  a. K6 B- Z
  6.         return false;
    , L+ H- ?8 n  C3 Q& z
  7.     }
    + N; `: X$ s. Z% T
  8.     return q.reload();# w. F* l9 `' E9 F# ]# b: }
  9. }
Скопировать код

% ^) P, }/ u- |2 B  t" {
6 ~3 e6 ?6 K- h! m1 yМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
0 |* m( v; W# h: b6 j2 D* qМетод reload(int questId)& d7 O! i% T, i: D2 ^1 F- t# k
$ f, V1 [, \- T4 {& n  ~9 p
  1. /**
    / Y, V  ?+ {6 D# z5 q# m- m+ z- u
  2. * Перезагружает квест по ID.3 m0 U& G$ d2 a" p* R# o  D
  3. * @param questId ID квеста для перезагрузки
    3 L8 Z& V) F  Z4 J; f& a
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    2 ]9 O' o0 Z; }. d1 l1 L: q
  5. *// A: J2 K" R( T/ D2 N% ]$ e# A; M
  6. public boolean reload(int questId)! n2 I' a) R8 E: q9 a' }, D
  7. {3 f+ e5 j: D9 |, {
  8.     final Quest q = getQuest(questId);" S. \. G* ?. a! \3 ^7 A
  9.     if (q == null)
    % h* z* A) Z: r3 e* B+ `4 J- j
  10.     {
    $ u/ x1 _- l" U' w' U, U
  11.         return false;6 L& [+ u& T: E: K  a8 S2 e
  12.     }1 d) d! c" T3 k' {# n8 D
  13.     return q.reload();
    8 I' p% j! ^& I- a( q. y$ v
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    , @6 ]$ P$ ^6 B3 v# q5 P

- x( B% D/ p$ h# aМетод reloadAllScripts()2 l  n" a, Z5 x: c/ {. L+ r! A
. Y# D, h5 ~! S3 @3 q! ~" [
  1. /**
    6 [- S) Q" N4 r5 f1 h
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    + A! r: A" i9 W8 }
  3. */" o# u, {9 V: B4 y% V
  4. public void reloadAllScripts()+ O" l! s" y  M5 e% t. s
  5. {- W4 S0 k5 C% B5 R6 m/ d( C
  6.     unloadAllScripts();" G1 w) N+ J2 W: T( F/ y2 t1 \9 Y( Q3 b
  7.     . S1 r( b' U, ]* `  u% j  a
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");& {6 }3 A7 w! G" k3 t
  9.     try
    5 {1 [* I+ v  t" w
  10.     {; O' M; w; `0 Z: z0 c
  11.         ScriptEngineManager.getInstance().executeScriptList();  x" f  y# \8 K7 F9 r
  12.     }
    0 c% f/ B" S) q& M
  13.     catch (Exception e)  r9 q* L! b5 n% z9 A/ h
  14.     {
      R3 \3 c$ y9 M: V) K2 h
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    5 b" j$ J3 G7 d+ v5 ?$ c
  16.     }4 D' g6 w* F' x
  17.    
    % u1 F. q! Y1 r: b6 e( S
  18.     getInstance().report();
    1 H3 Q$ t8 G' t
  19. }
Скопировать код
Метод unloadAllScripts()
1 J" T# h6 b1 r. |' E. V# [$ q* v$ L" |5 S; E# ~6 ], i0 l0 v  \/ K3 Q
  1. /**& j; K6 j! h8 l# Z6 l! `
  2. * Выгружает все квесты и скрипты.
    + `1 S" L7 ]" k$ F7 y# k
  3. */
    - w. \( W& X8 n) L5 P, N% E9 _
  4. public void unloadAllScripts()
    ; G$ t/ X0 e$ ?5 k7 c
  5. {8 u( R. P4 _; V1 \$ {. S; @
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");% F/ T9 f! N' }+ `  @( @, V$ W0 U
  7.     - y8 p& w* P5 X& t% E- r& M
  8.     // Выгрузка квестов.
    2 b( _/ @4 Z# X$ y
  9.     for (Quest quest : _quests.values())# h8 H# y8 }# `5 r) ^
  10.     {
    # Y3 J7 r! B8 p& F  D
  11.         if (quest != null)6 g2 |/ I& v8 ^3 l" W+ c
  12.         {% n# S- M+ }9 y+ d% x: p$ `2 T
  13.             quest.unload(false);# f3 r8 I+ y; ]+ n4 @
  14.         }0 M* F' Q+ \' L$ B3 @+ c
  15.     }: \6 A" K6 ^1 Y. k0 m
  16.     _quests.clear();
    8 U6 g0 E" M2 g4 C& b9 I4 V
  17.     // Выгрузка скриптов.
    " ~  d: ^+ b/ H# Q, ^+ g( i
  18.     for (Quest script : _scripts.values())
    ( X. z  K& o/ U" n3 O' k
  19.     {& X# g) s/ Z1 @2 ~
  20.         if (script != null)' v3 n+ h6 w. m+ O+ A9 w+ I- ^& n
  21.         {
    4 K: S# d6 Y& m' C3 B4 |; O& z* t: ]
  22.             script.unload(false);
    * z5 t" a7 p6 ?! v1 ]5 w" @
  23.         }
    0 d2 d1 x7 U0 D- D9 p
  24.     }
    % h9 S$ R$ u& _/ J& q
  25.     _scripts.clear();; y! ?; o3 w4 p" X$ l# [/ r3 X( g5 q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    / x( x5 P3 j1 A; r% |" L- Q7 \& z
$ W; P# {% P& f8 b! J# v" ?
Метод report()
/ m. n, q7 q4 g0 m; y7 i8 K/ C( h- V/ g
  1. /**
    . Z- o8 T. b) a8 j9 \
  2. * Логирует количество загруженных квестов и скриптов.
    / M7 ^' P! c" f8 k, F# X3 T! b
  3. */
    : o0 D5 h5 F/ n( q
  4. public void report()
    8 f0 }8 X0 f& d8 @  n0 [
  5. {( _% [2 ~* x# A: w4 b
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ; ?* |) E( B- y
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");& b( L0 T1 I  w8 }
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. e- I# u/ K; t3 x. w2 g
9 u3 D( s) u  B  `& b& r
Метод getQuest(String name)3 ~! W" ]2 y7 }, S; N
$ X; z, Q) @% m' P% v5 a. j" g8 u
  1. /**. u' J3 l# N2 s+ Z: ?: U: T# J8 A8 H
  2. * Получает квест по имени.
    1 X2 u7 @4 u. `$ Z; @6 c
  3. * @param name имя квеста8 y' K: M: B7 n7 ?
  4. * @return квест
    + Z% u* D( L$ K, Y, }1 A# V- T" z
  5. */! v9 s3 G. i& S& X) N! ]: ~9 O
  6. public Quest getQuest(String name)
    4 C( I, Y) m; W- W# ~- A, J! V
  7. {
    / i7 O3 v$ N( x4 [
  8.     if (_quests.containsKey(name))0 W9 u; z. b  l3 w2 G( K
  9.     {
    / p2 `1 `1 H* d& i* g( K
  10.         return _quests.get(name);
    & }! J* J( i: W- o
  11.     }
    - H4 f8 A- j& o" w
  12.     return _scripts.get(name);+ o+ \0 w6 ?6 S- t( D/ ]% q9 \' m" @
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.0 E. ]4 F, ]  c5 U

2 w# X- k* e  \( T* o+ PМетод getQuest(int questId)
( E4 E( N; v* f" [  T. R" O- ]9 b0 E) j9 l# ]" H
  1. /**
    ) P$ S1 g" M7 X( U' X: u9 f" F
  2. * Получает квест по ID./ ~8 ]' q4 D) W1 [: b! H6 N
  3. * @param questId ID квеста
    + B7 K) R3 |+ ^/ i, o8 l  b) [
  4. * @return квест, если найден, {@code null} в противном случае
    , g7 L+ k4 J# V6 z3 T! _/ i" |6 [
  5. */. C) v4 i: k8 q* k) B
  6. public Quest getQuest(int questId)# G* V  w2 G* ~. M7 @
  7. {  g! l( ^6 A0 ~' |5 O+ O1 z4 e
  8.     for (Quest q : _quests.values())
    2 q# l6 l: [! j& W0 c) |5 r
  9.     {  N, q  Z! {* u7 r3 G, m# X0 w9 @
  10.         if (q.getId() == questId)2 D' O  w( q. N/ N
  11.         {1 f+ Y: s" o0 }9 C
  12.             return q;' P. o7 }/ _" o. z
  13.         }; X2 C- k6 ~- e, u! V$ a, Y8 y! X
  14.     }! a& I1 E3 y8 K( S+ ]" X/ [* i
  15.     return null;5 v% A) d2 {, l, [
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    # P) X; E' Q# W1 t0 j8 \

0 N& W2 z3 [' XМетод addQuest(Quest quest)
/ E: i+ c9 J3 q% u' o& F* y* P+ B% |1 p; l1 S0 b! M5 i
  1. /**8 u3 y! |, [% C' N" W- Z: J
  2. * Добавляет новый квест.
    " R7 ?  E# Y- j( ^. |- e8 m
  3. * @param quest квест для добавления
    " j0 P6 R5 [$ M
  4. */* u8 I3 ~9 U: a! b$ u
  5. public void addQuest(Quest quest), R* ^: [6 }% A" k
  6. {
    % H& M) ?4 |/ }" N- P) c/ ]# x4 G
  7.     if (quest == null)
    5 s8 W" [! @" V; w% f5 _
  8.     {
    3 O/ n, J3 d% f. D2 U$ {
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");+ _. X& H+ Z2 O: c. U' l/ q
  10.     }
    # E1 C* i& b8 m
  11.     9 M9 ], W, l4 [) ?
  12.     final Quest old = _quests.put(quest.getName(), quest);& A/ x6 e* |8 ]$ l
  13.     if (old != null)
    # ]' X* S0 Y  R
  14.     {$ O% y1 {6 d$ n" X) _2 J; _9 x
  15.         old.unload();& I1 s- A8 a* Q5 {( a. n
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");. u$ N3 r& w$ ?' S0 S
  17.     }
    5 h9 n! B4 A$ ], X# p  ^
  18.    
    6 k8 _* l$ N2 \0 I7 X' q- X
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% _/ F+ z' d6 |$ `
  20.     {, [3 i# S* o+ m( {! p
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();" \! _, z6 p/ @- H; r$ C. ?
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    6 J4 d8 O" Y8 m; q+ \
  23.     }
    + B' ?+ T' X3 X, D3 `! }: H
  24. }) I& V; t* G$ B0 I& @% x( g
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
0 \5 w$ }* S6 \+ ^ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
( V. ~( R) l. \; K% M- o' d+ ]# V2 ^& h4 g* W
/ I8 K1 T4 B) y' u9 C" n+ j
4 S$ L; m5 t$ Z5 @
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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