Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
$ V% r1 S2 K) l4 q9 C! E" `- \$ u! a5 g' s( m
Разбор файла QuestManager.java$ D. a* |) t% G' J. q) w4 Q% T
7 v( ?$ P9 ^' O. X
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.& w# t3 a# k& j/ p
Основные элементы! B: b- `% Z# l. A) s
  • Лицензия- n2 K+ _* |8 N. C
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии./ Z3 I' D2 S3 `
  • Импорты
    # _1 v4 \5 H# n+ D% \

/ y! B. ^5 @9 h% j' dQuestManager.java — управление квестами и скриптами.. v0 x* b! N- @2 ?
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 s- \# l4 G8 I9 b

5 M8 f/ x# i) I4 u; `

4 x8 N1 |0 u6 yДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.! b3 m% C) n. E9 y4 |6 s
1. Лицензионное соглашение! I6 @# o+ L' F& x: f8 c
  1. /*
    9 u$ Q% C) m4 U; \5 ~7 O
  2. * Этот файл является частью проекта L2J Mobius.. @% E- s- Y, t% C! z' |+ q# I/ T! O6 N
  3. * - {5 ~& _8 G% D% V2 ?; D
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    7 m6 O" m$ ]* m9 c: r
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    1 e- a; x9 _: e5 |
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ e8 A! S" ]4 A' a" Y
  7. *
    " _- i3 u! [  S: |) p- m4 ]$ M8 l
  8. * Эта программа распространяется в надежде, что она будет полезной,6 u, k$ T# L4 ^3 M& y& e1 P
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии2 V7 x2 `' Y. P7 I  i
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.' s* F3 U. w' i/ R# y' _9 P6 K3 M% r
  11. * См. GNU General Public License для получения более подробной информации.0 `4 w  R# r, ^
  12. *
    : R; [* z. q1 B) p
  13. * Вы должны были получить копию GNU General Public License8 W5 C7 G3 }1 Y+ H* T
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.: K- M  Z- U( D6 A) s9 `& g& I
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
3 }6 y& J$ Q3 ?  S9 N% N2 P% N( z2 ], C6 v

( `3 |% X; Z! L% H! a6 B2 E2. Импортируемые библиотеки
" M6 ~9 D, \) [4 j; ^: Q6 I* X- E4 o4 o, U: b
  1. package org.l2jmobius.gameserver.instancemanager;$ |  p4 E, ?& m/ s( a3 J
  2. * F9 P- k) c% @3 k% l# {: J+ r) H
  3. import java.util.Map;4 m9 A6 I5 x3 W1 B
  4. import java.util.concurrent.ConcurrentHashMap;+ @4 {1 {: `- ?/ R0 X0 n
  5. import java.util.logging.Level;
    9 C  m* g2 G) b" N) `- v
  6. import java.util.logging.Logger;' n0 s( C* j1 w% t! k
  7. ' V+ n8 B, F" x( x9 K% @, E
  8. import org.l2jmobius.Config;
      }/ Q/ H- ?! |+ d$ a
  9. import org.l2jmobius.commons.util.CommonUtil;
    , h* B. `7 v$ F6 i, @8 O
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    & m1 z; D$ |' U) @' 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 — менеджер для работы с игровыми скриптами.
& d, J3 P6 {! O  r/ x: u; u/ G# Y3 h, U! B2 f' Q  t
3. Описание класса QuestManager5 S, W8 x: |% p0 E1 Z8 h
  1. /**
    & S& Q% l2 ~2 g# C- g0 k3 F  s
  2. * Менеджер квестов и скриптов.
    " X; N0 P7 W, H8 i
  3. * Автор: Zoey76
      U$ [- {: O# i4 Z
  4. */
    : i; X( {, g' r; y  v( s- V2 R
  5. public class QuestManager
    : F- G, X: o" N0 D9 M- g
  6. {# v+ x/ l$ K. h
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());7 _- X0 \# O) T( F8 ]" M+ X
  8.     8 m- _* [+ D# T& l
  9.     /** Карта, содержащая все квесты. */
    ) d& m) `) \1 U! R
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    - {; U( Z6 D1 D2 ~
  11.     /** Карта, содержащая все скрипты. */! ?* t, V2 E% {
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();, A7 i! ^& W3 L+ X7 y- m
  13.    
    $ Q9 I! H6 w; h* q
  14.     protected QuestManager(); {8 i6 ?2 d- H( a
  15.     {; R$ f6 H0 N  x9 {3 L, Y
  16.     }4 v, n* x1 Y' F$ {6 L
  17. }
Скопировать код
4. Методы0 `# C- P3 c3 ]0 Q  U  @. O/ C
Метод reload(String questFolder)
+ X2 X2 ]' y* S( V
  1. public boolean reload(String questFolder). E) |4 y: |- Q
  2. {
    # }& q! \% Z* X- x5 {7 C( ~! f" n, g
  3.     final Quest q = getQuest(questFolder);
    * [" E: A& G! }2 E7 j: d+ ]$ k
  4.     if (q == null)3 L# B9 Z2 r5 Q3 W0 I4 D8 t
  5.     {6 K; i/ q2 `8 ?2 C0 A0 a4 O
  6.         return false;
    7 c- [& c8 B$ x' m
  7.     }
    : e( o- Z! k4 v6 C* ?1 w, s* h6 W3 H
  8.     return q.reload();4 l% R* c+ G5 {& l/ D" @& V
  9. }
Скопировать код
9 T0 k4 {( T1 B& ?% [/ H
$ M7 k* l: Z" X4 n7 \, z. {
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
$ T6 ~$ [  O9 f9 _, D. tМетод reload(int questId)9 ]" u/ C/ N- n: L3 X  }/ G) v

; a4 B$ Z, K- K* u& z) I- J# ^
  1. /**
    9 h5 @* d8 z' h
  2. * Перезагружает квест по ID.
    ! e2 ^: N% Y" R0 T$ A7 C
  3. * @param questId ID квеста для перезагрузки
    ; l  z$ W' z( l) b- Y5 K; F
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    4 I+ N9 @/ |' \& _6 A
  5. */
    6 u- U; @6 V9 E9 h6 _* @$ ^! S
  6. public boolean reload(int questId); s' t! T) l- M* h
  7. {
    5 N  w! @5 F* f5 Q
  8.     final Quest q = getQuest(questId);
    ( k$ m) H3 a/ E% F1 D, s
  9.     if (q == null)* w1 R7 {  d+ Z
  10.     {
    + y/ C& x; R4 W
  11.         return false;
    $ j5 X: p' ~/ g. X( t/ Z; d& R
  12.     }# e$ M4 L8 C7 ^1 N. B0 g8 X
  13.     return q.reload();% O4 M, H5 p4 w' W. P) Z- D4 y
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    % K, e, T* g1 ^$ b) h9 [

7 o3 I4 i& \) g# m' [) U0 YМетод reloadAllScripts(), ^3 M3 Q# E5 ]9 B! ?- C

/ x& K+ g2 M* }1 I# U( }
  1. /**
    4 X* M, P4 d7 i: S) h
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.. \8 F9 _; r7 X  x5 S+ t+ f
  3. */+ z( F* X0 F3 m
  4. public void reloadAllScripts()
    ; B# T- i0 |* R5 y8 j
  5. {
    6 e# k* _1 K4 F/ q$ E. ^. @
  6.     unloadAllScripts();
    6 [4 y. r7 v6 G& F$ {9 U7 z* L5 z
  7.     + Y; N) A+ t3 x# C9 P) g" G2 j
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    + P8 w  P3 t7 j0 n) v+ b
  9.     try2 g* N# f  q4 u1 u+ [
  10.     {
    3 Y1 g) J4 F# D4 i# z% M' R* `
  11.         ScriptEngineManager.getInstance().executeScriptList();
    1 l7 z9 \3 a' y
  12.     }
    ; A3 Y1 j% L& V# N1 j
  13.     catch (Exception e)
    & i- d: h" U3 i% R
  14.     {
    & m% y2 ^6 r, d0 Q0 O. Q1 D
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    5 q& I1 h5 {& ^1 B! C) r& x: r
  16.     }
    ; v! N- e/ K7 J! d9 D
  17.    
    ' N0 `1 t3 E* L2 }
  18.     getInstance().report();4 X8 x" t& a4 b* K* l
  19. }
Скопировать код
Метод unloadAllScripts()* u0 @/ @" L3 p0 ]; R

6 D5 `+ L6 k, T3 T4 q# t- E
  1. /**
    ! ]; ]" j  U4 n- x7 V  G
  2. * Выгружает все квесты и скрипты.8 K$ V& e" S* F5 H: q% p% u
  3. */
    4 }7 E& c8 y" e
  4. public void unloadAllScripts()3 q9 u2 |+ Z0 f1 f
  5. {
    6 ]; ?) p; u) y! d& g1 {, _% M
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    9 ?4 X7 I  ]; t  p- ~. G% I  ^
  7.     , m6 U7 @# d) d+ a% c! i0 |
  8.     // Выгрузка квестов.8 l. F) B+ |% A
  9.     for (Quest quest : _quests.values())
    6 ]+ F& i2 C0 ~& _
  10.     {( i( q7 a- i; B0 S# r
  11.         if (quest != null)
    ) I  Y* U: v3 T
  12.         {
    & _: a! N6 E( @2 o, M
  13.             quest.unload(false);
    6 W! |4 Z& @. q8 |# X' S9 n# @. X
  14.         }
    , h1 ?; g" s! Q7 X6 ^5 t
  15.     }2 g7 A2 b6 \; D+ h1 D! l9 W/ H
  16.     _quests.clear();
    ' ^0 Q3 x  R0 g: D
  17.     // Выгрузка скриптов.
    ( I9 `2 T& P* e) B- |4 q6 A
  18.     for (Quest script : _scripts.values())/ x4 A. O1 x1 `* Q1 F1 Q$ Q
  19.     {
    ( Q! r) e4 u2 L9 g' Q
  20.         if (script != null)
    ) b4 C) ~3 x5 F$ T  V8 P( x. V
  21.         {  ^8 j8 M8 L- M( ?4 T/ M. N, h
  22.             script.unload(false);" U$ e; R% }9 g  r* _
  23.         }
    9 K+ x, u  w3 j. n" [+ {
  24.     }
    : ^* ^. L- f3 l3 F# ^/ ?
  25.     _scripts.clear();. b; C* G( O3 H7 l* I- ~
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' l/ s1 G* o9 E) k" x) r. u. f
% F+ K! f* \  ]9 ^4 G; U8 A
Метод report()
3 _1 f3 e3 \3 y/ ~4 K9 q! V, @3 N$ Y( G) U* u- f* t) I
  1. /**1 L8 a. l7 q, E6 D& M  J2 j
  2. * Логирует количество загруженных квестов и скриптов.
    - i. I6 {. y; O! i( ^7 T# O0 u0 |
  3. */
    6 u; t5 h) S. s& v: i4 J9 q
  4. public void report()
    . @) O$ p; |. ]5 Y4 D9 s% K6 s
  5. {+ @% ~7 S# R5 t; e* [' R8 f
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");3 w' A+ ~" Q# C, Z& N+ o9 R! J0 I1 o
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    . M% K& J: a4 E
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    $ {6 S% }9 ?0 ]
6 t( s/ K! c8 ~# Q( h
Метод getQuest(String name)
1 h# c7 w; x. T! D) X8 w1 `  u. L" Q5 e& N0 [3 s( `7 \
  1. /**3 _  }1 ]7 C0 x1 |# s
  2. * Получает квест по имени.
    4 E7 o1 @5 v, `4 `2 L+ j
  3. * @param name имя квеста( O) y# {/ L1 K" j# j5 q: y
  4. * @return квест
    1 p7 y+ ^, z2 d3 Q: d4 A  I9 ?
  5. */
    " k1 j/ k8 U) v: d& R
  6. public Quest getQuest(String name)- D  H2 I- v1 m' k- Z# q
  7. {
    1 b9 Z$ W4 h' x6 n0 `
  8.     if (_quests.containsKey(name))
    4 K, z8 z7 A; u( q; p# l
  9.     {, T# n! X! J+ J- _+ Z
  10.         return _quests.get(name);0 x  i# }3 I6 r" r
  11.     }) v7 y& ^0 g( O) o- f/ p" ]& N* f
  12.     return _scripts.get(name);6 o) ]  \: S& {0 V
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    : B, P9 o6 P0 w4 c# L* Y* D( m
, |  X  M9 S, V) `$ f
Метод getQuest(int questId)! M1 K9 m9 S: E- B. q- e

% ]; f4 o" x* ]3 z: A( |! o
  1. /**
    1 l( m, r( [4 F0 ]+ ?. `
  2. * Получает квест по ID.
    0 g3 y+ k7 [# r, i
  3. * @param questId ID квеста% u% K- R6 V% e* t' X) a
  4. * @return квест, если найден, {@code null} в противном случае8 f, }( e: a: B+ D0 X
  5. */; d  `5 p# [- J5 |
  6. public Quest getQuest(int questId)7 Z: Z$ O' H: ^& r; r: @! ]
  7. {  t4 f2 P) Q5 l% `( v( o
  8.     for (Quest q : _quests.values()). Z! u+ ^. C/ S& L# J
  9.     {# Y! d7 c. `: z
  10.         if (q.getId() == questId)
    , M+ b2 |/ a& n  x, w
  11.         {) O) m) \" b- W8 j, }, \4 E
  12.             return q;, B0 x1 z, Q& U9 ]$ j; y
  13.         }* Q6 N" O: [/ H2 w& ~4 U/ H" D; C' f
  14.     }
    6 T* Q5 _4 v4 l4 _1 d
  15.     return null;
    6 J: s$ q4 T  ~3 T5 l$ w$ W
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.4 Q% n3 W9 W! \
- y; N* u9 C" x2 J
Метод addQuest(Quest quest)% ?& e% p! v8 ?. @. f# R

9 b; ?3 q! i1 X. D, x, t9 _
  1. /**
    7 h0 s) u3 \1 g% C
  2. * Добавляет новый квест., U% T8 S* r$ L! A# j+ x& T  w& |
  3. * @param quest квест для добавления1 a- A7 s( d# g1 s* m0 T% s! x) R
  4. */1 _, Z4 P: H* d0 _( J# X8 H  I9 v
  5. public void addQuest(Quest quest)& A# B2 a' u! m$ ?$ z! W
  6. {& Z# b4 D4 l; y! ^
  7.     if (quest == null)1 {( {/ R" v4 T9 E/ H
  8.     {- d2 c. r# a% u9 Z
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ( `. e2 ]7 u" t) a' N
  10.     }0 z1 O0 n9 O/ r1 z! p5 f! G$ h# B5 @
  11.    
    0 G) ]- J, F, W$ ?$ w  j" \8 m
  12.     final Quest old = _quests.put(quest.getName(), quest);
    + g% J( ~- X- H* J
  13.     if (old != null)* j: K. C3 Z) e6 C9 l% U6 a2 u( r
  14.     {
    & a9 U1 e+ c+ j4 j
  15.         old.unload();4 y. l7 }$ J9 Z9 K/ O4 X
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 W! K- s' P9 ^" N# O! Q
  17.     }
    ( I" S. x  O" t  w6 g. o4 p
  18.    
    * P4 ^+ Y9 V* x  I) A3 E; f3 C8 }
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ! c/ ^% q; l" ^  e4 D. Y
  20.     {: X3 V" j: B% A
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    ) W: M! @7 U; |- w
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    # r) b9 C6 O0 e- d0 N0 Z
  23.     }- M2 O+ X# Y* T/ R4 U
  24. }
    2 Y4 w- Q# `8 b* Z! C; U' R% |
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.4 s6 f' h( y+ ^4 M. h4 B
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.& S; ~6 G8 k, T7 [' b/ r

  J, ^3 n8 ]9 A* [1 s. S- r3 e3 D" ]( O. ^( G8 C

+ n) C8 f& ?. V% w& f$ H
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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