Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
& e9 X% s3 K9 F7 Z, b6 J5 q$ [% Q' n
Разбор файла QuestManager.java
; ^9 \! h% i1 g% m  F2 `% `' T/ F. Z' ~7 R* N, Z
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 O6 p" K# v( \+ A& J3 m5 Q4 F
Основные элементы8 I6 u7 Z$ x; {0 ?$ I' p
  • Лицензия: a, Q8 F1 s8 Q# W* C% [- `
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      8 Y" e# Z$ T: b. R+ l: \) K
  • Импорты% [  d& s) d* e' B$ I3 [

9 v& N+ i; @3 XQuestManager.java — управление квестами и скриптами.5 }$ e5 h9 U8 Q! ]  [+ y# W
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ z* R/ q+ c9 W7 e/ ~* W5 }8 U. D

, \9 Z9 E- J) R- S8 i

8 ]0 ?6 w2 y& @4 Z* V$ p* p* v0 `Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.# R5 S, j1 x& M! \; [  B7 P- d
1. Лицензионное соглашение
2 j6 j9 Q: ^) ]. X+ N% j
  1. /*
    ' k9 c6 A# O. }! t3 K
  2. * Этот файл является частью проекта L2J Mobius.
    6 ^5 U, N, f6 ^" M
  3. * % |) m! `4 n2 A( A
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" m5 t' d# `( e) ?; y' [$ C% I4 b
  5. * её в соответствии с условиями GNU General Public License, опубликованной! I, C/ H7 `4 i1 A4 S
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    - h1 _8 \; w! a: c- L
  7. * ( i" b' M7 U" T' r0 [% T
  8. * Эта программа распространяется в надежде, что она будет полезной,
    : `4 I9 k# [0 Z# w$ B& q
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии; j1 U& j# a  }$ S# h3 H+ [
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    % N" n. A* W$ Q* x5 H# c
  11. * См. GNU General Public License для получения более подробной информации.
    ' i" r, i' j. n% s
  12. *
    ' o2 `3 F) t  {! `- E( i) H
  13. * Вы должны были получить копию GNU General Public License
    % w1 z% e5 P# C4 }8 }( ?6 ~: ]
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.  y2 N8 i# O/ J8 g1 F
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 @& V0 Y; j" P$ a5 A0 x
4 w& X, Q/ r9 j$ K% t5 s0 \7 |$ z( x+ \# w( Q7 J
2. Импортируемые библиотеки
% U. W# x' F! C' Z/ x
+ v" `8 u  |7 Q% Q5 w' [/ A
  1. package org.l2jmobius.gameserver.instancemanager;
    + [# W2 ?9 C5 i' K6 m

  2. 0 x, F; \2 x& H! P: |* _
  3. import java.util.Map;
    8 @0 z7 N/ H: |0 i
  4. import java.util.concurrent.ConcurrentHashMap;
    ) T/ P" K  N( Y  z6 l
  5. import java.util.logging.Level;5 R3 f, q! W" h; t9 a3 a
  6. import java.util.logging.Logger;5 _1 R( q; |2 W7 n

  7. / H0 @' T5 q2 M) V1 H4 p
  8. import org.l2jmobius.Config;
    % i. V% q# A/ X5 n2 g
  9. import org.l2jmobius.commons.util.CommonUtil;
    # u( l2 ]( v! |8 a8 \
  10. import org.l2jmobius.gameserver.model.quest.Quest;; W* D0 Y0 {- }( s4 b( ]$ L
  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 — менеджер для работы с игровыми скриптами./ n  w0 g+ x! B- Z4 J
8 H6 s+ x6 t+ e( n" w4 V
3. Описание класса QuestManager
: n1 @4 x# b6 _6 ~
  1. /**
    4 b1 V1 w. ]; z8 I+ t/ Q
  2. * Менеджер квестов и скриптов.
    " k& }4 Z! Y% v$ ^$ [1 F, Q
  3. * Автор: Zoey76
    ! v, H/ x; x2 R
  4. */
    2 p# \5 A' I) o& ^" l$ E# Q
  5. public class QuestManager: |1 H* t9 L$ z3 ^8 W0 G
  6. {  P/ d$ d$ S0 N+ w" P" [
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    # a1 E/ o- v! k" D3 g
  8.    
    1 {5 ?: |  _/ U, V1 P- L- j9 l4 u
  9.     /** Карта, содержащая все квесты. */5 n  l0 \' |: V( \
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();) Z" m  y$ D7 z7 g# h
  11.     /** Карта, содержащая все скрипты. */. I8 {/ K: J1 Q7 C# O
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();% t. e" B+ w  \0 l8 E; Y
  13.    
    - P( |( d2 R0 [
  14.     protected QuestManager()
    3 Q7 |( t1 E1 R' ?% `0 O( Y& Y' N
  15.     {
    & U& E/ P# R( R1 t6 N. p  B- x
  16.     }3 X  p" n. o4 w# d0 {
  17. }
Скопировать код
4. Методы% G- A1 p1 j# }8 @8 [4 N
Метод reload(String questFolder)
; u& t* c1 B; j1 x
  1. public boolean reload(String questFolder)
    - a7 S- a6 O0 a* c. ~! P, ^
  2. {& L9 X' q8 c# m) V. A) Y3 k6 r5 y
  3.     final Quest q = getQuest(questFolder);
    $ j7 h; A  j- Q) }+ ^' W
  4.     if (q == null)" Z$ r& e6 b- _/ q
  5.     {  N8 [  ?. b& i9 i1 G9 Z8 Y
  6.         return false;
    ; s; r3 K) }  l' S$ S
  7.     }0 O3 O) L: ^0 Z7 {# o5 {: k
  8.     return q.reload();
    7 V! U# o% E, r* m! s: _( b
  9. }
Скопировать код
! P" i1 X- [8 K% l) q
- m9 _2 V' B" t, P
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& a) d# b3 ]# ^: V6 Q7 Q5 r
Метод reload(int questId)0 l: L8 W% p+ Q
# V0 d) @8 h8 V+ g  D
  1. /**5 D& F8 v7 R; u  Z& l- _
  2. * Перезагружает квест по ID.% U* k+ o  y4 Z$ V* x/ B4 v
  3. * @param questId ID квеста для перезагрузки6 v9 C6 Z. a) J" }3 b  {2 z( t1 H
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ! X+ [4 S! U# h( z4 _
  5. */" \+ q1 f4 n1 I. k- M' c
  6. public boolean reload(int questId)# O& s# w8 `/ F1 w6 m' {9 Y
  7. {
    7 _) q- W; X( P9 u! f3 @- u' n$ U
  8.     final Quest q = getQuest(questId);) N- a4 E* v. s- d2 ^% t
  9.     if (q == null)
      _8 V$ L( i! I7 [) s( A
  10.     {
    : T2 A. `2 m; T) q3 ]* a
  11.         return false;3 L$ O% T: P, C7 ]
  12.     }' S# z8 \" r1 l9 s2 L
  13.     return q.reload();
    / g$ n$ A5 M3 ~& Z$ w& y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.0 K  ]( N) a" j' W
6 p9 [5 V3 A. U$ x8 @# [8 }
Метод reloadAllScripts()
$ I) O) r+ N; \
* \9 c; F9 u7 _- }! _6 b- i% }
  1. /**2 }5 ^) m2 b4 t) `7 S/ A( h
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    / H0 W5 M! m) ^) ^, @. }
  3. */
    0 C7 x2 |6 b& z6 {1 G6 z
  4. public void reloadAllScripts()2 H" g2 a# ?' m4 X/ [( C( a6 z. `
  5. {
    ) H  T7 e4 U6 _9 C5 b' P
  6.     unloadAllScripts();  U5 z& P  J1 q/ x
  7.    
    . I) I& V/ \- O! X
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    3 Z: h  i) m2 K
  9.     try6 x5 R0 q& A3 g, _/ h8 d/ D
  10.     {0 k" l9 ^! B% G1 x8 ?# U: \
  11.         ScriptEngineManager.getInstance().executeScriptList();! m3 z3 r1 V' M1 o: D& l
  12.     }% S, [2 v" `. v. r# Q- @
  13.     catch (Exception e)' q/ a0 @, I2 K9 o6 [, o
  14.     {8 [& h  j4 M) s& _& I
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    # X8 j& b8 X5 [+ A% t7 q1 {4 {
  16.     }
    / d' _5 H# o  z; N
  17.     / @8 [. Y3 Q7 U$ G* D- \  w5 z4 W7 b
  18.     getInstance().report();
      O* s; P" a7 n8 n% Y
  19. }
Скопировать код
Метод unloadAllScripts(); Y0 q/ l6 @: d: f1 w8 e
# H! s% ^+ o- m1 |: i( B! B
  1. /**8 _, m- M8 P& K( Z/ g: j
  2. * Выгружает все квесты и скрипты.
    * U# P3 I* O0 q" w
  3. */4 P* p  C3 L6 O  g6 ], }; M4 F
  4. public void unloadAllScripts()3 A: m( T. Y% j& L8 l8 e& t
  5. {; `% o, n2 Y1 K4 g7 P
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");4 F+ Y2 X, S5 I* L  F. C
  7.     7 \" w) V1 X/ I, T- E4 O3 G) U
  8.     // Выгрузка квестов.# s, X" ~3 ^0 a8 u  {
  9.     for (Quest quest : _quests.values())
    * t7 k! ~" L5 G' Z( f" i1 ]
  10.     {
    7 q8 {% |; Y, f
  11.         if (quest != null)
    ; u! j3 j8 U1 W# K* y8 ]8 F$ S
  12.         {! G' V, t+ v5 \* E5 z  K" H
  13.             quest.unload(false);
      y4 I5 z7 _- J: j6 l
  14.         }
    " [4 J( v* _' j& q+ X# N$ P
  15.     }4 D& n' P" U$ m. ]4 n3 }
  16.     _quests.clear();
    9 N( k8 b* \5 Z1 Z6 Z3 z5 s
  17.     // Выгрузка скриптов.
    + J+ |) E) c! p
  18.     for (Quest script : _scripts.values())
    ( h$ I3 y. x- ]* Q
  19.     {
    ) L1 Z9 g1 j* I, C( l2 ]
  20.         if (script != null)
    ; S! A2 s3 R) x5 ~* s% Q* k1 M
  21.         {
    % N+ @0 g$ l1 Z/ M) U
  22.             script.unload(false);
    + a0 e+ W( A) A$ d
  23.         }
    3 |+ b( D! G/ g3 o* e
  24.     }- R; u/ K3 V  f+ e0 F6 \
  25.     _scripts.clear();9 W. y# T! g, N
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    4 {8 [  X3 d2 O
6 V5 r8 K( F( ^' v( `$ G
Метод report()  r5 }. x2 ?  p6 E
7 }6 `; |/ k( ^8 o! J2 Z5 o9 h
  1. /**% D5 C: y9 U- `
  2. * Логирует количество загруженных квестов и скриптов.
    4 l8 `% @' P0 i+ M( Y
  3. */
    7 V5 t! u1 E& m5 N' J) ~  B6 l3 |$ ^
  4. public void report()& S% o  r- f6 |: n( z
  5. {
    - M& _+ X9 W' e# O8 x6 Z8 \
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");& D# h, C: z0 w# Y% K; H
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ) m! A0 p2 {- F. r( [* K3 ?- F: \
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов./ A8 T$ b, ?' E7 q$ U" o1 a* y
6 u6 i: u! Z" F$ A4 o" ^  G
Метод getQuest(String name)
. Z4 n% z$ V1 w/ w( n6 ?$ o/ @4 U$ g: z& H$ [" B' M% `
  1. /**
    4 c. G) i5 \9 d. r
  2. * Получает квест по имени.& L, _$ G! p6 p/ @7 F7 f7 k
  3. * @param name имя квеста
    9 c" J2 K1 Z+ h9 i' A) @
  4. * @return квест
    7 [+ C* g$ L8 ~8 \5 y" `6 `7 f
  5. */
    ( S# Y$ h' H5 J
  6. public Quest getQuest(String name)
    , `( F+ {2 u" f0 ^; I
  7. {) t" P9 K) |) r+ Q% S. ^
  8.     if (_quests.containsKey(name))
    $ R* E5 r$ X9 C" F1 F, ~+ M* j' M/ v
  9.     {+ u3 P" a" y/ ?. i' {
  10.         return _quests.get(name);0 a- `& E1 n& U+ m
  11.     }0 I0 n( x) _2 M6 ]. C
  12.     return _scripts.get(name);. I' `. U$ [) ?- S0 m
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    , {) d/ t+ r: U0 R- q7 D$ \
8 y. W) R+ b: p' \+ Y. ]
Метод getQuest(int questId)" k) ~9 ~3 ?/ a. x+ l2 O# N
* C$ M+ G4 X$ ^4 m4 @- @: B# m/ @
  1. /**
    ' m' V. V4 l+ F
  2. * Получает квест по ID.
    / }+ z2 t/ d' w8 U: g" h  y
  3. * @param questId ID квеста
    2 U4 t+ M* C; e, V& k0 T
  4. * @return квест, если найден, {@code null} в противном случае
    / s! |. ^3 ^* Y3 m6 \
  5. */- y& G* y9 E2 s/ X# ?) Z% N4 G
  6. public Quest getQuest(int questId)/ R8 s2 U2 F' m  s5 n, i
  7. {
    7 k) W' |* O- F0 |% d  A
  8.     for (Quest q : _quests.values())
    ' M- F9 e  E& H1 S- M. T- |" z
  9.     {
    * W3 j! o0 M# {; z5 i8 G
  10.         if (q.getId() == questId). ~  H; r2 M" O! B1 B% t
  11.         {8 `. ^6 e* I4 \- U' E4 x: w% Y
  12.             return q;1 J% N' r$ f: ?) g( h; y
  13.         }9 R  V0 V1 n! X+ r- f
  14.     }8 N6 J# i3 O' ^( p$ B& a2 a
  15.     return null;. W# M* y1 J& @! g
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.& X' b5 X8 w2 t+ N$ X2 ]" P! }

: _- [+ j6 X+ \# L9 UМетод addQuest(Quest quest)# d' V, D7 a1 A3 m# _
  A7 Y6 q% d# n7 V# @( k8 l2 O
  1. /**
    ) b& Z/ z3 P) i8 u
  2. * Добавляет новый квест.* }$ }) e3 o5 J& G8 r5 c
  3. * @param quest квест для добавления( X4 ^( M; u: i$ F0 e
  4. */
    2 u7 p8 [; B1 T8 A: d
  5. public void addQuest(Quest quest)
    0 p; `5 n# D0 @8 ^  B+ b
  6. {
    , d, s% @0 v6 V0 q% g% H
  7.     if (quest == null)
    2 r$ e% o9 D/ _9 g, s
  8.     {
    # o3 F6 Q7 u  a+ x" e3 M) Q9 L3 G
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    + w, }/ w# z; L  b! R# u
  10.     }. ^9 b! l( z/ d9 I3 d+ C
  11.     9 w( n. _. N8 O" {3 V; O
  12.     final Quest old = _quests.put(quest.getName(), quest);
    8 T: b' b/ V. j1 C
  13.     if (old != null)
    % z/ P1 T# j2 g2 S' O: H& }
  14.     {) _* o0 K7 L4 n' @9 l3 C
  15.         old.unload();
    7 q0 D& h7 n5 \: i
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");* C% w, q1 f4 W& U
  17.     }; ^% v% [* w5 e+ G4 E) j
  18.    
    + T# G# {# g* O9 t
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)2 d; `% z0 S- Z- e
  20.     {
    6 Z: t1 Z6 r! `) g
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();1 ^2 @0 P8 N3 g/ v
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    # t5 F7 x$ w$ p
  23.     }
    6 c8 g* t& U# g
  24. }% k* |! e2 f; V' q2 `9 I& R3 k
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
+ p, [5 Z% K6 Q/ }* ~ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
! ]0 b0 E# \: U2 S% C) A8 @
+ h( S# a7 H1 M& ^$ j
6 ?; p& D. F" w# ]& @+ v- ^+ c: |9 G' g$ |' e* g
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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