Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
* ~' j, w) |* U3 ]5 @, c) Z; H3 y; U% T/ ^4 [
Разбор файла QuestManager.java- U% u3 e% ~$ g+ @0 P7 D) R( s- d/ B
. D& _  g1 J3 z9 f* }, |# `
Этот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.6 F0 o! X* }: w9 e6 A1 U
Основные элементы
  H% {6 v+ s6 H: U/ `3 P
  • Лицензия2 E; S# l$ h( k# B; a7 b: a
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии." A* S, O  t( h' V/ b" l
  • Импорты! l# l5 G9 `" ]# d

+ _8 a& K9 z4 v7 aQuestManager.java — управление квестами и скриптами.
- s* C5 X. m. H- M2 `Путь: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\$ n7 R. Z4 s+ b% ~+ m* S

3 z% }8 G/ y& l2 g

; \% q- u9 o+ L1 Q  l( o5 A/ C4 HДавай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.( G. k3 t% j! K- ~  ~
1. Лицензионное соглашение% Z' b5 k; f2 p! P- y( r
  1. /*
    2 Z# T: P8 ~# k" I- o0 n# P. m
  2. * Этот файл является частью проекта L2J Mobius.: M/ y. ?1 d  Y* K
  3. * $ x+ w- L9 f' M) {- k. C
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    % ?( z2 i, `8 q
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ! K/ M8 u2 E* r% ]/ ^1 e2 K! {
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
      p( h! x) K/ O8 n5 F, g. |
  7. *   p, ]9 r0 a+ h6 s$ A0 S5 M' v" X
  8. * Эта программа распространяется в надежде, что она будет полезной,. p' [+ G1 L/ G% G0 y2 e* i
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии+ \# Y0 C1 l+ ^8 n# _/ D
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    % I) W0 c: W9 J4 X# o" m
  11. * См. GNU General Public License для получения более подробной информации.$ T( P3 \7 b* B" m
  12. *
    % y, `8 o+ R6 z7 w. m/ h
  13. * Вы должны были получить копию GNU General Public License
    3 n+ f6 k; S* z7 G# U, z( i4 S
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    * y$ e) L% R) M
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.
! l9 f( c. }2 p% p5 C" j1 Y# c, i; Y6 ~3 {
9 n+ o+ R+ X9 C/ }9 k" c
2. Импортируемые библиотеки# r- r% m+ N- ]$ G/ H

" M6 N( E# k+ K9 }
  1. package org.l2jmobius.gameserver.instancemanager;
    3 H: ~" q$ b! a0 k
  2. % E, y7 U; `% g
  3. import java.util.Map;
    ; u7 l, l3 b5 E$ ]- v* O: v
  4. import java.util.concurrent.ConcurrentHashMap;
    ' {% ^- \) `) `# |
  5. import java.util.logging.Level;
      h( o2 o: y( w7 {
  6. import java.util.logging.Logger;
      `  [( `, S. S

  7. * K* |' ?5 f; l5 F, X0 z
  8. import org.l2jmobius.Config;
    ; R- y" m2 J- ~
  9. import org.l2jmobius.commons.util.CommonUtil;
    ) B) D" Z$ Q+ |- ~* D
  10. import org.l2jmobius.gameserver.model.quest.Quest;
    8 O8 t( h: i7 H& F& m" 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 }9 e2 l. D/ o

. m6 X; b- s$ j. ?- p3. Описание класса QuestManager* c8 H5 _5 z) I1 U2 h
  1. /**
    , Y% \! z) Z8 M) e9 t( n
  2. * Менеджер квестов и скриптов.
    : `$ X! b% l( t! U
  3. * Автор: Zoey76
    % B8 m2 {: I9 ~  z& T0 u& ]
  4. */' m; a6 A4 t2 S6 A$ c. x0 F4 e, X
  5. public class QuestManager
      n( ^* {: K5 M* {/ s' s4 u# v
  6. {$ `! _8 J1 D1 C& o+ x; W- t. O/ Q; |3 l
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());# g5 c  n- ~7 X8 r  O
  8.     2 F/ J; z. ?4 p  ^& L% ?
  9.     /** Карта, содержащая все квесты. */
    9 t0 K7 L1 n9 Y3 X
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();
    2 _5 p3 y& k+ G% [+ s$ G( Z
  11.     /** Карта, содержащая все скрипты. */
    8 Q: G, p& r$ ?" \7 `- H$ V
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();8 h* q4 R9 T, d7 J+ p/ J5 B
  13.    
    ' p, |2 l* R$ K8 H* Y7 [
  14.     protected QuestManager()2 ^6 i1 r$ C" c3 H' u; N( X
  15.     {5 X6 D, X7 C. Y' A( w' \
  16.     }
    # P! ^* d4 P9 H) E
  17. }
Скопировать код
4. Методы* D1 \! M/ k3 [' E  {, k4 h
Метод reload(String questFolder)
1 y( f' a( V# E$ i$ D7 a
  1. public boolean reload(String questFolder)" K2 ]! z% f; t. g- j, m0 P
  2. {
    3 o4 B# M' W9 S! q# N. M
  3.     final Quest q = getQuest(questFolder);: l$ ^. m) Z' v+ S$ Z( K0 R1 T: X
  4.     if (q == null)- o1 Z( j2 Z' X8 ?- d9 b
  5.     {
    2 a& y' A/ s  L
  6.         return false;
    1 G6 C; [4 z: Y' n
  7.     }! }# R3 W) Q  o- V
  8.     return q.reload();
    2 k, _! H- J3 i% r% z2 v) U
  9. }
Скопировать код
2 H* O+ y6 `0 X7 |

0 B, m- T0 g5 t8 FМетод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
7 n( V' n) S/ s5 @) ?3 gМетод reload(int questId)
. f" L4 S. [# k# k) n: `+ p: S
% _  o* X! v1 `- `0 g4 _& ^4 j) x" `. a% m
  1. /**
    & |# J6 s+ f& M1 ~" `- W
  2. * Перезагружает квест по ID.4 H! F8 |5 J: l2 v# k
  3. * @param questId ID квеста для перезагрузки
    * t* w0 ?- h# P) ?1 o5 D
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае7 M  {2 R- {4 G9 m. n+ O* z8 Z
  5. */
    % x$ z* v( Q6 D2 K6 k
  6. public boolean reload(int questId)
    4 D  M0 h; x7 X9 ^% y  p
  7. {
    8 k& c: k7 m- E( g0 U$ G, t
  8.     final Quest q = getQuest(questId);
    & W( a1 m5 j. ]# E; q
  9.     if (q == null)
    + c1 F+ c: ^+ ?! R
  10.     {
    0 R8 S* T% T) ?- `% S3 ]# K# s
  11.         return false;- [* R+ _3 L9 h( S1 Y
  12.     }
    ) `+ U6 B/ F6 [4 a- `
  13.     return q.reload();
    $ e! c; D1 _$ s2 P( f% \/ }) i
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.9 n2 M! Z" W8 c# O/ L- V; I
' i4 w4 I9 K9 H; \
Метод reloadAllScripts()6 h6 l+ v- A% s1 {- h( F; j

9 J. H& ]* P: m* s- p6 Q
  1. /**% |+ M9 u$ {" z8 \/ M: }. b
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.
    3 N' l5 y1 D! ~' S/ N' o6 g) m7 U
  3. */8 X( _3 ^5 Q4 B. U
  4. public void reloadAllScripts()
    0 B/ ~0 J( q" q
  5. {4 P7 ^4 e- |7 ^$ x. N0 W- ?0 U
  6.     unloadAllScripts();3 o  P1 m- b) \  s0 `1 N5 a! K' _
  7.     7 K- j3 g8 T8 _/ N6 C+ `% h
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");
    ( p+ B/ c( T8 E
  9.     try
    : L; u6 G$ [) a4 Y0 a1 A$ |/ q
  10.     {
    & H! Z% b; K" l1 _6 a
  11.         ScriptEngineManager.getInstance().executeScriptList();
    6 w0 E: Q8 v+ N; o8 M0 c: n
  12.     }
    * S5 h9 V' P! [9 A% L
  13.     catch (Exception e). C9 T( a. O( G. D) p( n
  14.     {; A. g5 J1 T" D+ N- a) y: p8 B
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);# F8 {* R1 m/ T! f' f9 j1 O  L6 [
  16.     }6 y# F8 H2 G9 a# z; E8 ^
  17.     4 W$ D2 a" o' F" P! b
  18.     getInstance().report();
    " c. T/ b8 N9 `; c4 B6 |
  19. }
Скопировать код
Метод unloadAllScripts()* C) w7 l; J4 O0 G# L' H6 |
' u5 n, z; l1 v2 E
  1. /*** n' x3 ^7 ?6 d0 _3 m' b
  2. * Выгружает все квесты и скрипты.
    4 Q9 h9 a1 ^; j, t  E$ v# a
  3. */7 I; F  H6 ]+ w' f, X& ~* l
  4. public void unloadAllScripts()
    . F2 x8 r5 ^6 `  _' @' T
  5. {
    + z- V# G% V+ d6 X
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");
    # _, y' a3 n# Q2 n/ P
  7.    
    ( p3 z6 S. d. W# O$ q6 b
  8.     // Выгрузка квестов.
    0 C5 N- r7 g, n- `. q; q$ A- R
  9.     for (Quest quest : _quests.values())
    0 |6 L7 O: x0 O5 f# X) |) i
  10.     {; m/ E0 ^9 w& g: `" m
  11.         if (quest != null)
      U+ x" K* M. g$ q0 c
  12.         {
    7 J" R" \/ |; ^
  13.             quest.unload(false);
    " F0 L1 M3 g" {8 P
  14.         }4 c# u, m3 x" G. s0 i$ x4 v
  15.     }
    6 j! i* G7 F6 p: _$ \' k" j
  16.     _quests.clear();
      }8 n8 H3 d% Z5 P2 F
  17.     // Выгрузка скриптов.7 N6 ~5 k& Q* L! d- `
  18.     for (Quest script : _scripts.values())) r$ }& m; [$ r$ z# _
  19.     {
    + s) X! a+ _. p" I2 f" o4 Y9 w
  20.         if (script != null)$ f$ F9 O; n, X
  21.         {$ ?+ T4 Q5 {* T
  22.             script.unload(false);
    # m/ F8 R' B% H; i
  23.         }
    / m, \4 T" H3 l) m% ?
  24.     }  B, }. s; @7 ~5 E/ p7 U1 X
  25.     _scripts.clear();3 V7 [# |  p5 ~7 R( p
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.. N' z+ G, I, l8 K1 H$ d8 n

5 x$ b: x3 {' d3 v# h/ ^# c/ dМетод report()
! Q0 n  V' Q" k1 }1 E4 m8 C2 w/ {8 ^+ v' i9 ?' [, g9 W) s
  1. /**
    $ i9 k+ P; N8 B+ z9 D) b& J- ~
  2. * Логирует количество загруженных квестов и скриптов.
    3 Y. [$ i' e4 Z2 [. @9 U2 F
  3. */
    4 ?1 S. w1 I% P0 K2 L7 @
  4. public void report()
    9 p; Q2 X& @. H/ y( {) y! h( P
  5. {. Q( u. Y, s9 ~
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");
    9 D; k% j9 B8 ?0 z! z/ ]
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");, I$ b( G* J1 m& @8 i4 {
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.
    # W/ A& s' A7 \; |9 ?/ V, s( S  d

1 c7 V& A5 k4 TМетод getQuest(String name)  f0 e6 N- L3 {

1 C5 L3 g( ~8 W( g
  1. /**
    * }5 u7 [! @' ~( Y
  2. * Получает квест по имени.
    % o# B0 A5 i" b" h
  3. * @param name имя квеста
    8 F9 E" v! I- l2 q0 E
  4. * @return квест
    $ o8 F' B& C' k
  5. */
    ! x, R0 o7 n; x+ M7 e( X
  6. public Quest getQuest(String name)5 Y; S2 f4 L' x1 O0 z. }
  7. {
    . @3 W2 B% @5 `3 v% [
  8.     if (_quests.containsKey(name))6 v3 Q0 F6 a; `" z+ F0 O
  9.     {& C8 S9 f: K# Q7 a+ [- z& G0 C
  10.         return _quests.get(name);& q( a4 `( E: G8 p* F) y
  11.     }
    6 ?: }8 j' X) G3 l8 i! h1 V& w
  12.     return _scripts.get(name);+ Z( m: j5 K; U2 F
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.& t+ l9 Y5 Z+ ]  v  u% \
9 }- ^# M0 B9 \! H) D$ c$ ^
Метод getQuest(int questId)
, A9 Y' J$ r" q0 }9 E* j
; l% \0 E7 V( n2 k  m
  1. /**. ?2 H" s$ g- m( p
  2. * Получает квест по ID.( E# O9 \6 ^* \% r* P1 J% \* n. g
  3. * @param questId ID квеста
    0 d( B8 S( T- Q+ I( C( `7 K
  4. * @return квест, если найден, {@code null} в противном случае
    ! V7 A) V- R2 e/ ?/ C
  5. */% M8 z( B4 U0 k# Y
  6. public Quest getQuest(int questId)
    ) ?/ q( O1 n- g
  7. {
    . y7 E; |  U8 S+ k' Y
  8.     for (Quest q : _quests.values())
    9 {- n+ C, b" ]
  9.     {" L( x- K  O- R5 H- V: }8 w4 w
  10.         if (q.getId() == questId)% f7 \/ w9 u( T7 s; P
  11.         {% O6 E' j% m  X, v- i+ N
  12.             return q;( F7 n- ]0 Y$ F3 W1 t0 \" z) f5 `
  13.         }
    * l3 \# a4 ]+ Q% d5 J, b# H! C
  14.     }
    ! [: ?% w8 E2 I* p- w6 G/ g7 _
  15.     return null;  t6 E; \: V) |
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.
    8 h4 N3 G0 [- S. h& f+ W! n# ^4 [
% s6 T  z( \- m( z* C
Метод addQuest(Quest quest)
, `# a& |: F5 p
% B: ^2 y  [( J3 x' H3 v
  1. /**, N: I$ W* E. A. n
  2. * Добавляет новый квест.
    6 `9 ]# k2 O7 D4 T3 e. j+ f9 i
  3. * @param quest квест для добавления
    7 @5 k9 |, R0 m6 z' M+ |$ f3 }
  4. */
    4 s# b6 s0 n$ p/ [
  5. public void addQuest(Quest quest), Q9 I9 Z: s. ^
  6. {
    2 ?6 Y$ q0 h" u1 Y) A6 I
  7.     if (quest == null)3 W! x) r8 Z9 |3 n. y* `
  8.     {4 A: x1 k$ T* q! K% h8 f
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");: v5 E' m0 n( `1 d) o/ T
  10.     }+ n# ^, L/ b* Y" _) P  i6 i. t
  11.     * l6 E- j5 M/ _
  12.     final Quest old = _quests.put(quest.getName(), quest);
    : Y6 X) A' Y* g8 V( ?8 t9 z- G
  13.     if (old != null)& }, L, u" U# t- D+ q) `& k/ t% |
  14.     {
    ; u+ P3 ?4 Q+ C2 t8 D- ^" O
  15.         old.unload();. N. H! T; L: s) ?+ f4 ?
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 Z" A0 `( W, G1 n
  17.     }" P4 N# M! R5 r+ z; J* N, s0 y' l/ M
  18.     . `: s$ S4 P8 R- K+ `
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    - a6 P( [; I2 ]9 ^5 j4 m+ h& ?
  20.     {
    # J$ P1 y4 J; R
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    9 V6 [/ L8 G) F& v; _5 {0 Z
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");3 Y, O+ C* _1 D. E# E
  23.     }& `9 Q0 R! _$ p- ?0 a5 L8 w, a
  24. }
    : D: Q9 G- B5 Y0 o9 i* g
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера./ `! U- }( D8 T' u8 S
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.
. x0 S4 g. z& g6 v+ t& x
5 W$ D; `4 g2 A' f. k1 ^) q  H  l3 I
6 U# l2 F5 G9 w, H/ `) S( X
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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