Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius  w8 U! y) C+ p

' |/ _5 o0 g- D+ B, vРазбор файла QuestManager.java+ Q0 z7 T$ ~2 U" j  X  s& m+ k
, ?. l" {6 x: k, ~
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
! d1 M5 ^2 X  |9 pОсновные элементы; V0 G9 K4 i0 ]9 N
  • Лицензия
    # q7 h) g- P* x8 Q2 f4 p4 J. X# H
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      - V+ O6 X* V' Y. @7 U* |
  • Импорты
    / J' c* t3 g* I/ d  @* v# Z

+ f9 e: G7 k, ]2 HQuestManager.java — управление квестами и скриптами.
4 f* g$ E1 N) }! i3 H, O: x& `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
' M: X- N& S# @+ o4 @  f1 Q$ d& R( ]) i* B" d0 B
4 n, M; Y& Y4 v8 O) _& h
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& o& T- s$ }7 s2 N$ {' W2 T& ?
1. Лицензионное соглашение" `1 g6 z5 o. |
  1. /*, V$ u) u; ^& P4 _6 t9 Q0 z
  2. * Этот файл является частью проекта L2J Mobius.1 {, R, ]: `! J" d' t' p
  3. *
    % g: ^0 p+ D0 Z) Q
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять- o9 B" B+ f! L
  5. * её в соответствии с условиями GNU General Public License, опубликованной. N: A! n3 w, R
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    ) e+ `8 j# e2 y. D. M6 q3 K
  7. * . a( p% m" U. S5 ^5 Y
  8. * Эта программа распространяется в надежде, что она будет полезной,7 @  m2 b3 ?9 p+ I3 F
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии6 l5 L7 G0 z) |* z) N  Y
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    0 a% ~  w- L+ O: y/ a" b) O1 R
  11. * См. GNU General Public License для получения более подробной информации.2 C0 o- C* |6 i4 q
  12. * * W* y2 J2 S7 |0 W7 J% b
  13. * Вы должны были получить копию GNU General Public License
    + r$ x' ~0 V+ h; c, q/ r
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.0 A, s0 a: E. `0 e5 K
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
/ J" W- {5 k2 R6 ^! _/ _$ ?( t$ W( k/ l* S- Y8 |! o0 R# s0 L
% k& ^; _, w9 t
2. Импортируемые библиотеки. |& s8 T" w1 Z, z8 F  j5 i
0 ^& t) v9 k& i+ H/ ]
  1. package org.l2jmobius.gameserver.instancemanager;0 G1 V  R5 k9 @

  2. 3 Q5 Y) a+ `( F* c. a9 t$ E1 T
  3. import java.util.Map;
    3 [: v6 b0 N7 B7 z; C) P
  4. import java.util.concurrent.ConcurrentHashMap;4 t0 m) Z# V) K+ s8 n
  5. import java.util.logging.Level;1 M3 U# Y. V" u/ ^- t( |
  6. import java.util.logging.Logger;- K$ K1 _8 l) r. H  }; v0 B5 n% p
  7. $ U, L. u* g+ D; P7 Z
  8. import org.l2jmobius.Config;
    ! s; S1 O0 z7 P$ T- {8 c
  9. import org.l2jmobius.commons.util.CommonUtil;
    - g  y# Q4 d3 m. P8 Q; S- o
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ' `, [) U: C7 H# G5 [
  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 — менеджер для работы с игровыми скриптами.$ f8 ]" z5 S& u4 R/ B# k7 S: T

( _/ O. `: }2 F! w6 C" X3. Описание класса QuestManager* w8 n' M( S0 l9 z9 l8 T! }/ b
  1. /**! T; C3 N/ [" k
  2. * Менеджер квестов и скриптов.( u) u" s& l9 L/ _
  3. * Автор: Zoey76
    2 i. j; g! K, N5 D; u7 D
  4. */4 `+ W1 H8 C6 a% i: E8 p
  5. public class QuestManager
    & M- n! G7 L$ Q: K6 F7 A; L
  6. {6 v% l' c" p. `$ n4 |6 K
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    0 o- w" O9 w$ ~, o
  8.    
    # F6 o1 ^! o1 u. F# E
  9.     /** Карта, содержащая все квесты. */* h' P. A; e6 H7 J/ \( H  L
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) R) g5 w, ]6 T8 s
  11.     /** Карта, содержащая все скрипты. */
    7 g2 p2 e1 M6 B# U+ b
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();: R+ m9 Z9 L; B7 D5 t# g
  13.     $ [" k% r! k( v/ R9 w( f
  14.     protected QuestManager()% J' m- i6 |" |& c8 O
  15.     {) Z' X' y' w- M- L6 B
  16.     }
    - y) y; q8 z1 O" q9 B( N8 e, }
  17. }
Скопировать код
4. Методы
8 L  P; x$ b+ K9 b. d; {% k- r7 C) {Метод reload(String questFolder)
, X& `9 {' e/ ]0 q: S0 u" L
  1. public boolean reload(String questFolder)
    8 n, s4 \/ i% F8 b
  2. {
    ; [2 t' k0 u2 J+ o8 A' x5 k
  3.     final Quest q = getQuest(questFolder);$ q2 J7 K/ h4 D
  4.     if (q == null)+ x0 Y5 k! }3 T) k7 [
  5.     {
    ' _8 f7 Z2 t- O
  6.         return false;! K7 L* B/ P9 g2 g$ P
  7.     }4 c( C6 N( l1 c$ S% S
  8.     return q.reload();
    - x; l# v0 F+ C  s) h: W8 e( p; N$ W( N
  9. }
Скопировать код
" ~( G5 f6 K8 S5 u# q
8 s7 D: ], w7 k( q: E4 Z% t, f9 m
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
5 B3 Y! ]* X0 O3 ~# S9 LМетод reload(int questId)
: n# d$ V6 _# T9 b$ H) n: x2 A- T+ }
' G5 ?" q% `0 ~; r  o
  1. /**
      h8 [) W/ U) s5 [3 _( ], c4 g
  2. * Перезагружает квест по ID.
    1 I% j: c+ A8 N6 h* ]9 O
  3. * @param questId ID квеста для перезагрузки
    9 ]4 S/ \, `! _6 l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае8 A  K$ o1 w4 _) y( e
  5. */
    % n  e1 K) m& l* E7 w) y
  6. public boolean reload(int questId)- L' n& y( H/ ~% R% `/ z
  7. {3 Q" D  g6 v& T5 |* U9 p+ d  F1 p0 O
  8.     final Quest q = getQuest(questId);% v: |1 @5 W( q
  9.     if (q == null)
    5 G# n! s. @2 P$ ~" y
  10.     {  D0 V' _! b$ r, d- d6 M2 U
  11.         return false;8 |5 P6 N: |$ S0 E6 [' q
  12.     }) Q2 P6 N1 y$ y' v5 A, e  S
  13.     return q.reload();
    " {" z9 \( X- `9 y/ o) I3 {
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ! w" @2 I; ^# {' |3 v

2 d* J- J5 Y7 k# o( y% [Метод reloadAllScripts()
" [  @  o+ ]9 }0 s& g2 E1 R9 S
: U4 G& m1 _% h! Z1 o* U; ^
  1. /**9 G% |8 O# d, K* k  o
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.4 {2 z3 J! _  ]  e: k) r
  3. */
    3 M; |3 m  i; q; J5 E3 v
  4. public void reloadAllScripts()
    ( ?) y4 V: p3 D2 c: y! b
  5. {
    ' c: K6 z7 `7 P) a- b2 X0 |
  6.     unloadAllScripts();
    % o( c; H( t* {; t
  7.     ' j$ f( ~$ m1 z" ^
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");1 j0 s: l' V; r
  9.     try
    / L$ p3 B! l, z) V/ m
  10.     {/ g; s+ q- j# w1 b% {5 `; ]9 o
  11.         ScriptEngineManager.getInstance().executeScriptList();4 O$ g1 I* l5 k- f) q* ^* e$ x* n: Z! X
  12.     }1 \# W% E+ M3 X' J3 F
  13.     catch (Exception e)' K% H$ V5 b% K9 }2 k' n
  14.     {
    . P. g7 J0 z7 M( N
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);; Q7 }9 _9 `* Q$ O4 Z7 V* ~% G
  16.     }
    ! z4 Q' O! L! H8 z
  17.     8 l( a% }0 k+ I$ C7 U% y
  18.     getInstance().report();
    $ C. A5 |2 S$ l* Z9 W. v3 D8 x
  19. }
Скопировать код
Метод unloadAllScripts()9 F2 E4 k  u) D0 |

9 T, |4 w; D0 j% I+ Z3 l
  1. /**
    3 u" `1 ^, f5 d/ R5 x
  2. * Выгружает все квесты и скрипты.
    & M2 V' n+ p, |) m' w5 u7 S( j
  3. */7 ^) `' ^9 b  Q
  4. public void unloadAllScripts()
    1 b5 c& s1 f, C9 ?) g& @
  5. {8 }5 W' D  g/ K6 N: Z4 T
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ J/ T. y. S- U
  7.     ( P* |- Z# D- Q3 J3 e# q
  8.     // Выгрузка квестов., H  S# }5 n# E# Z# \6 O$ }# K
  9.     for (Quest quest : _quests.values())
    8 u2 S+ K; Q6 c# T
  10.     {
    + D1 Z2 }/ C* k2 f. N
  11.         if (quest != null)
    0 ~4 n$ F/ o7 C# a; F. Y& Z3 E
  12.         {/ R3 _2 f. }; E2 L+ }
  13.             quest.unload(false);
    ; A8 g0 l- \- S- O
  14.         }
    + Y( D6 ~: q" c9 z7 n6 k
  15.     }
    8 I) H. z/ j( V$ [% d- ^
  16.     _quests.clear();4 w6 g' r; c, Z, R2 y  j) @6 D" p
  17.     // Выгрузка скриптов.
    - M9 k! D6 W1 U, Q" C$ |7 b
  18.     for (Quest script : _scripts.values())
    & r- z% n* }5 u( X7 E- N
  19.     {. J; K# ?5 F2 z, O1 ~' m. d
  20.         if (script != null)  `2 z( P) J: E+ C0 o3 j
  21.         {
    9 i, }( C! B# w$ ]. b
  22.             script.unload(false);" T; y! o- g+ A8 h: o7 [# L6 U4 T
  23.         }7 z4 ~' ]$ L8 z/ }3 r/ e
  24.     }# w; H: E' k; H( @
  25.     _scripts.clear();# {( ]  t9 g. ?, v# N
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.' Y/ j: L! R; e( `" x# }- c% T% y' ~

3 U, d: }* b+ yМетод report()4 }! m* z; t( a$ i: G6 m
- ~( E' w9 h6 @" s
  1. /**5 {+ U2 u8 x& M2 C7 |5 l4 }
  2. * Логирует количество загруженных квестов и скриптов.# z. S( {5 G: X& x' x5 W
  3. */
    3 y$ S! R" C2 a
  4. public void report()
      o& a+ n, n  W& I; r8 L+ J
  5. {9 B7 B9 D) f9 e9 C+ ~1 P8 i
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    $ K' G+ `# ^; U
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
      U" L' `' |3 ]6 c/ t
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ) J+ |3 ^3 O2 |5 L  H6 J0 t

7 l) _+ f5 E" {2 w6 y% Y* tМетод getQuest(String name)
! L! e+ |- z4 I3 C+ S; ]1 N4 q; C. K  j% g5 D
  1. /**1 `' A$ f& T4 h0 q
  2. * Получает квест по имени.! ^7 n( O4 M  p3 G  ?0 K, f
  3. * @param name имя квеста
    2 k8 C1 T0 }) C& E; h$ c) R1 @
  4. * @return квест% f  S+ H8 K/ V5 ]3 x" x( ?# I
  5. */5 ]$ v7 r- n3 |( E
  6. public Quest getQuest(String name). ^# F9 H' T& }  s6 o- d6 f
  7. {8 n& x' S3 X, H$ s' E, l0 x
  8.     if (_quests.containsKey(name))6 o  d6 L4 _* I# k1 ^$ V
  9.     {8 s" k" ?7 r% N6 S0 {* l9 ?
  10.         return _quests.get(name);
    5 C! z- Y1 T& [5 U& g
  11.     }1 J% @) a+ K0 P% @$ S4 m
  12.     return _scripts.get(name);
    7 j9 o6 m7 u/ L' q$ v: n5 q
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.6 J3 W, k1 ~) O! r

0 O4 x& E8 G+ ?Метод getQuest(int questId)
- G7 O" y2 A6 W# G/ J, t) c7 o8 u
4 y/ {: Q% K$ F) n# n. ?0 ]1 q
  1. /**
    3 W* |, l* ^6 U/ A: q
  2. * Получает квест по ID.
    ( m6 j+ e; N: ?1 M% h. {+ j" X
  3. * @param questId ID квеста
    1 e+ Q' ?1 c3 L) u
  4. * @return квест, если найден, {@code null} в противном случае
    , \8 t: l* V7 z4 A; |
  5. */3 x& \; S0 _8 w3 @
  6. public Quest getQuest(int questId)9 E9 O! o3 j2 |! ~% B9 J
  7. {4 k# F3 c9 Y, x0 l
  8.     for (Quest q : _quests.values())" j' E, d( m5 M& X1 \; [) z! E8 \, Y& D$ H
  9.     {
    , K- q/ k$ w% t6 Q
  10.         if (q.getId() == questId)
    6 y" H6 p* z! ?- e
  11.         {8 E8 z! e3 a) H1 o3 d) W
  12.             return q;
    , v. F0 T# r8 i
  13.         }
    5 \* t6 l; V& f; d( ]6 v* _2 t
  14.     }' ]/ y! c8 l  u5 R
  15.     return null;
    8 k) P9 O+ J8 M" ?
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.7 ~+ A2 {, l1 u6 t7 ~; k

* H& o$ M) j1 ~/ m( SМетод addQuest(Quest quest)
) I$ i. |1 x6 C$ ]6 ~) M$ d3 Z8 o$ s. _  G2 n
  1. /**% v5 D1 N, X+ M/ X" I0 v& _& m* T
  2. * Добавляет новый квест.
    1 y8 P* W% w1 o2 T2 q
  3. * @param quest квест для добавления" z& D, F: b: m: \  K6 {
  4. */" A8 G3 ^; O/ W& o8 b$ i0 i/ C
  5. public void addQuest(Quest quest)/ `( s& w0 k/ _% N* E
  6. {4 v$ O0 a, O8 k0 ]
  7.     if (quest == null)
    % K; _: m5 A( g  W/ y
  8.     {
    1 i2 X1 X( {3 a+ X
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    7 a3 O) I) g6 J# d! Y" t' M+ a
  10.     }5 d( P8 U$ k  |; c& Y
  11.     . Q8 u# P. f8 r( Z9 X  u+ s  z" T
  12.     final Quest old = _quests.put(quest.getName(), quest);3 d3 O6 x. \2 p" H4 c' x) x) _
  13.     if (old != null)
    & |' ?7 d, R8 E8 ~& ~# D" _
  14.     {$ O/ C& u& v: @/ E: m+ w, ^# R0 Z
  15.         old.unload();0 B5 s$ N% s6 }- e1 a# x) z' R: r
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 a2 |9 m/ s+ n8 p0 v3 Q
  17.     }
    & ?, @1 S. X! t* \; u5 c1 p# l+ }
  18.     * z$ v, Q" U  v5 {
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    # N* {1 Q9 a9 B- B/ C5 n4 S
  20.     {( j+ I0 t) t$ g6 n! ]
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    6 m: \( Y7 R+ n5 D/ J' t8 `8 ~1 e* f1 ^
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");% R6 I: I% w) P. L+ X
  23.     }6 b" u% w  A0 O- Q3 \3 W- e
  24. }
    ( X( K" z% O5 k/ W& f
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
* C% J' U+ }( R$ |9 [" v8 lЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
. I+ H# _- ?% z4 p
5 s" g* P2 i  Z4 W" H) _
* Z4 O8 ]9 e2 L2 W" [6 l/ Q) L* ?% L" e0 X5 Y& z
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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