artace.ru - творческий сектор

Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати]

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius. v# Y2 Y6 _7 B8 _* p( f0 K# U3 q  Z
: T0 {: Z7 @# m* g% A
Разбор файла QuestManager.java
/ X! P$ ~, S0 b6 S# y( x
( E+ J1 Q% w# d# C, I% s( QЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.! ~0 r4 ~- @4 y( P! Q) _& R- [: H
Основные элементы7 S2 l8 z7 f  H7 v' c
5 |( q# u% Q) r; c, |, J* [
QuestManager.java — управление квестами и скриптами.
8 _5 W! K; t) E1 P  i, BПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 p" d& @8 x' Q) }& ~# s" O! t* v  r& V0 ?; L

4 q% h. `0 q' y: m0 U  i7 N$ H6 H4 |Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.$ J) P8 s- J- k8 G6 F
1. Лицензионное соглашение0 ]5 Q6 `1 @4 ~8 ~( B# A
  1. /*; O  `' a( ~$ s. s9 K0 s
  2. * Этот файл является частью проекта L2J Mobius.% l' X: L/ [0 u8 l( C5 @7 {; ^5 {
  3. * ' Y; D8 R! V, |) X
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    3 f  F7 M% c+ ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    . \# t3 J7 {- _' ~: x
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    8 ?/ n( z) i& ?4 D5 k, T/ J
  7. * & ?/ g8 s; i# f4 [
  8. * Эта программа распространяется в надежде, что она будет полезной,. Z+ f) o3 @3 @( Y. ]" ^, Y+ H5 V/ `
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    $ X7 [2 `2 N/ ^& z8 Z7 H* M
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    : X, @; z4 j$ g7 i! T# |7 _
  11. * См. GNU General Public License для получения более подробной информации.) Q, J4 q7 _* Z. f+ h# u  G
  12. * ; w5 _$ y5 p) x
  13. * Вы должны были получить копию GNU General Public License
    ) x" x' I( G) `
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>." q. I- _! Q9 V" [  x4 D/ H' a& e
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; R8 a9 }! ~$ y6 P$ k  \# x
0 v) W2 G" q& d8 \: s
9 S! K+ ^9 m! A% g. I$ l
2. Импортируемые библиотеки% G& r2 t* B5 @& v

: d5 k3 b! e5 J2 ?8 i
  1. package org.l2jmobius.gameserver.instancemanager;/ f5 u+ U$ Q& [4 X

  2. : ~8 M; o# u! d& S- A2 x/ I/ C, r
  3. import java.util.Map;
    3 G/ o1 x8 }7 g
  4. import java.util.concurrent.ConcurrentHashMap;/ p3 j5 n, l6 `) a5 L( ]
  5. import java.util.logging.Level;
    ' O! r" ^: W  v: w! ?
  6. import java.util.logging.Logger;  z9 ?& e" }( `5 i

  7. 0 X) ?# B; M2 h; F
  8. import org.l2jmobius.Config;+ C3 |7 g. z* k& ^
  9. import org.l2jmobius.commons.util.CommonUtil;
    5 P: v& E0 J" L
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) i! I3 U, y/ ]  b& w, j. m
  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 — менеджер для работы с игровыми скриптами.5 M: X! L4 {1 d: |/ _( b

; D; ~6 ~/ [; M) x6 d) v3. Описание класса QuestManager
# \% D3 T; K' C- Y
  1. /**2 ?% k! J9 i, m- m7 f. T
  2. * Менеджер квестов и скриптов.
    + `2 X- T. s0 H9 r
  3. * Автор: Zoey76
    " R- M4 ?2 ?; e4 \3 M
  4. *// i7 u2 a! c! \5 H& j! P; C& c
  5. public class QuestManager
    ; N0 D; L- Q$ I2 Y& ^. M- M! p5 S& p
  6. {$ o7 X; T/ g8 |' l" s
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());. `" |3 b. @2 G9 r
  8.    
    * m% y8 n+ n: j0 D5 x9 k% [: S4 Z
  9.     /** Карта, содержащая все квесты. */3 x7 l* Z# v8 _) y* L" m
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    % }( t1 d# i5 x! X
  11.     /** Карта, содержащая все скрипты. */
    5 q7 u5 n8 K, U6 u# w6 ^
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    0 C+ {. Z( ]8 |% I
  13.     8 q4 g# S& y9 n; ^
  14.     protected QuestManager()2 H$ k$ n- g8 ~$ x$ x/ n
  15.     {: f! L) J6 J2 O5 G4 n
  16.     }. i5 S& q3 [( _
  17. }
Скопировать код
4. Методы
/ u. C' V5 n  }( M4 a! w/ ?Метод reload(String questFolder). D& J. C9 C/ d( T) O8 g
  1. public boolean reload(String questFolder)
    4 H$ T" T+ n' ?/ n5 T; Q- M# m
  2. {2 J9 Z7 o# I, {0 ]0 l3 v. J
  3.     final Quest q = getQuest(questFolder);% l' [: ^8 ~' ?; k, |# d
  4.     if (q == null)
    ; Y$ q1 s8 @5 }4 w: m1 @& q
  5.     {
    2 I& O2 v% ], F0 J1 K5 I
  6.         return false;8 _( O' N3 f% N# ?, E* z
  7.     }; k7 n8 y7 U% q8 [
  8.     return q.reload();4 |, u: p7 M+ V8 s) S) N! e" b( t
  9. }
Скопировать код

& v) p1 R. ~1 l' q5 Q8 a4 G
4 y' T7 }: Q0 S+ A3 Q, M9 yМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.! R1 z' d+ K4 Y3 a" C( b
Метод reload(int questId)
# T$ |: L* {! }6 }, `/ N  X  ]& p$ w$ ?8 z$ Q6 ]) U6 c1 R/ P
  1. /**7 D- @4 p' K& _
  2. * Перезагружает квест по ID.
    + P, H$ ^7 A; k0 v
  3. * @param questId ID квеста для перезагрузки
      R# E( O0 q' k2 Z9 {
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    5 D5 w' n! C0 e; n1 F: Z( H
  5. */
    * f$ ], ~0 ?6 f5 Z
  6. public boolean reload(int questId)
    & ^- B, O& W) u9 {) M
  7. {4 }6 v- Q' W+ v( ?2 l3 D
  8.     final Quest q = getQuest(questId);
    % \* k" h) p7 h; G4 X. e2 \
  9.     if (q == null)+ q5 C+ N- `, s/ c* }6 g
  10.     {# M4 b4 ^" ]4 Q' [4 \, j
  11.         return false;
    6 S& u( P4 r( b' X+ r
  12.     }- ^6 Y& ?' ?% s
  13.     return q.reload();$ v5 A7 ?8 T( P5 q. e' W
  14. }
Скопировать код

6 s6 x% K& k/ Y# ^9 F3 bМетод reloadAllScripts()
7 u$ V1 j" M1 p; }
+ s0 U" v; \! {6 a
  1. /**$ r% ^7 W' I2 X2 v. f
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    # Y) b" M# E% o3 N! R9 d
  3. */
    3 j$ E& q9 p5 e
  4. public void reloadAllScripts()
    % d( @, `- P7 x  c' j' R
  5. {. H# O; \7 {4 }$ R7 u, ]
  6.     unloadAllScripts();7 ?+ J" D7 J# i- ^
  7.    
    8 W2 l! v3 Z. R7 Z. _4 X+ }7 a
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");  p7 [4 \& G, K' m' y! R8 r4 n
  9.     try( _8 v' y; }. m8 Y2 u- G  q
  10.     {& G" G  ]3 n. H( y
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ! f% z0 m6 o: w/ L! b8 I7 Y
  12.     }
      D/ H$ a  |  K) h- q& s# s2 J; j5 _
  13.     catch (Exception e)
    " T7 m. n' A2 t
  14.     {
    ' W% q, a* K1 h" P" f
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);" h8 i4 U5 u/ ^$ X( n0 c. K/ o5 S
  16.     }% f) t' Y3 `2 w8 r
  17.    
    & j8 k- C; J) U! m) Q, h- d
  18.     getInstance().report();% F2 j& E0 Q. _6 I/ h
  19. }
Скопировать код
Метод unloadAllScripts()
+ s: D) \% g2 C) g+ z3 P  `3 N& y8 q. P0 v: S
  1. /**  M; H+ Y  p' n! B% i5 R4 I/ \6 A
  2. * Выгружает все квесты и скрипты.
    - J3 |8 B, f5 a8 q$ W9 p5 J# m
  3. */: G" Z6 v6 b* A
  4. public void unloadAllScripts()
    & d9 W% k2 ~8 E. \' m  h$ d
  5. {
    * {/ H# q2 C1 L( z" i
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    $ @0 `' ]" Y: t3 K) b9 r: F
  7.     3 O4 V# |6 i; p- X' |7 N2 ^9 p- v
  8.     // Выгрузка квестов.
    2 z1 @/ X* ~- k- H
  9.     for (Quest quest : _quests.values())
    0 q$ Z5 m# H; T" D
  10.     {
    . {7 S- U9 H' h5 d0 B% F# o
  11.         if (quest != null)
    ( w# J" o; G5 l, f( K$ h
  12.         {
    : N0 y4 G9 R7 A9 E; y  V0 S
  13.             quest.unload(false);$ a. l0 T0 J0 B: h0 g
  14.         }
    : ?% T3 i7 i3 e3 D6 `6 D
  15.     }
    - c1 U$ p2 \0 U4 y
  16.     _quests.clear();) {2 l# L) g; w: f; T( O+ ?
  17.     // Выгрузка скриптов.
    3 L) u& ]  z$ l9 A( @$ U' B/ W
  18.     for (Quest script : _scripts.values())
    , ]1 x; S. h4 [$ U  Y
  19.     {
    / s% I8 G2 u  I# R2 q
  20.         if (script != null)
    6 V7 v/ G; b& w' N, S. l: l2 h
  21.         {& X% E" p; B8 R6 M) @: O9 _. o
  22.             script.unload(false);% `+ ?6 S9 d8 c$ y* o
  23.         }! [# k$ c3 Y9 `% @) ^2 y; C
  24.     }# @+ l* C; R3 A; F6 {5 L
  25.     _scripts.clear();
    8 B3 i+ ?4 H5 i" ]  w
  26. }
Скопировать код

2 A0 F# |& y5 ~! QМетод report()
; m7 {+ I$ t% N6 b2 O
7 j, J# h& X# B) W5 j+ u
  1. /**0 \: P8 X. I# u: q8 g) ~
  2. * Логирует количество загруженных квестов и скриптов.- |% f4 C* h' D; w" V
  3. */
    % b. b& r2 r' y5 L- J: N3 z
  4. public void report()6 G; i6 O$ i" z) \; O
  5. {
    ; R4 l0 k9 d. M# [6 Y4 \0 _8 }
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    $ w) b3 M  V3 K! v4 Y$ ~4 V
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    - ]: o# `) s$ Z. {
  8. }
Скопировать код
0 b4 h  [) N5 O9 t9 X
Метод getQuest(String name)
3 q6 E$ o- [9 q" e+ F
9 ~1 S+ \5 d% E9 X* ?7 s# b
  1. /**
      @  ]6 |" Y1 w7 a. G2 ~5 _; C
  2. * Получает квест по имени./ P2 A, E7 Y  g: e. k. z9 I
  3. * @param name имя квеста% v, N3 ]( {: D" g% d" L' I* J* l
  4. * @return квест) d3 k7 _9 M8 r- @
  5. */
    * P8 m! I1 y/ H6 L4 k2 r0 @
  6. public Quest getQuest(String name)
    - T8 Y9 r. B+ z
  7. {4 X3 P: N  w; ^+ h" S; T
  8.     if (_quests.containsKey(name))$ L) F0 [! J, m
  9.     {# u+ ?, r. ?9 g  l2 c3 }( P
  10.         return _quests.get(name);( r/ f! p0 n4 R3 M
  11.     }' T8 y9 ^) G( \7 g9 W4 t
  12.     return _scripts.get(name);' |" n1 r" C5 ]% p
  13. }
Скопировать код

: _1 x" G: j9 U" x/ tМетод getQuest(int questId)
/ @" Z. k8 \$ L( Z8 [5 i
& I5 J% G% v! Z9 V% a0 [
  1. /**
    1 O: m, U/ c0 i; J3 E* X( l
  2. * Получает квест по ID.
    3 W/ w  B) u  }
  3. * @param questId ID квеста" ^4 Y" L# o0 x. Y& U. I' L
  4. * @return квест, если найден, {@code null} в противном случае
    : J" C. i; j9 \& I
  5. */  V- X; r( E. Y& B- S* ]* g* L
  6. public Quest getQuest(int questId)
    / e# N% }: ]$ `$ F$ f- n4 ?+ ]
  7. {: Y! W7 d) q' Y- P: e
  8.     for (Quest q : _quests.values())
    3 `- P1 y8 e1 H9 ^0 d* X+ i
  9.     {
    6 M5 K: Y0 J/ K2 B6 K  V/ r7 N0 I# N
  10.         if (q.getId() == questId)6 w1 ]. I3 `, E; w; k) m" V# Z1 {
  11.         {0 p0 Y) I! J; M3 U4 S
  12.             return q;" f/ b! D1 [9 ?
  13.         }) m& L( G4 R0 Q9 y" d( ^
  14.     }
    4 I9 F) U- J" }; L/ z, r8 t1 s
  15.     return null;3 {, p7 n  b) [" x+ {: [
  16. }
Скопировать код
7 J4 k/ q& ~+ ~0 a9 T+ i! `1 l) B/ [
Метод addQuest(Quest quest)- z/ U1 S. D9 o

; k/ G) L7 |0 t
  1. /**
    ' B9 S# L6 W7 h( h  v
  2. * Добавляет новый квест.
    0 W  l( C7 l* J8 X" j
  3. * @param quest квест для добавления3 G! n( ^5 e. M! _. Y) W4 `& c
  4. */$ P1 n, w. D# C0 {
  5. public void addQuest(Quest quest)$ q5 m, }4 v9 L8 C
  6. {8 J& B. {- t! v. t* a% l4 i
  7.     if (quest == null)
    5 _( k9 K: B* q1 ?# [3 t
  8.     {; J! R' Q# D9 {% I
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    - K, ]9 y9 R3 \1 O; p5 o, t
  10.     }
    ! W- y; k1 p% g# ?+ A
  11.     / K7 S# O+ x/ n* ~
  12.     final Quest old = _quests.put(quest.getName(), quest);+ ^" g% c  J6 I) I0 c; c
  13.     if (old != null)
    4 n) d+ S0 W4 k! }& q$ g1 N. Z
  14.     {
    - l) I, c0 R# w( p2 M2 m: M
  15.         old.unload();
    7 Q& ?) T2 n+ ]
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");6 O4 z% `: s4 r7 M$ F( P& n
  17.     }6 c5 {9 {4 R* w3 n- B  m1 R
  18.     * q7 K, `0 q$ N0 F3 q( h
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)0 u5 v6 r0 X+ O  E) s0 t( d7 I
  20.     {
    3 r& O3 B1 Y' e0 v+ X/ _  g: M
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    4 i1 r4 G  E/ c. i3 }
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");+ I6 @4 t( c, Y
  23.     }4 J+ v& |% ~& {
  24. }
    ( b( R9 S8 B7 j% `' @. }4 J- j8 F
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
% z9 s8 T; ^8 j4 T: xЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
+ l, L( E, ?' E' B0 `! y$ P& G/ b1 \2 U& g, F. j
6 [9 w! W; k: Z6 Y

( P' L( P/ _" |( R




Добро пожаловать artace.ru - творческий сектор (https://artace.ru/) Powered by Discuz! X3.5