Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius, \* k! t0 A6 [% q

3 t# C# d# K3 a9 e+ Z! MРазбор файла QuestManager.java$ j& L/ M; V% z6 s! @- \9 @
3 i8 c3 v  I" l$ T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
" j5 z, b1 t. N5 z) J% lОсновные элементы
) Z4 q$ e+ ?0 O/ [& D4 \7 y
  • Лицензия1 E5 {) |" i9 U7 C2 p! L$ f2 g4 a
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ( _: T* t3 \6 Y! _$ Y9 Z. q
  • Импорты% {, ?0 K; @- A

2 J+ x! s/ A# r9 x+ Y% JQuestManager.java — управление квестами и скриптами.& U8 x+ z+ a  I
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
5 g7 l/ J0 [+ u, G2 q1 n8 l5 h9 O- y0 X- x, ?. G: Q

- `& _0 m: t0 U6 _% XДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.8 Y! L* J0 B2 W7 u* \" T/ R
1. Лицензионное соглашение
" O# L# R3 E: A4 X
  1. /*
    # S2 ^) R1 R9 Q+ B+ }& o& ?
  2. * Этот файл является частью проекта L2J Mobius.
    3 ^2 r; K$ J# D' a
  3. * ( p; [$ [" P) g3 u$ s" F& d
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять* |7 I4 F' H; F% X- `
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    / P. t; e3 Q. ]: F& O) x7 |1 J
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    * `( `, d; g( G- g0 G7 Y) E
  7. * * k& P2 C9 F+ n( Z- u
  8. * Эта программа распространяется в надежде, что она будет полезной,/ K$ x+ |- {2 E; ?; B
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    $ n* j# z" O5 F6 i1 C$ ~
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.: ~2 C4 O8 q. l% M' e; x0 @8 }
  11. * См. GNU General Public License для получения более подробной информации.( R: l# j0 X. L4 R
  12. *
    7 ]$ Z( X' v9 H# J
  13. * Вы должны были получить копию GNU General Public License
    # {- R. }0 c$ |. V' G, l9 W
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    * E. y7 H  P5 v' G/ i6 b
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# a/ _( K9 g) q  K/ U  y
- a  f1 Z+ ]( F1 A# F, v

8 v2 d7 ]$ O( q% z1 t( U$ n% \  c2. Импортируемые библиотеки
' b  l  e# y, f
# k2 [8 [6 }! A* |$ |
  1. package org.l2jmobius.gameserver.instancemanager;: E, D( s2 S; z3 N8 T% r( z# D
  2. ) D- d) D! b1 I9 g/ _1 [
  3. import java.util.Map;3 z3 \+ c  d/ E! K  m7 F1 c
  4. import java.util.concurrent.ConcurrentHashMap;
    ! Q1 h; {# q1 t0 y) ^4 N/ U
  5. import java.util.logging.Level;
      t9 U3 |1 \9 h# C5 o
  6. import java.util.logging.Logger;
    ) D1 M; H( b" \2 ~" a" Y

  7. 2 b4 e2 R* A$ W/ n1 L# L7 H" G
  8. import org.l2jmobius.Config;
    7 T$ C& Q) n: D' f8 b8 z/ M
  9. import org.l2jmobius.commons.util.CommonUtil;
    $ l' V. S4 p1 T9 j1 ^
  10. import org.l2jmobius.gameserver.model.quest.Quest;4 c4 d8 m) q) T" r+ E
  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 G  T) M- {) @  F
3 y; l# l- b% _* l* D3. Описание класса QuestManager
( c& \- U7 p9 u$ n+ X
  1. /**$ g, V+ B7 u. b. \7 O
  2. * Менеджер квестов и скриптов.
    0 C' C8 M8 d6 p
  3. * Автор: Zoey76
    ; I. n4 f, U( P& X3 x& r
  4. */
    - L0 H* U6 T/ M; ~
  5. public class QuestManager' u9 P8 Q8 @0 d6 s; C) G0 ~) E
  6. {3 W/ l7 W8 d6 R$ l9 K( {
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    2 f% s; G8 [9 G6 e
  8.     1 p0 e, r4 v" E, v+ S7 o( o
  9.     /** Карта, содержащая все квесты. */
    , M( `/ b" I. h! F$ Q6 r
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();. f8 k: A. m: o
  11.     /** Карта, содержащая все скрипты. */
    & \# O+ m# _2 J  A. V7 i
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
      |; `, d! }. {/ J, P2 Q7 ~
  13.    
      j2 Q+ `/ a5 G8 C0 r
  14.     protected QuestManager()
    9 d+ B: a) i. P
  15.     {' l! r$ T" t5 ]% ]+ P. Z
  16.     }5 y) ~" v  Y( Y3 `8 u
  17. }
Скопировать код
4. Методы$ j( a0 Z+ m% {, l% c* ~. }# c# r
Метод reload(String questFolder)# o# V' b: M# D3 Q5 [
  1. public boolean reload(String questFolder)! \& S1 U! t' {& g4 Q5 S) Y
  2. {& K6 K9 \4 L/ d! a2 U
  3.     final Quest q = getQuest(questFolder);
    5 ]$ n( o* h- i+ o& r
  4.     if (q == null)# r* V8 b/ k( Y5 f9 i
  5.     {
    / Z& U# o* D7 Y% [5 E1 Y9 O
  6.         return false;! r, Y) m0 \$ N& Y1 N  N
  7.     }
    8 B- z1 p5 `* Q1 O' d; k9 M/ H
  8.     return q.reload();3 R, H0 r/ v' u: n
  9. }
Скопировать код

7 L/ \) D; D" {, J2 l' y9 o* Z2 A4 H. [* b1 B4 m, Q+ R
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& G6 Y0 q& K& \+ ^4 Z
Метод reload(int questId)
& ~+ W( Y) P, ]8 F6 j# U. ]6 q) Z6 u0 ~0 s: j
  1. /**
    $ U- `7 U. @" d. X
  2. * Перезагружает квест по ID.
    , b! m5 O; I8 s, z5 J# z* H
  3. * @param questId ID квеста для перезагрузки
    9 a; ?( s0 I. ~& ]; R6 i
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае. N1 a( R0 ?3 L# ]
  5. */
    $ S& i% r, q* z6 \  Z
  6. public boolean reload(int questId)$ y' m; k5 B& E6 L/ f
  7. {: @5 S9 n$ w; R, w
  8.     final Quest q = getQuest(questId);, [  Q3 z& H# l/ q4 }
  9.     if (q == null): Z' V$ L, X1 P& ?# K
  10.     {" x% |; g% [3 P) r
  11.         return false;* u5 Q. s7 m( o2 h
  12.     }
    ) E1 m/ z. R$ o; N" m9 d% Y9 {
  13.     return q.reload();
    6 F6 _! m+ }: h( D1 @; ?! c
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ! F; \, p' H1 i! l* I1 Z1 z
8 a$ A( [! m! |8 ^- u
Метод reloadAllScripts()+ h1 g1 p3 _. x% I9 O( l4 R3 z3 B0 {3 j
" V! Z0 a% s- b! |# |) i
  1. /**9 x: }( T& p! Y) v
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ' i" H. Q1 r! m% e% R
  3. *// m/ A) ?9 L! z4 t" V' u1 F
  4. public void reloadAllScripts()
    2 I. u% q8 B0 A. J4 j
  5. {
    0 G: |! p! _: \9 b" A
  6.     unloadAllScripts();
    " y( i) `! \! w/ E! x4 ~: x
  7.    
    6 H8 M; {9 U: a' C7 [2 ~6 E  _
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");" C/ B6 ~! s% h: ^
  9.     try; h( n0 ^& a6 n& c' W* g8 `
  10.     {' }; S! q: w' v' e
  11.         ScriptEngineManager.getInstance().executeScriptList();
    2 A4 Z4 I& F) [0 c( M
  12.     }/ U5 v) }1 p1 M8 S* ]! @1 o% S
  13.     catch (Exception e)
    ! n: ?! P7 v/ T+ P+ V* B' {: q1 @( G
  14.     {( z# Z) G$ Q5 Z9 [1 ?' H) f, `
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);# \0 e% @( \* W8 Y/ s& O# C
  16.     }1 `) `! M/ m( S) P# N
  17.    
    / J- T, k3 `0 [" B
  18.     getInstance().report();; T0 s% C8 B( D% l2 x: z( O
  19. }
Скопировать код
Метод unloadAllScripts()
; a- H) a8 I! M9 o! W" @/ T1 _
/ \" i- p8 G& r# p: q2 K* V- W
  1. /**
    + [! {- T7 r! m
  2. * Выгружает все квесты и скрипты.
    ; O6 L) S" r% A/ e8 B/ t1 d* o9 O
  3. */
    5 a2 S% }/ f5 Y7 [
  4. public void unloadAllScripts()4 {# }# S5 j4 a& X' r$ t
  5. {) B* X; w/ n' {% Q' k
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");% [$ @# `" G4 r( @( T
  7.    
    ' ?# \- {" ~: Z, w) g: X9 d
  8.     // Выгрузка квестов.
    5 N* e. ^6 P* P. Z
  9.     for (Quest quest : _quests.values()). |- ^3 f- [( u: l, F1 Z; @
  10.     {
    ' g9 {: ]$ h0 F$ H% S! V3 O* K# t; g2 ]
  11.         if (quest != null)
    $ y5 U" `& W3 i6 N; I
  12.         {
    4 a0 B- D/ ]. H' O
  13.             quest.unload(false);% Y1 \; G: I$ ?! r' E0 y- K! t; U
  14.         }% f; _9 j4 A; V3 V
  15.     }! V1 l( n+ G% r7 W3 p
  16.     _quests.clear();* m- o/ \. c0 Z8 _' [
  17.     // Выгрузка скриптов.
    ( x/ i- `5 P$ d
  18.     for (Quest script : _scripts.values())8 t3 A* P" e4 d  C- r4 A
  19.     {+ C9 H* v" D8 V2 h% K& I5 D$ z
  20.         if (script != null)
    3 q/ z  R& A& o5 ]( U: f& R
  21.         {
    4 P+ {) C8 J) d: J! I+ Y' m" S
  22.             script.unload(false);
    * U# C; j6 x" j' G' m5 J
  23.         }
    9 P- U1 F, r) k& F* E5 q
  24.     }& S& d) t& s% }; P
  25.     _scripts.clear();
    ' S; q' h7 m0 q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 B- X( F! \+ H: p. r
: l% a& @" s+ Q) T
Метод report()
! O  _  _( \6 y5 M" S
1 j" {( b6 d9 l5 N" k
  1. /**. \) X3 E/ ?* C7 p! g% q: Y8 h
  2. * Логирует количество загруженных квестов и скриптов.
    0 z) H. _7 p0 x& G
  3. */
    ( o; Y3 z1 l: o9 ?  Q
  4. public void report(): e5 _5 g2 ?+ l$ B: k  q
  5. {) {- P: t% c; ^
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- G' H) D" e5 G& k, X. R
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    * O: P1 _: {8 E
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    " ^. t% N$ g" C  }
) U7 U: E5 ~0 L0 s, A' e- |8 L
Метод getQuest(String name)
4 y  u. n) \5 Y% `; f  G7 i1 {( ~5 L/ W; e& i- M3 g
  1. /**
    ) [8 R) p( {& q# V3 v
  2. * Получает квест по имени.
    ! N" A" f3 A6 P- H3 _1 R
  3. * @param name имя квеста- J# D  k% T- g- C4 t5 {9 u
  4. * @return квест4 n! v; A# W# u* u  j- A
  5. */' P- z! s2 ^. B
  6. public Quest getQuest(String name)% r% ^# }8 \& K! l$ R' B5 T
  7. {
    8 L, }& J. W7 m
  8.     if (_quests.containsKey(name))5 m! g# {- W5 _9 }1 l
  9.     {
    3 y7 a2 g  k: l' [. }; n
  10.         return _quests.get(name);; t! _' L1 l' h' M
  11.     }% Z; `+ v8 T. P  A5 v
  12.     return _scripts.get(name);
    $ T/ Y% s1 q; `2 g# V3 o1 l! N: f
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% @6 X' j" C2 c7 {
, p9 u# t3 o5 u' U) F1 d( o( C. l; e
Метод getQuest(int questId); L; n# O  ^' j# A! ^; C

" D! s( v3 o* G& }  f- t
  1. /**
    0 P5 S, G) J; p  r
  2. * Получает квест по ID.
    $ l7 d3 k0 v" [, e( K
  3. * @param questId ID квеста0 ]1 ]. Q2 q! W1 I0 j& R9 ]
  4. * @return квест, если найден, {@code null} в противном случае
    8 X  H/ T" a$ x% ~8 @
  5. */: P' v' g+ z$ Y( h3 t9 Q5 x3 l( K
  6. public Quest getQuest(int questId)
    # x! F+ q9 H' O- A% {2 V
  7. {
    1 j% n3 b* x0 x
  8.     for (Quest q : _quests.values())+ u" S, `3 W1 H- \3 T5 I
  9.     {
    1 d! q( h8 k3 Q) K2 v  K$ m% b6 T
  10.         if (q.getId() == questId)9 A2 y: @* v- j" t$ f$ V8 V7 f4 A) l
  11.         {) R2 v% M0 D: u- b* S) T* C0 E
  12.             return q;
    % K. B* |' q: J6 k5 ]
  13.         }" N% B$ J4 d9 ^) K4 N$ \/ v/ S4 J& g0 ?
  14.     }' _. _6 b$ M/ A$ y
  15.     return null;
    1 q1 U/ ?7 z5 Q
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.$ s0 X7 d( p3 H4 i
. z3 H/ c# R+ _% W( _2 M
Метод addQuest(Quest quest)
& p' p1 q7 J, ]1 \4 D+ [3 c  t' e
3 a. [0 \) P. V8 s2 Q# G5 O1 j5 r
  1. /**) x( y& ?9 r. }# f
  2. * Добавляет новый квест.
    + D: q/ m# R! _9 f2 Q+ ^5 J" M
  3. * @param quest квест для добавления" t/ I6 G1 q: ]1 |1 p
  4. */2 s4 N$ V+ p) Z% B3 G- I
  5. public void addQuest(Quest quest)8 v/ N( E3 v; ]8 E
  6. {
    + X. `4 W( |( I7 I/ [+ C2 U8 A+ f
  7.     if (quest == null)
    2 M8 J  X8 b5 O* |# D' Q
  8.     {7 F# u  c- i: n8 Z5 a
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    * }  q+ P* V- C+ O; r
  10.     }: m3 x7 \4 b) C' u7 s
  11.    
    ' Z9 p9 a. t4 F8 `4 @
  12.     final Quest old = _quests.put(quest.getName(), quest);
    ) y* _9 J" b7 F5 G
  13.     if (old != null)+ Z2 ]) o+ g$ g- v$ Q
  14.     {
    " M/ l7 r! ^# d6 d: ]
  15.         old.unload();' P) d6 h  y% M  i% o+ r0 I
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    8 s0 ~6 @5 h% J5 c7 \! u$ D
  17.     }2 K8 s, B) P; @$ h; f1 H% j
  18.     . ^1 i% O4 }2 x8 P/ W  r
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    5 y# k$ A% p' A
  20.     {/ D; ~1 M5 V( \9 F
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();1 Q6 U8 Q& q8 m2 G- e. D  P
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ( h: i' W6 D: S$ M8 R; `) h
  23.     }
    " b. ^% W" {$ M5 q' Y1 P
  24. }3 e  Z/ p7 X9 ~1 i5 |
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 {1 h/ t1 j5 B* z7 c
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ A& D3 L* B1 ?* y, j( z$ \4 M
! l8 \" e* ?$ s4 y

6 a" d% d1 M; i6 `( e* I
% C0 J$ O, u5 v0 D
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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