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

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

Автор: admin    Время: 2024-9-21 10:39
Название: Гайд по основным Java-файлам ядра сервер L2J_Mobius
Гайд по основным Java-файлам ядра сервер L2J_Mobius
- ~7 a3 _2 b/ ?  b" Y
- E. G2 q0 M9 \6 LРазбор файла QuestManager.java  b# P; X/ r* B3 S7 l

+ E; N  j" [+ |5 ^* EЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.# v) r  r( ~. ~0 s& n8 l) t7 m' P6 \) `
Основные элементы( v2 S, k" R9 J& W1 s5 |

4 a4 t7 T' a* O& b9 k! x1 Y' M; K: tQuestManager.java — управление квестами и скриптами.
! Y$ I6 o  q! r! y% @* Y% V& V# CПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
- k# i) f; n7 k4 z$ a  z# R' K1 ^: S6 `9 `+ |% T; A; f
/ T2 ], g) V; H3 O
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
0 ]" ]9 K. A: O" T: U1. Лицензионное соглашение
9 |7 }- h3 v9 j6 I/ Y4 M3 N  `
  1. /*3 _9 a* ]4 a: E2 b+ R) B4 `" c
  2. * Этот файл является частью проекта L2J Mobius.3 ^7 Y6 N+ ]6 b/ q; O
  3. * % v; U! W% k( ^7 \$ I
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять2 S; o* v+ F- j' N8 x
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    6 ]$ }' B& i" e% S6 v; r$ U% ~
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии." l8 S2 T/ M$ T! a. [
  7. * 5 ^0 c# s+ ]$ V% {0 J( Z
  8. * Эта программа распространяется в надежде, что она будет полезной,
    # Y7 ]1 I2 L$ m6 Q  Y2 q
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии
    + O, s% R; g; L
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.# O2 ^; r3 S7 ^- f
  11. * См. GNU General Public License для получения более подробной информации.
    9 v3 y* d& F4 u8 r8 u' ]
  12. *
    3 y! P0 X. M5 H' g
  13. * Вы должны были получить копию GNU General Public License
    " B/ c) i" H1 x1 J1 O
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.2 K, v; q6 E* [4 p- A' ~
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
; s' [' [/ B0 I& o/ R6 k2 w0 J7 O3 U, @3 V% B! E

( q/ g8 H' h; V/ T/ U* R( t; ]+ S. b6 \2. Импортируемые библиотеки
& _# b1 Y4 \, m$ \. ~4 Z/ Q1 o. U1 V
  1. package org.l2jmobius.gameserver.instancemanager;' e) t: T3 Z$ e: }, e( w! L+ v4 u: ?4 O
  2. $ M. {6 X+ Q! ]4 D* o$ \* k) O
  3. import java.util.Map;  o4 Q: w$ G, h/ Z/ ]
  4. import java.util.concurrent.ConcurrentHashMap;+ e* G0 g4 G6 }8 V- O& z
  5. import java.util.logging.Level;7 e* r8 F/ r' u8 E7 j8 C- z
  6. import java.util.logging.Logger;
    - k, x( z& a4 J1 ?% N: k
  7. * n0 ]; I0 a5 p/ E( u
  8. import org.l2jmobius.Config;
    ; q; n$ Z' e; ]  r# v$ r9 j
  9. import org.l2jmobius.commons.util.CommonUtil;" I" P. x! f& {/ A+ ~. e% K/ T5 Z
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    & A4 C4 _9 ]% Q. R- 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 — менеджер для работы с игровыми скриптами.
* Y- c6 D8 ?' C; g* Y' e9 w3 w2 s+ y$ T! s: F
3. Описание класса QuestManager4 {, z' a, M$ m4 g0 L
  1. /**
    3 a) q, u% B5 p7 l2 c) o. C1 t& N6 j, U
  2. * Менеджер квестов и скриптов.1 z: K% x5 X$ S6 e
  3. * Автор: Zoey76
    & [5 {: Q2 V  X
  4. */
    % N/ F' ?3 c) e3 n
  5. public class QuestManager
      `' j* I; `! I4 Y% g& c5 p2 e# w
  6. {4 T5 S4 O! ]( F  N1 T
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());
    - z( h- t) ~8 M. b3 G
  8.    
    - n& r0 u6 k) I# i3 ^) z! L6 A
  9.     /** Карта, содержащая все квесты. */4 t8 y5 h. b5 n: p9 C
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    % c4 i6 }6 b; w2 i
  11.     /** Карта, содержащая все скрипты. */- Q; e+ i- F- r1 h! u! i" N. F+ i; e+ C
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    + z: Q2 o8 `8 C9 i
  13.    
    # E8 V' Y+ c8 |5 l
  14.     protected QuestManager()
    ) I8 l! O6 t) ~4 @' [) G! H% ^* k
  15.     {
    ( s2 m- j6 x( s! _6 r4 _; _1 U
  16.     }
    1 q& G& L- I* I6 v
  17. }
Скопировать код
4. Методы2 ]% O6 W/ p2 R, J/ H
Метод reload(String questFolder)
- u; W! h$ Y3 p+ w
  1. public boolean reload(String questFolder)
    2 ?9 L2 n( E" [: q3 Q5 J8 e  l
  2. {
    ( j. X/ `* Y7 S8 F; R
  3.     final Quest q = getQuest(questFolder);
    : F" e, H7 Q& ]- _3 Y# m
  4.     if (q == null)
    + y( ^) g& i4 R& Q1 `$ x
  5.     {
    4 X! ~: i# t/ ^; T
  6.         return false;
    5 o) N8 N6 J! x" r) ]( r
  7.     }
    / c$ d& ?. _8 g: U% }6 Z
  8.     return q.reload();" C! U1 v2 U% p; y* o
  9. }
Скопировать код
3 l8 f, I1 F3 b

; g, T/ ~4 Q2 O" VМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
% m3 n0 F, Z8 _Метод reload(int questId)
4 p  C+ A: |5 s$ x) T# M, [) f: @; w& \. I5 M) [
  1. /**
    3 J0 D  Y# g" I3 J
  2. * Перезагружает квест по ID.
    ) R- B4 y5 _6 X2 A- K) c# J$ V+ o
  3. * @param questId ID квеста для перезагрузки
    % F- G! m+ v# R5 b
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    , v5 q1 i( w& T8 I6 Y
  5. */
    3 I; G6 A1 d& n% [/ @5 D+ u
  6. public boolean reload(int questId)4 _2 y- F! m) e, A- c2 a3 {
  7. {
    5 J0 w. R4 c! S: D; G" t
  8.     final Quest q = getQuest(questId);" p) o% b( j: C6 u9 ~- ~" ~5 ^4 F% p
  9.     if (q == null)1 E5 C; ]+ A  j) n3 w* b. k
  10.     {
    / _8 v2 Z2 i/ Z8 @: C+ f3 a
  11.         return false;
    & p, n% Q1 ~7 w$ u4 \; a: s
  12.     }
    ( k$ c8 Z, f4 o7 s+ v4 R8 e- |
  13.     return q.reload();0 l  h+ }% T6 t9 M
  14. }
Скопировать код

( d  ?0 f9 Z- \8 cМетод reloadAllScripts()
% D) \1 P7 F( P- A7 D$ v0 o& p; Z$ ?- z2 P
  1. /**7 k0 O0 @# @% V- j5 {
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.! w  `/ t8 Y" Z% h9 q+ B
  3. */
    2 K2 u) B1 _( u" [4 |4 ?; L5 B  ]$ P
  4. public void reloadAllScripts()/ {* j  l5 u" C& L
  5. {
    8 F5 U& v! N0 R; l& C5 ^% {
  6.     unloadAllScripts();: z; o; X0 E" E3 d( _2 n. Q
  7.    
    , p6 c! I% V: ]5 F5 U/ i+ i
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    % K' ~8 n, @8 E, W
  9.     try
    $ d) W4 L: o! ~
  10.     {
    9 ]3 ?, R8 u7 s5 W& t! ~0 c9 n
  11.         ScriptEngineManager.getInstance().executeScriptList();
    0 n& R) R! K0 C2 E- M
  12.     }; C% i. V9 s; }" U3 y' X
  13.     catch (Exception e)7 a7 b- k5 O" v7 T" z' G
  14.     {: V3 J3 F6 W  s' S7 ~- E) |
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);- h- Q% f( A6 w. m; g/ I
  16.     }# A# }5 u4 p8 i% L' m1 p
  17.    
    ! [7 A0 P9 A) S, \: k5 k( |/ `* `
  18.     getInstance().report();
    6 i+ N+ b+ `' u9 A& Q  ~* O1 }# e
  19. }
Скопировать код
Метод unloadAllScripts(). e$ u- \5 S" J( P) I) j

6 l! {: s/ S; ]$ I
  1. /*** {# K" l) j9 z
  2. * Выгружает все квесты и скрипты.
    ! i/ a0 A2 `- Q* a# I1 f/ e
  3. */
    / ^- J8 E2 z: Q% z
  4. public void unloadAllScripts()
    2 [5 A6 o5 D, M
  5. {) \4 b" x  g3 X- ~1 i* h  Z
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    8 a, [- P1 @+ S' P  Q6 {
  7.    
    3 b1 S. T3 N& R5 ]# z
  8.     // Выгрузка квестов.) o* ?/ \  Z5 i, @% j  Z5 R
  9.     for (Quest quest : _quests.values())+ g# J, Y$ h( X6 L1 q, ~
  10.     {
    ' g% T; ?4 W7 N9 {! q
  11.         if (quest != null)
    2 R# f6 Y- U7 M. _, ~+ w
  12.         {
    $ P0 g/ d5 p! L# E' |; ~; s+ @
  13.             quest.unload(false);% J& C5 L2 f9 }4 o9 {
  14.         }
    ( v, k8 n% |) q
  15.     }! E8 n6 H! u- K2 l: E9 {
  16.     _quests.clear();
      k: i# m5 M2 j3 N8 t
  17.     // Выгрузка скриптов.4 c0 ]& M! a6 Q. e( ?) N
  18.     for (Quest script : _scripts.values())# G% }3 L/ L) p  q3 z" z* ]0 P
  19.     {
    # |6 i( _2 S0 e0 Q9 x1 c: R9 [
  20.         if (script != null)
    / G, ^9 a* O0 I4 y( b
  21.         {$ g7 F* M2 [1 M8 s8 W1 D
  22.             script.unload(false);! }) L3 ]% a  H) R6 `. ^4 P$ k
  23.         }( j( e! V# f- @
  24.     }
    ; t1 L, B8 E2 E1 g- W+ K% i. c
  25.     _scripts.clear();! z; D+ ?' o1 [! z
  26. }
Скопировать код

) Z+ u$ a0 b2 \/ DМетод report()- N( ^3 o% B# ?, f3 @

, b4 o2 E0 s& v/ i0 X
  1. /**6 n2 ?4 c0 N% p4 s0 U
  2. * Логирует количество загруженных квестов и скриптов./ ^4 T8 f, y# h! |- i) `
  3. */9 x; K% \5 e# q+ q% J3 V5 N+ [
  4. public void report()
    . E- r) c0 `7 c0 g& e9 [
  5. {
    3 _0 w4 d7 d# v. [& |  S( [+ t! x
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");3 C4 M+ f9 u1 z8 R+ ?
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");$ Q( Q2 q& X% K5 u
  8. }
Скопировать код

  W* k- s/ C* Y8 [: kМетод getQuest(String name)
/ j  }7 `/ J2 j" _" K: J8 O$ b5 e9 E' Y
  1. /**9 _' M4 h5 R9 P. s
  2. * Получает квест по имени.- L8 A7 a- O# X% T
  3. * @param name имя квеста
    - G) B; Q* r( T+ X! _  M
  4. * @return квест
    ! A5 P# M6 D  g' p* J& Q/ c" w
  5. */
    8 D* S; s. Z, y) [& p2 b" T& Q
  6. public Quest getQuest(String name)) z* E( f7 \9 ]0 M
  7. {" m" l2 a  r* Y* N; @
  8.     if (_quests.containsKey(name))3 b7 b2 o$ @. L( [) F, _
  9.     {9 }' Y5 U  j4 M' Q
  10.         return _quests.get(name);. I) `& a; J) C( {6 `! D
  11.     }# P' l3 T# p! g
  12.     return _scripts.get(name);, N, L8 ~* `5 [* H. J# c9 i2 p- o, q& G
  13. }
Скопировать код

" d; _, n! g. `3 N: u3 VМетод getQuest(int questId)! r4 G, J3 J/ C1 Z! j
1 U1 R. r2 E8 M# H: R" i% G/ M
  1. /**
    ! M; J! K/ i3 G) G: ?. Q
  2. * Получает квест по ID.4 ~" d9 l! y- Z) R! D! S& k
  3. * @param questId ID квеста1 q3 K! m* H& P. P) Q* A
  4. * @return квест, если найден, {@code null} в противном случае
    $ z8 K1 B' i; O
  5. */0 V( x( M8 \) c$ O" U
  6. public Quest getQuest(int questId)
    % Z9 j( ]0 ?2 N; g1 y+ o' y
  7. {
    7 q/ `. p+ C/ i* |- W2 l/ w# \
  8.     for (Quest q : _quests.values())
    8 j3 L. U; l$ O: d* e/ e8 J2 S/ [
  9.     {  J* S- k2 P$ r' Y0 X' ~: `
  10.         if (q.getId() == questId)
    4 d/ w* ^' g6 q2 ]2 D6 T
  11.         {) R  n4 X! L& \" C7 |* l
  12.             return q;
    , ]5 ~4 W  n; j, W$ @  o
  13.         }
    % E* ~' o1 y; o$ p! @
  14.     }( e4 a) C1 W+ U7 ^" G
  15.     return null;
    1 B8 p2 C. Q2 t" W& b, ]! K: |+ Y
  16. }
Скопировать код

# [7 e% D. s* D# Z7 Q7 uМетод addQuest(Quest quest)( _$ ^6 A; l4 e! B) T

8 i' l% u, }% k2 ~: J' W) |
  1. /**
    % }9 |* P' ~1 e& Z, r( Z" t
  2. * Добавляет новый квест.5 C+ d" G7 c  P/ W
  3. * @param quest квест для добавления' j$ M: k1 O: {+ n, a
  4. */4 q( T5 t9 U# c1 I- g
  5. public void addQuest(Quest quest)
    7 M- k1 j4 U- t1 F( h% ^6 C
  6. {* B( a* E  B) S; Z/ U
  7.     if (quest == null)
    , K& [& n9 _6 v! T: A4 d, h
  8.     {
    * P9 l3 r! |6 R' h9 j
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    0 o( F8 G7 Z( G1 p% e
  10.     }# |3 U9 T/ Z9 W& h2 Y4 a/ g0 ]/ A
  11.     $ D6 ]: L% Z% E: H% ~; |) h
  12.     final Quest old = _quests.put(quest.getName(), quest);
    * r  Y; }' @1 A
  13.     if (old != null)
    1 n( J; q( G& a2 O( S8 \1 H- t& B- ?
  14.     {; u7 L5 u( W3 W; ^) R
  15.         old.unload();. @% I" }0 A6 ?* r" I0 Q
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    : x$ M' |2 b0 T7 j; m# H6 F# g
  17.     }2 y# N4 B. ?* F) K3 h
  18.    
    0 X& P' [7 J4 d; g! d* _
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS), Y/ q' F+ u. z( S1 X
  20.     {1 N, y& P; w4 w8 C
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();$ s/ I" H7 Y, t* D/ v
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    " X& x; X. }5 l7 W( {
  23.     }
    2 M* y. q; B3 t
  24. }
    3 t; M8 {/ x$ i4 c+ H6 d
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
, q! [' t# U" c: @' AЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
9 X/ F& E$ [9 a% e) X: M. F' g
) C0 w. g1 u) g% o' b
8 Y$ {& G; _9 p, d! V' P( I* N4 Q
3 D# V: K. L( E- F




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