Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius5 r' Y0 {; ^. x% M
, Y2 J+ m5 P! N. ^6 X# I
Разбор файла QuestManager.java% ~4 Z* v% a1 `

0 k1 {6 z# l% u6 _2 U3 fЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
1 i; H! h% N% Z4 }$ _- OОсновные элементы
/ e! x* [: A/ f+ t% g; {$ U
  • Лицензия
    % f6 [. Z0 ~# J" t4 m3 `9 Z2 q
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ! U# X4 {$ Y/ J2 Z& M
  • Импорты9 J' K) d  K# @7 s2 t2 e

1 j3 C8 I9 C8 ^+ Z7 _" q6 cQuestManager.java — управление квестами и скриптами.
* O& }+ E/ E# G! k/ X: m, n: SПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
3 J7 ~; x% {' F! I. A0 Z) U, U& E' [2 [

! k" d% {1 g) Y* [3 RДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! Q  Z) ]# n# n9 ]6 o6 r
1. Лицензионное соглашение
/ V* \2 B/ R2 O$ l" l) f) Y
  1. /*
    ( c0 L1 u0 I1 z) u( C9 S. f/ b
  2. * Этот файл является частью проекта L2J Mobius.
    4 Y; @& S7 d& j/ E$ o" Q: O
  3. *
    % B7 ?9 P7 r( A% M8 g0 ?5 `8 b
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять/ f% W, Z4 g1 S
  5. * её в соответствии с условиями GNU General Public License, опубликованной! Q+ X2 c0 s% v2 F# M/ q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- w( ?& T% E, z; s" a. A* q7 w3 U
  7. *   j  [- ]' \) u5 Q' B
  8. * Эта программа распространяется в надежде, что она будет полезной,& H) y9 V+ B  g6 Z
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии$ Y! X6 s' |$ x4 h) f% f. p
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    + w: ?: r0 C) Y: i& H* o
  11. * См. GNU General Public License для получения более подробной информации.
    : \0 {2 C1 ]/ `4 J& x8 F
  12. *
    - e9 F! b" o% G* ]( \% w* W
  13. * Вы должны были получить копию GNU General Public License
    - i  O$ E8 Y6 A! X: c9 d% K
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.4 A9 D# c% W- |' h: _
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
' R9 A. p7 J( _- |: X0 U: {! b% e4 M( e

! O7 v/ ?% Q; j$ G1 i2. Импортируемые библиотеки
/ C6 h, W" h& Q& ^" h/ f
; H, m" e% Z) G. k: z* {* ]7 S
  1. package org.l2jmobius.gameserver.instancemanager;7 N: S. z5 {+ [
  2. : d! k4 A' ^; h  i2 g" U
  3. import java.util.Map;9 X! L0 M5 o: D$ Y1 L6 @' _
  4. import java.util.concurrent.ConcurrentHashMap;$ G! k# l. {$ `
  5. import java.util.logging.Level;
    ) }( H' _; R. n& `4 t7 M9 K
  6. import java.util.logging.Logger;5 n" L5 b& a! ~# m) M

  7. / v- h& F6 R' ?8 E$ U* P8 L2 o
  8. import org.l2jmobius.Config;* d8 p" J% u. C% m
  9. import org.l2jmobius.commons.util.CommonUtil;- ~; ^# P7 ?- O; i0 g
  10. import org.l2jmobius.gameserver.model.quest.Quest;( u) q+ F: U6 T& \
  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 — менеджер для работы с игровыми скриптами.
0 j4 e0 b. l: s  {
9 I5 _) y/ j- w6 I# M% N3. Описание класса QuestManager
( p: |$ n3 h8 K  C  D# C' f$ @
  1. /**, W! p  o5 ?( M) G
  2. * Менеджер квестов и скриптов.
    7 L- Z4 E4 S- T8 D3 _! M. c
  3. * Автор: Zoey76
    ' N1 X% d4 R" J$ ^% p
  4. */# g" h3 y4 b  _3 x
  5. public class QuestManager
    + w4 a: M7 P7 q" N, G, m3 y
  6. {
    1 K8 P# a% R5 E
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());4 N5 |0 V( |, i
  8.    
    8 r' t! `1 g0 Y7 O" ^1 ^( b8 l
  9.     /** Карта, содержащая все квесты. */
    2 J: ^! U  E% v8 `4 S) q$ h
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();! Y% G2 l/ m0 B: \& ~! _
  11.     /** Карта, содержащая все скрипты. */
    3 H/ D1 h5 y1 I1 N/ u& ~
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    / D% F, c0 [3 x6 x. E
  13.     9 E( {" r& y$ K# L8 l' V6 [6 l
  14.     protected QuestManager()
    . o8 f- ]* g0 I8 W" s5 g
  15.     {7 k, }9 Z) j/ Z# k8 C  Z- P
  16.     }0 S4 r( n; a+ e3 G- ^4 s. [5 ]
  17. }
Скопировать код
4. Методы
: }; d; _6 Z  B; o2 y" c- ^: jМетод reload(String questFolder)
' I2 _6 s5 f6 |4 f" w* @
  1. public boolean reload(String questFolder)9 Y7 q, h+ Z# ?0 X7 |
  2. {2 \( }' D. g; _# }+ u* o
  3.     final Quest q = getQuest(questFolder);
    8 a2 j6 n: @: }; A
  4.     if (q == null). D! z/ Y% b& A4 p. }% W! m
  5.     {
    % ?, [1 h" y+ n0 U+ e
  6.         return false;
    " @  B9 r7 k, D  V
  7.     }' t% J% }  r3 i% x# |( T8 k3 ]$ h' ?
  8.     return q.reload();5 u1 A# R. L5 v) _5 K8 B& ?
  9. }
Скопировать код
+ i' d) Q- |. |( B, O
  x* B) ?$ E2 |0 }, z" V
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
) ]9 ^& b" u2 O7 p+ J9 L* UМетод reload(int questId)
; o1 ]( g& _* e2 t3 _) U/ Z7 |  W" M( i0 a; \! D
  1. /**+ g! K5 A0 f. K& M
  2. * Перезагружает квест по ID.
    % n, v% [' {: R" R
  3. * @param questId ID квеста для перезагрузки, d) [' o0 v+ L* |! d
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае  g+ r0 o! a5 E/ U
  5. */
    , c% L2 }/ f( {$ H7 j1 S! ]
  6. public boolean reload(int questId)
    , J2 M+ `4 d0 l( o- K
  7. {# N; L& u# A% j2 N- }
  8.     final Quest q = getQuest(questId);: _/ V; R1 E$ ?& H. l* g
  9.     if (q == null)
    7 x* U& ~7 g! K/ V$ o, {# }' C% G
  10.     {& q8 z" X/ _( a# T$ q( w
  11.         return false;
    : A% Z0 D7 V, J
  12.     }
    ; u& B; J! C8 Z0 l$ ~# ^
  13.     return q.reload();3 q9 j6 w& ^! l
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    6 L8 b/ x4 R& i# q9 w# a2 W
! {. R, X$ }- X* z  z% x4 n
Метод reloadAllScripts()& i" r$ j2 T) }& S! d3 S9 U8 |
& u7 D$ T- j  K# j& H
  1. /**
    7 ~, @+ k8 n+ B, x7 P
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." W: g6 _' ^; E8 Z
  3. */- r/ Z  r& S2 [  G
  4. public void reloadAllScripts()
    # M3 N  c& U8 B5 Q/ _6 y
  5. {
    . T1 E, z( u, V3 t8 X; b9 M
  6.     unloadAllScripts();
    0 P5 `' V  N3 O. I0 ]- Q7 w) c, v; O
  7.     ! N0 J3 u9 ?  @8 V
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    # s0 n7 b; T+ S) l. C% w) \
  9.     try
    7 N5 `9 x' M0 _8 y& c
  10.     {6 |8 B2 y9 f* ~7 s8 C
  11.         ScriptEngineManager.getInstance().executeScriptList();" L3 v) h4 F/ I5 O5 j1 h6 W
  12.     }  b( W9 F5 ^* g+ F) R) t
  13.     catch (Exception e)
    + d# ~& C$ M: A8 l+ ]
  14.     {, F0 `4 M2 [' o1 g6 y
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);% n9 L# V8 K) w( d( n& [: l
  16.     }9 U# {. K) }' k* `. t: P
  17.       g3 k6 {/ Z, h! o2 v  o1 j/ g5 }
  18.     getInstance().report();
    ! a: h( ?, j) N1 v& T4 ?: B- G
  19. }
Скопировать код
Метод unloadAllScripts()( U+ r) Y- h5 D# Z9 [$ m+ l

' M% y# E2 F2 e  C6 h0 _
  1. /**  D* X9 U% N, ^
  2. * Выгружает все квесты и скрипты.
    . F; F5 X# h+ U0 s- v
  3. */  p1 A8 M) y# l+ S$ ?8 {
  4. public void unloadAllScripts()& T5 y% [! m6 ~4 d, p
  5. {, ^. v' Q# O, z* {$ K: ~6 Q+ K
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");7 M$ o& d% [& {( Z- m' V$ _* o
  7.    
    6 s" t1 \8 A  W/ r
  8.     // Выгрузка квестов.9 g+ ?( ]2 m* H8 J
  9.     for (Quest quest : _quests.values())& r* g. y* }* ^$ {8 i: Y
  10.     {
    ' _/ Z: Z) y+ O& z! V7 [- a
  11.         if (quest != null)5 @* @0 k  i) v, ?2 m/ ^5 l1 D' x
  12.         {. ^% j3 _4 X: U0 I0 f1 m
  13.             quest.unload(false);: K+ {4 Y  K6 p0 a+ B" ?
  14.         }
    . Z' y! p1 \" a' d" d' @
  15.     }
    7 A& z( _/ @/ x8 j1 P# O
  16.     _quests.clear();
    5 B/ M5 W& i3 j: o
  17.     // Выгрузка скриптов.
    ( N6 e6 Z0 \1 e  `8 b+ i
  18.     for (Quest script : _scripts.values())  m' C0 o' j, C; V" a, J3 e
  19.     {7 r1 z$ ]$ x, A
  20.         if (script != null)1 E; e; K- A" G7 [) n
  21.         {
    0 I) r; Y& {0 p1 I7 _# c
  22.             script.unload(false);6 t9 ^. R$ u* m4 X) A9 ~$ P( [
  23.         }' R. E; l0 m2 O' B: h
  24.     }
    . J) |2 J9 N# v3 ]- t8 I
  25.     _scripts.clear();$ N" `) ^7 Q; ^1 ^* ~1 V- a$ D
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.5 L( V9 q* C, i$ i& U
) p& p6 J7 Z' M- F' I
Метод report()- F  m( p  h" V. J" c8 {* O

1 t# r; F. N+ P% L! e$ m3 m8 t6 E3 \
  1. /**7 v% t: @0 `5 {! H+ G
  2. * Логирует количество загруженных квестов и скриптов.9 I/ I4 o6 D# ~; ]
  3. */* w5 i' |% u+ h9 t- o
  4. public void report()9 w( j/ R' N& C
  5. {' `- G+ [3 B1 `& Q& M
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    6 }4 G8 W7 i* @/ m
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    9 t/ R- z0 d8 H/ A+ i! ^
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.; a9 V$ I/ E" Y/ b1 Q- \" g
) C: \, a9 j$ n2 J( J  @
Метод getQuest(String name)
& E6 K+ p, m# {( p- P( ?) N# _2 G
  1. /*** [4 V# r8 V: [" x2 ^/ x
  2. * Получает квест по имени.  W, u% L/ N8 T  C0 p; Q' c$ d5 X
  3. * @param name имя квеста
    ; D' t7 T. _' h+ [7 W6 `" G; ^( S
  4. * @return квест2 I/ N! G- T4 D) @
  5. */
    1 j) V; ^8 a) E1 T5 O" h
  6. public Quest getQuest(String name)/ i9 O2 F. ?6 H/ }7 X& s% w
  7. {
    % a4 i/ Q0 Z- D* ~& U( v2 s# C$ n
  8.     if (_quests.containsKey(name))$ D7 a3 }; G1 U5 B: h
  9.     {
    # l6 I( l1 W/ {1 y- H$ z, o
  10.         return _quests.get(name);
    $ F2 O" }* ]* u7 Q+ l$ x. t* x
  11.     }4 u7 T, w9 G. ~; d& N* B7 G
  12.     return _scripts.get(name);
    / [: l4 \; v  k* [  E* f( P% ~
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе." f% M7 D( c$ g. w9 m/ @8 G+ ]
  H# @- o7 [1 h/ P, {+ K3 s1 y, v
Метод getQuest(int questId). t' g  x" c7 g

, P* j' _% h! y. w
  1. /**. s0 H* l9 C- L) T$ s
  2. * Получает квест по ID./ O' ?- B. K1 g6 p' l
  3. * @param questId ID квеста
    3 V9 X4 [" ~8 O
  4. * @return квест, если найден, {@code null} в противном случае) v( a$ T; q% I
  5. */
    % U! I4 x( G- K0 ]  C* }3 i+ \  @
  6. public Quest getQuest(int questId)
    ! i% ~2 f8 D0 I) q1 |
  7. {
    , l1 H; c- B9 I9 r, |( {& j# k
  8.     for (Quest q : _quests.values())7 \% ]* ?! M0 e; b4 Z& g
  9.     {
    1 }: a3 H/ @/ i$ [( k4 O4 |7 u5 V5 I2 ?
  10.         if (q.getId() == questId)
    " q& r* x# l# M" K. d
  11.         {  O6 K) N+ ?+ z4 i. f$ m; y$ e
  12.             return q;
    3 v  x1 b0 m$ B" N- N# u, M
  13.         }
    & o1 }7 U  K, s& a3 q5 N
  14.     }  k9 G# [- u: c: i, ~  K
  15.     return null;2 F" f* A& S5 f
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору." M) ?5 q4 p: l4 h" t2 p

" D$ @8 d* K6 C" p/ I9 o- JМетод addQuest(Quest quest)
" {' L( u, w, z: m9 N. [& J; n) B" O+ U8 w* k2 z2 c+ C
  1. /**
    3 B  a. i6 l) a" d$ l/ r2 Z! W. s
  2. * Добавляет новый квест.
    % r2 D$ _. {7 H: ]
  3. * @param quest квест для добавления0 h4 b$ e8 q* x( O& f; D
  4. */
    / F3 L( a7 G  j& @1 m) n" Q
  5. public void addQuest(Quest quest)
    9 k! F, d5 s7 E4 `1 R& @
  6. {
    $ \+ E- H5 e5 B2 ^
  7.     if (quest == null)
    # C+ O4 V  U& u/ I" s
  8.     {
    9 l8 D2 ~3 P6 a8 i
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");' F/ x( y4 z6 ?% A- }
  10.     }
    7 p1 E9 l" w6 ~# W4 h! f
  11.    
    7 h9 D! I  ?, @3 `( ]. }5 L
  12.     final Quest old = _quests.put(quest.getName(), quest);
    2 a# b4 Q+ i- ^0 n7 f6 _" Z
  13.     if (old != null)0 L8 n( _6 d$ @2 f
  14.     {
    ! g+ e6 t1 \) V
  15.         old.unload();+ O& Z0 R5 J+ ?- M$ D' r! `* V
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    2 d3 g5 o# u7 i
  17.     }
    3 D% e, w3 q" f/ }& t. L
  18.    
    1 g0 w, [9 K3 I6 W, A
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)! i, m& F8 d0 u
  20.     {
    % R3 k4 Z5 m3 e
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();! {) M# s/ b" M7 I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    5 b1 [; p. q: i! G$ M* c* Q5 u
  23.     }
    + W3 F% Z9 |* k) a3 W/ e$ o. s& _
  24. }$ S, l; V( f$ O  c* \! V& T+ R0 f* n* u
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
) M. n9 L# j& E1 N5 kЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
  g" ]# b0 s1 z* j3 p! M6 `: Q* R9 f+ n( F- z# {+ f5 ?; B
- @, ?1 [3 O+ O, k0 l' d5 ^: y2 Z# k! ~

* Y6 ]. s7 s. k. J: w, G1 G4 u
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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