Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! j: {' V# z% w: q; t

" z' o  J6 p; G) v5 ~* xРазбор файла QuestManager.java3 g" Z& ?7 A# E7 R

+ |2 f' S7 F+ y/ I; V/ e& _/ tЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., ]& t2 [9 p) P1 s" \
Основные элементы
) |# H2 E  V0 p
  • Лицензия
    / b) K9 h3 q5 e2 I7 d$ I6 m
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: m" I, O  g* V1 ]( u  {: x
  • Импорты! G" e6 g6 D0 }
7 h7 n' k" W$ q/ ]: H+ g
QuestManager.java — управление квестами и скриптами.3 Q# L( a% i/ g: n/ {
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
" o1 l6 P4 [0 F% Z4 z( n
. o! C3 ]* x  T& z. ?% W
! k6 V9 s. e' M! F/ Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
6 G/ A! [7 V# }2 n! f1. Лицензионное соглашение
1 W* ]' M0 ~% U. o8 n, Q" q
  1. /** l+ n3 ~4 Y5 S: Q5 b
  2. * Этот файл является частью проекта L2J Mobius.3 T9 {, F  A! l6 }& m
  3. * ! D( c. p* @6 W5 q, V$ R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять' ^  |% r7 x* V! z' z$ c' R
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    5 r. X' W. h" r  a% R  Y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    5 g7 i7 l; {- |/ [0 J9 F2 h
  7. *
    3 T! R# O; o7 P
  8. * Эта программа распространяется в надежде, что она будет полезной,1 D9 E9 G5 ], v( O, x" K8 y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    1 y7 U3 W7 y& t+ `  v
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    / w7 L2 @# r- f" [4 G
  11. * См. GNU General Public License для получения более подробной информации.
    % p" D! D. M- ^- l* W/ Y4 c
  12. *
    6 c- H5 }+ U% c  u- u' d  m6 F
  13. * Вы должны были получить копию GNU General Public License
    0 t1 N8 `1 e$ B) y1 F0 M7 S* `
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    / j5 l6 r5 [4 O' I0 v  X  v
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.1 T9 a& C3 k& X' z" A

  S& h8 `$ u! W+ h
' d8 O6 Y- s" L5 N2. Импортируемые библиотеки
8 ^4 V" v# P/ E9 q; ^4 W1 n# f0 G5 [
$ Y+ z7 R( x7 q1 f& D
  1. package org.l2jmobius.gameserver.instancemanager;3 o3 f5 Y) Q: j

  2. / U9 E% t1 L# @3 {4 j1 p4 |) \4 ?
  3. import java.util.Map;
    6 S, V. C5 T- l) s2 F
  4. import java.util.concurrent.ConcurrentHashMap;
    9 S" Z3 b% s. O. d/ o! L3 J' m
  5. import java.util.logging.Level;7 _8 p- w7 P, Q$ N* r
  6. import java.util.logging.Logger;; U" ]: X0 H0 m- ?, S  s# v
  7. # N  @1 B% K* h  c& F( o) a
  8. import org.l2jmobius.Config;
    7 y  V: ?/ D3 f- j( l) a
  9. import org.l2jmobius.commons.util.CommonUtil;
    : ~; J) x0 Q7 Y0 F$ Q3 |5 g
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    * C1 \. O$ J2 A; `
  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 — менеджер для работы с игровыми скриптами.
. s8 {( D) ]$ `, h
, \' W# }( }2 j3. Описание класса QuestManager
0 y& ~3 t9 z4 n! Y( f9 Z8 V+ |
  1. /**& d; T* f9 x) E
  2. * Менеджер квестов и скриптов.
    8 _9 x9 t4 H! d% I# H7 p
  3. * Автор: Zoey769 s5 U- K0 I6 n5 x$ }1 W: l
  4. */' i& F7 L/ F" t1 D; C9 z! X
  5. public class QuestManager
    * V: D. Z% k0 {8 K7 p4 q9 J
  6. {' L9 Q9 a  m/ F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());& _$ q, c( b6 ~
  8.    
    % u8 X8 l' E( M' {0 S
  9.     /** Карта, содержащая все квесты. */
    , V* A- e# p: D
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 Y1 X/ ^! n6 z* v* Y
  11.     /** Карта, содержащая все скрипты. */
    - [/ `  f0 }7 B; q0 f; o) s. Q9 K
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    7 e3 S- F4 x4 @/ i; r  B: y$ c
  13.    
    1 p% Y: v( P3 V. t
  14.     protected QuestManager()
    . _( C- H/ {7 Q' ]1 ^9 N! k  M
  15.     {
    : b( C- P1 Y2 J; K6 n
  16.     }! X- u. N2 d0 J6 \
  17. }
Скопировать код
4. Методы( F5 w* [, L: l+ J& r! u- Y1 g9 ?# M2 ^
Метод reload(String questFolder). t; u2 n. s( x  O& j8 P2 y# ~2 C
  1. public boolean reload(String questFolder)- u; k& Y6 N3 V* C5 L
  2. {6 g+ ^7 J. p4 f) F; M
  3.     final Quest q = getQuest(questFolder);
    . i: f5 ]; ]. d8 Y  u
  4.     if (q == null)
      n9 ?8 O* [/ _: N/ D
  5.     {
    9 E2 A( {3 a2 W% u" l6 _
  6.         return false;8 y  W% s& e3 w" ?/ c5 Z. m& y: j
  7.     }
    / k# g3 q1 a4 O* J! ?* y, t. x
  8.     return q.reload();
    6 R( p0 \) J3 m; p0 ^
  9. }
Скопировать код
! B; \: n1 ]$ ^6 w2 v

$ X+ w$ x# J) ?' f% |Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 B1 R8 W/ C+ x. k; W* \
Метод reload(int questId)
9 ^8 w/ k) A  G3 }
# w8 X4 @9 y3 j8 t/ m
  1. /**
    . B* m" `# [, C5 U
  2. * Перезагружает квест по ID.
      w1 U) {# u# u4 y- \' R8 y; ~( k
  3. * @param questId ID квеста для перезагрузки
    # {- l2 V$ x& z- c; d4 P! N
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае1 }) a7 O3 l4 U% t* B. @
  5. */
    / d9 v! O0 \( L: \- r
  6. public boolean reload(int questId)0 m& t. g, o8 b. P8 b# a2 P+ z
  7. {
    - C8 |& [7 A8 n+ q& e; Z
  8.     final Quest q = getQuest(questId);5 e5 D4 P- P1 M2 T  M9 S5 z/ }
  9.     if (q == null)% a& `* @% S) F0 C
  10.     {
    ) W3 O6 p, M$ W
  11.         return false;4 b& f# I1 w4 X
  12.     }% Y3 i% V+ x) L  `0 a# r
  13.     return q.reload();/ e' K( h, H, s4 ]$ M  A
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.3 p: X; Z8 y) P
7 D- W2 S8 w3 K3 H- S
Метод reloadAllScripts()
" D7 j' K4 ^4 W* X" b. o9 A1 j* o  P9 @6 w; d3 [9 _) s4 |7 s# f
  1. /**
    5 ?+ q. }, U  |/ E
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    8 t8 k7 g9 ]8 V" _6 G( [& X
  3. */
    6 X/ P8 y* @* y/ x. e& \# l
  4. public void reloadAllScripts()
    # e- y) y5 p" u/ R3 Q, p
  5. {3 W/ T- m) b9 Q' S3 h* f
  6.     unloadAllScripts();6 T' }8 t$ T4 X5 X; `' I; M
  7.     4 @/ M. i4 ^# f, \
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");/ Z: z( T/ ?. @8 x& I% W# b2 a; Q* o' s
  9.     try
    : {  r9 R9 ]/ `4 _
  10.     {
    % q0 N% c) v8 Z. X( T" }
  11.         ScriptEngineManager.getInstance().executeScriptList();7 i4 q( X1 M' d) m/ z8 N2 i
  12.     }
    ' g) A! g: Z' {# b2 a
  13.     catch (Exception e)/ Q6 x* F& b. s  F
  14.     {  S( B' N0 H; I3 _* ?
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    : }5 e6 z( M; n) W/ s+ W( Y
  16.     }
    5 E$ [9 s7 L) D& ~3 W
  17.     / r5 l' G, X4 j
  18.     getInstance().report();3 Z8 r" A$ d+ ^% R1 N3 @
  19. }
Скопировать код
Метод unloadAllScripts()1 e+ r5 e; c+ t2 g! M

8 W! h( M  g# f" s0 N
  1. /**
    $ v9 ^0 W0 T. L
  2. * Выгружает все квесты и скрипты.
    - o. P3 U9 ~  s/ z3 {1 [6 N- p
  3. */
    3 r- W0 P# a4 Y0 J, K6 `5 ]9 ~
  4. public void unloadAllScripts()
    " \# h7 a2 W; d9 N" e) D/ ~
  5. {. n2 M8 U" k" n: \3 \
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");( t) h3 B% v3 s& ]$ _8 }
  7.    
    ; I, t, }8 h+ U) K4 f
  8.     // Выгрузка квестов.
    3 y& Z5 Z+ [* {6 R
  9.     for (Quest quest : _quests.values())! I7 H  m4 b5 M0 C
  10.     {
    4 U! ]( o1 I' W
  11.         if (quest != null). p' j/ f* U: ]( _, j& M3 [- h
  12.         {8 m8 p& }- j/ u" V9 R( W% D" Q
  13.             quest.unload(false);
    ! G: v/ e4 f0 u: M* |/ b
  14.         }" F$ s5 S: B5 G+ w7 B4 ?
  15.     }& f* F) K; M3 ^( V8 ~
  16.     _quests.clear();
    ' I6 W0 M/ w2 m7 z
  17.     // Выгрузка скриптов.
    & ~2 T$ n% V2 r6 O
  18.     for (Quest script : _scripts.values())
    " D( K' q5 A0 F. k6 B
  19.     {
    3 O$ I5 ?) p+ Q2 c, A% \! {
  20.         if (script != null)/ }9 t# M( Q4 i4 Z/ C( F
  21.         {% a+ h+ J, N  N4 t# S8 U
  22.             script.unload(false);
    2 A" v+ m: p6 W
  23.         }
    ' S0 q# f7 n% z5 B& r8 G$ O& O9 G
  24.     }9 @7 v4 c8 ~" ?/ B- m' x& t7 j# p
  25.     _scripts.clear();! i; B: r5 V2 F: b: R
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.  z& `/ y+ M5 t" f

0 F" s0 d0 k: i. y, h6 t8 `: XМетод report()
8 @0 O4 }" h& D4 A
+ A) z2 f3 J. d4 x6 K! g
  1. /**
    0 s) A3 a. z% P* D+ \# C! d) F
  2. * Логирует количество загруженных квестов и скриптов.# C1 l/ p/ C& ]3 v* T+ h
  3. */
    - q# k2 R1 W) P, A# v$ w
  4. public void report(): m5 K, h% n. B8 n5 m6 m. d
  5. {4 k& m( W, E- H, ^5 ]: c
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' |5 K" q+ H; m
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    : a- m% r" O& e3 [
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." E$ h1 _! Y" |" p

# ], Y2 a! ?$ ?3 y( O; ^' y3 s5 `Метод getQuest(String name)/ y9 ]: M% k- U+ z: G" b

! p# E) x2 z7 k' l4 p) p
  1. /**
    7 o( v8 k! J  ]$ Y6 ~8 b# X
  2. * Получает квест по имени.9 |/ F5 v  i& x8 _; ~/ a$ `
  3. * @param name имя квеста" c  l: ~3 K7 B
  4. * @return квест* {8 K2 s- }9 B" F; T
  5. */9 I: Z4 V6 `! a" y6 }
  6. public Quest getQuest(String name)
    - q9 `  W$ N% j; F; H8 ]
  7. {7 p8 {+ p% q" _0 n7 v: E$ ]& W( o
  8.     if (_quests.containsKey(name))% o6 R2 i& E) O
  9.     {, g7 \# y% z# ]
  10.         return _quests.get(name);: H* L! O+ G; G6 J; v
  11.     }. ?4 c2 A3 D( N$ ^4 e* Z
  12.     return _scripts.get(name);: W+ H: O* v- V7 q
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    * m, M9 L1 L4 R9 }- Y+ Z" L) I

/ O2 Y7 M( E9 P- h% b2 _. VМетод getQuest(int questId)
8 n" b. z; Z$ v- H
2 Z) \$ T7 ]9 S0 \  }7 \0 b: ]" R
  1. /**
    8 {9 O/ W' i. p, Z! t! u* i
  2. * Получает квест по ID.
    ) r! y' ~: h9 K8 h  F
  3. * @param questId ID квеста2 f! R& W) n0 x
  4. * @return квест, если найден, {@code null} в противном случае
    ( b' p' G, C! f; a
  5. */- R* B* q: m/ z# o
  6. public Quest getQuest(int questId)
    0 _) U' b$ s. P/ y7 T* y; U
  7. {/ G! h8 \' t) g8 a* A- I
  8.     for (Quest q : _quests.values())
    ' c2 K' _& |( R1 N1 z5 {
  9.     {9 s% {) k3 f* R
  10.         if (q.getId() == questId)6 S9 A% p& e1 C. h( s
  11.         {. W. [/ C- D" o; s
  12.             return q;
    ; a, a( u; B$ h( I4 Y2 G1 K
  13.         }7 o( P* O+ V/ R, p+ `" N( o: l
  14.     }
    9 @! _0 \2 g7 o7 S% \! |/ ]1 j) X
  15.     return null;$ O( d) z- e$ x1 Y4 ~# a
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.9 S0 g  r( G' U# L$ j: m
7 D7 d$ d$ s0 w& h. v
Метод addQuest(Quest quest)7 G. |. x9 V6 U1 w
$ O: D8 N) @0 ^3 r
  1. /**
    # f. m! h- o+ W; m' Q* W! Q
  2. * Добавляет новый квест.
    8 {! R+ T# p3 J
  3. * @param quest квест для добавления9 I9 Y& H9 {$ w7 X# D9 j$ D- t
  4. */
    # j( G0 h6 e- r" Z$ E" `. z2 _
  5. public void addQuest(Quest quest): G* r1 P% S1 w; b1 w3 |1 Q
  6. {& y5 R# E4 m/ J  k+ a
  7.     if (quest == null)
    4 W) [  F3 J0 v% V7 ?' w
  8.     {8 ]& _& s* E2 x4 S3 o7 h9 h- d
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    5 X4 R$ X' L; R- S4 I7 ^8 N
  10.     }
    0 e+ E9 J& a- d, y: W+ Q% L% v
  11.     6 `4 F1 b) l# l' X, C1 e
  12.     final Quest old = _quests.put(quest.getName(), quest);5 M3 J6 _) f  G# d" y2 Q2 X
  13.     if (old != null)8 L2 Y" H1 C2 H
  14.     {
    9 W0 C% b& @* e. M8 H
  15.         old.unload();
    & \; X' Z# D; N- l$ V  \% c
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 R  A% k, V# D2 q
  17.     }. E. R. w$ p$ D
  18.    
    . V1 F$ k: l2 j. |, X; X2 ]! _
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    2 K! I5 m, g9 A6 j
  20.     {
    5 ?% `1 s( E1 Y! B
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    " n! t" Q9 a/ s+ m  e
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");4 J% M7 z3 F* ?% R. d
  23.     }8 B$ ]' z9 w* c! V; K' |6 ^3 b
  24. }
    1 Q* p  \; X  j, u4 X0 I; X
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 j( R) e! a  T1 U
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
6 M) u. t5 o1 i4 f$ y
# ^; Y  s. _! }# @: F. H: ?+ i, |2 K8 \) y' C

! v9 Z" G; Z9 D- N* s
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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