Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
. L& c8 Y' q% L* p6 d% ~( z0 s: S- ^+ l/ l" l, y
Разбор файла QuestManager.java4 c4 V9 p/ `0 O4 K/ _: }
. `) n4 p0 P$ x, e! i  A
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.9 v/ I' ?8 o7 n0 k
Основные элементы/ ]$ b( |: F0 r' m
  • Лицензия$ m6 d5 K5 F! N1 D& f* T# M" e
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      % j* D+ a8 y8 h, z3 |1 b7 e1 P
  • Импорты
    % {% T* [- v, _. F- b5 [% M  I

) s5 b$ x1 h5 |$ |: ~QuestManager.java — управление квестами и скриптами.! {8 }& {& _1 P6 ]. H' i5 f
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
, C* }! x7 |( x) y- t7 b0 w% K; P) ]3 x
" |9 I) j. }0 p4 N7 O/ K2 P- t
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.. D" d$ ~  Q# \" q# I1 M
1. Лицензионное соглашение7 T2 A1 L9 p# p
  1. /*
    , f$ D# z! G8 e) X' H3 v
  2. * Этот файл является частью проекта L2J Mobius.8 a% E$ l; B3 g% E$ R- h
  3. *
    / v  V  ~, y% x" Q; M  [7 m0 x( C
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    . }. W* v$ P/ }, b
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ; @1 k* F" \4 o8 o" s( M5 @& ?
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    - l& `0 p2 w, A+ {/ u* S5 C
  7. *
    ( U, U" C7 e) X' i3 _$ J. H+ U
  8. * Эта программа распространяется в надежде, что она будет полезной,
    6 g" N- ^$ q* U( C+ P8 s3 C
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ v; z  O* W1 b0 E, h
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ; s$ X8 k) }0 K7 w3 ^
  11. * См. GNU General Public License для получения более подробной информации.& a5 g4 h( t( T; U# r* u
  12. *
    ! }9 ]. g3 H6 H7 C# |) N  ?
  13. * Вы должны были получить копию GNU General Public License
    7 G  a! p; s7 E9 n0 V: t+ b! r
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.& I, c& f. l3 Q8 X! h4 u, ?
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( y# u4 ?/ _- W: W0 i# t

6 d9 [8 P+ d6 u7 H# W, d4 _( s8 O$ _7 X: M4 C
2. Импортируемые библиотеки. m" u* O+ [6 N* F( H

3 D6 ], P8 R2 I+ O$ J' f
  1. package org.l2jmobius.gameserver.instancemanager;- |) d. I5 ^$ I6 D3 e; i- F. P

  2. : P; b& ]& I# Y) g" q
  3. import java.util.Map;/ u  B% O4 P  c' O* I
  4. import java.util.concurrent.ConcurrentHashMap;0 p4 _1 |* s3 e) ]% U8 x5 _6 l3 Y
  5. import java.util.logging.Level;
    , q' l  p$ b0 x  |8 X) l/ W
  6. import java.util.logging.Logger;. \% z$ @# n! O- V/ `2 G

  7. 7 \; z8 e% t$ L
  8. import org.l2jmobius.Config;
    0 h8 o3 O: T; i
  9. import org.l2jmobius.commons.util.CommonUtil;
    ; K2 b- {$ G% U. O8 ^
  10. import org.l2jmobius.gameserver.model.quest.Quest;% Y$ _7 _" O: s; 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 — менеджер для работы с игровыми скриптами./ U& m. K5 o. K1 U4 G, m! e, h. H* r

* \8 @* M1 \8 P" ~2 r. x3. Описание класса QuestManager& r; [1 Z5 l( [/ `
  1. /**
    5 a: y& ]4 U0 T) S9 M
  2. * Менеджер квестов и скриптов.
    * Z2 A- w' X' t  y- k' U/ M( J/ q  \1 K
  3. * Автор: Zoey764 D3 R6 c+ ^* Q' T% @
  4. */3 Q  @. `9 F1 f$ i2 @# v3 x5 H
  5. public class QuestManager" v  q+ R4 u' W- e% R( v+ m, J3 L0 {
  6. {
    ! C" O* w# q- V( `' G- u* s7 O& k
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    2 |/ ^: [! C+ r' E
  8.    
    / T) q' C! K8 D- M3 Z" h
  9.     /** Карта, содержащая все квесты. */9 N; E. H7 Q" D. L
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();3 Z, j" r& b5 T2 u
  11.     /** Карта, содержащая все скрипты. */, @  k5 u3 I1 t: m
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ _, d% [0 ~3 Z" T1 q2 P2 C) R5 t
  13.    
    . J* e) e; N# g& m. K0 N
  14.     protected QuestManager()! p& m0 \4 N. R+ w5 I, A3 s- D/ Q
  15.     {
    . b1 K7 s/ _9 w: C& P6 [5 I
  16.     }
    % r1 b. s1 ?; v1 ^
  17. }
Скопировать код
4. Методы, Y# V% f) h! w
Метод reload(String questFolder)4 G& I; n# P0 f  z: u
  1. public boolean reload(String questFolder)8 Z$ O6 x3 [7 j% O2 l2 F
  2. {
    . Q9 p. h7 M6 G+ }/ s4 a: ^- h( ~
  3.     final Quest q = getQuest(questFolder);+ B* D" V) |( P
  4.     if (q == null)
    % g* a3 R" i6 R) V" n* K. |
  5.     {3 i! _0 U, ^5 \% ]7 V
  6.         return false;- \9 y5 U+ E# I/ M' @! }5 E$ }# O
  7.     }
    8 ~# F+ d1 R- H1 t3 `& i
  8.     return q.reload();% F$ C7 T3 ~1 e( x8 n* e+ J) N: H2 E
  9. }
Скопировать код
0 J3 ?. u2 f: w" E: a& i3 Z* V

- H2 e, v4 ?3 r$ m: u% \Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( y/ U/ n0 Y* C; N
Метод reload(int questId)
+ @, o" K, J* t4 n/ H* K  @0 o9 A9 M
  1. /**  J$ |$ r! s6 V
  2. * Перезагружает квест по ID.
    ' p! D$ k8 B7 J4 u
  3. * @param questId ID квеста для перезагрузки
    + W( t, S0 U/ ^
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ! N4 b  f: |' Y5 L0 f
  5. */
    5 n' z9 Q' C! d- {9 d
  6. public boolean reload(int questId)
      R* e. s1 l: z8 X
  7. {' \& Y. ^- ^  m; K
  8.     final Quest q = getQuest(questId);
    : a$ J5 A8 ?1 }: h; g
  9.     if (q == null)
      a6 E6 ^: u! B2 r) K) z+ r
  10.     {
    4 |3 N6 J3 o8 t4 {( f
  11.         return false;9 y* o# ~$ O4 j, ^
  12.     }
    ) W% F8 i% A7 G4 j1 P
  13.     return q.reload();
    5 }/ A( ?4 l3 Z! j* A- `7 n" E2 u: A
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    % E' W* o7 A$ w) n, y# D/ e- b
! K# R9 r! H, A: f$ j. H% E
Метод reloadAllScripts()
: v: f" b, N0 {/ ]; Q% L' r% S0 N7 X
  1. /**
    ; ]: B: {7 e) o
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.$ r4 B0 {2 h" N( B$ j, S3 T
  3. */, P. N* ^1 n0 s" h3 ]; {
  4. public void reloadAllScripts()9 X9 U5 Y6 Y! N% D" a
  5. {! m0 Q! e8 |2 U% w5 d- A) p8 @. `  J
  6.     unloadAllScripts();' D. M" R2 d+ c4 D7 ~
  7.       }( X9 Y$ r$ Z! X. G. e: }# Q1 q6 t
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");& n! E' r0 G% }5 V. k5 V9 D) S
  9.     try: I' U9 {3 x/ K& q! p" V* X! E" i
  10.     {' G/ ?4 n- _) f" _6 N# A
  11.         ScriptEngineManager.getInstance().executeScriptList();/ x) a; O- u) t. Q$ P1 y: [9 h1 v
  12.     }+ p" ?6 Q* |6 s5 P8 q5 w
  13.     catch (Exception e)+ D: ~# `% f1 D" ~2 x/ }/ {4 h
  14.     {
    " g4 d8 U. q+ ^" |- i- M
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    7 D# {7 P1 Y4 M# a/ N' t; ?4 c
  16.     }
    0 Z  |! ~8 }$ v5 ?6 L0 L
  17.    
    * {& n3 k# M1 v3 L  o) @3 b2 x
  18.     getInstance().report();
    ' t4 E9 H& U1 \6 ?' h
  19. }
Скопировать код
Метод unloadAllScripts()
  _- S9 \. h- _! S, Q
( r, ~1 w: a! ^" n
  1. /**: j: V" |5 q# r# z+ X9 J/ Z
  2. * Выгружает все квесты и скрипты.
    + z) [7 g! D: H, F) e* |
  3. */$ ^, ^+ [/ |3 A5 H% s5 I7 x/ w* D
  4. public void unloadAllScripts()
    % L- Q1 P) M3 `4 k5 r
  5. {
    9 h  T; y! A- o) d. e! C
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    2 J1 ~3 Z, Y3 P, z% t4 F
  7.    
    + m7 Q& F. j& ]7 s' B, \% q% s/ ]
  8.     // Выгрузка квестов.
      p7 |! I6 g4 V! m* C5 V' b1 {
  9.     for (Quest quest : _quests.values())
    7 b# J! M" [) s" _% S
  10.     {& M  t/ Y3 ^& Z& v% ~
  11.         if (quest != null)9 ~4 i* Y3 Q, R! t% C* U
  12.         {
    3 [: a' Q8 b8 ?5 d  |" [) n1 [
  13.             quest.unload(false);
    % u" D7 W8 x; q# e: j
  14.         }# D+ o& T# r& x' R4 W0 }# y  x! k
  15.     }
    $ c+ v; W, m) L7 K
  16.     _quests.clear();' f9 t8 {1 J4 t5 K- T2 H8 i, t
  17.     // Выгрузка скриптов.
    - n8 Y, `* R* N3 C! O
  18.     for (Quest script : _scripts.values())
    $ T+ `" s% k! @  b
  19.     {
    ' Q, [- f7 \8 N4 B3 p
  20.         if (script != null)8 }0 d6 C0 g1 k6 j. e  u. d
  21.         {
    ( N  J& \7 H# i8 p
  22.             script.unload(false);
    * G, q& D( W  r7 {
  23.         }  x/ v$ ?. l/ {- B
  24.     }
    " h( D' v$ z& P# D% y
  25.     _scripts.clear();
    # N, u$ x1 w6 O+ S* w. R$ b8 _7 @
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.2 N2 u" ?9 {! {& {& c
  ]6 q' D) p! N" e5 N
Метод report()* e' W) T+ c' _. j, y
" `+ T  [9 p# y7 A* S) s: e
  1. /**
    8 }( M* ], U9 }2 d
  2. * Логирует количество загруженных квестов и скриптов.$ `" L2 r, \0 B$ w
  3. */: o0 i4 |9 K$ t
  4. public void report()
    5 t! d2 d* S6 P8 w& _6 P
  5. {
    ; R) ^) O: V9 A6 `) j/ Q
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# @2 r# e+ N7 z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");& a' m7 @- i! Q  {+ }# B/ A7 t. V
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 p- {6 c* e& D
! p+ A) P. d7 p! ?9 M# c, Q6 |& P
Метод getQuest(String name)! {- r, ]( v. e0 U
- R: e! i5 H. b& `# t
  1. /**% j1 [% {8 ^$ K  y# s9 i4 k
  2. * Получает квест по имени.0 V! t) J3 ]: ?+ k+ o
  3. * @param name имя квеста
    % T1 P+ J" K2 q
  4. * @return квест
    $ I1 d/ o: L1 W( L
  5. */: I0 }4 Y! R6 B" A' k! _1 ?
  6. public Quest getQuest(String name)
    / {' e! m, V) r5 H
  7. {
    ( _$ c! z5 y& {( _2 w* Z5 c
  8.     if (_quests.containsKey(name))
    " Y- o! R$ g  w0 n( L. ]$ ~) T
  9.     {
    . D# A& r6 x  [. O
  10.         return _quests.get(name);
    , S/ o9 N' s5 J: z& c$ {  H
  11.     }+ B3 j! w3 P/ j9 f8 x  I# X1 Z
  12.     return _scripts.get(name);' O1 h' k/ S) Z
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ w6 l8 T. ~8 n

8 X7 D" D; x/ _4 VМетод getQuest(int questId)' U1 H: ]8 w3 h  Q! V6 w( {
( E; ^4 ~% a5 W. Y# S
  1. /**
    4 M9 W8 ]2 D2 }; `2 W' Y, \
  2. * Получает квест по ID.# U- h  p6 h+ p$ M
  3. * @param questId ID квеста
    " I$ c" }" a: }4 ?! w5 [+ R
  4. * @return квест, если найден, {@code null} в противном случае
    , E; S9 U7 R/ k, u! g9 u
  5. */1 W: M; r- n% n' r
  6. public Quest getQuest(int questId)& a/ A7 [4 S  D  d4 [. _
  7. {' q+ Y/ U. C- I& Q  X  h
  8.     for (Quest q : _quests.values())
    # k5 D/ E' n; f3 z' y& @+ X( j+ G
  9.     {/ z9 o5 K" v- x. u% S
  10.         if (q.getId() == questId)$ V+ H0 Q/ G; p* E: C* z
  11.         {6 P- S/ B$ L' Z8 `8 N& Q
  12.             return q;
    , v7 Z( l) u6 D* {0 z5 u
  13.         }
    1 H. @  V( n, w% ?- s
  14.     }
    - h5 l2 R! W$ n( ~0 v2 h$ Q5 c
  15.     return null;
    7 P8 F/ n: C0 m0 E3 y4 n  r: e' \
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    * t9 o( w! p0 o, w

' C! }$ Y+ ]' m' T$ i! K0 zМетод addQuest(Quest quest)
4 o6 q4 h& ~0 a) F
: v" B- Q4 T! C4 [
  1. /**
    6 T: A9 Y' {/ `" J
  2. * Добавляет новый квест.( j: ]+ P* `: Q; ?+ X, F
  3. * @param quest квест для добавления
    5 v7 ?$ N) u+ W' ]' K2 A
  4. */( m5 {' H1 G5 o+ d7 N$ M! F
  5. public void addQuest(Quest quest)
    & E  Z( `+ h1 t- q  ?
  6. {& a2 b9 ~9 m6 n2 y& b# G6 n
  7.     if (quest == null)
    6 z% t: x8 k5 S9 {9 |  s9 ^8 v' O+ p
  8.     {
    7 X' r( N2 w  z4 y" W7 d% A
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");* g! c# J9 {- E( X+ S
  10.     }
    / ^+ O* H: {' w$ L
  11.     # y% w: u, Z9 u# F0 h$ ~
  12.     final Quest old = _quests.put(quest.getName(), quest);9 m& D1 O" Q- w3 A+ f. m
  13.     if (old != null)
    ! ~+ {$ w' g' g" Z. K; J
  14.     {" C. w* y1 z6 t
  15.         old.unload();. @; n( D- l, k/ u# @9 m' C% p
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    3 X: a1 j: N- v. T8 @. b6 e
  17.     }
    * v4 O/ W3 ?+ G7 [: x+ ]
  18.     - T2 v6 E4 N# m) x. J" t; M
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS). u, f/ ?8 N1 M; \
  20.     {
    ; B; r; i) M! m& t& h
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% _3 B# Q; ^3 ^
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    : B- ~9 s  g2 A6 {
  23.     }
    % R! ^  _! h; o$ i  V
  24. }
    5 j3 j/ R+ D6 V  B8 F2 W" x7 i+ W
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! y( H1 K* |1 n+ ~+ Z  XЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.: E- V" w4 t( @
* k. ]( p$ R+ R% ]8 B2 u

$ l+ H& N! u' i. V! a9 x7 h
& ^6 e" [% b% i) V: y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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