Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 o1 b2 L8 Z9 S. M  `7 t

7 n5 O: ?# R+ I: ^) ?Разбор файла QuestManager.java% m5 v4 G3 r/ o; Z" R
+ i7 w! o5 w6 T4 G% M: u4 `! ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.) O+ b* X; N  b2 g; V# {4 v# d& R
Основные элементы. T& M5 C" ?6 c8 ~
  • Лицензия% R! {! P5 Q! n- r
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ n/ i! T" h, }# S8 I# s2 P6 ~+ [
  • Импорты
    4 q# E- ]% |- [4 N% G
. I! E! @' e% ?+ W
QuestManager.java — управление квестами и скриптами.: A% o$ x. i7 N7 c
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
: B$ m1 g' b8 [8 N- o  w* H
( O3 d# G& @5 e4 G( R, @. o% ^

! M) O9 F0 A9 G1 `1 wДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.1 X$ Q: p* m1 T4 D" ~
1. Лицензионное соглашение1 j6 R) L" ^5 E% `7 Q
  1. /*3 Y' d9 X( V/ q/ @- D+ d4 h
  2. * Этот файл является частью проекта L2J Mobius.
    1 t7 Z* ?4 D" t! e9 l" R7 f( X2 \
  3. * 7 W, S. Q$ D3 j& L/ n! X1 @. v
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    $ Q) \  l- g# r; S. p
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    - y3 V. C/ x, C3 d% {9 t/ k6 Y7 L6 O# Y6 b
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    4 ~1 {, [/ j# c5 U6 k" H! |
  7. * ' e- L, ^8 v) u* N* ^, a% ?* |
  8. * Эта программа распространяется в надежде, что она будет полезной,2 |3 l" z: p) j8 ^/ B
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    2 ~% R, ^2 a% g/ e
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.( }. [3 O! w: h7 b
  11. * См. GNU General Public License для получения более подробной информации.
    / }3 f( \3 M! F3 `7 y6 Y: `
  12. *
    ( V2 z$ P, t! |' m3 [5 V8 V
  13. * Вы должны были получить копию GNU General Public License
    0 r3 n( D/ q3 H$ O% G
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.; e6 p2 U5 f( E
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
3 J0 t+ u) ^9 @
- s( h/ H+ F! \# _9 {# F# p/ B: x9 x9 p8 k7 q
2. Импортируемые библиотеки/ |/ @$ ~7 i) Q! N- X
" D" a. A% t, ?8 K& M
  1. package org.l2jmobius.gameserver.instancemanager;% u* H. @' ^7 O' b

  2. : E/ }4 ~/ C  w2 {0 s: b- g
  3. import java.util.Map;1 ~$ e+ N- |. `2 D9 [+ K; o8 k
  4. import java.util.concurrent.ConcurrentHashMap;2 E$ p' j# V6 L7 n& [
  5. import java.util.logging.Level;
    ; X( n  c, D0 x8 E% i6 N
  6. import java.util.logging.Logger;
    5 f2 @/ f0 _2 r& {$ X# f: e# i
  7. 2 y3 z, F# B* b8 ^$ P
  8. import org.l2jmobius.Config;
    ; X1 O1 ?" B. ]9 P  S5 p. {8 s$ l
  9. import org.l2jmobius.commons.util.CommonUtil;
    2 j$ B5 K- ]+ m9 N
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    * B3 n0 L7 {3 {* h
  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 — менеджер для работы с игровыми скриптами.) m( o4 u6 J8 P' J

5 Z! a! }1 h+ r7 y! a) G7 w# `8 Z3. Описание класса QuestManager
$ @1 S: i* c0 m$ r
  1. /**
    * U" h; p+ T2 T3 K6 R6 G7 t
  2. * Менеджер квестов и скриптов.
    ; y2 H6 {+ j) h4 O
  3. * Автор: Zoey76
    4 G5 t# @, i0 l& d0 c$ e. N
  4. */! N, F+ F+ u  U: B6 V# G! S
  5. public class QuestManager
    7 m8 I+ l* M8 c! L  e; }( d
  6. {
    4 U) s3 ~6 Y  l+ O7 U" |3 J# ?
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());) K4 Z2 w9 q% ^7 ~3 N
  8.    
    0 _$ p/ |7 T8 W- Y, ]- \# P$ l/ B
  9.     /** Карта, содержащая все квесты. */6 F7 g* {# ]1 |4 I. \* s
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- Y, }, Z, N. @
  11.     /** Карта, содержащая все скрипты. */6 S5 Y8 e  D  n! v7 t6 i
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    # @3 w1 C! `% z# |) @8 h& v
  13.     - ?$ V- M8 T7 h2 x: p/ }
  14.     protected QuestManager()
    8 _0 {+ S9 t( Z7 r% M( W' V
  15.     {& }/ M( ]0 Q4 E" x
  16.     }
    8 }7 x% _% u7 y+ t
  17. }
Скопировать код
4. Методы
, H& F$ y3 U+ [3 RМетод reload(String questFolder)
5 f4 a; V$ ]; F- R( S
  1. public boolean reload(String questFolder)
    - U  u. @7 G& j- G/ p. \
  2. {, b, B) S: \. }
  3.     final Quest q = getQuest(questFolder);
    ! Q7 W9 |" T3 K5 G1 E
  4.     if (q == null)
    $ B, y  U5 }; U, O" r4 X  ?
  5.     {
    3 b, c' P- {0 a3 k  w
  6.         return false;
    , F2 F% }) B9 f  q$ ?
  7.     }( d1 c8 W8 H" w3 c
  8.     return q.reload();. j! N( z1 B) U2 K9 q* x
  9. }
Скопировать код

* j9 x( y5 e8 b0 |9 `2 F9 E1 L, h! \0 f. k( p  L# g
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.5 ^4 b# W( d0 ^
Метод reload(int questId)1 ]' a+ M8 l9 W$ A  z- J: @/ @. L3 A" Z

& Y. u  P2 f0 \/ X; ~0 w/ A
  1. /**6 z4 q7 P; H' \8 t& q/ x: K
  2. * Перезагружает квест по ID.. g- f+ D( e/ K( g  M
  3. * @param questId ID квеста для перезагрузки# q6 @# @/ v: f1 R( A5 M, A1 j0 y
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    / D6 y# N9 `& L+ r# R' B
  5. */4 ^: w. C6 m! N! Y4 w3 G
  6. public boolean reload(int questId)
    6 @: o7 Z' W9 \1 z
  7. {3 R3 z: D& E4 y: N6 A$ |' Y2 _7 i
  8.     final Quest q = getQuest(questId);0 Q* @* o; g5 o* j
  9.     if (q == null)
    / L  {( o7 _' K& c' M9 [1 I
  10.     {. t, L9 L) H( _! s- y! Q
  11.         return false;
    ! E7 n7 ^7 y* \9 P5 R. t7 b
  12.     }0 o! f, D8 Q! q" Q8 |5 d
  13.     return q.reload();* d$ k' X+ }) l+ o; R
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.3 f* v8 B" D2 N# P1 N* ]

. @, E: E( k9 R. \Метод reloadAllScripts()
' _2 K8 Z$ t) q
) y& k) H1 {' t9 `6 C7 `( J( L4 r
  1. /**
    ; c& j+ T+ z: D, T7 P$ r
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    8 H' T1 V5 s' t5 F
  3. */
    ( j' |# Z7 b8 z+ r1 x, Z0 X' o
  4. public void reloadAllScripts()
    1 _. ^! U7 I$ w8 h: x4 o7 K5 t5 O$ a
  5. {
    ) M% v3 \" `" i1 \+ `
  6.     unloadAllScripts();, l. s4 K8 E6 C5 @  h
  7.    
    ' C% _7 }6 z" c6 d
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    6 z6 {$ E$ _4 }4 r
  9.     try
    ) T9 ^: T4 Y5 K& E: v
  10.     {
    8 a, E2 z4 {4 @% C
  11.         ScriptEngineManager.getInstance().executeScriptList();
    3 g5 x1 T- z2 ?; ]' Z$ E* O& ^
  12.     }( o  S  k& \% b' ~( P
  13.     catch (Exception e)/ b4 J  K; ^  D# Y
  14.     {
    6 z9 D( F" E. \- v2 P8 G3 b" H- {
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ( p0 R9 B) c% c  i
  16.     }3 N' V* i; s1 V# O: u& J& z' X
  17.    
    & x! H  I/ A  p9 m
  18.     getInstance().report();
    ; e8 n+ X& k; F6 u0 j/ T/ q
  19. }
Скопировать код
Метод unloadAllScripts(): w/ {/ k- x$ e2 M* [, p5 `1 P8 M
3 l4 ]$ O3 E+ i) g) [& }: E4 w( X
  1. /**
    ) N/ F+ S; i! t4 d$ j( {5 v
  2. * Выгружает все квесты и скрипты.( I  n. X7 L( c
  3. */# _  I8 o! J& Q
  4. public void unloadAllScripts()
    1 }& Z3 K3 U$ l
  5. {
    0 H! |, a8 T; z" `" h  k1 O- O: d
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    6 q# M: }$ U1 \3 W+ Q0 H
  7.    
    " M$ L! z1 x- y7 O- ^" S
  8.     // Выгрузка квестов.
    : h5 F3 W  V& Z( e& i
  9.     for (Quest quest : _quests.values())8 K% H8 ?, R: N( k4 u1 e) {
  10.     {
    * k' V7 \/ B6 W: Q5 x
  11.         if (quest != null); K" C( H; Y* ^
  12.         {
    , q: s* [# w$ N$ U- b
  13.             quest.unload(false);0 a) O' J( H* _$ w0 V1 ?& @; G
  14.         }
    9 D: i" [1 E) |5 F1 u4 A
  15.     }
    3 k8 r% Q( x8 e+ K
  16.     _quests.clear();: Z2 V& {1 W) Q+ S6 U/ C! E$ L
  17.     // Выгрузка скриптов.
    / i$ w' L$ a; ?8 ?# h- G; G
  18.     for (Quest script : _scripts.values())0 i+ o8 S8 z' M' d
  19.     {6 |* u- [" q2 `. ?2 P
  20.         if (script != null)
    ; }8 |+ N1 N$ n7 C
  21.         {! I; }! R6 M; _
  22.             script.unload(false);
    / V! P9 F# u; S+ o
  23.         }7 w0 S. a1 a1 Y' c/ T
  24.     }% u) P! h% `# }1 i" q% @
  25.     _scripts.clear();9 f& r$ e4 }1 W4 P% K
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 M/ ~1 s; [1 c
- C3 ~/ ~& h( E8 J# K
Метод report()" D8 k$ ^+ u3 W, x5 W5 r: x* [' f; @
- [9 }7 ^/ C$ D6 `2 |
  1. /**8 [+ O+ j! N0 m  N: s
  2. * Логирует количество загруженных квестов и скриптов.8 T& c$ \' Q! n
  3. */
    2 }1 f1 K! C! j/ S" r
  4. public void report()
      b: v8 ~  ~3 c, q
  5. {+ J: Y; \4 y; B/ W9 w, A
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    ! W8 s4 ~6 M4 k& ~) k6 _. Y
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    2 l! }+ \( t$ n, j! }% |' o  M
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.; ^4 g8 Q) P+ c  ]# j7 `( B
9 x7 K- C8 ~: Q/ h+ ?3 M6 i
Метод getQuest(String name)
* |+ n! k3 l9 l* y
6 A- _8 J6 ?4 x
  1. /**+ M  I9 _" B) @( u
  2. * Получает квест по имени.+ o: c( ]9 e# q. Z( t$ @2 l# j
  3. * @param name имя квеста) v- g3 q5 d3 S" @& r. Y  \& h
  4. * @return квест
    , H" m! H/ x9 B( d* |- H) ~* W+ H
  5. */
    + e" Y. M* Q5 }# ?! m2 e
  6. public Quest getQuest(String name)
    0 U! u3 @  E' u9 Q
  7. {
    - _4 {' C5 w# F6 T0 d/ ?
  8.     if (_quests.containsKey(name)): O" F% o* q* G$ q" V
  9.     {* |0 n5 a8 Z7 V2 b) C" ?1 y
  10.         return _quests.get(name);% n- Y- q) ]: I* n* `$ X
  11.     }) [/ X: V, ?& k
  12.     return _scripts.get(name);1 F: O3 _2 k" }
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    $ A+ `9 b/ ?- l3 ]

7 d; l6 v* F6 f# |9 g4 ?8 S  `1 JМетод getQuest(int questId)! S4 z  k) {- C, w! B  x3 z

( S  i* @" U7 T% y5 [% p
  1. /**
    2 o" I" }$ }7 J! @9 I5 V! E! V/ i
  2. * Получает квест по ID.
    5 h$ `3 O% ?3 E
  3. * @param questId ID квеста5 ?7 K- x# i( J, O1 Q% t  E
  4. * @return квест, если найден, {@code null} в противном случае
    % n' d& u' j* P0 A/ [  H
  5. *// a. T, Z3 L3 w6 B
  6. public Quest getQuest(int questId)
    # Z# n( `3 E( f2 |' R) K
  7. {
    ; B0 W) A& A, Y( Q4 W2 i9 e
  8.     for (Quest q : _quests.values())! T% n1 b; W9 o- c& P4 b& m
  9.     {4 I8 @( T) A' V( k* I
  10.         if (q.getId() == questId)  @4 S2 C8 i' A# k8 }* S9 o
  11.         {" t" P) t- e0 G) J: V
  12.             return q;& t2 b1 z2 d, |+ B" H& v- e6 B
  13.         }
    , r- p( E6 J" f  z( k+ y- @' ]
  14.     }$ F2 l) _5 y4 v: C* v9 i# {
  15.     return null;+ X) w, i. X# o5 x" Y9 t7 G
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    ' E7 [0 n. Z( f. Q3 B5 M. T

; t8 [) x  z7 t# o8 ?* A2 X$ z5 M% ~$ wМетод addQuest(Quest quest)
" U: q2 B. Y% F# o6 t& s0 g5 ^$ W8 ?' L. z9 O  |
  1. /**
    . l. u% }6 N% J
  2. * Добавляет новый квест." s" T6 V+ n3 U2 F1 I7 @( d
  3. * @param quest квест для добавления
    1 z0 B* N3 `$ f' Z! z
  4. */
    ! D$ J) O- B% K" u/ z
  5. public void addQuest(Quest quest)
    9 N: W9 W/ E: E  c% p: j" @! v
  6. {
    0 c, w( }2 ]7 x! L
  7.     if (quest == null)
    / x: w) E. k0 f7 \+ x0 b
  8.     {$ p: A8 S% @5 W' A) ]
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");/ J7 g9 n- L1 X) m9 {6 I- z& O
  10.     }
    ; L4 Q& V! x4 ~8 ?2 ?& ~
  11.     + o' _3 ~' u" i( k8 \! M7 E
  12.     final Quest old = _quests.put(quest.getName(), quest);& t  r6 V& U/ k4 \7 P7 c
  13.     if (old != null)) |! @) I! R& I0 Y/ A4 l
  14.     {  J' M! B! l. ^1 ]1 Y; Y$ U
  15.         old.unload();; b  {" P$ @& j" l1 r5 l
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");7 n4 R5 o6 ^  A" A
  17.     }
    ) V& I2 ~5 y: z, Q+ c* p
  18.    
    0 w; c3 o6 q. ^$ Q" T, J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    - e1 p5 |0 O" n8 N2 ^3 X) p0 d
  20.     {7 U7 `& G, n& O+ W3 D0 A$ C
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    : m, A$ {: g; l- B5 I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    / I- T: h1 o: ]5 F! R. R0 q1 N5 `
  23.     }
    ' C7 K5 u( t) N4 `! R
  24. }
    & Z. R5 e$ Z! W
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.8 i4 k' H( r* j' E% P$ o
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
8 @% S1 q) q9 X8 t' [9 v6 S. z; w: @" {
! @* b4 ^! ^. l3 j+ O
/ W2 V. r$ N- z$ h' b
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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