Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius% ~* }; }) N% e# r3 ^4 A/ r9 T8 N! Y

" y" C. D- g- X  u4 E0 IРазбор файла QuestManager.java
& i' @$ d; F. Q: J, l* u% f  B/ I' c
+ ?7 e7 j1 T6 j! o; o# O2 [4 T6 cЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
' T; b1 ^6 g6 V  cОсновные элементы' ?' r4 [7 D' C# _& j
  • Лицензия
    5 M* c/ c: ?, {0 s( o2 [
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ' w! T# B+ H! ?4 n) t. B
  • Импорты
    6 ~, S! w5 f) q, W% B) ^
( x$ K" V% C* m
QuestManager.java — управление квестами и скриптами.  G- S  N8 x2 w6 ]! a9 ]2 p
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\; f: Y2 C& w" b

  o& q9 M  X+ T: r( H4 }1 E# a2 W
+ a6 ?+ ]% d/ K6 ]! l; S& j
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.6 O5 J( v# [: b% F
1. Лицензионное соглашение
6 k/ L& ?9 L. s* q
  1. /*/ W) h$ N+ V" `- g1 @) O) ~
  2. * Этот файл является частью проекта L2J Mobius., d* `6 f5 J5 B  @( |: v; K
  3. *
    & k- \+ t0 F7 E" L# V! y
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять+ U. ?+ o+ x5 w" K1 N3 w2 y! O
  5. * её в соответствии с условиями GNU General Public License, опубликованной9 v# w" B+ P  ]4 n6 o
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ O  }  r4 g' O5 @; ^
  7. *
    ; I/ M; u" W# n. d, K! x9 \
  8. * Эта программа распространяется в надежде, что она будет полезной,
    - y& x; `7 |, }2 s) d$ V1 A
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' r$ a# F! E0 w2 x" t  d
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.$ Z' \  M* F- m  X
  11. * См. GNU General Public License для получения более подробной информации.
    7 M1 Z5 Z) e' U2 d1 U) g0 p
  12. *
    5 T) w' A- F( `! O) v- c
  13. * Вы должны были получить копию GNU General Public License* X; U- w! ^/ `2 O
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    - F8 U/ ~/ B7 N3 ^; v
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
! `- p3 a' y4 u: F9 R& C( x/ y( ?  [1 ^3 }. y
! D# K5 X/ r# i& [/ w$ Y+ P. I
2. Импортируемые библиотеки
1 D8 P- A0 c0 A* t- t- S$ J: Y# x7 k$ s/ o0 p/ e' p$ N
  1. package org.l2jmobius.gameserver.instancemanager;) z1 E0 W; E, q, c- q* {

  2. $ B# Z" D4 k8 ?' C& K3 O4 E8 m, l( I
  3. import java.util.Map;
    , ~* K: {! T/ L+ E: p$ S
  4. import java.util.concurrent.ConcurrentHashMap;
    - T: x1 Z+ [; b  N4 e2 o
  5. import java.util.logging.Level;0 U' P, m/ Z4 \1 J$ e
  6. import java.util.logging.Logger;
    5 T7 g: X7 l7 R# ~# a% R$ H

  7. * P. }+ o' a7 \% z
  8. import org.l2jmobius.Config;
    ; ]8 m1 o% @1 K% T7 M9 U) @
  9. import org.l2jmobius.commons.util.CommonUtil;
    4 I% v, P2 a9 V/ [4 ~0 F' m
  10. import org.l2jmobius.gameserver.model.quest.Quest;+ A' G; n# U( \+ e
  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 — менеджер для работы с игровыми скриптами.
* n/ T2 \6 ?7 q1 w" A. e( [$ ^: K; X3 M& B
3. Описание класса QuestManager
8 S" C) m, c+ X6 E- ~0 n5 P# t
  1. /**
    9 s3 z& O& |& P3 L" J& v" p
  2. * Менеджер квестов и скриптов." k/ V6 p% p5 w
  3. * Автор: Zoey765 Y, q$ ]( A( {2 C+ D
  4. */, @3 \4 X% P/ z0 ]( r
  5. public class QuestManager# N: L/ e+ j" v) X6 N7 x" j
  6. {
    2 r- C1 ~% m% e. l0 W3 F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());9 S" E% h- b( q
  8.    
    8 L+ e# G; Y" W+ e- t' J9 T
  9.     /** Карта, содержащая все квесты. */1 j. F5 |3 ~' X, b1 z' x
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();" ^. M! _& F2 _1 E& }, x0 g; D
  11.     /** Карта, содержащая все скрипты. */
    ) a9 y/ Q  r8 I" ?1 o$ N
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();- @" W8 W$ ^% P! N
  13.     5 A2 q! l/ _6 ~  \
  14.     protected QuestManager()% N% I* \& c; y+ K& I' ^
  15.     {, f" c$ e1 U( ?6 l8 V9 |: o+ ^- b
  16.     }
    " z7 C  k  y8 j+ M9 ], q
  17. }
Скопировать код
4. Методы: D! j- U' `; D' U7 q7 L4 ~
Метод reload(String questFolder)
# m8 q/ ^" x* |. s4 `4 j7 u
  1. public boolean reload(String questFolder)
    1 F! ^" U6 N' r9 j+ m! C5 X
  2. {* h  F& ~9 r# @5 Y7 |  L
  3.     final Quest q = getQuest(questFolder);# z* y, a. R" Y# q# o
  4.     if (q == null)9 j& ~" L. t; @$ J
  5.     {$ Y' k& T6 g: e2 m
  6.         return false;, W7 P# r2 k; W$ O9 p2 m) O
  7.     }- ?& t6 a# v! h
  8.     return q.reload();
    3 @: \( n: ?& b% G4 t
  9. }
Скопировать код
+ [3 k& `3 ?/ d
( e$ ]4 |6 R: J& Z: K9 W
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
  t- }4 d2 I+ p- sМетод reload(int questId)
6 l+ Z( [3 V+ b9 o' j2 Q) m# w( B! _' }$ u7 J0 l# T6 b# m
  1. /**8 f: e1 t8 o& [
  2. * Перезагружает квест по ID.
    ; a% b# ~5 L: a
  3. * @param questId ID квеста для перезагрузки
    ; `2 U! |. X6 }7 J% {; s& {
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае& Y& k  P# s/ w, i' Z- W; ], H6 p
  5. */, ^. q* C+ v( [4 R, z8 H1 L
  6. public boolean reload(int questId)
    & w0 p- |1 _' ]7 z, P& r( x
  7. {7 @3 t- H7 ~8 g
  8.     final Quest q = getQuest(questId);# E* u" n& c1 Z! v. M8 A$ X7 X( s
  9.     if (q == null)
    , O, @, \1 a: {- k
  10.     {6 M: C$ t6 W2 S4 ~$ V  w5 R' Q6 g
  11.         return false;
    ! w/ n# H# y( n) t+ j" @8 l4 H! ?
  12.     }
    ! ]6 @' p% x2 X( B
  13.     return q.reload();; d! W; D5 C1 ?! W
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.' j9 K3 B  |  ]7 }' Q: U

# b& q" E% Y: N2 ?, NМетод reloadAllScripts()$ b) h- U, a6 ]; S: O# X
7 ?& c) k+ q  l, s$ Z8 N4 C
  1. /**) E" O1 o/ `+ p+ t  t/ S
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    8 p) o6 r4 F6 q5 S. Q
  3. */: t' p* u8 p$ P- o  @
  4. public void reloadAllScripts()
    . a# y4 N8 A3 h1 T
  5. {' g, K9 u2 C% n2 o
  6.     unloadAllScripts();
    & I7 s) L3 G9 g/ l1 Y7 _
  7.    
    6 m0 d- ^+ C6 F5 i5 A6 j' Y4 K
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");# w- |! ]. r3 ~( h" `; j7 k
  9.     try
    . J* T! b+ i% ^; }
  10.     {
    5 X, R+ ], E; o
  11.         ScriptEngineManager.getInstance().executeScriptList();
    + h0 ]. C$ c' ?( [- D* F4 j# b7 h
  12.     }$ g( V8 O- k; x% X/ R  q* @
  13.     catch (Exception e)
    ( I3 n9 |* R' H' l6 [& f( V
  14.     {* [& `5 i8 G. F" }  X
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    8 O& K  K/ m- ?/ j0 j- P( Y
  16.     }1 E7 U% ]6 C/ ]& }! }5 n% o
  17.    
    , p( A1 X- ^; C- k9 H0 [# \
  18.     getInstance().report();, `* ]$ j3 w) Y% }& F6 g: Q/ _
  19. }
Скопировать код
Метод unloadAllScripts()
' f* P, A; L' V' \+ f2 G: u( x1 E% p+ b9 @# }
  1. /**  s0 [  G9 B( y
  2. * Выгружает все квесты и скрипты.
    $ |/ i/ y* p% ?
  3. */8 a: U2 `! q7 n+ B+ S! B, d3 H
  4. public void unloadAllScripts()
    + u  w% c& |3 G5 H7 o$ c
  5. {/ D8 Y5 O' O6 [! P9 z& E5 I
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    8 M% w( ]" D1 D: K  |( k3 w) T3 ^
  7.     . n) ?' E7 B2 b3 D3 ~9 S2 ^
  8.     // Выгрузка квестов.* m0 ^$ p* j; [2 L$ ~% e' |
  9.     for (Quest quest : _quests.values())
    . W; |9 ^" a; i
  10.     {) L  P& n* u- I9 k( W7 i+ h% y0 S% \
  11.         if (quest != null)7 J" h- h/ b3 I% P1 `1 b
  12.         {
    " k$ @1 \- w, O1 J9 B( n, B2 I
  13.             quest.unload(false);) B( a% L3 L8 m( R' r
  14.         }: _" p2 `% Q& L0 p. ~* w/ z$ g
  15.     }: K+ ]5 f% g0 A. Q' D
  16.     _quests.clear();
    0 Y, H& d( }! Z5 x& _# E: y
  17.     // Выгрузка скриптов., C6 B+ z+ H6 ?+ N
  18.     for (Quest script : _scripts.values())+ F9 A4 S% c) n% i
  19.     {
    8 S1 T5 ~' F/ _& x/ H1 f9 B
  20.         if (script != null)
    - J6 A* G4 w  n4 S9 A# Z
  21.         {/ H# H8 y& \+ S) }5 l
  22.             script.unload(false);7 ~( o& m" h8 R* Q& l7 v
  23.         }
    * |- y/ p- Z  ]4 |- p: _/ \
  24.     }. b/ p; _- n; g9 b/ B
  25.     _scripts.clear();
    " x8 n$ M" Y1 M: m  C' s0 R
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts./ |3 E9 q: e: g2 w* b& @8 c; c

, Q, B, g( w* w1 O& V* w! K* L) e4 oМетод report()0 M8 @5 B. N. e

) M; b! J8 [/ Q. k1 R
  1. /**3 m! H+ ?$ n. C7 r# \
  2. * Логирует количество загруженных квестов и скриптов." O$ M4 x& z0 }- ?
  3. */' U4 }! E' @* I: t( ^
  4. public void report()/ Y5 n# ?% L  Q- ?$ K+ p( [
  5. {
    ' Y& G8 m) I) y) I
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    & l3 P& v& T6 X: e8 M; m  D
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ! s, A3 F+ U% [. r
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.& x% r. E4 i$ M+ j

8 ]1 A( m4 g2 ]# h+ R$ w: EМетод getQuest(String name)
" ^6 H" I6 @" [& `9 p. l
. ^) r# S6 E  Y6 k8 ^0 M# ]' y
  1. /**
    ( A# M  e1 d$ x% A  i" N
  2. * Получает квест по имени.
    ( v. K, O2 z) b6 c; `
  3. * @param name имя квеста" M% S( [  D- A8 n8 ~
  4. * @return квест
    3 \$ o4 s2 r+ Q
  5. */
    1 S* v' i. X: B/ D5 H
  6. public Quest getQuest(String name)3 o* Y2 [) R- S$ i
  7. {
    + w& ]( ~, _" @9 u
  8.     if (_quests.containsKey(name))
    * ~2 W! ]# B! X: l  E* d
  9.     {
    . c# ~: j1 c1 r) a8 I
  10.         return _quests.get(name);- @9 ~* R" u1 j% M* n
  11.     }
    1 e- b3 R. w3 ~" Q  m
  12.     return _scripts.get(name);; Q! Y, U3 G8 u! @/ i
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.. N9 A- h, o' a% a

) s% a4 p5 M2 \7 w! D5 _" yМетод getQuest(int questId)
9 e7 i$ P1 V. t4 e
8 s1 `$ z' d6 @: J2 e! X
  1. /**
    * m+ T# d: S1 Q5 P) }
  2. * Получает квест по ID.. ?8 F0 M) y2 O% d& n% l
  3. * @param questId ID квеста1 |4 F3 A) \+ m. ^
  4. * @return квест, если найден, {@code null} в противном случае
    8 Z8 l$ S; ~/ B3 }8 m# f
  5. */
    2 H4 D. A- k4 Q4 P
  6. public Quest getQuest(int questId)
    7 r2 C  e0 `0 y( `( j
  7. {* w5 ?& H. O: Y! l: v
  8.     for (Quest q : _quests.values())
    / A. k, m& [4 _" P4 |
  9.     {8 }" f7 M! L4 J# F
  10.         if (q.getId() == questId)
    1 _8 Z( r! ?  \3 T6 Y  z; z0 G6 k9 m* R
  11.         {/ n) @9 ?4 [* L' m/ c4 J+ T
  12.             return q;
    & {$ ?6 A- m1 \8 m
  13.         }4 w' x3 Q% g7 I, R( |; `
  14.     }; d, x5 d# ~+ d; V( t% z8 k+ P
  15.     return null;
    - k8 u, K' R$ m$ _
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору." H4 _3 C8 o1 |

1 R" k% h* S  p! \Метод addQuest(Quest quest)' y& x6 c" K7 @! Y. Q: H
, H' K4 [% D, F! y9 K
  1. /**
    2 [: I& K4 ?* p  S  a
  2. * Добавляет новый квест.; T3 d# n) E+ O  x* x" o$ I
  3. * @param quest квест для добавления1 Y  C  a: w' y
  4. */
    ( F# p" c8 Y; |/ z' r
  5. public void addQuest(Quest quest)
    7 e, o; A3 y- q, d" L7 c, ~) R) a
  6. {
    + l7 V* y$ m; _) e  c
  7.     if (quest == null)
    0 U- A7 P6 ^6 Z: ^0 T7 ?4 A& F
  8.     {
    + E; c( n6 i+ ?2 }8 g
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    / d( b- B5 J( t  z' a$ V' f4 y$ N
  10.     }- m) U" z" Q1 H0 J  c3 k- ^
  11.    
    , i; O; ~. @5 U& [$ ^6 a( `. ~& y( r
  12.     final Quest old = _quests.put(quest.getName(), quest);+ V+ h% N' O! r' f3 |
  13.     if (old != null), M' O* l5 V" u  o/ Y$ P: Q% {
  14.     {5 h6 h9 {& R, C- b
  15.         old.unload();
    ; U2 A% b& b* z- F% D3 `" e! U
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    6 v  E. O* {+ X. q
  17.     }; ^5 q2 C% ~: x
  18.     . m$ L  W' D, j* A& M! i) b" T: z
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    . r) _3 G+ ^) i% N* H* Z% M$ |
  20.     {
    , B2 ]4 u% O# i/ S! i
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    $ k' w+ W$ R2 t9 ?6 w8 G
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");/ Z6 @. n0 o  R9 t* s' B
  23.     }+ |- R" l" V) g" {8 b' S1 `
  24. }
    8 @9 u5 Y- Y5 o, M8 H9 M
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! u% ^# v4 F% S) e$ k- yЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 a" `3 Z2 p) t

/ ^3 Z0 e+ Z1 A* \: t$ l. Y5 E9 @: `7 i8 ^  M2 t$ V& V

& N" S/ h) r4 l2 [0 j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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