Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ S2 M. s6 [; m6 Q
6 d5 h6 k+ X+ u0 G2 }+ ~2 H- l5 f
Разбор файла QuestManager.java
) z/ k1 _; y: c* \' o
- m* X: o* s, j7 K0 i2 QЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., U/ {! n6 [2 ]; Y# y, o
Основные элементы
2 P* J+ ^, H- O, ?
  • Лицензия& r: T2 N! L! w! V  L9 X
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      / i& U: u: N& P1 u# d, k, A
  • Импорты3 q0 S7 J9 j( o3 s* w2 v/ g0 K* z2 o* H

$ \: S  I' X+ _( ^" x1 Z, t" d' ^QuestManager.java — управление квестами и скриптами.
, j& d! r' ~, f* m4 z* DПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
! V: a4 N9 [8 k. b* v# P, V0 W7 h! |$ P4 C# z" i$ \, E7 x
  r: }# y( x  d5 w6 h+ ]1 L
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' p) b8 a! ^0 }# Z+ O( H1 Y/ b2 [
1. Лицензионное соглашение
/ A8 X% f' s% r. c4 [+ v) R. ?  a
  1. /*
    6 y. I8 C1 Z1 w) x0 x2 H7 H+ C
  2. * Этот файл является частью проекта L2J Mobius.
    7 L" z- X: u; ~1 a( |% d1 I: l3 @
  3. * , \3 a9 H+ u: P$ `6 Y1 z
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять' F" k3 E1 h$ {/ X
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    6 A4 @6 @4 |2 m4 {7 O; d
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 r6 }: D& j) ]. L4 L
  7. * " [$ I6 `* V6 g9 N) ^" N# M
  8. * Эта программа распространяется в надежде, что она будет полезной,* ^+ [8 ^( P  q0 n' q+ {4 U
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии) g* U3 _/ n6 H
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ' J5 ]( J( ^2 O$ v% W  |
  11. * См. GNU General Public License для получения более подробной информации.% O. A+ N) |. u$ s0 M, k% i2 ^
  12. *
    4 [# i0 S' v9 T! i8 u
  13. * Вы должны были получить копию GNU General Public License  g6 A6 A( T8 E, _# M- ?
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    ! k) F+ A$ d& |
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
1 H& c. s% B1 |  A
$ v4 e7 G& ]& o) U" N
% E  n+ v+ i' d: o7 A2. Импортируемые библиотеки
1 V7 X* @% v' `" k
! t9 V5 L0 C' N; v
  1. package org.l2jmobius.gameserver.instancemanager;9 B4 v3 F4 B" I4 `8 H

  2. + B- I3 I0 @+ @1 i+ M2 h
  3. import java.util.Map;
    9 O- q5 |% K- ?: Z) {: u; p
  4. import java.util.concurrent.ConcurrentHashMap;
    & a! d. H( p- V5 D* j0 s
  5. import java.util.logging.Level;
    0 r! L6 T( i  H
  6. import java.util.logging.Logger;! X: t7 H8 s) `- ~* G* k/ p
  7. " D3 x8 l8 P$ m
  8. import org.l2jmobius.Config;( l2 w6 U# M% k5 h% s
  9. import org.l2jmobius.commons.util.CommonUtil;
    ) }6 |& V1 ^( a: ]$ \( C8 ?' S
  10. import org.l2jmobius.gameserver.model.quest.Quest;+ K, b( ~# [0 R0 K' `
  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 — менеджер для работы с игровыми скриптами.. S7 b4 L( X4 K; e. T# J

. P3 v" d& a6 G3. Описание класса QuestManager2 O. c: x/ s# h; B$ r
  1. /**
    % J2 f5 b( m3 U" z
  2. * Менеджер квестов и скриптов.
    8 `3 E; O' c- v$ b' B" p$ }$ Q( d
  3. * Автор: Zoey76
    # R8 i( Y/ ]# k) [- ~: o
  4. */+ S! n0 V! E8 `
  5. public class QuestManager
    : j2 _/ J, Z& [! L" y$ w# H
  6. {( _2 N6 _/ N# ?2 l
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    ' u' B3 q3 u2 G5 T8 O1 R
  8.    
    9 t; Z4 [7 B+ `
  9.     /** Карта, содержащая все квесты. */
    8 F4 o7 P+ u6 y0 P6 f
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    $ V" d$ C. T3 a& C2 N& B+ r
  11.     /** Карта, содержащая все скрипты. */: K4 {6 K' M7 C% g$ ]8 R: B
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    9 C5 k: [/ s4 [" {8 r# G3 }
  13.    
    ) k1 n' t7 P: ^) j3 E$ }: o% ^
  14.     protected QuestManager()' D2 _- e" S/ I; ^+ `
  15.     {  w# B  N9 j: a5 A: i9 ~$ o- q5 }
  16.     }. n" k0 y" n- B$ R2 c  M7 q& r
  17. }
Скопировать код
4. Методы
4 o% U; m- W% y9 l3 E1 }Метод reload(String questFolder)
4 `" U; M% z, I! j2 m1 [9 M+ G
  1. public boolean reload(String questFolder)
    7 _, v8 x: z* V2 ~3 a2 Z# u
  2. {
    ) a& O1 R6 F% U0 ?
  3.     final Quest q = getQuest(questFolder);! z. S- t2 k) w7 b# }
  4.     if (q == null)
    " R6 \$ i+ i& ^6 |8 j
  5.     {
    ( p5 `' b& W0 d. j- S4 L
  6.         return false;2 ]2 S8 q1 J: K6 n; w7 k
  7.     }
    ) }8 l( B( e: g# W5 H
  8.     return q.reload();
    # |0 u% V1 z  w9 V% {4 T, z/ W2 b
  9. }
Скопировать код

+ ?* B+ l6 A  ^' C' O% d! _/ G) J6 T; s4 F! d* t* F
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
5 o: R9 l) e5 M& \( x( ~! VМетод reload(int questId)7 c9 m9 v: Z. L2 Y( x/ m4 F, N

$ U$ F. ~7 A! L' S% J' I
  1. /**
    % N& A% j( R- m. W) \
  2. * Перезагружает квест по ID.
    4 Z; U2 ^8 m7 _0 F1 }6 A" O
  3. * @param questId ID квеста для перезагрузки
    3 |. l. X1 ]4 Q% [
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае" s" s# ?1 p  s  \/ ~9 N' r! X
  5. */( {& a  e/ v* d
  6. public boolean reload(int questId), |2 I. R) ]& m
  7. {* ]1 ~! F5 `( p0 g! g8 Q
  8.     final Quest q = getQuest(questId);
    0 H: m/ }# _' x& e2 h* B
  9.     if (q == null)
    4 c  z( |/ I# h
  10.     {
    " B. a% K  V5 ?" s6 A0 m
  11.         return false;
    3 h- V/ q) v0 F8 _( X
  12.     }! f$ H" |/ i5 O9 E, }5 M) o( F( W
  13.     return q.reload();
    $ m# k- o: a, x7 N1 ]7 [0 v
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    - Q$ ]% I1 x2 V) y) P1 v

- r3 V- D3 s3 |! u: x- J& YМетод reloadAllScripts()7 z, [9 B' j( {3 |2 I/ \7 A

" u! `9 D0 L4 E
  1. /**6 U% S* H! d- ^+ _$ N
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.& {  p* s! G" _+ D) [8 t3 v! |
  3. */' V% ]' `9 P- R% I6 O7 J" Q) Z
  4. public void reloadAllScripts()
    : ?. D$ f: S; T8 o
  5. {4 L5 x! P% [9 l* s1 b
  6.     unloadAllScripts();& B6 m/ K2 l( u2 P. T( U6 \# f
  7.    
    6 f1 ]' o2 E( @3 z" K9 Z  }" j
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");3 E5 ~/ ~( \1 p( F7 q2 A
  9.     try9 }% p& H+ g' J- n0 N
  10.     {* X( r- M; S+ j5 b( ?
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ; ?2 C6 s' T9 R5 e' p& S' u
  12.     }' G' l; T0 w0 N" F
  13.     catch (Exception e)4 B3 O2 _& b, o' ^3 [# e* G! C  {
  14.     {3 Z4 x% O/ w$ N( {# o1 @
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);2 o2 {0 _$ q3 d# R4 ?0 u& X4 {; F, N8 [
  16.     }
    # x( |6 w/ a$ {
  17.    
    / B, v7 R& U, A/ [, `0 V
  18.     getInstance().report();
      r$ [6 d* A. k( V) C0 M9 e
  19. }
Скопировать код
Метод unloadAllScripts(); ?# U5 f# a2 K
: I7 v5 }+ Y6 h/ e
  1. /**
    8 N! U' l. d0 }# z
  2. * Выгружает все квесты и скрипты.9 l) u# s  k2 v5 Q- p" W
  3. */
    0 ~& O1 |/ P7 `" Q+ x8 ?7 m
  4. public void unloadAllScripts()
    $ X3 {3 s% L8 [
  5. {4 Q! K0 M; A* T
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ; N+ M4 |$ D" R
  7.    
    - ?% Q* L8 J6 ]) @8 a2 _
  8.     // Выгрузка квестов.- x: {! _8 O0 s
  9.     for (Quest quest : _quests.values())
    1 J4 K+ d) e( Y0 t3 \$ @1 P4 s
  10.     {8 F# {& t  r1 e0 n7 C
  11.         if (quest != null)  m9 Q& U& Q& m+ n- C
  12.         {
    % e/ w/ x7 f8 p. s2 i: }
  13.             quest.unload(false);3 l# Q' ]1 F- P2 J5 k% J
  14.         }
    - t& x0 A( l: s5 ]/ j7 K! h
  15.     }; k4 @# Q- Q) b/ _' w" n) k
  16.     _quests.clear();
    9 c7 D) g& Q/ R3 G1 t; K; _) D! z
  17.     // Выгрузка скриптов.
    5 U7 x' Z; w; M" h( I/ O# L) S
  18.     for (Quest script : _scripts.values())
    . i) r) n  f' x. P9 ?4 Z
  19.     {; P$ ]% H. G7 B' S( M5 {* ~
  20.         if (script != null)
    . V! M) q; u% z. A; @- a
  21.         {
    9 R+ l( i6 X! z( v8 j) ]7 X
  22.             script.unload(false);% `/ O, @5 |# \9 B# O% o" X# k
  23.         }, V3 [1 r# x: Y, H# W3 n) r0 @! S
  24.     }
    / h7 a/ W; u& }. Q% D' J) N
  25.     _scripts.clear();
    8 K, ^# G$ R" h+ L7 T5 H6 R
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ) `) @: |4 w( v8 h

4 Q. e8 Q3 [% K  D& P: G% Y% v. iМетод report()
/ d* Q$ o+ ^  Z; H; {3 K  @" z
! k3 e; S4 W; c4 A5 G2 O
  1. /**% C2 u- ?/ y$ @* b5 R
  2. * Логирует количество загруженных квестов и скриптов.7 V. I& E& n8 q1 C$ n
  3. */6 d$ i8 `; Y  v
  4. public void report()1 Y8 Q" k9 B8 G) J" Y" U8 o) Z  U
  5. {3 O; H. _% p: L% C' i1 l
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    : f3 A7 C. S' C
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    # x2 u7 G! T6 T& i: |2 O
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов., ^) p) B+ W4 z' k, P7 G  q8 \# w$ n
) G3 e( B' O1 T7 i
Метод getQuest(String name), Z* y% ?5 o4 Q4 J) J* a$ k
: u' U7 L# f) Z) I; F5 g
  1. /**
    & n! [2 K2 m( O; ~6 n6 I
  2. * Получает квест по имени.
    , G8 v' n" i, d# T
  3. * @param name имя квеста
    ! m/ X( b& e  g. {" h1 h. Q$ i
  4. * @return квест) d# x/ C9 Y' s* V
  5. */- Y" f) F7 d/ S
  6. public Quest getQuest(String name)0 u0 q' l0 l1 P% V
  7. {
    , m% q( o) S; E' H9 m
  8.     if (_quests.containsKey(name))
    7 _7 ?1 }9 g; i# z
  9.     {
    ( u& ~! v- J" |8 g
  10.         return _quests.get(name);
    4 s5 i4 b) X7 W$ G8 b7 K
  11.     }$ x. m- |- z# ^" a" A5 @
  12.     return _scripts.get(name);) L$ P2 L4 w2 v0 W$ `9 a
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' @  @+ d0 G! N3 D! W7 Q; h: b
+ C4 N6 E! V- D  e; q8 |% n# K8 G' ^
Метод getQuest(int questId)3 a, k+ r6 D' N6 I0 Y3 J
9 o/ x* g2 d  y* o9 g' T0 s. e# @
  1. /**4 m5 ~/ S0 C# x
  2. * Получает квест по ID.2 `7 @  r1 M, a
  3. * @param questId ID квеста
    # ?! R" k( f" _' t5 Y
  4. * @return квест, если найден, {@code null} в противном случае
    8 N) O# b9 P$ t$ n3 w
  5. */
    0 G. \8 W+ W! b; [3 E0 [
  6. public Quest getQuest(int questId)5 c) W% u/ Y7 N7 U
  7. {
    3 n  q9 T" x# N! G+ Z! S
  8.     for (Quest q : _quests.values()). [( S3 g- {& ]0 d3 g
  9.     {1 M. j& ^- [& u% g1 O
  10.         if (q.getId() == questId)
    , ^9 y6 s- F$ l6 o
  11.         {7 E4 H0 @) h6 X0 \- G8 f  ?) Y& H
  12.             return q;7 P3 U4 }: c% H/ b
  13.         }! f4 t; g5 P6 X& s1 y
  14.     }
    9 v) N* `! d" a! t
  15.     return null;
    6 X# O. P) v1 x5 h% i
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    : y3 J. Z* g7 v# t9 }
3 w# O' e# c' Z" j
Метод addQuest(Quest quest), }/ u1 w3 G4 C/ y% S2 W

2 n" J0 q* S7 q9 ]3 x/ x
  1. /**/ s% C+ p& `9 z. M! G
  2. * Добавляет новый квест.& l  `! |" d0 E* {* e% @! O
  3. * @param quest квест для добавления9 \: Y: I) }8 B# W1 G) X
  4. */
    3 h# P6 J. h+ b4 {/ u6 z
  5. public void addQuest(Quest quest)' {; n$ M* M/ P5 U6 X" Z  \
  6. {
    + P* V3 B. V' p8 H/ i* m- I6 Y
  7.     if (quest == null)
    $ U; B+ r/ J- ]" _- ]2 D
  8.     {
    6 x4 i+ J9 x2 n- W: m
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    . {: t+ {3 M6 o8 v5 ?0 B0 A1 z: x/ h
  10.     }
    3 ?6 q. T& g( C
  11.     ; u5 ~3 t4 _9 u4 N+ S  V5 g4 W" x$ ^
  12.     final Quest old = _quests.put(quest.getName(), quest);
    " ~, }& l9 e, j3 q: A
  13.     if (old != null)
    : a5 {: S$ u6 ?. G
  14.     {$ ]1 M. q$ H% f2 o* T9 d
  15.         old.unload();
    6 q( {+ ?0 x2 r* s# _
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");# u1 w+ Y5 A/ ^2 {+ a5 M
  17.     }
    , z- Y. M& P6 W# I1 r
  18.     : S/ J) e0 ~! `4 e/ J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)1 s! G6 K% B& Q
  20.     {# N; A0 D2 E% _. U* f
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    3 U- ?) Z2 ]) m1 }
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");2 n5 |' _  R6 K* h, F& I
  23.     }2 o+ l$ y2 O9 u
  24. }) z: ]' s! J/ E6 a
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
4 R4 i3 q. Z: MЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
# B9 A1 J# ?: w4 H( Y
6 D4 s  t# i! u
1 C2 S$ z4 Z3 _. w/ e0 P  l5 _
/ B- b$ \8 h4 ^1 |5 x
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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