Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
% f- ~4 P/ T: e! u7 J" h; D/ C( Z- J& o3 ]% Z% ?. Y5 d- q. Y
Разбор файла QuestManager.java
& }/ n, B; y$ C/ F3 _3 i2 t) I
& n1 C3 g. w5 t/ jЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
9 t) q0 E& h3 h( XОсновные элементы
5 X6 A5 a2 u/ u" Z/ r" S; g
  • Лицензия9 D! p4 J  _& k; R- _: U$ Q1 R
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      + K* u9 t$ V  d/ a9 T+ M# C
  • Импорты
    ) C5 T! {& p- l5 w

+ }8 g9 H+ X' W7 k3 fQuestManager.java — управление квестами и скриптами.
; ~) u2 a0 ~# m" `: PПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# M# P% \: ^3 M* U  [3 i
' h7 W2 F  y- G1 V8 O7 F$ F

: P: N! e2 B- `( kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
$ ?6 M2 |; x8 t7 _+ m' D' w1. Лицензионное соглашение
3 Q& i- a( l; U7 t  [5 `
  1. /*
    ; m0 m' K) a# ?- O$ B
  2. * Этот файл является частью проекта L2J Mobius.; H8 `& H( Q0 x# o5 m
  3. * 9 U& _1 a. l8 P/ F
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять: i5 b' C; x+ {4 E' A
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ) c2 T! j: V4 Y5 T
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    , u2 K8 c3 s0 B: u) C, v
  7. *
    - j. x( \) h& Q7 e% c# @5 ~
  8. * Эта программа распространяется в надежде, что она будет полезной,
    - u0 J3 N5 k" g" u
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    0 g, [3 n( S5 k0 `! I
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    " M# `( Q( P5 `1 V5 _
  11. * См. GNU General Public License для получения более подробной информации.
    # O% u# L5 Q( @+ z0 L$ X
  12. * ! t1 A9 p' K1 |* _# t
  13. * Вы должны были получить копию GNU General Public License
    . m2 ]4 _- s4 F+ O
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.. X* y. ^( x! l( h/ g$ z8 ~1 a4 H
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.7 E3 ?& D, P& G% a! s

0 T. v! r9 j3 d+ ~) N" i7 Z+ q
$ X8 k; h3 h# H7 C: [6 ]0 {2. Импортируемые библиотеки; s; B. b( u( S4 ^# q* d
" l/ j/ G  T6 k, j8 I; O! S& C
  1. package org.l2jmobius.gameserver.instancemanager;
    7 \/ E% c2 W+ t- M& u

  2. ; e' |$ i. V/ w8 d
  3. import java.util.Map;1 e6 `$ f( q) Z" I8 a1 m
  4. import java.util.concurrent.ConcurrentHashMap;) z) j5 |* F* E% e$ H+ P. M1 G' M% @* I
  5. import java.util.logging.Level;
    ! d0 ?: t& H) Y+ |! h
  6. import java.util.logging.Logger;
      r$ C9 M0 |; L) b2 E/ H

  7. & @  c. w1 r# M( [% @2 R4 X
  8. import org.l2jmobius.Config;7 |7 V  F8 `) z8 R& l. f
  9. import org.l2jmobius.commons.util.CommonUtil;
    , B( {, x6 V' y- w2 ~+ P
  10. import org.l2jmobius.gameserver.model.quest.Quest;0 R% U, Q. D) d) b( m& u# T1 o
  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 — менеджер для работы с игровыми скриптами.# \, G9 u# N/ R! y: v4 T2 I6 c" @
% S+ L5 d; L8 R/ I  Q
3. Описание класса QuestManager
0 |) L  i% n- z  P$ c8 {: i/ W; c0 r
  1. /**
    7 ?! ]# H3 g6 R5 y3 S* d- M. q  ]
  2. * Менеджер квестов и скриптов.8 H% A& z/ [# T8 T
  3. * Автор: Zoey768 q' W/ d" H/ j
  4. */" {6 l: t- m! z1 p8 L8 n" N
  5. public class QuestManager" _2 ~* @  u- T& x) w& l* @) I
  6. {
    2 ~+ c. @5 k, i; O( ]: V
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());! e; a9 E/ `4 Y, f, m2 D0 v7 I
  8.     9 M! r  B( \5 @( S
  9.     /** Карта, содержащая все квесты. */
    1 N# |: ?7 U$ s. ~& w; J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    / l) c) \& r  O; P6 V
  11.     /** Карта, содержащая все скрипты. */, k3 K& K: U/ ?$ u; D1 L
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    4 |( s( U1 |7 u: k% g4 M5 X1 ]
  13.    
    3 Y7 [9 _: ?' I4 n% S5 ]
  14.     protected QuestManager()
    & m- B+ O) w# j& n! X+ t
  15.     {
    ' w! h5 ?/ G. X0 S& K
  16.     }
    % X% W" Q! d; ^9 j) s( l
  17. }
Скопировать код
4. Методы4 j7 G9 j7 ]. F# a# }6 `
Метод reload(String questFolder)  y0 b' T& L. Q% y& q% B
  1. public boolean reload(String questFolder)
    + U3 J+ [; p0 C) M! f4 ?
  2. {
    4 y% T% N" @3 K/ q
  3.     final Quest q = getQuest(questFolder);3 h8 l3 ^9 U: u  ^
  4.     if (q == null)
    ; _! z. q8 [  O
  5.     {
    ' k/ C% G- Q4 m
  6.         return false;. F3 E- G8 |4 Y$ [# w
  7.     }. P% @, d; g* F) y8 U
  8.     return q.reload();% U& Y9 p- ]2 @$ P/ |
  9. }
Скопировать код
/ Y" Q5 l  }% u
9 I7 @) J) Q) `3 l2 E! E- n
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.2 y3 t+ n: V7 f! @5 |) g& v8 A. i) I
Метод reload(int questId)8 ^1 j& X) X" r/ l( ]) Z: \/ z

+ U& O1 n/ E$ l( t
  1. /**
    8 T9 g2 E+ {, ~% x' X- T
  2. * Перезагружает квест по ID.
    6 J5 s7 ~# g& u5 |- L
  3. * @param questId ID квеста для перезагрузки
    " A: I2 w2 \- N+ v0 f6 B
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае  @4 R) Z- x! Y+ |
  5. */6 L$ I+ J- m1 a. I: P
  6. public boolean reload(int questId)1 j; _. o* W' S1 {3 Z  D. T
  7. {4 M6 J" W& u7 Q0 O, `% U
  8.     final Quest q = getQuest(questId);
    $ X5 ]. p) T) f2 M; M6 z; A
  9.     if (q == null)
    8 c, F: D& R9 |1 ^5 e
  10.     {( `& K+ |9 {3 P, A& F5 _4 ^/ @. F
  11.         return false;/ l% D  u6 I" K6 n; @% v
  12.     }" {7 [4 B9 e. Y+ w9 z9 |
  13.     return q.reload();6 p0 n4 O- a" ~6 X5 T) G" x7 _
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.7 W/ l; h' U$ Q% s) O
; M# `. z  F& F! o0 a" p7 G
Метод reloadAllScripts()
) G4 p2 s4 D" ^; |* V+ Q; P3 L$ t9 \) G" n1 u& u+ I( I* g
  1. /**
    ! Q' R6 L+ b4 ?8 z' S# M
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    8 S8 U! [0 c5 d* y9 G' a' t( H3 a
  3. */3 C( y8 u5 i& y( Z4 _2 m
  4. public void reloadAllScripts()
    . ]6 f2 ]- Y1 u
  5. {
    # n+ O/ `$ @0 I; l
  6.     unloadAllScripts();
    8 W4 k; U% H0 X
  7.    
    4 g. o5 W6 J# Y0 d
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");  S- |' r! ~$ v$ d5 W* h/ I
  9.     try
    ; `. _9 I8 z. [# e
  10.     {
    ( A) v! i  d$ l& l* I. R% T
  11.         ScriptEngineManager.getInstance().executeScriptList();9 d& o# p* i+ e/ ^' I1 @5 W
  12.     }# O' i$ y3 @0 V; s  n
  13.     catch (Exception e)
    0 p, C" p- R2 P7 V" Y
  14.     {4 D+ L# }* i6 Q: n& q5 K3 C7 _
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);* j5 ?9 m( T, r" ^
  16.     }0 I3 C0 x/ \. v" o7 U4 n
  17.     + x9 J* d& `$ m$ _& ?
  18.     getInstance().report();
    % b5 d. ~/ V' e9 U- n* V4 A
  19. }
Скопировать код
Метод unloadAllScripts()* S6 W) l* L# k& P/ H4 v, W: x. J
! E9 f% m9 G8 H
  1. /**, e# j; G; C+ ]% U, q' Y4 b
  2. * Выгружает все квесты и скрипты.
    3 l* i. e1 C' q, e* H
  3. */! o0 H* x* \( y7 E/ c
  4. public void unloadAllScripts()
    8 x( [/ ^6 j1 A7 P; y& [& T
  5. {
    0 W! O! {4 _2 s+ S0 R
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ q, b4 v2 w6 H4 `, W
  7.    
    . P* `, i7 e0 Q8 m+ S, b4 r9 y
  8.     // Выгрузка квестов.& G+ e5 m# Z& P
  9.     for (Quest quest : _quests.values())& u/ H, x9 j9 ^7 a! a' U
  10.     {
    $ c& V% g% H( ^! T
  11.         if (quest != null); h8 N) x8 u. b
  12.         {- _3 b4 K6 U( u+ Q, n! F
  13.             quest.unload(false);
    0 g) f$ s8 x' f* o
  14.         }
    $ D, N( N7 L) V7 L
  15.     }# P/ Q0 _# g% g5 Y, J- @
  16.     _quests.clear();) z( P( I! H3 g2 w. P
  17.     // Выгрузка скриптов.# d2 J/ x1 c; G  m' y
  18.     for (Quest script : _scripts.values())+ F, G& K7 o' X$ }: Q
  19.     {
    4 K, O8 @5 J* e( s
  20.         if (script != null)
    + Q- |3 ], k9 N. J
  21.         {/ Q8 m' N! `6 L  {, C, i  U
  22.             script.unload(false);
    ) A* n, k2 R: p0 Z; y
  23.         }7 ~6 \, `+ e/ M/ B5 y/ Y
  24.     }
    " g* l! i  t: h/ ~
  25.     _scripts.clear();
    ) i$ Z( d: {4 g0 C$ m- |# A
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.; [' G( Z0 I$ D) O/ z
9 Q. v* K1 e- H4 W
Метод report()& r+ b, N; d) g, \$ {0 I# q/ B/ e  Y; k+ {
$ x& V1 t2 g# m4 j( k
  1. /**# \% L3 n; @+ z! h% m* W4 v1 y
  2. * Логирует количество загруженных квестов и скриптов.
    % _1 N* }( h8 ?, n
  3. */
    , |: S& J- w9 F! i3 s
  4. public void report()
    * w. Z3 ]% k# q
  5. {
    3 v: M0 r# C* w5 o* _; a* B/ b# a
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    # x$ D9 m' z4 U) r
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");' w5 _4 C1 Y3 [0 l- `
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов." y' t' k- o  D7 A
9 x5 v/ ?7 f" ]+ R1 b% a) o4 e
Метод getQuest(String name)4 U$ h2 e! R3 U4 p; R2 N7 t; U
9 U( O+ v9 y% J
  1. /**
    ( |" e" l8 @: ^. Y6 P. H( A3 G
  2. * Получает квест по имени.
    & ?% ]/ a0 k  E4 x, {- e
  3. * @param name имя квеста
    ; H( r, G3 J! T: S! }
  4. * @return квест; o" b: [3 ]$ c' @: Z
  5. */% a7 T6 D, M( v' U3 O$ [+ s( ^
  6. public Quest getQuest(String name)
    9 G2 B. W0 t1 M; `
  7. {$ S. {. Q6 _5 i' y% N, x5 t9 F% {
  8.     if (_quests.containsKey(name)): G0 |8 }3 S$ r
  9.     {& g& ^4 _# [+ t) I+ i5 w7 ~3 \
  10.         return _quests.get(name);
    " H: K! I1 w0 T$ T
  11.     }
    ' |% \$ {; L6 R7 A) n$ |
  12.     return _scripts.get(name);8 U+ w& A$ p0 C; B' {. x; r
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ' A3 G# W: r+ W2 ^; X, J
- Q; ]) K4 d* T* p: v/ g! R
Метод getQuest(int questId)8 Y, A$ y2 n! g
7 ]" h' o3 h: T" E1 u
  1. /**+ ^( ~5 f' G8 u. B6 z
  2. * Получает квест по ID.) g& _$ |6 Z6 _( y' C
  3. * @param questId ID квеста
      Q% G3 V/ W6 J  ?9 ]) O3 I
  4. * @return квест, если найден, {@code null} в противном случае
    : y( O, ~5 W% D1 I0 I
  5. */
    : s3 v( x* |' V) @2 H
  6. public Quest getQuest(int questId)
      v4 W1 k6 E6 N1 E
  7. {
    9 B4 C$ u4 a% j
  8.     for (Quest q : _quests.values())
    " w7 m) ^% _# w: D
  9.     {( k$ i- w' F7 u; `+ }
  10.         if (q.getId() == questId)
    , e( J# ~0 l: r9 b
  11.         {" x& y4 U4 q5 G1 N$ w
  12.             return q;8 t1 c& b* C! @! u# Q5 n
  13.         }5 z; `: j2 q2 S; F; W; g' B7 Z6 t: Q; Y
  14.     }
      k' d( W  T1 c+ p
  15.     return null;2 O* S' o3 Q) ~- n' t( }8 v" V
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.2 w6 w2 _3 Z8 G/ \

. U9 n3 w: ~4 X, E, F3 H# CМетод addQuest(Quest quest)7 |2 }- q0 {8 p/ R, m$ ?% c' J

: ^; d+ g" S. R  G$ m1 P8 R
  1. /**) G! g8 j- t! [9 z: |5 }& S
  2. * Добавляет новый квест.
    $ d7 y! p* I$ U: ?, y0 Y- s4 `
  3. * @param quest квест для добавления
    ( I* _% I; H& m, L; q7 J) U) S
  4. */% k* f4 _* j4 p1 Z
  5. public void addQuest(Quest quest)
    * e' e; r, J3 p! g9 G
  6. {1 c. {+ E/ u! P' f
  7.     if (quest == null). j2 Q7 N- v0 S! @/ X5 l
  8.     {
    ) r. y) W$ J. W5 h$ h) @
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");( y; C3 j' r* A" V
  10.     }' i1 v; N7 ?! \8 f9 o% w" I; e4 h
  11.     ) \6 ~; F8 z) M! r$ y6 X1 ?  u3 e
  12.     final Quest old = _quests.put(quest.getName(), quest);: R2 L5 n% ?3 i1 T1 E
  13.     if (old != null), \. O" |2 G0 b/ z
  14.     {. v: B- w: _8 [9 L2 w$ D5 g
  15.         old.unload();- i6 u4 M  L) y) n6 }1 n
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 V/ J  ~4 b' h7 Y; x$ k
  17.     }! L4 ^# g) u* R: N* }2 f0 ]: w
  18.    
    ( x/ p. G. e% _  ^- O6 r7 A+ y
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)& Q! e+ n, z2 W7 n) q+ y
  20.     {
    # \5 L# M  @. x) e. H# ~
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();3 u; j' C  n7 m- d$ H7 G* T  z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    * t  @: S  G' X0 t- ^
  23.     }) u# r# u/ s; x. m/ R
  24. }; j: P) W% e4 t
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
2 G2 y$ u, v# d4 VЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 u9 X& a7 l. C# V, {; O, W" f# W: w7 p1 e
1 ~5 S' m5 I% f4 d! b8 O
$ Y: o8 C  t; [9 }
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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