Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius) q6 L( `4 p0 ~! B
2 _1 e( V8 {- b; q# P% L: }
Разбор файла QuestManager.java
7 w* o3 l' E1 U. D5 v; t, a4 B: _: a5 p  l7 H* ]
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.4 ?! T3 X4 K" j1 E2 T/ `$ D4 C
Основные элементы& Y/ M. R& d9 Y' M
  • Лицензия
    ) r) w: G8 m: c1 q
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.8 Y# R" }  ~% K0 P! b. ]0 T
  • Импорты; y' M0 S, e5 d, {* }8 Y) X& y
) ~9 {* L9 r; y
QuestManager.java — управление квестами и скриптами.! d  }5 j/ m" B/ T7 Z
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\6 f% |9 g% ~7 Y2 O

% I/ s6 f: ^1 c' Z0 x
) x/ O* s3 I7 V' Z
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ h( Y! h! B/ p% O: X$ W9 D) C1. Лицензионное соглашение
: d! h( f( n4 ?6 b, f3 I0 C
  1. /*/ p9 ?  o+ w9 k) v$ ]
  2. * Этот файл является частью проекта L2J Mobius.5 z; P$ G9 k4 F% [
  3. *
    $ ]1 w9 F, E0 c1 @/ M, A; q
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять6 A& ]' @; S, f3 o) i( d' a2 D
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    2 g% ^# I* L+ ?! f# E
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    . I6 E, k2 P/ V3 V/ z$ S
  7. *
    & g9 Z# d& W8 K' T! w, R7 D
  8. * Эта программа распространяется в надежде, что она будет полезной,
    + ~* D3 u) P: f) q% L, u! x  U
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    4 q; I" p# b, N  S& U6 Z
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    2 U& B8 _4 X& _, |  M
  11. * См. GNU General Public License для получения более подробной информации.4 a9 Y# D% D4 D
  12. *
    0 m4 K6 ^9 x- P- `$ K. A; T
  13. * Вы должны были получить копию GNU General Public License4 {- V+ x/ a  g4 A- I" ?
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.* a; M  L- Q1 H1 W6 D1 e1 r) v$ t1 ^
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
; [' P+ y5 x$ D- h* u7 e2 @" e, C# C( i7 |  l
+ J, a% x: m0 O5 w
2. Импортируемые библиотеки
8 @/ M5 S6 a; s' e
+ j8 x; s( T6 B! h. `
  1. package org.l2jmobius.gameserver.instancemanager;# ^5 M9 r2 _. O# }6 K- L

  2. & ^2 X. T0 m# L. _! j
  3. import java.util.Map;. ^( `! n- D9 }1 k' I( O# M
  4. import java.util.concurrent.ConcurrentHashMap;- I3 U# n0 r: l* z
  5. import java.util.logging.Level;8 L# S) ^& e) |0 e
  6. import java.util.logging.Logger;
    0 U! v+ v/ V& [, z( H

  7. ) k" q4 G% Q2 g# k) \, J0 h  o. {, `
  8. import org.l2jmobius.Config;
    5 F0 B5 u  R) n# v$ a) h
  9. import org.l2jmobius.commons.util.CommonUtil;
    1 y: x2 D! p* M$ H2 c5 ~
  10. import org.l2jmobius.gameserver.model.quest.Quest;: r8 Y( C3 N, ?$ S, F- T! |$ W5 i
  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 — менеджер для работы с игровыми скриптами.
1 b" r4 v1 o5 T; }/ [) n( s9 c
0 F1 N5 ]4 P, i) Q+ N! E3. Описание класса QuestManager
! W, A1 }9 n2 d+ L# P' y: b" ^
  1. /**
    % M& R2 |" [9 x2 X* w* q3 u/ R
  2. * Менеджер квестов и скриптов.9 w( C4 i8 ~# Q
  3. * Автор: Zoey76
    . `  U; ~7 @1 Y% r" Z; _* U
  4. *// R3 k  A8 _& v, b' b% |( \
  5. public class QuestManager
    3 V' @' s; A' R3 K5 }
  6. {
    5 U  V2 @4 x6 s: G3 E9 T
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    # F% |( q- g- j6 U# X; o' ^
  8.     0 d: K% w. z" C! C/ `& {7 \
  9.     /** Карта, содержащая все квесты. */
    - W8 M. f2 Q1 N- o( V4 p( `8 k
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ S, G/ f1 x  s  [( [, G: l1 j$ ~
  11.     /** Карта, содержащая все скрипты. */3 x) s* G  Y( d# M
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' i7 P/ {( b( }! |2 @
  13.     - l' l" W) a2 U* X  v
  14.     protected QuestManager()' N% _3 g& U* X) A9 y. E/ ?  ]' c
  15.     {
    $ `& d* U& a# Q, ~# i# Q0 z8 U/ ]
  16.     }, B' Z6 p0 g2 A/ V" }: Q- U: Y
  17. }
Скопировать код
4. Методы' k4 s3 Z  E% A, q1 h- t
Метод reload(String questFolder), O, x$ _7 L8 l4 {, i- a
  1. public boolean reload(String questFolder)# d- O: n! K1 h2 Q7 d
  2. {
    0 K* g4 n5 `& m9 r- n& R
  3.     final Quest q = getQuest(questFolder);6 W9 `5 L5 m, c* b
  4.     if (q == null)
    $ b1 m: @6 [4 \, k$ }7 E
  5.     {
    6 j& v1 d) h- _- C8 a7 q
  6.         return false;
    , a6 k6 D( h4 o
  7.     }  ?, \$ d3 k- Q  B8 q% q
  8.     return q.reload();
    , G+ F, v! u! _! ~7 d" }
  9. }
Скопировать код
- ]' u% w0 V9 q5 k2 Z, }
. }( J7 s/ I9 R3 F
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.$ P  V) z4 W( p) y8 y. @3 W
Метод reload(int questId)
$ O! V$ X9 H4 p7 E$ d4 S2 s+ B, G/ X: o5 j+ p9 e
  1. /**
    7 P% o. P0 P9 T1 K
  2. * Перезагружает квест по ID.
    4 d( ~- u) f( f
  3. * @param questId ID квеста для перезагрузки" P" ^% ]' y& t
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае5 z3 D2 l- l0 c8 G7 z" @& L, x: [
  5. */
    ' b, p: e: z7 r3 _( o
  6. public boolean reload(int questId)  E3 d5 n2 I" ^% l( w3 n9 ~- f
  7. {6 \: L, Y! ?, H+ l) D" Z3 q
  8.     final Quest q = getQuest(questId);# ^3 j. q0 W! p: r$ E
  9.     if (q == null)6 ^( Z2 P& c* W: i/ i( r* l
  10.     {  {2 c5 y0 z& r# q( `+ ~6 W
  11.         return false;
    7 v# x/ j, l: z9 C  ^8 }
  12.     }$ V# s8 U6 k4 I7 }0 g; {
  13.     return q.reload();; a% o; w2 t# m9 c: b8 t; g
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    7 t, J# G3 F9 Y7 y  f+ _5 |9 D
8 c, }- u( U# w% u0 q* `" d$ C
Метод reloadAllScripts()
, t$ i, t8 T% n- v5 `: t9 a$ Q' t. C8 r
; k6 N5 y$ J/ u# L
  1. /**( {+ f  w+ t! E8 d- ~
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.2 D2 b+ f1 o5 d' w) T& l9 k
  3. */* V8 o. y2 I1 s9 o0 k2 s
  4. public void reloadAllScripts()
    8 y. D0 j3 k3 r3 i
  5. {
      U& W( O9 E# ^: `; Z
  6.     unloadAllScripts();$ X0 w1 N. f& i% F1 Y* W
  7.     4 E% H% _7 C; H# W
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");* U$ C; R1 C8 H% H, ~0 h0 A- i
  9.     try, j- c/ m. G* ~% X; r
  10.     {5 v5 o" g" \+ y
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ( V) R. P3 Y7 [$ A0 i2 R; J5 n1 ^1 ^. c
  12.     }
    ) {- Q$ t  s  B0 m
  13.     catch (Exception e)
    . }( Q' l% D- l. V& e
  14.     {
    % _7 z2 D. ?7 @7 t; l! Q/ t
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    ' o. @! q% j" g9 C8 o' A
  16.     }5 ^* ]) O) _4 w( @. ^! L: F* h
  17.    
    " t# n0 ]8 [- o. |/ J$ x. \
  18.     getInstance().report();. F9 S; u! B6 Z# ]- K
  19. }
Скопировать код
Метод unloadAllScripts()6 k4 }: r( j5 I& ^9 \
# f- ~6 K. w6 _/ U& f, O
  1. /**2 R* U+ `$ X3 F$ S& H3 \" g
  2. * Выгружает все квесты и скрипты.
    & ~2 b" j0 j3 ~" K
  3. */" N# ~4 E% s7 n9 I4 D
  4. public void unloadAllScripts()2 X. R& y9 ]' p7 X3 }
  5. {6 W; N. B- x% ~- F
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");8 v! B, ~$ h5 J( m. B7 x; o* y3 u
  7.     3 v  O  y0 \  w/ d4 t
  8.     // Выгрузка квестов.8 v! ]. V8 V# X
  9.     for (Quest quest : _quests.values())/ Q, Z9 L. U4 S7 u! j6 D
  10.     {. A7 j+ v8 [1 k/ m- }
  11.         if (quest != null)9 o: T8 V1 @' s; s6 [. W( Q
  12.         {4 n: H! t  W. y6 \7 P9 M* E  x
  13.             quest.unload(false);
    0 {( L3 }, c/ ]/ Q! v; k
  14.         }
    5 n- m# Z) p1 j
  15.     }
    8 N. f7 R: p+ Z1 L. b
  16.     _quests.clear();
    3 _& G, d& [3 Y, t+ ]
  17.     // Выгрузка скриптов.
    . x$ w- X9 O  @3 {
  18.     for (Quest script : _scripts.values())
    ( [/ g7 ]4 `" R8 T
  19.     {
    2 R4 Z5 v8 R" w& a! |4 m7 q
  20.         if (script != null)
    : a3 y9 I+ T3 i% E# A
  21.         {* [6 B3 B( h% _, C8 z, s1 D
  22.             script.unload(false);
    6 G( q! |  C( ]' _5 ~
  23.         }
    1 T* g# P; t% t$ ?5 i) |: L6 n! v
  24.     }& p4 Z4 j% ]2 C+ q1 w
  25.     _scripts.clear();! {3 V( ~' D& X& [  q
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    8 B4 T. u1 e5 b! `# y4 @! i

0 N3 K3 ^9 a1 w( B3 S' C5 [Метод report()6 |6 Y! P6 k% _, j6 Y2 D2 v0 ?
+ P- Z5 w" \: |
  1. /**
    4 e: W- j' _2 B# L9 w/ f
  2. * Логирует количество загруженных квестов и скриптов.* b7 m+ T( M/ s) s( c6 a  n: M1 F
  3. */- d: A) `& d: i3 G( [
  4. public void report()) P; u( I4 k/ O( c
  5. {
    8 w  N; ]5 W, y# q5 t1 ^
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");- V) [) ~2 q" V# R+ N* a1 g) F
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");3 z& [6 Y# ^, \4 Y6 t5 G+ L
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    * Z5 O2 S# }% o# Q' Q( k

7 j6 d; e- i' y1 A" U# G4 mМетод getQuest(String name)+ n6 a  v3 s1 y6 |

. z$ O( A+ I# @1 V$ p: Y
  1. /**& i! I  v! l* H. b0 |4 y
  2. * Получает квест по имени.$ D) b2 y* Q) `  V" B
  3. * @param name имя квеста
    ; }2 ?( s9 {& ?, ~  D( J  M+ l( O0 K
  4. * @return квест
    0 M" d* N/ M2 G2 c# X( @7 w0 v+ I
  5. */) J5 a* K7 Z9 a; b) I' m1 e
  6. public Quest getQuest(String name)4 E( h8 F1 S8 o6 g
  7. {
    1 m2 Q% @. t  t* o6 M, I8 H
  8.     if (_quests.containsKey(name))2 H+ t( @  }. E+ n3 G- c/ x
  9.     {
    ( Q4 B' w/ W, S* s& d
  10.         return _quests.get(name);
    ) B$ v  m* y/ i/ n
  11.     }# ~+ `$ [6 c8 |7 a0 O
  12.     return _scripts.get(name);
    / T+ r% c! K9 O; ?
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    6 L* K/ j& |  M( T! h
  C( C+ c" d; M. b( F9 ^5 s
Метод getQuest(int questId)
- g6 t4 W, }% h; n3 a/ v$ Q2 A
# y/ ?# n4 m  |! s6 n8 w
  1. /**, v: v# }- m: B, k& \
  2. * Получает квест по ID.
    ; q0 D$ b- H  O6 F9 Y
  3. * @param questId ID квеста+ g4 P5 v! E; G
  4. * @return квест, если найден, {@code null} в противном случае
    6 I& K2 G7 y" e" b0 c+ Q3 A
  5. */
    1 n* l! O1 l+ j" r8 X4 `
  6. public Quest getQuest(int questId)3 X7 M! C  V: a$ u4 ]. R. E
  7. {
    0 j. ~5 f) N" z4 [; @4 C6 @; @
  8.     for (Quest q : _quests.values())
    7 f% O8 ]# r  ~, H) N
  9.     {
    8 Q! G+ b8 m% _- D) ^3 I2 ~
  10.         if (q.getId() == questId)3 J9 K* ?$ X! V( p0 S
  11.         {; _" W- c8 y+ A
  12.             return q;' R6 j1 e/ \3 f
  13.         }
    ! U. E3 b1 Z  M7 D
  14.     }4 p- ~* B! }! c# k$ s
  15.     return null;- @; ?1 |9 D" I
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    & c5 a  Y/ c& o4 ^( b
. c7 U  j# O* R( o( u) e5 |+ T
Метод addQuest(Quest quest)
" w: ?, D+ V2 Z+ i2 X! ?( u
6 i3 E: [; B0 Z0 c+ Y
  1. /**: |, S$ F. O  F, T
  2. * Добавляет новый квест.1 p# c& u( l- y, Y7 u, M# X
  3. * @param quest квест для добавления
    % A2 j3 u! i/ }: v
  4. */
    8 G+ V; A% F  N* l( G
  5. public void addQuest(Quest quest)' z% ~8 l% E& q) l; b
  6. {
    1 r" P* k# F  R+ i
  7.     if (quest == null)% Y& g, x( ]6 c) L6 L, _8 J6 {+ m, Y
  8.     {
    ) U* m: y: p( F8 n" I7 T* @; I
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");% u8 {+ P$ C; P1 N+ N
  10.     }
    9 B0 M$ x, P% Y6 i( d
  11.     : a  V! f1 _7 x* M4 u2 V
  12.     final Quest old = _quests.put(quest.getName(), quest);$ _/ p/ l+ y: H+ W  M% U1 F% u
  13.     if (old != null)1 w! L' ]$ u5 k5 b0 p
  14.     {
    3 }# n$ B: t1 {. y4 y+ C# D
  15.         old.unload();7 z  E5 B/ P: z1 N, u
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    & ~0 Q* U$ V& K$ o
  17.     }( g) `, ?0 y! d
  18.     & L7 u5 }# y0 i' s- @
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    . z# R: u1 _0 Z
  20.     {
    ; T6 u5 b) s' J/ |0 I
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* w) {, m, C+ d
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");$ E: B! X2 l% I6 ~
  23.     }0 B( J9 e2 I4 r2 X# D! G
  24. }6 M7 u: Z6 j5 o5 b9 S2 p5 P
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.( G/ S' d7 ]; |/ B
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.( b; `8 _6 _$ \1 V7 j

' g1 L7 E/ R4 t' ]$ Y1 I% U8 x1 M- N4 {* s1 @3 N
2 F" r6 \6 @. ]1 u/ r
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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