Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius$ `3 Z6 e8 i7 B- X( T# K' S  t

" y2 L- M1 k) [# ZРазбор файла QuestManager.java% |. `- B, g; ~& t
5 W2 E' t% O5 j2 v# B$ t* B
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# g( z8 _/ z' \/ a+ T
Основные элементы
  J3 @; l- q9 s
  • Лицензия
    ' o. ~- B5 U1 \& X
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.) w" |4 T" f; l% Z- {
  • Импорты: I6 g4 X6 C- [4 q6 f9 r

6 _/ q! F4 l: O- nQuestManager.java — управление квестами и скриптами.
0 E- @7 ?+ u0 jПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 V: q7 r" K+ C# i) y$ k
9 S( T( T. ?8 ~. ?. L& ]8 E: R
/ F  B2 q. k* o* E% P% I( p) y
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
! y% R$ z* q! ]  h- I1. Лицензионное соглашение
; m) G% z5 v+ [
  1. /*
    % z8 q1 W( x/ G4 N2 ^3 \0 S- y" c
  2. * Этот файл является частью проекта L2J Mobius.0 U0 Y# R6 d0 e% t- r1 a
  3. *
    ) o% Z4 J% L/ r' z% q
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    / ]3 d0 g& b9 F, H' \- W1 Q) @
  5. * её в соответствии с условиями GNU General Public License, опубликованной2 w" O" G7 C% Z! }8 ?( d4 {% ^
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    & V1 O4 U' _  b$ Q) ]3 P
  7. * / m/ i+ L( h0 ]! o7 A1 Z
  8. * Эта программа распространяется в надежде, что она будет полезной,
    : A0 p/ S0 s: u, Z
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ' _' T  f, X7 L* W
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      g. I! w- R& c$ V; {
  11. * См. GNU General Public License для получения более подробной информации., @) x8 {8 t1 y" o- y
  12. * ; u/ f8 Z; W- Z7 [7 E. `! B; l7 e
  13. * Вы должны были получить копию GNU General Public License0 q  s# u: n: c; C
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.) t" o, Z$ P" T( n: M1 k1 j
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.( \' z! x/ X* g8 J7 ?0 s0 H

! U$ e9 v9 Q$ z6 W2 O$ \
' J+ L% ~) `' T: L9 k8 {2. Импортируемые библиотеки
; [! `3 r' P" y7 [( e) a, @# {
  x7 K: j; X0 R3 N4 V
  1. package org.l2jmobius.gameserver.instancemanager;8 a: j; V: d, n

  2. ; `$ d0 q: y+ P
  3. import java.util.Map;' o2 d  a2 j; i+ L1 i! x4 p* w8 C
  4. import java.util.concurrent.ConcurrentHashMap;6 r" I( B* ?1 a+ V" p3 N% L5 g; \
  5. import java.util.logging.Level;7 D; ?* X+ b+ R' h  A( t$ \
  6. import java.util.logging.Logger;' @. ]5 O0 x6 i4 b2 c

  7. : T5 t) s6 [& Q! Z/ ]8 }3 [
  8. import org.l2jmobius.Config;. N3 h8 j& A, [" M" s6 z* K
  9. import org.l2jmobius.commons.util.CommonUtil;
    , M1 K! \, d' T2 ?
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ) A& a7 w- h& F5 x
  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 — менеджер для работы с игровыми скриптами.
1 w& f# m; R! r2 B4 n7 f
6 {: t2 K: {6 N; W0 p3 P4 \+ {3. Описание класса QuestManager
) V5 _9 Y9 d7 P4 X. z# |, g4 v
  1. /**+ C4 T2 i% ]5 T5 `: d- j
  2. * Менеджер квестов и скриптов.: p3 a8 f! o# o% w& G' L: o
  3. * Автор: Zoey767 ^# P0 Q) e3 b$ @, I3 L7 I
  4. */" o1 H! k9 C, G2 e
  5. public class QuestManager
    ! J# O: @0 ?( U5 Y% O
  6. {
    ; l( k% |4 I, g  i
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 l8 y. V( H* _& b$ w# _5 n* X
  8.     4 J' n5 A9 B, x- s
  9.     /** Карта, содержащая все квесты. */
    0 Z. W- b5 m0 V8 ]3 g
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    0 Z8 m" }  Z  G: w" j' o( f
  11.     /** Карта, содержащая все скрипты. */
    0 F- i% S% U$ i. S
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 @" V6 E5 {; f0 h5 E8 W
  13.     + c1 r+ A  s% w! p' B
  14.     protected QuestManager()+ y+ O; S  g: T$ b3 `; C' v6 [& A. }/ ^
  15.     {* s6 g. c/ J" U' }( p% u% G
  16.     }
    8 A" s4 v' h8 y2 ]# S
  17. }
Скопировать код
4. Методы
. q' p( L" @! m* J/ \$ {( u, IМетод reload(String questFolder); u! Q6 W# x9 u
  1. public boolean reload(String questFolder)
    ) M- g$ T  m# V, J) O2 Z
  2. {8 C$ N& a+ [+ V3 @6 B
  3.     final Quest q = getQuest(questFolder);
    ; X  F0 q: N. j7 I3 |
  4.     if (q == null)" S! U2 s* {% Q$ ]* a
  5.     {7 Q, I/ a9 S! Y/ S! f+ E
  6.         return false;- P- V" w3 H: n: F- k1 t$ V# }  T
  7.     }% {" p( S- v/ w, v8 C8 B1 i$ p$ ~% M& N8 n
  8.     return q.reload();) B! w* j  v' n  p' _, O. Z& y$ J
  9. }
Скопировать код

' Q1 @7 C) j6 l. ?. X- C
9 |. O* R( Q; N+ \1 `Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.9 r# v/ p# S% z7 D8 }& p* [
Метод reload(int questId)( i) w* \. J# \: O7 B$ R
5 H4 l: m3 R; N2 {
  1. /**
    ( b" V' b: |( U# W7 |' r
  2. * Перезагружает квест по ID.2 m. S' z8 [# n: X4 b7 O
  3. * @param questId ID квеста для перезагрузки
    " V7 @# _+ A0 P) ]0 m" \  G) D: W8 f
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае6 D8 B1 c  C1 S( i- e: F  v5 e, `
  5. */1 P( J" N! K. I/ t) w
  6. public boolean reload(int questId)  O3 n7 s: {/ O8 l, g
  7. {& r( y! D0 q$ ~1 Q* n
  8.     final Quest q = getQuest(questId);
    $ i0 {  M8 m8 m9 t: Q
  9.     if (q == null)
    / C- h0 K, ?2 {% D. _1 E9 m! [  x
  10.     {, V4 g0 ]1 y0 B
  11.         return false;
    + y1 v+ V4 C& h0 X' t" R
  12.     }6 W+ s0 b# P2 G- Q" {% |( v
  13.     return q.reload();
    ! e! {9 z7 {( |0 L
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.' u5 C! Q$ ^$ G# `1 m' G
/ @! R$ ?* F2 {/ i
Метод reloadAllScripts()
2 c1 |1 J  U* U: m9 P! }; V4 B' z& A* x# c
  1. /**
    2 J) e7 q( C* U% Z" U9 j% `
  2. * Выгружает все квесты и скрипты, а затем перезагружает их./ N9 a: x( F9 Z# m; Y8 Y
  3. */, q5 N0 a1 z$ Q% [' n
  4. public void reloadAllScripts()* H: y' ^9 c2 d* S  q/ R! y
  5. {. _" K; K3 Z5 T& q* a& Q9 d
  6.     unloadAllScripts();2 B/ a0 P; r: L
  7.    
    4 g1 F0 P, Z9 e  M
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");2 o: @5 w0 I; P- }( S3 N3 e
  9.     try  r+ Q7 M) |. p, ]
  10.     {- @8 P7 z( N$ y& Y8 r3 k
  11.         ScriptEngineManager.getInstance().executeScriptList();9 y9 E- e0 Z5 O1 q6 x% C
  12.     }; u; i" ?$ J2 g! I0 k% }- b# T
  13.     catch (Exception e)4 k3 y$ ^: S2 B  g
  14.     {6 m! A# d' G( E# g0 M$ @5 o0 C3 p( @1 E
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% ^" `0 |8 v, ]2 C+ A5 J( @
  16.     }4 B' J' v& i$ G4 W( S; Y3 t
  17.     4 I* s% J1 d$ J, n  I: n
  18.     getInstance().report();
    5 J9 y/ D/ S% T  S  N2 _3 n
  19. }
Скопировать код
Метод unloadAllScripts()
4 ], T% O( h; Q( h# q) S! d5 e
7 [* i& c7 u; `* `1 a' A4 w" O
  1. /**
    ; R; y# n- K+ P
  2. * Выгружает все квесты и скрипты.  `# S- u7 F: b; J6 S
  3. */) M- e* D" C6 `4 G2 C& x2 E$ Z! K
  4. public void unloadAllScripts()/ i8 S/ Z+ _6 `, w) ~8 f
  5. {
    - e4 Q7 N2 r2 j, }: ~/ r5 ^; [
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    , M5 k' [$ F, w/ v, _2 I0 T* ~
  7.     7 U6 l7 y1 j$ R8 [6 Z: v. J; w
  8.     // Выгрузка квестов.
    ; c& y- b% i7 P6 E7 c
  9.     for (Quest quest : _quests.values())# Q" K+ \; Q6 Z0 q
  10.     {1 j  ~. t7 M' Y* g6 j
  11.         if (quest != null)+ d: F4 ^# F9 j) \* l
  12.         {0 o. L5 ^( w: A8 ^
  13.             quest.unload(false);
    4 F7 P8 x! G- V- V0 y5 z
  14.         }
    * M; d$ s3 w. R& f; \# ~
  15.     }
    ! h" n% ]/ V: h1 i/ B. B- l% c
  16.     _quests.clear();6 ~# Z4 n4 N$ A4 ^3 O
  17.     // Выгрузка скриптов.& `* G( O# I. h6 ?+ N9 p9 t; g" H9 s
  18.     for (Quest script : _scripts.values())
    " C# ^( e: [3 i" u
  19.     {
      b# P* |5 ~* |  d8 B; }* d
  20.         if (script != null)
    ( D) {, o$ C. T
  21.         {
    ) L( t  [) A( Z9 I- y2 [" Y
  22.             script.unload(false);. b/ x1 |+ R) w  S4 x
  23.         }, y  }8 t# n" b* p, O) F+ r
  24.     }" V: E( I3 Q9 `$ W* k
  25.     _scripts.clear();
    ( X* R) l! E) n
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 j* W  g& S: ~+ X

9 E4 d: o- t( `7 s! o7 Q% kМетод report()
2 P3 n3 ^; d. X# p. f$ o( w! f+ \3 `0 \7 P# o
  1. /**
    4 c# [2 @! N  ]
  2. * Логирует количество загруженных квестов и скриптов.
    ( T5 ~9 C* H/ n
  3. */
    1 o+ u- i! E1 T
  4. public void report()
    ; H7 k% d/ P& N
  5. {
    # D# \& B/ v& r
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& Q4 p  G* r  a& U
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");' m8 |5 p& E! ^6 T; Z
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.3 |  o6 v" B0 d4 Y/ `4 N& P

& a" i- Z4 F  `! O1 }Метод getQuest(String name)! T0 S& I% p1 ~& s/ q

, q, d' N" s) P$ `8 K! n. G
  1. /**1 K. I/ M* I, O& Q; L
  2. * Получает квест по имени.
    - q& u: G5 A* F8 X2 X
  3. * @param name имя квеста
    - e% _  [" v+ y* _. P% n* K3 [
  4. * @return квест
    : W# \8 u2 ?. `" a! m6 O# \1 W% b
  5. */+ P9 U  H) Q2 X; w7 H' O
  6. public Quest getQuest(String name)% U" D# I, D3 ~
  7. {8 l& }3 _5 }+ G4 |
  8.     if (_quests.containsKey(name))
    / {. L9 [! S7 J5 N
  9.     {
    + @  |: v( P) b) c" c
  10.         return _quests.get(name);
    - y9 O) W0 A) S6 ~- q1 B/ e& L
  11.     }0 V+ C4 D6 z6 O+ s% Y4 a0 L
  12.     return _scripts.get(name);
    * U+ ]2 w, V" x$ b) a) Y4 g, ~4 {- _
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.7 g6 P1 W3 X9 v% N/ p

6 n* ?% E3 T5 K$ b- IМетод getQuest(int questId)
# N! V1 r4 s; y' [. Z$ M, H$ Z
$ K3 h1 j: S: X# T
  1. /**
    # f) W7 y8 I& E+ x* y$ ?
  2. * Получает квест по ID.
    8 q/ n7 i0 a5 }) ?$ b9 c; _
  3. * @param questId ID квеста
    % R# Q5 @9 b/ H; ^
  4. * @return квест, если найден, {@code null} в противном случае
    ; R' c5 z/ @$ ]. I
  5. */
    ( T2 x& F/ j# ^: J; ~1 H
  6. public Quest getQuest(int questId)* _- Q* f5 c  K5 y) {
  7. {
    6 ?" n, n+ G& t
  8.     for (Quest q : _quests.values())0 l! N4 E2 |. N6 z  F
  9.     {
    , o+ t9 n* r! ^$ t3 W: N4 s  w
  10.         if (q.getId() == questId), w/ i6 Y, N. C* X# S& W
  11.         {* R8 z% {, _  G$ Q
  12.             return q;! p" P" U4 C6 D# F9 ?5 _9 d
  13.         }# Q5 g% ]$ p# [
  14.     }8 s7 z9 ^" W+ O. N3 t9 {/ i
  15.     return null;% C/ L% A3 G* M# o4 f- q$ `
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.9 R7 J$ V) f8 [0 P3 N; T

% {! h( N5 O' S, a* z( H4 gМетод addQuest(Quest quest)
% L! ]7 H# r' q3 \' b' b) {- v$ P5 M
/ u) O8 B5 y: h6 ^
  1. /**, U: Z6 |* L4 @$ Q3 h( w
  2. * Добавляет новый квест.
    - B$ x$ F( O1 R! \4 i; \2 P
  3. * @param quest квест для добавления
    ' Q7 Q, ]" j' L! f9 H" L
  4. */3 G+ N6 Q6 G4 u8 S* M) e3 O
  5. public void addQuest(Quest quest)
    3 w* Q2 ]3 C. R' {- O
  6. {) G2 }+ t" _) v4 e
  7.     if (quest == null)8 r+ W" I7 t- a* a8 s' v  Z1 w
  8.     {
      K" S4 s: \, P
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");" \& z1 ]+ p' s. T
  10.     }
    ! [$ M- H7 Q" b
  11.    
    ( ~7 y  [& w$ P' g6 p
  12.     final Quest old = _quests.put(quest.getName(), quest);/ ~( T' l5 j3 P$ t  f" X3 @
  13.     if (old != null)
    # i! B& H& a5 s7 ?
  14.     {
    3 A; G/ @& y  w0 n
  15.         old.unload();
    ; b! z5 D3 F9 r0 [9 @  i
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");% O1 P7 O! {* p9 b4 ^( p
  17.     }  P' T* n0 w$ @" k# n7 n* Q8 ~
  18.    
    ! ]* J4 x- r7 w+ _6 V
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    $ l/ b( @5 S/ K9 z, n
  20.     {
    0 w9 e& r! [6 ^  o* m
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();$ Z# ^9 Z) B% k7 t( }
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    " A- `6 q) j. m+ o. |
  23.     }
    / e& w6 Q7 h7 D9 v! z4 G# b. R7 @
  24. }
    1 N/ P- L- s2 Z) n0 T) f4 \5 ?
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.  L* }) ~( k! F3 x2 l/ K
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.2 n+ j$ s7 y: q2 S3 A
) S& K' o' a# m

; I' k0 t3 G$ ?0 D. `5 ]- t9 [/ P6 u" \) N
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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