Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius/ Q/ p% k% I8 Q, a% i. @) s, V

  j2 w# L. J. r' nРазбор файла QuestManager.java+ W4 Y  ?! _" I
; V9 B. U/ ?! \
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов., Z. `* s" X$ l; V. I
Основные элементы
* a* N! E6 Y, p! M! `; j2 z
  • Лицензия" b% Y* G6 u( g- A& p
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии.
      3 B2 i; G' G* Q4 Y
  • Импорты- {% |( X5 l& G
* l6 b4 j& n! Z7 d* @, E
QuestManager.java — управление квестами и скриптами.
( a9 Y4 n* D. X& ^9 a0 X; RПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\
; P" r  e2 {' D7 z+ m; k% K7 u/ N0 m1 Z5 G0 p) z# d9 j9 r/ h: D
' `( ~8 E' b2 w' ~+ C; O, W
Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
- A. P2 N0 k9 Y; q+ m+ ~& `2 a1. Лицензионное соглашение: ~1 K! y  D: F( ^
  1. /*
    & x6 ?' N" G" Z0 Y: C# z9 C/ p
  2. * Этот файл является частью проекта L2J Mobius.- z6 O& b. B$ m: T8 |7 O
  3. *
    + t" v  H) ?  z* `
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять9 O4 `, l7 y+ x8 q; H
  5. * её в соответствии с условиями GNU General Public License, опубликованной1 |' @4 Q  }6 ]4 p  j8 X  h% x
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.- c+ K9 }8 J3 M" y6 y9 m
  7. *
    ( Q2 X8 h$ T* X) R* ~8 Y1 i9 M
  8. * Эта программа распространяется в надежде, что она будет полезной,: N9 x9 w  C5 t
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии! H2 s$ A  F* m2 G
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    3 v& ^* Q% o3 V; m2 X+ ~9 l
  11. * См. GNU General Public License для получения более подробной информации.1 h8 F: H3 Z+ _+ ^6 e
  12. * % W  p6 _: |7 |+ _; o3 z, f/ _
  13. * Вы должны были получить копию GNU General Public License
    " A. N, D% O5 K9 S' R
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.$ V! _7 w/ Z6 b
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.# C  g" @0 U# Y0 o! X
! m- ]0 o( T4 e" z; m/ m
2 h$ i! u. O( `' C" `
2. Импортируемые библиотеки# [$ x- u. e/ T$ S  ~# ~

$ }! O6 u/ g& G
  1. package org.l2jmobius.gameserver.instancemanager;4 V# m, l3 W. J8 q- M
  2. 1 g# n" d* i$ F( f) u1 A
  3. import java.util.Map;+ s' ^' N0 d. {; {( p+ N
  4. import java.util.concurrent.ConcurrentHashMap;
    & T! ~( o% d0 b4 |, U
  5. import java.util.logging.Level;& u! s3 `0 n' G7 l& \# i% h8 h% k' m
  6. import java.util.logging.Logger;
      r9 c4 G7 ~- [, f6 K+ O* H% v

  7. , Q0 M5 H8 F& S( s# A
  8. import org.l2jmobius.Config;
    6 d4 q- t* V" q
  9. import org.l2jmobius.commons.util.CommonUtil;  K8 Q4 ~7 B- [% \( r5 V4 x
  10. import org.l2jmobius.gameserver.model.quest.Quest;' j( P" B* _/ U# t# Z8 ?+ p  E
  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 ~1 O$ q7 F7 u3 ?% Q: b  Q( r- T1 \5 Y1 @: b9 M; ?
3. Описание класса QuestManager
: C4 j! T9 G4 q% ]* S) }( t
  1. /**
    # u+ S# C6 B+ k5 E/ Q3 o  j$ D
  2. * Менеджер квестов и скриптов.
    ( t- X- _4 H8 d0 V3 K
  3. * Автор: Zoey76
      [: |/ \9 K: B
  4. */
    % Y) ^" h: g5 [* M$ k$ \$ @
  5. public class QuestManager
    ; b5 r/ Q/ o" g
  6. {
    : F( U2 `! J: h: A' _( D* R' d9 r. v
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 l, g, g2 w5 E! X+ g. D
  8.    
    * t& _( r6 l0 Z
  9.     /** Карта, содержащая все квесты. */' W; p- g/ o- a2 O; K! q, Z- }; i
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();: j+ Q9 ?3 \1 `/ |% R7 X* u
  11.     /** Карта, содержащая все скрипты. */
    ) s, W2 z( z# o$ q( F( h, z
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();
    7 V- p5 `; ~! _2 J& [- V& H
  13.     1 v1 L: I$ b+ {- W! T2 I
  14.     protected QuestManager()% A; [: G. r$ C. C+ D+ C& Z2 X. d% o
  15.     {, \+ L' D9 r: g7 G3 s
  16.     }
    ; T$ T6 I" m5 i2 ]# B
  17. }
Скопировать код
4. Методы8 o% o0 x+ I- l% C+ D
Метод reload(String questFolder)
- \( j* Y  `0 ^" U, p  }
  1. public boolean reload(String questFolder)
    5 D0 X' D: f+ a7 g2 h
  2. {1 Z" \0 ?7 ?! p3 F
  3.     final Quest q = getQuest(questFolder);+ L# o% X6 s$ N- G) U
  4.     if (q == null)% B6 U3 p0 M; B% d" k* c; O$ b
  5.     {  o; F9 u5 A* V
  6.         return false;7 w# a7 \# `3 C! E
  7.     }  s( ^* f+ A1 A" g* I; z& A
  8.     return q.reload();
    % r  A/ N7 I  y" Y8 d5 m; A
  9. }
Скопировать код
8 t, C" x+ d# V8 r1 a, x

3 o  T1 T& |- i) e. J& A' qМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.  [# M2 L) i! n
Метод reload(int questId)
- h/ z% L& s7 n6 I3 ~- n) R0 o
' y8 u+ e1 L8 X$ C  B
  1. /**
    . b6 N; W5 J: E1 E
  2. * Перезагружает квест по ID.3 B4 M' y/ |) ?0 Z7 {' C: S% Y
  3. * @param questId ID квеста для перезагрузки
    ! Q8 m( ~5 k" y1 A
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае
    " ^/ i: C4 ?' ~' A
  5. */3 K* t- b8 f. _: Z
  6. public boolean reload(int questId)
    * l& [5 s, K% `. e" D
  7. {8 t- M3 B4 B$ ~% M" O% g6 v  B
  8.     final Quest q = getQuest(questId);4 u; f- ^! l% E( e6 \
  9.     if (q == null)
    % j$ j3 S& h+ n+ `4 t( A
  10.     {
    ' u! b, q% V" z% ]
  11.         return false;
    ' x1 @8 K; [/ G' m# y& f0 P
  12.     }1 Z  ~; y4 Z" e1 ?& o" h1 F1 [/ B9 U5 |
  13.     return q.reload();& l0 L& G: [$ E" R+ d
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.. p. A" l; J7 q+ W7 _; _( _- t! F, d
( Y* _4 w+ r6 K1 l# u& b
Метод reloadAllScripts()
; ~9 c& K% c3 v* L5 g) T
5 n/ a/ r7 k/ G( S, E. _
  1. /**
    8 E7 N% W* q  C5 Y
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.9 X- h# X( t$ F1 I5 [" H0 F. \
  3. */
    # A+ O! ^+ E3 u  N3 f7 h
  4. public void reloadAllScripts()
    6 @% A) L' Q- R% w( a
  5. {1 \9 W* g6 b$ }: B7 f& o- N
  6.     unloadAllScripts();2 M4 R7 L, X( \( z. m5 W
  7.     - N/ f! E3 |' g7 D3 H9 t! b2 b9 h
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    # i7 J& E; L( \4 Z* I  K7 d
  9.     try
      p& Z4 |3 ~9 L
  10.     {9 J$ o0 a4 j' y: Q' C
  11.         ScriptEngineManager.getInstance().executeScriptList();# X! m" H: e# g
  12.     }
    , S' B1 \9 C6 a+ o
  13.     catch (Exception e)# l- R' X! O- {
  14.     {
    7 ?( I! I! t9 g, r& H
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);
    2 U8 J4 I1 [* q8 E6 R
  16.     }/ [8 j. A: Z7 L' X
  17.    
    ; Y; N1 D2 z1 Z6 n; m4 t
  18.     getInstance().report();# l' B4 J+ W- {' @6 `1 f2 A
  19. }
Скопировать код
Метод unloadAllScripts()% e$ b2 d, s( C# o6 e' e, z- G

0 h$ w' Z& W0 l. J. G
  1. /**
    0 f7 _" n7 q  [! i# v( S
  2. * Выгружает все квесты и скрипты.
    6 h9 @6 w; J8 f! x: A2 _
  3. */; v$ g' |5 ?) U$ o$ X1 U" j) ~
  4. public void unloadAllScripts()/ `5 ]# C' F7 w: E
  5. {0 a( c6 B: j" I) I, F% L, w0 T' K
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");  T; R* a  O! e! R, G0 h$ J' j- B! M
  7.    
    0 J2 N  C6 K7 q
  8.     // Выгрузка квестов.. H% }1 c6 D2 l) m0 E! a
  9.     for (Quest quest : _quests.values())
    ; N4 p) k5 u- g" v$ l0 I8 _0 L
  10.     {
    ) G. Q( A- W6 k; K# n2 t& V' U
  11.         if (quest != null)
    9 O) S' g& I5 R
  12.         {6 P6 a* e, s. z) J! B/ C+ _
  13.             quest.unload(false);
    ' d( F+ F. S+ E' a7 ]
  14.         }# ~! T/ M2 }, h( k/ \
  15.     }+ S' a- w  y6 l4 M
  16.     _quests.clear();
    : C) U5 b- _: a
  17.     // Выгрузка скриптов.
    * Y( V  a- ~" k3 [  Y
  18.     for (Quest script : _scripts.values())% j( ^. m+ d4 s+ a. i) J! ~( d
  19.     {
      Z! G4 T+ H3 b  d
  20.         if (script != null), n2 X% r3 I, U6 V% }) y5 R
  21.         {! g. v' k+ T) P: h
  22.             script.unload(false);1 s. h4 W7 o; u
  23.         }0 L+ P* U- F: S4 A8 q% E7 a
  24.     }
    / P4 A; ^+ f0 ^  S
  25.     _scripts.clear();3 b$ ]1 G- s% N+ g
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.$ j2 s$ [0 I7 w1 M& L, M+ r0 e, a

3 }3 n( n! P+ W1 w" K% i1 UМетод report()
$ e4 ?  t. ^1 d$ _$ }
/ t9 V4 _0 n  d" r. F) ^) e
  1. /**
    ; W2 x9 Y) m/ l) E
  2. * Логирует количество загруженных квестов и скриптов.
    * `. W! }9 g' H  U
  3. */
      q: N# X. L; `  E
  4. public void report(), l" }) O, F5 |$ g2 M2 H
  5. {5 k, B& t& w4 v- ?
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    " ^8 O' v2 Z0 M0 A
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    # N, {- S9 r) i- w  [  N3 X
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    6 D; r; G) W4 Z- _2 h2 a( I
) c' s& }" a3 t  M8 P, t' M* f
Метод getQuest(String name)
& i. d% ^+ u! ^5 }5 ]
1 i$ h* X2 m. k3 A
  1. /**# `" x5 [+ L3 E! M
  2. * Получает квест по имени.8 e6 O: {8 p/ C! k
  3. * @param name имя квеста- G0 W: K8 Y+ F  W' V
  4. * @return квест, }7 ^5 ^% J" @, e( e# c+ g
  5. */. i# R; t2 E, o  B6 x3 \( M( O
  6. public Quest getQuest(String name)% \) @/ V# i  t+ k6 ^: }8 _# r
  7. {
    4 _% M4 @/ q, Z
  8.     if (_quests.containsKey(name))
    ! U  X2 p. {# \% D
  9.     {
      z% C5 Z1 r6 u+ W0 l; g
  10.         return _quests.get(name);" @; V) U* q! N
  11.     }
    " c7 V( ^$ I& s: D# @1 R" ?
  12.     return _scripts.get(name);
    & a6 ]0 _' p+ X- W& ]
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.
    3 l: N- B. t. b5 I" K: J2 g  l0 {; A
: h% k# d! r# R9 Q8 l8 V% g
Метод getQuest(int questId)/ ?4 p( C- @8 s' o# F9 y' `

& ~1 L7 M( X( W; R3 K0 `' O+ |8 [
  1. /**& {3 O; I/ K7 l+ D
  2. * Получает квест по ID.
    ( g! G  C: q% n6 z/ o5 m
  3. * @param questId ID квеста
    " [" T; q# T6 \# C8 T' }- Y1 `
  4. * @return квест, если найден, {@code null} в противном случае) i5 o. i$ v8 N
  5. */
      N; ?' L1 ~( y/ h
  6. public Quest getQuest(int questId)
    $ b$ Z# V( f( @/ G* K
  7. {8 t0 ]) v2 M2 o. W
  8.     for (Quest q : _quests.values())5 ?5 v. G5 E2 t) f! Q
  9.     {, X  B; u& g4 d+ H1 d; r
  10.         if (q.getId() == questId)/ L: Y' j: d  O6 K+ b
  11.         {
    * B' l9 N! e6 V1 [
  12.             return q;! y" P& S$ j* ^! h
  13.         }+ M1 k1 B0 L' b
  14.     }* }" ~4 k7 @5 B2 s8 c& R4 R
  15.     return null;
    ! F- h! q7 K! I
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    / N2 q; ?: m/ |

- ~) `. x) y5 t/ zМетод addQuest(Quest quest)- n' n) P( y8 t
) D* e) K2 s* h$ b) B* P
  1. /**( u, U/ U& |0 i) `
  2. * Добавляет новый квест.
    4 O( X, M4 M. x
  3. * @param quest квест для добавления, y6 W$ @7 @* q0 X: e
  4. */  @4 U: t6 C- }, ]$ m7 |
  5. public void addQuest(Quest quest)
    : p* R& g+ \0 V6 ?+ t
  6. {, T% H% q4 E2 q: K  \  i
  7.     if (quest == null)
    ! A' S3 [. R+ @3 V* |$ D
  8.     {* T" e" i, r: W1 F( H
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");
    " X  A$ j  O1 V" A8 Y
  10.     }
    1 l+ f! e& t0 m5 v# y
  11.     + H9 ^+ Y' {* h/ R9 ~% l
  12.     final Quest old = _quests.put(quest.getName(), quest);
    * X2 j/ N; r' l
  13.     if (old != null)  H/ ]* T: m4 v, z- o
  14.     {# H% N+ ^9 {) L
  15.         old.unload();, J8 d0 P  j) I0 ~6 r
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");
    5 i7 k) v8 }$ T( T, ]6 D( S
  17.     }" L, V& P" Z9 `* s* |" u
  18.    
    7 \7 l: V6 K) ?7 R/ N
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
      s: m) L! v9 Y5 C: v4 d6 l, X
  20.     {+ p1 q) i( A4 e  O* \  D
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();2 K# g3 y0 h; U: y" {$ X7 |3 f
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");
    6 [1 T1 L& _; L3 @5 c3 W- X
  23.     }
    " d, C3 o9 w) N2 H6 [9 W* T1 g
  24. }% G( n, G) g5 ]
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.
' A( e1 l+ u4 M" k6 \ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
4 Q; i- f/ O7 z
' q" u( j6 m3 p; P( X& {. Q9 T% F5 R0 g, e6 C# p- L
1 B/ X' O; Q' r) o
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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