Top.Mail.Ru

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

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

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

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

x
Гайд по основным Java-файлам ядра сервер L2J_Mobius
( N( O# A! S$ Q8 V5 x
1 R/ T; V8 c4 I5 d. A9 _Разбор файла QuestManager.java
& k. k. d) [0 D8 f% W: b2 N
( `5 L5 O9 B0 p( v8 [' y& w+ W& MЭтот файл управляет загрузкой, перезагрузкой, выгрузкой и хранением квестов и скриптов на сервере Lineage 2. В нём реализованы функции для управления квестами и скриптами, а также взаимодействия с движком скриптов.
6 f; ]( ~8 z( j/ V3 e$ x3 b# g8 j0 i+ r8 DОсновные элементы4 h/ q8 v) M* S1 p& c6 j' h. Z  ]
  • Лицензия
    8 q3 I( p- y2 T) N
    • Комментарии в начале указывают на лицензию GNU General Public License, что позволяет использовать и модифицировать код в рамках условий лицензии., ~0 D+ v2 g# S/ r
  • Импорты
    1 n) S4 m' W2 V2 F5 j
6 o- g6 z1 B7 i+ w0 O$ l2 M+ D
QuestManager.java — управление квестами и скриптами.
( A/ J, s2 A" v4 c3 {4 Y7 TПуть: \L2J_Mobius\java\org\l2jmobius\gameserver\instancemanager\+ O. x$ h0 N) a+ P0 ], C1 r0 }

& k6 `3 Z: {% m3 y1 D% V

" s8 Y/ V  u5 d# n& {Давай переведем и разберем код QuestManager.java по частям. Этот класс управляет квестами и скриптами на сервере L2J Mobius. В нем реализованы функции для загрузки, выгрузки, обновления и отслеживания состояния квестов и скриптов.
/ B. ?+ |, a+ @7 r% y$ k1. Лицензионное соглашение2 m; K; D$ T9 X. H: `
  1. /*
    8 G6 N+ M, l, E; O9 J0 J
  2. * Этот файл является частью проекта L2J Mobius.! u: O5 V- Z# u1 M& f! Q
  3. * $ S" A9 |% h/ z
  4. * Эта программа является свободным ПО: вы можете распространять её и/или изменять
    . l( Y* N  F( N% H/ ^- S2 N3 Z8 C8 `
  5. * её в соответствии с условиями GNU General Public License, опубликованной
    ( H" H. Q: s; ~' D: G
  6. * Free Software Foundation, либо версии 3 лицензии, либо (по вашему выбору) любой более поздней версии.
    7 q1 O5 b+ W7 ~6 N
  7. * 6 [8 D0 Y5 @1 n8 Z! o
  8. * Эта программа распространяется в надежде, что она будет полезной,
    8 |( ^5 x- m( f; b8 G  S
  9. * но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ; даже без подразумеваемой гарантии  a  l; }2 E; F2 S: Y9 T$ z
  10. * КОММЕРЧЕСКОЙ ПРИГОДНОСТИ или ПРИГОДНОСТИ ДЛЯ КОНКРЕТНОЙ ЦЕЛИ.
    : j: y( D9 O* W: x
  11. * См. GNU General Public License для получения более подробной информации.
    ; Y  |* X6 t. b7 F# F) ?" W
  12. * # j0 K2 X7 {7 |2 l6 B2 m
  13. * Вы должны были получить копию GNU General Public License
    , K! T0 z3 q  p& m* c+ R, T5 h' S
  14. * вместе с этой программой. Если нет, см. <http://www.gnu.org/licenses/>.
    0 k) Y$ a: [; ?( x2 V: W& q
  15. */
Скопировать код
Это стандартный блок лицензии, который описывает, что этот код является открытым исходным кодом, распространяемым по лицензии GPLv3.' d6 y# W5 Q9 o  t, u

2 w$ m0 w, Y3 r, y
7 v$ n- S5 a  a0 A0 G$ l2. Импортируемые библиотеки
: `. u: H' O/ z- }. X8 s2 N# M4 ^/ T) l. q& }% I  _
  1. package org.l2jmobius.gameserver.instancemanager;( s, O9 {' j5 j' I$ x$ {+ j

  2. 0 R. R3 S: n6 f! ?* R
  3. import java.util.Map;
    3 ~( L6 w, r: \4 r2 k
  4. import java.util.concurrent.ConcurrentHashMap;) V: r, {- `) I8 `1 y# p
  5. import java.util.logging.Level;
    4 }, ^1 Q' d, y/ ~' x2 c* x# a8 w
  6. import java.util.logging.Logger;
    3 U/ ?* q  ]7 ?8 l
  7. $ I  K) n+ [; T% C
  8. import org.l2jmobius.Config;" [0 }- k! ]+ Q4 ^. @; q
  9. import org.l2jmobius.commons.util.CommonUtil;% R. p5 T5 x  o( `$ M
  10. import org.l2jmobius.gameserver.model.quest.Quest;. u8 i# b. K: v
  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 — менеджер для работы с игровыми скриптами.# z; [  b0 V, U' W7 Z" H) M

7 T9 ]9 S% {  _, }3. Описание класса QuestManager2 [' c  X7 z( `) c' q- G5 ~) c
  1. /**
    / H. j1 E( P2 T# [
  2. * Менеджер квестов и скриптов.
    2 V/ v' c1 h* f: j/ \
  3. * Автор: Zoey763 X- c2 z; w: l$ _9 Z, I. R8 K
  4. */( ^. @+ U1 Q2 k$ Q
  5. public class QuestManager" P5 r4 B" D" ^  H: h
  6. {
    9 ]! H7 a  _  q3 ^: |/ T
  7.     private static final Logger LOGGER = Logger.getLogger(QuestManager.class.getName());1 G4 S" _' C) k8 B2 b
  8.    
    1 O$ m9 k" Q3 B% A8 j' s0 q# C
  9.     /** Карта, содержащая все квесты. */
    2 z# w  S0 _' o- g6 s% _8 q
  10.     private final Map<String, Quest> _quests = new ConcurrentHashMap<>();$ X* z6 G% M) I# y
  11.     /** Карта, содержащая все скрипты. */
    - b0 a" Z% x0 m- c
  12.     private final Map<String, Quest> _scripts = new ConcurrentHashMap<>();' r8 k1 f9 N8 R* A
  13.     7 m* h6 X7 j& M
  14.     protected QuestManager()
    " J8 I0 v4 [; \! ]6 s, Q6 x/ D
  15.     {6 c/ [( q6 z7 y  k4 Z0 }3 c- g; r7 J
  16.     }* W' b% G5 _2 U% V4 q, e, C
  17. }
Скопировать код
4. Методы
4 h9 f* a2 J; `/ C% KМетод reload(String questFolder)
. h2 B$ n! D4 y
  1. public boolean reload(String questFolder)
    9 N. J/ y; {+ M( k4 P! p9 P
  2. {
    $ T2 h8 \! f2 D0 ^& \$ I
  3.     final Quest q = getQuest(questFolder);
      C4 D" ?' ]: \" M  g
  4.     if (q == null)
    8 A! F/ G8 n, J% c' h4 w
  5.     {
    ' r; t/ |" T  }: }3 n
  6.         return false;
    " P) f5 i& N3 `$ W) J% u; ^
  7.     }
    - _1 p* R, r) [  a6 h8 E
  8.     return q.reload();; Y' U% i. d7 ?
  9. }
Скопировать код

9 q  k0 S! A( z; N( H0 ~! w2 L: }% ~0 [' B
Метод перезагружает квест по имени папки, в которой он хранится.Если квест с таким именем не найден, возвращается false, иначе вызывается метод reload() у объекта квеста.
; U; r% s( J, w& p7 I4 dМетод reload(int questId)
4 l. S- \0 w% x6 s2 g) K
5 {0 H9 P3 m1 ~: N% x1 X' c
  1. /**) L! w  F9 T9 P4 [
  2. * Перезагружает квест по ID.
    6 v1 A5 k; X- Z8 F
  3. * @param questId ID квеста для перезагрузки% [7 ?/ a* @& T. n
  4. * @return {@code true} если перезагрузка успешна, {@code false} в противном случае7 c" r  l( G  L) e, A# [+ B! G$ [
  5. */* ~) e, u" |( p1 Y# N4 j! \
  6. public boolean reload(int questId)
    3 J2 G; g$ h$ P; V
  7. {3 c) e& ^% {9 `5 w7 D9 W( ~8 `
  8.     final Quest q = getQuest(questId);+ C4 ?! X4 C* T7 j; R* k
  9.     if (q == null)
    8 q5 K; L: S2 @" [0 T. W
  10.     {) I4 ^+ ^& a9 G' j' F( _
  11.         return false;
    ) l  a  u2 T+ a# r
  12.     }6 F; c; r6 h9 m8 Y' O9 ^5 P
  13.     return q.reload();  W1 D8 z2 h2 k! t" |: c: G+ [
  14. }
Скопировать код
  • Аналогично предыдущему методу, но перезагружает квест по его ID.
    5 x7 M" _/ `) n; K- ?# N

9 a9 e; G  M9 gМетод reloadAllScripts()9 e- K  X& e2 O
" ]9 t8 l& ]' Z5 B; b1 e" \' L
  1. /**, _7 m( k; y, H9 N
  2. * Выгружает все квесты и скрипты, а затем перезагружает их.$ `/ V# s8 V* N! N% F% j* ?* z" x
  3. */& N6 [& S; K: c. _0 u. H0 c
  4. public void reloadAllScripts()6 `( ]( V( g' {: n
  5. {. [8 @* R; z3 A% J0 |
  6.     unloadAllScripts();; {. c3 Z" a# R" E- U+ \& \! p
  7.    
    0 v9 g& ^  ?5 D; Y9 h' t, g
  8.     LOGGER.info("Перезагрузка всех серверных скриптов.");( k5 n4 p; C4 o9 l
  9.     try1 \' E' ?8 R5 E( u+ p0 r$ v
  10.     {) f& r$ h+ a9 d7 P' v
  11.         ScriptEngineManager.getInstance().executeScriptList();  H, L; Z8 i9 Q; R; S- e9 e
  12.     }- S+ S. u0 i& X* T5 u% P
  13.     catch (Exception e)  D5 R9 M. B# t  Q
  14.     {& \. {! Y. Q, q
  15.         LOGGER.log(Level.SEVERE, "Не удалось выполнить список скриптов!", e);3 ?! k3 U7 \4 `  g- `
  16.     }, C+ \) |+ P5 D, L
  17.    
    6 O) L! {# ^6 U$ K" r
  18.     getInstance().report();
    * ]2 C) y+ Z$ N0 W5 U
  19. }
Скопировать код
Метод unloadAllScripts()
+ B9 H2 ]" v# H9 n; O$ B' c9 e: \$ S  e. \5 j
  1. /**
    ( m: V) W5 k! u+ L* w2 @% P
  2. * Выгружает все квесты и скрипты.
    6 g) a0 T0 J; ^% E: s, Y2 q
  3. */! L. E8 _! d  n3 s  O- F* S
  4. public void unloadAllScripts()
    ( `% S+ c6 C* v7 [& w( i; C
  5. {$ |" j5 h% y8 S
  6.     LOGGER.info("Выгрузка всех серверных скриптов.");) s8 T' ~! h- J0 {2 B8 m9 A
  7.     3 ]" k) N. o4 L. w
  8.     // Выгрузка квестов.8 J6 r( |. N5 T# _' \
  9.     for (Quest quest : _quests.values())
    4 a5 I: W+ d% B. E9 d3 Q. I
  10.     {2 L5 w6 ?4 y# C9 Q/ W* `- S4 b
  11.         if (quest != null)* K( U! q- H+ I$ g
  12.         {
    ' W& m1 B9 I( O: {4 z
  13.             quest.unload(false);, r, X( t) D8 S2 g
  14.         }/ b$ A" `  ^5 X% J
  15.     }6 ?, C2 D. x5 K6 }! I
  16.     _quests.clear();) l( F7 B. d) v. |; y& T
  17.     // Выгрузка скриптов.
      \5 q: ?' y0 _5 s% Y
  18.     for (Quest script : _scripts.values())
    , c. N% k- k' ]* j
  19.     {( M" b( r& |/ n5 f( I# V* i
  20.         if (script != null). Z! P, u/ W+ T& w) ]. p" B4 y
  21.         {
    4 W6 e5 J5 @: B) G
  22.             script.unload(false);' e0 F* V+ F0 C4 I  x$ [" K
  23.         }
    $ p: n: p' c3 U0 D+ B
  24.     }6 v$ P+ L5 j- r+ Y
  25.     _scripts.clear();9 K( @9 f; p# u1 F: D1 z
  26. }
Скопировать код
  • Этот метод проходит по всем квестам и скриптам и вызывает метод unload() для каждого, а затем очищает коллекции _quests и _scripts.
    " Z% ?9 D: Q/ H5 W* V  s5 V! U9 n

4 w/ }* P* l) p2 e4 I  P; }7 o2 fМетод report()* \) u) B1 ]$ `6 Y4 d5 s; b2 C

% m9 P- I9 O+ F# ]% M$ |
  1. /**, Y% ?  ^  S- ^7 x5 Z, z5 E' }
  2. * Логирует количество загруженных квестов и скриптов.0 t  e" p" B2 W9 A& e
  3. */
    ; {! W* x$ v4 y: m
  4. public void report()& d& b1 g0 y1 b8 Y3 C  U- t
  5. {
    - Y# |; `2 L% c. [2 }5 ~
  6.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _quests.size() + " квестов.");8 j2 s* Q6 k+ i2 i' c
  7.     LOGGER.info(getClass().getSimpleName() + ": Загружено " + _scripts.size() + " скриптов.");
    4 f# ^5 t% }& C' a8 T
  8. }
Скопировать код
  • Этот метод просто выводит в лог информацию о количестве загруженных квестов и скриптов.5 V4 w& N' T" _$ V( D# ~3 |

: ^% O( E$ ~, b9 nМетод getQuest(String name)
  ?3 T7 S' v. [( h! q- W+ d4 u' B6 X/ f
  1. /**7 o0 [! j- ]  m/ e: l
  2. * Получает квест по имени.% v7 Z: X! U3 C- J& S* I
  3. * @param name имя квеста
    % x, E( t, k, E1 y" ]% B* ]9 O4 v
  4. * @return квест) p9 e& Y3 F7 e
  5. */7 m8 ]/ f/ ]5 z5 A5 g
  6. public Quest getQuest(String name)$ O$ Z* \, b7 t" z# d; f
  7. {/ l% F, ]: l2 Y* L8 k. y9 z
  8.     if (_quests.containsKey(name))" O7 N3 [6 ~" p* \" s
  9.     {7 P/ D2 ^4 [/ l) j
  10.         return _quests.get(name);
    + l7 F6 ]& p) n6 Q1 K% x
  11.     }2 ?/ F* V4 E- p2 A. R& J
  12.     return _scripts.get(name);; H' Q2 O# d4 u3 R4 H* r* H
  13. }
Скопировать код
  • Этот метод возвращает квест по его имени, если он зарегистрирован в системе.5 W  M/ r/ ~* W9 h  h$ f

- y# a# m, ?( [: Q1 ]7 X8 VМетод getQuest(int questId)- ], a* X. g  g( g1 z
. p3 E) ?( n: n! T3 b
  1. /**7 w1 `2 V  P7 w( V0 B, z
  2. * Получает квест по ID.
    4 u1 v$ c; E9 h2 ^
  3. * @param questId ID квеста; n' b( `; ~! Z3 }$ ]& {
  4. * @return квест, если найден, {@code null} в противном случае
    $ ~+ P: X5 `- a* E( B" B( V- X  g! O
  5. */0 L/ f$ F3 ^; A0 c2 U4 [) ^
  6. public Quest getQuest(int questId)
    / D7 t3 V! _7 r+ W0 g
  7. {' z' ?6 [0 X3 _, e- Y  w7 E9 y
  8.     for (Quest q : _quests.values())2 N$ D9 }! Y& d4 o# B8 ]
  9.     {* O! d% Z! i+ G1 `" M+ ]  Y4 g
  10.         if (q.getId() == questId), }. s, F/ T5 a9 B
  11.         {. k5 h& t( p( y' V- A2 p1 n& l
  12.             return q;# P' Z, x1 c; b+ w. v+ M3 m
  13.         }' g0 X  p5 i1 o2 e' U
  14.     }) Y! ~- u3 y. S0 F& Y4 j6 s  x
  15.     return null;; K& a( C5 ]! D" }1 N
  16. }
Скопировать код
  • Этот метод ищет квест по его уникальному идентификатору.9 Z/ H7 f  l9 S9 a* M$ {
# N! e: v0 k- t4 Y
Метод addQuest(Quest quest)* f% Z. u3 X  W& `) W

) z5 ?" j8 S, f: B; a& w, v
  1. /**
    ! h0 C- n7 f) M: J6 Q
  2. * Добавляет новый квест.% N  P, }/ G, I3 C3 B
  3. * @param quest квест для добавления
    # N- t; H  H) |9 w9 {
  4. */6 P+ r$ I% ^+ Z) j2 [0 r7 h4 E) C
  5. public void addQuest(Quest quest)
    1 H- Y4 @8 Q( L( I
  6. {% o) u2 ]; C9 [4 x. K4 f; ^
  7.     if (quest == null)
    % ^* r( Y. K( Y7 F/ d6 h
  8.     {2 a" f* i8 I# c
  9.         throw new IllegalArgumentException("Аргумент квеста не может быть null");& j; Q  c& i/ |8 N' m+ Y
  10.     }' b! ]: u2 l0 }" W4 P0 ]
  11.     " K" D4 r% Y; D8 i: @" R
  12.     final Quest old = _quests.put(quest.getName(), quest);8 A8 s- X) X% c5 P! q. P
  13.     if (old != null)
    4 F$ x4 C8 Y8 G; `7 H
  14.     {
    + S0 a/ ^  [, v/ P+ z$ A3 }
  15.         old.unload();
    5 I9 @  {+ `3 K0 }' f  ?3 b
  16.         LOGGER.info("Заменен квест " + old.getName() + " (" + old.getId() + ") новой версией!");9 T2 ^1 n2 z. p2 {1 Z# Z
  17.     }- x# y2 {! y& T5 _
  18.     ' H; L! x" M" Z& n2 H- M- U
  19.     if (Config.ALT_DEV_SHOW_QUESTS_LOAD_IN_LOGS)
    ) L( a3 U2 ?8 \! t
  20.     {
    8 N: [2 H3 h8 R1 ?" N8 u
  21.         final String questName = quest.getName().contains("_") ? quest.getName().substring(quest.getName().indexOf('_') + 1) : quest.getName();
    " y9 h. Z9 q! j& I
  22.         LOGGER.info("Загружен квест " + CommonUtil.splitWords(questName) + ".");! B, P) l, o6 K" F9 D8 W
  23.     }! a! s# {1 [' e& M2 k# @
  24. }
    & F4 u  D; T8 |" J3 `4 P& l
  25. ``
Скопировать код
Логика работыQuestManager управляет процессом загрузки, перезагрузки и выгрузки квестов и скриптов на сервере. Он поддерживает кэширование квестов и скриптов в картах _quests и _scripts, а также обеспечивает возможность их перезагрузки без перезапуска сервера.: D, E6 V  U9 W( D
ЗаключениеQuestManager.java — это ключевой элемент в управлении системой квестов и скриптов. Основная его функция — это управление квестами и скриптами, их загрузка, перезагрузка, выгрузка и хранение на сервере.+ o" o: q3 i  I2 @/ ?  P  G0 g

+ z( V6 j# Z+ z- o" r3 a' k: I  @. r5 o4 [

" n. T# K6 r2 D: {7 g
Чтобы ответить, вам надо авторизироваться в системе Вход | Зарегистрироваться

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

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

638638758

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

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

admin@artace.ru Онлайн

QR-код

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