Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ _% B6 l6 y4 M5 x3 A8 ~& P

1 b5 r- r0 e, L& I7 j( sРазбор файла QuestManager.java
  F1 }! L- [7 ?4 n+ F, ]
+ `* f# K6 f5 Z+ }. {# SЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.- y- U7 X5 T, P; ^! X2 ^
Основные элементы! R6 S* Q* z: I$ S$ G% L
  • Лицензия
    : K- I0 B! o/ J$ t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 n3 M' S& v; b9 M7 a
  • Импорты4 H' o% I3 R+ a! T

% [1 W# {& v; @4 q& iQuestManager.java — управление квестами и скриптами.* ]0 w1 |) \! k
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' B+ j( j; E& Z$ X- E; |
4 z9 k% `. V1 h8 e
- ~* [, Z! C" N
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов./ a: M1 B# e. Z5 Y& u& D- h7 F
1. Лицензионное соглашение' c. f0 M( m" e, H
  1. /*! o! M" B/ h* K" W: O) \  j" O
  2. * Этот файл является частью проекта L2J Mobius.# U6 t$ w1 F0 L4 G
  3. *
    6 s' m' y* y5 M3 G- x, U- w9 _8 j
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ( Z: t  m7 r# K
  5. * её в соответствии с условиями GNU General Public License, опубликованной0 v/ s/ o9 C6 Z: V# [
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    : d; k# e/ c$ @, z
  7. *
    & O1 _4 }3 H  u/ }1 T
  8. * Эта программа распространяется в надежде, что она будет полезной,  ]$ C* T' M- |& y$ H2 c  b6 t
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    - w  Z- t. a# j
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    9 m) _$ T9 ?" |+ V7 a+ V! N+ {
  11. * См. GNU General Public License для получения более подробной информации.' _7 Y" k+ q6 Y- d; j9 `
  12. *
    . K2 p! W! q) `+ i; a
  13. * Вы должны были получить копию GNU General Public License
    1 \% e4 @3 C$ }* B& |4 S: g* t
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ! ?* S* p$ k& ~) d- }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# G* u  Z5 h/ V& R) I
+ P* X) L  Z- z( Q/ \  @* S" q5 ~. U
2. Импортируемые библиотеки
/ V1 b* z% e  P7 {' \: e# H
5 J1 n/ r' V; H: r, H, C5 v. [
  1. package org.l2jmobius.gameserver.instancemanager;$ K$ }* `1 F% \; o0 r7 i5 j& q
  2. * I, f: }" p3 p- t" U4 l1 H0 {
  3. import java.util.Map;
    * ?, s' o. u. `* N6 C6 r5 Y0 e
  4. import java.util.concurrent.ConcurrentHashMap;1 n) z9 s& |( g# [
  5. import java.util.logging.Level;
    ( m, T8 K  ]2 D; a
  6. import java.util.logging.Logger;
    # E* }$ f/ I% @, A/ I; K
  7. 2 {- d# |- V) v- p
  8. import org.l2jmobius.Config;
    9 S$ N/ x6 G2 b3 v4 ~
  9. import org.l2jmobius.commons.util.CommonUtil;
    2 b) ]3 _3 ^6 x
  10. import org.l2jmobius.gameserver.model.quest.Quest;8 Q- s6 X" c$ e4 L7 _7 Q! x
  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 — менеджер для работы с игровыми скриптами.
- A! Y% ?" C" C0 g- `- V
5 m& \! D) C0 |* W3. Описание класса QuestManager
# {9 h  T% N) {* i' e7 D7 q
  1. /**
    8 ~; S6 l. }% W% Z' y& I
  2. * Менеджер квестов и скриптов.
    " P' K$ @5 u9 \
  3. * Автор: Zoey76% d% O3 J: Y5 r$ T
  4. */
    ( R) e( x" u/ c- `7 X( `8 \0 }
  5. public class QuestManager
    ' X0 R) j% T6 u; x& X% P" C7 R$ b' B
  6. {
    0 t: \. j8 ]/ G6 V% `; |& C  x5 z& R
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    $ c" \, d% {! ~; z( }
  8.     8 R' g, e: Z2 z8 ?2 k5 g
  9.     /** Карта, содержащая все квесты. */
    1 T  s6 g) a4 Y- W' p7 P& H7 n, [
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    + c2 I2 c' p# b7 w0 Y
  11.     /** Карта, содержащая все скрипты. */
    6 V4 e4 i  ]' V+ p: H3 ]: x) o; k
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();. W4 I  ]2 W+ F; e
  13.    
    / A- e9 [# w1 f
  14.     protected QuestManager()
    ( Y' l# r0 K; \' i, _
  15.     {
    ! R$ ?! K, @( O/ N$ P: }4 @( N
  16.     }0 g) M4 y1 o4 K  e6 Y/ `7 `6 q/ C, ]
  17. }
Скопировать код
4. Методы
0 x( `1 ~% r6 h* ]! g. v/ i+ {6 P* iМетод reload(String questFolder)1 Q$ f, I# O& C) P1 p0 B6 J5 g
  1. public boolean reload(String questFolder)6 [% v& s7 e7 Q7 ?# `' y
  2. {
    % d8 @0 l4 F8 X3 P9 H
  3.     final Quest q = getQuest(questFolder);
      m) b7 t" n% o0 I8 A# Z
  4.     if (q == null)
    . Q4 O* O9 L! z) ]
  5.     {# G. ~* v# A3 t! f& y
  6.         return false;. {. k0 v: k7 t, G
  7.     }! _  B0 p  o5 Q& c3 B
  8.     return q.reload();
    & X* |! C) T# m. J4 m
  9. }
Скопировать код
: F+ w3 m: o$ V5 t' s) T

3 m/ S  t% t4 O' H; E5 i4 KМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.. S9 M8 V- a: t% A7 N# g# A
Метод reload(int questId). L5 y, F; D0 @. h4 ]; g
, x3 ~. x, T" h8 S
  1. /**
      C1 ^# o. t. \
  2. * Перезагружает квест по ID.
    ) s+ F9 y% s% B
  3. * @param questId ID квеста для перезагрузки
    4 r& e) c3 @/ b+ M1 L; g
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; D' ?0 a$ J! q
  5. */9 v4 Q5 S( ^9 ?$ X( q
  6. public boolean reload(int questId)
    % A; X! a) t2 n9 J0 l9 C
  7. {
      q- c$ D: C9 _6 x
  8.     final Quest q = getQuest(questId);1 J; H: [' }3 U# y
  9.     if (q == null)
    ' @  f7 c/ h) F( c: Q- ^
  10.     {
    : C  O+ r3 S' L( ~7 a
  11.         return false;( ^) O( j9 X) @7 ^8 b" ^9 w
  12.     }
    " N: H0 |  I* `7 Q9 T1 q
  13.     return q.reload();
    ! F1 L" ^1 C5 }% e" F8 ?
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    & @% e$ _- Y; x% {0 s0 q$ G$ }( Y* r

+ C, q2 X( ]+ a# P# BМетод reloadAllScripts()
0 d* J0 k. w! E: j
1 T" C  T3 {' {- P! I
  1. /**! J+ M8 M2 B5 F( i& S3 x5 i. n
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    9 m. f% k( E+ Y3 }& P5 L
  3. */' f- F$ p( T' s% W9 I7 t; V  C
  4. public void reloadAllScripts(), X% i3 t* e5 d
  5. {
    ' m% T" n: P$ T' r& ?9 V' z2 R
  6.     unloadAllScripts();
    1 W4 \7 R# z% R% ?8 B+ A
  7.    
    $ t2 D9 p+ x; d
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    4 f' M. X) n0 B. t2 D; @+ u" C3 L
  9.     try9 ^6 M/ ?' s% u4 j
  10.     {7 D) s* i% }' f' K) c3 K
  11.         ScriptEngineManager.getInstance().executeScriptList();
    " J5 z/ J5 S# ?2 e
  12.     }
    2 }' @2 o; \! |7 |
  13.     catch (Exception e)
    ) R* ]9 p2 U2 R% }! ~
  14.     {' B7 O/ v0 Z# v. R% ^& H% p( G$ W
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    9 q% R3 Z. Q% z0 q2 F- q' D2 {) k
  16.     }, p! a. ]0 c: v# h
  17.     ; q3 I- M+ M  a( h8 |2 P4 }
  18.     getInstance().report();7 n) [2 A9 g/ H! e
  19. }
Скопировать код
Метод unloadAllScripts()& G" M* ~4 E' S( ?' b9 J
8 z6 R' ?1 H/ G
  1. /**- |% g8 F  M/ c$ v& s
  2. * Выгружает все квесты и скрипты.
    ( L; ~% J8 \9 o
  3. */+ g8 }( C& n, {; e' {; ^& @$ H
  4. public void unloadAllScripts()
    ) B5 D, R9 W* c. t. A+ [
  5. {
    * l8 o1 T. \- F: B7 {" |7 H
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ( [" N! o/ W6 N' P' J
  7.     " P$ _" ~5 E6 u
  8.     // Выгрузка квестов.
    3 \7 h9 {% M- P0 N* B) K, c9 T
  9.     for (Quest quest : _quests.values())& U4 R* G" N( i  t4 H; v
  10.     {
    " D" |- i: s. {/ v5 q3 s9 a+ c& _( K4 U
  11.         if (quest != null)( f8 B% [' A9 y  S: r% i
  12.         {
    # P, ^* z& Q  p/ u) p
  13.             quest.unload(false);
    & |6 L0 {* k% E7 k' g
  14.         }3 M) F/ l8 r  x8 A
  15.     }. H) }: U: {" [
  16.     _quests.clear();
    , ^' O: C. i# @6 u9 F4 V6 I( e( M
  17.     // Выгрузка скриптов.
    5 N1 M4 Y: n! {- w9 C6 k' D
  18.     for (Quest script : _scripts.values())
    # t. ^  }. \4 i) `) W1 o( j
  19.     {
    9 T+ i5 a( {: e8 Y6 m5 u
  20.         if (script != null)
    : C5 f- Y4 Z+ A  c( \" a4 G
  21.         {
    ) }) p2 \7 o2 l) u, |! `# k  K
  22.             script.unload(false);; C4 ?, B3 e4 k6 e$ I4 W) ^5 y
  23.         }
    ) A. K3 x  r) t1 O
  24.     }' M! s3 m# u, Y0 L
  25.     _scripts.clear();" L) S5 y/ o# h1 v; Q, ]+ i
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    6 Z. S6 f( E0 I2 o; B! q

! J6 T( ?. ^. D4 P7 g$ GМетод report()
# ]- U5 ~. U& G# M
% t' ~) r& j) }0 s9 S1 i' |8 ?
  1. /**) t; W4 s) _: i/ b8 |
  2. * Логирует количество загруженных квестов и скриптов.
    " u2 ^1 e+ c. h
  3. */* ?% G, G0 {" g' l( P
  4. public void report()+ ^0 E$ ?" X! W/ N. L5 b
  5. {: \% p8 D& n* }! Q; U) ^, _3 y
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");+ f+ A8 e0 [9 @" c1 n  T! G
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
      v9 R2 S  i) u8 w* p7 F; w: v" [0 `
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.# g) u) X" c$ _7 b
, W6 Z9 ?. L1 p3 ]! K6 ?/ c. a9 {& M7 J
Метод getQuest(String name)' W6 t& C% X+ |+ d. p. Z

1 E2 m" c2 g( _. Z# M7 B
  1. /**- }; f) z$ X* {) A& \, X( a
  2. * Получает квест по имени.
    , p( d4 ~# i- e8 k" i
  3. * @param name имя квеста/ [% C1 g. q; U7 ]8 x7 [
  4. * @return квест
    ! D3 w( r+ H1 r/ z  l6 C* ]
  5. */
    % `8 g8 S+ o" ^, l
  6. public Quest getQuest(String name)$ y9 V# W: a- x1 y- G1 Z) S
  7. {0 P. f2 e4 z7 [& Z: U2 F
  8.     if (_quests.containsKey(name))# y' @3 K) I4 F7 ?
  9.     {
    . d: j' B# A5 y5 F
  10.         return _quests.get(name);
    , e5 h* s( f, d
  11.     }+ x& I/ U$ \) b4 W$ J4 P0 ]- h5 ^
  12.     return _scripts.get(name);1 D  ^3 l5 k* [6 f  v
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.8 y, V- _. t# j: y6 H
0 A# E; D" D" u2 Q
Метод getQuest(int questId)
& w( Z9 `7 f  b0 _5 n
# N( [) @" G# ~" u
  1. /**( K3 t" A7 C9 |: q" z  j
  2. * Получает квест по ID.
    ) S8 T. {6 M7 y2 y  W% C/ Q2 c
  3. * @param questId ID квеста
    / b  B  L  Z4 Y$ F. [& k9 z
  4. * @return квест, если найден, {@code null} в противном случае
    ! h3 ^& n1 R5 l' o( Y2 Y$ h
  5. */
    6 `' Z( [1 y: Q9 M
  6. public Quest getQuest(int questId): z1 n/ J7 O& T: f. ~4 X: K7 O
  7. {
    % N5 g- a* H; g! ^5 x5 V7 d; S
  8.     for (Quest q : _quests.values())$ w( \% B, t& @; j& c+ S( S
  9.     {
    $ a, Q* c+ L8 l/ a% Q. o
  10.         if (q.getId() == questId)
    6 c$ V9 r! c& y6 _. D+ h/ {' \" L2 w
  11.         {  e8 o0 {8 D" U% ?  s- K2 s
  12.             return q;8 b; X2 R1 z, E  y, U
  13.         }' s' k8 j4 G2 a- o: K. L
  14.     }
    & N* d+ w1 s, y
  15.     return null;
    % @. T5 u# ]/ o& t8 k) H# Z
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.7 V% q) o) ?$ q6 v, }- z9 f1 N

5 k2 T8 y5 s* Q7 B5 EМетод addQuest(Quest quest)
) y0 ~% S6 V* y! W1 |3 f! b% Q) z0 u% w3 O5 a
  1. /**
    # M: W+ k& l, i+ N- m: J
  2. * Добавляет новый квест.) J$ U8 V+ o9 P8 _! \
  3. * @param quest квест для добавления" l0 n  D2 c- q4 [+ Z
  4. */. s' t9 q5 e* @, w4 D4 T$ L. ?7 {
  5. public void addQuest(Quest quest)
    2 [; Z6 F3 B0 l5 u
  6. {) B5 l1 S- x1 N" v6 Z
  7.     if (quest == null)% S# s) ^: F. Y2 T. b
  8.     {- r2 ~0 S' @- \( F. J( }
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    3 D6 N/ w8 r& r' @  U: q) V
  10.     }
    * _6 v1 C3 P! Y' a+ N& t- p( k
  11.    
    1 V  V# |# v5 g' R" }( z; Y4 A& _# V
  12.     final Quest old = _quests.put(quest.getName(), quest);
    + C' e5 C5 @2 F! F3 j
  13.     if (old != null)) k% j8 T0 S) Y: C' S8 x& J) A
  14.     {
    6 D' N% x2 \5 x# C1 ?# F
  15.         old.unload();9 h6 A2 i! W3 b( i) m+ r8 X3 v: Y
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 A1 b: p- T; k  B* ~$ ^
  17.     }2 |9 y: n1 r; z5 E; b, ^" J
  18.    
      m! {4 \* i1 t; P0 |& d# F
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ) S! O- s: [6 x8 n
  20.     {! O% @9 H5 d3 x  ]3 a  J( D
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();/ L! H4 r  ~& b& j3 I2 x6 Y
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* S. w$ L1 }  C. k" T0 W7 f, ]
  23.     }
    - D" b6 @* i  t0 a( v6 o
  24. }4 ^2 _* z1 v/ Y4 w) ?- T
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.3 o) Y* W8 N' o$ `
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.3 T- M; \/ E% R  z

* a' j0 Q3 _" `+ V% w/ W) `! a4 S: F; g4 g- M$ n

+ @& R4 J' _7 S# z7 Z# e
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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