Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
, o% s5 z3 S; p
* e% o2 i6 |9 ^6 HРазбор файла QuestManager.java2 z% z2 M8 R/ D* W+ D( @
  W8 O/ d. r4 V/ J6 V( }
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.  g) i/ [% N2 h5 u9 y; g- X
Основные элементы8 S. S# M& J) t0 s! j! k( }
  • Лицензия; ]3 Y4 L- D' v; F8 x# O8 j: a
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.. x( l: U0 P/ K! r# _5 |9 G
  • Импорты
    + [  i8 V3 z& f, r5 b

4 s* A4 G" g2 F3 ~( f8 i$ e# \QuestManager.java — управление квестами и скриптами.
3 _! h. u- i0 Z1 ^# wПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) [9 n5 s/ j! e. i2 g9 n; M: F+ @; X( r0 Q0 c; n3 I  }

0 b( \9 [0 J, K: C8 S' PДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
+ r* r4 g; K" x9 L1. Лицензионное соглашение" X* K6 M% g4 x0 o- Y  @
  1. /*
    ' t4 l5 t6 y1 z$ a; s, i6 \
  2. * Этот файл является частью проекта L2J Mobius.) N# @& V0 P  a( r" x9 M9 K# \
  3. * + M8 u9 _9 T7 g- y4 \& n' S
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    * m5 `% e9 h6 K* ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной; a7 R; V& z1 [: f
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 g9 N+ O" h" R. F3 a5 m* o
  7. *
    6 A6 M2 w: u% s& N" R' g; V8 C; W) Z
  8. * Эта программа распространяется в надежде, что она будет полезной,; t! I$ f% G8 n1 e) G
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии& c# r9 q* D6 `1 ?& {
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& E1 s/ y' Y) F# u
  11. * См. GNU General Public License для получения более подробной информации.
    1 t* x7 C9 B! o0 g
  12. *
    , O6 U) v" n6 I5 J: o6 {  d" C* |
  13. * Вы должны были получить копию GNU General Public License
    . F* u5 l7 H' [; I6 V; w2 G
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    / S+ Z! f  S! J$ ?) w- E) V7 K
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.; }8 h! [7 u: N4 L

% F4 O2 [) O; }" F0 Q, F1 l2 O1 Q7 _9 S/ l* @0 _9 B5 c
2. Импортируемые библиотеки+ H/ _$ Q9 z6 t) ^6 @5 v
& @, n  R& Z: n
  1. package org.l2jmobius.gameserver.instancemanager;* d6 Y4 ^4 x7 l$ `( H: a9 [# \

  2. 7 F$ {8 z/ i, Q! v7 A8 F" v; O& s
  3. import java.util.Map;
    4 g  a# e& |3 f& d8 \5 I
  4. import java.util.concurrent.ConcurrentHashMap;
    ' |& h$ I. B0 l5 K- M
  5. import java.util.logging.Level;
    : ?  V4 w  Y0 Z# v
  6. import java.util.logging.Logger;; f6 }4 [. ~3 t5 M4 R$ @# K

  7. # P9 Q* P9 Y! _" O6 W% C
  8. import org.l2jmobius.Config;, Z' O$ ^9 g/ W6 g. C# Z
  9. import org.l2jmobius.commons.util.CommonUtil;% \1 o( b; e. C; H& q. k" p/ ~
  10. import org.l2jmobius.gameserver.model.quest.Quest;8 V" |9 s4 i8 q3 x* e5 y
  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 — менеджер для работы с игровыми скриптами.* [, `$ Z( u* ]: O5 J

. E" I6 Y, A& y; J1 k3. Описание класса QuestManager8 K" T2 b  ]% l6 b5 K" H0 h
  1. /**; x5 x- }) i( B/ T) m
  2. * Менеджер квестов и скриптов.' ^: v4 X6 d, N3 {7 y/ b( C0 B
  3. * Автор: Zoey76
    + Y; C) [! M8 b. b9 @, b* p
  4. */
    7 I9 I- Q- K! Q: Z6 |: [6 Q
  5. public class QuestManager  Y% M  Y# k2 d4 ^7 e8 H
  6. {( d. S* O) A* J8 i- ^+ i/ G" F
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    $ L2 V' y8 O3 _1 Y5 T9 D* ^- b7 ~
  8.    
    & V0 O3 d0 L- m  y- z  R
  9.     /** Карта, содержащая все квесты. */) @( @, s$ p& c- P" m
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ E! I# O( [3 ]* }+ L
  11.     /** Карта, содержащая все скрипты. */* E  s3 I2 d; J0 D: ?4 y* D! y
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    7 P* S7 j9 B) l- u; z, V
  13.     9 Y5 g; r  ?3 Q+ t8 j8 |, l
  14.     protected QuestManager()9 b" n9 S8 i5 B$ h8 |- O
  15.     {0 k# {5 N2 E, P- \# O# u0 Y* w( x5 _
  16.     }
    / V  m) }* m$ N% }& b! Q: O
  17. }
Скопировать код
4. Методы4 {4 C1 U1 [9 X# R7 Z* r$ w! E; b
Метод reload(String questFolder)3 f. b. A  R/ l+ {
  1. public boolean reload(String questFolder)# Y5 D' L! u/ ^% b
  2. {
    ! O' }2 P: h! Z' n+ v$ D
  3.     final Quest q = getQuest(questFolder);
    : c8 z( j; n5 e( e( j
  4.     if (q == null)& v3 A/ r1 F( N; P
  5.     {
    7 A9 I; K. k( F( R% p
  6.         return false;
    ( d* M1 }/ ?6 r9 c7 m4 m
  7.     }. T: m3 G2 I+ g
  8.     return q.reload();4 q# ]1 F0 [" H& ?# \0 m. T. U
  9. }
Скопировать код

  Y6 t5 u$ }9 A
; g$ p5 |, c1 ^  g) YМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 J2 C/ p" U8 }  x4 n7 P  l
Метод reload(int questId); N; H, B3 F, m# S* G

' J3 }0 n! d  g# j
  1. /**
    3 Y# z( r% n3 r) e* R
  2. * Перезагружает квест по ID., a9 N/ \+ Y6 `' V+ B: K
  3. * @param questId ID квеста для перезагрузки% D3 q% Q" |2 f0 s8 G! U
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    / b+ C; {$ ?# C' S) Q0 F. P" ?
  5. */8 R  v- V" q, z2 I
  6. public boolean reload(int questId)! }& q  A, z/ S% n/ _! ]2 }2 Q1 {
  7. {
    ( {# h, @: Z# L
  8.     final Quest q = getQuest(questId);
    # X1 W/ Y/ L, n0 b# Y. p9 _
  9.     if (q == null)
    0 K( i3 K/ U) I) h; k
  10.     {
    + L7 Q  ^/ H  |+ N
  11.         return false;& R+ Z6 a; b+ l! e, e8 ?
  12.     }7 M( x% ?9 T+ E$ V; ?$ |- Y
  13.     return q.reload();$ D% f9 M1 f$ Y# L' ?' y$ R8 z
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.( c# i" x) h% n- \6 y1 h# Y' a
7 L, ?6 V2 a- B" C  a4 L4 j
Метод reloadAllScripts()
+ Q: S: F+ g6 i* x& s6 J9 m! c# g+ }( x: ~7 ?6 R1 O/ @  m
  1. /**; M" e4 P4 M: P
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.$ `3 l- _2 q3 Q6 |4 u
  3. */
    # S$ n2 K$ ~: a
  4. public void reloadAllScripts()9 r' w. X. N0 {( Q
  5. {
    2 z) ]" m# V4 s2 w% s; t! w
  6.     unloadAllScripts();$ i! U+ [% H6 M' J7 l) E
  7.    
    6 s, a  x1 Q( Z" [" p1 o
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    4 `: q. I7 z6 o. _3 T
  9.     try
    7 U' Q$ I/ L* c) F0 I) N. P
  10.     {3 W' A$ ^7 R& E  Q+ Y+ }9 y
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 o+ s1 B& i5 _/ T
  12.     }% [3 r/ S' q! f6 t- ]
  13.     catch (Exception e)" H2 E& v, v1 {' ]; N3 N* e
  14.     {
    2 k2 w$ q7 @0 v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ' Z" [) p# h& t6 D
  16.     }  E2 S& O* W; }4 k' a0 r* c
  17.     ' H" w+ o' g9 ]6 ]3 j
  18.     getInstance().report();
    * K6 r( I% C5 D- }, H
  19. }
Скопировать код
Метод unloadAllScripts()) O, y( R# o; l. a! |
& @5 R: U- F) M# b7 a8 r
  1. /**
    + i. ^4 M: y6 @+ W9 j
  2. * Выгружает все квесты и скрипты.7 d' r2 r: {$ g( o- u( i3 C
  3. */
    9 o6 E$ L5 Q- B4 T7 x* K
  4. public void unloadAllScripts()7 o: t. d7 Q+ Z, j5 @( |7 X
  5. {
    5 |; l' x) N5 A5 e
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    / o" h0 p6 E! X3 O1 H% H; m' H
  7.     + Z: S+ u0 z/ W, R3 T5 B2 o
  8.     // Выгрузка квестов.+ P, K0 I' B( `$ G/ v# h0 K$ m* O  O
  9.     for (Quest quest : _quests.values())
    ( @* t+ _7 O, Q9 m4 ~
  10.     {
    - Q0 K3 q1 h1 I- F5 l
  11.         if (quest != null)1 t4 Z/ Z7 s; P
  12.         {
    : C& T; y7 }6 u9 G
  13.             quest.unload(false);+ K8 g$ P  q/ _. j2 t3 }
  14.         }
    $ C/ p" F; t* H& @8 \
  15.     }
    + F/ b' Z! F: _# F7 R  `
  16.     _quests.clear();
    4 h8 \* s6 E8 m$ o: K
  17.     // Выгрузка скриптов.
    9 E4 m1 f2 u* P
  18.     for (Quest script : _scripts.values())+ ~; O5 i% P* j1 h  D
  19.     {
    - H+ ^: J9 S4 ]7 Y
  20.         if (script != null)
    2 s5 U8 [% ]4 y% G6 F
  21.         {* K) E+ y' f" H) V: \
  22.             script.unload(false);2 J; {/ u0 b1 B+ [4 x
  23.         }
    , \+ M! Q* S% s& v: V
  24.     }% C6 Q7 g3 I. C* U
  25.     _scripts.clear();
    * Z1 S; e7 R# E
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.% C/ o  J7 M" h7 r1 |2 E
" V7 [3 P: e( m) C
Метод report()
$ d3 C7 t2 I5 O
& C$ ?0 U; L6 {& B6 g  r
  1. /**
    1 S. t, p9 G( O7 f5 B+ \/ H1 U, h
  2. * Логирует количество загруженных квестов и скриптов.# Z, q' E, r" T# v+ D2 T! J% |
  3. */5 X+ o$ t8 z4 F$ v% z7 Z, q) G% D
  4. public void report()
    9 i  @4 Z3 m- g; k
  5. {
    ; w5 `' u9 H$ q: i$ L" t- j- w2 a
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    9 H$ r1 t2 ]; L' E$ o
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");! X1 E; ?& E% ~$ m' r- _: _
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    " F0 ]" R# M7 k! P

; H, K4 n5 e" D' VМетод getQuest(String name)
6 ?3 N& [9 C7 J( g) H8 k
) j7 M4 f0 S% p$ a/ U
  1. /**' E0 b% m0 j+ ]1 N, L4 l9 U! D
  2. * Получает квест по имени.1 H% r' l9 b9 L$ z. c) g
  3. * @param name имя квеста
    3 M) W2 x: I3 f' C
  4. * @return квест# _) f+ ~* C# V3 @
  5. */* ]1 ^* V# Y' n; e* M" L' H
  6. public Quest getQuest(String name). x( |3 [* K$ X# j3 W. C6 A: E+ t: e
  7. {
    " D8 t) M/ s# d1 b) M9 _9 `- Z' y
  8.     if (_quests.containsKey(name))
    ' W, M7 _% @, L7 q
  9.     {1 \/ U9 G+ B+ r7 H6 J: I# o
  10.         return _quests.get(name);
    1 I$ r" O% l- }6 Q$ `1 _/ y! ^* `
  11.     }
    - o8 ^, O1 P# o- Y5 D
  12.     return _scripts.get(name);3 W2 d, [* D6 |+ T7 y
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    & d0 L8 h- s' C# s3 i

* n6 x( z# ]/ `' g, aМетод getQuest(int questId)- t% A9 C+ x- u$ a% Z0 k  W

9 Q2 R) V' m7 _5 n
  1. /**7 ?( T' S+ D- G1 j3 b7 Y
  2. * Получает квест по ID.& h  n7 o/ l# C: @* O2 z  O; m2 U. z
  3. * @param questId ID квеста3 ^, T5 t+ c0 H; i$ z$ v- x
  4. * @return квест, если найден, {@code null} в противном случае( `( [" X- L3 j2 y& q* k3 P0 X* a
  5. */- ?* }4 W* P9 J
  6. public Quest getQuest(int questId)0 q! R! Z" N2 I( z0 U
  7. {
      I9 N' Q5 Q& P4 c9 F9 B
  8.     for (Quest q : _quests.values())
    - ?$ K/ n5 |' M5 I7 T8 s
  9.     {
    / e9 V- ?" M* H4 m& Q9 Q
  10.         if (q.getId() == questId)2 `* _. c1 x5 t3 e' ?/ B
  11.         {9 V) M, H9 n3 d, J) _. @$ K
  12.             return q;
    0 H6 ~5 n/ ]- R( z; V
  13.         }! \5 C2 |0 f, Y' K9 V+ l
  14.     }
    6 r" N, P) _4 S, n8 V$ x! y+ v
  15.     return null;
    * ?. n# z/ M+ `' W9 f
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.3 `! b, t5 q; A* ^; P

" i2 ^9 R; m1 \Метод addQuest(Quest quest)2 G. i- y# _& H0 o7 ~) t+ H' Q4 l
. w& w( h$ S/ o: O' f, T7 {
  1. /**$ ]0 q. t0 V" m% \) h& l
  2. * Добавляет новый квест.5 G! ?- }9 O3 m. [# ^. }! A) s* }
  3. * @param quest квест для добавления
    8 |* u9 }# Q, ~3 I- j* s0 E
  4. */
    + a3 W9 B3 q/ s) Q; [7 s. [1 O$ j
  5. public void addQuest(Quest quest)
    & ]3 g) z& Z7 n' [
  6. {9 V9 _3 q1 O0 D# ^# `2 U: V
  7.     if (quest == null)1 l, r! K9 e1 e. Y3 t: X
  8.     {
      }7 a" L' w5 v0 E2 j/ K1 M
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    # ?3 p  I; L$ ~1 e8 ^$ R
  10.     }
    ! m- u/ ?$ ^9 D6 z1 T  I2 R
  11.     9 I- N! T' d. n# E& T; d( j
  12.     final Quest old = _quests.put(quest.getName(), quest);
    ; o  Q1 [3 `2 ~0 Q
  13.     if (old != null)
    / n9 o  |8 J2 \+ a' ~
  14.     {
    ! s% U0 l0 k. X) _! d( m
  15.         old.unload();
    ' x' D$ \. X$ p4 A) U) F
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");1 {- Z1 b9 ?! U! o) w6 _
  17.     }
    ! S3 P6 N( X( D* Z, Y" ?
  18.     ! I2 A& A: O1 V. q
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ' @1 K& P& {9 g7 J- N+ ^
  20.     {
    ! R. [" q, [( P, l* F" P
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();- `: z2 p# M0 W7 z1 I+ h
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");/ ~' R7 Z* t: f2 o& O
  23.     }
    1 H2 a9 T# [$ T. y
  24. }
    8 b) ~. I. q" i
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
  J! o( V9 D# e. gЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 n3 o1 ^5 x% N& w: s) F8 {* R0 y# I; l( z/ {0 z$ Y8 n
: e2 R6 h) r  r5 n( a
1 P9 k; p5 P1 n$ S* ^+ e! H9 l
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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