Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ z, |/ a$ K) O4 w6 E& `7 |1 D1 @" l) g( l$ V
Разбор файла QuestManager.java0 N$ u2 k' Z+ g3 A1 D* F6 j$ t

8 T" i9 I3 b! N  LЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& O, p  D4 ~; I+ r/ y8 {' G
Основные элементы) v: h8 S3 x' d1 B8 }5 |
  • Лицензия( [7 S9 B1 ]5 i9 A4 V1 ?# ?: U3 t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ! h( u4 _6 @0 I$ M' \
  • Импорты
    . c$ k' F4 Q' g, x+ y

  w$ B  _. ]2 g/ t: k! pQuestManager.java — управление квестами и скриптами.  B4 l! e! R8 q/ s0 {- e. `
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
0 U5 X& A& D0 Q0 |
2 a5 \' b$ j) ]# l
, l1 w3 {1 E: I  R$ U
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.2 a8 ?. P( b# G" D* s1 Q" J
1. Лицензионное соглашение
3 b# ]. B8 u) c9 v$ ]
  1. /** l4 F# V$ B( b
  2. * Этот файл является частью проекта L2J Mobius.6 l4 N) o: ]; s1 J
  3. * ( E/ H* B+ G+ W+ A
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    % w" y+ Y' t) O! {4 p+ V6 r
  5. * её в соответствии с условиями GNU General Public License, опубликованной( ?% }4 u0 }, \4 {0 A
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ; \" {  }9 }8 i. i+ q6 K  p% i
  7. *
    4 P) Y+ {" M$ ~! F: T, X
  8. * Эта программа распространяется в надежде, что она будет полезной,
    . F  b( a- ?* k: w9 T' v
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ) P2 w: l3 {+ L
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ." M" y/ u8 g% N" U' l
  11. * См. GNU General Public License для получения более подробной информации.6 z; u: K& Z7 r# T& K
  12. *
    2 ]6 \, [, D4 O  @
  13. * Вы должны были получить копию GNU General Public License
    * G7 }4 C% g8 R% @- z) h; \
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' V! a* X& f( F& Y; v+ |
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; G' Y9 e, F& E$ {0 H. u
( c, m) e. e4 _5 h2 y  g7 B! k

. M) n  k& q: N7 w3 i2. Импортируемые библиотеки
; |. i) E/ ]8 R: \8 Y% W9 f3 V6 l. W0 l. W, S' O$ G
  1. package org.l2jmobius.gameserver.instancemanager;( s* J8 W" R5 S
  2. / }! R' l! C. j! ~( o  e" d
  3. import java.util.Map;5 I8 ?+ A& g9 z
  4. import java.util.concurrent.ConcurrentHashMap;. L, c$ |4 C, Q( J
  5. import java.util.logging.Level;- I2 `3 k0 _+ A5 U5 T
  6. import java.util.logging.Logger;
    1 v) G# L/ R. R0 {  K
  7. + ]4 V+ z3 @% z) O4 ^' e
  8. import org.l2jmobius.Config;
    - n" V& s( |6 L5 R( p
  9. import org.l2jmobius.commons.util.CommonUtil;+ C: I9 {) h2 Q  `& l- V
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    : T# P$ ]$ g$ k3 G0 F: H
  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 — менеджер для работы с игровыми скриптами.
& F3 Z* d8 ]2 F* N$ o( S1 C
& f- A/ I$ v& E/ I; ]' Y0 i9 p3. Описание класса QuestManager
+ ~6 J6 y; u' l- D
  1. /**
    8 t6 X. N  R: M$ \: Q6 l/ }
  2. * Менеджер квестов и скриптов.
    6 F! l  R; j8 g; l6 ^) W/ F
  3. * Автор: Zoey762 J2 Q$ F4 J! O1 y% B# Z9 c$ `
  4. */9 g' y6 n: _9 O; o
  5. public class QuestManager+ T6 l( X/ y3 }
  6. {3 L3 G" Q* h, P! o: D' A3 ]
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    + [; b* ]: J- r9 t0 c
  8.     ! F. ~3 B) _0 o! X9 {) v: \
  9.     /** Карта, содержащая все квесты. */" C. ~" r, ?9 P1 ~9 y0 W& [8 g
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();, k0 I( N, d: U' e$ v; q
  11.     /** Карта, содержащая все скрипты. */  t; V& V$ i+ f3 {. c; H0 N: b  m
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    ( w7 M% J  n4 {
  13.    
    & n) h! O6 Y+ m& N, c
  14.     protected QuestManager()+ A+ D' K/ i) j1 g7 w7 @
  15.     {3 a! X$ P; u; U: R: a
  16.     }
    3 G; Y' m" d( ~0 K/ u: Y, }6 V* n
  17. }
Скопировать код
4. Методы
& t0 r3 a+ `/ v3 V% GМетод reload(String questFolder)1 B$ W" p. E$ \( E0 d+ L: W: S
  1. public boolean reload(String questFolder)
    / k* L- M7 H. v$ l9 g
  2. {& N1 t& P5 Z* h# M
  3.     final Quest q = getQuest(questFolder);
    ! e' t7 v# m1 i9 ^6 _* J
  4.     if (q == null)
    % i! h' ]8 C* k; ^/ u& _
  5.     {2 N1 l0 m. s. f/ N' k( B/ M
  6.         return false;: H5 Y# ?& x- [6 X! q7 e3 b( s+ `
  7.     }& p- x2 {- ^' [9 d* g3 F( n
  8.     return q.reload();
    # C# K$ y4 p# ?. x. a! \* w
  9. }
Скопировать код

1 p3 y) b2 }& A$ H, a" X* M$ I; [  _/ m4 ]
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.- P' w+ T9 s# ^
Метод reload(int questId)
! a9 s8 e) V$ r* f( R' i, O6 T5 b3 H" g! a6 I3 \
  1. /**( B/ w. g, w5 W0 C
  2. * Перезагружает квест по ID.8 d0 U6 V+ A8 {8 \$ g! f
  3. * @param questId ID квеста для перезагрузки
    4 [: |6 c# L4 S; }: k
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае3 S9 I/ |' U( C2 I
  5. */
    " c0 i% |/ D- [3 I8 r& O
  6. public boolean reload(int questId); v& L0 O3 P8 A8 e5 z+ u
  7. {
    ) }: L2 z, H( V& d" r5 b
  8.     final Quest q = getQuest(questId);/ H8 P8 Z2 X  A4 s0 \. p  D6 }, T
  9.     if (q == null)+ ?( b, E9 N( ]. ^
  10.     {
      P* ]0 _3 O3 K/ n* }8 h
  11.         return false;% y5 W' A: h3 {+ J
  12.     }8 c/ U8 X& ^* g/ d; H
  13.     return q.reload();
    . |  F- }5 n  Q9 W
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.; n% z7 D+ S+ D1 G
1 {7 d/ R% g2 D8 }. {
Метод reloadAllScripts()
/ l4 ^, Z' H+ \- O9 N1 \+ E3 o8 n4 R7 j% X# O
  1. /**/ g4 ^& q0 a* H6 T" f  }
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.4 \  D% W' I; B. E/ L2 y( H3 F) u$ n+ B
  3. */: V* I- f; u6 s9 p0 l9 k
  4. public void reloadAllScripts()2 y2 _3 q( j# b
  5. {% c7 n. U; A5 W0 z2 I7 @) {+ M
  6.     unloadAllScripts();
    ( y: B% k7 {( _1 W' v9 k8 |9 q
  7.    
    + I% j3 v2 C  e
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    * e! c. N: Q7 j. H0 o
  9.     try/ K& a( u' u% A  D
  10.     {
    ' o" P( l+ d6 t/ j$ p, |7 ]+ k
  11.         ScriptEngineManager.getInstance().executeScriptList();# M/ S8 @  N7 m
  12.     }! v( c8 J2 a' N+ K3 N: `# t
  13.     catch (Exception e)
    . ]* r$ o, c3 K: C9 U( Z$ D
  14.     {
    % o% A0 C1 J2 K; S- K- q8 C
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);, [$ j4 ~- E7 q' Y/ L$ B+ n7 d5 h/ U
  16.     }0 W( u+ g) _- s+ M2 K+ K; s+ @
  17.    
    3 L; `6 ?/ a& y6 [
  18.     getInstance().report();
    9 g: D/ |5 B4 H' X
  19. }
Скопировать код
Метод unloadAllScripts()2 U, H6 G5 @; z, o4 x
7 _' M5 x! h0 X* }- Q" `8 R% Y' w4 Q' ~
  1. /**3 G# w  u6 U8 B: K0 t- I
  2. * Выгружает все квесты и скрипты.
    " l2 x/ {6 E3 s4 O, P( c4 x* ~
  3. */7 d2 w4 n' P: X, c6 h
  4. public void unloadAllScripts()1 q- f9 e' H8 p6 E# Z
  5. {
    0 E& C8 B4 y! M9 o
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");8 L, h! m, d$ I& y% h7 Y) c
  7.     0 q- D" ]# S2 F
  8.     // Выгрузка квестов.- f$ ?/ f7 l; K: C
  9.     for (Quest quest : _quests.values())
    1 r- ~* Q, j6 y1 e* g) O5 H
  10.     {
    # {6 q& d0 _  y5 X9 s2 C+ ?, g- Q
  11.         if (quest != null)
    9 N$ x- J2 M' ~) o
  12.         {7 _9 d% M# F' Z$ Y+ _: \' @
  13.             quest.unload(false);
    & }! D0 w) L0 c* a" q, e0 I8 Z: o- n
  14.         }+ u2 V5 K6 R4 ]/ {4 ^# I
  15.     }% }: `9 R" d8 P$ `
  16.     _quests.clear();4 z7 ]* i& p% F/ p) m+ T9 w7 _8 h
  17.     // Выгрузка скриптов., z2 k) W5 |0 T& v* }
  18.     for (Quest script : _scripts.values())
    ) m, U/ N1 M: w# X4 O+ H
  19.     {' K: M8 L8 B% E# r. S9 Z" z
  20.         if (script != null)" M( K# M; ~  L+ g
  21.         {
      a$ e% v- X- g# ?0 ?" @0 B
  22.             script.unload(false);7 N# Y$ n7 H9 q7 k4 n6 r6 x
  23.         }
    ) ~# h7 z& D5 O/ X* l! Y0 j, k
  24.     }
    5 F% E& i5 T. e
  25.     _scripts.clear();. S$ T! [) p9 f! Q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    9 }5 s4 w7 X6 A9 p1 `6 X

4 J2 ?$ d: Y* X+ A2 oМетод report()' x+ l. ?  P8 O8 _  m4 C
7 w( b, A2 t' ]! U
  1. /**
    " \/ F4 t1 [1 X' O1 S8 C4 s- k4 Q
  2. * Логирует количество загруженных квестов и скриптов.
    # ~+ \6 ^, l# d3 ]' k% ~: U. @$ a
  3. */
    6 U$ E1 ~. V) m- X
  4. public void report()
    * h3 y8 Q+ c# F7 n1 ~# J
  5. {) A2 U' @* l9 d' k/ U+ z
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");/ e$ j% G" ?2 j& O( F, I6 B8 x. w
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");% t. |: H9 _0 |6 L/ q5 S4 `
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    1 L* w% S3 S) K+ s2 v, V
1 i/ e4 @5 Z$ i- p! B4 b; @
Метод getQuest(String name)
+ q7 d2 `* t# U  F" i+ b; {
6 Q: \$ w6 ?  R: q' z
  1. /**  D/ v; u5 H) \# j! A: j1 ^
  2. * Получает квест по имени.
    - _0 w+ \+ v3 {; }+ G
  3. * @param name имя квеста
    7 {# Q& N( T: L& d
  4. * @return квест9 _% u4 g: x6 ^% q- s3 g$ _5 |0 B
  5. */
    2 D9 m! ?" x) d  h! s
  6. public Quest getQuest(String name)
    : n+ I/ Y9 s  t% b0 T' D
  7. {" U1 I9 e! o/ A8 T
  8.     if (_quests.containsKey(name))
    " e& b& a8 I9 W1 `' k
  9.     {
    6 y8 u; ?) W+ t7 l9 J' m& G" q7 N
  10.         return _quests.get(name);3 c/ R- G+ t& H- ?
  11.     }7 a" s7 |' I* K  j- s
  12.     return _scripts.get(name);
    ' M. ~8 S  A3 O7 X& C' C% p( t
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( a9 T$ t0 p7 h+ h  C, g
9 l: u! c+ _: `% ~" I
Метод getQuest(int questId)
5 T' m, h4 ]+ a$ D% [( m( d! K; g) ~, u/ O4 u
  1. /**! E# T3 @2 g6 M0 V
  2. * Получает квест по ID.2 `. d6 l: ^" r9 x( W
  3. * @param questId ID квеста: \" `) a8 r6 h% y% }
  4. * @return квест, если найден, {@code null} в противном случае, E, Q& h% d6 l# J; g' N
  5. */
    0 P* Q. L  C; N% b% q: M+ G' S
  6. public Quest getQuest(int questId)- l- _1 D  [: B
  7. {
    . ?/ h* A8 M8 Q: d' T. t' T, L5 t! H
  8.     for (Quest q : _quests.values())
    ( K$ d5 }' n/ g$ v: c' H
  9.     {& j( D3 S4 k& n
  10.         if (q.getId() == questId)8 T3 J8 }1 N2 `" y$ a
  11.         {
    ( Y% H$ z0 _6 u. ], \
  12.             return q;
    9 i% i; a8 K+ n' H6 N
  13.         }
    ( R4 U2 \6 C7 ?8 e! K
  14.     }5 N$ A) g. J& A% r2 P4 U
  15.     return null;1 X: i, P/ F6 K
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    % @0 Z% U% Z; G' x1 ]; A7 J5 F
! c+ Z) O3 l7 B6 ~- v
Метод addQuest(Quest quest)
1 a8 D5 r) c1 a" {* L
; n" i; O0 J3 o
  1. /**
    ) V9 v5 q8 M( I' u2 K$ A' T
  2. * Добавляет новый квест.6 g& F% s' d0 p" W( p9 Z  X! `
  3. * @param quest квест для добавления
    2 X" k7 ~7 L5 n( c
  4. */* q0 e2 o. T0 U* G& k/ U
  5. public void addQuest(Quest quest)
    ! a# W( R4 U  _" O/ N
  6. {
    / w7 X3 f/ {+ X/ y$ F9 v3 \
  7.     if (quest == null)
    * I  ~6 U* f; x5 t- u* ?% z3 \
  8.     {
    $ u$ @6 |$ W9 F
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");2 Z& p' u5 [/ h0 {
  10.     }; M, U/ E3 ]' g* l
  11.    
    " J9 j, }8 _$ e% a6 m
  12.     final Quest old = _quests.put(quest.getName(), quest);1 M: q" u. q* S8 e9 ]( c
  13.     if (old != null): ?$ ]4 Z2 Y! I6 x3 I& W& ~
  14.     {" ^) J- h, @/ e# n( f& Z
  15.         old.unload();: s0 e' R5 G' z$ _* }0 \; ~9 r
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 h6 |6 Y. _! c! O
  17.     }; q# Z/ s" b1 F! O! C
  18.    
    2 n2 ~9 T  ]" y% \/ N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    - e/ L! q9 b7 q
  20.     {
    7 r0 U- `4 o: f* s4 ~0 ?
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 z) v1 b  l5 I/ Z* s9 h. A
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    1 I, }% n( g6 F7 o' R: e7 K
  23.     }
    ( }7 C1 i5 D! }* l
  24. }
    . Q( l9 G: C7 c
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.# N5 A+ e% E- P$ A/ W. {9 |/ P/ l
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
( o. d) i+ v6 s( k- b' P5 l  g0 |* [. t* u" ^, h( w

" i$ p/ W  L( U* i/ Q' y9 @5 @& e1 o3 r: D
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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