Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. `9 Z5 Y/ s1 b9 s, ^9 `" ~8 Y+ h; }
. a. V% w9 h: F
Разбор файла QuestManager.java- z5 k  \6 A& g" ~) C
$ y! U9 z& m3 n  F* M5 T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
& S" h! C, b0 ^8 I& M  s) ^' G7 fОсновные элементы7 e1 f  @% Y/ e
  • Лицензия" X3 }9 y/ |. @4 x) @
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 Q' F0 O( ~, d4 G
  • Импорты0 b) [+ O1 b3 J+ x
8 y: v0 P4 g' }! d2 m8 z- g
QuestManager.java — управление квестами и скриптами.* [" q* I0 }- r% D3 @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
1 S# N0 X# y" ^3 v: X6 a
+ \# Q! V0 O7 A4 `

8 _+ \% `0 t$ k8 S) C. d, kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.+ r9 ]: p" c" h
1. Лицензионное соглашение9 n: ^4 A9 e7 ~: J
  1. /*8 {2 J" Y" x: N" P6 F$ _
  2. * Этот файл является частью проекта L2J Mobius.8 n1 P# w" _9 A1 I" o
  3. * ( I: G1 b  _# ]* u# J
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять, Y' @2 o* _6 ], y' v
  5. * её в соответствии с условиями GNU General Public License, опубликованной: G+ B) d% m8 b4 n
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.4 F: X$ ~* O. D
  7. * ' b# A1 y  r4 n
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ) w6 i# W: x& a5 R
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    3 K. W6 e( M2 `. a6 J7 a
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 P, n/ e+ ~2 m; J. S
  11. * См. GNU General Public License для получения более подробной информации.
    8 s1 |+ `3 s& x
  12. *
    ! P. p( ^% G3 R7 e' ~* V' Z5 j3 Q
  13. * Вы должны были получить копию GNU General Public License
    ) ~7 |& ^" u; k$ v# g  v8 k- l7 `
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ' F  C* d6 u& e) \, Q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
: ^1 h5 e1 E8 c8 y7 ^  ~; ~
. T- d1 R. ~/ }. P! {. R! G$ ^2 p! R2 ]2 \3 R3 y! U2 _% D
2. Импортируемые библиотеки
  |3 x" d8 d& U" R) H: F; k( t1 `/ P; `
- ~- `. d3 b$ A8 X
  1. package org.l2jmobius.gameserver.instancemanager;
    ) A" w6 c6 w5 v1 f

  2. 4 E9 q$ }- m0 k+ d, w
  3. import java.util.Map;  G1 m6 N+ Z/ Z  i1 o
  4. import java.util.concurrent.ConcurrentHashMap;7 B7 L& S5 l- _- q9 D9 `  j
  5. import java.util.logging.Level;
    2 G! S" r. W. M0 P% p: O$ p& q
  6. import java.util.logging.Logger;2 y9 v+ \. U/ O6 e9 X3 l* N: b
  7. 0 r' I  t& y- f5 b4 ?) G+ `* a, b
  8. import org.l2jmobius.Config;* B2 P, H5 r/ s( k% q, p, U3 A
  9. import org.l2jmobius.commons.util.CommonUtil;/ q% U- k8 k! e/ ~
  10. import org.l2jmobius.gameserver.model.quest.Quest;, \; f0 \" n! ]- W2 l7 b: H
  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 D$ x  R9 B/ F( u

; p4 f: I9 C4 |! ~# T; M3. Описание класса QuestManager
' f" q: `9 V2 i, Z9 S
  1. /**) l9 ^0 F& s/ l3 p% G- y+ c
  2. * Менеджер квестов и скриптов.
    : V; g6 e! X2 ]
  3. * Автор: Zoey76: [6 }0 A  L) \, F% K
  4. */& x  r9 x0 @9 ^* u$ ?
  5. public class QuestManager
    $ Y( ~! a4 k* f% Q' v( @
  6. {( U# M: g. @( h8 W# y) w
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    7 F8 \. q6 i  M9 ?7 n1 M
  8.    
    7 f; `3 h9 L) B  `  d1 c
  9.     /** Карта, содержащая все квесты. */
    " D. C" G0 r% Q, F6 g- B4 D
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    , l% b& P+ `  H0 R: h" K
  11.     /** Карта, содержащая все скрипты. */6 e! V: }$ h5 [0 v0 }
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();* f, o( x9 `$ B2 C' V; [
  13.    
    3 o3 X: ~6 u, t% _2 }* |5 `
  14.     protected QuestManager()" a( ^4 s1 ?+ |; [
  15.     {  p9 C6 ~2 x0 Y. E2 F
  16.     }+ Z1 X2 t! A' C1 @( v7 |; j
  17. }
Скопировать код
4. Методы' F" R$ d- i/ F4 M: S' F
Метод reload(String questFolder)  S' y* c% x/ k4 `( k. V
  1. public boolean reload(String questFolder)
    + ]* m2 E' j% v; D$ t& M" n
  2. {& E0 M: w% d& ~2 q; u2 R, n" V1 a
  3.     final Quest q = getQuest(questFolder);7 f3 g0 U1 n! }0 y% C  ~, c9 [
  4.     if (q == null)8 i( Q' u7 k$ a9 n1 F8 Z! ^) p
  5.     {, E, f' e! Z7 G8 m; g
  6.         return false;
    % ^; h+ f$ l6 w4 o# @6 K  P2 B/ p
  7.     }
    7 T2 a; p* l  k, v% s. V/ H
  8.     return q.reload();
    9 H6 s" `$ V" }" C0 W$ _4 d
  9. }
Скопировать код

( C. W4 n: Q5 j, X% y* _" B
( g" t/ f! n8 i$ ^' v5 UМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста., m7 m% O& v8 g6 Z4 ~! O
Метод reload(int questId). _, c& A: Z/ `& p8 r" I+ \6 w
' \. ~. [6 B9 S) P7 ]% C
  1. /**
    . h+ _2 [) M$ T% |) `
  2. * Перезагружает квест по ID.
    * S* e+ c$ [9 k) {3 `; s$ U
  3. * @param questId ID квеста для перезагрузки: c8 q1 B" V8 t2 a7 r( \/ c1 a: ~
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    5 ?4 T7 {: n2 H) p# x
  5. */. n# c4 f  u5 {
  6. public boolean reload(int questId)- `0 R2 W8 Q3 I. `. ^4 X7 t$ \, C
  7. {
    6 ?" D) E! m9 F* Q6 j
  8.     final Quest q = getQuest(questId);
    ! {7 D, Y+ |8 p/ D
  9.     if (q == null)
    & Q3 u6 l+ a  j/ [: }# Q! P' Z
  10.     {* L" b5 M! u& [% p& n9 ]5 m
  11.         return false;( h/ c% j4 f* f8 N& W
  12.     }( b1 G. V6 ~- @/ {
  13.     return q.reload();
    1 q8 h4 k! z0 a+ a7 a% G+ a
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    0 R. G6 ?) c6 ]. C9 O; P

: f% C+ @% }  C0 }+ B' s9 f( RМетод reloadAllScripts()) \# U$ p# Q" X- @/ h$ t

* r7 a2 J# Z& s
  1. /**5 k$ ~! x& W: r3 q$ y1 M6 R
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.' D% l/ T7 p; ?5 ~6 N
  3. */' C" p+ W( w' q+ M' K
  4. public void reloadAllScripts()
    # x; I& w% o/ `2 L0 C' u0 h% V
  5. {
    ' v; U  |+ T4 z6 c8 C8 i0 o
  6.     unloadAllScripts();
    , N, k' _6 q4 e# L# q! `% X  l
  7.    
    ( A6 V" R, A) a  U3 Q
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    : A5 l2 {# ?" _) v
  9.     try
    ' I" Q" C7 k3 I$ r! P8 B0 n  {
  10.     {" b4 i. ^/ V5 t2 v* J
  11.         ScriptEngineManager.getInstance().executeScriptList();# ^5 a2 V1 k: p. [% A6 e
  12.     }
    1 R( k% t) c+ f
  13.     catch (Exception e)
    8 P: C. y' }- B9 K4 g  N+ w
  14.     {# }, @/ L  a1 U# C
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ; u" c5 ?4 h9 g3 {
  16.     }
    5 X6 D* ^2 v5 v2 D- S( m0 N
  17.     # s5 B# E7 p9 ?
  18.     getInstance().report();0 V/ |/ u- o2 |) h
  19. }
Скопировать код
Метод unloadAllScripts()) Z5 k" q" @0 I+ e. t, N. B

1 I$ v5 H$ |; S5 d8 I& a' U8 V
  1. /**4 B' h( M' P8 @! Q1 i6 B6 K
  2. * Выгружает все квесты и скрипты.( q: t; w: s+ [. ]3 x: y( `) ]
  3. */# I/ i1 [8 s3 l8 M, o' R- H# q
  4. public void unloadAllScripts()# \  b4 \) }+ W! N8 u+ Q/ l6 l
  5. {' b( r) l; I6 J$ _. }4 M
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");8 |. v/ R" w7 Z* ]) R8 f
  7.     ' X+ }6 {  n7 h& ]+ d
  8.     // Выгрузка квестов.
    9 ^2 |/ [* j7 I& q* f4 C: \2 ]
  9.     for (Quest quest : _quests.values())
    & E% y5 _  e/ {
  10.     {& a$ w2 `0 s: \, a* A
  11.         if (quest != null)
    1 R% l) I2 L$ O" S! }3 ^
  12.         {( J# I3 p8 H( K6 S+ D( H7 P, k
  13.             quest.unload(false);0 G7 X7 q3 {- |" e
  14.         }) ?5 n6 D' x- \" |
  15.     }2 c' X2 s) L' B
  16.     _quests.clear();: P2 k5 a+ m6 M4 {
  17.     // Выгрузка скриптов.+ S" Q/ X- n8 M
  18.     for (Quest script : _scripts.values())
    & l1 ?7 b9 P0 U1 d
  19.     {/ Y6 `5 C6 M9 I* T4 f
  20.         if (script != null)4 K3 N* u& F* [6 R# D
  21.         {8 X2 ^, G' E* r$ Y2 A0 r
  22.             script.unload(false);
    8 W; }" j, X; g4 z* c- \* S
  23.         }
    ! t) V+ k( l; D+ M0 w
  24.     }% r6 M6 ]6 l) P) B/ H7 a! D
  25.     _scripts.clear();( E( Z( a! l4 R& @1 y' s2 e
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' X% l( W8 H" j
8 i: `) c5 w# N
Метод report()# h$ h! G7 @2 M, D1 {& s! p( h! M

% m5 ?3 v5 i" G( S8 _5 {
  1. /**
    + x9 _, j' V! s2 o) G) R
  2. * Логирует количество загруженных квестов и скриптов.
    6 S! a3 f: ]' Q2 o. K! k
  3. */: N+ u+ h% g) m, ]
  4. public void report(); x6 m, T0 D6 V( O. Y! v
  5. {
    0 k4 }7 `  R3 z2 i. y: z5 d7 k7 s; X4 e
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    4 J& |$ L0 g/ m4 T* S" \
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ( p* ~: Y& `' C# M3 k
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    * R# U$ ~- R7 v# L0 W

& a; U8 G( s, Y1 pМетод getQuest(String name)! k0 C* @. _5 C

* T: \$ n9 z) b1 U3 \! R% V
  1. /**
    - r1 [9 l) g3 S; e0 u
  2. * Получает квест по имени.
    ; g8 f1 M' ?6 {
  3. * @param name имя квеста2 a4 |' e9 W" m) W
  4. * @return квест
    & @  E& C0 g: E$ z; G/ W+ c
  5. */
    ( A4 X# d+ {4 P
  6. public Quest getQuest(String name)
    0 o% V6 |: m8 G
  7. {
    ) }/ E( @9 R  F& u8 K+ J
  8.     if (_quests.containsKey(name))$ d$ N+ W$ G9 S
  9.     {
      A1 r  a# ]  v, Y6 d
  10.         return _quests.get(name);9 Q6 y8 z+ T0 p3 C
  11.     }9 i3 i4 p8 q% U. W4 u( `7 ^
  12.     return _scripts.get(name);9 h( }0 s' c3 o) \( C+ q+ p
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. y5 X8 E2 ?2 `) Q+ W2 H6 t
, S! ~) c, Q* L5 }+ o
Метод getQuest(int questId)3 ~; a! S5 F/ `: l
9 b* C3 O& \+ w" u! ?0 c
  1. /**( u& w5 G* n  n. a3 @9 V
  2. * Получает квест по ID.
    1 K1 U8 E8 S7 N! [- K, Y  s
  3. * @param questId ID квеста
    % R7 J$ A4 R1 A
  4. * @return квест, если найден, {@code null} в противном случае' \: R, y7 F4 U$ a  L
  5. */" ]# r) O& o/ p8 U' \* ^
  6. public Quest getQuest(int questId)# C/ M+ W1 J; [1 T! g
  7. {
    1 f, V9 z/ b1 y/ ~/ q
  8.     for (Quest q : _quests.values())
    ; y. j% \/ j( P) t9 y9 l
  9.     {  o- B( e* C1 q/ D7 ?# u' t
  10.         if (q.getId() == questId)9 d; D* n7 R4 Q
  11.         {/ o3 A' k% k& f
  12.             return q;+ g3 h- S0 z, V
  13.         }
      G& K1 q4 y. K" t; k
  14.     }  e6 |# H! t8 J
  15.     return null;2 i) s! S+ q2 {8 V8 Q' x) a. K
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    , q8 F+ ?( v  B( G, b
; K6 T, X% c7 w9 G9 Z/ g
Метод addQuest(Quest quest)2 g4 g8 C  u3 L7 P
+ i4 M1 b9 ]6 o  _$ C
  1. /**2 f0 G4 d) j7 w- K6 Y/ h, M
  2. * Добавляет новый квест.
    , G1 M. k: I! @+ V0 y$ G: D, {# g& `
  3. * @param quest квест для добавления( H! I9 \3 g& y4 X6 G, t9 C
  4. */! j5 `$ u4 A; ~3 f
  5. public void addQuest(Quest quest)
    , p9 p. j$ p, D  _+ }) o" e
  6. {0 h' b# E3 D. M6 J* R6 [' {
  7.     if (quest == null)
    . `* j* W& N, L' V, ?. \6 m$ F+ U
  8.     {
    ' q. e% h' q8 L; B
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");, y% _6 A. }6 \9 s4 g
  10.     }
    ( ^: j" Z% ]% R" |( |% T2 k
  11.    
    7 p- q5 }; i5 c4 C7 _
  12.     final Quest old = _quests.put(quest.getName(), quest);
    1 z: F# Q7 R0 U
  13.     if (old != null)9 ~2 R$ W  y* T1 z$ ?6 @( m. Y  B
  14.     {# F( `5 E2 T& V: k4 ]- H: y) [  d' J
  15.         old.unload();
    * G8 _8 H, c8 X2 Q/ }
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    + d1 N: p5 J7 T2 M
  17.     }
    1 i1 u7 D% o9 ^3 q$ P8 S
  18.    
    # t( n8 H; m5 U0 e* `6 p" A
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
      r  w5 J, B3 b6 W1 B( O
  20.     {, l  a/ Q: _# r1 `' M
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ' ?: r7 B+ S8 `3 c) Z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");; g( j# ~% t7 e3 e' [
  23.     }( ?5 o& I/ e6 u5 u/ w
  24. }. w/ w  I4 E, R; T; @) g
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
- x  V6 @: n0 Y) k1 W$ RЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.  f  w- M7 p7 g4 \

, ?2 Z6 l) f& n* c9 a
7 D; }0 Y" c9 g6 K; Y% g
( u" Z, {- M8 c4 Q( a" E! T
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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