Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius0 h4 A+ m' _5 ]
1 l1 G/ U  o7 P( l- i
Разбор файла QuestManager.java4 @% e+ {0 T0 I6 J: A
- G% K5 A2 H; q1 u% h$ q# f3 C
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.5 P" b/ N6 @6 ?% ~1 l. x
Основные элементы% c& y2 P( A# Q) Z
  • Лицензия: A0 U' P& e) f
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.- @) ~, S0 s& W1 C3 G3 J
  • Импорты
    4 |  |* k) u. \+ g0 P

# J' T5 T0 U0 [* dQuestManager.java — управление квестами и скриптами.
% q$ K4 X4 k( b4 ]: c3 n4 LПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\! L& ?6 r" [  j7 V' ]1 W

% k' I) I3 _5 |. _

3 C2 e' R' |- k; D( e! h3 VДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.' y3 W" i$ v" R9 L
1. Лицензионное соглашение
; W) a( o. a& @7 ^
  1. /*5 S! ?+ j& c8 }6 C6 V
  2. * Этот файл является частью проекта L2J Mobius.; o1 l+ k8 }" t
  3. * 6 ?/ y1 k4 {; |$ B1 R4 q4 E: P  g
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять& H& O1 e2 D. N
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    & d" v& n2 N7 y) L6 ^: u
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.8 [6 u" Z- C3 o8 Q9 Q4 D1 Z6 Q
  7. *
    4 z4 k- S) C- R0 s7 w
  8. * Эта программа распространяется в надежде, что она будет полезной,
    , s  N3 |% }8 c& t2 G
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии4 ^9 ?7 [- H. {; i- N
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      X& W% H& `* A- F7 ]; P3 K* W
  11. * См. GNU General Public License для получения более подробной информации.
    " f3 j+ U% ]4 n, n5 m) ^
  12. *
    ! V" ?& i, z( a7 |3 k- ?& o
  13. * Вы должны были получить копию GNU General Public License# H; x8 T' ]$ p8 F' @6 ?
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    # Q1 a1 e# K2 l
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.: C/ I, Z' u! H

2 y/ `4 I: Q  h/ A
# x  ]; o2 r. Q! W) ~0 C: i" d2. Импортируемые библиотеки
8 L. Q% S7 R  K8 ?" r1 c1 ^0 G: R
' l0 D$ A: Y1 f7 N$ F2 s
  1. package org.l2jmobius.gameserver.instancemanager;* `) Z6 u/ S; b

  2. ' W- j1 c& o4 x5 G% f( `3 f* F
  3. import java.util.Map;% a. w) O; K$ z0 I& d- f
  4. import java.util.concurrent.ConcurrentHashMap;
    ; I. K8 c' f+ B
  5. import java.util.logging.Level;
    ( r- j6 T8 ?* O. u
  6. import java.util.logging.Logger;! I3 ?0 ?" k4 F4 b

  7. - N  D1 w# z* ?! S' s9 C
  8. import org.l2jmobius.Config;
    " {5 A' q7 Y9 }( ~
  9. import org.l2jmobius.commons.util.CommonUtil;7 p# U1 }# ^/ C$ |& P
  10. import org.l2jmobius.gameserver.model.quest.Quest;8 i& R" {- W  K- Q. x0 T  y, U0 ~
  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 t' o# N4 k  _# I8 a$ H3 f
, ?9 c2 g, `! X; c1 R
3. Описание класса QuestManager6 Y5 {% s. L- F: }
  1. /**9 Q! j. r3 Q1 J4 ~! V' N
  2. * Менеджер квестов и скриптов.
    . W/ V; L8 i. n. o0 [
  3. * Автор: Zoey76
    ; v4 i/ y+ H: A* @
  4. */4 d' h* j3 n; l5 V- x9 P
  5. public class QuestManager$ h; @* Z. z" n5 ?9 g
  6. {0 e6 k) R3 b' W
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());3 I2 I$ G; u* T" z
  8.     - ]" m: F9 ^! a# h2 e7 W( a
  9.     /** Карта, содержащая все квесты. */
    # i# A, H5 X. e& u# R
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    7 w$ f2 \3 x! M  c
  11.     /** Карта, содержащая все скрипты. */
    ' M, i2 R% O' s1 Q$ v8 s1 z: v
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();) J2 y% R/ q( ?3 I2 w  J
  13.     ) F) ^* G* e1 \
  14.     protected QuestManager()/ ]; Y  G3 A. j# B
  15.     {8 w* A5 P, C0 `1 t6 i( }
  16.     }
    : w4 A/ s8 g( G# z% p
  17. }
Скопировать код
4. Методы3 X4 _1 B* o7 A5 ~  I) s7 D
Метод reload(String questFolder)
) f, L& i4 F2 N, P( ?* U  B
  1. public boolean reload(String questFolder)
    ; y/ A8 [$ O# {) E8 S5 }, X
  2. {
    0 P* B! u3 |8 w( c
  3.     final Quest q = getQuest(questFolder);
    8 L/ m! e$ v# j- R, n. ~% f
  4.     if (q == null)  I, y  `7 m- k7 j! H
  5.     {
    6 {! y  g9 g0 W/ G. y8 L! Z+ i  f) v+ j
  6.         return false;5 z3 ^9 P7 z$ D, r( I
  7.     }
    4 X1 l/ \2 V. x) h; \
  8.     return q.reload();
    + n6 t( c& m7 j
  9. }
Скопировать код
/ L' r$ o7 y4 u6 q" C5 x, Q
# r6 n; G5 H, V, E1 r' H3 Z
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.1 j" H! b4 b1 X  }* Z$ j
Метод reload(int questId)
0 r9 s2 T3 t' D3 J4 W! Z0 H
; Z) X, d$ U/ l
  1. /**
      }$ b  Z4 F& w6 k( F/ K- m
  2. * Перезагружает квест по ID.
    1 N; ^1 K" Z& i. e" I6 g: J0 ~) p
  3. * @param questId ID квеста для перезагрузки
    % K1 {$ ^* I/ P# N# y
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    " r0 C* x* J$ H4 O  u
  5. */5 ]# e& J5 n6 u9 v7 ^- D1 i* l7 ?/ U
  6. public boolean reload(int questId)
    . W/ S- j0 w9 T
  7. {
    1 {9 k! D& @6 e$ b  j( S- q9 R
  8.     final Quest q = getQuest(questId);6 g8 w( H- T8 c- K/ n
  9.     if (q == null)5 Y4 L  [4 d6 n& n" c
  10.     {; c3 t, I, y  [
  11.         return false;4 {+ K+ O& p: G& \) v6 v/ x
  12.     }
    7 y4 }  ^" `# e7 J% J4 W+ k" G  r
  13.     return q.reload();
    1 P. \- G/ {( r
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.9 U1 _0 v/ `( A% p2 |  V* f
/ I" g0 m9 v6 {/ l
Метод reloadAllScripts()3 }* [- D; x7 Z/ a. B

5 x5 Z+ B" F1 ~: A7 x2 J
  1. /**
    0 S) B7 p8 O& F7 V- q4 M
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    0 K) Q" W3 b) z% P& S+ J5 e4 ?
  3. */
    2 x) T/ Q4 Y+ Q* ^) H
  4. public void reloadAllScripts()
    ( j% s: N/ s: \3 i
  5. {; t' W( J. u7 }1 j' {, \# J; P
  6.     unloadAllScripts();! Q% P( R& f1 {- j7 n2 o
  7.    
    * m2 B1 a& t( a) F
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ( d  a& {5 v- `+ e3 b8 J$ M
  9.     try) A2 X7 Y: `" a! J
  10.     {
    0 C+ W- |- Y2 A+ J6 P7 x
  11.         ScriptEngineManager.getInstance().executeScriptList();4 T" i- f# n* e6 i, s
  12.     }
    2 t6 t. O3 a+ E  U6 u
  13.     catch (Exception e)
    6 j- n$ @2 a  R3 w7 R1 X
  14.     {
    ' e( i3 s9 |" ^& U* U) d& W
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    * e1 A# |. Y& Q; D0 z) I0 n' h
  16.     }: I0 A- M/ ^6 d( d% X% n# @
  17.    
    6 f! s4 \: T% g- ~3 V4 ?; Q
  18.     getInstance().report();- I; W  o( d* ?% s
  19. }
Скопировать код
Метод unloadAllScripts()
- l9 y$ c9 z4 h  v
, m' p& R" _. u# H1 Q7 k
  1. /**' y' g" ^- n0 h& H- O1 `" p0 M4 ^
  2. * Выгружает все квесты и скрипты.
    + v4 ]3 r4 E% O# a6 a
  3. */
      W- D& N$ C. c. Q7 ^
  4. public void unloadAllScripts()
    ( Y3 g* n% i5 Y! X+ k
  5. {5 ~6 D+ i2 l! a# k, N. c3 k5 h$ n
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");2 H" v2 z* g' M1 L
  7.    
    - F( a: i! t2 Q8 }1 D' A3 d& ?0 g
  8.     // Выгрузка квестов.1 R& q) ~; L6 A; }! j& |
  9.     for (Quest quest : _quests.values())
    " r  l" |. H4 W4 g" k
  10.     {2 w+ h6 N6 B2 \5 \  x% a& y
  11.         if (quest != null)! z( x( O) u/ F/ P% r, n
  12.         {% M( D6 I5 T) g7 {
  13.             quest.unload(false);5 w) R5 M( Y: w# G
  14.         }. }9 j+ ]# e/ Q% X& j
  15.     }
    2 X! y# v% T7 H* M3 ?( w
  16.     _quests.clear();, {3 {# D3 J' J* m7 g2 e9 {9 d
  17.     // Выгрузка скриптов.7 g( M3 {1 j+ O, r  H0 ^) ^9 J
  18.     for (Quest script : _scripts.values())
    2 u6 H% M7 g- `4 `
  19.     {: [! \' V( g% U) r9 b+ z3 @
  20.         if (script != null)
    9 Q: z/ g/ b# f  ?. v
  21.         {) ?3 T) z/ F! I' M
  22.             script.unload(false);" F; i6 |" w7 y) _& v8 a! z" [
  23.         }
    ) }; m- A& P' r. m2 t) K7 V$ w  D( s
  24.     }
    2 ?! w! i7 o& u/ b
  25.     _scripts.clear();% q& c- Q# V& \' q* P+ Q# D
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    , n! i1 ~8 j: B# G/ q7 f5 i

1 @- Z; ]3 [; K) FМетод report()
* l% _4 [/ i* A* B: f3 c. u! H- J4 K- ^# I: B  G  g
  1. /**
    4 M7 l; `  U; V- w  E( B) q, X
  2. * Логирует количество загруженных квестов и скриптов.
    * w( e! q# `  L* F
  3. */& d7 o  {' U4 N3 C
  4. public void report()1 F# G, x/ k& h: W8 }$ d) q" {1 Y; L
  5. {
    ) n/ s; @3 }* s0 a6 l- f! C. C) E7 L
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    0 s! T2 L- |# I3 C* D& E
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");6 n$ V/ Z; u5 E" B, l* s
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    $ D1 M# t& F3 h/ s$ ~. E

. w+ s: z" T3 S& x, L' _  ZМетод getQuest(String name). ?+ T2 Q8 L1 Y% i- x

! q9 f/ P0 r- P
  1. /**/ P  e: F6 {7 O  s' `! X
  2. * Получает квест по имени.' l% o) a+ _! \& p/ L' I% w% q
  3. * @param name имя квеста; x9 j# y% m; P
  4. * @return квест' ?/ \8 ]! g6 F! w/ T9 z! [; l
  5. */: c4 ?& k3 q" R& }: u& F: U
  6. public Quest getQuest(String name)! W1 j0 |7 A/ W) N2 C
  7. {% M! b- F+ T; a7 \, o
  8.     if (_quests.containsKey(name))
    ) @9 Y8 ~' E1 I0 H  E6 V$ ~
  9.     {
    + O) n$ u# i, `" G' v1 p( ~
  10.         return _quests.get(name);
    1 s% K. u+ L8 x/ W
  11.     }
    $ v% O% ^! F1 y. z& Y7 Q& L% s6 D+ e. f
  12.     return _scripts.get(name);; ]1 J" s! W7 ], _& R3 Z
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ' m' y) N/ r7 L7 \& }' _

8 q5 [: |( g! eМетод getQuest(int questId)
2 _: _( @. I5 c+ Y$ |" F, k$ H9 U" F4 f+ [- V9 ]5 a
  1. /**
    , @! f; ]% P6 b9 y8 s, p
  2. * Получает квест по ID.! ~6 g  T5 A$ I8 ?& T
  3. * @param questId ID квеста: x! V) @/ \1 m4 \# \
  4. * @return квест, если найден, {@code null} в противном случае
    6 @+ ^7 j  l3 ~% M7 M- c: @
  5. */
    & w8 l, b! ]4 F" s6 P
  6. public Quest getQuest(int questId)
    " c  }# c) H) x. o7 V
  7. {( A& C  z& F; V) @: K$ K
  8.     for (Quest q : _quests.values()); ^( _7 T) p2 \) v# f9 ]
  9.     {) `* R& o/ S  b  \' V1 _9 Y8 v
  10.         if (q.getId() == questId)6 i3 Q/ O* l1 N2 t& o$ P
  11.         {
    ( I) |" C' b2 e. i/ D( t% u
  12.             return q;9 k; }- s" c4 y
  13.         }0 V' W; y- @+ b
  14.     }
    5 b$ C8 u6 m& b
  15.     return null;
    1 B* [8 e  |0 ]# ~$ `& b* N* H
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    / {# k, k+ W, U' M+ S! x: o8 z7 A  s

+ R! z. ^, I% \% uМетод addQuest(Quest quest)2 n+ L0 b/ @; L( ]: I9 A

1 v. Z; }2 c7 ~" H
  1. /**
    + l" i6 D! c) T9 q: S
  2. * Добавляет новый квест.
    & J) r* Z5 ^% e; Q
  3. * @param quest квест для добавления
    ' R, U5 X6 L3 W9 T: D
  4. */0 _8 t+ X) m; K! v, Z/ `0 p* n
  5. public void addQuest(Quest quest)
    . s, R: k9 V6 Z) }- ?; U7 z/ r
  6. {1 W7 T; U' r: b2 z
  7.     if (quest == null)0 H9 D1 R- I) \" q
  8.     {( h5 r: e) Y' a7 i; f+ _8 F
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
      B3 I; k- b4 i& ]. w0 Z% z8 @
  10.     }
    & L- H* I# j% L# ?
  11.    
    ' u; Q9 _/ |9 X8 B8 g
  12.     final Quest old = _quests.put(quest.getName(), quest);
    " f5 u! {8 b7 Y% e$ G
  13.     if (old != null)/ t8 a( {+ L- |: Z8 p( I* j+ R
  14.     {
    ' K& e) Q( {. y4 d5 d
  15.         old.unload();3 B: \0 o; T- [4 D' l7 y2 z
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");" A$ m: q" f& c2 e+ J0 v" c
  17.     }$ c) O9 L) k+ s3 Y3 v
  18.    
    + y0 M1 y, M, f
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)" A* N' V/ O( I' `
  20.     {
    2 R" F& ?' e' n, s" v: F3 F" R
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();( K, q* K9 h6 [; |8 I" A: {! `6 U% I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");0 z5 }/ `+ Q# q4 \4 k
  23.     }2 k+ B- k; U+ B0 r' n8 G4 c
  24. }* h! j0 B* w+ Q/ g5 i. c) |( Q
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( J" [5 t$ {; W
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере./ C: ~" D& P" n1 l- W

# ?( g/ H0 O: P1 m, \" [" F# v! o
2 ^- l8 y) l6 b% f9 F+ q8 V; x1 ~2 e
' w0 A  r, D# ]/ U1 P/ A* M" ?
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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