Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- w- [. h, U4 r# @  j6 f* H7 g& x* a- Q$ _$ h5 ?) E
Разбор файла QuestManager.java( r/ I9 y( R2 j4 _6 u* |/ b6 F
( X' E' T* `. K
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.; q% J- T+ G6 O) z0 r
Основные элементы$ g/ {, V. f0 @
  • Лицензия* g6 ~- `0 f' Y# \
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      " ~& |( Y" q- m6 _) R* d. ]
  • Импорты" Y# c2 G' l8 Z: ]

8 S( q. p: }; ^: D, v  w* cQuestManager.java — управление квестами и скриптами.1 s+ X; a2 _' i1 b5 n$ p4 q
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\/ [% m7 }' F7 T. F# v3 n( o

" l: \# k! |; |! q

0 e0 I, E; L' j* Q$ L$ h* rДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ J# _# O4 X/ [0 h* |1. Лицензионное соглашение4 A+ ^* G7 w  q3 e
  1. /*
    1 b" z$ G% |) S  O% m5 M* U9 I
  2. * Этот файл является частью проекта L2J Mobius., D4 r& b, q* y; }+ V
  3. * : o0 B1 _+ r$ y4 H$ J8 v3 b" K0 ~
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    , J" V% {( x$ a/ f4 n# q9 M% `
  5. * её в соответствии с условиями GNU General Public License, опубликованной4 w; w  u8 |& S' E
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии./ u: O# R  N* H6 F( _5 l
  7. *
    8 _- `! S8 ~! E; {- O: Y
  8. * Эта программа распространяется в надежде, что она будет полезной,4 r5 E  m6 }' Z3 F2 E  w, H+ B9 k
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии5 s: D2 I3 e/ O- x- X: L1 r* O
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ' U1 x; V2 X' K# u5 g: X3 R* l% }
  11. * См. GNU General Public License для получения более подробной информации.
    3 r+ ?* \. i5 ]3 V$ Z9 G) h$ \
  12. * 9 W7 f. A7 O6 M
  13. * Вы должны были получить копию GNU General Public License0 ~) `3 j: f3 D
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.' B2 g% P9 f7 m  ?' z( Y1 n8 E
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# S5 f( d' v, \' v2 K- O
* k4 E& p) X$ n" d5 ~+ n$ g7 ]4 w# }- m
8 _1 J+ v5 E( p: O; @2 e0 c; X/ |2. Импортируемые библиотеки
- z8 C/ M3 S7 t1 w  o+ a" n
0 \2 u; S  g5 Y: S
  1. package org.l2jmobius.gameserver.instancemanager;
    . V4 y0 u8 o2 a
  2. ) }( M( u3 e7 S, P3 G
  3. import java.util.Map;
    # v. {# s  y1 z& X) E" c9 i! ?
  4. import java.util.concurrent.ConcurrentHashMap;
    9 t2 U7 N+ C+ d' A5 Z0 [  p
  5. import java.util.logging.Level;# O  _2 O; Y/ `. K: s2 D) X- B  t
  6. import java.util.logging.Logger;, g: u, Z( `7 Q% B9 s# v

  7. 4 l6 a+ Z- |+ m5 {* L( b2 H$ m3 G2 h
  8. import org.l2jmobius.Config;/ n5 E4 s* n. G) v! a
  9. import org.l2jmobius.commons.util.CommonUtil;
    / L" e' @4 h. D( ]) M
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    ! K+ {" g4 f9 _) J  L& {0 B
  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 — менеджер для работы с игровыми скриптами.
5 ]; z1 a3 k1 K; O7 S! \5 y# T7 u6 b! N2 J; S& ?$ R
3. Описание класса QuestManager) t8 e# {) z. x+ P
  1. /**
    5 i2 ]: t3 B8 U1 B! X
  2. * Менеджер квестов и скриптов.; M+ }9 ~" q# F' F
  3. * Автор: Zoey76# W% m( S4 b) z) ?" d, i6 R8 O4 Q2 w
  4. */; K$ @1 ^4 m( m& F
  5. public class QuestManager# D( O/ A) I0 g1 W! S* z* m4 U
  6. {
    + K* y! @* N# p+ g& q0 r- X! M
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    6 T, N* X8 l) f1 o8 W$ A
  8.     , g7 U: S! J. c- t& v3 M
  9.     /** Карта, содержащая все квесты. */9 R6 T, Q$ a/ n/ H3 u
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();- A# q! J. K; p2 ~$ ~( U* s4 @
  11.     /** Карта, содержащая все скрипты. */
    ) ?( O0 [# J- g) M/ s! t4 \( C. s
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    9 a( R) i# m/ i% u
  13.    
      C( N+ K: I' j; J
  14.     protected QuestManager()' g% Y/ p5 u+ m3 U8 M7 ]# [
  15.     {
    8 q* l7 W5 S2 |9 b9 f
  16.     }
    / B* t0 D; R  S8 ~, v2 d& F
  17. }
Скопировать код
4. Методы' z1 s6 b. T$ x% `4 x
Метод reload(String questFolder)7 m3 K' g) R$ b! U& a
  1. public boolean reload(String questFolder)" Q: z( h& v" q# n: r
  2. {; F7 X* e4 \) E: i7 \
  3.     final Quest q = getQuest(questFolder);
    8 \0 v" T# ^& T( |  u
  4.     if (q == null)
    ( ?+ a! H4 ^# p1 B, N
  5.     {
      e; w* G" p( M% H
  6.         return false;
      }* v) k* x2 q; [: w
  7.     }- u! L+ b' P- x) H, K
  8.     return q.reload();
    4 K. {, x0 O7 K+ J  P
  9. }
Скопировать код
5 [& B6 `) x1 E  o  S1 x/ H3 Q: T' e/ |

8 J% s, b/ H9 L  W" b4 Q' zМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.& G* b" R" u* x
Метод reload(int questId); k) T6 x6 n  I# H" Z
# G. a4 h% L2 Y8 J
  1. /**
    , {) x. v& D/ s8 K5 K. M: B
  2. * Перезагружает квест по ID.
    - r6 K9 u- x% z& r
  3. * @param questId ID квеста для перезагрузки9 p9 c0 j7 _' Z" `' F7 F" w; E
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    1 H; `8 N9 i  k# U
  5. */* O) f' J, b- U- n- ~' S2 Q
  6. public boolean reload(int questId)3 [0 ^$ q* ^2 ?: a% H* N9 M) L
  7. {% ^; B3 L$ Y$ j+ h, I
  8.     final Quest q = getQuest(questId);- Q' x! L0 x; p) b* Q
  9.     if (q == null)$ G) C" I: ^  C4 {' H
  10.     {. {8 M, `; w( B2 s3 G9 E- _
  11.         return false;
      P9 y: Y2 s4 v6 `; h+ o# g
  12.     }3 e5 d" S6 d& Y  W6 v: {5 ]
  13.     return q.reload();
    * z; @, f( j# o! X) T. j8 M" n3 D
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ) N* k6 S$ @+ |! z: S

% Z- Q4 u& R( m) gМетод reloadAllScripts()) v7 A8 ~: s7 W& _. a5 }( C
1 I' S/ @. U- J. n& H$ e
  1. /**3 j% B+ N8 Q4 _  \
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.9 J1 m1 _2 e  i5 Z0 I0 `
  3. */( _9 J2 S) n! X% c; Q( I2 U
  4. public void reloadAllScripts()
    9 W5 U3 U2 I. v6 m' d. l# {* Q
  5. {$ J9 d, N2 a. U/ r5 x5 r. ?/ k* [
  6.     unloadAllScripts();- k. x# H6 {% A
  7.       p. I3 q% K$ n0 F
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    8 i$ ]2 B5 B1 C% P# C/ T9 a
  9.     try+ s# m0 c+ m, ?( I
  10.     {
    + F( h+ i  P6 }3 s% d6 G
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ' y8 h" }5 C# {; K
  12.     }% e  V) u1 }0 \! C2 t/ ?
  13.     catch (Exception e)3 Z7 b" M, Y- S6 V+ a/ }
  14.     {
    $ u: v" w% p5 K* d: R7 W$ g
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);) O6 W' u! w/ S! l' J
  16.     }
    % Z* X1 o( m5 ]6 j5 y; P
  17.    
    . \+ e: h$ s) c" k6 Z! u
  18.     getInstance().report();
    9 J# U- h. ^2 L" X4 h
  19. }
Скопировать код
Метод unloadAllScripts()5 U# O- t1 b3 {
" x* r7 c1 `, f3 A) ~
  1. /**
    . V$ A8 U+ `, \- X/ R7 t
  2. * Выгружает все квесты и скрипты.: F2 a+ c4 a6 n$ H, |
  3. */; s$ y* _% z. V5 {( H$ D
  4. public void unloadAllScripts()
    / a: z- h: Q, t! ~
  5. {0 x. M- b) |0 X! v/ {+ P
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    6 w; \# O' j& b! ^9 z- C( v
  7.     / U' w5 u" D% D! }9 s* t3 I
  8.     // Выгрузка квестов.
    6 Z( B. B$ ?( \) O; b  r
  9.     for (Quest quest : _quests.values())
    * ^& S# b+ o' D
  10.     {0 a  l2 c6 d+ O  q' n0 J( p- ]; v
  11.         if (quest != null)& m; P& d# g" q
  12.         {+ P6 J7 L3 s) Q8 @
  13.             quest.unload(false);
    $ v3 h( [8 ?4 R  r
  14.         }
    " J. S! f' f3 H+ H
  15.     }( y/ l0 U. C; c' [
  16.     _quests.clear();1 @! F; f' w2 _1 T& H
  17.     // Выгрузка скриптов.
    6 p0 ?3 X5 V) v6 Q7 }1 ]- J2 ~
  18.     for (Quest script : _scripts.values())
    " v6 ~; W2 ^' \" u+ S% y2 }! j- {
  19.     {7 _$ O6 w0 U' |% X; x, }
  20.         if (script != null)( r- f4 ?1 Z/ w/ d- G4 J- H7 j
  21.         {
    : _% ^0 K6 |! G' s% D- A
  22.             script.unload(false);
    4 E3 q4 ^. s  [7 L! \" _! _& H
  23.         }
    1 j% u# s# d5 `1 f
  24.     }
    , \3 z* e2 Q5 x8 [0 b
  25.     _scripts.clear();& U/ S! r. p. {+ b3 g- H3 y: G
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.4 U: n7 B/ ^3 Z6 @: Y+ \" C
; y4 ?' b' P4 f, |/ G8 {# N
Метод report()! F# N1 j3 N6 v2 [- S9 N0 W

1 r+ I8 ]/ Y' y9 U! E
  1. /**4 }6 o2 P" m" C% M. f4 L2 F; v
  2. * Логирует количество загруженных квестов и скриптов.
    ) b- b; {6 t& v; D
  3. */
    9 D2 ^; O0 b/ V4 O7 h
  4. public void report(). w7 \) ]. ^- ~2 X+ m: G
  5. {
    ! \8 v+ c/ k6 E( \/ O/ E
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# R7 ?  U1 O: d- p/ A
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    ( d. K, Q1 G2 U6 S& }; W# a" _
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    4 v1 o% _8 R  H! C- P3 Q7 H

0 ]2 m+ T# f  N. e( z' j! E( ?Метод getQuest(String name)2 m" v6 p( r2 k
2 ~6 d0 d3 l. a- M( q- G% F
  1. /**
    % f' i' E' [9 `2 W. \: Z
  2. * Получает квест по имени.. b, u8 P2 A+ k( L' S5 ~* L, c+ e" R
  3. * @param name имя квеста8 m6 |5 G: L; Z
  4. * @return квест
    # K2 `% ]# R2 |1 _$ q
  5. *// U5 Q! g  ?4 g& k  i9 A1 t
  6. public Quest getQuest(String name)  o0 U- I! b/ ?$ {+ e
  7. {
    8 v; [7 v+ k3 \( n/ M2 |# F% o0 s3 Y0 G
  8.     if (_quests.containsKey(name))) ~% P+ x, n/ c
  9.     {
    ) }5 `' M1 K5 }2 C8 K0 _1 E
  10.         return _quests.get(name);& ?1 f- W4 e* _( `
  11.     }# }& B6 d8 A' B' _
  12.     return _scripts.get(name);
    4 {0 h* ]* [; B  ?# n
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 w' ^( v, @. R+ f
2 V1 e, o# _/ E& w7 n" V$ `! b
Метод getQuest(int questId)
4 A  P* A. \  y& {! {% e. H5 b/ J3 e
  1. /**& S" r/ B: \2 S/ I5 l. u
  2. * Получает квест по ID.8 y& r& @6 _5 Y
  3. * @param questId ID квеста
    5 E( C. b3 A: [2 B% I6 D6 K5 a* ?
  4. * @return квест, если найден, {@code null} в противном случае6 k0 s; Q. u6 f
  5. */& m- E" u& X9 P' t  f
  6. public Quest getQuest(int questId)
    ) J. Q& D5 z" q6 `! E9 V$ W) Z7 H
  7. {
    , g6 [: c4 N0 L& z) q1 M2 k
  8.     for (Quest q : _quests.values())" P% i8 P: p) V4 I$ c
  9.     {% M  e" d( h3 F
  10.         if (q.getId() == questId)0 A% _/ K: p  p
  11.         {9 O/ s0 v! n8 p$ W
  12.             return q;1 M) n. n! F+ `2 L. _: I
  13.         }
    1 M1 D/ n' R' U( W2 r" }$ q
  14.     }& V6 a( N+ d6 @7 z7 g; ?7 ^# F
  15.     return null;
    7 y. R& Y; t8 q9 n; [% {9 i6 q. ^
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.: c: \; g& o" v+ {/ Q' D
  |9 N  r& {; t: ?
Метод addQuest(Quest quest)
+ q, F) t* l1 S+ ~
0 M- B1 e2 |; y7 Q/ s
  1. /**! `3 C, c3 T* g  B" u
  2. * Добавляет новый квест.
    4 \8 N% ?7 s% O0 b" {
  3. * @param quest квест для добавления
    ' w7 n7 O& X" p
  4. */
    3 D3 \/ w* G: s0 g9 p7 W
  5. public void addQuest(Quest quest)' Q, z2 w( S% i& F% [# S. u
  6. {
    ' ^7 w( {0 x% [3 F" V8 p9 F9 Q" ]* g
  7.     if (quest == null). }7 y" N5 L  X5 ^* L5 `
  8.     {& [" f/ F/ w; v
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    . i, f( U& K, i! X2 ?" Q
  10.     }( r9 Y! D1 w6 \6 I' S" M: K9 M
  11.     6 }9 r- _0 m/ i1 ~; `; L% N0 l
  12.     final Quest old = _quests.put(quest.getName(), quest);  F" H+ t* o3 z! @: F4 G
  13.     if (old != null)& Z1 V. F/ ?) }
  14.     {4 l+ I3 n7 u5 {/ h# W  t" K
  15.         old.unload();
    9 ~1 U8 i! s  C2 B7 `  M
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    2 v3 k0 a, c* C+ t( l0 S
  17.     }  J; N& i$ t; _1 C+ g8 @
  18.    
    ' I, {5 y8 n; \
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)4 o* {% z# E1 r, L
  20.     {
    ) I+ S1 h$ e2 I
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();% p9 [& P: V6 w% {3 S0 }
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    # Q& ]  B; ~4 Q: _; |
  23.     }8 K0 k  M# I- U# F
  24. }. @, T8 O9 |1 Q& ~! _4 D# A& [
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
$ s/ W& u; C6 P, K; F0 {1 h  PЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
; e/ Y4 C+ V7 d' c0 k$ Y. }8 i' D! B/ `; ]
0 _) X4 p' k7 ]9 I9 g. `/ w! z

# A+ U8 W5 y; N+ \$ V
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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