Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 _/ Z+ t9 i7 D- J: D6 F1 |/ M

# X1 g" y- O6 y" tРазбор файла QuestManager.java# l$ ~1 E5 \8 C  V
0 [# G8 S% ~9 ^
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
# g" g, B3 Z9 ^, dОсновные элементы
  P1 s! q4 f( `& g3 V" T; @( u$ S* u1 s
  • Лицензия
    # Z2 K, r4 k2 D! I
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ' m; Z7 }& k) {. I
  • Импорты: Y1 Z: o- _6 ~3 N4 F" b
3 W6 F8 m9 g% {+ h/ K
QuestManager.java — управление квестами и скриптами.
* ?- x( g* M4 R6 UПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
1 D7 _  C- y* l: y
! @' \# n8 K  m" U7 A% U- P
/ _% O* I7 B  l
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 y6 k8 ^7 q- N  @" l
1. Лицензионное соглашение
/ v& }# \7 `) I* a* U
  1. /*3 [' B# M7 c1 a4 a$ l8 N
  2. * Этот файл является частью проекта L2J Mobius.
    + a( t: y. h" M6 u  _( n1 R
  3. * " i- E9 E5 K5 O+ F- z
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять) Z- R: b2 n! }4 z5 N" `
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - T0 {% g# d! p8 m! T7 e" U
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.) O9 y# y9 L3 S' w: N, Y3 M
  7. * 0 e6 O7 G; X# u  ?7 _
  8. * Эта программа распространяется в надежде, что она будет полезной,2 b& o" d9 T9 P* A- N3 D1 u! h
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии" N5 B# g& C6 G2 d% x7 P( |
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.4 k1 w+ Z0 A7 m. Z
  11. * См. GNU General Public License для получения более подробной информации.9 ^7 Z" a  O" p) E$ a  Z; `
  12. * 4 I/ f) e/ w7 u
  13. * Вы должны были получить копию GNU General Public License" ?; Q+ ?* |3 U4 c# ~% g+ \/ W- B
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( e5 B+ ?% b- H7 G6 G
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( R$ J  Q$ R; r0 k' Q; J
. m8 _  g) X" `4 W! n$ V& `
* r- s, l+ y" p4 _; g2. Импортируемые библиотеки
5 T6 s- k) d& X. a: [0 d* \( ]0 H7 \% Y% B# }3 W
  1. package org.l2jmobius.gameserver.instancemanager;$ [! `( `  D6 U, S% l& S

  2. ; t& A8 ]+ u. d* E
  3. import java.util.Map;
    1 S1 M8 c* ^6 z' [& e" I
  4. import java.util.concurrent.ConcurrentHashMap;
      N6 @+ b& v& ]. j. y$ S
  5. import java.util.logging.Level;/ l( Q9 W( w8 G  o/ ^9 g6 U1 D
  6. import java.util.logging.Logger;
    2 C! T$ N# |# M) u: f
  7. & j% K4 C& u" A: ~5 y
  8. import org.l2jmobius.Config;8 r. B8 H1 _" K( ^( [$ O* _
  9. import org.l2jmobius.commons.util.CommonUtil;
    ) k. C1 I0 e/ f: M9 S. _0 u$ `2 G
  10. import org.l2jmobius.gameserver.model.quest.Quest;; I6 d' |' a# [- H$ _1 \/ ^
  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 — менеджер для работы с игровыми скриптами.
8 V. A' _/ G0 [
3 }) {, |, |7 U. U3. Описание класса QuestManager& Z6 a# |% t( V$ d( x
  1. /**
    * y6 L4 F" D" j
  2. * Менеджер квестов и скриптов.
    + g+ [) C% |6 X
  3. * Автор: Zoey76$ f; O. a, L- O
  4. */
    ' l3 B2 m; @  m( `8 d
  5. public class QuestManager/ v1 C" x" K1 E  T  B6 C
  6. {
    8 h6 w: K5 U- }1 K
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    4 }* _4 Q7 F5 w% P) C
  8.     1 A; f  f0 P# X6 q- r4 E
  9.     /** Карта, содержащая все квесты. */
    6 i1 K9 n2 Z' s. R" y
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    : m0 C/ ?7 \- ]8 ]& T+ D# @
  11.     /** Карта, содержащая все скрипты. */
    1 Z% ^( _; a, h% R
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    + D  ]& W' c" G
  13.     * T/ T  @3 d4 k* C) q: q- @
  14.     protected QuestManager()6 Z. p; C. Y+ I7 ]
  15.     {
    : h  N- d" z9 {" `1 a7 z& b
  16.     }$ k2 G( j8 @0 W% O
  17. }
Скопировать код
4. Методы
  V, r/ _+ @1 wМетод reload(String questFolder)
# c/ n( A" d8 w. X& q
  1. public boolean reload(String questFolder)
    3 h4 M: S" [) `0 `5 C- U3 f% G
  2. {
    . J  X' p& x% Y
  3.     final Quest q = getQuest(questFolder);
    . Y  B7 D0 l5 n/ K
  4.     if (q == null)7 c2 L! j- G( i" l$ d2 j
  5.     {" v. Q$ D0 E' S- ], F, j) x1 ]
  6.         return false;! I0 v, b: A! Q- I6 p/ U% ~: }
  7.     }- y2 s* ^6 J2 Z3 U% Q0 B
  8.     return q.reload();
    ( }; G4 L4 y  [  P! p1 q# A: V
  9. }
Скопировать код

& [8 v8 \" H! C$ J! Q! N- O- B* d/ I8 E6 O' p/ g6 G
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.8 Y0 l) s1 d0 {1 ]
Метод reload(int questId)
8 y7 p+ Q) n5 a6 W" a2 c  c( l+ M- I7 t2 t- H
  1. /**
    $ t8 f% Q" N% t* I0 ^* k- o# ^
  2. * Перезагружает квест по ID.2 `6 V% }) x0 I$ d
  3. * @param questId ID квеста для перезагрузки
    % [% k; Z1 W7 S
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае( d8 Y3 g1 x2 v. T
  5. */* ~- D$ X% M3 ?
  6. public boolean reload(int questId)
    ( g1 O# X- T$ c# i7 ?
  7. {7 a, [: ?! I! t  J2 r. R# D" i* V
  8.     final Quest q = getQuest(questId);# S0 [6 X+ Z* }; B
  9.     if (q == null)
    ' X: T. N+ [$ L% \' G* }; t5 O
  10.     {6 |8 a6 ]: _: D) b3 A5 x- ]
  11.         return false;
    * ?' o* N: i# X6 i
  12.     }
    + E$ @9 w; J- s8 H
  13.     return q.reload();
    8 L" e4 f$ g5 V* x
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ! m1 O3 B6 ]- V5 ?$ n
# w: [0 g& t0 V  ]' r! k
Метод reloadAllScripts()
3 Q: W; G+ r# _: N! N. C, U- h. f# U% u% r) I, U
  1. /**; e. t$ h  s6 h1 K8 z% h
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.4 G  ^! H+ M2 x. e6 r0 T6 p
  3. */
    7 D# k1 W6 X0 m) S+ c
  4. public void reloadAllScripts()6 _" S3 a5 q" P. K# K* l9 B" U
  5. {/ b" F& x; @9 Q' @! |6 j5 q8 Q/ [7 q2 ?6 R9 R
  6.     unloadAllScripts();
    8 k0 O, A0 ~  v1 W5 D
  7.    
    + n$ }1 f4 r6 y+ v( f
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");5 \6 @; f+ q+ v  ]& K
  9.     try
    : J" O* @" E" X% w% [
  10.     {! n. a" [' ^9 L5 f& c$ r8 Y! @
  11.         ScriptEngineManager.getInstance().executeScriptList();) o5 ~; d# g+ f0 `2 o
  12.     }
    ) K% a, K+ D' t' j% l; p
  13.     catch (Exception e)0 A; m# D: l7 {& M/ C
  14.     {  V. ]/ L& V3 m8 V9 J+ m
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ( I2 p: v6 E& Z  p! q' t
  16.     }
    ! |# w- H* P& ^) v) Z
  17.    
    $ q2 x0 X  O1 M
  18.     getInstance().report();* g" `6 O: j& ]. h, q" W& r* o
  19. }
Скопировать код
Метод unloadAllScripts(). c7 e5 i& k/ b& e

% e$ K/ N, R6 n+ Z* l
  1. /**
    + h3 [/ d9 ^2 f3 e9 t6 y
  2. * Выгружает все квесты и скрипты.
    8 R* w) Z0 B2 B6 p; j2 A0 p
  3. */
    " X4 O" K" Z6 S# a8 B
  4. public void unloadAllScripts()2 l! S) I- V0 B" z$ u4 q
  5. {$ j* u7 B/ w( [# ~: d6 [
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  S# N2 w3 b+ a2 `
  7.     " q0 x! v# i( I4 A6 n
  8.     // Выгрузка квестов.
    5 c. I7 X% f" I" q( G: H0 K: Y6 F& L
  9.     for (Quest quest : _quests.values())3 c7 ?" E2 r$ K9 W" J3 R
  10.     {, p# p8 u9 {; b: W
  11.         if (quest != null)
    + A& l( |1 l3 Q  o* c5 M2 {; ?6 n5 @
  12.         {
    5 m  p; R( L) B/ w& I5 i& {
  13.             quest.unload(false);
    - v. J$ Z" S) G" Z
  14.         }
    8 x7 u/ U$ @9 I# H  f. N( O: F
  15.     }
    6 p! v" d7 Z/ M! }. O7 V0 k! S
  16.     _quests.clear();+ _) r$ V6 J- ?2 G- q
  17.     // Выгрузка скриптов.) \; O: u2 \, y- q, ]
  18.     for (Quest script : _scripts.values())1 t( k3 c' @' d9 w4 a, D" U& ^, t
  19.     {' Z+ |" v) x& V: Y; H
  20.         if (script != null), B3 i) J1 ^0 Z
  21.         {
    2 e  B' j3 f2 X1 Z( y. b
  22.             script.unload(false);4 G" {) g7 X, Q/ I9 o: g
  23.         }& {. k$ T7 n* _4 l7 a5 I, U/ }  L
  24.     }6 r5 ~4 t$ M* e& ^' {
  25.     _scripts.clear();- b0 l" y4 ~$ _
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ( X' W+ g3 M/ r3 A
( Y0 E; m* W4 f* j2 l* [0 o2 n
Метод report()" D2 s' R, ?4 k* `. x. P
% R  v7 P1 Y. Y) B1 r7 T2 X+ v
  1. /**
    ' `7 |- T  ?5 m/ ~" o4 c7 O6 Y1 E3 ]
  2. * Логирует количество загруженных квестов и скриптов.9 b+ S7 @2 V. T3 M  q' D' e
  3. */9 {" ?, e0 J4 j( q, h
  4. public void report()
    5 V0 C. Q; d; D: c0 e7 n2 }: ]# E
  5. {/ n$ {* O) T: H4 \, K
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");. L; m1 r- B4 I  k: O1 Z
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ) C- @! Q% d- @- r4 H6 G
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.6 x) ^: C0 |- |* J9 ^# S
% k* y0 M& b! o* K& l% u7 x9 w
Метод getQuest(String name)
, o0 N- L: E/ g, e: q" ~. r* ~% m$ G; i; j" U6 ~  U+ |6 y6 [
  1. /*** G* o+ I3 ]/ V2 l1 T0 _: _& E+ `6 l
  2. * Получает квест по имени.0 s( T1 [8 Z2 N+ ^5 U0 X/ v1 k3 ^
  3. * @param name имя квеста9 p# a+ c' D, T! x
  4. * @return квест7 E5 L4 S  ^( E$ Q, J
  5. */) t; C3 Z$ ~% X6 y7 z# Z
  6. public Quest getQuest(String name), ?) w7 s6 |+ q: T3 A5 t
  7. {
    ) T* s9 T9 D, b# W/ b. O
  8.     if (_quests.containsKey(name))
    ! E/ k+ ?0 l$ Z" k: q( b8 ^
  9.     {- O# a, u9 A. R7 l
  10.         return _quests.get(name);
    : ]. ]+ N* V4 H" E
  11.     }+ E4 ]% u2 H2 K9 |$ W
  12.     return _scripts.get(name);( H( e: p+ H' ~( x; J' n3 |
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ! A# h4 {  |' `% J" P2 a

8 a( a/ v. t6 G7 f5 ^Метод getQuest(int questId)
' i( H6 A3 z, I# N: d2 G0 @6 |0 a8 A/ |4 k( d$ s
  1. /**: X: m9 u) x* a- n. U! b
  2. * Получает квест по ID.
    9 `6 F& a7 x  O, C* B: r( i
  3. * @param questId ID квеста! U% @1 A* v  n1 T' W- m
  4. * @return квест, если найден, {@code null} в противном случае
    1 E4 Q( A# t; S3 G5 `' w+ w
  5. */6 c0 `/ X: Y  b7 H  a  n! T
  6. public Quest getQuest(int questId)8 N% z* ?3 P8 a' s' A
  7. {8 C5 U$ R) Y, m  x- t. ~" ~
  8.     for (Quest q : _quests.values())
    & w# _+ D! @5 F  H1 x
  9.     {
    ; e  V6 b, O+ U
  10.         if (q.getId() == questId)4 g( }: B* C% ~4 r
  11.         {
    1 c$ [+ |( T6 d$ ^& V& Y! [" P
  12.             return q;1 h7 c1 \! b8 U5 n* @% {: S
  13.         }1 h* i6 y* t: X% m- b  B/ m- F
  14.     }: a6 H3 w- S0 }
  15.     return null;
    / c/ p0 q) L7 b
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору./ d& u2 m4 F$ E& J' w

6 C- h8 ~4 t8 yМетод addQuest(Quest quest)! _% ]+ b0 k+ M: ]$ V/ \

% M2 e  k- F  T! Q  i
  1. /**4 z3 A3 f- d& D
  2. * Добавляет новый квест.
    " t9 Y) H  _7 c1 U
  3. * @param quest квест для добавления
    / Y2 j0 [. U1 P, ^9 W
  4. */
    ) V' e/ t! o. J/ c' \5 X( Y
  5. public void addQuest(Quest quest). U( L/ b. ~7 L& w3 |6 y
  6. {# W" e+ M/ k7 r1 v$ L; x
  7.     if (quest == null)" ]0 K" G, g" Y6 R' }$ {1 O+ |/ _" e
  8.     {! K* W8 p  [% e. j9 n- a6 `
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    6 ], s% x4 x9 @# Q) J: U
  10.     }
    8 k- d0 a0 }. W, e* U& s: Q
  11.    
    8 I7 y) B+ N) G# o6 M* v, b, H- j
  12.     final Quest old = _quests.put(quest.getName(), quest);3 I* \) V( v0 f: x1 ^6 b- O
  13.     if (old != null)
    6 h/ V7 \( T  h' m
  14.     {0 K7 C0 L% S2 V1 y7 x! J" I  Q
  15.         old.unload();. V( R. u" Z: q( k
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");) v) {, f2 p2 S) L6 o
  17.     }3 c/ ~+ U; J$ a7 S6 V
  18.     " K9 X* c9 Y7 Y2 r9 b. q# r
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    . l! p+ S  x; h" [' b3 U0 E
  20.     {
    : n' ^$ s1 Z/ R5 `* f5 A9 V/ c& t7 }
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ! V5 W, o; p6 l' d7 J5 D
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 h2 b  I; V' Z8 _
  23.     }7 V2 r. P6 X/ m: I  d1 ~
  24. }* M% \8 }; H5 p" J
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 @8 I2 T0 E) E' gЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ D' Z# g, W  T% d2 J
; M# Q" f/ y/ h6 k6 T

) p9 J, g4 h6 |7 S/ z/ H: v$ j7 D6 u: I: @
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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