Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius+ R. G/ a8 }/ {+ T! v  u

8 ?5 D+ V. I$ tРазбор файла QuestManager.java
  S0 N6 k3 I3 k: d* Y7 d2 D1 A$ D8 D/ H9 A1 T6 X- S- m
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
- q) h; k7 X, ~! a# aОсновные элементы0 P, J: Z& ?$ s2 }& L8 _0 s6 o( w
  • Лицензия' J2 A# [( h0 u! H; U1 P
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.6 I: D8 L3 l  v/ e( L, A+ D! F
  • Импорты
    $ M7 u; e: K# G
, g; A) E) V8 \2 B# s
QuestManager.java — управление квестами и скриптами." P. l5 t, m( D
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
4 u. ~# w7 ?: L' E+ O; |1 M6 n8 N3 [& m& D2 w# t  {% P# {+ s

3 D1 k4 G- ~- L/ m' kДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.; q; i# G' M. P  z4 y8 w4 c2 f
1. Лицензионное соглашение0 p" o- Q  ]( i/ Q4 r% v# \
  1. /*
    5 b1 o( }2 W( j3 k" c( }9 }( ^/ z' D
  2. * Этот файл является частью проекта L2J Mobius./ X! |" i$ Q# x! N2 D, b
  3. * 7 P9 e4 V" L4 n; B' S8 ^
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять# R0 E' R+ n& c, _) ?
  5. * её в соответствии с условиями GNU General Public License, опубликованной6 v5 E$ ~! Y/ ?  k% Z1 i% X
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 {2 E$ O9 J. X5 J1 g% x
  7. * 9 @, \1 d5 X$ E/ x% y
  8. * Эта программа распространяется в надежде, что она будет полезной,
    2 y) U7 S: A3 U8 I9 N
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии8 d! o3 [! ?" L" a7 X$ A2 ^3 k
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ; q, H% W& n5 ^
  11. * См. GNU General Public License для получения более подробной информации.
    , E9 _) ]" C% q
  12. * ' U- t+ O5 A+ ]# C0 {
  13. * Вы должны были получить копию GNU General Public License0 u( F6 @0 D4 Q$ s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    $ N, e  n- @) ?4 |
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
, k* ?' u! t' W  B9 X; v
* ?3 U9 X8 b& B( y- N) J' n: Y4 L3 p" g
2. Импортируемые библиотеки
# N8 y& A( W0 s* t
# T9 Q/ H% Q7 m  Y6 f$ I
  1. package org.l2jmobius.gameserver.instancemanager;
    " ^/ R, F% `6 _+ s

  2. 5 b( y* h9 R4 F6 T5 K& S; Z
  3. import java.util.Map;
    # n9 P0 G6 i) N' N: ^
  4. import java.util.concurrent.ConcurrentHashMap;! A- G) W9 B/ ^# h% t
  5. import java.util.logging.Level;/ x& m; u9 [- l' ~, G( z
  6. import java.util.logging.Logger;
    & s8 H/ o) d# I' ], g
  7. ! Z' K9 e1 a0 j7 r5 N5 U
  8. import org.l2jmobius.Config;' b! b; ~, K* e& X) l: F6 l
  9. import org.l2jmobius.commons.util.CommonUtil;4 A3 ?4 R' _9 I! X
  10. import org.l2jmobius.gameserver.model.quest.Quest;, b6 g  {/ y6 w8 o
  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 — менеджер для работы с игровыми скриптами.
) e! h9 T. ?7 X. Z3 K8 F8 A
: ~  S/ q1 }, T+ W) }3. Описание класса QuestManager$ e$ a7 r0 ]7 B
  1. /**- {6 @% G& G- C
  2. * Менеджер квестов и скриптов.6 W- v; h5 y; q* }: k
  3. * Автор: Zoey76
    & `( h5 ]- j+ G: |2 r! G- Q
  4. */8 _0 u8 l/ R4 K$ ^) j
  5. public class QuestManager0 q( z6 K4 _0 w! f/ e1 M# y
  6. {' X* B7 [* o2 g- Y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    0 w, y* ?* _6 b9 \# y# W4 F% ?
  8.    
    7 i- O9 D5 `" d6 i) Z
  9.     /** Карта, содержащая все квесты. */2 O* I! e5 M1 n' f8 u7 P
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ! u% Q: E/ f* M+ ^
  11.     /** Карта, содержащая все скрипты. */1 p9 ?5 m- q0 P  G; T- J
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    # d- A( s( O6 E8 }1 u9 n- D
  13.    
    ( d- i/ D/ r9 y8 z5 }; w
  14.     protected QuestManager()
    9 d6 T6 {8 k& g1 a  x9 o) f- b; f
  15.     {$ e! }) D5 `& f5 C& C
  16.     }! x" r2 p- W2 s
  17. }
Скопировать код
4. Методы  J  ^* d/ J/ j2 {
Метод reload(String questFolder)
- X* C% W, p. @( j% H
  1. public boolean reload(String questFolder)- U* E# }* z3 |, }+ j# M1 C# `! F- e
  2. {( \4 x+ c. s' R6 K4 M  g' ^. Z
  3.     final Quest q = getQuest(questFolder);! A/ X( p8 v: j. a
  4.     if (q == null)% j" ~8 J) o3 m$ o  T' f
  5.     {6 C# m, r" c$ Q' f$ V
  6.         return false;
    2 K7 ]! Z% S& A2 @
  7.     }
    ; [4 }2 W; e  B0 b! X
  8.     return q.reload();
      w- u0 |3 L& `) ?  ~& s( x! ^
  9. }
Скопировать код

+ y7 e" L$ n* @) ]# \9 T2 u, ~6 c; k2 e( j: }% q( ?* g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 A. d' x7 l! o& l
Метод reload(int questId)
: R" e& V5 Q7 i6 j& a9 ~9 w7 _$ j% P+ d% P- {
  1. /**; I5 S" ]) z6 [+ G! t2 s5 O
  2. * Перезагружает квест по ID.0 b: ~# s7 L1 e; N
  3. * @param questId ID квеста для перезагрузки" r( g$ R: E0 p( b
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    4 |$ i3 h. o- \/ u& z9 K$ A7 h
  5. */+ n' Z) c0 q" R+ m" W& a' \
  6. public boolean reload(int questId)
    9 G  |# X- }! {/ Z9 J! x! P. e: p  l6 e
  7. {
    " Y) \1 J& r+ c& A* f6 }
  8.     final Quest q = getQuest(questId);0 m- U" U8 F) X& ]* ^) X5 C4 h
  9.     if (q == null)9 r$ M6 h$ L) v( `  o7 X2 _7 V
  10.     {
    , X/ g3 e" d" h8 ]# Y- F
  11.         return false;1 W+ \% F* B) o$ S
  12.     }. M" X" \! M3 F  |
  13.     return q.reload();
    : {) x" m6 m6 b) D+ _$ O
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    8 i# j+ w$ R4 l8 B  W+ C5 U

9 ?+ n' _  y: E; ^1 z) b6 @: j- v% ?Метод reloadAllScripts()
; O# y# M2 L2 X6 T
2 I! g/ E. B' Q3 V$ y* q% x. t
  1. /**+ O! g8 w: h0 f6 w% F
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    5 B. y' K0 X' L* P7 O
  3. */
    7 \$ u9 N% G! z1 C& j% A
  4. public void reloadAllScripts()( o: O6 ~0 W3 p' W4 J8 n
  5. {
    3 _" u3 O: K  F0 O/ g( s) W
  6.     unloadAllScripts();
    1 c- ~9 z  Y2 h) S! m$ d
  7.     ! F$ ~6 T7 x" }2 v+ N/ H
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ! k2 c1 s6 M. j6 T
  9.     try0 K) s8 Z$ l+ Q1 k
  10.     {
    : X3 F2 H5 U; Z" q
  11.         ScriptEngineManager.getInstance().executeScriptList();
    $ k8 n: f) m& n
  12.     }
    6 n( \/ `" w- `( P4 C
  13.     catch (Exception e)
    . z; R! R: ~, {+ o' K
  14.     {
      i5 N" F0 V# e7 Q9 @& B% u* J
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    1 J  D# e1 L: E% ^
  16.     }7 m2 c7 {' }, N7 o3 P" F: j: N0 Q
  17.    
    / ~2 j, W& u) B# W+ s
  18.     getInstance().report();: E1 D' Z0 [  ?& x
  19. }
Скопировать код
Метод unloadAllScripts()) W; o2 o# g) o! v# t
. R* D, i6 B" ?6 G0 L$ }7 w" T
  1. /**# ~  |7 ~0 r1 x) I9 f
  2. * Выгружает все квесты и скрипты.8 H% C& [& ~* b1 b9 P6 z3 P6 l
  3. */$ s: i% J; P: F5 v: e% [
  4. public void unloadAllScripts()
    ) L$ K  p) a' c# J+ J
  5. {- T( L* U7 q4 S  C/ T, E
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");+ a& A- W% r( q8 Q
  7.    
    ) L* F, P7 y# r# a- ]- n
  8.     // Выгрузка квестов.
    5 {1 L6 ^, c+ U! [6 Z) `
  9.     for (Quest quest : _quests.values())7 I. B5 A4 n% y. K
  10.     {
    5 u8 `5 @; l/ |- g; g5 E
  11.         if (quest != null)) x% c+ ]) c+ I4 D+ L. ?  b
  12.         {* `3 P' l) x2 T- Q( @
  13.             quest.unload(false);
    % h9 v  o$ S) p; ]* d" P
  14.         }
    ; m) n/ m1 v5 a5 X, X# T. d5 O
  15.     }
      B% E: B$ |) ^! r( _9 l8 G
  16.     _quests.clear();/ [$ ^4 l5 g! w: |6 I; c
  17.     // Выгрузка скриптов.
    / G9 t- |- E5 i+ D; p
  18.     for (Quest script : _scripts.values())
    + w$ c" k4 L+ [  M: E
  19.     {
    . R1 u- i" j. M: k! y7 a
  20.         if (script != null)
    5 o& l" ?9 ]) l
  21.         {/ l% @6 }3 H: q; y" o( {; v
  22.             script.unload(false);3 b2 Z& {, _" @9 ]  u* }# M& X
  23.         }
    ! k; v: _5 b& \. O- r
  24.     }
    ; z: Y1 }; ?4 E7 [) ^
  25.     _scripts.clear();
    6 L$ E8 R8 E. y, k+ E0 i
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    # }$ f! {* b: P# x: J/ s
  a' A5 A8 G$ g
Метод report()# i. [2 O' a8 P

+ `2 w2 O1 g3 Q
  1. /**' {0 y, H9 q/ Y3 r$ [' [4 k. D
  2. * Логирует количество загруженных квестов и скриптов.
    2 L6 t9 N/ z, C* g
  3. */
    . ^2 }+ W- t6 K7 K+ v/ G0 ^, |
  4. public void report()+ i9 K" x. v& {# O1 _4 S
  5. {
    : I' j# a! k! c. f% R5 c
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    8 R1 ?7 Q5 ?/ W" s, r
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    $ t# d2 d% S5 G% e3 X. N
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 q. d7 r1 q! I
; Z3 Y* F' ^5 K) P- U
Метод getQuest(String name)
( K8 q4 R9 i& o* A4 J) R" ~3 z8 d5 p5 [3 o
  1. /**2 |/ r" q5 ?0 `2 i) K
  2. * Получает квест по имени.) z' o3 Z" C* ?; |7 u+ m: s; k! F
  3. * @param name имя квеста
    $ Z, G( A4 G0 ~! f- D6 h: m: E
  4. * @return квест& g! M6 R. F8 X5 f
  5. */$ X& g' v2 N$ e
  6. public Quest getQuest(String name)6 f# K+ Q# _4 Q
  7. {
    1 g, n4 q' L, G4 m; y% f+ j: [
  8.     if (_quests.containsKey(name))7 R9 Z( C! g: n4 G
  9.     {8 I) \0 ?& ?- N: N* V# t$ e& y
  10.         return _quests.get(name);
    + j( A# y" m; x! m: K
  11.     }" Q+ s* B* D; v  i% [1 P5 R
  12.     return _scripts.get(name);
    $ y+ S9 D+ |8 ]) u% z& C* l
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.( a1 H$ ^  \  E" z3 _

& J! N, W) @) B. N2 E) u( d5 _: ~9 p: v0 {Метод getQuest(int questId)" K2 h) m0 K& y7 m: W$ n7 q/ _  a- ]
" J) |1 C8 N5 _# r+ P
  1. /**% g. `% P& T, H
  2. * Получает квест по ID./ E. L1 I! ?5 P5 A$ [. x9 W% q
  3. * @param questId ID квеста
    $ e2 C( [3 P2 @; M6 ]/ B
  4. * @return квест, если найден, {@code null} в противном случае
    % Y. ^7 A. p* r. N
  5. */
    0 o. R& |8 b* p8 ]0 J% o1 N5 ~
  6. public Quest getQuest(int questId)
    " H# G, D7 U: ^  e
  7. {: I1 H$ ~+ N9 _# |) _0 i+ L
  8.     for (Quest q : _quests.values())
    ' D/ ^3 |' J" }& l' H4 v
  9.     {
    / E6 J$ C/ e' ^$ S' I  k  |; M
  10.         if (q.getId() == questId)
    1 `& H! g- d9 c, M
  11.         {6 z8 P) Z' j% o6 a
  12.             return q;3 Z, }: f/ K, q" W
  13.         }2 a$ a  \. C8 i) W! G$ Y
  14.     }  D3 O% j' |9 [
  15.     return null;6 l. G# ~" t* P
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.2 E; l. q3 m$ T' {

; \0 Y: O6 d( M/ _8 f* hМетод addQuest(Quest quest), u: y) u. }3 R  [4 u7 c; @
8 D5 o9 q9 K0 k* C  |% q
  1. /**
    1 v! I  E% O. w  i1 X: L+ M* L
  2. * Добавляет новый квест.
    . c: Q" F" D, ?6 d8 |5 z  {
  3. * @param quest квест для добавления
    3 i+ s' R( D3 |5 K: s
  4. */' r" _6 `1 a' M3 n4 L
  5. public void addQuest(Quest quest)* m7 A9 P0 ?: Q% H( _) L1 y6 c% o
  6. {
    + z  w! }/ v/ R$ U# H4 Q$ ]& v' {/ @
  7.     if (quest == null)
    % F6 H/ e7 U- S  F# v
  8.     {
    4 B# e1 y9 l3 U  ^. L0 a& W
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    2 k% g. \& [+ m3 `
  10.     }' t/ v! S( ~$ k5 `2 n9 m, M
  11.     ! B8 m7 C7 T$ |7 r8 ]" ^
  12.     final Quest old = _quests.put(quest.getName(), quest);
    8 `! u0 W5 ^1 Z3 R! ?
  13.     if (old != null)0 a+ {8 |; w) ]
  14.     {
    - Q! d3 }' G; W5 w: Z! E% D- |
  15.         old.unload();, e8 d, {  K6 R9 ^
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    3 s9 G1 w4 j2 R8 m2 ]
  17.     }& K2 c) V+ l, b! a1 k; p
  18.     ; h0 Z9 x3 {4 d% e% |# X/ Q
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    $ F6 [; x5 t0 t0 c  J- H
  20.     {  E3 M: E9 H: v1 Y9 I9 a5 e+ G. c
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ' E7 |  p# A( a
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    $ ]8 N4 ]( b! T- M8 E4 P) j
  23.     }( g1 R1 f% i8 z% h. o# x6 a. {4 X
  24. }
    9 P0 S8 N8 l9 ^; q* z! K, b
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.. ?) V5 v# L1 ~) a' _# [! j, n
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.* v7 g! _7 Q  f7 O- q- T  x% e
. n- c, l7 p7 c4 R! }9 ^# y6 E, k! h: @# c
! \( C$ W' [6 L, u. I
9 H9 y3 V% M2 x. W# V& q8 ~8 d
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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