Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius4 r0 \8 h9 \( D. |% M2 S
) Z& V# F3 g8 r! [, R- j
Разбор файла QuestManager.java
8 W9 T7 R. f: b: o- N6 w2 Z2 X9 W! f0 m5 F# D) k8 D2 V
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.8 M! h& Q* W% P9 m" _: o; ~  D9 G
Основные элементы8 S8 {7 p$ q) I
  • Лицензия
    $ q8 R0 q/ f  V- o9 q" y. U. c5 e0 A
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      . o) c0 b1 N1 K% J% R: H
  • Импорты% s9 g7 Q( F8 m

3 C( t' B6 i6 C( o& l- D5 x( n5 {QuestManager.java — управление квестами и скриптами.
- Z& S0 M, e- Y' ?0 l' `/ c: l/ VПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
2 t7 J  `+ ?8 ]' c9 Z) D
4 p# v; ]( I- a, V4 {
! F" d& K$ W6 j3 f
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ X+ _4 d. f8 f/ e& r3 j1. Лицензионное соглашение
3 X- [$ g2 U( [- I
  1. /*
    3 @; B. n5 V! n( {! J8 C; @
  2. * Этот файл является частью проекта L2J Mobius.
    ; o) Z/ L' `; |2 U+ C. ]* F
  3. *   X; A3 M5 J7 z* p* E
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять* `9 Y0 o; c1 b
  5. * её в соответствии с условиями GNU General Public License, опубликованной& y, g2 a# D" B' M. ~  |5 [$ Q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    0 H+ _4 ?+ o7 C" b1 `$ q; u$ l
  7. *
    4 Q1 C& j- v* M8 c0 C
  8. * Эта программа распространяется в надежде, что она будет полезной,( O; Z7 Y) m% K2 o: J' q; r5 i
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии! f6 M9 \! f# s
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.5 T& J, k! j6 b9 o7 b% K6 ?) [4 F
  11. * См. GNU General Public License для получения более подробной информации.
    ! M- q0 Z. X7 `* F0 v: |7 k
  12. * 3 R) }: L% u4 x3 G) s
  13. * Вы должны были получить копию GNU General Public License
    2 J' J( S8 V3 O
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 v" ~; C# `) t2 [8 o. _% \7 B1 w; ~
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# V6 U0 \# b2 X* ^

: @2 @' {, |9 `% h. U9 `  I, c% I9 `4 D) ?
2. Импортируемые библиотеки8 d9 B# J2 M' v$ m

& S( w) [* Z. z# [
  1. package org.l2jmobius.gameserver.instancemanager;
    4 j* K& ]$ H$ l8 ^

  2. 0 e5 P/ P9 G( x4 |' o
  3. import java.util.Map;
    " j: l+ V0 [) e4 t! y
  4. import java.util.concurrent.ConcurrentHashMap;
    5 ~! Q! ?& a$ Y7 a: y/ z
  5. import java.util.logging.Level;
    / I6 L  ?& [6 W. N: F6 [
  6. import java.util.logging.Logger;
    : |+ ~9 v9 k6 n! n" v) H

  7. $ ]3 B3 o' n  ~4 d) l- w, `8 L" \# n
  8. import org.l2jmobius.Config;0 j' D, |3 Y, {0 p  Y4 Z
  9. import org.l2jmobius.commons.util.CommonUtil;
    ! r) F, C" a/ v
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    8 _  Y- s4 [0 C) 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 — менеджер для работы с игровыми скриптами.
& }. i5 U2 n1 `
: w+ d* v* b' o3. Описание класса QuestManager
- ~5 f8 R* g8 A# f- h
  1. /**$ P- J" q( J* P. W7 i
  2. * Менеджер квестов и скриптов.0 `, K  n8 M9 J! T% x* n
  3. * Автор: Zoey76
    7 u" ?) o, f6 O
  4. */
    9 s0 S! T" h- Y: O2 p0 K9 U
  5. public class QuestManager( z% E* x: h  ?- l
  6. {
    + g  R2 B9 {& }/ s+ ?1 E( l# G
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    9 N+ e# {: q" m9 G9 D
  8.    
    " s, J$ T1 N# J6 c0 @# C7 W
  9.     /** Карта, содержащая все квесты. */1 M! a. _" Q/ `. E
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 @% A) t4 r; S* \5 M) A
  11.     /** Карта, содержащая все скрипты. */9 i( _( H* l. p) G4 h. f' l
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    5 k# Q. z3 b; ]9 x* W
  13.     " s/ x; t2 b# z9 i0 f& ]
  14.     protected QuestManager()  W. G3 F3 }* l, k4 O! c: y4 ^
  15.     {, P- O% W$ D9 Z5 J4 x; _% |" U+ X
  16.     }
    : @) `6 `- h8 N: @" V4 w
  17. }
Скопировать код
4. Методы! \3 I. [& B/ ?$ k3 u
Метод reload(String questFolder)
4 c8 Z9 l' r' h5 Z$ b1 Q( W
  1. public boolean reload(String questFolder)
    - H! I$ i% u0 E" n! K
  2. {+ i& s% Y2 G, l$ L9 H. I
  3.     final Quest q = getQuest(questFolder);
    , i5 S! X* x& z* \
  4.     if (q == null)
    9 d7 x& x+ S# t, t! P$ ]/ t
  5.     {
    % H  D- P/ E$ w1 D5 J  Y3 B1 H
  6.         return false;
    / ~0 m: ]" z5 W  r5 z8 b/ A0 r
  7.     }2 I  o4 `5 W2 ?" L7 A9 o) D% Y- p% z
  8.     return q.reload();
    ! I4 g" M$ n0 [% q4 ~- \  l
  9. }
Скопировать код
7 t, A1 c: y0 P1 Q  p2 C( f

. p. b: P# L6 t( ~5 R. d& nМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста., N& x8 B7 f2 z/ L
Метод reload(int questId)
5 R6 \; T, M! }& q4 B  ~) m9 Q. a) n$ y& Y3 _
  1. /**
    & H2 g& B! h* T) i8 M0 l5 @
  2. * Перезагружает квест по ID.3 p! \- N- |. ^  C: m
  3. * @param questId ID квеста для перезагрузки2 v  `, r0 e9 e* V
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, y! q+ F# Z- l" J4 k
  5. */
      u% r$ \  K- \6 k+ \1 e
  6. public boolean reload(int questId)# Y# F1 B* b" S+ {9 ?/ c; g
  7. {
    3 H/ d! }8 e' W/ L$ J! n
  8.     final Quest q = getQuest(questId);1 G+ d) ]0 u& h: w$ L
  9.     if (q == null)
    1 b- h0 c! B/ N1 w3 P
  10.     {# P; Y  u, Z" V. v
  11.         return false;
    " s7 J0 O8 Y8 i7 x' C* T/ U) d- N
  12.     }
    9 ?! t3 e% a' s
  13.     return q.reload();
    $ c& ^2 o; s/ H0 m
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    * c+ w- Z$ o" q; b* w0 }/ v( R
3 _) O$ _" T- h# I5 h! _/ P3 X
Метод reloadAllScripts()
' ^& S2 V6 f2 T& ?& S1 F; v3 g; ?" |& c* z2 B
  1. /**
    : R6 F9 S% n  U6 S: z9 ?, `
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    * N4 T/ d4 X1 l3 C
  3. */& p' k6 i6 b/ B! f" r0 ]7 L
  4. public void reloadAllScripts()
    + ]/ m. ~% g3 E
  5. {8 V: E0 H5 @; U% f- u# ]. b: L
  6.     unloadAllScripts();
    : x9 a+ A% Z, Z" c1 j. v$ n, r
  7.    
    ; r; P+ B* Z' _3 O
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");& f* \3 h: A4 C0 ]& A
  9.     try' g6 k3 u* H+ X' f, e4 S
  10.     {
    3 w1 Y% E% T$ P/ _7 p
  11.         ScriptEngineManager.getInstance().executeScriptList();9 A1 u' ?- F: `" u: [
  12.     }
    / V4 z4 M" l7 q4 P
  13.     catch (Exception e)% a. S% c1 ]. N0 A6 ]% x5 f
  14.     {% d2 m2 Z$ T( ]
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* l' A" O- |$ d7 G& w7 ]9 N
  16.     }% {# t- V# v6 K( U
  17.     , t1 G% O: I$ q  f7 m% C3 s+ W
  18.     getInstance().report();2 O/ l3 C! R  \9 T9 p$ }; `7 H- n
  19. }
Скопировать код
Метод unloadAllScripts()! i6 W, D; ?9 u: o( \$ c* i

( F. X  @2 S" X% w. p4 A0 j
  1. /**
      P  ]7 s  E+ ?. u
  2. * Выгружает все квесты и скрипты.4 N3 y: _, m6 ?7 e" J
  3. */- L5 a/ X- N+ d' g0 P7 \
  4. public void unloadAllScripts()
    $ e6 |$ R6 N+ @) l! w# j
  5. {
    ! [( \8 q  |7 B6 _$ h4 `: m8 Z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");9 u2 l( |/ |/ a1 s! T
  7.    
      \( M  \9 @2 g- T0 U% X6 i- B
  8.     // Выгрузка квестов.
    9 o8 X- ~) U) U. W
  9.     for (Quest quest : _quests.values())+ ?' K" o7 V2 {' t# d% s
  10.     {
    & e3 M  P% \  x5 ~6 E3 [
  11.         if (quest != null): {7 q) R# x. v' F( h3 k4 i
  12.         {
    5 Y3 f$ d5 B. M: E  R
  13.             quest.unload(false);! z$ ~9 [6 s* K
  14.         }' Q0 Q: n0 ?6 q9 Y
  15.     }; r6 E3 n7 \% K0 t! j1 o, K
  16.     _quests.clear();* G6 J! C; F! p1 a
  17.     // Выгрузка скриптов.% }& }" Y5 L4 d5 @/ k4 A$ H
  18.     for (Quest script : _scripts.values())1 ?) _, c/ v8 J2 }0 F2 w7 }5 ?
  19.     {& U4 ~, d1 f8 E; |1 l% @
  20.         if (script != null)
    / |9 ]0 b1 Q- `/ v
  21.         {
    9 q; _8 C- f4 ~3 a2 U8 r  O
  22.             script.unload(false);
    ' F! U, l, j3 n4 t# `! C0 y7 M
  23.         }
    " M: t! V6 \; U! y
  24.     }
    : p5 p+ j' V/ m! z' h
  25.     _scripts.clear();+ e1 e' O7 w/ h+ x
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    9 _: Y2 B2 D; O
7 d$ m' ^( _  e! J+ P# l
Метод report()
+ S4 W+ a4 F  p" F  y
) a/ Q- w1 |+ b) E: p! j/ n
  1. /**; _! w3 t) I9 \% h3 u
  2. * Логирует количество загруженных квестов и скриптов.
    , L0 f3 V7 ^& \: e
  3. */8 `0 P& A% J8 W* L' e- i, ]
  4. public void report()$ s$ T) ~, v: U
  5. {
    ' Y, s0 ~7 t& _" d4 b7 ]" s
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    / _+ u5 C7 z" M9 d$ g
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    & V7 J7 f" f3 b" l" k( a, d  |
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    7 Q+ ~  e* E* _9 {+ O
1 ?! K0 B: Z7 l5 Z
Метод getQuest(String name)
* s1 P% S4 D+ s5 ^
% q" ^, o1 ?9 m( q+ h
  1. /**' Y: i) ?8 Z6 ^. x
  2. * Получает квест по имени.. ]6 c/ I/ V5 ^! T2 y& ^8 n: Z
  3. * @param name имя квеста
    ) W$ \* F. O  A
  4. * @return квест% K$ f4 q( k. b3 c4 v8 _
  5. */2 \' P9 w  c$ H1 ]: s2 w
  6. public Quest getQuest(String name)6 \( Y( C  v) U( F8 l7 `
  7. {
    . ~2 `6 s; |7 J6 k% L
  8.     if (_quests.containsKey(name))* ?8 D7 C/ M/ J% q: A9 Q0 ~
  9.     {  X: j0 G8 H' N- \  |3 K
  10.         return _quests.get(name);
    9 F6 s- z$ p2 v& h
  11.     }' {5 y" ?  s+ M7 m$ j) q4 `
  12.     return _scripts.get(name);
    ! V+ [# a) C6 T/ |* t
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.$ \4 N$ O6 G; h$ e7 S. n6 |

  \4 F; V" ^" G0 m8 KМетод getQuest(int questId)
( L( ?: t3 O# q7 @! V: B6 n$ b8 ?% @, a, j
  1. /**; Z  `3 Y& G0 X0 W4 Z
  2. * Получает квест по ID.
    9 E6 v1 o% C- M  S' V' l
  3. * @param questId ID квеста
    1 T5 Y9 w9 j  ~) n
  4. * @return квест, если найден, {@code null} в противном случае
    6 P' h/ J) a! j+ a
  5. */# B& I$ ?6 ~- \" i! T, C
  6. public Quest getQuest(int questId)
    + N4 e4 V5 |& x# i9 u% E$ P
  7. {
    5 d5 r; G7 B' a2 {3 {- ]+ d, h7 l
  8.     for (Quest q : _quests.values())8 g" L' }" l. t& w4 e) s  {- c: W8 {
  9.     {9 h& \, h9 p* I( f* g- l3 P
  10.         if (q.getId() == questId)
    4 `! h' |- Y9 J- E7 @0 G
  11.         {
    ! j: f3 r' N0 w
  12.             return q;
    $ P5 X+ d6 u. K" G
  13.         }
    ) Y$ C9 p) i6 @# t! t2 n9 J7 Z6 V3 g
  14.     }
    5 O# |$ v& P9 V3 C. \7 d1 Y
  15.     return null;1 e% M2 x( U+ N6 Q
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.% y2 Q3 {' x" ]1 n6 P+ m' l
  l% e+ L7 s! j8 U# ^* h" |
Метод addQuest(Quest quest)
- m6 U+ d) v) P- V( U
2 V- ^# ], P6 J, }
  1. /**5 l8 U+ I9 }8 r, n
  2. * Добавляет новый квест./ P! _8 V1 s: L. v! p) t8 I* |
  3. * @param quest квест для добавления0 p- D8 N( k; q7 E7 R7 j4 w
  4. */
    / r/ R) _: m/ ?
  5. public void addQuest(Quest quest)" D! @# I, y8 U2 Q) v. U
  6. {
    3 o1 t+ q4 d# r
  7.     if (quest == null)8 T/ {5 X* A2 |" v3 I# X. H( P- }
  8.     {
    4 }' n" B. M; x& [; a  u
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    7 d7 d' q( m) Y8 g# u5 c
  10.     }
    ; m0 I6 L/ r4 @+ f7 G3 A
  11.    
    5 ^! S0 Z3 t0 S: A7 V; `
  12.     final Quest old = _quests.put(quest.getName(), quest);, P" r! V- {' j2 r, w9 X/ ]! `
  13.     if (old != null)
    % {) x8 X' F: ?4 k5 D4 N
  14.     {* r1 n  k* `1 K: v$ q$ f
  15.         old.unload();( d  S. h0 j, V* a: o
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 S( B  v% K9 p/ F4 y
  17.     }
    ) p* ^5 `4 x: V, c. J- z1 K; }
  18.     4 ^8 g! h8 k1 U6 T" o3 z1 Q, \
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    7 z+ v9 {) d# W. i" Q5 w0 ~. V2 g
  20.     {
    ( k1 W/ Q3 S8 B1 o
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    : Q% \- g  F6 \' C7 M& f% o
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. K  P: C) r0 m2 \" V2 T
  23.     }
    : ]' [+ \- Q! i6 l! d' Y& E# I
  24. }; k5 \1 u# ]7 n$ J* c
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; B- G0 U# [% c. `' U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
6 A- J$ w# D- i  t9 V- S. x" A
4 h4 M( G, Y) f- q( v! n
! J( S9 M9 b' z* e2 k: l6 L3 s
, u5 W( V! n& x' _5 k
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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