Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius- P* ?' ^+ E6 ?5 {
' _8 [$ X9 [' b1 l$ p1 D
Разбор файла QuestManager.java) b. q8 \) P2 r

. ^5 s$ F  Q- T7 G3 B; Q, BЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.1 b, H- U5 ]' ?
Основные элементы' ]1 e" r7 ^, l( r5 Z
  • Лицензия2 ^' l. U' T& W& }# i  \
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: F$ Z% G0 z1 a& q) F7 Y5 [6 u' }
  • Импорты' x8 H& j% r' w! c0 l8 K
3 _7 \& _7 a/ f0 y: o. h
QuestManager.java — управление квестами и скриптами.
2 I# C" @8 I/ i& ?! P- Q% m6 [Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
/ B" n) h8 Q7 v2 F7 `  f5 s3 Y5 h2 B  l3 B& ]

, e8 q2 y4 Z2 T; g3 c) G& S7 AДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! }: O; t0 l4 I1 v% i* @& u& ^
1. Лицензионное соглашение9 E; v  }) t/ I" ?7 H5 P# w. Z
  1. /*
    6 n! E2 C) J: f$ ]& a$ z* M- ~
  2. * Этот файл является частью проекта L2J Mobius.5 v/ r( h1 u$ l( @6 C* }8 C
  3. * ; @8 O& F6 i, w( j: ^
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять( k) f- A& a" K9 v/ Z. _- K
  5. * её в соответствии с условиями GNU General Public License, опубликованной8 Z2 s9 Z5 F$ r$ ~# y
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ' D  E1 _, K2 O
  7. * * i5 H9 y+ I5 t' w: y; m
  8. * Эта программа распространяется в надежде, что она будет полезной,
    8 u! H" ?& D6 b. U' y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    7 B; g9 L  M8 D1 ~$ Z% q
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    , F$ i- T. l6 l. W
  11. * См. GNU General Public License для получения более подробной информации.. K0 I" ]& q, K8 R
  12. *
    1 l4 h# d' v8 d, @9 x2 h+ {) D
  13. * Вы должны были получить копию GNU General Public License
    / s/ _* b2 e) J, a8 m  Y! l
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
      z( c' g; Y. e& i9 D* x
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3." C! Y' y! y! J2 P3 s& J0 S
7 y8 b6 B. [4 o* m# W
0 e2 W8 T( B* W/ [: j
2. Импортируемые библиотеки
$ \, v( W: r: z; r. D& d
4 T/ O  M0 q9 w$ Y4 l/ f0 K
  1. package org.l2jmobius.gameserver.instancemanager;
    ! f" T# C& z8 P7 p6 C

  2. 1 `/ w5 O  `1 v" w. `
  3. import java.util.Map;, S6 B: E" [' E- |
  4. import java.util.concurrent.ConcurrentHashMap;
    9 p  d. @: x6 W& K
  5. import java.util.logging.Level;  N! ]7 L7 F* N" {6 S
  6. import java.util.logging.Logger;
    - r8 J% b( b" Y+ L0 `0 k" n" Z

  7. " m) u4 v  |% t
  8. import org.l2jmobius.Config;
    7 E. e* q5 I8 X  C5 e
  9. import org.l2jmobius.commons.util.CommonUtil;, a" l, r2 }# ?  w) P8 w& ?/ B
  10. import org.l2jmobius.gameserver.model.quest.Quest;; I, O, {. t3 G( u8 ?
  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 — менеджер для работы с игровыми скриптами.2 a# r4 A: N; u8 ~4 r- a2 Y2 o$ d

4 N5 o& a$ t" i1 _' _3. Описание класса QuestManager
1 j5 g% t7 V0 y2 _# T
  1. /**3 ^& _* v" J6 ]& m1 t" H# Z
  2. * Менеджер квестов и скриптов.
    # w$ _( Y  f6 ?* y
  3. * Автор: Zoey76
    1 }2 h: J0 U6 l# o+ ?& f
  4. */# `! n6 v3 |% G4 [( D9 V: Q! @
  5. public class QuestManager
    ' f  G. N. a- [& |
  6. {# S+ m% p1 A2 |* [
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    8 ]' r3 Y8 d+ g5 J" u! n
  8.    
    " m+ \" m) G9 V8 d4 H
  9.     /** Карта, содержащая все квесты. */
    . b! C- _" U, X/ w
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    $ d9 |) D& f/ v* c* m
  11.     /** Карта, содержащая все скрипты. */# T( v3 q- K: T
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    0 \4 C% ~; g# `8 D
  13.     % ]- W& {3 k0 n3 d, t" ^* u
  14.     protected QuestManager()- j! h) [4 |* H4 N0 m5 l
  15.     {5 a' t+ `4 a+ o3 O
  16.     }
    : v1 N* Y" R" t( V3 ?/ L' _) f
  17. }
Скопировать код
4. Методы
# e, O6 r( W. d% LМетод reload(String questFolder)
. n7 M* W( _+ ?. `. J
  1. public boolean reload(String questFolder)7 ?7 r' M3 }) m( X% I$ b+ U
  2. {' L9 d8 `- k/ ^4 R* ?! ^
  3.     final Quest q = getQuest(questFolder);6 i: t( j2 [$ ]! G3 x( Q6 d5 s' Z, W
  4.     if (q == null)9 @1 V: K6 m& ?1 L2 T
  5.     {: o( Z1 p2 W# x3 q1 f+ @
  6.         return false;7 G* J, }! l! F' r2 f
  7.     }
    , p3 r2 @. `2 L0 Q
  8.     return q.reload();5 r1 r! O$ y  z: U
  9. }
Скопировать код

. k/ P* O0 ]/ E% F, W% a" S& m; v/ d* g* j# {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ }, L5 S" u6 S% D5 ], C8 MМетод reload(int questId)9 e- K" ~8 {% \% _% S5 z
' g! g" l4 `& H! \0 g9 n! g- `: }3 p
  1. /**& U; X( h9 S- s3 q  `
  2. * Перезагружает квест по ID.2 M' u+ q. X! ~0 Z% @  x/ J
  3. * @param questId ID квеста для перезагрузки
    # S( F6 @, k) Z2 P- D& @
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 ]7 J+ Z* R" ^6 l* e
  5. */
    1 O; y3 g  T) s% x
  6. public boolean reload(int questId)
    " a2 M& y! R* f( N- _3 f: j
  7. {
      m1 O! B( ^8 @& D' _, }% {% W. g
  8.     final Quest q = getQuest(questId);8 [( y9 z) z6 l5 l
  9.     if (q == null)
    / l3 C# `  P  O6 @7 I1 T
  10.     {
    # J( d  |! r4 z5 v+ q
  11.         return false;
    ; x6 f8 Z+ P# j* S8 z0 }) w! w
  12.     }
    , n. B1 V% N  @9 q
  13.     return q.reload();% C' r: e8 ]" q3 V+ K! m1 G+ r2 ]
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    # g$ ^; t& ~( q) I& m
2 E1 Q: ~6 l# m/ k0 D, M9 b
Метод reloadAllScripts()
) d# Z0 J) z" @# ~/ i
' S) ~* u( t5 R
  1. /**
    " P9 H1 ?, t: h/ N) P; V
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    , a- H  v! [8 O1 ?
  3. */  K8 _( [' B& }$ v
  4. public void reloadAllScripts()* f) ^* v( Q+ I
  5. {8 C" U  S& d7 I: d' w
  6.     unloadAllScripts();" s3 ^5 r5 k! V, i: B. y
  7.     8 ?& u: R6 @9 ^% a, n
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");9 Y/ _) X. o  l. h, P
  9.     try; C. O1 s4 @: E: a' m+ W% F& X7 t
  10.     {
    $ z% @) j& t, ?6 P9 w
  11.         ScriptEngineManager.getInstance().executeScriptList();1 ?0 @0 P2 L1 e* }5 c
  12.     }
    , O. \7 u  u$ P  |/ V* B
  13.     catch (Exception e)8 e' ]( |* L/ ]/ Q6 G, j: L( }* M. ^
  14.     {
    # f& @, l( S4 `0 b( T
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);& I% I8 l# M: Z/ z, E5 h
  16.     }& Y9 c$ M: Q6 _9 s# ~: g
  17.    
    2 \8 Z- Y1 i/ i% k
  18.     getInstance().report();$ i, g2 Y+ b! X0 U1 Z, z1 H
  19. }
Скопировать код
Метод unloadAllScripts()+ M* v( t* H' \" N: u' t. ^

2 T( D& J& v6 N
  1. /**
    9 Y, O: W* J4 u  [+ |; E; p
  2. * Выгружает все квесты и скрипты.9 [2 L3 D! L' H
  3. */4 c" b0 H# @! [, X
  4. public void unloadAllScripts()
    ' G% ~; O, \* b4 t1 ]: g  Q# R. R
  5. {
    2 ~+ P: C, N: {2 p% S* n. `
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");6 q6 h$ R/ h9 O7 X
  7.     ) a* W  t' M7 [) \9 g" k# W% C
  8.     // Выгрузка квестов.
    # p5 n/ y2 s5 s
  9.     for (Quest quest : _quests.values())
    ; M  k- w) j) n# A8 C& ~  s4 Q6 {- G
  10.     {3 K8 I% v) Z2 Y. }* |5 U
  11.         if (quest != null)
    ) z0 \3 R* B% d, h* |, H& c& m
  12.         {
    0 [9 D' e( O- c/ @
  13.             quest.unload(false);
    * v" K, K% X( X+ `5 U- B
  14.         }) Y; H: \/ {: B" v4 d
  15.     }0 `: h, A! H1 u& g4 t- e
  16.     _quests.clear();
    / O/ c/ l& m) |; ^( V5 M# q
  17.     // Выгрузка скриптов.
    - J6 z0 k( K0 P3 C) V8 I
  18.     for (Quest script : _scripts.values())+ d$ t7 R+ x* X# y
  19.     {6 C+ ~; c4 j$ p5 w8 I# T9 f0 [
  20.         if (script != null)0 o; G( E' ?1 j
  21.         {
    ( w1 T9 J1 P8 ?3 w
  22.             script.unload(false);
    & c5 G& |1 Y9 ^& S; E# \/ C2 N; z, W
  23.         }8 M0 T! I2 ~! ?! r: t9 [. }
  24.     }
    % d& G( v% g* u$ G( g6 F* s( w8 W
  25.     _scripts.clear();
    " `" C0 [4 Z' M1 A
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.: R7 i! ?8 T4 `
2 T# `: e# J# v# d9 J8 t
Метод report()9 G2 u& P  H0 n; B
# Z3 t! U) t' e5 @
  1. /**
    2 v, c! U8 X& }! Z4 E
  2. * Логирует количество загруженных квестов и скриптов.
    ( r0 j: W( U- S* Z8 U+ C' O+ h- }9 ]
  3. */. j) g) [" L4 K$ C3 @, ]
  4. public void report()
    & Z) K9 M$ x1 ~3 r
  5. {6 a) ?: v1 I( g7 T7 x
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ' [! C* g# \# L. i$ M3 _
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");. a5 O& q' _$ t: L5 ?+ l
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ B# x7 L( G  d: M$ a2 H  u

( X6 P! f0 R; o9 c7 R( DМетод getQuest(String name)5 j7 I: u$ g. x/ Q) n7 e
5 f; T6 l5 H( D2 O, h
  1. /**7 A: k6 {! J- s9 Y9 r
  2. * Получает квест по имени.# Y+ g$ {* l3 V% Z/ }
  3. * @param name имя квеста! K7 A# K5 t1 R; R
  4. * @return квест
    % c! }" |4 Z: `
  5. */8 }' v" K/ [( @8 c5 S/ F
  6. public Quest getQuest(String name)4 |$ o8 }2 N: Q  o
  7. {( s2 a! |# \$ Q" ~. l1 x
  8.     if (_quests.containsKey(name))- s9 T1 b& u4 T$ Z( A' d1 A: O
  9.     {/ b: b4 y# |7 J; S. Y
  10.         return _quests.get(name);' O9 N- H$ n" x8 G
  11.     }
      [5 G4 D3 J& _6 @; m) K5 R, O4 g
  12.     return _scripts.get(name);- ^' {' h& b( f( g7 ?
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    2 v7 X" U+ a- Y$ K; F0 p

% n+ M  L' R: S0 S+ M2 I" gМетод getQuest(int questId)4 O- S1 k4 _* {  a6 ?* Q
$ V. s9 z# y2 ^% y
  1. /**
    : y! h* m; Y' U* ~
  2. * Получает квест по ID.
    " x7 n5 W3 ?7 ?2 P/ u
  3. * @param questId ID квеста
    8 j) y$ V1 ~4 s6 q6 F2 w
  4. * @return квест, если найден, {@code null} в противном случае
    % u, M; q, |% H1 t+ N: ^$ _! W! y
  5. */
    4 X/ C1 R7 \7 h. X- T
  6. public Quest getQuest(int questId)
    ' @9 b* c2 q  I2 _+ r- F$ f. |
  7. {
    - r. F3 T& t6 X8 O6 Q
  8.     for (Quest q : _quests.values())
    ; w* i9 E0 P' f# C
  9.     {! o2 K+ n5 g/ `- E# B
  10.         if (q.getId() == questId)
    $ J( w1 ~4 U3 p4 f0 T9 H
  11.         {
    ) T6 m, r+ e4 _8 w- W6 s3 M
  12.             return q;9 h1 `6 S( V( ?' v$ l* v. P
  13.         }. f6 Q, |" f' c# Z
  14.     }5 j: {) \# ]+ \8 R6 J
  15.     return null;  M2 Q" I1 v" u! a! ]5 \7 s
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ' u* t5 t4 H$ ?: T& ^

- }6 e0 ]) @+ K3 ?% a9 y% c5 W: pМетод addQuest(Quest quest)  d3 y; K9 ?0 p1 a9 D
$ k% x2 O' h3 f8 r
  1. /**
    % b8 Z* t) J- e+ |9 J5 u- e
  2. * Добавляет новый квест.$ l9 ^# p' M0 m" x3 y
  3. * @param quest квест для добавления, P% A/ u2 m- N- w$ P3 E9 m7 h
  4. */. v# u* b4 C" N1 u. P
  5. public void addQuest(Quest quest)
    . w$ {' N  ]$ z
  6. {
    7 R1 f5 C' H' f$ o
  7.     if (quest == null)% H* l4 T9 F! W+ m
  8.     {+ y0 y3 p% {' E. c6 C! q% ?
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
      c% g- D" B; w% B
  10.     }  e2 h% z) a  ]# M
  11.    
    / ~5 [2 Q. M; g/ p* c' w; y
  12.     final Quest old = _quests.put(quest.getName(), quest);
    * @" j7 p5 K7 o) w- f$ n$ s' Z
  13.     if (old != null)1 ~1 \" [8 @- h# P- m
  14.     {
    * X3 \2 t& Y) j4 _5 u* H1 n
  15.         old.unload();
    4 j- }. |5 x+ ?5 o5 i
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 C: X9 U& u- ?# c
  17.     }% H& q. {% ?( d; P" V: Y
  18.    
    . V* O, r$ d: j9 ^$ z" X
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ) M3 n  w# R3 s; M+ h: l2 ^# J+ P
  20.     {
    & _' f9 T" e; w6 B% R3 E
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 q7 U7 r/ z7 c: G2 @9 |1 r+ ]$ Y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    1 l# c9 N/ ^8 ?: b
  23.     }
    , E6 C: [# X, T5 ~+ }/ o- k2 ?
  24. }
    $ I) O0 G) N/ ?; d) ]5 z: a
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 @2 E1 |! M8 Q8 j- ^ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 e/ n6 n) Y/ t" K

. G8 o. d/ I1 k* j
: E9 I1 P& j# \$ l3 t/ w+ @+ O. ^$ ?, R
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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