Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 |2 j8 @$ V4 q' M6 P+ a: V; G2 s6 {( u/ k
Разбор файла QuestManager.java( ~6 X5 ~2 c  L, y. N4 Q8 v) R
, d2 J1 D: n) v8 Y+ h0 t
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
% X7 h3 Y- N( v' pОсновные элементы
  ~# p3 W# b' a9 x# h5 N
  • Лицензия
    ' T4 [& U5 k& m' E
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 e8 \: ]8 ~+ P+ Q& Y$ q
  • Импорты
    ; Z  S: c- r2 K% U# n7 Z! p* F
% o+ G( M0 t. {, G5 J; s, W
QuestManager.java — управление квестами и скриптами.; _2 A7 C) o, `2 C+ y3 I
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
2 B- L9 @9 I- T) Q) C( t3 Q% M5 l
1 _# c! `9 B+ S  s" e2 W
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.* D: c4 z5 \; H3 i6 \/ r8 u8 m
1. Лицензионное соглашение: @" r: J+ h+ m- {; c, G
  1. /*
      O% @* T- \' l; k; d( A* h
  2. * Этот файл является частью проекта L2J Mobius.' V% u* d" E: }! `
  3. *
    0 \3 V* j2 e% Z& Q2 W6 [
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& b8 ]( T$ B6 v
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    , x! O: x. B6 k+ Q9 P( z
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    2 k& ]9 P' h% W  [" j8 R  Z! D; `
  7. * * ?, {. o0 k- b3 q9 L
  8. * Эта программа распространяется в надежде, что она будет полезной,
    & W9 H+ Q1 T3 i7 E7 |$ w
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии9 F  D& u. H9 S' z
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    . A' Q+ K* l" v- E3 ~8 n. a- r% n
  11. * См. GNU General Public License для получения более подробной информации.0 X9 K( c5 S0 V. v3 F
  12. * ' z, D! Z; \8 W# |2 P
  13. * Вы должны были получить копию GNU General Public License
    + W+ }- `1 |% r( u2 S5 ~+ H
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.5 L, n# r! f' m% L5 x' g* r
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
) l$ a( x  v) p8 {+ C* ~2 ^: N
  P/ q0 t1 F( G- b( J. O8 d2 ^7 t$ V
2. Импортируемые библиотеки
5 I: Q3 h! T/ Q. t% W' y: w) G- i& ^5 l& \
  1. package org.l2jmobius.gameserver.instancemanager;4 s. R2 Q- a7 B

  2. * _, V1 `7 j8 o6 Z$ k8 N6 l
  3. import java.util.Map;
    ; W1 y+ ^5 _8 e/ l7 a4 s- j
  4. import java.util.concurrent.ConcurrentHashMap;
    4 B  C( w2 J6 Q; a, w' B
  5. import java.util.logging.Level;+ v# ~  n; d- z% |
  6. import java.util.logging.Logger;4 J% T0 L* c$ v8 A9 Z% I. F
  7. ' f1 z) I+ ]) m% U3 s# G  t+ Q
  8. import org.l2jmobius.Config;5 g- O  b- m7 a2 X
  9. import org.l2jmobius.commons.util.CommonUtil;
    ' ~: Z, o4 h3 c8 Y
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    9 P0 c) I5 Y1 M/ l/ z; G5 y) q
  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 — менеджер для работы с игровыми скриптами.( w* }( `5 ~2 I6 z2 ?
; `# E! P8 `7 O- N
3. Описание класса QuestManager
, R0 N; t8 S( u' @1 W  d
  1. /**& H# d6 e# j3 Y$ Z- A& o
  2. * Менеджер квестов и скриптов.
    2 \+ w/ w4 F' A
  3. * Автор: Zoey76
    % M: y9 G/ m& d. U- o, U2 L! O
  4. */7 \) y# @4 X+ ]# x$ F: J3 X
  5. public class QuestManager0 F: `4 P& l, C/ ]* \; }/ b' Y
  6. {7 K, o+ f, ~, q8 a
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
      Z. v% C  z* |" s6 N% `' W9 f6 I
  8.    
    5 f9 \! P: y3 R/ L. E
  9.     /** Карта, содержащая все квесты. */
    ( B7 X0 f9 Z  O! g9 f, I" {
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    - g% I$ X9 B  g9 G7 @
  11.     /** Карта, содержащая все скрипты. */
    ' o3 a: x( u# A0 P( q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();0 ?, X4 _: K: t2 R3 O  l
  13.    
    * P/ u' y& T1 e
  14.     protected QuestManager()
    4 ?1 q2 Z9 P8 }" H8 Q4 a
  15.     {; z7 j% K' N9 R. v5 o% t( A
  16.     }' `$ j* x! g! a- U7 J* ~
  17. }
Скопировать код
4. Методы* b9 F7 @6 f' T: U# O1 ^, {
Метод reload(String questFolder)7 U7 k% f% t% {9 o; R) Q
  1. public boolean reload(String questFolder)5 R% c1 g- M9 d5 q  B
  2. {) f9 P+ D7 X4 N1 V/ X' }% \
  3.     final Quest q = getQuest(questFolder);
    7 n9 C' n* u, |; f0 Y+ P3 L7 R) c
  4.     if (q == null)- q% s0 A- @3 Q- h  T- z7 A$ B6 R8 X
  5.     {% m$ M, j) }$ i) B( ^9 G
  6.         return false;! G$ a. S; f. L: E+ l7 {
  7.     }
    ; V& z" }" X; n6 e9 x
  8.     return q.reload();) l7 r  A, f7 H8 z1 T
  9. }
Скопировать код

* `, U- |; |& I+ k9 j- I2 `2 H, S
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
8 x* ?- f& _% A& @8 F+ XМетод reload(int questId)5 M! m+ q3 M$ S3 f( j6 K
7 i8 D$ R# ]7 P
  1. /**- l& N& d1 _, ~! [9 s) L0 h
  2. * Перезагружает квест по ID.
    8 Z; _; Y$ Z: T
  3. * @param questId ID квеста для перезагрузки
    3 u2 ^3 [" R8 N" l8 U& T# U
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    2 D8 @' V/ P% V. n& a0 i( e
  5. */4 Z4 m+ q' B. H7 k: l4 b
  6. public boolean reload(int questId)
    , v- N$ z3 A# V( \8 }
  7. {
    1 C' p9 ]) i# w2 o
  8.     final Quest q = getQuest(questId);
    " t: j2 h: T8 H( C% a
  9.     if (q == null)
    5 A" Y  n' v7 t
  10.     {
    " Z' `7 _. J5 T! x+ }
  11.         return false;) x* q, K2 H2 v9 E- W" z$ j
  12.     }3 t! e8 t( M2 k& q
  13.     return q.reload();
    & I) }4 t8 c5 i. q" A. u1 n
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.4 K; U4 I' O! b8 Y  `% y, m
# P% `1 y! I/ ~' W/ J& Q- m: H# F- |
Метод reloadAllScripts(), b$ `1 z( X$ g9 s  |

' g/ V# d3 ^. a- T1 T2 o
  1. /*** D6 m* B% t) m% y% B
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    2 O) W& y9 Q% Z
  3. */% D7 C' v& @: M# U+ D8 v
  4. public void reloadAllScripts()$ U1 Y6 _* u' u& c
  5. {* m9 r$ q( I# ~# @! t  f0 v8 M
  6.     unloadAllScripts();
    : P. a6 C: A: f) k5 O+ Z; O
  7.    
    6 t9 C6 u5 A: h( C3 u$ w
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ! A- k' g; k- E# t. e) z
  9.     try
    8 ^' D6 N6 l  Y4 X( e; {1 Z
  10.     {
    8 e  Z+ I) i6 \3 t7 v
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ! @% x3 x* y, r- |
  12.     }
    ( I2 w3 }5 H/ R1 \$ R  J* s# ]( \
  13.     catch (Exception e): w6 M& t1 D- j/ V: j2 \% {
  14.     {
    ' Q3 Y3 w5 ?) h, G
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    / w  l6 M) }7 {9 j- g  D" k
  16.     }
    & e, e9 g$ Z+ o+ m) {
  17.     # s2 h. X: t# M" s
  18.     getInstance().report();5 w9 n# e5 U% q& z' [9 M
  19. }
Скопировать код
Метод unloadAllScripts()  l" S& P+ ^+ @# h* n& A6 K3 ~

7 a# ?& U6 k, \! u. l0 l0 s
  1. /**
    3 `# T' v! h2 k" A
  2. * Выгружает все квесты и скрипты.- y7 t% S9 F! G$ X4 v+ E- M
  3. */
    : U) C& Q* B5 ?0 F
  4. public void unloadAllScripts()4 Y# _* L' g' ]/ s! X# A
  5. {9 C$ l- I0 R6 B* w- D$ [
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    # [' c! X* c! c7 z- E3 j
  7.     . e1 }: o* ~$ s. x1 y  R0 z9 Y
  8.     // Выгрузка квестов.
    , B% E9 O' L) u, L' @9 S- Q
  9.     for (Quest quest : _quests.values())3 N9 m% g$ g- ]$ Q& I$ u
  10.     {; i/ N+ n5 p$ _
  11.         if (quest != null)
    / K8 j6 a8 {: F1 e" v0 }" H3 Y; T3 `
  12.         {( Q$ R: W/ B$ H) ^/ T6 t# ~
  13.             quest.unload(false);, F$ W. O1 t$ E8 ~
  14.         }
    . S" e% k  {5 [% `/ K
  15.     }5 j& m  ?# k; B, ~6 \" a
  16.     _quests.clear();- n, @6 @5 ]# s/ m9 |' }
  17.     // Выгрузка скриптов.' Z# Y) h4 ~" S& y7 F& T
  18.     for (Quest script : _scripts.values())$ r2 A7 _0 w- }; `  e, p
  19.     {& `$ _$ y9 X6 f( X
  20.         if (script != null)8 t' s0 X8 A& H( d% ]
  21.         {
    * u3 I. v% O5 _. g
  22.             script.unload(false);, B8 \  T* e2 j$ `  R& j
  23.         }
    / w" x/ `9 b% U3 N* t
  24.     }
    / r2 X: N& d. Q
  25.     _scripts.clear();
    9 z2 s+ g; U. j8 E" Z% t
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ N2 B+ f' B$ K$ @1 J4 K
3 @. x4 }/ m4 X5 d, N
Метод report()
( l$ n2 p0 w9 M. m( [* T. D4 Y8 \
3 J' a( U: D* E) I
  1. /**
    6 Q; }7 ^7 `$ M) e6 i8 N) y- C, C) n
  2. * Логирует количество загруженных квестов и скриптов.
    ; k1 B+ j1 p9 V: I# G4 E
  3. */
    1 k9 G8 D- }9 R8 ]1 S5 q5 P5 t: J
  4. public void report()5 k1 n2 c0 q( x! Q4 A3 c* A0 b* t
  5. {, k  c# C* ^* F9 c5 _
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    7 G4 ^. V4 ]! |# ~9 ~* O
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    & {  V# U( Y+ e4 Z8 k1 N
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    $ \  R) S. V& v* @" k! p- D5 b
+ t. e* @! V) A2 U& S( M
Метод getQuest(String name)& k9 l5 F9 J: X: b5 p
3 N6 K" k3 ]0 B3 c6 L" e
  1. /**
    ) k& w$ n' Y; x$ Q" s! y
  2. * Получает квест по имени.2 i& y- Y5 P& t9 T+ h2 R1 ~& T/ O
  3. * @param name имя квеста" y) s$ f! c! \+ S
  4. * @return квест0 s* c  L  P8 l4 l. i/ |
  5. */, T+ }5 x- q1 [+ J. G& \- a
  6. public Quest getQuest(String name)
    0 E3 U. q( I% b7 x+ ~
  7. {$ q7 ~- a$ F$ a) e: P5 C* m8 }
  8.     if (_quests.containsKey(name))+ N0 Z- _' |) [& p, S$ ?
  9.     {
    0 Y; o: A+ y3 E) [$ g
  10.         return _quests.get(name);
    ( g2 l+ E3 e4 s. |
  11.     }1 j4 \  E7 Q9 N. w( L# C7 E
  12.     return _scripts.get(name);7 v1 k1 _: h  a: N. _/ |/ u3 a5 }' s* ]
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    # M) K4 Z/ d" l7 p6 K- h8 R

6 f! j/ C3 q5 H% N, n7 f8 ~Метод getQuest(int questId)
) b- n3 u' ^- @# a( G8 H& Y% y
! O2 g" h7 E" z5 B* ?2 y
  1. /**
    $ W5 b/ [* ^$ x& F3 l4 U
  2. * Получает квест по ID.% ~  o' A3 o7 ]
  3. * @param questId ID квеста1 j8 S- G6 X" u
  4. * @return квест, если найден, {@code null} в противном случае- {# ~( B3 L- x, _. z, U
  5. */# `4 C2 S) ]1 W* G& g
  6. public Quest getQuest(int questId)3 R3 H8 F1 j2 Y4 P/ x
  7. {# b* N4 z9 [( B% i8 n0 N0 o. W. U
  8.     for (Quest q : _quests.values())( D/ t6 D; g' L% G( {7 _+ d
  9.     {
    4 B4 d! N5 p) n" ?
  10.         if (q.getId() == questId)6 U; Z* e6 {+ ?
  11.         {
    - |1 Z) }' e( d6 Q6 T+ W3 V) N; Y$ }
  12.             return q;
    3 c4 D( C: I5 J1 _4 L- t0 \2 }
  13.         }
    + S( C4 X/ E- r0 T- W$ G3 e
  14.     }
      H- m, e3 u$ z! `" F
  15.     return null;- `/ w: |+ Q1 a) E
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    7 _, V; [/ r3 s+ I* T: N  t
# ]) b6 _0 _5 N) s' Q3 ?
Метод addQuest(Quest quest)
6 J. C) k6 N# n5 x4 y
3 w& G) _; ^# y
  1. /**3 T; o7 P4 D! z7 i- Z6 r# e
  2. * Добавляет новый квест.
    7 Q! c: a, I  J0 A( ~
  3. * @param quest квест для добавления
    9 H0 a3 {* `4 `4 W, W
  4. */
    & \* |; i4 E2 l; T
  5. public void addQuest(Quest quest)
    3 F* X! y& h6 X0 j- Z6 |2 t  q
  6. {2 [/ p- p( m5 p) O! `# c, M
  7.     if (quest == null)3 t. D5 U; J& p' x7 m& _4 D
  8.     {
    . o+ S8 g8 g4 [* c6 |8 K$ K
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");; d( L; U$ ?' Y- R( Z6 s
  10.     }) v2 x3 C( }1 g- }% [' h7 n% ]5 G- y
  11.     : d9 S3 K* g4 T% y/ N" A9 C: q  c
  12.     final Quest old = _quests.put(quest.getName(), quest);
    3 ]8 G+ c7 l' u5 [
  13.     if (old != null)+ ?. g( @6 o# ]2 b" Z+ p% r7 m- S
  14.     {
    + m3 f  }0 J( |* X5 B& a
  15.         old.unload();- }3 L6 j& q6 \
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# n+ C0 m+ t7 s
  17.     }8 j/ A& ]0 c8 w8 z
  18.    
    6 W4 @; ?$ o6 G/ a/ a3 A
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)  g, z" z+ o+ j0 }) \) f
  20.     {# z9 e7 N. ~( p3 E( }' z- {
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 ^1 ?+ W7 j' c' p
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    ' U+ a% c* K9 w
  23.     }
    # k' D1 u8 A7 w/ X/ c1 w1 N: G: I
  24. }. n1 ^7 G- E5 G$ g8 Y
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера." n& l6 B3 E4 p8 w. M+ Z$ T
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.9 b2 D( V* h. d

: M9 W8 b# h7 F" q" M+ e; o# n) y# I! y  J. f
0 g% S' X  L$ R
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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