artace.ru - творческий сектор

Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius [Версия для печати]

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
& K( }- x# w3 z: b6 n& d6 R: s6 H  p) j" J/ I- X% N! Q2 J3 k& M1 n) N
Разбор файла QuestManager.java
2 R' L  b* ?! c3 L7 ~/ o6 u6 f: T, T
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
8 t7 _, Q) |$ kОсновные элементы
+ t' G( u; I& z3 B) z3 r/ ^4 z$ v1 B4 G
QuestManager.java — управление квестами и скриптами.
# C9 a- _: {: ?4 y; F8 VПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ I1 E4 w8 B5 `

: b) n1 D0 ^( w. F) J, l
% K4 R# C0 ~8 ~( K
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.9 N! K- g# s" E# h7 _
1. Лицензионное соглашение
  {- ?+ v8 h+ K2 J, ~, C6 T- b
  1. /*
    # r7 L" k5 o% g: S) t6 _4 ^; ?' M
  2. * Этот файл является частью проекта L2J Mobius.
    , }# P5 D% f) U: E6 \; c
  3. *
    0 k) D+ I$ e" H1 D: \- N+ L
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    4 `0 v8 X/ D$ y+ p& a' z
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    6 a  a( E6 W" N6 a) `
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.% w5 O8 I( B2 S/ h7 z1 |
  7. *
    6 w8 ^$ C: i9 v( i5 x- [5 L; o
  8. * Эта программа распространяется в надежде, что она будет полезной,' A8 N7 [$ \9 S/ f5 G, z8 U0 |
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии! i2 d  ?. e8 r
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
      y* C1 Y5 W# L& T" t
  11. * См. GNU General Public License для получения более подробной информации.
    # s+ M9 e; z. e/ }% N+ s
  12. *
    * r. U2 b1 Q# M: o4 u7 O
  13. * Вы должны были получить копию GNU General Public License& |: a' g  V, g& @
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    8 s! [7 V) w: R5 ^: G1 d7 \
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.! X$ |: D1 |7 H/ J7 J
' r* O" ?7 V$ K
0 S; D# Y/ W3 ?. j" f1 f+ L2 a
2. Импортируемые библиотеки% c* [: p0 U# J" v

8 }8 w  K2 g. c, j* o* Q( Z% W
  1. package org.l2jmobius.gameserver.instancemanager;! }" h3 a9 V# Q2 O

  2. 7 m) u; ]9 ?% s- K
  3. import java.util.Map;" g7 U4 h* X. |2 u3 ^/ A
  4. import java.util.concurrent.ConcurrentHashMap;2 j* F' ~  A. O: Y" M$ G
  5. import java.util.logging.Level;& [$ }+ \9 h! h
  6. import java.util.logging.Logger;9 S- L, A4 w% c

  7. - v. b. Z. e3 L8 E# H4 i
  8. import org.l2jmobius.Config;
    + |1 E& G% r( F( f6 E% D# }
  9. import org.l2jmobius.commons.util.CommonUtil;/ q( i: a* ]- f
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    7 I2 N% E1 z7 i1 C; Z4 E0 W& \; D- a
  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 — менеджер для работы с игровыми скриптами.6 R* M4 s% i6 u! t, S  ~" p, y

( \1 g5 n8 Q+ D7 y. E3. Описание класса QuestManager
( U+ b: V4 k2 `1 M7 Q' v% T
  1. /**- m1 K5 \' S6 @: k
  2. * Менеджер квестов и скриптов.9 Y2 O: s: |5 t- c+ @
  3. * Автор: Zoey76
    % A. Z6 ?3 a- c% j3 p
  4. */
    . `! ^* z, L, C
  5. public class QuestManager* s% p8 ]% P- {6 D1 G: x, _$ u$ v! B
  6. {7 X+ R( D: D. y5 y
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    - i4 Z) d$ {4 o0 g/ b8 m) u2 V$ ^
  8.     5 E5 s7 X6 a2 \# \0 b
  9.     /** Карта, содержащая все квесты. */
    5 R* H, E6 ]$ e: J
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();; }/ d( D8 H& [
  11.     /** Карта, содержащая все скрипты. */) T8 L5 Q) [5 }
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    9 G( i. ?; s$ H3 Z
  13.    
    3 r- a4 q/ t2 ?0 m3 [1 e/ R, T
  14.     protected QuestManager()
    8 }* t9 u( u2 T! s3 r2 s0 H
  15.     {
    : }1 a+ m) o7 q, d
  16.     }. g% Y6 b: B+ t% w6 G% t
  17. }
Скопировать код
4. Методы
. P% g2 v- P- P% T5 K9 w- _Метод reload(String questFolder)
& {6 G; l) @) \5 }# y7 }  J
  1. public boolean reload(String questFolder), F+ X7 N" ^: R! g
  2. {, W+ e4 C4 D4 ]9 b: y
  3.     final Quest q = getQuest(questFolder);
    ( }2 ~- d: W9 U
  4.     if (q == null)6 X% ^) \% m1 |/ j% H4 f
  5.     {
    9 S: G3 @& W- \
  6.         return false;
    " f; M/ U7 }7 n! e, I3 m" L
  7.     }
    % U' l5 J- G9 u9 \- r* B3 y
  8.     return q.reload();2 \- ^, D  V. ^+ \
  9. }
Скопировать код

& i1 ^8 p& j( _+ Q3 B, q+ o, N# E& l6 Q
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.7 I3 l: v& o% U% d1 s$ E
Метод reload(int questId)5 K1 E# }4 W0 w4 J, Q
- I. N+ g4 T4 X- r9 `3 E
  1. /**, ^5 E8 `0 e  Y* f" V( Y/ m1 f* m
  2. * Перезагружает квест по ID.
    # M! Q7 R7 {; o8 e. v; `
  3. * @param questId ID квеста для перезагрузки% f7 u3 p3 S' l
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    ) u$ S+ e9 a' _$ q4 H5 x
  5. */5 A/ z5 J$ Q- g. M9 y; \' k
  6. public boolean reload(int questId)
    # N8 j2 ~# }) m/ i) y9 Q" I1 n" c
  7. {
    ) m- v% x' r0 X8 g; h( X. ~' F' p
  8.     final Quest q = getQuest(questId);' H0 f8 ?1 P# V2 Q* I2 K2 O
  9.     if (q == null)
    % |/ K! \( U3 ^3 y, y0 a+ V3 ~
  10.     {" G" `( j6 R- n! s/ V3 x
  11.         return false;6 G" M; d' E) r
  12.     }3 m8 ^: D  ~- Z2 S3 C* D
  13.     return q.reload();
    5 F$ v$ o  ^  ^$ P; U
  14. }
Скопировать код
) B" [9 ?- V3 \" X1 y. v! X( x" G& x1 {
Метод reloadAllScripts()
0 q/ i0 W4 A% C/ `% h. j) }/ c9 m: p* W
  1. /**
    9 v+ B" W/ I: W* s$ H- E3 v
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    7 ]( ^1 _* n' K  \1 g
  3. */
    " p7 }2 E: ^( k2 d; B) ]
  4. public void reloadAllScripts()
    $ I& B5 a% U" a& ^6 P
  5. {. Q( E7 ?2 Z. M
  6.     unloadAllScripts();! d+ C: t( _2 {( D  }; c+ ?1 j  _
  7.     ; o+ b+ N1 Y7 G  D
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    , g  X0 e4 @0 M) c1 ^; j
  9.     try  }8 u6 y% u  M3 _
  10.     {! z) a9 C' q' G  m: E7 p
  11.         ScriptEngineManager.getInstance().executeScriptList();& b/ z+ d6 v) z
  12.     }
    5 N5 }7 X+ d! w+ r/ d
  13.     catch (Exception e)2 M* m8 N2 t- J9 C# Z7 J7 K
  14.     {5 V% B/ N5 t  _1 n: u% e7 k) M! i
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 E0 |) ^0 m' f
  16.     }8 k) I3 X7 I9 P
  17.     . S$ Y* d5 u' G  C5 G" x2 k
  18.     getInstance().report();% H5 Z$ |2 X4 O0 [
  19. }
Скопировать код
Метод unloadAllScripts()
- V( _/ h% z7 j) i8 l8 u$ v9 {2 u/ D* o$ h- M
  1. /**; g+ S0 T9 v) e
  2. * Выгружает все квесты и скрипты.
    & M# X* c4 f1 X+ E3 {
  3. */
      L0 y) T' C! M5 m; w9 D+ ^
  4. public void unloadAllScripts()
    & ~4 G* k' o8 M$ [( B
  5. {: B. @: w+ P* c
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    0 a4 ~6 b; W0 {$ t- I' [/ d  M) x
  7.    
    ' e$ b( A/ x, W0 j5 W
  8.     // Выгрузка квестов.
    4 p9 x/ G8 f' y# d! K/ f" ?5 T/ }- A
  9.     for (Quest quest : _quests.values())$ v  s+ Z* S! \- ~7 l5 K
  10.     {
    5 w7 a( C* m) d# b6 _! x1 Y  M
  11.         if (quest != null)& J, d! t/ s1 h2 Z, T3 J
  12.         {
    ' s) s, R. d1 f5 I0 d2 r0 V
  13.             quest.unload(false);
    4 ~" r, U, O$ |- E+ o
  14.         }
    3 V  I) O7 O/ }6 l6 x
  15.     }( a) O$ v" ?% M
  16.     _quests.clear();
    2 z( G* _5 m; U! }* ^9 T7 D$ A0 u
  17.     // Выгрузка скриптов.: ~9 V6 r* j- A' v+ i
  18.     for (Quest script : _scripts.values())  V5 f" w3 m0 v
  19.     {
    $ N  n, k# M: D& m& M* B+ {
  20.         if (script != null), a  E8 {5 e9 D8 s  w/ J
  21.         {  W) n  t; Z, m% }& Q
  22.             script.unload(false);8 M# x! V5 s1 z
  23.         }
    % i6 D  C) R" _+ D
  24.     }" @+ g2 j' m- t! O6 w
  25.     _scripts.clear();& t3 Y$ D! R7 z8 c- q& x
  26. }
Скопировать код

8 b) S* C/ i5 K, N" q* n9 Q5 FМетод report()
: w& Y4 m' Y1 W) i7 U) x' B+ l7 k$ q1 D( Y' c2 C  p; i
  1. /**! L3 m, m  I! Q
  2. * Логирует количество загруженных квестов и скриптов.
    3 a  L; V7 H  E  L
  3. */$ t! b+ P6 H) p7 O0 ~
  4. public void report()' u+ g* O3 f6 m, F
  5. {
    7 c" F( ]8 |. U) Z7 L! S+ ]
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
      x1 e' b2 s$ W, y: B# ^
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    5 a- `* I% S) D- f* m5 ~
  8. }
Скопировать код
1 x' y% Y  s& B6 p
Метод getQuest(String name)
% h) P- F2 e& q0 I: L1 Q3 Q
2 Q! o" s' N$ w- [! C9 l7 N
  1. /**4 f: b9 ]% |! U$ L- Z: z) X
  2. * Получает квест по имени.
    3 W2 T! B' H& e" `6 ^4 Z, [- P
  3. * @param name имя квеста. y) D. U$ @+ I- K6 [" U& s
  4. * @return квест3 l5 b' p" _4 Q, n; s1 A
  5. */
    + B& K" `+ ]9 q
  6. public Quest getQuest(String name)
    7 o1 R- C0 D1 U6 o2 a2 }
  7. {! n; k* [2 C* b0 t- a
  8.     if (_quests.containsKey(name))8 _4 J, m- F; _. L0 Y3 H6 c' g
  9.     {! ?% l$ Q6 s+ I$ @
  10.         return _quests.get(name);
    " ?1 F  [0 S6 t: |7 I: Y
  11.     }
    / H6 X+ f( B! {& I) b* ?' G# _
  12.     return _scripts.get(name);
    0 M5 g4 U* Y- H  W& z* r
  13. }
Скопировать код

; s9 W/ y6 N* W# W) i2 C9 a! TМетод getQuest(int questId)
" W: h6 r  ?# P( j+ x0 y6 F
' h$ n8 C+ Q5 p7 B1 Y( Q
  1. /**8 q5 p+ M- {& m! w$ k, j  a1 E
  2. * Получает квест по ID.
    / H( r' G' r% d# Q+ s
  3. * @param questId ID квеста* d$ f9 h! L+ [9 b$ n: T* j
  4. * @return квест, если найден, {@code null} в противном случае% K- ^! S0 O- a4 I
  5. */. l5 A+ E1 y5 }9 k0 \* v
  6. public Quest getQuest(int questId)
      P; {& V  l8 H0 w- M6 d' s1 `# J+ x
  7. {4 {7 j8 q' X* }4 Q
  8.     for (Quest q : _quests.values())1 p. n; ~2 a( Q
  9.     {/ M) d7 N9 W# G! ~+ T1 V# [
  10.         if (q.getId() == questId)& n; D( L7 L! m! m0 n: `4 W
  11.         {
    ' f  o: P$ M, y# G: J' {: n
  12.             return q;& I7 k0 x4 b% m& J
  13.         }+ R# Q3 Z7 a2 {* Y! ~1 q' p9 ]6 P
  14.     }
    : v8 ~% t$ j. E7 t5 B/ E: H: H& h
  15.     return null;
    5 _* ^" H1 P( b' j( m/ Z
  16. }
Скопировать код

0 S. O  }( i9 N( W! h! G; z) GМетод addQuest(Quest quest)! ?. o8 A" A; _  F9 @. ^
0 I0 C0 P0 o- m- ^( [
  1. /**( A5 S! y( D$ Z6 f. G7 {5 \& L/ R
  2. * Добавляет новый квест./ B: U  }3 G  U7 q4 e0 u7 D% ]0 T
  3. * @param quest квест для добавления
      r/ H5 K2 K; x2 i
  4. */2 @: z8 \9 z& N: C) Q
  5. public void addQuest(Quest quest)! M9 @, |0 Y& I5 {
  6. {; I& i7 x! j" ~+ _- Y$ I$ C* B
  7.     if (quest == null)
    0 ]2 `$ }2 A2 l# J! n9 Y
  8.     {
    ( |4 ]/ g: o- ~1 E4 n7 X$ [
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    5 f9 W6 W* x9 g
  10.     }5 z5 N* d* |$ K/ T
  11.    
    5 s" u3 T% y3 j
  12.     final Quest old = _quests.put(quest.getName(), quest);
      v. S  g; M* F* B. H$ X$ ?) B
  13.     if (old != null)2 K+ g5 k& L8 J/ i
  14.     {$ Q; F: |2 o' j3 d" [0 ]$ y( k
  15.         old.unload();6 Z% }) F# v5 T4 I
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    / x9 q' i: P2 H0 U( G% T
  17.     }9 A/ r# X3 \* M9 ?. J: k# {) D
  18.    
    9 H6 Z; }" D$ y
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    % M" Z+ }" e( t5 F2 n' g
  20.     {. ^& b! `' O1 |9 ?( |: R. o% K3 j
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();* u, u; b0 h/ c4 o3 Z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    " ]' w: s1 O5 `+ e9 E
  23.     }
      e$ v  ^; j! g
  24. }- u6 n! i6 {5 v3 m# ^3 v; ^7 n
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.& e" ?0 Y- X1 h8 L  f
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.0 z5 C% C) V- m1 v. ]: F

. Z' O" N; _2 q: N0 y% g' b. m
. t& ]: F# t7 l7 d8 q3 S1 Q
" r7 D8 G2 Z5 ~0 _1 ~3 f4 a: E




Добро пожаловать artace.ru - творческий сектор (https://artace.ru/) Powered by Discuz! X3.5