Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius& k$ O' y7 T3 M1 e

7 r. @" U/ _( k3 |Разбор файла QuestManager.java  L- C+ c# Y' ^7 o8 z* Y
) Z4 U2 s& [) B, C1 k" r
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. W9 P6 z  t3 D' k# X1 V6 {Основные элементы
8 [& y3 P2 |- w% b
  • Лицензия
    6 i0 [- @4 k% s- @7 `
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 \/ V% P+ X" b  J: q
  • Импорты" P4 X1 O5 F# q% b7 m: r; C1 f; A' [

- c/ l. x4 g8 dQuestManager.java — управление квестами и скриптами.
6 D6 c& _) n! b2 t* ZПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\8 k' m6 q: a/ O
3 d% ^' o( E( n5 P

8 i: p- g/ H# [, ^/ m+ {3 }, }3 aДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 {* t/ W# a& a. M1 V, A7 B% g: |1. Лицензионное соглашение
( `% B. J' K+ L! K/ p5 w; s1 N( y9 [
  1. /*
    ' [" Y$ O/ ?; R1 S
  2. * Этот файл является частью проекта L2J Mobius.+ r- p6 b1 b6 J8 P
  3. *
    ( R5 m! d' d) G6 w, d! T8 v
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    1 L) @. O' M/ n4 ]5 n% z' s: Y
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    5 l# p+ f' O, a. f
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    1 x' Q; w( G8 Y- I& o3 U+ G1 w
  7. *
    5 G7 _/ p9 ~- a7 N
  8. * Эта программа распространяется в надежде, что она будет полезной,
    : y+ D, p( D& ]# o0 {: {/ y5 s- V
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    , y3 Q4 R4 ^! i4 w
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.* L" Y, r( L0 `- \* {
  11. * См. GNU General Public License для получения более подробной информации.
    ( t7 K+ b0 y' L% R& _) w( r
  12. * ( L3 r0 i: h* E3 _) i* F  C- Z. V
  13. * Вы должны были получить копию GNU General Public License; H, u, q" |" v9 |! }
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 l, _" \$ X0 p& u; P; @
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." G" l6 l! |( O0 c0 m& A8 u4 U
8 f  V- r6 h/ p6 u0 H

+ V+ G1 q2 a$ A& r) C2. Импортируемые библиотеки
/ X: U2 R/ W) _4 `0 M+ S
5 ~8 V6 l7 s% b. [8 J! v6 `" t
  1. package org.l2jmobius.gameserver.instancemanager;) `7 d7 y/ d( X8 W5 u& C! v  E1 ?: s9 w
  2. " A6 Z; V2 F3 s1 ^0 v
  3. import java.util.Map;4 `+ V# y" i3 k! n; p
  4. import java.util.concurrent.ConcurrentHashMap;1 `9 _+ O' u7 m# h( B, x
  5. import java.util.logging.Level;
    6 g1 `. y, N, j6 F7 ~
  6. import java.util.logging.Logger;
    / {! {6 E( I% Z1 P' t. J
  7. ! Q$ ?6 U8 e% p! v
  8. import org.l2jmobius.Config;
    ; c( G; D. J1 D3 V, b
  9. import org.l2jmobius.commons.util.CommonUtil;
    8 a2 b! _( }0 K% X- E- h  F
  10. import org.l2jmobius.gameserver.model.quest.Quest;5 E7 V, s+ P2 y* w' [( a& I* L
  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 — менеджер для работы с игровыми скриптами.  M) X6 ^' E9 n) L1 I3 U) g

! ^, r; D! i3 R- o8 G$ B) h; j3. Описание класса QuestManager
4 S( u: a$ ~, c" ~" }0 I
  1. /**
    3 z3 Y7 o- Y4 i* q
  2. * Менеджер квестов и скриптов.
    * {, h) |5 _7 F0 b: O" Q. g9 b
  3. * Автор: Zoey76, c5 Q& K, ]. }# X; P6 b+ s6 m
  4. */- p% F' a8 f2 |& Y- K% u
  5. public class QuestManager% o( B/ V5 B8 h$ }% F, j' F
  6. {1 \3 D/ E, q6 D+ c" h+ D6 P/ S3 {: K) c
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    4 m5 E9 D; y! r: ?, S
  8.    
    % k% G/ `) _- C, v
  9.     /** Карта, содержащая все квесты. */
    * O! I5 }% }, o  P
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! M3 t  O" I9 H
  11.     /** Карта, содержащая все скрипты. */" M, t" @7 }# I$ [5 r/ Q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    $ ~9 g+ H4 ?! c+ I; t4 h8 @
  13.    
    6 p: |: H* @. o  D
  14.     protected QuestManager()/ \: a% W; O4 E
  15.     {
    " e; P0 g" \' Z% w' ?2 O% p9 ^4 w
  16.     }
    8 Z, N8 p! ~9 J1 @  v) ?( @% x) y
  17. }
Скопировать код
4. Методы
+ z3 F$ `1 P+ l" g; R& z# ]: vМетод reload(String questFolder)  t- F$ k! [; @* p
  1. public boolean reload(String questFolder)! {: o( f- Y# w
  2. {
    & ]* Q, h+ w0 }4 X. c8 ~
  3.     final Quest q = getQuest(questFolder);
    * F+ ?/ e$ o$ g/ I9 v3 V
  4.     if (q == null)
    $ @; D( B/ r8 h8 K2 a# U/ L
  5.     {5 i2 x& n$ G( A# l
  6.         return false;# C' c+ }/ b2 C$ A' ]* _
  7.     }+ ?. _, w, i; N" l$ D
  8.     return q.reload();# j1 D  P; F6 `9 f. I( Z! z$ U
  9. }
Скопировать код
5 N+ c& i0 D; R6 Q' k, t& G

% O! G0 A- E0 V' ]3 ]. O5 jМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. j' g( Q, ^. u5 ^5 i
Метод reload(int questId)7 a4 v# `- d; P, l

- L! z: k$ {7 [! t8 {
  1. /**
    # L4 e( a% x. G  x
  2. * Перезагружает квест по ID.  D9 T- C" G3 E7 C1 {
  3. * @param questId ID квеста для перезагрузки
    0 l( g% X/ \6 F- l# n. X3 _
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ) K" }$ b4 ?" g" C. ~  b3 W* j
  5. */
    % y, f4 F: g  U& o
  6. public boolean reload(int questId)
    3 H+ h. L, L& w$ Y% R& \- g4 L
  7. {
    ( u6 u  Y2 j) X$ G  W7 q& A1 N& n
  8.     final Quest q = getQuest(questId);9 A5 W- h; E9 d. b# w
  9.     if (q == null)
    ; n1 g" B! Z% s0 U( N
  10.     {' |3 ^+ |; M+ q; w
  11.         return false;$ J" t& z% I+ M& R% E
  12.     }2 G2 m. O  W- [9 J: t
  13.     return q.reload();
    ( p# a2 M, C# V/ g" H2 b
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ; s0 K9 b, y+ G; i5 h# Y8 O' n

$ e5 D* d9 j6 X# h9 aМетод reloadAllScripts()* e) e- p/ T5 b( ]6 w

' F5 o( m7 W2 x7 d7 l
  1. /**
      P6 d, a9 ?$ s, _/ X- v/ ?/ u
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.5 _% {* h$ _* y1 I
  3. */
    7 E, s/ Y. K" ~3 C  k4 \
  4. public void reloadAllScripts()
    ) |7 N$ U+ a0 A/ v' Y  {% a
  5. {
    # R9 h' S7 O4 n7 R1 h" m
  6.     unloadAllScripts();3 X0 K# _0 r. m# }2 v+ J
  7.    
    $ ]  a: M; }. t1 F+ `' P* C5 t
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");2 z( K& s- L* F2 _4 D
  9.     try
    * @) Z/ b' }7 O4 Z6 i) x
  10.     {, d% O0 q) Z8 g) ^
  11.         ScriptEngineManager.getInstance().executeScriptList();; x2 q7 \0 y2 Q8 c; {; j7 L. a
  12.     }- |, w9 A7 |3 ?) ]/ x( }
  13.     catch (Exception e)
    # g+ L3 X+ A' \
  14.     {
    & z. H! s4 e3 t) s$ J  t
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ; [: U# `% i; e& D7 {
  16.     }
    1 _, ]9 J( \4 i" q' A+ Q$ g& ?+ j
  17.    
    + E  [7 m- B6 T. k0 T* \0 |
  18.     getInstance().report();6 M5 _! J& @! g# L
  19. }
Скопировать код
Метод unloadAllScripts()
1 V/ m( ]8 D# T! k) G; D
9 L7 t1 g& q) z% w' q' A- j1 x6 w
  1. /**) c2 R8 }: P( R, S/ [
  2. * Выгружает все квесты и скрипты.4 D8 f$ u$ R# B! S" F
  3. */7 |" W% f8 ~6 \
  4. public void unloadAllScripts(). C1 _$ x! h% `, K
  5. {
    3 Y5 p3 g: E) G0 \' v
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    % z+ T& e3 N- u2 V% X0 {
  7.     ; l- g3 s8 ]8 L% z7 G" h4 h
  8.     // Выгрузка квестов.7 I. z, \! @" t
  9.     for (Quest quest : _quests.values())" I2 R$ `; p" e1 Q) U9 x6 k" k! o& J
  10.     {9 n" m  o% T1 K+ Y
  11.         if (quest != null)
    : R5 L: j: A$ u) H' @" P( c
  12.         {
    0 L* ~% t. t( L
  13.             quest.unload(false);
    1 Q/ @$ f0 h4 _9 Y; e' S
  14.         }  o/ {9 u" x; U8 m
  15.     }
    / h2 H1 s# C8 K
  16.     _quests.clear();
    ; ?$ I: ]8 C& I8 t) ?
  17.     // Выгрузка скриптов.7 T' }8 q' I2 l9 e. A' o1 V
  18.     for (Quest script : _scripts.values())
    . w5 G% s& s& r, @5 j4 P
  19.     {( x7 f+ m7 A% L$ L# {
  20.         if (script != null)  ~, L7 W6 G) X. k
  21.         {& h* F3 J  L/ D1 l) K, A$ O
  22.             script.unload(false);
    . s! Y; i# H1 V9 U# S
  23.         }7 w8 a% z6 f) ~. U
  24.     }6 |0 m5 y0 y/ x2 |2 \
  25.     _scripts.clear();, E' u; j2 R) ]# C2 Q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 a4 m6 ?3 [6 h8 R
& F) _5 X3 d- D0 j; H3 V; V3 @$ y
Метод report()
. S& ?2 \! L9 ~+ w6 ]: D" H3 o& |' C+ m- J+ m* Q
  1. /**
    2 |. B8 m) x1 a- w8 }2 g4 ]1 f
  2. * Логирует количество загруженных квестов и скриптов.. f* F7 X* k+ F- I: S
  3. */
    6 c% r2 s( @+ u, z! W- I0 U
  4. public void report()/ M4 |' n! u3 c' w" G5 B
  5. {
    0 h" R- V+ `3 E- ~. N
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");* e( s0 q5 h" [' Q: a$ x) y
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");: p$ n7 q& ]1 `1 _
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    0 Y  u* d8 r+ Y

; b9 O* a" F1 i& TМетод getQuest(String name)
2 O9 Q7 h  a: I  r' h9 F
, D6 R1 }4 ]1 V; f4 |5 `
  1. /**+ U5 X+ S1 v! ?0 i& L
  2. * Получает квест по имени.
      p, u5 }$ H- T) k
  3. * @param name имя квеста
    * f* h* d& m( b7 e3 o9 E
  4. * @return квест: }; v& R8 }. Q- a) O2 v; b9 w
  5. */
    / |" s+ Z& i$ i) @$ n# J
  6. public Quest getQuest(String name)
    . l. X8 {5 p6 E& x  w3 p
  7. {
    $ q, d) a9 y# [  h6 F" B
  8.     if (_quests.containsKey(name))1 d* K# l5 S1 ^6 D' P/ l' [
  9.     {- n) \/ p+ o$ o; X" V, d
  10.         return _quests.get(name);7 a9 d- h( h6 C& q6 ^, w
  11.     }8 P5 B. E) t. P
  12.     return _scripts.get(name);/ j0 D) P" y9 r4 A! r2 o5 M
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 O2 u6 ]1 Z4 k

; L0 _9 |; p; u5 J/ R, B( ^: }0 xМетод getQuest(int questId)
0 [0 N1 d* y' T" D
6 b4 O# _6 Q! h0 T7 E' R8 I+ C$ `( b
  1. /**4 p: i( d2 _5 E1 p% O* Y+ x% q
  2. * Получает квест по ID.
    ) _! l% o0 c9 ?8 {# c$ ]
  3. * @param questId ID квеста
    8 B3 p5 ~4 Z+ @: [: Y
  4. * @return квест, если найден, {@code null} в противном случае
    + w- s" s, ]$ M4 J
  5. */
    - w3 r7 N) u! m5 x
  6. public Quest getQuest(int questId)
    ' [9 E3 W" `9 I- ?2 W
  7. {
    . U5 \. L4 E8 m5 v1 b# ]+ x
  8.     for (Quest q : _quests.values())
    ( p1 q4 Q  F1 o+ X" Y- |
  9.     {7 W+ {. L  ]# s5 B; h$ |
  10.         if (q.getId() == questId)3 x" ]+ F1 q& r. O. C7 z
  11.         {. }' j! X" l' J* H5 C7 L( R0 N$ ~3 S
  12.             return q;, L  ~. n( \4 v
  13.         }; A4 y3 h: ]7 [
  14.     }5 d0 V  O1 e9 J2 s
  15.     return null;
    2 e$ w, Y6 P' c" r" z$ m
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    " ^% Z& t) P1 w0 f# F, ]* F! Z
# s1 s! [* L0 a6 p1 d0 u
Метод addQuest(Quest quest)
% A3 K. ?. }* }" z2 ?: |" v+ ?( z$ Z9 r, j$ J
  1. /**
      E& j# q  K5 E! ?# {+ _
  2. * Добавляет новый квест.
    ' w3 p% Q- m+ C. U
  3. * @param quest квест для добавления
    4 \' p2 j5 w/ M3 x3 _2 z2 m( B
  4. */0 r( J# i5 o! d- C& g. o* X
  5. public void addQuest(Quest quest)
    3 I9 z  J; h# \. N. Q2 m1 D
  6. {4 r" [' a/ Z5 }% p
  7.     if (quest == null)
    4 L7 S, E: I5 c9 j4 G( f! ^* _# W
  8.     {
    0 r- ^: X7 x! z7 L4 m
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");0 u2 d3 X8 \2 V* ?* v. p
  10.     }1 J" g2 L, D: Q9 M
  11.    
    & k3 q6 y; m, R' c8 d5 B
  12.     final Quest old = _quests.put(quest.getName(), quest);
    & ?( w9 i. r9 [( q
  13.     if (old != null)
    ( \" m4 D7 _) G8 q% y7 h
  14.     {
    7 ~9 S5 P' |' Y
  15.         old.unload();  k: I1 U+ l! K. e! l* Q4 f7 L
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# E( F% E, V3 A! B5 s: d
  17.     }
    ) c  h5 \3 B9 I: S
  18.     / _8 U+ g0 F2 j( W  m
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    8 c3 |8 E$ ^+ t6 a. Z$ R1 d
  20.     {$ s5 I0 a7 y6 y
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    + S+ ^: r3 @2 R6 h7 j. U, s% I. b) d
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    / F0 ^* M9 s  {4 `  b
  23.     }
    ; w  e1 z9 H$ d; [+ Y3 S! c3 u
  24. }
    & B! V, Z7 X% i. e
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* ^+ h1 R. H! a  _4 ?' ]
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.9 s+ p! x/ U1 Z, g! U% u) I
2 y' O# v# A& z- w( n
* p/ }6 b( r9 u& ^- k2 M* j8 t/ O
9 n, }" G0 ]) ^& `+ Z
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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