Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius. A+ R. M7 |' q9 |: T" q- I
, A0 Q! Y/ L* g% {$ Z* E
Разбор файла QuestManager.java
8 |! {5 Y/ n4 o$ s: v" ?: {) A" F9 W' |3 J$ ~
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.% H2 I9 S; U. _1 Z% u1 t
Основные элементы0 P/ \6 Z7 Y; N
  • Лицензия
    . j' T- w0 r) S) B2 |* p! g
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.7 s+ c3 C& r0 d' {, Y& m
  • Импорты1 o" i8 H. J" O/ K1 f7 S4 M

: Z! S8 j, ^5 B  i: N: k' n" EQuestManager.java — управление квестами и скриптами.
( V( a# g1 w( m) H; v* ^; b$ PПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\* h: `6 H+ q# Q  B

5 Z+ j& f8 d+ Q( S* m
1 T5 a9 A+ F- u: L2 ^6 R
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
; h$ y" z6 _. \( F+ i) Y: F1. Лицензионное соглашение
2 {" b( V/ M7 J- [5 N
  1. /*
    7 I1 ?6 M7 J7 D  }! p3 R" [
  2. * Этот файл является частью проекта L2J Mobius.; _6 V5 U, X: Q
  3. * . M3 n0 y! H- v# H
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ; t9 ^1 v: N6 Z) Y3 }# ?  Z# ]
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    8 z2 A; K" x3 e* d+ D$ A' Q
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    1 V2 N: {! T# |  q+ r# I
  7. *
    8 W+ V( Y* O  J! |& \7 L; C) {
  8. * Эта программа распространяется в надежде, что она будет полезной,4 a" X% B( O. [4 n
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии/ b/ q, j/ z/ b  W
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    7 w2 r( R  J0 t4 [1 V
  11. * См. GNU General Public License для получения более подробной информации.
    3 d* O, u7 q$ ]. d
  12. * + {: h0 C! V1 A6 {
  13. * Вы должны были получить копию GNU General Public License
    ( H9 W  D% y# N9 m( E8 V. s
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.0 Q: R* P4 W: v
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.* N  g4 F( p5 p- g5 a+ ^
# A; B, U# o$ k5 g

/ j" k# l  g9 ~: [2. Импортируемые библиотеки
3 F* W6 C+ c" H& x; R2 y
- `. A/ \( X5 `; ?; a
  1. package org.l2jmobius.gameserver.instancemanager;1 ^4 J+ Z- ]! ?( k4 Z9 W' P' h
  2. 4 Y3 j$ @" t+ ^4 Z
  3. import java.util.Map;
    ' z( c! j. {8 Z) Q) X# `7 u5 g  @9 ^2 i" {
  4. import java.util.concurrent.ConcurrentHashMap;/ b) }  K( I: C+ `6 @5 K6 U0 _
  5. import java.util.logging.Level;
    2 r4 u9 p: n' Q3 r2 w# P& o$ l
  6. import java.util.logging.Logger;( C/ s  [( P$ ^
  7. ! W5 I3 V; h9 G+ i; O3 h! `
  8. import org.l2jmobius.Config;- B$ |: Y! G& P) ?$ |5 F! q8 {: R& y
  9. import org.l2jmobius.commons.util.CommonUtil;
    , O; Z, B7 U! ~( B8 n+ p
  10. import org.l2jmobius.gameserver.model.quest.Quest;1 y/ m7 L" z4 Z$ X' E
  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 — менеджер для работы с игровыми скриптами.3 W  ~  ]) _/ q; [3 B# ]" O
8 K( o6 k6 b; g
3. Описание класса QuestManager
8 U8 q% E9 n# D) H
  1. /**
    ! p' i9 T; D/ }. A. H! Z' S
  2. * Менеджер квестов и скриптов.9 J7 e5 p; L- }# |1 v0 [2 o
  3. * Автор: Zoey76
    " n' E: y! n/ a# G8 U7 H
  4. */
    $ J  g9 f) Y/ Z$ ^! N% ^! u
  5. public class QuestManager
    # m. Q2 N2 n8 F" d
  6. {+ J: `' W) q8 R6 r7 d
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    8 ~2 `6 k" o' `# L) H2 u
  8.    
    $ m. ?- G! S( T6 f
  9.     /** Карта, содержащая все квесты. */
    2 \! `- }. s; ^, p  _7 _/ `
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();7 |1 o+ N3 D2 ^; N8 [
  11.     /** Карта, содержащая все скрипты. */
    ' B: |# Q! }# G& N& ~
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();$ {. u4 v9 \9 k6 a
  13.     - f' ~4 l" J! E4 S# ^
  14.     protected QuestManager(): O3 [+ p$ i/ S& i1 S. p  L, i' @
  15.     {
    % }, w4 m: h4 `9 z# f, V9 L6 T
  16.     }" @1 Y( D; l* c4 P! K: m# h; h
  17. }
Скопировать код
4. Методы9 I" w0 [2 h4 H1 w& K4 ~! q# m) m
Метод reload(String questFolder), b9 R9 V6 d. O
  1. public boolean reload(String questFolder)  {% C! y2 |4 T3 m0 _
  2. {
    ! t( _# c4 j$ S! u' {" T
  3.     final Quest q = getQuest(questFolder);
    2 P8 C- F* a, P2 [0 T  L. E
  4.     if (q == null)
    & J5 x: I% i5 W
  5.     {
    4 N1 ~. O7 e- r: A
  6.         return false;  h0 @- k) C" M& {% P* j' }- u/ S
  7.     }
    9 f, ?' k* `# _
  8.     return q.reload();  k' P- V$ Q2 G9 w, K
  9. }
Скопировать код
1 d8 Q2 k% [( g' P3 d: i

$ q' N9 Y9 O4 a- _/ x. BМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.# C% h9 C8 o$ n1 z& C4 F
Метод reload(int questId)' M# N) x$ A' Z+ @; `- _+ u4 O

, u: \4 n) x: O, H4 O- j
  1. /**
    6 ^/ E1 i0 }( x: F
  2. * Перезагружает квест по ID.
    & y8 ~( }) }$ e, g/ {, r
  3. * @param questId ID квеста для перезагрузки9 V* Z# i) f8 _8 p( K* |/ }3 ^8 l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    / C- e2 \; l4 a5 R
  5. */
    * n8 j5 l3 i8 x7 Y0 S3 l! i
  6. public boolean reload(int questId)
    8 L- s7 j- p  \) z' F, f4 F) j
  7. {
    6 ?7 g8 @4 m: v
  8.     final Quest q = getQuest(questId);* h$ h+ K$ i5 H( C. u+ U/ {3 G1 Y* p
  9.     if (q == null)6 m8 @" W" _8 C' a
  10.     {
    3 L0 B- X2 g  l0 P
  11.         return false;, n/ d" c6 D' ^# V
  12.     }
    3 m: h7 y7 g# B# F1 u2 r4 k# {, f
  13.     return q.reload();
    6 \* S+ H2 ?1 x0 s5 u' K- V
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.7 f* h0 o. f& @8 ]/ J8 l
* p1 ]4 _7 _7 w: s
Метод reloadAllScripts()8 e4 S6 K0 y% ^- V7 A- A4 w9 ?

* L0 `8 E$ f+ N6 s* I" O% x
  1. /**
    1 M2 W, A  y) ~: o$ ~9 y
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    & X& t! L/ _" i& j" G
  3. */
    ' ~2 F, n# w" L8 m( I$ X
  4. public void reloadAllScripts()' O" x2 e' r3 L9 _
  5. {
    0 Y5 i0 R5 x! Y; ]" l6 Z6 g
  6.     unloadAllScripts();
    8 ]9 b6 M3 Q% g" @
  7.     / V. T! g( c2 H9 _( o- }2 c3 }
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ; C% g" Q) V% l8 D# ]
  9.     try4 y9 i+ r' {( I7 {& `# N; r
  10.     {2 G5 x6 }3 A$ ]8 G% j0 n6 T
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 {( i( j; H8 ^9 @
  12.     }
    9 C! G, y7 G/ w, W6 q3 ^( E
  13.     catch (Exception e)
    ( K! F4 I2 `( R: q9 [, v
  14.     {
    ) G* ?$ s$ {8 \7 \1 W
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);6 a% R3 d+ F; X6 m% Z9 d
  16.     }
    % o& w8 h5 e- F5 i
  17.    
    " A/ ]& \" m8 E
  18.     getInstance().report();3 f* O8 k6 S0 S! D/ m  z
  19. }
Скопировать код
Метод unloadAllScripts()1 s: n: I0 M/ p) e7 C6 A

2 q6 p3 |& G- n. C  T4 V: A7 q. n
  1. /**
    4 |' t9 L/ e9 h0 Z* W. n, T
  2. * Выгружает все квесты и скрипты.
    " J- T* Z: Q( i: i
  3. */" R- G  @* w( [* F. X+ a6 C' D( c
  4. public void unloadAllScripts()% e* n! b) H/ Y$ \
  5. {4 E! }; E% R/ \. h
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");' X4 r' H1 _: Y8 a. b$ q& d7 F
  7.     7 V6 S  x* O$ z" g2 q
  8.     // Выгрузка квестов.
    ! @' b1 U% Q+ q
  9.     for (Quest quest : _quests.values()), s6 y8 Z: K+ H: C( s8 e
  10.     {
    5 p' Y* v+ f3 W6 q: d+ H2 L; e( D
  11.         if (quest != null)( k, C  k- M5 c: r+ M0 l% x1 c
  12.         {
    ( t: S+ X2 z2 y' [
  13.             quest.unload(false);$ c' Y( u2 j7 N) j) J
  14.         }5 l1 N& @9 {$ p% ^/ L% V
  15.     }
    ! K. ^' J7 T$ I0 Z. z
  16.     _quests.clear();
    ( k4 Y, u- _% |; I! N: }/ V& x
  17.     // Выгрузка скриптов.
    9 U4 m) R. b! d& e
  18.     for (Quest script : _scripts.values())
    $ C0 q4 ]% \" j  m: N4 U( N, e
  19.     {1 S; X* H, I8 j- m- o4 o
  20.         if (script != null)
    0 E! d) }) w% q9 }3 r# [% E7 ^- [
  21.         {
    9 t' a6 ~1 S/ R5 W7 ]6 @3 N
  22.             script.unload(false);
    7 F: K6 n- t! h, W, X
  23.         }/ E+ X& ]$ _) P9 I3 g) H" s9 H
  24.     }' H; i8 R3 F0 o; z
  25.     _scripts.clear();
    . }! s4 j( Y: E9 ]3 E
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    ' e  i5 A; e: r, G8 G( g- b

* X' L' W/ ^5 G, d+ J6 JМетод report()- m; y$ ~  w1 C1 w1 ^
4 L+ Z$ x1 m+ J& O; n( O: _1 Y
  1. /**
    8 g4 M7 I7 ~: F- P. Z3 y
  2. * Логирует количество загруженных квестов и скриптов.
    9 N3 e* v4 O# R* A8 b
  3. */! D" u# A; W9 L( m
  4. public void report()3 \( P- ]# n. T' R/ j# I& j- ?
  5. {
    5 k: L: Q. ^1 H( e( k
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");! _6 p, ]2 C# ^8 P
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");; E0 s9 G1 g1 J' @4 x/ a0 T: O; D# t
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    0 |* r: E8 n& L  P. _8 l
& W& Q+ |1 p0 D7 z; U3 N, X
Метод getQuest(String name)
0 ]! |* C6 W- G2 K! y! `
, H' i- d; z) d7 ~
  1. /**# A- W+ g! R" w; S, w3 V
  2. * Получает квест по имени.6 k" t" \% Q' q; D- ]
  3. * @param name имя квеста3 u4 |& k. A  M. A
  4. * @return квест
    9 `6 d8 J4 k5 R
  5. */( n7 K# G; X  ?: I
  6. public Quest getQuest(String name)9 s6 D) U: d9 o  ^
  7. {
    " J- P, a3 G  D( p* ^& E, r7 q2 x& g
  8.     if (_quests.containsKey(name))
    9 A/ A! K2 G3 ^, _* i
  9.     {
    + i+ J4 {6 m& m9 B* p. I
  10.         return _quests.get(name);# ]% I2 B. W. Q; R" N! U# S# m* T
  11.     }+ D0 L+ a, Z4 Y1 j" q. l+ U2 G
  12.     return _scripts.get(name);+ e& H: h9 q9 r+ C, h7 N5 s
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    / w; X: n. h" n, H9 o. M& y- o
/ [3 J, ?; P$ f& w6 N
Метод getQuest(int questId)
5 E' B# i( U* [/ w4 v! }
* l, H: Y) j  ]& g; _
  1. /**" [3 C# u) T9 `6 y# \( [. e
  2. * Получает квест по ID.
    ( G0 F$ B4 b3 C; w
  3. * @param questId ID квеста% E% I% w" s' Q8 F2 J0 \
  4. * @return квест, если найден, {@code null} в противном случае
    ! u/ B+ g* r* Y" G# R0 n5 |* e
  5. */
    2 i* O" P& `/ k; A3 W: S
  6. public Quest getQuest(int questId)
    0 ?% G& X5 b/ s/ i# h2 _: x$ j
  7. {% e  |3 z" F% u& e' E" U- T
  8.     for (Quest q : _quests.values()); d- i5 @, b& F) u$ t8 w8 Z$ i
  9.     {& O" |, T0 X" H, K. r$ r
  10.         if (q.getId() == questId)0 A& X( k0 w+ X/ u' d9 A
  11.         {& s- }! y  _# b& ], \0 z5 q: ~7 M; H
  12.             return q;
    ' O, x1 o. h: E9 s3 k# v5 E1 _/ X
  13.         }
    + _# _$ F/ V' X6 c! c: J$ O* S
  14.     }
    1 _+ m3 T( J+ M6 o3 [* ~
  15.     return null;- {7 e5 w1 S" ]5 N; G% k6 _  I0 P2 z
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    # k  `* G# R* c0 i, f/ _
4 }6 n/ t- G) O/ Z
Метод addQuest(Quest quest), T3 \* z0 X* q3 \

4 B" |% k7 o2 @. p: e8 z/ q- o* O
  1. /**
    ; O, K" v4 U0 w5 `$ B, |
  2. * Добавляет новый квест.. s6 K) [! L9 y: v+ M, b- A; M
  3. * @param quest квест для добавления
    - R5 u+ @; u: U
  4. */
    , h+ r6 C6 d: z. w
  5. public void addQuest(Quest quest)5 T: \  T' q7 h( N9 [: z" h
  6. {+ r) z$ R9 b0 Q( T" I. p4 z2 W
  7.     if (quest == null)
    / @. s% z3 y- W0 `0 T/ X! r+ I
  8.     {
    # I* {' Q+ g9 h
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    ( ^4 c/ O' a& a. r( n" p
  10.     }2 N/ N2 h0 Q$ I" g" T
  11.    
    0 O2 d' y1 E# V  M" w, \  ~! W
  12.     final Quest old = _quests.put(quest.getName(), quest);2 p9 V1 ~  {1 o8 w: O& \9 q& W
  13.     if (old != null)/ @  k9 c4 }# `, y. x* E
  14.     {
    4 }$ E6 B5 y: m2 _% C2 C/ @
  15.         old.unload();
      L9 e5 C6 X5 ]5 ^/ K8 G
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");  i: q: L3 u# V3 c
  17.     }
    + k; C8 }% j! l) N! m
  18.     8 x. z5 k( _  i! f3 M" m
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)7 l/ O6 E/ v5 o/ ]1 W
  20.     {9 u# P0 o5 n' V3 u; a
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* j) i/ }) ^, g7 t; J; I5 \( z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");& k5 I. b$ c5 M5 H. s
  23.     }
    ) y2 z* W' }: ^$ W
  24. }
    - b7 _+ J4 X+ C) q' ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
6 y$ d  g% D" W/ Q  Y" n: ]ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.. K" f3 i, |, a5 N6 f: r! R! F5 X

" R+ W) f" s; a' T+ o/ E; M
0 Z* y" S' o5 e# n+ O  G6 b& I6 z; ?+ D" {8 H: e7 G
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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