Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius; n- X; B( [& F3 s9 W; [% p

; D* B% h6 Y* A: Z3 M) YРазбор файла QuestManager.java4 K3 B( [9 B" G8 x

7 o& c, z/ }9 }* N6 sЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
# D, g' |" n0 a" b, m/ ]: f& RОсновные элементы
. f. K# ]; o* P% L$ z3 L
  • Лицензия
    9 E+ P  E: @3 \- G& m, J. `7 @
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.$ K7 a3 \) L* ^& ?- N
  • Импорты( ~5 a8 D" d/ U' D& \1 ]0 W

0 G& ?' [4 B* I4 uQuestManager.java — управление квестами и скриптами.. ?% w6 ~1 r  `$ T0 |: S9 V- Y- @
Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\; @7 A" @! |2 w  n

7 I4 y( Y1 p" J; _

2 F! q9 X* v5 q+ TДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
% r0 |, Z) u( A( s$ `- {0 T% V1. Лицензионное соглашение  a, }3 J. D5 H( A
  1. /*
    3 g" D+ [/ g0 L' |$ P! |: @
  2. * Этот файл является частью проекта L2J Mobius.
    2 x8 t4 r7 @5 J" X3 x# e* m# w
  3. *
    ) @" n7 w/ M% W" l/ v7 P$ ^: f
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять' o$ X, f  s" m4 Q& Z* n& j
  5. * её в соответствии с условиями GNU General Public License, опубликованной8 p  l$ C, x, c1 L. _1 v4 T
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.2 q6 d, F3 D$ u2 V
  7. *
    - m9 W1 |; Q, f
  8. * Эта программа распространяется в надежде, что она будет полезной,
    $ O1 F. p3 o/ N) @
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии1 [3 f: H8 h3 U: T
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.8 N  E1 c9 V1 o" S) k9 M
  11. * См. GNU General Public License для получения более подробной информации.
    9 x7 Z6 }3 m. v' T. G
  12. *
    / p% _' x5 Y/ k9 F
  13. * Вы должны были получить копию GNU General Public License
    ' D1 m; l7 |9 H) _; T0 ]
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.+ a5 |; [  d- R. i) A
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
( l& `# z# t9 b, O: e! Y, R' C* [* O1 A: w9 N' n

) Z2 C) [+ D" }5 T, m' M2. Импортируемые библиотеки; \5 t: Z+ p, Y6 u) ^5 {: D
, H4 ?  u0 R, {' c
  1. package org.l2jmobius.gameserver.instancemanager;
    / n: J9 v, k4 |6 s6 ~& N8 x

  2. 4 u0 w8 Y- B+ Y8 D2 K. {
  3. import java.util.Map;
    8 B( u$ z3 q6 K# Q3 P
  4. import java.util.concurrent.ConcurrentHashMap;* ^! S# V' `$ {) u9 z: i
  5. import java.util.logging.Level;
    . Z% M: w3 \- O
  6. import java.util.logging.Logger;
      h& x/ K! k* g

  7. ( J! l/ Z2 a4 g! S
  8. import org.l2jmobius.Config;! n4 x. g/ ?& [' j( Y
  9. import org.l2jmobius.commons.util.CommonUtil;" J/ F- R4 p' K& {8 t/ N7 I8 Q
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    7 F/ ~0 `4 F* 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 — менеджер для работы с игровыми скриптами.
4 Y# G4 g; D% p( u, z( ^5 x1 {# E1 M+ H) B
3. Описание класса QuestManager4 T& W$ O; Z* {8 w
  1. /**3 A  c7 G' d/ x, M* N# I; a
  2. * Менеджер квестов и скриптов.
    ' b( R7 ^' Z. `& B
  3. * Автор: Zoey761 A9 \1 D) p  d
  4. */
    $ A1 H! {& b% Q' v8 o: F* W
  5. public class QuestManager, }2 f7 q+ I5 W" {) q
  6. {8 S  s, F0 |7 j5 ?/ V  e
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    2 m- I/ _% i4 c  s8 \- j( k
  8.    
    & q- X# y- N$ f1 X/ |
  9.     /** Карта, содержащая все квесты. */
    ) w  H, {6 s* r1 ^
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    3 G% e+ N4 z/ M- m  ?
  11.     /** Карта, содержащая все скрипты. */
    6 X( ~! u3 e+ ~  J: R
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();+ d3 r' u" S7 ^" L" n, F
  13.    
    1 l8 `1 B  r8 }( e; G) G; w4 H# k) [
  14.     protected QuestManager()
    . R8 r6 s5 n3 P1 r/ r
  15.     {
    3 I% ]5 a/ @; |- R$ a! Z
  16.     }
    9 m$ A4 w; l4 [: |* k
  17. }
Скопировать код
4. Методы
- q) }- F! N$ ~( X9 W8 g) N/ |# oМетод reload(String questFolder)6 i" ?+ N- b, E' g& G
  1. public boolean reload(String questFolder)
    3 w; g1 {& i  w, ]& N1 l6 S' i0 W
  2. {# e/ I) h  l- m; _6 }1 Z
  3.     final Quest q = getQuest(questFolder);! B4 W2 l4 U) r7 [
  4.     if (q == null), \7 Y" t' I* f% O1 B" l
  5.     {# Y2 |$ ?. S- Y5 Z! C' {
  6.         return false;
    * p4 @4 c; r6 g3 c9 V
  7.     }+ Z" a6 j: z* w/ I3 L, e" C% v
  8.     return q.reload();
    8 |6 E4 e9 s+ r
  9. }
Скопировать код

/ ]; P* V, v7 A# z) {3 j
# W9 O" u/ B; p. @0 L3 bМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.' n7 b4 L3 }/ n+ L9 r* }+ X; v
Метод reload(int questId)& \6 _+ V7 m8 F! x, J6 d

% D! r# U) l* ]& w0 P
  1. /**
    0 t/ R: u* ?* Y1 Z2 m1 L$ S  v
  2. * Перезагружает квест по ID.
    8 B& j( s, R  n
  3. * @param questId ID квеста для перезагрузки
    9 k5 n/ d7 v2 u" j' X
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае+ {0 ?9 F0 S, f; Y6 d5 J
  5. */
      S3 d, v. F4 w
  6. public boolean reload(int questId)
    ) l6 _) Z0 V/ e! u8 Z; }
  7. {
    " F4 X% }# U0 W# r
  8.     final Quest q = getQuest(questId);
    . r' K* g+ a2 p# J1 N
  9.     if (q == null)5 |- k6 F( m; u1 j
  10.     {
    3 S9 A6 R5 @. \% D$ J# q" O5 m1 Y
  11.         return false;) U& M  z) l9 e8 [$ {
  12.     }( z, b  N) ^  B
  13.     return q.reload();( ^2 N+ k& Y1 f2 e) A2 D/ G% J
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
      D; L, O7 b% Q3 T3 ?

* e6 n- l; H3 [; r' lМетод reloadAllScripts()
) n+ t; |: v9 Y# F5 C. e3 g
8 M$ i7 s6 ]' V: |/ {4 V
  1. /**/ x% ~2 w( `. Z5 p8 Z
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.% s& I! X7 X: G6 W; h
  3. */
    1 R$ Q. v& H; Q& y
  4. public void reloadAllScripts()
    ' X/ h/ Q* o8 F6 y$ B
  5. {! G& l. I& |- t; K
  6.     unloadAllScripts();
    / V: C: ~; f: f- Y4 a6 K8 g
  7.       Q) j8 ]) z* `6 \% a6 Y; t& [( E
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");: x8 k3 F# B7 J% p5 c% v9 P8 ~
  9.     try
    8 p5 r" Z3 U& f' t" e4 ^
  10.     {
    + y4 ?% C' [* c9 C9 V* X4 @
  11.         ScriptEngineManager.getInstance().executeScriptList();
    & F+ S( r: v7 t/ |" V  }5 j
  12.     }: r4 U4 F: ]/ K1 |( B( ~! O+ i
  13.     catch (Exception e)" O. D$ N* Y% F# _2 X7 M
  14.     {
    2 o0 p2 U' `  t/ t- v
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);9 ^+ y' p" R1 Y
  16.     }4 L2 G' `9 y2 a: {+ E3 l
  17.     * I  |, y, [6 b* Y1 l
  18.     getInstance().report();; U$ r  k/ X/ y, X+ [2 j) y* R; P
  19. }
Скопировать код
Метод unloadAllScripts()
5 E! {$ }! M& M; H6 p3 m- @0 o# k6 a, |9 {; v
  1. /**
    4 f0 w; f7 U# D+ r
  2. * Выгружает все квесты и скрипты.
    2 b$ N% Y& A* j4 v3 ?# D/ S5 C
  3. */
    # ?9 ]  F% O0 U1 L1 E9 _
  4. public void unloadAllScripts()
    . f% Q) B5 I' W+ f# h) n
  5. {9 G- ^8 _1 a- d9 W5 N
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  _: Z7 ~# p7 O, f. z
  7.    
    7 y3 v5 j  ]. ~2 I6 s
  8.     // Выгрузка квестов.
    1 |4 h( s! Q2 q
  9.     for (Quest quest : _quests.values())7 ?! s, K) F9 a) m0 d. A
  10.     {
    * b7 e6 W5 C' ^8 _* M+ V% M
  11.         if (quest != null)  Y" Q* F* `. E0 w$ ~( u# |
  12.         {& p6 W' O" e/ n: E6 ~  D
  13.             quest.unload(false);
    9 D2 `8 d2 C! h6 e- g9 }' d5 s
  14.         }; n$ c( X) V. X" t
  15.     }
    5 g5 N$ Q2 R, J8 J: [3 C
  16.     _quests.clear();
    7 ]2 k2 I4 f8 j, m  D
  17.     // Выгрузка скриптов.% I+ }/ G" Z9 u# A1 ~0 L. s6 O8 ]
  18.     for (Quest script : _scripts.values())& Z1 {1 Y) S6 @* N$ l% z9 g9 T
  19.     {
    - y! A% v% _- G' ]4 M: s
  20.         if (script != null): A8 @$ D2 ?+ R2 |' N
  21.         {
    6 s& Z$ l0 T, w9 e6 a1 ~3 z9 R% e
  22.             script.unload(false);
      `9 w( t7 J/ {  Y& G
  23.         }
    : F  B% U9 t* t) I0 F1 Q; ~& E6 y
  24.     }
    * |& ^$ G' G; E  S$ `1 ?( R
  25.     _scripts.clear();* J' |. W+ y) p* \
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.# |1 S# a' [3 E. y. }5 l8 j

7 |% r7 y* f7 x% d$ s+ iМетод report(): k# O$ u( Q" I8 f1 s

$ G. d/ K5 Y; U0 [; w4 }
  1. /**
    8 q2 d6 c, k# v8 z2 _
  2. * Логирует количество загруженных квестов и скриптов.  ^, U8 y/ m. U7 g0 M, |; D
  3. */1 _3 r. s4 d" b& m
  4. public void report()
    $ n3 p8 h9 q9 @* O/ \* Q% J
  5. {3 `4 m' F8 G( f% R, t, |
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");# k! m0 o4 ]1 G+ e
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");" U# K8 {% J4 ?- V$ O
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.7 p, p  v# Z9 F  ~

. u" m  W1 I. N' K: s: fМетод getQuest(String name)9 C8 H% S, p- i* B: n
% y( y' E$ a& |# E- Q: k
  1. /**
    + B8 D6 Z0 o2 S
  2. * Получает квест по имени.# {8 E" H( }. M1 T' M- r4 V
  3. * @param name имя квеста
    ( l1 e% t) ~+ G
  4. * @return квест
    5 V# R) O- ~: Q7 ~
  5. */
    1 g* S3 ?9 g- h8 Y# |* Z
  6. public Quest getQuest(String name)3 _( t/ r; |0 m" W1 V/ i
  7. {
    " ~1 c9 L$ Z, I8 e( F. C
  8.     if (_quests.containsKey(name))7 u: s1 p: o# K2 Z
  9.     {
    ' k8 Z& x8 E7 T+ n9 h
  10.         return _quests.get(name);
    ( M# }5 s# u4 ?" Q+ j
  11.     }
    1 q* D2 S8 _! r2 ^8 m8 M
  12.     return _scripts.get(name);
    0 [" ]& S2 b: |. ]. B% U
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.' y# K1 G( p. {  ?& \3 r+ Q/ a5 p9 `
1 z  [9 H2 n, o  |" Y/ k
Метод getQuest(int questId)/ \, X- p0 o( m

# k( p# D" j7 J9 i/ \
  1. /**/ t& Y2 }" I: o6 L
  2. * Получает квест по ID.
    * V3 g" b+ }4 W. b; Q1 \
  3. * @param questId ID квеста6 h# h& L/ |1 l9 E2 d$ W7 H3 Z
  4. * @return квест, если найден, {@code null} в противном случае
    9 d# R/ L/ ^$ e4 ?* Z
  5. */
    ) l( d5 Z1 N+ |6 F# {
  6. public Quest getQuest(int questId)* Z; P) p+ k$ Q
  7. {/ r) ?2 i- r& h4 [. F
  8.     for (Quest q : _quests.values())7 H+ X2 j5 y9 h0 l
  9.     {
    % v/ r9 j' ~, Y) P
  10.         if (q.getId() == questId)
    8 U4 Y( }/ n/ Q- C! d  b
  11.         {1 j7 P9 R9 v: h* u
  12.             return q;! m( D- \- m& U8 b# I
  13.         }
    ' e  _& {0 u7 B; X/ ?" d: y
  14.     }0 K) d5 @/ R# Z- f8 N* b
  15.     return null;7 N2 m& [$ ^* z* j( g
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    : {) f5 Z) F; A7 j3 I( Q0 D
: O# \0 c. L" t$ Y
Метод addQuest(Quest quest)' X9 w& a9 M6 p8 R/ y' m7 i2 Q
9 E0 T3 Z/ B1 P$ l5 r) q9 Z
  1. /**
    ; V  `. E4 r6 ]' ?" Y+ P8 q- m1 R
  2. * Добавляет новый квест." b& Y% J/ g0 m& |; H) k5 l
  3. * @param quest квест для добавления" a) N3 }2 O% N9 Y
  4. */* H, n0 l$ ^1 H, p) p8 T5 Y$ A
  5. public void addQuest(Quest quest)7 C. P# Q8 M9 Y. O# _
  6. {
    : P, j  l$ K! W. x- u/ Y
  7.     if (quest == null)
    1 v- ^. R8 G3 x* R" z
  8.     {
    6 K7 O, Y1 I" U: V% h5 k: G
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    $ n7 c- R# r% j6 t
  10.     }
    8 a0 E9 \2 H& W
  11.     5 k% }( _4 W- Z2 R+ l
  12.     final Quest old = _quests.put(quest.getName(), quest);2 R+ H/ w9 G& L; b5 v
  13.     if (old != null)& B6 F( y$ g1 |: j& t, e
  14.     {& j( l8 c4 F- W& a+ K
  15.         old.unload();
    0 {7 U& x3 t. f% }" J
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");: W  ^% Z- b! T# @- I  O
  17.     }+ p+ ~) n, A8 T, u  D' [! ]
  18.     ! ~# `7 R. W( T% I& Y  B' `# Y3 m- c
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    8 A+ k+ c# C- G9 F: Q
  20.     {) X5 L. w5 X# Q& {* S: ]& n' W
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();; l0 `4 I- n0 V5 a
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");& J* h+ Z% G, H; h$ N7 T0 n0 J
  23.     }% g) r1 D* b4 N9 T( u- H' v) Y3 K
  24. }$ w0 o+ y6 q- r- f4 K1 s, }. y0 x4 T
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
: o+ r# _# K* O3 H6 ~. ?. NЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
/ \$ v* b' O" B# J1 S( r
9 [* {- h8 \) Q3 s2 G! K' G9 ]
2 N4 V/ @* `) h* i5 G" E
; a9 t- ]* a  ]( x! V
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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