Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
5 S* t0 _- n( x& c- F2 ?
) R6 T! O- i# I9 dРазбор файла QuestManager.java* |8 W: F# F# L& R2 \+ o

+ w% o/ B0 z8 `4 @+ XЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
) k# A9 w; s" KОсновные элементы- W. ]& z8 J- e* [9 p/ L
  • Лицензия8 H% v( K/ e5 J/ E
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      4 O" Y# U9 U, S" E8 s$ |  \# _7 f
  • Импорты
    2 m) f( R6 U4 C$ P0 e

% J# _) y+ o9 G5 WQuestManager.java — управление квестами и скриптами.* W% m# N5 ]' p0 C: E* h2 K
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 }6 @+ n( P7 l$ b
  {+ }% |- b) T: m

7 f- ~& _' n( `7 s9 ?4 M, g  sДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
1 f  K# f5 b- z) T% `1. Лицензионное соглашение
, M+ U  s+ V% R; Z2 C$ E
  1. /*
    ) ^* B$ S" x& p2 U6 w
  2. * Этот файл является частью проекта L2J Mobius.
      i" H5 }: l* I" ^1 U+ d
  3. *
    . L- X/ h, l* [; p4 R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    * F1 r* v8 g/ L) @9 f
  5. * её в соответствии с условиями GNU General Public License, опубликованной
      e  a4 n! v; c+ y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    / W5 C7 @5 e, \
  7. *
    0 q0 i% ?" W  \
  8. * Эта программа распространяется в надежде, что она будет полезной,
    3 i! x8 e) c0 N: K
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии; U# x! D) `9 f( z( H4 F
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    0 C# s8 j9 d7 ]0 D8 C
  11. * См. GNU General Public License для получения более подробной информации.
    9 B$ E  G' Y% w7 f
  12. *
    : a5 W% p& T  p7 ^7 _2 j
  13. * Вы должны были получить копию GNU General Public License
    9 m! ~: U: Q# H4 a
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ; a7 U% L) Q# x' i9 O0 x
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
: @7 Q5 n' m$ ]; P  y4 K  e( k" S# I4 a  s. `" ]

. u6 c( B$ U! l6 M* O2. Импортируемые библиотеки3 T" B' w6 X6 m. U

$ T8 O0 W* f4 J% O
  1. package org.l2jmobius.gameserver.instancemanager;) @/ f4 ~2 m1 [1 z4 a  |# \; ]
  2. 9 r0 N$ ]9 {* u9 H) F. H% M3 r
  3. import java.util.Map;4 M, a$ M5 {% r; G6 W' S
  4. import java.util.concurrent.ConcurrentHashMap;
    ( B- h' [1 S5 O* _% M5 ^- B
  5. import java.util.logging.Level;
    % k7 d& H9 M6 z  T6 [
  6. import java.util.logging.Logger;
    * x0 `( W. v: q1 U

  7. " G2 S8 d8 T) @! S$ }3 J' g. d. U
  8. import org.l2jmobius.Config;
    ! D) Q- h# G/ L& h
  9. import org.l2jmobius.commons.util.CommonUtil;) }  F+ {" |7 y' t% E* Z3 Z1 F
  10. import org.l2jmobius.gameserver.model.quest.Quest;$ n8 Y$ z7 r4 L7 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 — менеджер для работы с игровыми скриптами.
) \7 X) B1 H# n: _: k5 k/ [) s: m
1 v7 b. a# o! F# E- r3 A. Z2 K3. Описание класса QuestManager3 d% G1 a( z* ~  }1 w
  1. /**9 [, {6 @- H1 Z, p9 b
  2. * Менеджер квестов и скриптов.) l% w& \( h$ i( Z0 L  Y% |
  3. * Автор: Zoey76
    6 ]( \! G9 o! y  f" m- m2 F% k6 |
  4. */
    8 o& x% \* b" W$ ~6 [' F
  5. public class QuestManager
    3 K9 [; e6 U" |/ i0 W8 m
  6. {
    % L* t, T9 O% t& `
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    7 B$ E' h+ e6 r/ W3 D
  8.    
    1 G" Z0 X3 G/ K
  9.     /** Карта, содержащая все квесты. */7 q# z3 W0 u0 P( O
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: C3 w" q8 G0 |; v& }) c& n
  11.     /** Карта, содержащая все скрипты. */
    ' n' Y3 K5 x  i% m9 `
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    , ]8 v1 R0 ^5 o: {# \- b7 i& U1 v1 ~9 g# A
  13.     9 E8 V& E! k6 U/ E9 y  R$ ?
  14.     protected QuestManager()
    0 d6 ~0 B8 H4 w6 |
  15.     {  n% _' W, t- \. `9 [
  16.     }- Q; k* F4 a- W' P
  17. }
Скопировать код
4. Методы6 C# V( t  ?" k
Метод reload(String questFolder)
9 I! {% L/ O9 |4 J( ]( L3 l
  1. public boolean reload(String questFolder)$ p/ h! {( D1 b4 z& B& h
  2. {
    7 O, Y  J' j+ D: z
  3.     final Quest q = getQuest(questFolder);
    / \& \: j2 n8 f  l8 N6 N- |, r
  4.     if (q == null)) p  w0 h+ z1 C9 k: i$ I
  5.     {
    & @4 r! X1 P/ c- }7 Q$ l
  6.         return false;- A* t: ?6 F: T$ ?
  7.     }
    / ?" v2 t. i. K; w. @! X3 W# h- {
  8.     return q.reload();5 S8 E- J' a  Z2 ?! D
  9. }
Скопировать код

* ^  I+ h# H( h8 u4 a4 S/ v  O6 r# O; t6 D6 |$ _5 v
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
: x% n# X" ^- D( G5 j% MМетод reload(int questId). o# K$ ^$ U8 ]  r5 ^

. L! W4 A! M3 ~* S$ r9 O' G
  1. /**
    . }; }: i  [) o( b3 p
  2. * Перезагружает квест по ID.
    % j' l& f  y# V/ P& V
  3. * @param questId ID квеста для перезагрузки
    2 b& D+ Q1 g% l0 V' [3 n0 ?9 l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае- s- q8 R$ D: V4 K6 \
  5. */; I) Y. H- y5 \5 G5 {8 S
  6. public boolean reload(int questId)
    & W- |9 {. g, C+ i" @% u' T0 g  R9 C* e
  7. {; F2 i, J* r/ T4 W" F
  8.     final Quest q = getQuest(questId);2 R- t2 Z0 M$ `; b8 M* P
  9.     if (q == null)
    5 x' |8 d, M2 N( @
  10.     {
    0 ^  ]. N; _) D! m0 f" G: Z" A5 {
  11.         return false;- L% o+ v% O9 s9 Y6 [7 I/ ]0 V
  12.     }  {! V# J6 z0 o
  13.     return q.reload();. N5 c3 b1 m; H0 P1 O( v- p' R
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.  b9 @0 U6 ?$ i8 O: P, x

9 V9 Z: x9 f1 [8 T! w, ~4 [3 x& u. qМетод reloadAllScripts()
' H; b6 ]$ W( L
% `$ N# G( r1 l) Y+ R
  1. /**
    6 Q% [3 b& ]6 ~  F* t
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.; T" T9 y; |) ~& m3 C/ k! g
  3. */- R$ Y% u% D7 |$ t9 z3 [
  4. public void reloadAllScripts()0 C8 r% v8 m- ]0 a) l: {0 f
  5. {1 a. z8 g" R5 Z% _' n
  6.     unloadAllScripts();  D2 P, W' h2 o% E* w5 F
  7.     3 |, h3 @+ ]; N2 S% Z, ^2 J  g
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    , h* s+ u6 x3 K9 I
  9.     try1 o# H8 g: ^& s/ b3 R# I* j# d( H7 f" i
  10.     {/ g" C' Y% w2 z5 v. o2 V
  11.         ScriptEngineManager.getInstance().executeScriptList();
    % @$ w/ h9 b" Y  W( p- v- u
  12.     }9 h) e8 \, x% `  [8 Z1 J4 g
  13.     catch (Exception e)
    . e( H  R& w& \5 a1 v
  14.     {
    + V% s3 L. O4 A5 J- y' k! X
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    $ }* i* Q: a- Z( ^' Q
  16.     }9 u! D& J. V; G
  17.    
    " A7 C2 i+ b; A; B
  18.     getInstance().report();
    ' w4 e1 U5 _. b
  19. }
Скопировать код
Метод unloadAllScripts()3 p, k4 A9 O8 `' a  c% n

6 G# A) R4 X) n+ Q. D
  1. /**
    6 }, M1 \, D& q0 d
  2. * Выгружает все квесты и скрипты.
    , M$ y6 _2 L6 r* N' h
  3. */
    4 z( O8 b6 g# Z+ p9 {4 O
  4. public void unloadAllScripts()! _4 x3 p( y' K  f# U: r
  5. {. `- [: D: A# T. I2 L, a1 O
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");& m1 ]. O) d; h7 n: l! \
  7.    
    & m" x  |2 E; @: u" ]6 O
  8.     // Выгрузка квестов.
    ! a, P. Y: H# W, \9 `% D
  9.     for (Quest quest : _quests.values())
    + y: ^) _; r: [& Q( r0 g/ a! O
  10.     {
    7 G; p! D3 q9 d8 G7 _
  11.         if (quest != null)* L. L" B9 Z! X4 i8 s
  12.         {1 f" F  y! m  l8 G  w
  13.             quest.unload(false);  E* M& t, W% H) W& r
  14.         }
    ' |, r( H! K7 ~& W' g! i0 C
  15.     }0 `8 A; N. O2 n; W
  16.     _quests.clear();
    / g. M, ]7 ~) G$ U5 Y6 L2 l
  17.     // Выгрузка скриптов.
    " s' m2 H* {; \' }
  18.     for (Quest script : _scripts.values())+ O. l7 q- G2 `
  19.     {4 Y$ E: j8 b& D" p5 h# }4 M5 n
  20.         if (script != null)
    ' \$ w+ X! s0 y% S
  21.         {
    , s+ i% s6 Y0 w$ d: c- U# W4 n
  22.             script.unload(false);, t- s$ [& w4 l! W" M+ b7 o/ d
  23.         }
    5 C$ A. M  z; k* |
  24.     }: O2 I2 A7 D8 M! Q
  25.     _scripts.clear();
    ) K6 B# Y. m9 a/ [, E# P; N
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    1 B% W( B* }' ?8 E7 |. k

; L* B& h! o8 h& T, rМетод report()# f6 \7 a/ g2 o+ E- A

" `0 Q$ G2 m0 [: ?5 h. [0 T3 w- F! g9 p
  1. /**
    % r1 I  i: _" T& w. }2 U
  2. * Логирует количество загруженных квестов и скриптов.
    % a5 C4 _4 ?" P2 z: |% o
  3. */
    ( g* e5 P: h) ~9 Y; F# P
  4. public void report()7 u9 B5 r6 X% O' [; ]- B
  5. {* Y0 K( d! F$ D4 A) d& R
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");5 l3 g' ~0 b& h4 I, B2 B
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");9 C" k3 j, n5 i; [0 g
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.% \- M1 S2 A& \+ t0 \, b4 m9 _
9 Z& }- g5 L; J* }4 b; j
Метод getQuest(String name)
& ^( |9 ]2 x' S1 s) b
8 ^3 _# L9 k' E; B) T& j4 t' D
  1. /**
    ( m/ d( z" P4 P/ M' U7 M
  2. * Получает квест по имени.. p/ \  f7 M- Y, B$ M% k- X$ V1 }
  3. * @param name имя квеста
    : S) Z( q5 V3 E1 d. p- N- o
  4. * @return квест, s& l% O7 J/ b/ _/ D9 W# R" b) Y! s
  5. */: {7 ^3 U( Q  V
  6. public Quest getQuest(String name)7 Q! Z* h) K5 `  T+ L
  7. {6 x* `) D! D7 M1 F: f" x5 Z/ o( Y9 p& C
  8.     if (_quests.containsKey(name))( d+ a) S6 \+ r# v, k; y8 M- z; `
  9.     {
    % C+ L7 e' ^8 g, m' M) e1 [
  10.         return _quests.get(name);
    ; A; K, Y; R, e: A% U: J
  11.     }
    ! ?  e" v' I, s; J$ O, n6 r& {
  12.     return _scripts.get(name);
    5 o" t# Y2 x) Q2 w8 g
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе./ ~. U; [/ b( \( N( I9 @. B) @

0 }1 u$ _: X. |' b" g+ sМетод getQuest(int questId)
; {) Z- P9 l" Z& K  K
- g. x6 a6 D6 i" K' G9 r0 z  a
  1. /**# [" |' h" C. X/ [; v2 i
  2. * Получает квест по ID.
    2 Y7 {+ f6 O" v6 W. H9 r; C6 w
  3. * @param questId ID квеста
    ! V/ W( B# V: l4 }
  4. * @return квест, если найден, {@code null} в противном случае
    9 J2 q. }" s, B5 w/ D/ H# x
  5. */6 |+ C1 ^, M1 C8 k2 C$ k) X
  6. public Quest getQuest(int questId)6 {  d: L  \: h0 n( ?# {( r
  7. {( i, I$ R2 h2 q  H
  8.     for (Quest q : _quests.values())
    # d6 I2 H6 c7 Z6 ]5 J: A
  9.     {
    * [5 a" q$ T6 @6 `0 ~/ d$ ?, T, i
  10.         if (q.getId() == questId); i* G2 p- M5 P9 E- L+ v6 o
  11.         {
    + g  I! D! P  J  s, D5 V
  12.             return q;/ E; z  c/ A; u, S+ A5 v
  13.         }
    & J4 N0 [" W* t
  14.     }
      M0 i- y0 S  n. x4 i) e. j
  15.     return null;4 Q0 M, R( `0 k8 C% H8 T/ s3 d+ b
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    # A% N- W3 V, a* b0 P: `

6 F6 a: r+ u) f% A/ kМетод addQuest(Quest quest)
8 V' X) B; @' C
6 I. t" u( ?; i( m$ t$ b& }
  1. /**
    8 @" K  E8 E$ t7 I4 g* R' D* F
  2. * Добавляет новый квест.
    " k1 S2 l9 N5 i2 S$ r
  3. * @param quest квест для добавления
    $ Y. H# K- l- K' p. W5 c
  4. */
    8 p. D) P$ j. N. z0 \6 H+ K4 E
  5. public void addQuest(Quest quest)4 e7 ?; i7 Q0 T; }% v4 W
  6. {
    7 h* H# V4 v! u8 _$ \9 v+ Z+ O. H  {
  7.     if (quest == null)
    6 Y+ N. x; n+ v. m. n
  8.     {' A4 G7 y3 Q* I+ J7 m  E
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    & T) D/ I; Y6 v- Z( \0 j4 I: T: k
  10.     }
    0 l4 A4 ]# w) J
  11.    
    & z$ M1 A7 ^6 x7 e1 {9 i. c: T# T
  12.     final Quest old = _quests.put(quest.getName(), quest);: k8 ^7 M8 ~% c( N9 P, P8 K* t
  13.     if (old != null)5 o4 Q, D" b( `7 ^& E3 j3 S: S- F
  14.     {
    % W! v* d" V" c  f. M% f7 y5 N
  15.         old.unload();5 a: n/ x4 g: x6 v% T, R0 y
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 X! i( p2 A( S; w" t& ~
  17.     }
    3 j; {( a- S" n" ~- \+ C
  18.    
    8 V9 A" L4 e( a3 X
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)3 O+ Z1 f- B& V! U  E
  20.     {" F9 J8 Q: U$ c# I
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    5 K9 M* _' c! L8 I5 @2 c
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    $ f  x' b7 x7 E! |
  23.     }& A- ?7 y4 S2 C
  24. }+ Y4 {& w/ @+ P" M6 P1 m
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.) w/ Q" h( G! I* o, u
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
$ a3 U; f7 V2 J$ u$ D6 ^; E( Y) g6 T

5 v0 y& ^; X: r; {* o& b6 q9 Y9 F. H: D2 i& {0 w. i
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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