Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* `; ^/ I( h0 V" [& e' B' I
8 R+ I2 y+ |% ]7 l7 kРазбор файла QuestManager.java0 P6 y8 ?6 A) N$ d0 s. b9 u8 X
& ~4 a* }. R  h6 \' E6 D; }) [6 ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.! r$ A- M4 O0 D5 J
Основные элементы
& B; i: h  _* S  q
  • Лицензия
    % c) v9 m, M2 x/ t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      9 d; E  Y+ w  S; v5 c" E
  • Импорты
    3 u/ u7 S5 r4 e
8 J8 z5 f* D) w+ O4 f1 p0 {/ Y
QuestManager.java — управление квестами и скриптами.
* U) q5 |/ h! g  SПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
. O3 M( l. [- q1 l/ u2 K
/ J8 B2 e! k* j0 @$ K

: {% n2 q9 }/ _7 t( i* O2 IДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 h: A! Z8 K& u1 G0 e/ {1. Лицензионное соглашение
+ G) l5 f2 Q3 y9 K4 }' ^
  1. /*% z$ R/ L. C. ]
  2. * Этот файл является частью проекта L2J Mobius.( ^. U1 W, @$ s5 d
  3. *
    1 ], x; E5 O, z# m+ ~- E
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" [6 w8 \: J3 Q; j: Y% u
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    7 h8 R2 h9 ^) ~: g8 \( S4 E
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    5 i2 M  a$ `" y/ Q" Z2 \; @* n
  7. *
    - w- Q# x, Y$ M0 ^
  8. * Эта программа распространяется в надежде, что она будет полезной,7 |9 ]" W9 U  _4 V, V
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    ! ?5 M4 X8 V! `
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.! L( X! c1 c# R, m8 c( Z0 {
  11. * См. GNU General Public License для получения более подробной информации.7 [( G$ O* E1 d3 f) B2 u
  12. *
    , s" ?! d  s% Q& g4 i0 {! C; ^
  13. * Вы должны были получить копию GNU General Public License# n6 L7 {, ?3 K' p; n5 L- Y+ O
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
      B3 @) Q4 G- R; I4 l7 b4 ]
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
) V8 b  V0 H7 Y4 a4 V
" x& T; m' v1 k, b* E) R4 B8 }+ M2 f. V, x" d% @
2. Импортируемые библиотеки5 m8 y/ `. y, N

' j0 z: @% v* b
  1. package org.l2jmobius.gameserver.instancemanager;
    # I+ i0 c& S$ m0 j1 f

  2. / E6 H( u, e; n4 l7 |/ a9 C
  3. import java.util.Map;
    6 D: v* r0 u& j- Y: g; ]
  4. import java.util.concurrent.ConcurrentHashMap;
    6 t9 |& S' W9 I3 |$ y9 Z2 ^
  5. import java.util.logging.Level;
    6 x# k0 N0 q- S3 [
  6. import java.util.logging.Logger;
    ; Z1 K+ o% z* I! s

  7. 8 Z5 v4 f2 e" }5 [4 K$ Q+ H
  8. import org.l2jmobius.Config;  I* V/ ~& j% G0 m
  9. import org.l2jmobius.commons.util.CommonUtil;+ F" }. P+ f  M, U( T4 `
  10. import org.l2jmobius.gameserver.model.quest.Quest;( [$ I9 H9 k6 N
  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 — менеджер для работы с игровыми скриптами.& i# U- K0 [5 J- F. ^% C4 U

: o4 g% H. x8 p3 y( f: E3. Описание класса QuestManager
* o. m7 Z, d( P  ?8 H! _8 C
  1. /**/ W6 u- \: A8 M5 y9 r
  2. * Менеджер квестов и скриптов.
    2 o5 G6 B+ t: m$ Q3 Q' p2 }9 U1 E
  3. * Автор: Zoey76
    8 {% \2 V  E  I4 {1 V
  4. */% p4 r! w9 f, y; C  M& ~
  5. public class QuestManager/ @& T$ q" n2 A" A6 L( K1 x
  6. {
    $ E6 A& v- o4 L4 i1 b6 B8 o
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    & Y. j) w4 E" D( k. U5 H+ D
  8.    
    : ]- q- |: p0 A% x$ g2 p  G
  9.     /** Карта, содержащая все квесты. */
    ( C5 J5 Y4 x3 Z4 c
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    5 J1 G) v7 _; M3 [- }; e
  11.     /** Карта, содержащая все скрипты. */% Z& c4 `2 S% v4 G
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();2 t4 i0 I, L0 B  h
  13.    
    : c: b) z' q: ?1 K, y  n/ D) z
  14.     protected QuestManager()# u0 B6 X7 H# X9 n2 T  P3 a2 |$ R
  15.     {3 Q( i& p2 H& B3 v* [
  16.     }9 m' \9 [9 S; |9 X
  17. }
Скопировать код
4. Методы( n+ H  @4 J* F$ p2 o
Метод reload(String questFolder). ~1 O; }7 z3 g6 A) t/ T
  1. public boolean reload(String questFolder)
    - H/ e0 R1 T7 a9 Y" |
  2. {
    . e0 N2 U/ f+ [7 Q7 C& P5 b
  3.     final Quest q = getQuest(questFolder);
    ! u0 ?6 i+ ?! w3 X7 w  N
  4.     if (q == null)
    3 f1 S1 ?: Z3 C# A+ N5 k  G
  5.     {
    . \; A6 G( I& q+ ]# H8 d$ ~
  6.         return false;- p7 k1 [& F- A
  7.     }
    % R2 Y8 x  Q3 @' t2 ?0 N# @1 h
  8.     return q.reload();0 i3 `- y+ u1 n+ o( v% [, [
  9. }
Скопировать код

! s# m' ^6 h  ]/ Z% E
- t- c5 ^) g, eМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% W; W: U* O2 D3 ~Метод reload(int questId)
3 x8 N/ v3 H8 I; v# n! q; Y0 Q, E6 V  r* N5 s) D
  1. /**5 M/ p# [. g7 R2 f0 v: T/ q
  2. * Перезагружает квест по ID.
    & S& W- q/ G  F5 t: A( o) q
  3. * @param questId ID квеста для перезагрузки
    ; ?  O" C" Y; ]* p) _, I7 q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    - ~" u( E4 x6 S* n; D6 k
  5. */0 s& O( b! w$ }
  6. public boolean reload(int questId)
    ' ]% A; f! ^" o3 H5 k
  7. {
    9 c( i: h) N- [" R$ C3 T
  8.     final Quest q = getQuest(questId);
    4 ^* H+ Y! s" H3 A+ e7 k# v
  9.     if (q == null)
    4 T% S; J1 ?8 e. }" f
  10.     {
    % ~, C8 \" i" q! _$ a% k1 i- w8 `
  11.         return false;9 G7 n% g6 I" [7 b9 d2 l% C% h% [
  12.     }+ k/ M7 ?, R- s/ W9 h& f5 m* k# Z
  13.     return q.reload();
    8 C. K% U+ M8 C! _* ~( a0 P
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ) w) ^  U" Q6 F
3 ^: ?+ a# i; q& Z
Метод reloadAllScripts()/ U# i$ n0 t+ P8 ^7 s; S: ?
2 D$ p$ P% I! R" W8 V
  1. /**
    7 ]' W5 G$ z/ R, ?7 a0 l$ ]
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.% x9 K* x# G& b1 F9 ^8 m
  3. */! J$ V9 ~1 X0 h
  4. public void reloadAllScripts()8 i9 U0 {, r2 |5 O3 O
  5. {) T! z9 c  `3 F- \! B" G9 I
  6.     unloadAllScripts();
    + b, g$ v/ `' _- [- b8 o
  7.     ) S- [" b; ?  }& ^" u' [9 L
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    1 L- {: w' j" j& k+ ]6 j
  9.     try
    ) u7 r/ r1 ?! M, }
  10.     {
    % T2 O/ P9 f+ r0 G0 ~
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ; B3 j& D. z. }" b/ z
  12.     }# @( b) r4 s" }* y
  13.     catch (Exception e), \& h, X/ A( ]/ G" e- r( {; u
  14.     {. i* r5 n- V9 i& u6 z; l
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);& q9 k! x3 f/ [2 q* [
  16.     }/ M1 ]0 c* W/ }5 ^
  17.    
    $ Z, y- n' q' I6 W$ C# C
  18.     getInstance().report();
      ~. u; p) R7 `. w5 ^, }7 g+ @
  19. }
Скопировать код
Метод unloadAllScripts()
" P) ?1 W7 A2 O& Q
; E- x$ ?) Q5 q0 D  \( @: c
  1. /**
    ; q. b* S& M6 X  b% b8 c
  2. * Выгружает все квесты и скрипты.+ m/ U- m( K' d- R
  3. */
      B- @$ L2 P" f! I
  4. public void unloadAllScripts()
    ( I  o8 ~" _' J. o  W
  5. {% i& o! V! e% x! {5 J, ]
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");1 I* n5 i$ C4 j) x' @1 S
  7.    
    0 b0 u" K- _$ ^8 ?% d. D7 h6 c" z
  8.     // Выгрузка квестов.
    7 w0 l8 r/ ?3 K; {9 X( ~( o% \- Z) i
  9.     for (Quest quest : _quests.values())6 e& j  |( Q6 n
  10.     {0 G6 z% y& z' |9 Z7 @! N, ]
  11.         if (quest != null)
    ) S& c( Q( A( M# S8 T8 \" i5 q/ @
  12.         {' O2 a* m4 b3 b( H
  13.             quest.unload(false);
    ; Q: p! s4 y! u/ b
  14.         }
    - e& B/ r" K( Q( v% l' X
  15.     }
    ; Q$ j7 b9 x; y. r0 M0 x; d
  16.     _quests.clear();6 n6 \4 i5 B' R$ D0 |! K2 h, ^! D
  17.     // Выгрузка скриптов.
    6 C1 x1 g. m" E% J) y% |+ a
  18.     for (Quest script : _scripts.values())- ?, P3 f3 q0 k! R. ^
  19.     {5 r  `8 c* |; H$ @9 k1 Z, u
  20.         if (script != null)3 z) Z, _1 w. F  e
  21.         {8 T; F) A9 s; Q
  22.             script.unload(false);8 X) v6 G$ o+ V* N3 r! [' _
  23.         }" l& A& Q; k# M: N
  24.     }9 c$ J6 W2 G, d: G! F/ O
  25.     _scripts.clear();7 A" n1 ~  h5 ^: {
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.+ G6 O- P. T) [) G
" h* A" `( }$ \; t2 x# J6 Z
Метод report()1 s( R) S( ]6 F9 y% ^0 X* o- G% l

0 X7 A9 h! \( r/ m% x
  1. /**
    ' o0 g1 T; U" @  f3 l$ d
  2. * Логирует количество загруженных квестов и скриптов.
    & m4 c4 _. r' w7 p& }' J: `1 [
  3. */
    , W: X' r6 {  ]3 m6 [8 c
  4. public void report()
    # n8 h# R' R; E
  5. {/ H: Q; R$ e/ g, @
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    + p( c$ B% U! Y* @+ s" l# O7 e3 j
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# Z4 Z" A3 Q0 n
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    * F7 c& _) B9 b8 W& b( }' a1 v

' A2 o/ s! \% d7 cМетод getQuest(String name)
, e7 M0 n9 j! n* t; T6 h7 m& u# }$ |& ?: K% E
  1. /**
    # z8 `' O) U, ^' v) K3 a# i5 M
  2. * Получает квест по имени.
    ! z% C; r2 m# H3 b; I, e4 t. A: W
  3. * @param name имя квеста
    - I$ z" d# m; u. h
  4. * @return квест; M; n1 ^& Z- t7 ]# ~
  5. */; z# a4 H: f" h0 g+ P8 \
  6. public Quest getQuest(String name)4 J9 c) U, Y  X  G  w2 M3 b
  7. {& b( t9 r' R: T) V; @- i9 S
  8.     if (_quests.containsKey(name))* [" |4 G9 F8 O# P+ K0 W
  9.     {
    1 ?& p  {2 v, r9 n3 v, U
  10.         return _quests.get(name);
    ' t( p1 p- a& {& s+ Z; D; ^+ ^' M
  11.     }
    ) g; k  v2 |. Y9 O4 L
  12.     return _scripts.get(name);
    / F/ Q1 x% B, T( y
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    / z+ U2 e- l9 h$ j. z8 w7 o
+ A. c" `9 e  j7 M0 P. P
Метод getQuest(int questId)
# k: Q9 O! P/ w; T9 U$ }% Y. \% ~" g! X6 z& R
  1. /**: q2 z* n& U. M( {9 f+ f& l
  2. * Получает квест по ID.
    $ o0 Y5 v5 D% E8 h9 C* W
  3. * @param questId ID квеста
    $ S3 a  @, D  k% p) n5 q7 _, m
  4. * @return квест, если найден, {@code null} в противном случае1 Y, }5 v2 t! g: |' k
  5. */7 ]5 L' b) K. _% f- s" S& O
  6. public Quest getQuest(int questId)8 J: h6 o5 s! V. T
  7. {
    - a/ h' F9 m6 w' u: _, e7 [
  8.     for (Quest q : _quests.values())
    : H% ]  I+ \+ L: c$ e1 s2 N" k
  9.     {& P# E( U( T) s1 ^
  10.         if (q.getId() == questId)
    1 B: k: O! G1 m" |1 |' O
  11.         {
    # a; k1 n$ s0 G8 c
  12.             return q;
    # R5 p+ r; k& ~
  13.         }9 A; \% y  i$ }8 u2 y4 ]  A
  14.     }
    % X6 Y" k3 f) d7 B( o8 ~
  15.     return null;
    4 L8 @9 e+ r9 [# y# J$ p9 M0 u
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.$ q( P7 M% i, F! g
* n+ y  \$ V+ U1 r. t/ K
Метод addQuest(Quest quest)
7 ?2 o& _% Q! k, M; P
# |/ I6 Q# Z& S* [8 p" a
  1. /**) c- L- R4 B* b$ Z4 l9 N/ S6 o
  2. * Добавляет новый квест.0 K. o/ x9 Q) s1 Y3 y+ _
  3. * @param quest квест для добавления, y' j% M" x! G- L( ]" @' @
  4. */
    % r3 J' M3 e0 Y5 u
  5. public void addQuest(Quest quest)8 l/ P3 Q* D" C8 `
  6. {
    . H) ?5 P1 ^7 B3 d: s! ~
  7.     if (quest == null)
    / g8 u6 ]  t1 j4 I+ K
  8.     {
    1 n4 X4 Y# P) S
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");5 G8 V+ V+ }) S" Y) N+ e
  10.     }/ ]+ G& y+ U# w* a0 q
  11.     : N1 A9 P5 B+ ^: k
  12.     final Quest old = _quests.put(quest.getName(), quest);3 m- b+ N% q9 \# D% O, Z& g
  13.     if (old != null)
    $ L& U, ~/ K+ ~; ^& p
  14.     {
    $ _: _& j! V- i# J
  15.         old.unload();7 o! R/ Z2 T  {7 ]6 V$ S+ `$ X
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# r  v4 V' w! g8 I( W" O3 R! E' x
  17.     }9 P% C7 D  s" I+ t' T4 R- D
  18.    
    + @" f0 S8 O! @) _
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)% @9 A# r4 `  l6 |/ e1 c9 E; |
  20.     {0 D& P3 i1 \& B0 L( a7 [
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();: n! t( t2 r$ K
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
      q# x; p8 b* r. q) W1 G  B. I
  23.     }
    2 ^# [+ U6 s1 i! l4 ]
  24. }6 Y% p+ i$ _7 w
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
9 _* ]$ ~8 [9 R# R& c# f, V5 oЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) w/ @7 f. N- m0 Y
. q+ M. B% U( Y( L% G% f9 O* w# d
! _3 T3 A  }1 r
9 u" u( s- [$ m7 ~, u5 ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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