Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius$ c& N7 l0 B' b) `& T! S
. [  e! u5 K8 ^
Разбор файла QuestManager.java9 R+ v$ R+ w6 [1 R( P3 i% o

; y- X& w* f/ X4 Z2 CЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
. {) e$ M# @. p8 T" I# w. H6 d3 n- VОсновные элементы, l5 k* x8 u5 Y8 \! ]( K9 I
  • Лицензия$ n8 h6 @7 T) q$ t5 B- F2 t
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.: C5 f; B  V  @; [. L
  • Импорты
    ' s6 M$ A- ^( z1 T* U) }6 B6 q! n
" S: ^: Z7 C. a7 x4 U$ I
QuestManager.java — управление квестами и скриптами.
2 |- B  ^: L6 S! |Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\) R8 I2 N$ V( J. F/ b& E& ?( B
1 Y  T9 y, Q' x* s
& j) b7 U9 f+ |' `  m2 a
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
% R; ?$ p7 `9 v% X7 ]1. Лицензионное соглашение
# N% N' V5 s0 ?( x
  1. /*& F( L2 H) t# b  ]  C+ x# q; z% o
  2. * Этот файл является частью проекта L2J Mobius.
    2 z7 z. \3 h2 \" H  @
  3. * . C1 t, d; Y# G
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять; |" V! [! |+ s, ~1 `
  5. * её в соответствии с условиями GNU General Public License, опубликованной  S% i+ h7 k6 D9 [
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.6 ^5 X. Z% O# |  D" n1 V
  7. * . u( N& g+ g! N# I& ?- h8 A$ \8 J
  8. * Эта программа распространяется в надежде, что она будет полезной,; L. p8 F& b4 x+ V! b/ _
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    * T- J( F5 u- J* Y+ \
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.9 g! s) `/ Z! u7 q% Q$ Y" a2 }
  11. * См. GNU General Public License для получения более подробной информации./ a9 W+ I0 }/ ^' T
  12. *
    : Y" Q& C0 Q% W" k9 q: e4 n
  13. * Вы должны были получить копию GNU General Public License
    $ ]5 e5 q6 X1 ~
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    $ c& `. Q& A* \& m: G  g
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# }/ N6 s; C& j) y* s" B  ?5 ]/ [2 W
# F9 G- q/ S/ {% {5 P& u

7 q) g: F; F! }4 c5 O2. Импортируемые библиотеки0 g4 p- w$ m' H4 O  v  l' `

0 }) a8 U# o, x, r" ?
  1. package org.l2jmobius.gameserver.instancemanager;- B/ }2 J, S2 `! b$ E( ^
  2. : M7 x& D* i# W4 Z
  3. import java.util.Map;! J$ ~& t  ~% W3 {
  4. import java.util.concurrent.ConcurrentHashMap;
    2 {5 U  I' q9 X" }: H, C6 a/ w. L) a
  5. import java.util.logging.Level;( h0 ^- n: _8 [) j6 s
  6. import java.util.logging.Logger;1 o  M+ k) Q- j! s# _- [

  7. 3 c9 z  ]& T, ^. z' t" H7 o
  8. import org.l2jmobius.Config;) e' u  ^! W" k: ]' B8 k+ _( D& _
  9. import org.l2jmobius.commons.util.CommonUtil;& |1 J" ]% L, R# J, U; u8 Z! P
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    1 }! I" h9 h& L' U9 g/ Z( U/ z
  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 — менеджер для работы с игровыми скриптами.
+ k+ d; U- O7 R7 P
5 J+ Q' v: i% ?" Y( o3. Описание класса QuestManager
# ]6 O3 e1 l3 u2 H' _
  1. /**
    5 V# t8 x4 D$ V7 c2 x$ y
  2. * Менеджер квестов и скриптов.% Y, _7 u4 I6 N* o  k0 x$ N& M3 u5 K
  3. * Автор: Zoey765 ]+ a$ l) N, E1 c/ H- _
  4. */
    " k3 ]/ ?! z4 Z, T- ^
  5. public class QuestManager0 a% `) D% m* H4 j& p4 T$ _8 N
  6. {+ k/ P& t$ N0 A5 s* g( h
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());! G: ]7 s% X3 |/ k/ D& }- N
  8.     / q8 I1 A: n5 T! y# r
  9.     /** Карта, содержащая все квесты. */
    3 `: |1 z) [, l: E8 T: A9 E( F
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();2 v/ c5 D  {6 ?* w
  11.     /** Карта, содержащая все скрипты. */( {6 D  r1 k; A. ~, k: w$ [% h
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();2 p$ \( C) ~' n1 e+ V3 Z& H
  13.    
    9 `5 U( g0 Y+ A# l7 U' l
  14.     protected QuestManager()" d  D/ E8 b6 K3 l: M
  15.     {
    $ {% x! z+ K5 q- d) k& Q) }2 i
  16.     }/ J2 @3 ]: T  Q
  17. }
Скопировать код
4. Методы5 H( J  t4 \; r! v- y2 E; J- H
Метод reload(String questFolder)# {6 Q4 q  _9 \1 u8 k5 b
  1. public boolean reload(String questFolder)
    ' h& x5 J; |& R1 S4 u
  2. {: [+ D( x) X3 d" ^- k" U1 n
  3.     final Quest q = getQuest(questFolder);
    9 P9 J* ?( _% q/ U% J4 r
  4.     if (q == null)
    2 K5 A) c4 y' M9 y! H& r
  5.     {; y6 \  O8 C6 n5 u* _6 c8 h4 M
  6.         return false;
    , h+ d$ K+ K. W9 u! Y) r
  7.     }
    ! R- e& F8 W$ z- ]
  8.     return q.reload();: Q' m$ e! l- k# r$ i
  9. }
Скопировать код

# v" f! G1 Z, T- `4 ?2 J: g. H% L2 [- C
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
. t" S/ M: x7 |. G5 qМетод reload(int questId)
2 ^6 r; c5 {1 J4 z' q0 y7 _0 O& g/ m# U7 ?
  1. /**1 S5 E& j! X& @" K
  2. * Перезагружает квест по ID.( X' C, {8 h+ q. w- ~
  3. * @param questId ID квеста для перезагрузки" H- ^/ V6 f" l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае, [" o% H/ t& z2 f5 A% W) Q' C
  5. */
    : {* m; c7 D% c! d
  6. public boolean reload(int questId)( P* B8 r. s' x3 L1 ]  _; S. w7 y
  7. {
    8 F) {' E% _& Z5 g6 N
  8.     final Quest q = getQuest(questId);* k3 \/ Y5 [( b: O
  9.     if (q == null)- {/ V- f0 V5 R5 j0 g# ]
  10.     {
    4 g  W+ `3 |7 I( \& ^
  11.         return false;
    " x, A" |! N0 o8 }
  12.     }3 X7 J$ ]! i: ^" }/ I% f( R
  13.     return q.reload();
    + q9 B  D- `6 L4 b9 p& F' m
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    ; s0 M$ s8 ^$ F! w3 T; ]
* T8 y& E# Q. @
Метод reloadAllScripts()( n8 ~1 C; W# h( {" b. @* J
2 N! Z+ V2 f* ^
  1. /**" Z% ?* \0 C$ R6 l  c2 Z
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.+ {# K4 }3 G* H8 v: \2 p; ?
  3. */) U, a" D' Q" W/ ]9 y4 h  @
  4. public void reloadAllScripts()
    5 f: V) C: f  g7 ~( P4 _; P
  5. {
    : M+ Z1 Q5 r, [& U3 r
  6.     unloadAllScripts();$ Z+ k' `8 W& K% h  X  H2 X
  7.    
    ; d! M: }1 P0 J+ d: ?5 x
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: @! ?! E$ M% |! _: H4 n" {
  9.     try! K# r1 w$ p# I3 o" e
  10.     {1 k2 d5 [" k: H& ~+ v
  11.         ScriptEngineManager.getInstance().executeScriptList();  a' x# e$ ^; f6 |# V) A6 }! O
  12.     }
    # J1 k& t0 C" X
  13.     catch (Exception e)" Z5 j. \% y; n/ y; z1 U# D% m: j! P
  14.     {
    - U% e/ v6 `  B, H
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    . X9 b2 \, {' L1 P8 h8 @
  16.     }
    1 ?/ m; _! B9 f8 Q) d% L" E
  17.    
    8 `- `  N/ j- s& \- V# G! i
  18.     getInstance().report();
    : N4 ^  G* h! j  D7 I9 }3 m
  19. }
Скопировать код
Метод unloadAllScripts()& Z3 x' b/ ]4 y3 ~* z. i  ~
& \) J7 s0 H% S0 I; }  Y; R) v
  1. /**
    * ^& C5 J% ~5 T9 p
  2. * Выгружает все квесты и скрипты.* e! [. Y8 F% K" o- F+ g% K
  3. */8 T9 F! ^& N6 G9 G1 M5 C0 c8 o7 ]
  4. public void unloadAllScripts()$ B; x( x; Q2 Z& b! ?4 K" j3 V9 y
  5. {
    4 {) U* a: Y" `! ~
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");. C" o' ]" l; t$ ?
  7.    
    + A6 M: o2 d/ s3 ~0 l8 K5 }
  8.     // Выгрузка квестов.$ p; j/ w7 Y% L7 S
  9.     for (Quest quest : _quests.values())5 n) G; o6 m; U' G  L( ^: T( W7 Y
  10.     {
    ( I/ O. A4 F! f6 q8 E! m
  11.         if (quest != null)7 [$ W6 S# n& n7 j' i
  12.         {% k/ a& O' P$ R4 L0 j# K
  13.             quest.unload(false);0 X( k8 _$ H0 [& @
  14.         }2 C7 c9 s/ M, J, y6 j7 U
  15.     }
    & j2 u. ?. T- ]0 s! Q
  16.     _quests.clear();' Z4 w$ |- z/ K- ?
  17.     // Выгрузка скриптов.( t% K8 T: B( {3 |. Y0 U) R
  18.     for (Quest script : _scripts.values())
    7 i8 |# M0 S, c- w+ M
  19.     {; |) P8 V3 T+ O+ m2 A' ^
  20.         if (script != null)
    % p1 I0 l3 q: [2 C; }
  21.         {
    8 _/ u2 H. n2 v) b' P- B# g( E! `
  22.             script.unload(false);  i7 y  e, [6 }3 w
  23.         }
    / u, L7 B1 |5 P  B
  24.     }
    " h- [7 F" R  r1 k7 e
  25.     _scripts.clear();
    - @' m- l0 r' C( j. N
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# \! f: u5 \, k. N8 d( \$ J

. v  q! i$ T/ |Метод report()
6 b: j/ j, z& Q$ J6 f
! z$ k4 q+ u  Q% `
  1. /**
    ( r' Y! ?2 A7 k! p  t
  2. * Логирует количество загруженных квестов и скриптов.1 V4 \. C. i) U6 C! O1 E, H
  3. */) {- _+ U5 C; X5 l5 Y) Y! z
  4. public void report()* F5 A0 L- I2 u8 c" L
  5. {
    , I8 n+ V; O+ O$ @5 b4 J# }
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    # p9 y# R. B) O% Y/ r
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");# U: ?) ?4 q" a* L
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    % h  u3 c  d* Q" \9 E7 t5 ^

. h- S/ z& f- U  C4 ?: fМетод getQuest(String name)" p  U, S$ D4 H1 _) g4 z/ r. B7 T

; }; u0 J9 b. n( w+ S  V0 j
  1. /**
    - ^1 q+ U# E% ^: Z
  2. * Получает квест по имени.
    7 C# i+ w& K4 E8 O
  3. * @param name имя квеста2 ~; X1 z) b9 D* I
  4. * @return квест
    " T4 q/ H  l: O+ q# p; s& p: j
  5. */
    6 ?& J7 l. e0 `& }# f
  6. public Quest getQuest(String name)
    0 P: Y# P) e1 t( o
  7. {
    & O9 S7 E% D) z/ r& {' E
  8.     if (_quests.containsKey(name))
    # u. H+ F2 [1 r- U2 I
  9.     {* P2 e9 f8 Y! l. ^0 d
  10.         return _quests.get(name);2 J& T+ C/ j9 R/ v" u! i5 y% {
  11.     }
    ; y% d6 Q3 A. j( g( G" D
  12.     return _scripts.get(name);1 f+ c  Y: c) ]
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.+ f* K- j8 D% I. V
; z: k4 b$ Z4 m+ e+ N/ B& T0 }
Метод getQuest(int questId)
/ ]% v( @, P- X' p# t: d
7 R. j+ Q/ B; l( W+ O
  1. /**
    5 j% U% H, [, b4 c
  2. * Получает квест по ID.
    7 ^7 l5 B' Z3 H5 [) e! R
  3. * @param questId ID квеста
    : d4 ~  Q0 h0 s' I' J  B+ e# ?
  4. * @return квест, если найден, {@code null} в противном случае
    1 U2 d0 W- G* X. h" U& Z
  5. */' u/ c0 R. q4 E- {" z
  6. public Quest getQuest(int questId)0 q2 u$ M' j' M4 }! W! P( s
  7. {
    5 U2 ?7 A, Z! G
  8.     for (Quest q : _quests.values())
    % ?" X8 _" o* ~- Q0 B3 Z: y: n  w
  9.     {
    , T. n. ~' M- M" G: r
  10.         if (q.getId() == questId)
    $ ^) \2 y6 z+ W8 Q
  11.         {/ j- M0 B# J) r) F  ~8 D
  12.             return q;. a( \' U% J; C- g& h/ Y
  13.         }3 i4 @( D$ G+ Z: c& l. U; @
  14.     }
    * F- S0 l1 \: U6 g" j. J
  15.     return null;
    9 ~! q* [1 d. u5 l1 V/ }5 J1 c% f  x
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.$ a2 s* |, q% R: c5 G
$ s0 u) D4 x# L, z" k% Y
Метод addQuest(Quest quest)0 T- _' ^# e8 B+ J& ~
6 d/ ]( S. s0 ~" U7 i+ g) s/ G
  1. /**
      X# v; U7 q% H7 ^
  2. * Добавляет новый квест.
    & H3 }: W5 U# G5 _$ E& `
  3. * @param quest квест для добавления
    + Z; c1 ?- m: h7 b% t. |! Z2 E
  4. */
    0 L6 g1 K7 a5 R
  5. public void addQuest(Quest quest)
    ; {6 Q- {6 ^% d0 |
  6. {
    6 Z: O! \* W8 J
  7.     if (quest == null)  X, R, U( R$ U* l7 M  v: K- l
  8.     {
    1 {2 U; D# C' M2 i
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    1 F4 v- L1 Y3 ]8 W
  10.     }: }1 V1 [' u6 S4 W% L- X
  11.     0 ~7 t5 J4 D  Z
  12.     final Quest old = _quests.put(quest.getName(), quest);9 {7 S2 l* h: `7 R
  13.     if (old != null)" T+ S. b1 b( q8 n& x9 a' x3 Q2 t2 I
  14.     {
    " j- ~4 l9 ~3 M& k
  15.         old.unload();
    ' e8 _# r6 {  b6 }. w
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    9 v/ j7 A" x4 T% `0 V  U
  17.     }% `# p: |" S5 |& W" E
  18.    
    ( i' U' [- b! n# J
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS), W8 F3 l! `8 Y2 x( @
  20.     {
    * }( V7 b* I6 U2 w! A* i8 B! }
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();9 w& {& B. `: d' @! {- a( m
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");* S6 `8 J8 _/ Q; }" f* t- r0 k8 U
  23.     }
    2 r# P" J/ W* O3 t% c9 ^
  24. }
    5 b, w! t7 p8 h  _- n- P
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.+ {" \$ ?! u+ j: }  l4 ^" q
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.* _& D) I  d1 `0 g4 c7 G5 L! R
9 S1 b: F( W/ G0 K

7 i; R6 q$ F+ o$ p2 l+ m# ]: w2 t2 K4 A3 J/ i. ~$ H& j
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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