Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius6 h6 Q0 u: o* E

6 {2 X0 I% d! A7 M& E) |* r5 bРазбор файла QuestManager.java
9 P, \9 l2 p: V' P2 o2 k8 X3 L, V4 k2 s1 g
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 d  p2 L3 g2 n2 d- [
Основные элементы
+ t$ U; C# E1 {7 O& _
  • Лицензия' G" a, V1 _. ?& B6 b) Z
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.3 U" i& K% z1 e2 X
  • Импорты  O( q( h7 U$ m3 w/ P
3 h, ~9 Z7 l0 [; ~3 d
QuestManager.java — управление квестами и скриптами.
% s; g- h: H6 B1 k. u$ uПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 v6 H! K% W$ b+ [2 e% y  b

& g  E5 G6 N, P

5 I# ~: v1 i8 L$ w% ]9 uДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
8 k* {2 e) B: w( n3 Z% H4 y1. Лицензионное соглашение, V6 B6 m1 C- K! J
  1. /*, U6 q2 q9 o/ H3 z! F% {7 x
  2. * Этот файл является частью проекта L2J Mobius.
    7 g, D, n: `2 \% f4 R
  3. * ) c2 T, l5 k+ ?2 x
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" ]) P$ S& P& B5 r
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    $ T8 k$ H' K2 D" D5 n( s$ h1 S, |' C
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    * `/ G) h& ?1 O7 ]
  7. *
    ( U( R# p, x# \6 Y' o
  8. * Эта программа распространяется в надежде, что она будет полезной,( Y. G5 _" A  Z, N9 w8 Y
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии$ B/ t1 F: y: f% i" m5 G/ n
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ' I# S2 s1 I& Z4 O  A
  11. * См. GNU General Public License для получения более подробной информации.
    : z. Z6 c9 ?9 z- X* ], i: m, g+ c1 h
  12. * $ Y* m& F0 M& [! ^+ l8 D. Q
  13. * Вы должны были получить копию GNU General Public License# `  w/ n- _7 B3 N: c3 s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>." x' t: G6 ?3 T% `; q5 g$ ?0 K
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, V" {& \8 _+ }% ?# ^. g' ~; t1 B9 A3 [& C. [2 u3 r. i

; p1 x5 I7 N& I# z2. Импортируемые библиотеки
: C+ z* n0 U( f7 v5 I- A& m; T$ f' S4 [/ H- s! w
  1. package org.l2jmobius.gameserver.instancemanager;' d0 x; H, X& U) b+ V

  2. $ ]' X! H, N* U$ g7 K0 O: ^
  3. import java.util.Map;2 n6 i3 T: r; ]- D; N* p
  4. import java.util.concurrent.ConcurrentHashMap;
    . Q' C: F  h% s) F9 J- o
  5. import java.util.logging.Level;( q9 j, T4 W9 |7 n* L6 a
  6. import java.util.logging.Logger;' Y  {3 H  @: y' k+ i' }& w
  7. 9 |6 L8 }3 V  Z* C  l9 o0 P3 y0 ?- W
  8. import org.l2jmobius.Config;
    0 V5 s5 f/ `' d# V0 ~
  9. import org.l2jmobius.commons.util.CommonUtil;
    , P8 X1 H- I: W* x8 _1 A7 I
  10. import org.l2jmobius.gameserver.model.quest.Quest;3 w: A7 ?7 O1 x2 g) w/ {
  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 — менеджер для работы с игровыми скриптами.8 @: z; Y: k2 o3 k7 P% k& J
8 E! V# p& t6 M3 {- t/ L
3. Описание класса QuestManager3 L$ g' N, M1 b& r
  1. /**
    - `* y% v; U1 ], E7 [
  2. * Менеджер квестов и скриптов.
    - z$ K. \0 \8 K4 m1 F
  3. * Автор: Zoey76
    / u& L3 s$ ]4 \0 l" U$ n7 c
  4. */  k! F1 l1 G. O6 z- `
  5. public class QuestManager
    . }" w1 ^( b! y4 x8 Y
  6. {- p- E2 x+ K3 m5 S2 F( G( _! c
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());5 U/ h( r8 q' J
  8.     0 ~) R- W) x# `$ X' B* E
  9.     /** Карта, содержащая все квесты. */
    8 G' v& [0 x' f' J* M+ I
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();  t9 q' E. n3 Z5 S- D3 F) o
  11.     /** Карта, содержащая все скрипты. *// j0 p9 M2 T0 a* r
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% f$ u: P( k" s4 D
  13.    
    % `5 O9 V- P: Z, d5 d
  14.     protected QuestManager()
    5 g" l8 X* h% V  R9 s  c0 Y: D
  15.     {
    / z6 y6 k# |: G' ^. C
  16.     }
    # @% k3 n6 C+ L' ?0 P2 b* l& s) P
  17. }
Скопировать код
4. Методы
( f/ ]. P% J! Z) K( cМетод reload(String questFolder)$ |- Z& x3 u5 T, k
  1. public boolean reload(String questFolder)# E, n, s" {  X3 t1 Q# N
  2. {" [; _' x6 h7 `9 P8 D
  3.     final Quest q = getQuest(questFolder);8 I; O' c& [5 j+ y  Z
  4.     if (q == null)
    + y- X. \; x$ g
  5.     {4 Y; c# [8 ]$ o" D. ?2 F* ^5 Y. n$ O
  6.         return false;  I/ F+ Z! I( t  p
  7.     }
    $ z  \; M. T2 D: k( D9 a" p
  8.     return q.reload();
    $ e: O- H; p/ w0 {  D' c
  9. }
Скопировать код

8 \/ i4 M/ M9 }9 r( K! V2 N9 M1 m, n8 Y
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.( \: A6 A! C9 j1 M9 y
Метод reload(int questId)3 E; @- C4 g4 S9 e  N. c
8 c0 N: p. s; c, M9 G. ~8 H
  1. /**
    : ~5 ^' ~* T/ k* l9 q' S
  2. * Перезагружает квест по ID.) X+ f) N. }0 u8 |5 C+ v
  3. * @param questId ID квеста для перезагрузки; x* U$ L" T# P
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
      x, B, K( u! n! t6 j
  5. */# C+ _* }- C1 w. ~3 {
  6. public boolean reload(int questId)5 E: A* g, h- {# ~
  7. {
    3 `6 ~; q. [+ d+ z" E1 ]" x
  8.     final Quest q = getQuest(questId);
    4 s7 _+ s/ X0 ~
  9.     if (q == null)
    + c& D  e9 ]8 m% d( J: N0 Z! ]" N. d
  10.     {
    % B! h8 x4 a4 h& N$ y
  11.         return false;% O/ q& ?/ H; v
  12.     }
    . I# j, O  m+ X& j& s- P# V2 f
  13.     return q.reload();
    & M* G5 A' y$ k! y5 ?9 b- \1 D* V
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    3 A; o. H# v, t' S$ d
0 J* }) U  x9 j) m& ?- r/ k% I
Метод reloadAllScripts()
; N5 J% J. X: ^. [0 c/ m& X+ S
8 P8 m6 t6 K6 Y) x6 M/ y, l' Y, D
  1. /**
      _/ }  R' s, t1 \% _9 T
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.7 x" R/ L: ]  _, H3 s
  3. */, N' m  H2 \& K1 ?( C
  4. public void reloadAllScripts()
    & D9 j- f* p1 B- K) f
  5. {
    1 ^7 \( L0 {" ~( G. Q
  6.     unloadAllScripts();
    ! h4 k: J( h+ m/ B1 _' X# i
  7.    
    ) Y: b. i5 O" u! A6 I6 [' E
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    + Q7 j  y2 e  X4 S" l- E* R0 l
  9.     try$ y- O& T( Z; o4 _" s) s
  10.     {- y/ U# f9 `' N! U  L9 ?# w. w
  11.         ScriptEngineManager.getInstance().executeScriptList();
    + w/ P- ~3 w; y
  12.     }
    9 D: R  U% F: w: G1 l. R
  13.     catch (Exception e)2 x" P# m, u$ f/ l) |
  14.     {2 q  U' q! p  h. q( {
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ' b+ z" Q# T' X' R1 K
  16.     }: g5 i) z8 Y% R% y
  17.     . W8 ]: t+ i. s3 T
  18.     getInstance().report();+ w0 u; C, F& Y9 c- J' x
  19. }
Скопировать код
Метод unloadAllScripts()* U: |% P5 H( m: ?4 j- m' F
# m" Y4 o; o: P0 n+ u$ d
  1. /**
    - g* s1 a7 \$ ?
  2. * Выгружает все квесты и скрипты.4 |& X. G7 l3 s1 f2 x
  3. */( p0 {4 u4 B6 s" t% T" h) G9 ]/ F
  4. public void unloadAllScripts()% f' X: _+ [" g- l9 A
  5. {% j* [5 F2 h( u- h
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ f1 v9 B% v  a5 J
  7.    
    * l  k4 Q+ [# V6 m2 V! Y7 b
  8.     // Выгрузка квестов.- }0 l. V& R7 N, J
  9.     for (Quest quest : _quests.values())
    1 Q4 f9 f1 k2 L/ g: s
  10.     {
    0 D! r  D1 h  k* f* I2 L0 K4 X
  11.         if (quest != null)
    1 E- O7 K, O: O: a" x2 x0 g
  12.         {2 x7 Q0 A/ m, X/ q2 m
  13.             quest.unload(false);
    % J. Q& A/ \  X+ }9 O! f1 f) u. t
  14.         }# a4 i* S. `. `. e# t
  15.     }
    / J0 p! Q! W1 P( [$ _7 q
  16.     _quests.clear();/ Q6 Q* G8 @# w, Y
  17.     // Выгрузка скриптов.1 T/ E# D$ p4 F; w
  18.     for (Quest script : _scripts.values())
    & l& W( B5 b9 ~6 X: g
  19.     {/ ]$ c  G1 D% q) M8 {# }
  20.         if (script != null)
    1 E9 w+ p) X; p( H) v8 T/ c
  21.         {- A5 w! }7 S, i$ i
  22.             script.unload(false);  t  M# M1 t, F# S" _
  23.         }
    ( V/ I7 i+ T* x1 I, i
  24.     }" u6 }- o* r( ?+ t2 H# q$ x) z9 f) Y
  25.     _scripts.clear();
    ) S. p* i4 I( `- h3 w, G2 _3 |
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    , N# W- T, \+ t" _4 E
5 }+ I7 R( k9 A1 B
Метод report()1 D, d! @) I9 h* [  O2 J0 W% V# B

$ t, s) l( n( m0 V( u0 ^
  1. /**
    ' u5 x2 S/ B  E9 O$ u  o5 ^
  2. * Логирует количество загруженных квестов и скриптов.8 p% X+ w2 b5 {/ r; X. h  F* x
  3. */
    # O, h, k" M. J4 v% z
  4. public void report()' x% R7 \; K0 f* A( `# X8 B
  5. {; o+ N! }: z0 l6 ~! m
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    8 w$ {# U6 W" g
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");8 D, ~9 D6 h0 x
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    ! T! P3 j: a, T+ m3 d, u- |
- N. d/ e5 S! a; c: p9 O. \. ~
Метод getQuest(String name)
. K. z7 L# ^3 Z' J4 Y8 \/ b" N# \3 n' |2 ~
  1. /**
    & o# _5 q7 w+ L- W6 g3 l2 Q" H
  2. * Получает квест по имени.% \0 N# L( h2 \9 ]
  3. * @param name имя квеста8 ]6 ^$ G7 @1 }
  4. * @return квест
    1 v+ ?1 F& o7 L- S. S* |% b/ m
  5. */8 I! D& ?* R& B1 ^
  6. public Quest getQuest(String name)( N- }. R. y' Y; n+ A4 ?
  7. {
    $ {& g9 W2 x. e0 C' K' O# x
  8.     if (_quests.containsKey(name))3 g  I6 {. Q9 }6 W6 {4 H
  9.     {9 i: Y, G4 a% v% w* B% C
  10.         return _quests.get(name);. J0 ]% U& [' U# Y5 m
  11.     }3 I& p  }: H% g" r
  12.     return _scripts.get(name);
      ?  [2 \, B- D, Z' F
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    5 L# z/ }$ ^) f5 ]" ~
) @. D2 E# |2 z/ R$ M
Метод getQuest(int questId)
1 m( R1 \8 S8 q; @! f
0 a, W/ q: Y; I
  1. /**1 u" b0 I" Q. f+ F: b1 w
  2. * Получает квест по ID.9 l3 D. g5 w3 `
  3. * @param questId ID квеста* c2 h6 i) F/ z- E, q
  4. * @return квест, если найден, {@code null} в противном случае0 e* Q# A9 D9 B# F
  5. */
    + @6 d6 q, F" W- \# Y
  6. public Quest getQuest(int questId)
    0 E: }7 V$ P8 x# u
  7. {% G5 G% i$ w- X7 v% H! |5 [
  8.     for (Quest q : _quests.values())4 L$ F1 e. z( i/ s" R, e. x
  9.     {
    2 v$ p% g! n+ a
  10.         if (q.getId() == questId)
    0 Q* n' r: m; q8 L# J' @: Y
  11.         {
    $ X+ q4 i$ V; v( s
  12.             return q;
    & s2 I( g! m/ A- H* x: T1 U7 m
  13.         }' b  N/ d, k; `+ G) p
  14.     }8 s% E) }" E8 ~: ?
  15.     return null;
    - ~- S# E" i/ f' X5 {; |
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.. h  O- ]. i3 k3 |, T! u" c; {
  W6 _% d4 t2 @! J
Метод addQuest(Quest quest)
8 `4 \" e' F! W/ @4 C: E. r
9 n5 A6 Q; y! k, Y2 B  s0 i
  1. /**- ~" i2 y2 ^( A. Y% q
  2. * Добавляет новый квест.4 q; o- ]& }# z$ H
  3. * @param quest квест для добавления( b5 x$ o$ K' O: g9 Z8 Q& n
  4. */& A$ v! f% q1 v
  5. public void addQuest(Quest quest)
    ! D( E& H/ a* F% E* c  D8 n
  6. {6 ~2 f  o7 x* B& p5 A( h5 N# `, j
  7.     if (quest == null)2 z2 ^/ n+ t* J
  8.     {
    / d1 P; V. z" U6 q8 k, L* Y
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    + n1 U" ~: \* b0 N. z6 k2 O
  10.     }
    2 `9 Q" E4 v: b& u& b* R/ r* e
  11.     1 u8 h  A0 x: N$ N: I9 m/ D
  12.     final Quest old = _quests.put(quest.getName(), quest);0 X; }# Q2 W0 r( [' [
  13.     if (old != null)( s( R( N3 |* O2 s# S# ^4 o
  14.     {
    6 L9 Q) H' r2 K7 d
  15.         old.unload();
    3 `8 p4 R$ X! Z0 q: W- o+ ?$ l# p
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    ) {" u" O  Q; [* m
  17.     }
    3 h' w/ u8 J$ A' E8 C2 [
  18.    
    7 r( m/ D2 {) H) j. ?
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % K5 v3 i% F0 V% R$ C
  20.     {
    $ E8 t$ B0 ]$ a+ {$ l$ A  Z: N2 ^; F
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    + d3 S$ q: |: d! O7 X6 h
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");5 X" C' j- K  r$ M; D
  23.     }
    8 D) b6 A6 g; h: p& d- j6 u; B
  24. }: n& N, E# H% Q9 b
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
! b) w* J5 Q4 r) v5 v6 x7 R+ dЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." A8 S: j; p( Q( E, }! U

' f# Q$ c' Y; ?! k
, d" {% H+ B# v( O- t2 O3 K+ N! F$ M* b/ [; J- M& y
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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