Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
3 H+ X! D  x  q9 ^. ~6 \; |, j# s8 z: n2 A6 ^' ?! o' _/ b
Разбор файла QuestManager.java. C% y: a& l7 i/ d& T
, S( r9 B5 A# k: h0 N, [
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
; n9 c  E! V7 ~$ S) Z4 h0 o; GОсновные элементы
- S4 k4 k- G5 ?) B5 Y: K3 k) a
  • Лицензия! G- J8 x5 M; d$ U
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      7 x! J% L# N3 z: Y" M2 L" b8 H
  • Импорты! e) b) X& K* Y( X1 }5 Q

/ r, J8 u  C# `) D$ S; y* VQuestManager.java — управление квестами и скриптами.
  [! M, h% r; E, x3 i, y6 q: CПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
) E* L" d, Y8 ?4 T$ V! K/ d; H0 h2 o; d7 w( t( ?3 i

0 m4 \8 L1 ~1 I7 M( N- H" FДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 O8 l. U/ z+ U: g& S1 R. D1. Лицензионное соглашение
& ?( m4 p/ @% z* V9 p# C8 L3 s6 C. @
  1. /*( }3 B" |4 J+ Q9 m
  2. * Этот файл является частью проекта L2J Mobius.' p! ^. k- d5 X! e* {
  3. * $ {! D9 u5 {- q2 Y& O% R
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    9 s% k- t. ^# ]5 s8 s) D
  5. * её в соответствии с условиями GNU General Public License, опубликованной6 w. j5 ]& b0 {' V; }" ]
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.7 f: P, Z/ O( s, V& K+ V
  7. *
    : j9 E7 c& S/ p$ H0 ?" O3 N
  8. * Эта программа распространяется в надежде, что она будет полезной,
    4 O* H  T' h- R/ x, S
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    , I: q" ~. j5 O8 L
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    ) E# x, ^" M) n+ \7 ~2 h+ p
  11. * См. GNU General Public License для получения более подробной информации.
    3 |" b. D1 J( p; J
  12. *
    5 ]/ t6 J$ p& s7 ]' h' h
  13. * Вы должны были получить копию GNU General Public License0 F) G( T5 z" O5 j
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.( g- N) i3 z! Z$ M3 }
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
$ f7 H* W0 N. {% F* w0 A
8 y, ?, i) _3 a. Y# x" P; I
  w+ i; Y$ ~4 f: d# c2. Импортируемые библиотеки
: a: ?( L# W( U) _- h( c; M6 F1 j4 p) U9 q; L1 b/ a' B! F( k
  1. package org.l2jmobius.gameserver.instancemanager;
    ) `; l5 q+ d, H5 D( j
  2. 1 ^  P+ b8 b1 `! [8 V" j, b
  3. import java.util.Map;+ S5 J8 d# l$ D3 k+ o* p. v5 k
  4. import java.util.concurrent.ConcurrentHashMap;
    3 C' M1 Q: b% K
  5. import java.util.logging.Level;
    : t+ R! e$ R5 J: x% G
  6. import java.util.logging.Logger;1 k: \/ r- ?4 L; y7 s/ F3 M

  7. 7 u+ @& y3 w7 A0 D8 s2 J( v
  8. import org.l2jmobius.Config;
    # `" D  u/ p" Y' w
  9. import org.l2jmobius.commons.util.CommonUtil;
    , L5 K0 ~' M1 U5 {- t% ?5 w- \' n
  10. import org.l2jmobius.gameserver.model.quest.Quest;% i; s# P! I- ~+ {, J  w
  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 — менеджер для работы с игровыми скриптами.
7 T. w+ Y& m" T* D# R- C; i: x
3. Описание класса QuestManager1 s6 i, {2 G5 }( j! G
  1. /**
    ! B- V; `' M1 ?) x. U2 j
  2. * Менеджер квестов и скриптов.
    - m. t2 S; z4 [+ t5 r1 W. ^2 p6 B
  3. * Автор: Zoey76% R1 q, X  T' Y
  4. */0 Q1 q9 U) ?: g: P4 P, K( A
  5. public class QuestManager
    - [/ \" `( u5 D3 w" S, ~4 \1 t
  6. {' O( ]  d* u5 k, L* _- N
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());6 M; z* v. e  j! G6 P
  8.     9 |6 G  u" l% k5 k* @* L
  9.     /** Карта, содержащая все квесты. */
    5 R  [9 w9 O& x5 J+ ~! A
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    9 S4 L3 U2 m. c* g/ M/ r& R3 I
  11.     /** Карта, содержащая все скрипты. */' z; s! q7 T; R
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    - X' I& P2 {7 a* D- z+ @
  13.    
    / g: ?4 Q  y3 }' ]7 ~4 f
  14.     protected QuestManager()
    3 l- h4 i& _3 A! j9 u' B, `
  15.     {2 c4 s0 p; a5 f: X
  16.     }. s" q9 \/ a3 B: v  n; N9 d
  17. }
Скопировать код
4. Методы
; T( @# z) Y# sМетод reload(String questFolder)! Y! W! I( }' L, b5 ~. f. T
  1. public boolean reload(String questFolder)0 a8 v0 g8 k; Z
  2. {4 ^% j' r7 v0 b. J: h# i
  3.     final Quest q = getQuest(questFolder);
    - G- m+ E5 ^$ c/ X1 R4 F2 z7 |
  4.     if (q == null)$ R4 Z; S/ \& j" Q! e
  5.     {) F, o7 h2 o; t# ?7 }
  6.         return false;
    - S* J+ G$ C+ Q! Q, H8 N* o
  7.     }3 K: X) L0 `7 F8 z
  8.     return q.reload();
    2 Z) K0 ~2 g6 T# X6 q3 Y
  9. }
Скопировать код
# v- o) B7 g6 Y- [5 V7 Y

8 }+ V( \/ P& u7 o# a% CМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.  V$ x6 u# d" @. S/ S$ p# n
Метод reload(int questId)
8 r* c/ i& `, z4 y' D) t: n9 F# G) v' \9 U, F+ t8 A5 j! d& E; _
  1. /**
    0 q, O. ]( V1 l0 n
  2. * Перезагружает квест по ID.
    % ?! j, H( K$ h6 ^5 M
  3. * @param questId ID квеста для перезагрузки! ?) N  P* w7 w* n( T% ?9 \% q
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    + R; y" L! h' s$ Z4 F
  5. */
    ! m. M6 B, r% ]8 r; u  p- h4 Y
  6. public boolean reload(int questId)
    2 \* ^! ?* d$ o/ h
  7. {
    / c; D" Z+ |' b! f# Z1 I8 H
  8.     final Quest q = getQuest(questId);
    : o$ t2 F( T: ~; i+ R
  9.     if (q == null)
    2 T/ g2 p$ f5 w( R- G
  10.     {" }) {. p  }3 p
  11.         return false;
    % Y; }+ z$ P) b! Z' T4 u- n
  12.     }" p8 v% d; T) i
  13.     return q.reload();/ C1 A0 a9 V6 [4 |
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    + c8 @0 ^" I1 k" l) C* X8 o
, Z2 w( h  r+ v% n& r2 Y% T1 G
Метод reloadAllScripts()
  N8 c3 R# A' q/ s5 p: @% z7 b0 |+ ^
6 E: U: m- f& W9 _
  1. /**
    0 ~( \" c9 L; S+ T; z
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.# H" p3 D; H1 B
  3. */9 P; T# {6 s7 ?; U
  4. public void reloadAllScripts()1 D; `# c- v8 Q4 b
  5. {
    # ?7 e& R( B6 ^- d" x0 P5 }
  6.     unloadAllScripts();  S5 i% N3 t9 \. z' O4 @: e7 Z
  7.     $ T! D0 ?9 z8 j; U
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");* R& K% s( E1 C* h6 j6 E
  9.     try& C4 f( k* C" g% M- V
  10.     {
    ) h6 f$ w* H0 r( i5 K! q! A  [
  11.         ScriptEngineManager.getInstance().executeScriptList();
    ( Z2 ?$ o% H$ H# I4 X
  12.     }" e. `* ?9 r: D1 i
  13.     catch (Exception e)$ a" s& e, h, u) |: A6 y
  14.     {
    & U* k1 ?& b+ z2 j! M1 n
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 \5 f2 {0 {1 Z4 l
  16.     }
    4 Q# P$ B/ o: ?! `" e$ E* [+ G
  17.    
      @% u4 ~- \' _' q3 b  A
  18.     getInstance().report();
    + B. n, N' K' }
  19. }
Скопировать код
Метод unloadAllScripts()
- a: v  K: b' d8 z  L# F) z, k; p' J
. c% n) }7 ^5 N
  1. /**
    ' C- C6 O1 S3 O
  2. * Выгружает все квесты и скрипты.
    - q2 S; s% B  `
  3. */' j- F% U0 l; N3 N( V
  4. public void unloadAllScripts()+ ^. E" k! n2 r# m" d+ K( f
  5. {: A. _8 Y$ a$ r( S# ]
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");& F1 E" r' z6 l3 }% t
  7.    
    " l9 D. s* x7 s- `/ g% m
  8.     // Выгрузка квестов.5 ^& i, w& Q/ d7 K* h5 p( Q
  9.     for (Quest quest : _quests.values())
    . V; ~& g8 W2 r9 c& s+ g+ V2 a4 }
  10.     {
    # F: i& I" Y. d  E; I
  11.         if (quest != null)
    , K9 b- Z: V3 p) _+ K
  12.         {6 E' i% d  l5 G  _; V6 x
  13.             quest.unload(false);
    % S& ~+ j- P  k3 Y4 g
  14.         }% l2 ^7 f* R' [+ Z& p9 h9 F
  15.     }/ i5 @4 Q$ n) |, K
  16.     _quests.clear();
    5 X& E0 b! K; ~& w8 l* x
  17.     // Выгрузка скриптов.
    5 s4 B- P! C5 Q2 ]  z; }
  18.     for (Quest script : _scripts.values())
    % S8 E- L& b# D0 H3 D5 h  J
  19.     {
    ; r* v) o- i- @  u
  20.         if (script != null)
    / E/ Q; ^$ }' J% j3 {/ Y' ~
  21.         {
    , c* ]+ q2 _' e2 o
  22.             script.unload(false);6 ?3 M: n0 k- t$ d( \; B; F1 `
  23.         }
    - ~" X* L. h' P/ y
  24.     }- Z5 ~2 d! V( D5 D
  25.     _scripts.clear();
    1 h8 V% J# y4 u5 w/ q7 `) A
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    : O' n, y* y% Y1 y% @' u
+ `1 u% }. E9 t4 S) h& t! e
Метод report()5 W' ^7 w3 ], W3 J; k
$ r( G4 t& _! ~8 D5 D
  1. /**. C# o% K) C; A: X9 C& R3 ]
  2. * Логирует количество загруженных квестов и скриптов.6 T. O0 M- h) T# e, I/ ~
  3. */
    " Q1 l# u# v- Z9 k
  4. public void report()* c$ F, e* u; b
  5. {6 J4 `" G5 R% a4 D! B" L/ o
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");/ s" X) u" j. S6 L) |4 }
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    9 O9 `% }& L% {( H( S3 q: K' [
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.1 S) L8 W4 h' J& G1 ?9 g$ v
: E. u% V" r: L; g: t
Метод getQuest(String name)3 J" P) y- x: y

  Z2 W/ b4 b; l6 J
  1. /**
    3 ?/ F  R! t3 n8 A! T4 ?
  2. * Получает квест по имени.& s2 o; t! j5 E2 e2 C' O% C
  3. * @param name имя квеста7 v- E: y( h5 j  z5 N  e# ?
  4. * @return квест
    " x2 L% v4 b' o) C1 z6 `
  5. */. ~( M6 [' \3 f# H  j) k* x; l
  6. public Quest getQuest(String name)
    0 c% l; m, y5 \( A1 K* L
  7. {6 L# @- w0 y; G* y( {) \% Y7 D
  8.     if (_quests.containsKey(name))) u1 Q) w0 M& p4 V2 Y  |$ d+ C
  9.     {
    : s! N1 K/ a7 A3 `
  10.         return _quests.get(name);
    7 q8 g. R; D! M4 m7 y6 K. m
  11.     }9 ]- ?% c# g( T: V" t% X  [8 _
  12.     return _scripts.get(name);* X6 a! s2 u4 C- F0 s$ P
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    ' T# L) f, e8 y( T+ F6 F
1 F* g/ {8 r8 k% r9 X
Метод getQuest(int questId)! [! ^% R* c  ~* G0 ]
, D2 X- i8 r/ X5 Q' N* d
  1. /**
    9 N# ]+ J$ K% ]: e; r
  2. * Получает квест по ID.
    . P3 d# j& \3 s4 D6 Z* r& o, l& `0 U
  3. * @param questId ID квеста
    ; E; f6 {! n5 i) u
  4. * @return квест, если найден, {@code null} в противном случае
    7 R! w+ T) [# E% Q4 L; [
  5. */% L. `; e7 t" P% M. f( Y9 V- {
  6. public Quest getQuest(int questId)5 o$ D+ I$ l" o  D" j
  7. {
    $ V9 P. W. k$ v5 c
  8.     for (Quest q : _quests.values())
    ; M2 q( Q6 p8 [: h) d
  9.     {5 z! Z/ \! o& K! q& o& G) }" L9 L
  10.         if (q.getId() == questId)4 g$ x+ _8 c; Q6 R) x* h
  11.         {: w+ q- h5 f- M! P+ O! e( v
  12.             return q;, ?1 h2 ~% k) q
  13.         }
    3 u' m' O$ f7 z$ O
  14.     }' ?. s# c/ ?3 Q- N
  15.     return null;
    2 L- H% e4 t7 l! q1 p) c; c
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.( e' [: N% E7 S

7 d0 J$ S* q8 [' E5 O' bМетод addQuest(Quest quest); R$ S" n! `+ t3 w

& B" W% q. a9 q$ {
  1. /**
    & K$ m- d/ r: [8 y
  2. * Добавляет новый квест., v- F! I% @6 b( A  M% x
  3. * @param quest квест для добавления  X& l/ Z8 C6 d. g7 H0 g1 J/ F
  4. */1 Z# v0 `% o( H
  5. public void addQuest(Quest quest)
    - B( |$ M+ J9 ~% q0 W- W$ Z* l
  6. {
    0 v: K4 ]( e5 \4 X# ]9 E/ w3 K. \% P
  7.     if (quest == null)
    ; m! t! E3 X' V9 e& N4 v
  8.     {3 r( c; ^' l3 i
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");! Y) r4 v/ H& W" x; U3 j
  10.     }2 Q5 J$ u: i6 i! f
  11.    
    8 i) f8 q+ r1 M4 d7 Y7 \. x
  12.     final Quest old = _quests.put(quest.getName(), quest);( W7 K& i% l8 p5 k
  13.     if (old != null)3 \" g. ~4 F, T$ y
  14.     {
    " t: ^6 v& o, Y: X: p
  15.         old.unload();
    & g  u( W( B0 \4 h$ u
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: J/ I/ n4 _5 F* F! q
  17.     }1 s9 Y* ]# A2 L  f
  18.    
    ! v; R+ e  O; l/ }
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % ~4 w7 R+ P& ^! M+ \
  20.     {; w( v+ s* t2 {- Q8 e- C5 \- R
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    4 @. `% A" n. e% v( u
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    " C1 r3 i- K* _% Z. B/ q, f
  23.     }5 o. f' E' U9 i% M* k+ I
  24. }& W# q, e; H- c" h
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
% u% Y. w3 o5 C6 GЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.) w; T6 Y# a$ h( [+ K; y
% D( v( W1 X/ j: V; I, {& V( j
+ ~; i4 Q9 d  k& H
) f  \& A/ |- P: b5 l- `9 ~
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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