Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius9 f: M( d5 ~. A4 z  ^
! B8 c% _  v0 @- j& p
Разбор файла QuestManager.java
; t$ a0 }( x$ Z2 t4 R8 a  \7 e4 c7 z8 k" p  t( A% h
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.+ O$ X6 _+ Z3 N& E6 v* R' X
Основные элементы
- Q1 y8 c8 H* N9 e
  • Лицензия0 T: A2 l0 f& I: J. [
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.! [5 Z3 W5 g& g; b8 v3 w
  • Импорты
    1 S3 l* v5 ?. i) k
+ z: p: K" x8 I' ]/ T' B5 x
QuestManager.java — управление квестами и скриптами.
" q% c! x8 \) p1 kПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\. D0 P/ t% L# b/ Z0 ~6 n4 `

6 l" P1 Q/ R) [7 T* k
4 u3 y4 G4 {  s
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
  o0 I( c5 S) R$ E7 J1. Лицензионное соглашение7 n  @3 q1 e( n# U5 D
  1. /*& f7 ~  O# L/ r
  2. * Этот файл является частью проекта L2J Mobius.
    $ u" W% J) U4 K8 ~! F
  3. * ) [+ U/ ^$ B4 `  R- _
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 r9 a/ R" W/ |) e/ p4 b- u
  5. * её в соответствии с условиями GNU General Public License, опубликованной" \( a9 t+ t; e$ E1 u
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ x; {. R( u- E) S9 h
  7. *   L1 }, ~) e& X! e6 {
  8. * Эта программа распространяется в надежде, что она будет полезной,
    ) f1 x6 e, \) _4 S/ C- h6 J
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    3 _0 y7 o1 S$ u* J6 T
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 a9 f2 v9 u4 g( o5 t/ L/ x
  11. * См. GNU General Public License для получения более подробной информации.
    - l4 n$ y7 t. ~0 J  w9 @
  12. *
    7 w' s) g. W( ~  j5 w, V
  13. * Вы должны были получить копию GNU General Public License
    7 H% Z4 i" K& E  ~  s% L$ c
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ y* H& G2 Q/ s" Q) G1 z
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
" g! L  {2 B8 g: A; c( w5 m7 k3 ~
$ L$ ?5 m+ ~, x; H) k; m8 H$ }8 z0 D. s
2. Импортируемые библиотеки6 G* l' B1 F" n: `+ h
5 g# S! a/ y- `% p* `
  1. package org.l2jmobius.gameserver.instancemanager;
    9 X+ F! K# ^' a2 i: J+ }2 Q: Y4 \

  2. + h7 \) B+ n* ?8 n
  3. import java.util.Map;- \4 s& O7 s8 |" a* u9 s( w4 o
  4. import java.util.concurrent.ConcurrentHashMap;1 r* m8 W& D% b# r- H2 y! f6 n* |1 z3 w
  5. import java.util.logging.Level;- l" J2 v6 ^# X; P" K
  6. import java.util.logging.Logger;8 G( `& |/ [7 h  _" I
  7. 9 K5 x7 ?  T& a4 p3 y0 F$ X
  8. import org.l2jmobius.Config;# q& i1 O( }) }1 f! k0 _2 g
  9. import org.l2jmobius.commons.util.CommonUtil;
    . G# d( p" b; _! }# Y! f4 B+ P
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    3 z* o" _# _) L( c* U
  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 — менеджер для работы с игровыми скриптами.7 {& J1 R/ e. s6 A9 ?
  E0 W( Y& _3 y: f2 ?3 X
3. Описание класса QuestManager/ R/ z, ^& m" l; G6 `3 X
  1. /**) z9 B& t6 G) E0 f
  2. * Менеджер квестов и скриптов.) p2 V; Q* S. h& \
  3. * Автор: Zoey76
    , Q8 r- G- [% ~/ l( _9 r
  4. */2 z" E/ s% ~0 v2 L$ o+ l
  5. public class QuestManager
    * d) w# ]/ |/ K2 h
  6. {
    6 F: R. n; W- @& B" A
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    . X5 B& S+ l* s$ H
  8.    
    9 o3 m  B- O; V' n, F# |7 Z% G! m
  9.     /** Карта, содержащая все квесты. */7 f* z/ G+ a( [$ x4 e
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ) p8 i4 h" L# I# F( L0 }/ D
  11.     /** Карта, содержащая все скрипты. */
    3 m+ j. E9 ]; m, Q
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, N& V* g5 W/ J9 e. O( L5 b- H4 f7 B) d
  13.    
    ' h( J7 l. s, f/ d
  14.     protected QuestManager()
    % h, Q4 K9 t2 @: I* |2 }+ K
  15.     {
    3 T3 W# A7 ~! F) n
  16.     }
    3 `7 z5 [/ @2 W5 U$ V+ E: c
  17. }
Скопировать код
4. Методы, i5 }) W0 O  B  }9 G% R* t1 `
Метод reload(String questFolder)7 h6 H& o8 S5 k+ Q' i* C
  1. public boolean reload(String questFolder)
    # z' v. N$ h+ l8 r9 ~
  2. {
    4 x; K% _- i) }! F/ o9 N$ N( p
  3.     final Quest q = getQuest(questFolder);0 q/ {; o+ S; [3 D. A
  4.     if (q == null)
    : ]4 X) e: F; J8 M8 m+ f/ Y
  5.     {4 }. m" H+ {2 n
  6.         return false;
    # P2 c4 b2 @7 H* y) w
  7.     }
    , r1 F$ H, W4 f7 y' K6 n
  8.     return q.reload();
    6 S" X+ k8 M5 |- j
  9. }
Скопировать код
0 j0 F5 y; y- ^8 ~$ d5 @
' M& }8 ~& a8 K3 F) _5 _! V
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
: S0 Y3 a( y. fМетод reload(int questId)
; S5 o1 k8 |+ e
% W* j7 a. p. b$ h+ T
  1. /**6 v* ]( k+ H9 ~! t) z; h/ d3 {
  2. * Перезагружает квест по ID.$ W3 b7 q' \9 B/ `  B( b
  3. * @param questId ID квеста для перезагрузки
    1 u  ]/ P9 |% Z3 e2 u6 o3 V
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    8 _( S& q8 ]+ S$ Y
  5. */( b- T/ Y+ u+ K; x/ C; }& @- ^8 d. U( G  R
  6. public boolean reload(int questId)5 g+ _  f% J6 ]$ s5 I/ F
  7. {4 o1 I' D0 Y: z# v/ u* Q
  8.     final Quest q = getQuest(questId);6 v: s3 R, z. _; \" S0 J2 _( Q
  9.     if (q == null)) S. Y) x! G, m  n! y* f8 W' `
  10.     {
    ; u! g8 P: s$ q, V
  11.         return false;+ Y( R3 h% t0 M" u" t- g
  12.     }
    - d- I- _- M# }2 f9 P
  13.     return q.reload();
    5 L5 X* i. x# J( E9 E$ H2 [
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID., |, R4 Z/ r  d  e! ~7 {! c% ]
. o; ?& G: H1 v6 U* d: Z9 [2 r
Метод reloadAllScripts()
+ P9 H# y$ A* [' Z! q" N: U
3 ]$ w- Y  F( R( u, w7 B% c6 A
  1. /**4 K2 H! f0 H& W; r; C5 M
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.' \; Z+ W6 ?$ [8 }+ g: b& }
  3. */
    ' Y/ u/ K' t! x& K' n/ H. }
  4. public void reloadAllScripts()
    ! t; Q! g5 c* W" F1 J- ~+ \( L
  5. {: d5 S, w$ v0 `, Z9 v
  6.     unloadAllScripts();# J. e+ G1 s, ^5 s$ T# b0 N0 L" t
  7.     $ _/ }2 X; E5 [
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");8 P5 H# L9 S0 o8 M/ ^
  9.     try* l+ Q' h* E/ ?0 r' E) I
  10.     {( U8 C- F, I& P1 s8 ^
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ) \: x" o8 k$ a8 l5 X
  12.     }6 s& z4 J) h) U' ]
  13.     catch (Exception e)
    # ~8 P9 X  c1 a
  14.     {) v4 [0 N! _/ P4 f  F) e. ]
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);6 }) k! v  e$ `; w2 g5 v
  16.     }
    5 Q, j0 q/ \  F' t4 a
  17.     % T$ Q$ _. V: s/ C, p* {
  18.     getInstance().report();
    $ @0 s# b6 E9 o: i8 ]1 U
  19. }
Скопировать код
Метод unloadAllScripts()( Z1 K6 ]2 v7 K+ l: V  Z* T$ b

- P; m0 [# p+ Q5 E2 n( i
  1. /**! I- N) M- d3 C! C4 i% H
  2. * Выгружает все квесты и скрипты.9 n0 F, L9 Y  a4 `! X, v0 c
  3. */
    4 S, e  @& E' j
  4. public void unloadAllScripts()0 d6 M; W: Z% }* p) G2 c& y& K
  5. {" T2 c) _( G! S4 z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");* e# H# @; i5 ~; H
  7.    
    , Y+ J% {9 }" ^2 D" M
  8.     // Выгрузка квестов.
    * L  E4 s; d0 {, o2 H
  9.     for (Quest quest : _quests.values()). }  v$ W3 y& N. o$ I  E6 {9 n$ @
  10.     {6 L9 e3 S, a/ H% C
  11.         if (quest != null)% u: B' J, f& O3 K+ m
  12.         {
    & v$ c- H0 C0 e7 K
  13.             quest.unload(false);
    * x3 e- |+ e* u- _
  14.         }
    4 R6 ], A4 ^: h& K8 p
  15.     }" c, W7 O  r  C  `* U8 X
  16.     _quests.clear();3 Z9 Y# m5 Q9 N2 K. k  M1 E  X
  17.     // Выгрузка скриптов.6 f& J, K# ^# G& m2 P' N; v  X: _
  18.     for (Quest script : _scripts.values())2 z2 X4 D' B$ C
  19.     {% d" w1 Y- o: D. r8 q  G
  20.         if (script != null)
      W: {" }' _7 d4 `& `2 C
  21.         {- T7 S7 ~' U( \7 y$ c) _
  22.             script.unload(false);$ o9 }, D1 a( h, A0 U
  23.         }
    4 j4 ]- g5 B/ O" m8 G5 h+ w
  24.     }, m9 Y6 i( p; M9 T
  25.     _scripts.clear();0 _( k- P2 Q; O  a. f
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    9 _7 l# \% V! d& |) g: C0 r6 @0 Q
" z; W: [1 g4 y2 i( \0 K0 v
Метод report()
/ _$ u' c8 A; W) a& B9 a1 x2 }7 C5 k9 y9 m; A- R1 s. V
  1. /**$ m% }; \9 C; Z) C) o
  2. * Логирует количество загруженных квестов и скриптов.
    : Q2 L" x0 p9 V3 f- d7 t2 p
  3. */- Q% }/ }  I! V1 E  ]! A( v
  4. public void report()
    - [, h$ w8 `) e: w1 y, H
  5. {$ |, ?0 ~! a: O0 Y& \& e
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! T' N, C6 X/ Q: J  j
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");2 h9 O4 p7 S2 v) {$ m
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.+ S6 ~4 _0 ?, Q* F8 `" I. H
+ F; S1 q) ?6 Z
Метод getQuest(String name)# Q- z( m2 R. K) p# J  ]+ C' ~  a

3 V1 `; t& Z$ G3 D. e
  1. /**
    . P1 b6 f9 T# c# K5 w0 k1 D
  2. * Получает квест по имени.+ u1 y8 J& M3 a2 N
  3. * @param name имя квеста
    " X0 y) M" M4 S4 A1 K
  4. * @return квест9 v1 b7 D  [" T/ w: |
  5. */6 W; D% q# A" F8 N- _
  6. public Quest getQuest(String name)
    , y  {3 U9 P$ v
  7. {
    6 q; L2 G: ~# P/ O7 ~
  8.     if (_quests.containsKey(name))
    " n/ y, j. Y) E
  9.     {. x2 ?" @# ~3 l$ K+ `, p& Q6 p5 ~
  10.         return _quests.get(name);* v/ x  S% T1 N+ c* A/ ~4 P( X
  11.     }& x" P  i* C- ]* X' J$ `' |
  12.     return _scripts.get(name);* O& O6 i- V: _4 w8 C- ]
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.8 ~; [7 o4 {. }

0 M9 q; p/ q0 s, }8 s" {2 @! hМетод getQuest(int questId)
! |- O2 ?& Y# T. y8 a5 y" a* G
, h7 ^+ U  y1 T
  1. /**6 c/ f9 ~% Z3 S: k4 e! B! E
  2. * Получает квест по ID.
    - i/ M  h1 f  j1 w0 i" \
  3. * @param questId ID квеста
    3 y/ {! d$ Y$ n7 `8 U, Q# h
  4. * @return квест, если найден, {@code null} в противном случае& ]( q8 S+ c  S" j) W
  5. */* E' q5 K' J. W9 t, q# e: B
  6. public Quest getQuest(int questId)# _9 ]' a& d/ o- q" g( I% g$ Y0 J0 n
  7. {9 f: G/ f( O5 P$ L: p
  8.     for (Quest q : _quests.values())
    / U5 y/ E* V: A
  9.     {- |) G  Z7 W! c, I6 X- d
  10.         if (q.getId() == questId)
    ( a8 d* W" ^$ m5 K% }  R
  11.         {" t' K8 z! G6 S
  12.             return q;
    ! n1 K. r$ C' l# Y6 h
  13.         }
    " a5 c8 G5 K+ E/ v/ s8 `: B3 m. T
  14.     }
    . a; i( H& n1 Q9 @! b- G0 I
  15.     return null;3 _* P' D: d  G
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    5 H7 [- @' R* j5 I0 B7 L2 O+ }9 V$ U
. ?% A$ h: {3 D2 O
Метод addQuest(Quest quest)6 K# M) ~2 A# F

; W, m. Y6 m& i# P* V
  1. /**
    5 D2 z: }# s9 u9 ^% U
  2. * Добавляет новый квест.7 C+ y/ {: r$ v# B+ y
  3. * @param quest квест для добавления. r8 {9 |3 J+ l
  4. */
    6 l9 O/ p. j* v9 r( R8 q
  5. public void addQuest(Quest quest)
    & ]7 x  u, O9 Z
  6. {
    ( F3 S$ @' V) }$ L, C+ \+ n
  7.     if (quest == null): w- a6 T. k) ^/ S5 j
  8.     {" q% R# a' Y9 u5 S
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");9 R8 l  Z. ^7 \; z  u) M
  10.     }
    " Y1 J! `) z3 Q+ b) y
  11.    
    4 R$ c3 J2 n' M) W! M
  12.     final Quest old = _quests.put(quest.getName(), quest);
    0 f! z% j1 ~5 q# h5 `2 E/ S
  13.     if (old != null)) w% T. F6 R) ?  e
  14.     {* h; v' P/ h& t8 `4 s& r6 @% o
  15.         old.unload();7 l( K- D; S# e8 Z# A; S+ ?
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
      J3 n( s5 k* H; }2 ]7 I
  17.     }
    3 _- l2 C% F* l7 m5 {  Q7 Z
  18.    
    % r+ I1 A; T+ ^: Y) w% O
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    5 r( p& h, D5 o
  20.     {" }+ P/ o( J# B1 ^2 Y$ U0 o; W
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    3 }( S  W6 b  T: v$ {* i
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");. }; J* p8 _- O1 P! X  {0 s
  23.     }
    / |: V; }5 P" R# S
  24. }" c  b/ k- r% b
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.5 C) E. r9 O* a+ X$ _2 A$ s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
- `( S3 K$ U5 L7 K+ z# T; t/ ^
1 v/ F9 ]4 n. F9 W6 \+ ?
( x' c3 ?: O, D) w) U- y2 P0 N- V( S% i7 y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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