Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
# f9 Q5 a8 m. A" p
6 T: g1 a( ^; t5 t) q% Q- y& E7 b, L" @Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 I) ?* u- P9 _( r" b
5 H* j- S2 b0 R. t+ e% lШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' G6 c" U2 L8 ?* O
: [2 _9 D5 B) F
- // Пакет для состояний монстра' b2 ]+ z8 @3 t2 I& N' d
- package org.l2jmobius.gameserver.model.actor.state;
/ Z, V+ ^1 z* a6 O
J, \6 l. X0 l- // Интерфейс, представляющий состояния монстра7 V$ ~1 I0 @" F
- public interface MonsterState {- H; x7 A5 x r
- void handleState(Monster monster);% R5 ^9 X; v+ d- c9 W: o1 ?8 A
- }) u R& J0 G9 u" n0 ~2 o
Скопировать код % q, G% w! }5 |) q# k) i3 ^
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
6 E4 {- i3 U3 Q( n- s- r2 F
~/ D0 e2 y4 l- u9 D9 sЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.1 T% v' F0 L1 { C
7 X6 m0 ~0 e* t8 |! x2 {! C: s
Класс для начального состояния монстра: ]2 G9 r8 t& l' O- @
- // Пакет org.l2jmobius.gameserver.model.actor.state- X- _& ~: S. F3 R3 u4 |
- package org.l2jmobius.gameserver.model.actor.state;* h) U3 f9 @& t" t
- ^4 _ C. `6 y5 A6 s
- import org.l2jmobius.gameserver.model.actor.Monster; P: N! l4 ]! M8 z
- % a; [; j6 e* z: P" C' ^3 A
- public class InitialState implements MonsterState {- r. a0 Z0 H3 H3 J# P
- @Override: |1 W3 S: [0 U ^5 c
- public void handleState(Monster monster) {
5 d4 A$ l/ ]8 m8 E - // Начальная фаза боя
, m8 _9 U) f; ? c( E; u5 O K - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 j2 h6 S* x, W# M8 { - }
& z+ S( _+ z& q9 {; R8 r - }3 [* ~/ t; S* G' G
Скопировать код Класс для агрессивного состояния монстра:, g- k% y1 |% v7 ~, ]
- // Пакет org.l2jmobius.gameserver.model.actor.state9 r9 T1 l: k2 R
- package org.l2jmobius.gameserver.model.actor.state;
) m7 t/ R6 V5 D3 |$ G4 y3 c% j
3 X0 |, r' z& f& e" X6 _& G: g- import org.l2jmobius.gameserver.model.actor.Monster;
Z4 B( D- j" d1 t9 ]/ c5 R7 b
, I6 W: d8 I7 S6 u. w2 w+ ~- public class AggressiveState implements MonsterState {
+ H8 N4 n9 S9 k! | - @Override5 o8 @+ G2 J; {0 O0 l4 a/ I
- public void handleState(Monster monster) {
" b& @! F) J1 E/ @) `) B- w - // Агрессивная фаза боя
6 H& o( R) U" b# P) C7 _ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");) m+ K0 A9 G0 t) J" I, M* E9 n
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
$ m7 C! ~8 ]( O8 [ - }
3 U, a+ K& B8 V( A; T3 Z - }
0 o0 [# ^+ W2 ^
Скопировать код Класс для финального состояния монстра:
: H: v- P3 ^. k) U X. q# q- // Пакет org.l2jmobius.gameserver.model.actor.state
; `( |0 i6 O. F( V0 g - package org.l2jmobius.gameserver.model.actor.state;- n. Z- k7 W8 d) F( b- s
- 3 |2 |9 [$ u# P H, i' ]& g, H6 M
- import org.l2jmobius.gameserver.model.actor.Monster;
6 E- h- t4 o, H5 o& r q' I9 o
" f! _7 K* r% n/ B- public class FinalState implements MonsterState {
& G8 O# b! a: `* q. g1 n5 G - @Override
6 k6 ~1 |2 x: }' I" d- @ - public void handleState(Monster monster) {
0 b. U, |& {# m. X1 v - // Финальная фаза боя/ Q+ q, C; }0 N& G5 e9 I
- System.out.println(monster.getName() + " готовится к финальной атаке!");
4 O3 C( Y1 g! o* m) v4 q4 ` - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки! Y5 G$ h6 `, `5 {9 U( i4 j& ?6 w. ?
- }
6 h" w9 I' C) L - }
' J/ P1 u& x7 `6 X9 G
Скопировать код 2 d& }/ t. M) s3 i/ @4 S
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.. e% q% E% r6 \5 \+ G# D( X$ M
- // Пакет org.l2jmobius.gameserver.model.actor
$ J& P1 u& r K7 D3 c - package org.l2jmobius.gameserver.model.actor;$ w2 ?: S0 {! W. @7 @$ G T
) y D* r$ f7 v5 J) O3 X- import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ ~7 N1 d, R+ ^, b. _' P
- import org.l2jmobius.gameserver.model.actor.state.InitialState;: j: X5 F: ~2 R# s0 ~; W4 G2 [
0 {$ D2 G4 X+ z( |3 k: I" F- public class Monster extends Creature {* A' a: s' @0 O& w4 D ^
- private String name;0 F" w6 ~& M' f. p" B" E. U
- private double attackPower;- ?5 C& C: l6 b. K, k' _
- private MonsterState state; // Текущее состояние монстра
9 w4 N1 I. b2 } t$ I# Y
0 L" V6 S( L% N7 s: Y- // Конструктор монстра
' n7 p# _* W, k. d0 \% e9 i - public Monster(String name, double attackPower) {0 b4 x* c0 z4 m* _! j
- this.name = name;
2 Z& v6 s4 n1 R3 r. I I3 m - this.attackPower = attackPower;0 y$ t! l: \7 t% W) G! e
- this.state = new InitialState(); // Устанавливаем начальное состояние6 A* X" b% p' h9 p' a6 G
- }
" ~; `( m$ g/ H N
6 t& \8 v0 G& R; q7 \( N" r. l$ x- // Метод для смены состояния
+ i2 R* ~5 T5 s# ?/ p - public void setState(MonsterState newState) {6 K7 }# l8 e, l2 T; c
- this.state = newState;2 h" m- @' [1 h4 m
- }" h) U' A2 T, I' @$ _
- ' V! y4 j; A3 J% _& l
- // Выполнение действий на основе текущего состояния! N+ b2 i$ W1 \: h8 r0 O
- public void executeState() {
! [+ C7 J8 ^+ m1 ?( l - state.handleState(this);
" O! N5 T' J- G% _- G - }, K2 `9 C/ u) C% e( ?
/ i5 R2 g0 ~; B# B' b3 O2 N/ G- // Геттеры и сеттеры7 K" i. f+ S& _- u: l# _& m
- public String getName() {
# t ?0 n1 y" }5 M+ I - return name;/ |4 O9 D5 j7 e: b. h2 M v
- } m1 S5 X- v: Z6 f/ I7 ^& \
- / a$ O9 _1 y/ ~8 e5 X% T) j
- public double getAttackPower() {
8 k4 ]! U$ \' I6 e; J) v - return attackPower;
# @; r: J2 ]2 Y' L8 e+ A - }
7 f& i E1 m+ K% A$ Z, s. N6 l
9 u& x9 J3 B7 M- public void setAttackPower(double attackPower) {
0 J; o' |! f# n, Z$ e - this.attackPower = attackPower;
) E8 y5 p- L0 r1 |0 N0 F - }$ |6 w7 U9 ~# j0 o: L3 J9 m
- }
9 H7 Y; B* r4 o5 b5 |; f, `' _
Скопировать код - E( y! B* D5 e, F( P7 Z J0 o/ J8 j
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра., {/ e, Q4 F. {# k1 u7 r
6 a6 S7 u" b+ h, l9 x1 i$ B8 g- // Пакет org.l2jmobius.gameserver.model.battle
: u0 P4 x8 F/ S; m& ]& X4 s5 j2 `8 I - package org.l2jmobius.gameserver.model.battle;
- @& [" H4 B, S0 C, x. b
) i" G S5 I2 U+ l2 f( o4 h T* g- import org.l2jmobius.gameserver.model.actor.Monster;
9 e0 ?+ ^2 j9 Q/ y. {7 I! b - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& G( w6 J7 f" x
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
0 q; J( U0 _9 N
$ k/ Q7 z9 b# U% a- public class BattleSimulation {9 g% ]& l# {0 |/ P- }7 N3 I
- public static void main(String[] args) {
# L: d: O4 c* y5 g& ] - // Создаем монстра с начальной атакой
- O/ @' H( [/ f0 M - Monster monster = new Monster("Дракон", 100);" S) l$ }7 d3 `% q3 b! l
- 4 w7 H* L' R- Z
- // Начальная фаза
2 e% y( r3 X* l5 M - monster.executeState();
, n& U k+ Z6 j. V0 p3 ]& }" Z, ] - , T1 ~7 R- j& J# g) U
- // Переход в агрессивную фазу+ s2 w3 V& i5 Z
- monster.setState(new AggressiveState());
6 j M/ J+ u, l9 L- t; X - monster.executeState();
. @$ e! i" n) J$ c, a6 u6 U+ | - / c. _8 [4 o+ |9 j" T
- // Финальная фаза
8 ~: F& k" A- ^% O+ Z - monster.setState(new FinalState());
0 O5 A! J% y/ ~0 I; }8 U/ y - monster.executeState();
7 z+ Q0 I% E9 _# X, A; ~+ } - }
/ A/ w! u& g$ e6 Q. Y - }
/ B9 T. T1 O. n# Y, Y$ |( O6 g
Скопировать код 1 }: ~, i" a/ v
Комментарии по структуре пакетов и классов:
% \+ w6 J& O2 f' q6 q- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
( Q+ f7 d- c1 ^# _+ f# u9 { ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
& g* X2 ?% h' D4 u( AЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
# o2 g1 }4 D2 f" r) m, A7 Z: i; g1 d- y. W7 {7 P
! p' l# d( V5 l+ u- r7 M- t" ?% X7 P4 k; l
' R- A0 U7 ?" W* l
, x* n7 o. u) y" B" H9 D+ d
' f; h" h) F5 Z, F9 ?9 L* s/ ?
7 n/ ?, P1 h1 R6 j/ T+ n {' e; a& l8 B
: s% f/ A9 ~2 h7 s; x9 \ F2 o+ g, |
- g& m: W" R1 F* E1 R, |. F" Q F- J$ g9 j7 o, ?( s
/ V# |0 Q: l ^6 @: n9 W9 H9 O
8 ~7 r% t1 A( V3 I0 h3 R& J" \
4 e( R7 H6 s8 x* q+ @7 N1 G1 C
& O# h7 Y; o4 ]0 x |