Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
+ z4 E" H# s& c% f# g; q4 F: y% B7 `0 ]) w0 A7 V' I
Разбор файла QuestManager.java; [) R: P) j) l$ L( A1 K
1 v. I  P( g& s0 k# W3 H
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
2 R, t! g7 p: f) c7 QОсновные элементы
! f  u4 c; }0 d0 r- G2 [
  • Лицензия0 K9 k2 |& I: b) s
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      5 l/ b* F8 p( K: f
  • Импорты  ~+ F9 W8 d6 ~: v( z, F  N8 b0 U

- c: q( R  h- t6 |5 P! j$ p# X! e/ xQuestManager.java — управление квестами и скриптами./ P: M2 a3 e9 P/ A6 E' |. E( r( F: L- ]
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) o* `- Q2 i# g; X) p
0 Z8 F4 U2 J) N: y+ M
9 v2 U# G5 J5 B( r
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ k' W: M) Z4 R# C
1. Лицензионное соглашение6 @( ~/ J7 q+ D  t5 s+ ~# p* i
  1. /*0 Z# V& A6 `1 B' D# u. V; ^/ J& c
  2. * Этот файл является частью проекта L2J Mobius.' s1 c% Q9 a8 E8 y
  3. * " |, s9 y/ }  X+ g  j
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять' ?  _# B9 Y1 e: W4 u0 w
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    1 q9 T4 _$ s' }% p) q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    3 V% D1 U4 p0 ?, V! k0 t- n
  7. *
    5 i6 S1 r+ C0 R, u
  8. * Эта программа распространяется в надежде, что она будет полезной,: {1 B9 o3 F. Y3 R: A( p
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    & E& E; S+ n( p6 l8 G9 F3 Z6 r6 K, R
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.6 i- r# _1 F0 z
  11. * См. GNU General Public License для получения более подробной информации., k0 L6 n/ f1 g+ P. J8 R
  12. * 4 V/ _# J6 ~- r- m
  13. * Вы должны были получить копию GNU General Public License# K$ Q: }' M, J* U5 k: e+ F  V
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.6 ~: f- \# q$ B, i# B. ^% _
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 T1 |; q) I0 A# ]3 ?

$ U4 Q6 \1 X# ~1 j
* L) J/ X  G* o9 k# R9 h4 r2. Импортируемые библиотеки
. `5 V0 o" _' S% \3 @5 n  W7 l$ q! D6 K7 k* g' w5 \
  1. package org.l2jmobius.gameserver.instancemanager;
    : V1 h6 s% B+ ^, V9 a+ W! A2 g

  2. & G, s1 J9 v0 o9 p. I% D* p
  3. import java.util.Map;. [5 M" g& Q, C# ~
  4. import java.util.concurrent.ConcurrentHashMap;
    5 s+ M1 d  o$ c! ?/ E7 w$ d9 I" n* n
  5. import java.util.logging.Level;
    % |3 `3 V% n! F" I2 y
  6. import java.util.logging.Logger;
    % ~& N0 Z9 W; ~+ c& B1 M5 f  u
  7. ) L% h2 f( c& f% _  W
  8. import org.l2jmobius.Config;
    % I" b* f+ O0 g* \# o# s
  9. import org.l2jmobius.commons.util.CommonUtil;; z( W: [* \  R; \+ ]( {! r) Q
  10. import org.l2jmobius.gameserver.model.quest.Quest;2 `0 H/ T( m# v2 I) O" c/ r* E9 ?
  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 — менеджер для работы с игровыми скриптами., Q3 S5 b: w2 S3 g

+ C& \* ?$ J2 i3 i. \* q+ j* }3. Описание класса QuestManager( y( {6 T6 F. [% x* z: L$ Z3 m
  1. /**  g3 l9 ^, Y) z% N
  2. * Менеджер квестов и скриптов.9 q5 H$ j0 a7 k3 N1 Y7 g
  3. * Автор: Zoey76
    ! ]* x3 C! x5 }: U# T0 D
  4. */6 E# ?! D+ B5 d' V0 I& s$ G
  5. public class QuestManager0 e' @% ?; y: K! U* p; ]
  6. {
    / d& f0 `( v2 }2 X: s
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ( C, h: A1 D: E6 E1 W
  8.    
    4 ]  d" a; h1 I  P3 p- C7 ?
  9.     /** Карта, содержащая все квесты. */$ {4 _; C0 t/ Y) B0 E, h
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 v& O3 T# g/ A$ Q( W9 k4 D) {
  11.     /** Карта, содержащая все скрипты. */7 p1 N  S1 O2 D& V7 ?
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();! N( W9 I  @, O& T& T; M
  13.       ^' ~, K5 {3 t" {  X
  14.     protected QuestManager()* H& d1 X% c6 {, X
  15.     {
      K+ G1 z0 ?; k) o' ^' o: e- T; |
  16.     }8 _# l0 a- G- }" d" `4 A( Z. [
  17. }
Скопировать код
4. Методы* J1 o+ B+ Q. @) p" B
Метод reload(String questFolder)
/ C# K) Z  ^# `& I% G8 x3 c( ?9 W5 T
  1. public boolean reload(String questFolder)
    1 w2 h' g4 O; p$ \' e
  2. {9 P8 R' c/ r* l3 t* V$ X3 A3 u0 i
  3.     final Quest q = getQuest(questFolder);8 _4 }" f2 [$ x, O7 P3 ?7 H
  4.     if (q == null)
    6 m& [5 p, c7 A. ]% D
  5.     {
    ! k: }" f( s' \( R; g1 r# \. z- |
  6.         return false;
    ; C3 j$ R' O; m2 ]% s3 P% V" c
  7.     }
    0 C7 g1 f  K- @: T1 L4 m
  8.     return q.reload();
    4 }0 U$ y9 c2 o- D
  9. }
Скопировать код
; ~: k" W) ?" I: V1 J4 j5 S' N

/ s8 m5 o+ y, CМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
3 L- ^7 @9 b: i# dМетод reload(int questId)
, ?& z0 ]1 |6 W- S& N
1 Q# m6 H( ~% [! G
  1. /**
    $ S& e( w4 D- n; |
  2. * Перезагружает квест по ID.3 c# t' f) v: @0 i
  3. * @param questId ID квеста для перезагрузки
    % \& _; @3 }5 Y& ?! X/ ]
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    / ?) {% n: {% s3 W
  5. */
    6 W& r6 K2 @% x8 v* I
  6. public boolean reload(int questId)
    2 }$ r/ ]$ \' ?
  7. {
    * O0 L* B" S3 N+ Z% N
  8.     final Quest q = getQuest(questId);
    7 s& ?! F* y: o/ Y
  9.     if (q == null)$ W( A# r0 z# w; H2 y
  10.     {
    + T" ~! Q2 b& p, o
  11.         return false;- q5 I7 ~& }7 c5 |7 K1 y9 T$ E
  12.     }
    . S) {* |3 ?* g9 Z! J. B
  13.     return q.reload();0 Q9 P/ o; L: s+ {
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.3 A! R4 @& M* Q5 S5 V
4 Q" V$ j+ p& |8 g: j2 V
Метод reloadAllScripts()
, h; \/ G5 P+ {* _2 ?# B1 c$ |: E% p$ _7 v0 I) [) g
  1. /**$ P! g3 ]. E8 u: T* R7 s. C8 a
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." i* M' y  \+ e0 U( j1 J8 v
  3. */( M: F6 A# F& a4 Z: o
  4. public void reloadAllScripts()
    / W6 @0 G5 I- a9 g4 b
  5. {/ |5 Z1 {6 f- e) u: b7 o
  6.     unloadAllScripts();
    - n7 n6 M& ~8 H. S* T3 x; j" L
  7.     / N9 }! w( c1 T8 Y0 A
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");/ o7 q+ E" _# g
  9.     try
    2 f: r" k! O% \% G, p$ m
  10.     {
    8 G/ I. G$ G5 {2 T
  11.         ScriptEngineManager.getInstance().executeScriptList();
    / m# t% y6 w' C9 ^
  12.     }
    3 G; s( \1 M& D+ K7 g6 ]
  13.     catch (Exception e): W2 K8 o1 i8 h0 V" O) j
  14.     {. C) @0 T& T, c) G. r" s
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    , T) Y6 h! i& a2 b
  16.     }( `" u! f9 ^/ P
  17.     0 z, P) Y, T: g
  18.     getInstance().report();
    4 C  C# u4 X( ^) L; }" X
  19. }
Скопировать код
Метод unloadAllScripts()
0 s9 L. O0 w, C2 @& S, {6 g5 ?+ ]# F) r! r) P$ e" h& c- n
  1. /**
    3 i' S( m4 ~& D; M
  2. * Выгружает все квесты и скрипты.3 j. t/ ?+ b3 B1 t, L6 k
  3. */
    2 I- z, n, U5 E6 |# A
  4. public void unloadAllScripts()
    5 c' S& h& S5 H" `& M
  5. {# r+ c: G" X% v% d" W
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ; m5 w5 u* G$ b
  7.     , x0 P# K9 q0 O
  8.     // Выгрузка квестов.; }, D/ c* D" D7 _) \5 e
  9.     for (Quest quest : _quests.values())! t/ k% o2 |' Z+ [
  10.     {
    . q% }# \! n! {5 \( S, ~
  11.         if (quest != null)6 c: z3 J9 V9 D
  12.         {
    2 t! j6 T( B9 T7 b" R$ K2 \% k
  13.             quest.unload(false);4 |9 b8 J. h+ A
  14.         }( L8 a0 I6 N, l' {4 P4 W
  15.     }
    ( a' L' ]" S4 g2 n- m5 D
  16.     _quests.clear();0 j/ G: M: ~% W. n) I
  17.     // Выгрузка скриптов." [8 x5 L. a5 |/ m: Z8 g1 O
  18.     for (Quest script : _scripts.values())9 [% }& O% t/ z) S9 M
  19.     {
    ; Y- q! @3 L5 {. I( l& F2 k/ D9 \
  20.         if (script != null)
    , n8 o, W" z# V$ A
  21.         {! g" |' }% ?1 @: d
  22.             script.unload(false);  k* s. j6 n7 I
  23.         }
    ; K5 g6 f1 a4 d/ {, L# v8 n
  24.     }
    2 `5 N0 R' k% s3 v: r! x
  25.     _scripts.clear();( b! X7 Z$ _+ I7 Z, d% |0 t( G
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: {4 C' B1 {" Y& u8 _% b' ^' e6 o

$ w) z1 K. q. _1 G% P1 g; SМетод report()
9 I+ R6 T# G1 Q
4 F" Y8 G& U( b+ J. S' n. K
  1. /**, b6 j4 @9 e5 g2 h; v5 Z; F- ~8 ?: R0 _
  2. * Логирует количество загруженных квестов и скриптов.6 Y, u7 V! l, w* f, i# ^* o
  3. */
    ) t0 \- C/ \8 I6 r6 |% X/ N
  4. public void report()1 A; V; P, e; n& Q& `2 y( \6 q
  5. {
    * j4 `' f: F2 I; _4 ^
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    - V, ~4 a% r9 h& |- O. a/ R$ ~
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    % f' J" u& C$ P' X) _
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.7 L' \1 v, Q5 a; q: Z" s
/ {4 ?& R% _3 G3 U
Метод getQuest(String name), E) g9 B8 K( T/ S, X

/ Q& G  z/ J: c6 V, j
  1. /**0 x# T4 G+ _& E: z' G
  2. * Получает квест по имени.
    * a3 A7 F. S; F2 ~% k6 V$ z
  3. * @param name имя квеста9 L: j: m8 a- Y! @
  4. * @return квест
      y7 A4 L- Z) X) r% Y
  5. */3 f$ g- ]6 m0 K
  6. public Quest getQuest(String name)
    * ~5 j+ `; K7 d6 B: k: R0 Z
  7. {
    3 @3 e% c( F. ]) q. k) U* {- y) v
  8.     if (_quests.containsKey(name))
    8 ^/ ~. ?0 ]1 ~& T" a) a
  9.     {
    # s- T+ R+ c* q% \
  10.         return _quests.get(name);( }: t  x% ?5 R4 I. ~
  11.     }, k+ V0 o0 ]7 @, L6 l4 w
  12.     return _scripts.get(name);
    1 ]/ q+ ^# F$ e: x$ _4 B
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    & {$ z: l2 j3 }( q# d& R& c

! r' z& ^" h$ |+ d) ]/ Q# v! BМетод getQuest(int questId)! N8 z' y4 E* d6 v6 s# I
$ v9 [! P$ W& t- B6 r
  1. /**% l8 r2 B/ k. O+ y
  2. * Получает квест по ID.2 d$ r/ @6 k5 Z
  3. * @param questId ID квеста
    1 B0 z4 o8 [4 ^5 L5 I
  4. * @return квест, если найден, {@code null} в противном случае
    8 g! P: K2 [( ^' ?5 ?4 w8 A9 @
  5. */
    9 R9 h$ L0 A* f9 \4 q% K" D
  6. public Quest getQuest(int questId)
    ! x$ L! i5 j6 Q" i
  7. {0 [6 z/ g+ u2 u5 D9 n
  8.     for (Quest q : _quests.values())  |2 E) ^' i) o9 t6 y
  9.     {
    # b5 d' b% Z- R' K5 ^" b' v
  10.         if (q.getId() == questId)
    - N: `8 v2 r; F
  11.         {) U, E) k7 r9 m& S4 O$ e
  12.             return q;; o; f) |! f8 o5 u
  13.         }
    5 t$ ]' X; |7 {8 P9 q: j. Z4 Y
  14.     }. r2 o$ V& Q4 L
  15.     return null;
    8 D  g! D8 h4 i% ]: a
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.# k. V6 B! N$ A
5 i  x- B" X$ S0 y$ b) h' n
Метод addQuest(Quest quest)
6 h8 \1 S3 X0 h9 H0 z+ W
- u' x, F, D$ g
  1. /**
    $ \1 T5 I1 b) V
  2. * Добавляет новый квест.) k% {" h" q& q5 y7 m& {  Z$ L
  3. * @param quest квест для добавления- G6 ~  P, p5 X( o9 K, g# j
  4. */) O. U/ ]+ G' @5 x
  5. public void addQuest(Quest quest)
    9 x/ x6 |+ d% y8 q1 C9 [* K
  6. {
    * A' N( j0 H. p% B5 ]  K
  7.     if (quest == null)+ w# E- c. R& r
  8.     {
    ! v5 N  J% U0 u4 `3 `' b1 m& X
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");- e( X+ O" A/ x. D9 n7 p9 P
  10.     }( U- P$ k# H' D( ^5 a' }" Y
  11.    
    4 ^3 ^1 P+ P: j2 l! ~6 Z9 j
  12.     final Quest old = _quests.put(quest.getName(), quest);" }, h. B5 P  t7 T9 J. u) M& @
  13.     if (old != null)+ L; V2 M, ^$ @0 \: [$ ^: n: r" h
  14.     {% g: k: E( P4 p/ r
  15.         old.unload();: |8 |% o* E6 X  L1 H1 ~  B
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    % S& d6 V$ S$ ?) g7 I
  17.     }
    ( ]7 S! L. r+ G. O' U$ v1 W
  18.     0 ^7 @% n3 H9 V
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)- r5 f6 `( u) l6 [0 l: q. K6 I
  20.     {
    4 s3 k( X# _  K$ n% p% E
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();; W  j1 ?5 k/ V( F
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    4 N) ~" g' M) P# W+ P6 C9 P
  23.     }
    7 z) x7 n+ O- w* |
  24. }
    3 E; j. c$ E+ G/ ]' E- b* o
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.$ \9 V9 F! z/ G
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- J/ U; T0 f$ t
" q* b  W# [6 f5 U9 u, e% w
7 I1 o- B2 x: Q6 E  F  ]4 t7 K# `/ p% `# |; p+ L9 B
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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