Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 R; c8 c& ?# m" u# E7 t1 L: a% \2 w8 M* u6 j# v+ ?
Разбор файла QuestManager.java$ `6 k7 E( a. ]9 ^
  F6 m; d6 c) @- a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.' N$ C: r5 k! K0 T
Основные элементы5 [9 _2 s" c& l$ @0 `" ]7 S7 R' _# g- o
  • Лицензия/ A' y5 s) h: |) n" J
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.* A* m* r" l, D' s% _
  • Импорты, W8 M; ^% D" I: ~4 J
+ c& N0 r9 G$ `4 {
QuestManager.java — управление квестами и скриптами.
2 i2 |$ i3 |7 Q1 E" }Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\3 u3 `* Y8 {. u" G6 u

+ l& [: W  g* H2 P& k( O4 S0 s" I6 J

# W: q8 z6 I" R" L. CДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ R7 y5 U# U0 s6 [$ @
1. Лицензионное соглашение4 O( U- O' a% `# g6 y( t
  1. /*
    * k5 \# s5 n2 ]1 x& b
  2. * Этот файл является частью проекта L2J Mobius.# \" D; V) h, w( E; E
  3. *
    2 w5 c4 @$ z5 V# e; w0 r" Y
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    5 T" _4 M1 _3 p: g; U
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    7 I: E3 Y9 w  w& ?2 [7 [
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.; v- A2 ?2 N" Q2 w4 ]
  7. * 4 n% t1 H7 j0 N3 ?5 j' R3 o( k
  8. * Эта программа распространяется в надежде, что она будет полезной,
    , E; ^8 [4 _' [! i  g( ^
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    + y, {5 s" z6 Q! I, X; G+ j
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    8 u0 H6 D; F5 O
  11. * См. GNU General Public License для получения более подробной информации.3 S6 P4 `, t1 l- v  `
  12. * + i) J9 S0 y* W. x: L( @# ?+ v
  13. * Вы должны были получить копию GNU General Public License9 l& a* T( o( H0 W1 U
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ E! R* D9 R+ u* \4 W1 O. G
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, ~5 O' i8 b  S9 u2 X# N" c7 I: a, A2 C# ]0 b+ ?
0 ]0 B  E( l4 ~1 B- I' _2 O( q
2. Импортируемые библиотеки3 v1 Z* \- n; }. ]' }: f# r
8 ?3 s+ V& M+ q6 {* m, s! \% c6 f- z
  1. package org.l2jmobius.gameserver.instancemanager;
    4 D) _- G0 A4 }
  2. 9 n; e( ~, v0 b
  3. import java.util.Map;* ]5 L3 V1 a; F0 f9 C! A
  4. import java.util.concurrent.ConcurrentHashMap;# {# v4 c+ Y( x  j0 y( c
  5. import java.util.logging.Level;
    3 k. Y3 z9 ~) Q3 i! Y0 G
  6. import java.util.logging.Logger;
    5 H9 i! Y7 f4 h: M  d; z

  7. + \' \  V/ g  N1 m1 A' N3 a; H8 [5 Q
  8. import org.l2jmobius.Config;
    % k. s3 I2 h6 {: h9 Q+ P
  9. import org.l2jmobius.commons.util.CommonUtil;
    8 D' J! p) ^7 T: g8 w: f' }& n
  10. import org.l2jmobius.gameserver.model.quest.Quest;; p! |( Q3 j$ z) w+ U
  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 — менеджер для работы с игровыми скриптами.
& I6 H5 H/ K' |' }2 a
* k7 W1 j' Q; z2 E# T7 s  F3. Описание класса QuestManager- w4 A/ `! \9 _8 g# p
  1. /**
    0 A* y3 o, j  B0 M
  2. * Менеджер квестов и скриптов.$ j2 s  y, l) y; o  B/ }
  3. * Автор: Zoey766 Q- c& y  `& A6 m% k0 Q& o- ]) ^
  4. */
    % e$ U, `: s* V+ J4 L6 H9 r5 x
  5. public class QuestManager- D' i! O3 i# R, e- _1 C
  6. {, n* h2 j2 a6 x( X; u" O+ s
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 [! f& K3 b3 T3 m
  8.     3 U- B& Y- D  {
  9.     /** Карта, содержащая все квесты. */* d% a+ l2 x) Q: }+ B  J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
      f) M- ]; m$ l& t
  11.     /** Карта, содержащая все скрипты. */6 n2 f5 A- Y! J# x5 X8 D
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();" G1 _5 M% p: Y
  13.     , o6 O  u+ z7 ~9 ^
  14.     protected QuestManager()
    ) H4 o6 C# D1 z: H3 E) \
  15.     {
    + c6 C1 c: z! p- v
  16.     }
    4 `# b( y8 `; B/ T8 O# x
  17. }
Скопировать код
4. Методы8 `; {, U  V# ]1 ^
Метод reload(String questFolder)' d5 q6 g. V) Z3 _
  1. public boolean reload(String questFolder)
    , k0 q/ o5 I5 P# A
  2. {
    & s* x  }9 S! G6 B  @1 o
  3.     final Quest q = getQuest(questFolder);
    1 {. {5 i- {* R+ I9 K  k6 I
  4.     if (q == null)
    # q; P1 A9 c# a$ b9 M4 O9 ]" q- p
  5.     {
    9 }4 `2 p, G) x. o7 Z% C, ]
  6.         return false;/ r1 Q  ^; I9 K$ t
  7.     }* y$ A' z" p7 @: E* X$ o* S; L1 N
  8.     return q.reload();
    , ]) ?# a3 n9 H' i- X( V
  9. }
Скопировать код
3 ^4 c1 b  N& x7 e* F& Y) q; O: \. V

& y  @8 E6 u: J: Z) w  o$ p3 UМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
/ {7 u* p& c3 j& e8 \) YМетод reload(int questId)8 v! M  m" b- A! F& u5 X

& O1 S6 {$ f: U/ _1 I5 j# m
  1. /**3 c' l  _5 l7 c  h( b: E; A$ ^$ D
  2. * Перезагружает квест по ID.
    * }0 u; g8 U7 f" ?  ~; x3 `! b* U
  3. * @param questId ID квеста для перезагрузки
    / P( [2 V, n) {1 e5 F9 J
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    8 P1 O* R! g  q4 ^( I" ]7 ^) O8 E
  5. */
    7 v. Z+ `! {5 H1 A' X: Y1 {
  6. public boolean reload(int questId)' l2 t$ l2 J7 o, a3 v3 X7 i
  7. {
    3 L1 U4 \3 S% R  c5 I+ i1 I
  8.     final Quest q = getQuest(questId);
    4 v5 D4 X  s+ W& I" ~' A
  9.     if (q == null); T. \+ v- l  _4 j+ a' h
  10.     {
    2 l+ _* l* Q# k0 z& f
  11.         return false;- j3 M2 ]: m  s* ?# D% X( j9 u
  12.     }
    ' ]/ J$ A7 F; C0 V
  13.     return q.reload();, i+ F3 e+ b- Y2 W7 @! w
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.3 K0 g/ E# m& i6 y9 L1 Y
4 o& J- e* p. I( r4 x
Метод reloadAllScripts()+ q( k$ q1 j; B# C" r6 ~

0 i; i' y3 j% E- q2 H
  1. /**. v& r- \5 }  g$ g) ?
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ) {7 v0 D" \7 j5 r- [8 y2 {
  3. */
    - P2 l. C3 ^7 v" \6 w; i
  4. public void reloadAllScripts()
    ' L6 e/ T0 s- j# i
  5. {; V! _( @6 T$ w( V
  6.     unloadAllScripts();
    & r3 l, K4 o4 v7 u. i8 x7 @
  7.    
    * X$ k; p0 Q& l1 e' r/ I2 _% R
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");1 H3 n/ [9 e& N( J
  9.     try
    ; o: L" |) i9 |; ]0 O% B! B& |
  10.     {
    " s; U. Z  C/ s- v
  11.         ScriptEngineManager.getInstance().executeScriptList();" M, ?2 p) ~& Q' A
  12.     }' l5 Z# R! M# @6 ]& v1 e
  13.     catch (Exception e)
    8 y( `6 k; |2 a* ]6 k7 m8 s+ o* @3 _
  14.     {
    5 r3 c* e7 i+ F& Y( v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);8 x5 y( [1 ^! S; {0 e( O
  16.     }& t+ X9 w6 f* c$ U3 l
  17.    
    1 V7 z! y3 X0 k3 C+ R9 c
  18.     getInstance().report();
    ' ^9 b( n6 X( {+ k' q$ a5 ?
  19. }
Скопировать код
Метод unloadAllScripts()
: A( Z' {; K, `2 b" u% U6 \9 O* t
1 X# t. o+ e, j- m  H. F" ^
  1. /*** \  h5 g, b1 y, H5 C( n
  2. * Выгружает все квесты и скрипты., O8 A; N5 \; ?/ K9 ^3 `/ M
  3. */
    8 Q9 K2 A- J2 L9 k5 t
  4. public void unloadAllScripts()1 E/ Z5 [, B/ F. U7 T4 C
  5. {
    2 z; q7 e2 n1 ~5 C% c4 s' I
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");) v+ E3 c! s  M* ~  o; n* O8 R
  7.     3 B: n. b- d* S
  8.     // Выгрузка квестов.
    3 s& M- X4 l; x, B8 A9 h
  9.     for (Quest quest : _quests.values())
      _: a( U6 p  S- J3 p8 o8 I( z
  10.     {
    " \0 M$ p' \7 S, v; Y7 Z( C
  11.         if (quest != null)  E) b3 ?+ u. ^  Y
  12.         {
    ! |/ V' ?3 W5 F6 k
  13.             quest.unload(false);- C# @# M" @! f8 \; w1 {
  14.         }
    , O8 A5 h  T6 R$ s5 }9 K
  15.     }5 ^1 P" K$ D' ^
  16.     _quests.clear();% J* ]4 f& p! u; W2 q
  17.     // Выгрузка скриптов.
    : e  d& j0 n: @' z& G* `; P) ^$ l
  18.     for (Quest script : _scripts.values())$ ^1 @2 n3 }' c5 t
  19.     {
    * ?* i* P3 N+ Q) g8 D6 x3 O
  20.         if (script != null)' U. H- X/ o7 I# a3 D* d
  21.         {
    $ `( X- T, w; l! V) F
  22.             script.unload(false);
    - F9 z$ E9 Z5 h0 [& z
  23.         }
    # B9 P6 N8 R4 y
  24.     }  h" Z6 j2 o5 @" H' Z/ G: V# O
  25.     _scripts.clear();1 w7 M3 a! c9 X" a
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    , S4 A% Y; e# U
7 d2 D* c% \. V8 _
Метод report()
# K' V( d; o- @, I3 _% {( D
" R0 }; i: D& }1 O. p5 }
  1. /**7 i; b9 A5 _  y/ c" z
  2. * Логирует количество загруженных квестов и скриптов.7 u: k5 K8 W7 C* g$ l0 h) h
  3. */
    0 r* Y5 v1 p* j
  4. public void report()" M8 m7 C% M. \: W) b6 [
  5. {6 t0 o0 }$ B( h: N) T
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    9 F2 t6 Y$ d, a
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");+ z* ~, E. {! W
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.9 Z7 c6 h/ d. |2 j

/ V/ ~# Z0 B3 H/ F* Y9 q/ hМетод getQuest(String name)
2 ?5 H( u, P9 ?: ^) q$ \: g2 E) d( f1 E& W$ F$ ]
  1. /**
    " M( W+ K/ s, Q
  2. * Получает квест по имени.
    4 P$ k8 }$ ~* F& }
  3. * @param name имя квеста
    ; \; n! l! Q- z" z- w
  4. * @return квест
    % s  x. l0 e1 w  p/ ^/ K5 b, Z# [7 z
  5. */
      y7 T' ]4 _; F: @3 J9 i
  6. public Quest getQuest(String name)
    0 U( R8 K9 v8 |6 J2 k1 |
  7. {2 ]4 G2 a: d, V( X  l: y. x& L+ \
  8.     if (_quests.containsKey(name))
    0 }5 l5 V+ M5 @7 z
  9.     {( d5 }' {# S  T0 Q
  10.         return _quests.get(name);
    & N! o# j: ]7 u% Y
  11.     }1 |( Z* f7 Q1 T  ^2 {' g/ u
  12.     return _scripts.get(name);
    " I* y! q. W0 M* e0 A- j
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    % u1 ?5 y" u0 a# H( Q, ^

# A! J- D0 f' U$ F( I8 h8 v( IМетод getQuest(int questId)4 y0 t& m9 q0 Y0 `$ H) x' x% J  }
% W3 {9 @0 T( F" w; M
  1. /**, u( n% |* U# @; j/ S
  2. * Получает квест по ID.
    , l- q7 v" t% m
  3. * @param questId ID квеста
    ! F- \* r) u0 Z4 {" S
  4. * @return квест, если найден, {@code null} в противном случае
    9 U! U6 o, `9 r3 \" ?
  5. */3 N" [1 C: ]& T& L% p5 S
  6. public Quest getQuest(int questId)
    4 q6 b" \( x  S9 W
  7. {5 _; y0 w" h# J0 `; H$ o
  8.     for (Quest q : _quests.values())
    : ]. f7 ]) L* e( U8 H4 h
  9.     {3 l5 Z( q* Y' e( m. p( v) w" S
  10.         if (q.getId() == questId)
    ( H- [) S) X  h. e
  11.         {
    , }- K4 q5 ~1 Z$ [# j
  12.             return q;3 I' S% V% h6 J2 g4 O5 k5 z# n$ F  _
  13.         }
    4 M4 n4 D9 U. l2 W4 o
  14.     }
    1 i% C8 o8 g; C- h5 l" D% f
  15.     return null;  j! [6 {0 A7 V0 h1 s. Z- ~
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.# G# y9 e: O# f, c% g  |+ n. n
' S9 R7 S. e; K
Метод addQuest(Quest quest)2 h! u; t/ @5 |2 z0 \
; {- s' F5 s, V5 e
  1. /**
    ) B5 I/ u0 V, r) T: g  u* V% |
  2. * Добавляет новый квест.2 s* Y7 t7 \: d3 c, u  `
  3. * @param quest квест для добавления
    2 u; ?* z; d9 _5 v( Y: Y
  4. */
    , ]6 f% I; V; X. D0 v7 Y
  5. public void addQuest(Quest quest)
    8 r7 b3 |! p9 `5 \1 `2 x/ v* V
  6. {
    1 b# J  R% h  W; M
  7.     if (quest == null)
    : K6 ^9 h5 y) _# i: q
  8.     {
    ( w) @8 G5 S) l- {3 a
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    % ]+ q8 `1 o- }$ M8 m
  10.     }  @8 w4 F* h, I
  11.    
    1 C) ~0 V5 @% i6 }. X5 n& V$ f5 k
  12.     final Quest old = _quests.put(quest.getName(), quest);
    & ]+ M( H3 j, a% Q# `" r% h( n% R
  13.     if (old != null), e  C* H; i  C2 i5 M0 U
  14.     {
      S0 v) q$ M# c& F* \
  15.         old.unload();
    . ~8 E6 S0 o  h
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: B2 G7 K+ p" Y. O- b+ b
  17.     }
    " y  A! }+ {1 N5 k% }
  18.     * k  h% m7 X% m# N  F
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)* ]4 K% ~1 ~6 K8 J
  20.     {
    : R) m6 J2 n$ j
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ I( t3 q+ b4 V1 C
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    * p2 ~! S9 U3 g7 x/ ]
  23.     }
    5 L( u$ {! B4 }1 p  l$ h
  24. }
    7 E0 S$ R: E3 Z+ l/ S9 J  w! X
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.2 K6 e- S* W2 R  ^- V3 c! V8 s
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.# y+ |- E& c- K& T  e
9 P& S& x9 Z4 P3 j6 C/ q
" b1 `0 |$ q7 I% F. ]/ X7 ^
1 B2 p' M# q- C! c
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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