Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius) E' F" {7 _( p+ O1 G1 {" x% z; [- F

2 L& G" Z/ h& {5 |! K# V# j' DРазбор файла QuestManager.java, V1 s0 ~# }# E3 m6 [+ @
: d+ H  E% N# R+ R
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.2 d- @& T% A3 Q. F+ \* i
Основные элементы) e0 ~  i0 f$ c+ }7 l" {
  • Лицензия
      l' w/ q+ Y) a+ B& [4 Y% M3 O  @
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      3 S2 D9 n" p6 ~$ ]( v! i
  • Импорты
    : J& F/ \; {; W4 v" d% X& g
, T# g- t2 x" l8 L9 u5 p  ]
QuestManager.java — управление квестами и скриптами.
1 s1 H2 K, S7 R- MПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\# W' g8 ?; H& m1 W; I# A

( Q: ]; Q6 A& D3 {: W

) l- W& ?0 h/ P  N' eДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.& R( E& F; z1 u, i, f  }+ q
1. Лицензионное соглашение" J' ~9 x$ a/ }$ ]
  1. /*
    5 R! K7 l2 n) @% i
  2. * Этот файл является частью проекта L2J Mobius.  }" }3 D: y1 x, Y
  3. *
    ' m7 j* p* [# @1 \) D+ ^( i
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    ) {# l& M5 U6 M
  5. * её в соответствии с условиями GNU General Public License, опубликованной: p  m1 j: ~* d9 G1 R& E
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.5 O1 g7 V8 U  V  |
  7. *
    1 P6 K$ h) C" l# q7 c7 T
  8. * Эта программа распространяется в надежде, что она будет полезной,% \9 X, _& \5 `2 i' I4 W
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    " ]/ _: \: s6 q
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.& i: P8 D2 J: X" s( t
  11. * См. GNU General Public License для получения более подробной информации.
    $ h2 a7 r5 a- O) r4 l" O
  12. * , q% n5 R$ h4 e+ p
  13. * Вы должны были получить копию GNU General Public License* K8 j+ n* c: ^; v% A
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ F8 E! i9 f  m7 b8 Q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
# F$ `( c  {5 P, G
/ Q& Z7 j$ C  {) o
9 r& F+ c% L8 n4 N9 \; \2 j2. Импортируемые библиотеки
! J# W# Q& v: F1 @1 e
5 O0 Z5 ~. [( Q7 Q0 [8 I
  1. package org.l2jmobius.gameserver.instancemanager;
    . {, L3 ^6 v5 Q, K9 H+ Z# ^4 x

  2. 8 j! ~# _8 A- ]7 t
  3. import java.util.Map;" X: u/ E- v) I. I0 Z: E
  4. import java.util.concurrent.ConcurrentHashMap;' P6 q; h6 `  u4 v+ v, m# w
  5. import java.util.logging.Level;0 \- g& i5 T; i4 U! g2 m; E3 q
  6. import java.util.logging.Logger;
    5 p" t, `' i, ^3 |' x% d$ u

  7. ; p, j) N/ ?4 x& {
  8. import org.l2jmobius.Config;
    . a+ f2 K! c/ E* p% i" f9 a9 a
  9. import org.l2jmobius.commons.util.CommonUtil;
    7 `- K+ r" ~; z: k
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    + G) y' P1 @" b2 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 — менеджер для работы с игровыми скриптами.* `: V6 z( e) W9 e9 m
7 y0 s# D, A( A
3. Описание класса QuestManager
9 ^' u' Q8 D$ k" A0 J( F+ n7 C
  1. /**
    3 ~; b/ ~$ w) b, c
  2. * Менеджер квестов и скриптов.
    4 F* P3 p; t9 |8 Q
  3. * Автор: Zoey76
    ) W3 s8 V, D& e( t0 X: Q
  4. */3 l5 q/ f9 V* h. E
  5. public class QuestManager
    ' @; I% X) }* `1 [% a- q3 b
  6. {* k( y! v+ q6 a4 ]9 N& h
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    9 Z% R1 q2 V# b* ~  M  z- c
  8.     : `- t3 k- c% a/ K3 ]; C9 ?
  9.     /** Карта, содержащая все квесты. */4 ^* A& s8 I% d" \. u" e8 |- q% _
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    ' p* H. `! N; M9 m3 ~4 j
  11.     /** Карта, содержащая все скрипты. */
    9 I- G1 e9 z) ~$ x
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();6 f% U& a) s( n+ [4 b3 R
  13.     # s; M7 \/ w5 N0 s$ h; J+ b
  14.     protected QuestManager()
    + W/ m! p" F$ A7 Q% S
  15.     {& N! j7 V) Z3 l; n$ c/ @- k  }
  16.     }
    # F8 |; y6 Y& q
  17. }
Скопировать код
4. Методы
2 d( |% l' U* z' k, N  ~( n' a) MМетод reload(String questFolder)
1 L( o! K' e3 H
  1. public boolean reload(String questFolder)( K, ?' M# U" A: k  H- ^$ G
  2. {
    $ Z9 A3 ~; j& e& o/ A6 G
  3.     final Quest q = getQuest(questFolder);
    9 ~, I7 a* T' X8 h, U- e
  4.     if (q == null)
    2 B  x; b, a0 i+ U1 A- o' ?6 A/ T. X
  5.     {
    & y+ G1 `$ j/ @9 O6 u  A# k! g1 _, X
  6.         return false;
    ( Q1 h2 k! j# O" J) R
  7.     }1 n* K2 ^7 Q+ ^
  8.     return q.reload();% V" Z$ F" T6 m1 {: S4 S' J
  9. }
Скопировать код
7 S4 a( C" n6 R% M

6 [6 Z1 C$ P+ [  [7 @  iМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% m7 `3 o6 U2 i+ I  V6 z# P0 r/ ZМетод reload(int questId)
4 D' X7 b; o, ?  O
( C$ Y) I" L. X2 b6 v5 x
  1. /**; d& l- b7 J, s% ]* m) Q, r
  2. * Перезагружает квест по ID.
    * V# ~& w1 ?' p0 N* L
  3. * @param questId ID квеста для перезагрузки9 J$ v$ d2 L4 @0 m# T  j1 f% b
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    $ b2 D% h( T% X+ \7 T0 z6 @# ^) d
  5. */
    ! Y+ `) E, S+ E! b, m
  6. public boolean reload(int questId)
    9 f: T0 \- T# W' {! V# l
  7. {
    7 n2 V% q' p5 B8 Q' U: ?
  8.     final Quest q = getQuest(questId);
    * t! k0 H* a4 U+ f! A0 S
  9.     if (q == null)
    ( \% b0 Q* t1 L0 k, K! B! V
  10.     {. H* l, A4 \5 B0 J
  11.         return false;
    ' a, Q0 D0 Y  j
  12.     }
    ! ]  Z9 b  K: f; C. G7 U
  13.     return q.reload();
    ; |( \% a0 j/ m( Q8 a; |* r5 \, r/ J2 E
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    " d% g- U0 e! M# D

: F1 C3 i4 m9 U$ ^- TМетод reloadAllScripts()
, f: F- ?8 n7 @/ s3 z# O$ S0 V% h3 r! j5 k7 E) \7 F
  1. /**
    , H- a2 I) {' ?& l$ P* j
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
      ]! K6 c( A, n8 H4 I" x
  3. */% d. }* ~* O6 p2 F- D
  4. public void reloadAllScripts()
    ) n+ f; _) ^& D
  5. {
    $ x* K9 q9 E  E- h2 u
  6.     unloadAllScripts();
    9 ~" D" h+ a+ A" G
  7.    
    3 o+ C3 o' r: k
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");" V0 x% z" \8 d% e% Q5 j. V" X
  9.     try
    7 U/ H. c0 ~  u1 @4 S
  10.     {- ^& b* ^0 }9 E
  11.         ScriptEngineManager.getInstance().executeScriptList();0 j2 c: N: q0 g$ C& ~% F5 H
  12.     }
    3 B+ G! V% h% H8 ~  F+ @4 M
  13.     catch (Exception e)! R' ~5 V. o9 k7 i9 F- b
  14.     {
    9 L9 t4 V! z, K5 \; p% \
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);" D% _' w4 ?/ b5 E- R" X$ y7 p0 i
  16.     }
    " a1 ], M- a# S
  17.    
    % ?4 y9 S+ K# x9 _
  18.     getInstance().report();# c# O6 q1 g( g. k, ^& p
  19. }
Скопировать код
Метод unloadAllScripts(); A' D( j$ n8 h! M" l: _& d

* M$ w4 z9 b' a0 e
  1. /**3 t: R2 Y6 j9 D* k  G
  2. * Выгружает все квесты и скрипты.
    ' m9 \& d0 f& `
  3. */+ K7 N5 o! w  M
  4. public void unloadAllScripts()
    $ c, b! O6 p$ \: _
  5. {
    + z* S4 z  z1 L1 D1 i& X  N; s( P
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    & X: z5 N8 _  T, }% l, u
  7.    
    9 i, W& q# }0 O
  8.     // Выгрузка квестов.$ e8 D% a7 F- s2 v8 D5 b
  9.     for (Quest quest : _quests.values())7 R1 i# \  B( G/ H& T. W6 E
  10.     {3 o1 ^$ x1 @. X5 _
  11.         if (quest != null)
    4 M2 \; z% Y! R! {
  12.         {2 y1 N. y% D9 p6 I; G9 {
  13.             quest.unload(false);
    . g* t7 ^3 @4 s$ B. S
  14.         }8 M' _* G/ M. C
  15.     }. \2 \* G& J7 P' t' V1 J+ m
  16.     _quests.clear();
    3 x1 y3 @3 j$ |9 G% q) K. T* Y5 E
  17.     // Выгрузка скриптов.
    ) e# Z1 ~# _+ c- a, W- T7 ?# {
  18.     for (Quest script : _scripts.values())
    ( O# V4 [& R8 \$ z2 l
  19.     {, @5 {" h: K+ s! Y+ @
  20.         if (script != null)
    # ^2 W# _/ Z( h' L+ v0 z2 g2 s" T$ q
  21.         {, D1 i, L- t7 \3 ]3 h
  22.             script.unload(false);
    6 Q$ s) i! z: N% q6 ~1 g/ H1 s
  23.         }
    % ?. w5 ^& G  |% H% Q1 ?# ]
  24.     }8 s1 K" a7 F$ |2 J: {
  25.     _scripts.clear();
    8 v6 F6 e7 W0 I
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.6 Y9 |! }7 i: u7 a+ m0 ^( s( ^, w

# M2 V1 L9 `# Z+ OМетод report()
( w3 V4 h- r/ [  X
5 {( l6 b2 Q) x# E. O% j
  1. /**
    % a7 H& x9 ~3 i
  2. * Логирует количество загруженных квестов и скриптов.
    7 s9 D2 l( m2 E& x. k  c  ?6 G
  3. */
    0 Y/ I2 \+ I1 y. }/ d, v
  4. public void report()8 v  x# ~6 L) E* w. t% f
  5. {
    : g+ ~% L( h' D# }$ M! P1 [( ^9 _
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");4 S  R# S& G! Y4 L. @
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    $ V: `; P  i& a1 W. z" R
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.: e& K- b8 |9 p% r+ X/ g4 i

, N$ s6 H3 X2 m8 O1 j/ NМетод getQuest(String name)
" e( O+ b, z2 y+ R- H
$ w; o- A/ D7 y
  1. /**
    ! D* [' L- d' Z* c- l# h5 [
  2. * Получает квест по имени.
    0 k3 }9 m. h- c: X+ y$ J
  3. * @param name имя квеста
    ; E$ Y# M  p  u6 E
  4. * @return квест7 y8 Y. Z' D3 t: t
  5. */4 v# Y0 F# g! B! C9 I
  6. public Quest getQuest(String name); ~6 L3 G2 ]! ~: F6 Z; o# [
  7. {
    6 T8 `: q3 D9 X4 h5 K3 r# Q
  8.     if (_quests.containsKey(name))1 {- ~; z+ ?' ]! U" T
  9.     {
    " N* f' J% Q( _% s8 X6 Y# e2 r
  10.         return _quests.get(name);) l0 i- k+ B1 _7 k$ `% ~
  11.     }
    6 {. X7 N  _- m3 f3 T
  12.     return _scripts.get(name);- M$ f  ^/ W0 x: l' s/ C2 X. }
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.1 U; d* |; `+ {( {! c- _  c7 }
" N( @8 ?5 a. }$ g8 {8 x
Метод getQuest(int questId)1 k6 G) L9 D/ w2 r; J3 K5 ~7 [

0 [# R) e' j) P0 c8 D6 K1 h
  1. /**
    7 o+ D7 [# ^* d
  2. * Получает квест по ID.+ M0 v/ B- |# g+ }4 _0 L: p; _) j
  3. * @param questId ID квеста6 b* Y! @) K: i) O' |
  4. * @return квест, если найден, {@code null} в противном случае
    / O! a8 m6 Q  z
  5. */, A! }) c. n! x/ j
  6. public Quest getQuest(int questId)" i7 G4 Z) O( U* C- A$ D- z( J0 x
  7. {( @! ]; F$ M# t* E$ y
  8.     for (Quest q : _quests.values())
    6 ~, i3 X0 S3 I0 L
  9.     {  n7 p; v9 W& z- T; e. o
  10.         if (q.getId() == questId)
    ; ^; |( A) A6 j8 ~" [$ w$ `* n
  11.         {) S- \8 j8 z2 T2 h
  12.             return q;) I* h% d* p9 p: \$ L
  13.         }
    ; l; W2 d2 F8 _% ~
  14.     }" y1 A1 n/ \6 h6 S) z
  15.     return null;; N9 L2 B5 r/ O
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.# [! m) m  ~  d# y
* T% Q0 h' V* ^, @4 g1 B
Метод addQuest(Quest quest)* q# F3 N! ]  t3 }, z, a1 `
% z* X* e6 b6 g* i, g
  1. /**
    4 G4 ^) s- e4 U% `) U
  2. * Добавляет новый квест.
    + p+ u4 l* Q$ ?# Z. i
  3. * @param quest квест для добавления
    ; W) y1 e: [7 m2 S
  4. */6 k- {7 {) s, f9 |9 M, z/ R
  5. public void addQuest(Quest quest)
    ) y. W" z) L" Z1 p5 a
  6. {: E9 i7 l0 h& ]7 g
  7.     if (quest == null)$ F; n% ]6 |) e: `8 K0 N4 t
  8.     {
    5 t" O# R* R4 }5 Z4 w1 ?
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");. ~1 m* V, ^4 B2 m9 D+ _
  10.     }+ a) b* p5 \9 _9 h' j. |) f, G
  11.    
    - I+ w/ A: Q/ E$ C
  12.     final Quest old = _quests.put(quest.getName(), quest);
    0 f0 F3 I- o. Y) I  {* d
  13.     if (old != null)
    3 ~8 Z* I8 {  P* I, O
  14.     {
    ! x8 E' T  o4 }) G( |
  15.         old.unload();# ~. l& [% o! S: p
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");3 R5 G& s: Z- z* ^# m
  17.     }
    / o5 M. V. K- V! a
  18.    
    6 `. o4 |+ h* E9 `( B5 X; _6 n; h4 j
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    " Z* P$ b2 O( F* W) I2 a
  20.     {
    ' @3 l* O7 V. h
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    + r2 c6 [9 j3 V$ i+ j/ W
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");1 ?) `! z' T1 S% S. P) J8 d/ w
  23.     }
    ) B3 u5 }4 {& b4 ^' f) {
  24. }
    ' J1 _& Q. i' M) X! \1 q
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.* Q# Z' H; h, Y7 |6 K
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере." ]& O5 N/ T% l! o; h. K; \

% I- m9 r  q2 |0 \# r
. o7 r7 [8 O0 [# @
5 f3 r( @* X) b
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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