Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius! D7 y7 T, Y* @  {1 ]( j0 y
4 @8 m$ q' C- c
Разбор файла QuestManager.java0 t. T1 t; _( y% e' h

4 ]1 q  s; G0 [7 AЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
$ S! g" w9 O$ T' v1 H2 u5 ZОсновные элементы
0 B* {, x$ T$ X- [( z
  • Лицензия
    8 b$ U: V! _( c2 N% l
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      & S) P" j, e) ?7 L9 R2 j
  • Импорты
    $ y* h+ q1 W# N( U5 ]
* u) d, @7 h" u* n9 g( x0 Q
QuestManager.java — управление квестами и скриптами.- \( I6 d" E6 K
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
8 n  P# u$ o' w5 S8 v  C
- Z7 S" N3 |6 K+ r

; U3 R/ B! P& p/ N9 }' T5 }Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов., s: q6 |& F! w5 y) M. |" o7 Y
1. Лицензионное соглашение9 S$ M+ B; t# u6 I
  1. /*: l' f5 H/ D) P" S5 _7 [
  2. * Этот файл является частью проекта L2J Mobius.1 [) B- M- [: R( E
  3. *
    ( u- p8 y5 h: T
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять" v# X# }" [# \3 i+ d7 t
  5. * её в соответствии с условиями GNU General Public License, опубликованной: g; _8 `+ ^3 D1 ~! |
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.: R0 P8 \8 q' ^* O  j. R. t
  7. * 9 W3 |" z' g! B, Y! d6 o
  8. * Эта программа распространяется в надежде, что она будет полезной,
    , Z9 W* k: Y- s; P6 i7 [8 L
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии' U7 ?4 p# c' }7 C0 X, u
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    & I. O$ P, r6 T) ~2 s
  11. * См. GNU General Public License для получения более подробной информации.' C. ~9 b. P, X* x, J. p
  12. * + T9 e/ C. d& B6 x
  13. * Вы должны были получить копию GNU General Public License- c5 n$ M0 S- `% H/ A
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    3 ~1 t9 S3 l5 B: k  `( ~9 H
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.8 g3 R7 [7 H! A

1 K, x8 y/ K5 P8 ]! `5 \* z  a% l, D5 E7 V9 o/ v9 g1 S7 z& V
2. Импортируемые библиотеки
7 u! M, S/ e6 J0 A# G% t* d6 j; r
; W8 y( ]1 x) ~$ z
  1. package org.l2jmobius.gameserver.instancemanager;
    9 ~1 j: N$ u+ \- j0 t

  2. 1 y6 w* }* E6 y* V
  3. import java.util.Map;
    1 h9 i/ G2 N$ S5 r$ t5 [' U
  4. import java.util.concurrent.ConcurrentHashMap;
    " h9 ]0 q! ?2 G  N8 w0 }& s
  5. import java.util.logging.Level;
    # G# C. b& m! M# l: X
  6. import java.util.logging.Logger;' H) m" Z% E7 H( d  p

  7. 3 j/ I  u  Z: w) S7 ^
  8. import org.l2jmobius.Config;
    : A  a9 l$ j2 x" O% W
  9. import org.l2jmobius.commons.util.CommonUtil;7 u# j% ?% [( m9 G( |" Z/ c+ Y
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    + {% V1 k! h7 W0 w! ?
  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 ~5 V7 O" U& D4 U  f. }. z7 b9 X$ I
3. Описание класса QuestManager
8 @9 `) j& r( n$ m/ _$ o
  1. /**) l) [- V* W9 C
  2. * Менеджер квестов и скриптов.
    # F0 I. C$ l! J3 V
  3. * Автор: Zoey76
    5 b) c# A  x  Q7 j2 ?0 j
  4. */% V& o% g6 q+ t1 x) w2 W
  5. public class QuestManager
    : Z" k- R# R1 C
  6. {
    2 Y2 E* }% M- Y. }) \( W$ m
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());% J4 ~. M1 s( Y2 }
  8.    
    # S# a/ c0 W! z* h+ k
  9.     /** Карта, содержащая все квесты. */  J4 d& a9 N4 W
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();4 V4 \' z- K  q- j6 n
  11.     /** Карта, содержащая все скрипты. */( f6 Q0 C' [/ X! G+ w  g6 L9 \
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();5 ~1 y% q1 W/ t0 M, a0 h- M
  13.     9 _  x6 {7 C$ O$ p! @
  14.     protected QuestManager()0 I) W+ }4 m) G
  15.     {' @" ~/ r6 K2 j
  16.     }# R! m* Z) S1 R3 S" C* s
  17. }
Скопировать код
4. Методы
" Q( r3 \3 }: a+ Y& q/ ]! rМетод reload(String questFolder)) T; m0 x- X5 q: E! z0 y& {# K
  1. public boolean reload(String questFolder)+ e' ?$ r# ^5 F* A
  2. {
    ' X1 \! c0 q% f; j  i
  3.     final Quest q = getQuest(questFolder);; X: `1 m; w# r
  4.     if (q == null)3 ?* F# X( H0 y* g' K4 I9 [
  5.     {
    ; }3 B4 i- k6 c1 p8 {! A  N5 J: v
  6.         return false;
    ' m$ M; v3 S, l2 o8 A( K: a
  7.     }5 T* C8 `' \# d+ P0 Z- D
  8.     return q.reload();
    ! W+ S$ Q& g' ~
  9. }
Скопировать код

4 i6 o: \0 S5 v/ n+ Q
* ^% d* S$ k, d7 M4 ZМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
+ a9 [: A% I5 a( t5 \1 y2 VМетод reload(int questId)7 e5 T9 N4 G! ]) r+ \2 j
0 p6 k. s' t, @9 H
  1. /**
    # H- n- Y# N- O4 Z+ u: k. J5 ^& J
  2. * Перезагружает квест по ID.
    ' z7 c/ K. s* ~5 j( U5 K! u1 E9 d8 P6 ?
  3. * @param questId ID квеста для перезагрузки
    1 T# H! C1 K  G/ G% K
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае2 c1 y) J0 U: n, x1 w( s" K8 Q
  5. */- X7 |. H/ h. n$ W# h- z' p" k
  6. public boolean reload(int questId)% J  ]2 T8 M: H
  7. {" S( z  M, ~3 q  P) C: l  @
  8.     final Quest q = getQuest(questId);: d; a% a4 }2 L4 J* M
  9.     if (q == null)! O2 m4 m" _- Z2 L" U5 A
  10.     {
      A. l8 ^9 Y$ q( v3 S
  11.         return false;
    - G3 z/ T2 x# o& D9 Z$ j# @
  12.     }* V  J- |9 X/ ~& ~! S) L% J3 f4 W0 m
  13.     return q.reload();
    : {1 ?& x# b& Y& E5 g
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    8 O3 ]5 ^  Z/ J, r7 T
/ v% c! N2 f/ U( g0 u
Метод reloadAllScripts()
+ w' d9 _  Q& s) W0 Z
1 Y8 Z5 a) Q1 O! ~# z
  1. /**
    1 b' s& l3 h; u9 k
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    ' \" {+ E: X/ M4 y( b* q1 K
  3. */: h; L6 y7 T& `
  4. public void reloadAllScripts()' M9 T: J( R' t) L( w9 y  V
  5. {* |; @7 m- h+ o$ n2 @
  6.     unloadAllScripts();
    - {; x% V+ C+ R' \5 X$ o
  7.     % D; Y6 y/ A8 G1 ?2 e" X' j
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    2 l6 r7 I& V! t1 ~
  9.     try
    8 W0 F5 Y0 M$ F/ O, V/ l# w
  10.     {
    / \! R! G7 I4 A5 G( s' P$ r+ J
  11.         ScriptEngineManager.getInstance().executeScriptList();0 g/ d2 {, {6 o8 D. o
  12.     }
    3 Y5 H6 H0 c7 j+ G( n) ?
  13.     catch (Exception e). D) ~3 r' ^: V8 }( g
  14.     {: s% {$ p) }& o6 P/ Y
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    , I4 x5 r8 W- P
  16.     }
    & I3 M* z) ^  v  D7 N. j
  17.    
    6 ?% t3 H# W1 L/ Q6 K1 h" h
  18.     getInstance().report();
    : D0 h6 ?; z* Q$ {% {0 q# H9 l
  19. }
Скопировать код
Метод unloadAllScripts()+ d# Z. g9 G; ^, z& ^" m! @$ ]
% [3 j1 e* x) Q0 Q/ k
  1. /**, h) J3 ?4 ~- P$ E6 b6 q
  2. * Выгружает все квесты и скрипты.
    % }, l) e& ~; \+ d) Z
  3. */6 r& V- r' [8 r8 r  y1 W! W
  4. public void unloadAllScripts()
    9 p0 a; U: S+ {
  5. {
    ! M+ U$ A/ F/ [2 r7 {0 p
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");5 j3 j8 c) y( P# h
  7.    
    ' _1 I5 C; `4 x6 L1 g' L1 _
  8.     // Выгрузка квестов., A6 ]4 E5 t  ?- _
  9.     for (Quest quest : _quests.values())2 X' B3 f, c! U1 ^$ H0 E' ]
  10.     {# ?9 [) [$ S. h" `) ~$ ]
  11.         if (quest != null)4 p% h+ K) l! |% Q' }5 A# P1 x
  12.         {( |2 V5 y' G8 f& }* J
  13.             quest.unload(false);
    : X5 ^4 [6 e: [# l
  14.         }
    9 a, Z8 ?9 Z! y
  15.     }
    - b. D2 j  J) k- B3 ]
  16.     _quests.clear();; `1 y6 v- p  ~! C5 @
  17.     // Выгрузка скриптов.0 W* h% k* W) T0 H
  18.     for (Quest script : _scripts.values())
    ' L/ y$ _8 F( U3 ^9 X& f" y
  19.     {* l9 E2 Q- w6 v: f) }
  20.         if (script != null)8 Z/ X$ J$ j$ I, t& c1 f
  21.         {
    & Q$ g- j9 G: g. j; j
  22.             script.unload(false);8 o- c0 d. v# O
  23.         }8 T0 y- o$ Y" p5 l2 ]
  24.     }
    ' O; b! w" _5 ^+ {# s, G8 _
  25.     _scripts.clear();
    ' C; B( a3 O- @  t; d+ G. ~: s
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. s4 m9 v; r1 @

* `$ m0 I' H6 @5 hМетод report()
+ D1 a7 L$ Y. n# Y7 Z
" ]: v; A7 M+ i+ v/ L) o1 ~5 H, @
  1. /**
    + M. z. f8 Z0 ~( v$ Y9 K7 j: r
  2. * Логирует количество загруженных квестов и скриптов.8 @+ ?) E( r  \3 @1 C: Q" S% x
  3. */# [* t% F2 a6 W' J0 V, g/ p
  4. public void report()$ Q' r+ r7 [( }8 |
  5. {
    5 B  j0 {& W5 x* @4 W% c
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    " ~5 x0 N# S5 Y; t8 L4 O, {. E* \
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ( W6 j3 {( X7 c" \& |
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.$ q1 G' w: F: K! h3 D

9 w) p0 H1 [8 ~! _6 M1 u! T! QМетод getQuest(String name)
7 O. f- S( r. T- H% h2 d  u" U: N: k, `3 h; ]' j8 B, R+ U
  1. /**. d) z! n. o% m7 u# |
  2. * Получает квест по имени.
    " e: [* D' j8 O1 S, ^
  3. * @param name имя квеста
    4 p. a, ^$ K5 S7 U( j2 ]# t" g# V0 g
  4. * @return квест
    " Y0 ~. ]1 ~+ t' o) ~9 S
  5. */+ i3 A: I9 k0 R" l. N
  6. public Quest getQuest(String name)
    : F  s. X# k4 T2 B! b# ?4 k
  7. {# Q/ O# ^, P6 `- ?
  8.     if (_quests.containsKey(name))4 S3 F5 I# E! n1 L& \
  9.     {
    ( j5 y3 c9 c0 D) B. I% K% a  g
  10.         return _quests.get(name);, F; h/ @, g' G0 E3 _
  11.     }# `7 D: L; a% V! P, \
  12.     return _scripts.get(name);( x' K9 ^+ U. u' C
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.! g  p9 w6 h% \& S$ q4 I
% w; U$ t! C7 R; v! d
Метод getQuest(int questId)0 t! E$ E/ j6 O. D# j

; }- B, L- }0 o; W
  1. /**. l7 y( Z4 H- @) Y
  2. * Получает квест по ID.' u1 L7 p# Z! ~
  3. * @param questId ID квеста. b% V2 t8 i8 ?' ^  L! G
  4. * @return квест, если найден, {@code null} в противном случае. |. \' k9 f4 b  l
  5. */7 s3 g( [+ p' V( x3 b4 z9 f5 A
  6. public Quest getQuest(int questId)- I1 L7 h8 k6 S# q: k
  7. {
    & q$ n6 i8 t3 @! |
  8.     for (Quest q : _quests.values())
    8 g1 _+ Z5 U" e2 w7 q
  9.     {, {1 e4 C2 e9 r% r" M. P8 h
  10.         if (q.getId() == questId)
    ' i: s0 y. P  {8 k
  11.         {+ M2 r# T2 P3 N# N( w
  12.             return q;6 Y9 f3 V- P8 \- E
  13.         }
    ( J9 y5 E0 m5 A( R) A
  14.     }$ {. c/ a$ \: n8 a( Y
  15.     return null;* _9 \8 u' t! |1 d' {  I* z
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.0 t: ~- i+ j+ a, D7 g# a4 g: I
: m- @8 m4 d, E6 |2 ^" c0 b* z: `8 d/ z
Метод addQuest(Quest quest)$ v$ N/ s  p8 T: W3 F

0 U+ a& I/ G# ~) S
  1. /**
    ( T& U- D* _  S! ?; s
  2. * Добавляет новый квест.* f, R8 W8 Y1 b% K4 ~* [! t
  3. * @param quest квест для добавления
    0 v& C/ a0 j  }+ L7 A' t
  4. */
    8 F6 z3 t1 g) y5 `+ C
  5. public void addQuest(Quest quest)
      ?6 g+ M  ^2 O) J6 v8 k6 [3 P
  6. {
    3 a: I& B; v) @8 H- d1 G. u4 _! @  u
  7.     if (quest == null)4 T2 s- F3 r, c. g3 ~0 Z! u
  8.     {/ ]7 h6 B) C' I. w
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");  J% _3 G: n/ q8 C# k' r
  10.     }# e* y$ Y  h8 g8 _! u" x9 ?* n
  11.    
    + @: P8 Q; f( n' G  e6 e4 |
  12.     final Quest old = _quests.put(quest.getName(), quest);% ]* w' P* C9 r6 C; o/ Q! B0 C: ]
  13.     if (old != null)
    * c4 |% a" X: v8 c
  14.     {
    8 g! _& [6 Z% i) G# O
  15.         old.unload();9 x: w, _9 N; S/ S& V
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");$ l. r9 r3 k# }1 z7 r+ c3 s/ m5 K
  17.     }8 \2 ]- J8 q' t1 U. F) _7 |3 ^3 h! X% v
  18.     8 P& C' M( k, q# f/ C
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)4 v) I- R$ ^5 [7 A) ?
  20.     {
    5 ]' w- w7 @. ~$ e5 j
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();& D5 |/ r8 p' n
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    . W% ~5 ?/ ?- K4 ^$ i4 z2 ^
  23.     }
    ' G& |2 a  Y! M) n  w
  24. }/ N4 [0 f8 l  d- j. {
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
* u8 t& f- H& S2 {ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 b. ]. K0 o9 _' T5 e2 A0 w! F9 L( a2 w. n

1 b' o/ u9 f/ _- j% a" r
& O1 v( n% [& t- }5 j' e+ Q" E
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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