Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ Y! g2 ~9 B& x
, i9 L* ~# c  c+ O! x
Разбор файла QuestManager.java
8 y# n1 X+ L' m6 @" X
/ I* J' n: w) {8 w$ W" H2 t8 ?7 jЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
6 @5 R/ j  w# e) X: ZОсновные элементы
9 ^. o" W% G+ v- ^. D& _: f5 t
  • Лицензия
    / R8 u2 z4 f5 \1 r
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* x/ A' R5 I" x% h
  • Импорты' s2 p' q( h4 w% n( O" q: t

# s+ K( Z0 e2 y& L5 ^! A' E4 nQuestManager.java — управление квестами и скриптами.  f. x  m5 o+ i* G
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\7 ]! z3 i% L! a: s0 D% E* I" N. _
& i9 L! o2 Y( B  y% {* ]

# x0 S5 N5 B3 [& P  L( M! yДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 g7 m! P: r, A) J1. Лицензионное соглашение
1 }6 P8 K" s! O% M! L/ f
  1. /*1 u1 O/ X7 o! ~# C$ h/ u
  2. * Этот файл является частью проекта L2J Mobius.
    : H* s, U. ?& I* d: k# O, z( h
  3. * / n/ F$ n4 f5 M
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять0 W" g$ \+ v+ w7 e0 r/ Q3 _
  5. * её в соответствии с условиями GNU General Public License, опубликованной  V+ s" n  c4 \. ~1 ^  n# I+ H
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.9 t; }; T) K1 b# L
  7. * 9 {/ p9 `  f% ^5 l
  8. * Эта программа распространяется в надежде, что она будет полезной," ?( P+ d# Y. w" _7 R. G. T6 p
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    9 r' ~5 Y' f8 u' N7 d9 x
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.- q4 H3 T. H) @! A$ w, O
  11. * См. GNU General Public License для получения более подробной информации.) l4 F. _* ]2 O9 a2 f$ x
  12. * " w$ j: A& j1 g
  13. * Вы должны были получить копию GNU General Public License
    $ l0 c) J3 c* i5 D  O4 L' ?7 c
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 c5 P- u# I2 n1 [; `$ n
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.+ {8 ?: G+ p  g, K8 G' p; f

' H; X! b+ o* I4 I8 h- v0 U- ]$ y/ [, ?) [3 B4 h9 G& O+ E% T
2. Импортируемые библиотеки% b( F! T" T% E5 H4 ^

+ T  e" T2 W- T) |
  1. package org.l2jmobius.gameserver.instancemanager;+ g% C; L% a% p6 Q0 B

  2. 7 d* p' A0 T+ \$ a+ G4 i  y
  3. import java.util.Map;/ r$ V* r( C* N$ k8 K  e8 `
  4. import java.util.concurrent.ConcurrentHashMap;
    6 j) x8 t: u7 l1 D
  5. import java.util.logging.Level;
    9 F# a9 ~$ t3 f$ i
  6. import java.util.logging.Logger;
    " R" |% ^' M2 J, x' e, h
  7. 7 d, l7 ?: h+ x" k
  8. import org.l2jmobius.Config;
    ; d: C; R4 a0 H. o; s2 P
  9. import org.l2jmobius.commons.util.CommonUtil;! X5 Q1 Y+ w3 p# J! R
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ' Q' }$ t4 I; P- G
  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 — менеджер для работы с игровыми скриптами.
3 n5 ^7 X3 Y0 e
* h' U) s( A: D+ }# J' T* ]' Z3. Описание класса QuestManager9 m& l. |6 T. q% h
  1. /**
    & _, g$ u, a4 W7 a3 a$ K) f! d
  2. * Менеджер квестов и скриптов.
    6 u( b: S4 X6 g7 ?9 p
  3. * Автор: Zoey76* M, u1 b7 j, F7 b* K
  4. */- \1 j- G2 N+ W: J2 W3 E
  5. public class QuestManager3 i- L; k( p% Q( z- b1 F
  6. {. @# R1 \6 m4 C- j7 N9 j2 S
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());+ a6 y) n- W& l' E8 p3 ~( n. J
  8.     3 U' |6 m% e# n0 H/ f5 c5 i
  9.     /** Карта, содержащая все квесты. */, F9 S4 K; \" N
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! E9 v& s  u& ~3 w; L! q. K
  11.     /** Карта, содержащая все скрипты. */+ f1 \) Q- V$ R1 @
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 H& d. u5 b4 I& s5 y. i7 V7 f4 T
  13.    
    1 |3 A! a7 x1 ^' x1 E
  14.     protected QuestManager()
    ; ~5 i/ e" J8 N9 U1 l% |
  15.     {# \' W: U/ e* A  D. C1 M5 u7 N
  16.     }! M* i( x, H/ \1 b7 v/ s
  17. }
Скопировать код
4. Методы/ u: @# x* b. |. s
Метод reload(String questFolder)# F& V' ~/ x1 k
  1. public boolean reload(String questFolder)
    * Y2 V8 _& z7 f
  2. {
    ) ~" Z8 M/ I4 j4 r1 B2 ~/ O
  3.     final Quest q = getQuest(questFolder);7 t) ?4 S$ G' u7 B2 L2 c1 }3 z7 Y
  4.     if (q == null)) ]9 Q" `: V7 g" C
  5.     {( c; j7 y; c2 W5 L& B7 Q& K; o
  6.         return false;
    8 L0 Q. u- p" `7 U. Y& z, B
  7.     }
    5 B+ k* Z, \0 u
  8.     return q.reload();
    & d- p  I& T0 Y5 t
  9. }
Скопировать код
5 U% ?5 g6 w1 m1 g

% N* J* G( J, X- C" L4 i- ^; r# XМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
9 d: c* s2 R$ |+ pМетод reload(int questId)
  Y3 m$ s  C7 z- z( k9 x5 K# q- Q% t. P2 ^5 h$ T
  1. /**3 B6 ^$ u; [8 }' F: C4 C( g( j' p
  2. * Перезагружает квест по ID.
    . Y" i0 z% ?( w4 r2 ^
  3. * @param questId ID квеста для перезагрузки
    2 Y6 o. V$ m- o- R
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    8 Y* I2 K: N2 V; u( I/ @" M" M
  5. */7 d; E/ d$ A( Z. n% \5 W' R
  6. public boolean reload(int questId)1 x6 L. D( w1 O: I' ~1 S6 N
  7. {9 c% M! ]- H: l% F- [+ U2 H
  8.     final Quest q = getQuest(questId);+ T* f5 v- }) n+ Q
  9.     if (q == null)
    1 ]2 U  L1 l" o$ O
  10.     {
    ; _4 n6 ^; c' K' g3 e! A, U+ G& {3 B
  11.         return false;6 O- B. Q3 \2 I& g
  12.     }
    1 X( h( R! ]: a8 Q- w, c( I8 i2 X
  13.     return q.reload();
    . q  w+ |; ^# r3 `$ c! D
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    % G* T: t# K$ H  k, c$ J0 h: ^

" E& S7 T, g0 o( ?- n8 e6 y- B+ qМетод reloadAllScripts()! Z, Q1 c/ Y1 ^2 K5 ~5 A
( B" D6 {& i: W8 q2 f) M  y
  1. /**
    : m" F+ x* V8 |& T: f
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.! F- _0 @% X, i) J; s' k
  3. */
    8 h; C" v% y/ z! N+ l4 H) }
  4. public void reloadAllScripts()5 X& a. V8 ^" ]$ _* t/ I4 d
  5. {
    ( g, e4 W9 e; @/ ], G$ g
  6.     unloadAllScripts();2 P8 m. h. h+ G" G4 w
  7.     / Z' }2 F& Q' d4 N& b% K
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");9 R: k& Z9 f: e8 q. S6 K
  9.     try! X6 W/ U: j+ \8 r1 w; D
  10.     {
    ; i9 }6 F1 F1 e! L1 O3 S& a3 G3 A
  11.         ScriptEngineManager.getInstance().executeScriptList();
    " }! |' U9 d3 p& ?
  12.     }& X6 O4 u9 {( z
  13.     catch (Exception e). j# c9 a4 S% u
  14.     {! b# Q& J% N1 i1 |5 F' W
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 U# I4 w* E: u( G, d: h3 {
  16.     }
    % J0 y# V  }' S. I7 G/ P
  17.     " @( ^2 G- ~  \' U: @
  18.     getInstance().report();
    ; s7 i8 J  h! C4 A# d" }! T
  19. }
Скопировать код
Метод unloadAllScripts()2 t2 {( C2 D; Y7 g7 s# z5 L: ^5 m
2 E3 `' c5 v" O6 G3 L& h4 ?0 ?
  1. /**
    # k# Z! }# ]) ?* a4 {1 ~4 ]
  2. * Выгружает все квесты и скрипты.! u: n' X& f$ F- b+ [2 K
  3. */
    ; F$ T; e5 D6 k
  4. public void unloadAllScripts()1 g! H' s; n; J. V1 l8 y: N( V1 P
  5. {  T$ W* L( \% ^, G
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ) }: E' I3 Y' ]' _
  7.    
    3 {5 c% U! G6 q! }* y6 [
  8.     // Выгрузка квестов.5 e$ n. S) a6 ?7 q
  9.     for (Quest quest : _quests.values())
    3 T8 ^& R" N. b
  10.     {$ G, _8 f4 x5 F
  11.         if (quest != null)* f* _9 e9 l& U/ Z1 E+ D! S) ?
  12.         {
    + e$ D9 C4 U- H# q8 M% L' A+ X/ E: A) I
  13.             quest.unload(false);! y; N  \" X7 c) N( u' [
  14.         }
    , O* h: \' P. |2 |+ G' W0 _7 Z
  15.     }
    7 G% v( W. q, v0 G$ t- |; X
  16.     _quests.clear();
    ) G& d- W0 ^3 C! a
  17.     // Выгрузка скриптов.3 Y2 p) S6 U! M2 |3 E* T
  18.     for (Quest script : _scripts.values())2 _4 g+ L8 N  h+ W
  19.     {$ I# t2 F, b9 ]8 `( d
  20.         if (script != null)! @* R- f% f5 l2 K# U
  21.         {/ d2 Y# r# A5 N$ I9 ~& \8 f
  22.             script.unload(false);3 \" J" H+ V; F  q- q
  23.         }0 |% h5 H2 T! S1 l
  24.     }  g3 S3 p& I% ?8 y$ X) E7 C7 k! I
  25.     _scripts.clear();. r  e0 D  W2 z3 }$ h6 ^( S
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.9 n! ~9 G0 `+ c: k/ k+ p! F  C' o9 L
: G* C0 m- q8 n0 F* D# R
Метод report()0 m  {+ {5 G. y; p4 X) t

. P) S3 x  \. v3 W8 q0 F; z- E
  1. /**- \4 G9 J) [% ]9 }: E
  2. * Логирует количество загруженных квестов и скриптов./ h3 c* T" d. Q1 C9 k* G9 m0 G- Q
  3. */
    ; Y9 A- _. M5 _* v, b
  4. public void report()
    6 i; U$ Z# I% H9 `
  5. {
    & B6 k* ]2 K& N* l# E& D% c2 c
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");, b8 f1 M7 [: l5 a9 j
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    8 h) f0 U8 `) k9 i$ x
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.. O- v% h/ i% w1 ~
  y$ }% G2 X( h0 h" k- Y
Метод getQuest(String name)
8 N( O+ d) S! r( d* y$ g& R; A: p% P, W
  1. /**
    8 N1 U9 ]# o8 V* ?$ E' ^  [
  2. * Получает квест по имени.
    - o1 O& n$ R9 Y9 r8 p9 j
  3. * @param name имя квеста
    + l, c* w; t# L6 M' D% Z& M
  4. * @return квест
    3 w3 x+ J& e0 h1 g) x
  5. */
    6 {) Z3 |% \2 s! J* V: f
  6. public Quest getQuest(String name)
    ( I3 ~+ X  v: o7 M
  7. {3 x' S$ v! I" g
  8.     if (_quests.containsKey(name))
    - j' |9 [& ?" s) u# ^  m
  9.     {" z; v1 @6 M( V4 ]- z& ]0 L( r( B
  10.         return _quests.get(name);
    ) k8 A5 m% Z" V0 J5 @9 P! [; f
  11.     }
    4 k1 H$ J8 x' W' @6 ?3 t/ k
  12.     return _scripts.get(name);
    ( L3 V, @. l1 D4 }
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    % a; l' }2 u% l  ~9 t
) H8 Q7 c/ o9 d: n
Метод getQuest(int questId)
/ U: d! l9 s# T) F. @, }; _. f9 C/ f
  1. /**( i$ G- o# i5 d( Y) `/ m' z% p
  2. * Получает квест по ID., x5 J2 D1 [0 W# B8 D
  3. * @param questId ID квеста
    ) g9 ?' ]4 r- j, I
  4. * @return квест, если найден, {@code null} в противном случае8 J& f& f8 S$ @4 t; f
  5. */
    0 X0 Q, s$ n3 L" N, [+ M
  6. public Quest getQuest(int questId)
    5 h/ W& D+ E) v4 |, D: N, }9 L) h
  7. {1 R* ~; }0 W2 t; S' D7 ]. s
  8.     for (Quest q : _quests.values())
    / v3 j, }1 ?8 f0 L+ w) I; J
  9.     {4 B/ ?4 I- V8 y, o
  10.         if (q.getId() == questId)
    " u% t) [  {+ L7 N
  11.         {! Y" f  i% m7 }" Z
  12.             return q;
    7 ~. y3 j2 |5 d6 T  k
  13.         }
    # U  p4 a/ K# m& s: w/ O- b
  14.     }
    ( |0 N- e* {, ^+ D! h
  15.     return null;
    9 h  A" n+ X# T1 q; }% ^, s$ x$ R
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.7 p1 ~+ d' B2 x% k3 P9 @) h
* m" t! L6 H0 [. d: ^& T' V; U( P
Метод addQuest(Quest quest)4 P- T  F1 b1 Z$ U
. D% \' Z- c; W5 F. B
  1. /**
    & t' j5 S0 F0 S) X# P. a" M1 f
  2. * Добавляет новый квест.
    ( O9 U* i. ^4 o4 [2 F( K8 V9 o
  3. * @param quest квест для добавления1 c1 r) l& A4 {8 f. w3 G
  4. */3 i+ X7 g* X$ I3 _
  5. public void addQuest(Quest quest)
    + M% t/ e! O1 Q% r' U' u6 `
  6. {
    3 m! m/ [* I1 P# `
  7.     if (quest == null)4 D9 |  S( x! N& `/ e
  8.     {
    ; k1 G! r# a6 t
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    8 S0 n3 {( I9 B& e4 H0 x  O
  10.     }
    . y; |" Z# ^1 J  j, {
  11.    
    ) n7 b0 S7 }9 F; J
  12.     final Quest old = _quests.put(quest.getName(), quest);
    " |" i9 M! }# n0 ]! ^: _
  13.     if (old != null)" m$ {) t4 N' C4 U# n* _6 F9 K" ~. T" b
  14.     {
    ( j0 X8 j: s  s; A( M% L1 ~
  15.         old.unload();- q5 F7 t& u. U8 j# c( p
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    * a# F# ?0 ]% m- o
  17.     }
    8 C4 Z" T# Q, ]. c) C$ F8 ]
  18.     : G2 [3 R1 x5 G0 N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    * s( @( g( j2 }' H: p0 D0 Q
  20.     {
    , u4 ]: a; |3 ~. O7 F
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();! T4 [5 [5 k" M7 V5 i, \
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    4 H2 V7 E& M4 M' n: `
  23.     }
    ! {1 _. }( I6 R' [/ F8 a
  24. }% z# J7 r* K) K
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера., e8 T2 U. i  s9 w& x7 T/ G) s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. a1 J& h, D: ^: G& B! u4 j/ c
' m1 ~5 U% J7 D' M& H5 b8 m

6 M% C; g% L7 g3 c* E+ Y6 a- ]+ n, O. u; a5 T! O
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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