Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius# X( ~5 I0 [; [, c/ Q
5 _* S9 U* I  V" u
Разбор файла QuestManager.java
8 o4 O( A2 h2 h8 S! R- t& _
1 _) {* O! L0 p7 M# ~Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 \* I! i$ ]1 `! R! |- K1 Y3 IОсновные элементы6 n3 U( \3 n8 g% a/ C5 ?9 G% ~
  • Лицензия( ?- `( u! m  x; R  {+ E
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.2 ~$ J! E+ {8 U1 e5 m6 V
  • Импорты
    $ o: F* \9 }* l' a0 f* Z$ t$ t
! Q/ I) E0 O& d( y6 z5 {
QuestManager.java — управление квестами и скриптами.
; N1 t& s2 f) X3 k. HПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ E) [1 Q. i0 P& C/ c! [1 A

1 `+ F! x0 s3 }9 @
; O. W# v5 S" j6 \$ N- n
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ i$ N0 D/ W3 h: k4 r+ y' P" }' G1. Лицензионное соглашение0 ^7 U% S6 a* E( m- ?$ a" g
  1. /*
    " Q* V; K0 q0 Q. u; o# x% D5 {  i
  2. * Этот файл является частью проекта L2J Mobius.( s. o% @. N, K! {
  3. * * ~5 W1 D' {7 V0 I7 X( q2 Q: j
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    8 p2 }6 M6 w$ o
  5. * её в соответствии с условиями GNU General Public License, опубликованной! o  i5 U$ [, W
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    2 e; A' \; i: ?2 w2 }
  7. *
    / [2 r3 L+ v0 H2 p
  8. * Эта программа распространяется в надежде, что она будет полезной,' R% ]: H# E4 Q4 Z
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии; v/ s6 d- T2 k
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    & N0 v% f' w- `3 O! n* c
  11. * См. GNU General Public License для получения более подробной информации.
    8 _  T3 F# s' ?( [0 b7 ^
  12. *
    / z6 ?. K! m& ?+ E5 t
  13. * Вы должны были получить копию GNU General Public License
    " x$ O9 a. Q( p3 j" ]' g1 Z( @
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 O5 R1 Z6 o) l# r. v' _+ k
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
- R8 `0 f6 u# d9 _
5 |6 ~' r0 @# h. Z$ u2 V
0 ~! m: z" L0 `( L, M: L/ }* f2. Импортируемые библиотеки
! p$ C4 X) ^+ @" q* b5 i  H" M2 A/ x
  1. package org.l2jmobius.gameserver.instancemanager;
    ' ?( U( Y- |+ b# ^5 V
  2. 7 r1 {6 z' F1 n" X
  3. import java.util.Map;
    + T" A% S+ \7 Y' d
  4. import java.util.concurrent.ConcurrentHashMap;
    ! A. {+ P% ?  [4 A$ Z' J0 ^& x
  5. import java.util.logging.Level;2 ~6 W' i3 p7 U% p& b
  6. import java.util.logging.Logger;
    ; O- @; {6 X4 a- e/ i, R

  7. - D+ p) g7 e0 V
  8. import org.l2jmobius.Config;7 ^) F* |4 O* @' ]: k1 W9 `2 D
  9. import org.l2jmobius.commons.util.CommonUtil;
    - E) \7 @& [3 y. y9 W! y9 H) w6 V+ `* ~
  10. import org.l2jmobius.gameserver.model.quest.Quest;$ c  `! T! c1 ~2 Y# s, [& I/ r
  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 — менеджер для работы с игровыми скриптами.% ?4 X: S* F' E) ]5 B7 C% q+ c; J
6 _9 L  U6 Q# g) r+ b8 S! t1 c; i
3. Описание класса QuestManager
  ~8 j  Z# e, v7 a: x" u# }
  1. /**1 l) ]+ i# s5 B$ p4 o  {
  2. * Менеджер квестов и скриптов.
    ' y8 Z5 X7 L9 W
  3. * Автор: Zoey76
    : R, D) @: Y- G2 Z' q3 x( v
  4. */, d) e+ b: s3 e" B5 L, b
  5. public class QuestManager6 P, n% e) m* `  F6 c/ i* o
  6. {# G& Q! n; C, t8 s; c, c
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    1 R: B& M: Z( s$ p+ a
  8.     6 V' T% b/ C& c% I/ {
  9.     /** Карта, содержащая все квесты. */
    : C  q2 R6 i) C& \) m
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    % \2 [% [7 g. y! e* O9 V3 a, A) |
  11.     /** Карта, содержащая все скрипты. */% u( P2 G* K# x
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    : i. H2 ]7 H- z6 ^9 _* C0 v
  13.    
    : U9 A. Z! I* O* Q" q
  14.     protected QuestManager()7 y6 t" |5 J6 u- c8 T8 U; @7 j
  15.     {
    & C" \& g8 e: ~) W
  16.     }
    ) D7 [7 {; b$ ?7 O- o$ ^+ @4 M+ b
  17. }
Скопировать код
4. Методы; V! a( \4 _1 F: ~. b+ n3 C
Метод reload(String questFolder)
1 x# t& I2 X5 u
  1. public boolean reload(String questFolder)) m2 X- {  _% }/ U0 w/ Z
  2. {
    ) ~. E4 Q1 D. v. w: n
  3.     final Quest q = getQuest(questFolder);1 k$ r2 A0 r2 c1 ^& r) |
  4.     if (q == null). B% Y$ ?: Y; e
  5.     {& S; w+ [* T1 a
  6.         return false;9 U) x) \% v; i1 [  D" I: d
  7.     }- {8 |4 Q: v/ ]8 Y. i' F) @! w
  8.     return q.reload();
    2 g1 q0 w6 |( N8 P  y; O
  9. }
Скопировать код
, G6 [. ?: ]* `9 X% K* u# D
3 L" B. U; |+ D; n- ^
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( D/ G: ]( y0 o: o
Метод reload(int questId)
3 k  U/ j- Y+ c9 S9 h0 J# h
" i% Y( U9 w; R9 u' G& X8 I) A5 i1 A
  1. /**" P% Q8 ?1 V" v0 i9 j
  2. * Перезагружает квест по ID.
    6 u, w3 a' L9 e! D  m
  3. * @param questId ID квеста для перезагрузки8 `" E  e7 x; E$ L* n7 i: o
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 }9 k# A5 b  ?- C  Z1 J
  5. */
    , [! x: w# n+ O0 d# `
  6. public boolean reload(int questId)1 ^: \! o: y  B, g7 Q8 x, T$ d5 {2 }
  7. {( f) J& ]4 L- y$ p
  8.     final Quest q = getQuest(questId);
    5 @9 F& O) n, p" v2 X  `; Y
  9.     if (q == null)9 O/ g" s) B% Q. m" h2 _9 J% L0 ~9 W8 E
  10.     {7 M% p& `. f# a& m
  11.         return false;
    2 w+ ~; g% r6 _+ `6 v, k
  12.     }
      y4 V0 q) w) J8 u/ y
  13.     return q.reload();. ^  q) v+ l/ p/ ^( O3 ^7 {
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    1 T* h, B' R0 X1 S2 r) y2 H

" A. f& q' r' C# b6 |Метод reloadAllScripts(), P' |1 O; V# w7 t

' H9 A3 ^2 o* @$ C! f1 ]
  1. /**6 k7 q; n2 }( t; w2 a9 ?
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    4 J; o) U( N1 \$ [) J
  3. */
    + N: M' ~. H& q- P6 C, W! L
  4. public void reloadAllScripts(): q: i8 Q: ~4 L
  5. {
    + {6 _) @( {2 O" x; r  j6 M
  6.     unloadAllScripts();
    / N- U, u; b! m$ k! e
  7.     ( p$ h' t: u9 g1 [
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    , s" t( S, w5 A0 i) Y9 z
  9.     try
    9 ]+ N9 G/ n0 q! J8 F
  10.     {, l' }* D1 ~3 |3 X! ~; O
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 |- T& P0 k9 B' }% y
  12.     }7 Q+ b8 t9 i4 W* J9 p  H
  13.     catch (Exception e)- [3 {+ y+ J8 l4 Z1 p, U+ O0 m
  14.     {
    % s2 e% Y8 o3 V
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);- i) [; ]2 U) ~
  16.     }
    $ S& A9 Y* r* g& p, ^: W
  17.     ( B4 Y/ ~5 m' q3 k& U
  18.     getInstance().report();3 X- K' l2 N, d2 I+ b
  19. }
Скопировать код
Метод unloadAllScripts()# n- c: X& t$ B& w; r5 e
% M+ I( ^, r2 |) C) b
  1. /**$ g8 e7 v5 g3 }: \  X) w
  2. * Выгружает все квесты и скрипты.. D$ w+ A, _* W! {5 ^/ P1 \" c5 x- _
  3. */6 e3 _0 t) r' E. B) ~5 w
  4. public void unloadAllScripts()4 o% j) H4 U8 @) E/ u
  5. {& V; ~* E  ]& r$ c
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 @: \2 i7 F# ^& P
  7.    
    ; M+ @% ^1 Z$ Z; y
  8.     // Выгрузка квестов.
    3 u) E( o8 j, o& X6 U5 m
  9.     for (Quest quest : _quests.values())8 v+ E5 z! K0 ^& l
  10.     {
    4 w( f; e1 @4 _
  11.         if (quest != null)) ]$ h# {2 q* [1 Y) D
  12.         {" M% [8 L" v) g6 ]+ [; m
  13.             quest.unload(false);; T+ h: V; n$ h( {; F2 k: s
  14.         }" F/ i  L! N, H$ D. y
  15.     }
    5 R$ n+ M' O. f9 y; [9 N
  16.     _quests.clear();" l- m( r+ u4 J  Z
  17.     // Выгрузка скриптов.$ Y6 x7 q. ]3 @" z
  18.     for (Quest script : _scripts.values())# V! }6 K; r7 P
  19.     {
    - C6 P  O, v6 |
  20.         if (script != null)* d5 r$ E2 Z* V5 _) b. z
  21.         {
      }( B/ x4 g3 f( i9 ]# e. [
  22.             script.unload(false);* x$ l) q1 i7 x' U- C7 r
  23.         }
    1 r% F! q$ y) L1 _& N2 B
  24.     }
    6 }+ a7 l9 a7 t( @$ r6 C9 \
  25.     _scripts.clear();% p) j+ U8 P9 m! F. ?3 f
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    % f5 j( F! n. {& C

3 ^: o$ w1 Z7 M; b& a) KМетод report()5 l+ y8 a& Y! l) c4 t5 e6 h  a: \

! N, `: n- I7 Y
  1. /**
    % f- Y, p' c; a6 Z5 w( w/ z& r
  2. * Логирует количество загруженных квестов и скриптов.
    $ h  p0 T! y% z0 I$ T" |+ ?
  3. */
    # J6 s; N& E$ j' J3 e2 }
  4. public void report()
    . W9 q) ?% ~! r1 z: Z
  5. {$ z7 C" D# b4 z9 b# ~  j& M! P8 h2 ?
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ) l  q* B8 B* I9 ^2 ~& K
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");( Y0 b5 {# Y9 m$ s+ O9 m+ }% W
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.( B  k+ E% c8 G  N7 r) t: ]
$ f- W( m9 e" _! S# U
Метод getQuest(String name)( B$ [) e8 {, G: k% S

( Z& `% v! y0 k+ S7 [# o
  1. /**: V3 W% }0 b6 D
  2. * Получает квест по имени.
    ( @) S9 a0 A' S6 S4 o( ?4 L
  3. * @param name имя квеста0 r: u9 F# u4 m* p5 n+ m. J
  4. * @return квест5 }: Y$ s# X+ R2 b/ \( x
  5. */! v1 a2 o) t" o  }" {3 F
  6. public Quest getQuest(String name)
    9 P5 e  r0 s5 b+ T9 D0 q$ Q! k
  7. {
    1 K7 W+ l  V4 |6 }
  8.     if (_quests.containsKey(name))3 c' k$ ~& U& L) Q  Y
  9.     {
    ( Q! b' B9 W2 o8 D- `7 X
  10.         return _quests.get(name);
    9 S) B6 r7 u5 v% f
  11.     }% y3 C. B, v$ F! e
  12.     return _scripts.get(name);
    1 C6 S; e2 o4 q
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.% h! k" o. m3 k* n+ z/ L

5 Z' z/ ]/ _' M  P3 A9 PМетод getQuest(int questId)
. \$ y# E1 K3 f/ {
2 C4 b  m, P/ Q; K
  1. /**5 Y/ q( A) D! ^! y
  2. * Получает квест по ID., E( A; D3 b6 c6 d
  3. * @param questId ID квеста  v6 I) E& o4 w" k0 I
  4. * @return квест, если найден, {@code null} в противном случае
    0 W( o. c7 a% p/ J; t3 Z
  5. */
    5 H: w5 f6 U# V& ^9 Y+ f$ X
  6. public Quest getQuest(int questId)
    9 x1 M6 O) E8 @. \$ }
  7. {5 Z9 O( R) J( j/ B1 @8 W
  8.     for (Quest q : _quests.values())
    " H. ?' J- J  }! a% m! k( g' z5 P
  9.     {8 i1 [6 x, g5 ?' \" R* ~
  10.         if (q.getId() == questId)
    + _2 }) {* {& f. m/ `7 |* U
  11.         {
    * v1 i9 K9 ^- P$ H% D' ^! p1 F
  12.             return q;
    ' k3 E" `/ q# O: ]0 F1 z) |6 Z0 F
  13.         }, \6 \/ ^& H9 z% X  |# X
  14.     }; G+ _7 D! U: O; E
  15.     return null;
    ! X2 y) R+ B! i  U( e
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
      E% ]$ Y1 ^0 \3 k
2 K$ {/ ]0 Q6 K1 J. h
Метод addQuest(Quest quest)
0 U: B# J/ B4 M. K7 I
) L7 d- t; ^( M
  1. /**4 F6 |, d) e' k% E7 h. p
  2. * Добавляет новый квест.
    ) T7 ]& B( B9 T  b/ i6 j4 a
  3. * @param quest квест для добавления) ]4 z8 U5 }% t2 |3 [/ U% z
  4. */
    2 H. E3 Z3 a& f$ t8 a, u
  5. public void addQuest(Quest quest)
    5 [% i8 C( W2 x; F
  6. {* M3 ^: n1 T* X. L, E
  7.     if (quest == null)
    7 x0 h: K0 i, `
  8.     {
    . h* D: s& X* k
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");+ @% M+ f% O% I7 v, W
  10.     }
    % c) r# z- L5 g% r. \
  11.     ! M2 R4 q' X7 a- W
  12.     final Quest old = _quests.put(quest.getName(), quest);2 P+ l. X2 c+ r" H
  13.     if (old != null)9 z/ A+ F. y) Q1 H( g' x
  14.     {0 m) R2 G6 c. G* Z
  15.         old.unload();; K" Y; V0 J, Q- F+ V0 G
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");) x* l% o% j7 Z/ Q7 y
  17.     }. `9 w$ {9 o$ \- q9 k8 A2 r
  18.    
    ; Y. t' c7 [  \5 Y- Z  l3 `$ r% v) |
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % C' c1 S( r+ B. K$ M
  20.     {
    - l% w. x$ D' U$ G% S) w
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    & v+ _" w  @% h+ i% \8 b# n+ o& _
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    0 A" M0 B7 B+ [- f! }
  23.     }0 r' T5 i4 w1 ]/ @
  24. }& w4 c+ C5 F' U; z0 ^+ P
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& w! u. I: a% k" A
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 d# U2 [' l5 V) ]2 f
, _/ F7 L$ S0 B. ?  }
, z$ W, O2 I5 T  l) q
/ ]1 D& K* G, j0 `2 t
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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