Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius7 i) l8 H' n  C. F: A& U/ J
$ w2 f1 o* S" x$ o
Разбор файла QuestManager.java
9 }7 O5 k" |2 I% U0 z$ O  B, d7 v" O1 \' o& V4 a
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.$ V4 S- Y, Y# l, V" Y
Основные элементы7 R3 m7 p: D+ _2 ?. ]
  • Лицензия, o7 b9 B7 o( l+ T2 `9 ?
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      ' u3 [1 z. X% b3 r2 ^
  • Импорты
    ; t7 v( [" H4 h5 P6 x) `
( z. {" @6 s- S; C! Z# ]8 F/ G* H( W
QuestManager.java — управление квестами и скриптами.
3 s: B2 H# F  \6 }3 c9 YПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\4 z! K$ T3 p3 U

2 J- n; E% [0 A* \0 K2 v

; x& n7 [+ Y; T+ V$ MДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
- o9 n: a/ {- e  ^$ }+ R' ?1. Лицензионное соглашение) x" ^  @1 @) r# I: h
  1. /*. p, f8 l# L% r7 h- o
  2. * Этот файл является частью проекта L2J Mobius.
    8 O/ c! H; v; J4 B
  3. * 4 q9 H- l' a" {, K! u) c* w
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять* N/ A0 i# h# I2 d
  5. * её в соответствии с условиями GNU General Public License, опубликованной! _( I. @" c/ _) S1 H# i
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    & n* z! Q; U- Z" }8 n5 o5 p% \
  7. *
    ! R' [6 m$ M4 u& N
  8. * Эта программа распространяется в надежде, что она будет полезной,
    + L% [# V' T3 e8 X
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    - j: P% M) e7 V  K! I! F$ G
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    # g* F9 b# N, {- N
  11. * См. GNU General Public License для получения более подробной информации.; z, }7 ]9 Y$ {; M
  12. * & |. ^5 b" @* S8 f* e, \0 y
  13. * Вы должны были получить копию GNU General Public License  G/ D! V* s& _8 X; f. I; v8 W
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ ^3 l0 v$ v5 t3 I
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
5 J' |  _" e5 d. \! g7 y$ p
+ P9 b0 R" V! G0 o7 ~) T1 F
9 x# b: E6 D  F4 P: }7 {2. Импортируемые библиотеки
& k% @" r; @& T# K1 Y/ |( r3 x" W/ y* @
  1. package org.l2jmobius.gameserver.instancemanager;
    , r( M! ~" w$ w9 h

  2. , b' i1 e( p9 f2 Y
  3. import java.util.Map;
    + \1 l, D0 ^; t  g4 ]0 T  d
  4. import java.util.concurrent.ConcurrentHashMap;# O7 A$ Y1 {+ I6 ~9 o$ n7 w
  5. import java.util.logging.Level;% q$ P8 {0 e  Z9 y. u/ f9 c% L
  6. import java.util.logging.Logger;
    + h! c+ y! B, ?$ \0 y5 n, `
  7. 3 E$ H/ y  T! n1 E8 ?8 X
  8. import org.l2jmobius.Config;: M3 w6 t; U* E' y
  9. import org.l2jmobius.commons.util.CommonUtil;! \, X* M/ |% Q5 R/ U  B' h3 r
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    4 `$ y- g! d: l1 {' }
  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 — менеджер для работы с игровыми скриптами.
  \  |8 _- C: _) w, u! ]/ O' c, h4 O( ^. R$ x0 B4 E. }
3. Описание класса QuestManager4 ?- ~: S9 Y+ G# P* M0 G
  1. /**
    5 ~$ G. t0 M9 y8 S, J/ {" e4 r
  2. * Менеджер квестов и скриптов.1 B& F8 g4 _4 g1 z
  3. * Автор: Zoey76
    ; R# q4 o& f& }6 r
  4. */4 ?7 q% j& W0 K* |$ P7 g2 I# u
  5. public class QuestManager
    9 R, Z; b+ {; ]
  6. {
    ) B) v! Y# {! V! }1 N
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
      z( T% X0 H+ f8 I1 J* S3 a2 p3 m
  8.     " @/ x1 K+ e$ V  o2 |; e8 ]
  9.     /** Карта, содержащая все квесты. */
    ; I; X8 Y* u( M; z  L
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    0 b( j% Q/ ?/ C
  11.     /** Карта, содержащая все скрипты. */
    # |/ K4 G4 y, f% {) m; u
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' G$ D7 l1 o% U- d$ E
  13.    
    * x+ m+ p1 y4 o# B7 i
  14.     protected QuestManager()- k" O3 }6 N( ^$ L
  15.     {
    5 B, v- w- c8 F) c' D- v2 u4 T
  16.     }- v6 j$ z; @5 m% x0 D; S9 Y
  17. }
Скопировать код
4. Методы% r( D" V& U: |1 u+ z
Метод reload(String questFolder)
4 v4 Y! R. F- B+ [% ~: ?
  1. public boolean reload(String questFolder)$ T0 q+ E: x$ ^0 }$ t* D+ e
  2. {
    ! r( E! C7 M% w. x; i  u
  3.     final Quest q = getQuest(questFolder);* ?; O! M1 C# D% K  B2 H6 d
  4.     if (q == null)
    2 t  W: k  d& S5 ?/ R
  5.     {/ X6 E3 b& A) b1 G! d
  6.         return false;
    6 p. y( h& G) }! g
  7.     }
    7 C4 K$ M9 h9 `& O
  8.     return q.reload();' @4 \- M  ~. e; w
  9. }
Скопировать код

5 h) z& Z: t, m* K) T. u. {* M2 o) m) a3 M! |! `
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста./ E! p% v0 k* r- B% g) x
Метод reload(int questId)
4 g/ z  g- I! f% e7 c0 B+ d4 u7 b. [6 E9 g( n
  1. /**
    , S3 s0 ]) z$ Y$ \
  2. * Перезагружает квест по ID.  |+ T" }$ w& c/ {* }9 h
  3. * @param questId ID квеста для перезагрузки
    1 J$ A3 X& T+ d
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае; u$ Y5 `$ r; k7 W6 c- s
  5. */& g8 ?3 q: V7 G8 }  h+ N5 l4 n0 K0 n
  6. public boolean reload(int questId)  R! g# J4 w: O! Z( |+ ~# R' o6 I
  7. {5 @: s+ u  K7 M! A: N
  8.     final Quest q = getQuest(questId);  f/ H! x! Q4 S4 \
  9.     if (q == null)
    2 i4 P5 m" C/ h. Q* I
  10.     {; e3 T; b! J& G7 j
  11.         return false;- ?2 a: X' g7 W" Q
  12.     }
    4 \$ s+ p! i& X3 S0 B7 F6 z
  13.     return q.reload();
    , g. V" _; q3 a; w. r/ q
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.7 K6 n5 ?0 R; n- j9 L4 @

( ?$ e1 G* [5 V- dМетод reloadAllScripts()
( y+ y! R8 v; L/ w- W& K" p( s3 E; ~  _( q4 e- {0 S8 E
  1. /**
    3 j- ~1 ]. @) T! B& G
  2. * Выгружает все квесты и скрипты, а затем перезагружает их." k( w/ O6 @. ?, V
  3. */
    5 g% C6 {* b: a* F) \1 k, k+ \
  4. public void reloadAllScripts()! o. {8 Z& r- c6 S4 L! m) h! i
  5. {
    , {; ?' T: H# r0 ^+ [# R
  6.     unloadAllScripts();: j. F; N% ~6 Y/ h3 N
  7.     1 E8 }9 S5 u  _
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ) q6 n8 k1 F, D2 x, M# C
  9.     try
    ) z1 b/ x1 @- X' I1 s1 E" }% v! d
  10.     {0 e3 b% a" n  r
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 Y) T+ z/ Y5 C; ~
  12.     }( Y+ U. N+ O2 t: w( ~( e1 C, h
  13.     catch (Exception e)5 F8 [/ p5 B* H1 q# {. W
  14.     {' _0 s+ |# q3 @1 b+ B
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);1 K% f: e3 r, X  V+ c4 C& Q  g9 P
  16.     }
    ; h* h% l0 L6 u) G3 n4 E& D
  17.     : y4 L; b) g2 F8 n6 F6 f9 ^- X6 h3 l
  18.     getInstance().report();. m3 m) ^# e" m4 B) g1 b' D
  19. }
Скопировать код
Метод unloadAllScripts()
0 K  T9 G5 N* t4 }9 l8 A' e5 r, m, \0 y) j8 X
  1. /**
    6 A3 o! G4 E, H3 V/ F% B3 \
  2. * Выгружает все квесты и скрипты.9 H. f+ u) C6 W0 E# N
  3. */7 S; I- e9 l* d) A1 `8 T8 x% N  G; s
  4. public void unloadAllScripts()
    $ u5 G/ P+ E) f: l
  5. {
    : p8 |! x7 j6 g$ e/ J3 Y2 w
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    ( f( j% l) l( F0 A
  7.     3 Y/ t! V0 }2 q- q, m
  8.     // Выгрузка квестов., f, f  ~4 n, X# I8 S5 }4 H
  9.     for (Quest quest : _quests.values())1 h5 c/ ?9 D" Q, P* q
  10.     {! b9 H* i3 Y0 m# v/ ~$ Y6 i8 O. F
  11.         if (quest != null)
    " [) c7 a' u* C* A% g
  12.         {
    8 E4 Q- S+ F' e1 f' J/ n/ n
  13.             quest.unload(false);
    6 e3 B3 b- e- o$ ^3 x- y" z
  14.         }
    ( |) q5 h7 {7 @, [
  15.     }$ T2 U+ L- H- a' ]7 N- e2 R0 ?
  16.     _quests.clear();" G* c: E6 t/ @8 D6 `
  17.     // Выгрузка скриптов.
    " C8 c) `8 x1 [1 @5 ]- _
  18.     for (Quest script : _scripts.values()). x. z* X' H. |: O3 U
  19.     {$ M) t, E9 R% ^+ u' P
  20.         if (script != null)2 B- N( H% e& s: H8 P+ h+ B
  21.         {/ r* L! ~  j. `4 G' M- E0 C
  22.             script.unload(false);% F9 k" I: R- [8 ~! o/ ~
  23.         }6 y3 G* m# p8 X% L
  24.     }: y: {  q. l6 D. K/ s& t
  25.     _scripts.clear();
    4 Z! ~3 q  g  }* k! P# x
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
      z8 W/ `6 w0 ]8 E- N

/ V  z8 C+ i4 b) lМетод report()5 G8 g1 X1 o4 J# J7 q% ^7 g$ }: ~
' U9 F+ ]7 G. q3 T, u  {1 ^
  1. /**1 y! T9 ~& E- \3 m' s  }
  2. * Логирует количество загруженных квестов и скриптов.
    * _0 c$ b& t9 R8 r/ L
  3. */( I. q* X* s# D8 e6 C
  4. public void report()7 k. |9 {  M, S0 k5 T
  5. {
    ! K" x4 b$ ^, ^, |3 ?
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# y2 q+ l+ N, @; y. s
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ; z+ ^7 r" z: V+ N! R6 z7 A
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.2 V0 i/ a' C2 s$ |& q, C
5 {7 M. U% ^& p8 a) A0 y5 u
Метод getQuest(String name)
7 D3 y! H5 q: F$ e( S+ H
. ~  \2 C% W& U( `. Q
  1. /**5 f7 s& |7 q* V( p# G: D- K  a" k
  2. * Получает квест по имени.2 H! s. d( }0 y" R8 u; ^
  3. * @param name имя квеста1 T% Z( ]9 v7 r8 }
  4. * @return квест; u" Q0 [8 c8 E- w4 q7 p( I* S- T
  5. */
    : V# T  c. V6 t$ ^* N
  6. public Quest getQuest(String name)4 Y& m; ]# E# B3 ?4 r
  7. {
    5 I0 @$ o; _+ X2 w
  8.     if (_quests.containsKey(name))& B" I! C# Y- |% S2 D4 K: P
  9.     {
    % {5 f9 A9 _; g; I
  10.         return _quests.get(name);* e8 [4 {1 S# a% |
  11.     }
    + n+ M0 b" K4 G% W" h: ^
  12.     return _scripts.get(name);
    # X6 B- V7 q9 c& [& K5 x; g. J; M
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.! c" [) ^& U8 q

5 }' t" N: B. ^; k7 a, V- o4 t8 MМетод getQuest(int questId)8 p! }# M; x3 y& P. P& |1 u

( z# A3 ?6 c* `4 C
  1. /**
    ! D* X. x0 P% P/ c5 ?% E
  2. * Получает квест по ID.
    ) Y, p3 s7 f9 w1 N8 o4 T
  3. * @param questId ID квеста1 j! m# A0 v, j0 k6 ?
  4. * @return квест, если найден, {@code null} в противном случае
    ( C5 v' o" O/ k
  5. */
    : H: j7 t$ \$ C" m3 T
  6. public Quest getQuest(int questId)
    ; j. ~- z6 F2 z. m8 |$ F: @
  7. {* W+ Y3 F* Y( b  ]" Q: W
  8.     for (Quest q : _quests.values()). d8 _+ K8 X  T3 ~. }9 G9 L, d
  9.     {/ I* U) @$ `3 L
  10.         if (q.getId() == questId), o. Q& A3 e) F  p* p7 g# v
  11.         {
    7 W6 [3 s0 J1 K+ F! w
  12.             return q;
    2 v5 [' n7 n* g8 h
  13.         }" c! b7 ^' V2 J2 l! B
  14.     }* M6 c# W8 x" \4 n, P& x) [
  15.     return null;
    ' G9 P& \% f/ X' G- K2 e
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.' t1 [/ F6 d- B' z7 [5 R
, |3 H  x4 Y" n0 ^; g& L0 s
Метод addQuest(Quest quest)
' J/ F" f# V: z& Y7 C
) a  i7 J/ z% s8 [2 F
  1. /**
    ' X1 z5 ^* {( Q
  2. * Добавляет новый квест.. g3 N3 V0 k6 I0 ?; ]$ P0 _  i0 {% q
  3. * @param quest квест для добавления
      p9 u, C. r6 g! A0 q
  4. */
    ; w; d, w( e5 J0 T" Y
  5. public void addQuest(Quest quest)4 X. T7 K5 P8 T' [7 D" V6 V
  6. {
    1 f: e) W& T. g
  7.     if (quest == null)  @8 n. w4 O6 [# d8 m3 I$ B
  8.     {: N3 o: C$ r( h/ u
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    " U0 K( F6 J2 b% [( m% B
  10.     }+ Y2 V9 t( V. ^; w8 J0 o
  11.    
    + P. t9 h2 \, {" o5 [1 M
  12.     final Quest old = _quests.put(quest.getName(), quest);
    $ e; O5 v* W6 W4 X& a
  13.     if (old != null)
    9 T. {! ]- o/ D0 H5 T
  14.     {
    $ L2 L" h; V! t* m2 P, r- f
  15.         old.unload();
    5 C5 m; D4 o+ D7 k" l2 M# v+ F
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    $ A1 U2 M; r  [$ D2 |
  17.     }5 X: D* J- w* {% j
  18.     ) a1 x! s0 q: J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    / c) f8 M; d0 T
  20.     {( t0 T- {8 k* F( Q5 x  H
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();0 l# K# D8 b* Y1 y4 e
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    6 v( w7 }: J' ^3 x) n: X
  23.     }/ Y3 E1 o( F- v7 S  M! ]
  24. }1 k7 Y5 O, ~3 ]5 `4 J
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.; j4 r5 D6 F/ ~  f  |
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
5 C6 W0 d5 }2 V( \! F( D, v! \% ]7 i4 n+ C/ {: s
/ p$ H9 [. C( ?4 b: }

5 p+ P+ N& k' s; K; y6 g
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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