Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). . d% W1 p Z% p4 d1 c8 X) p
' }' G) Q1 o3 q, y
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.3 f0 i8 ]8 _' m& Z2 J D& Z" i, l
+ ^ Y+ x3 N/ _" ?8 B
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 B# \& ?1 C! ~) T4 z, U$ F
% @) Y. j5 e1 \3 e* n- // Пакет для состояний монстра& E& h$ p7 A; U" ]
- package org.l2jmobius.gameserver.model.actor.state;
! [1 d- m+ W# a, [# n$ G9 c6 { - O+ u. A4 q4 r, |4 P! Q
- // Интерфейс, представляющий состояния монстра" p' U+ Y$ h; I
- public interface MonsterState {* d- R9 W S* S! r
- void handleState(Monster monster);9 k3 F! F& J2 X' R+ ]+ H
- }
! U6 H) \9 k6 d, [
Скопировать код + b* E/ ^7 j* n
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
9 n% q6 S7 c* i+ @0 s0 d# ^1 c9 L- D) q0 ?
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% r# _' u) S% A# n- o/ r( W
: G: z: {3 s. m7 n6 `/ b7 F8 c0 ^Класс для начального состояния монстра:9 a& g+ @6 C8 `: |. |5 ~: N" [) o
- // Пакет org.l2jmobius.gameserver.model.actor.state
! L9 A4 b' g- H - package org.l2jmobius.gameserver.model.actor.state;5 p3 c& k: a# U# K
0 g! r+ F- j/ H) _ y- import org.l2jmobius.gameserver.model.actor.Monster;
' s. W4 h! P) e0 L+ Q - 5 b# o" K$ O: Z* y2 U/ ~
- public class InitialState implements MonsterState {
* L6 i' o0 M: ?# D3 e4 h% X - @Override
" x) N6 y% m x9 |; o - public void handleState(Monster monster) {
' m& c& h4 r3 t1 W9 d - // Начальная фаза боя+ O9 b4 M* v; ]1 u" y2 t# w6 }
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
9 C& J/ {5 i6 Q2 s; e - }
: w& g) V# k/ {. P; T - }- h5 B& V1 G2 ?9 B5 F1 A$ \" I
Скопировать код Класс для агрессивного состояния монстра:
: v$ F& n" ?5 v- // Пакет org.l2jmobius.gameserver.model.actor.state
! t: x. E- Y& {( m) y - package org.l2jmobius.gameserver.model.actor.state;
' H% Y# V. l8 ~+ t! u: d - . h) S; w8 D$ ~. r
- import org.l2jmobius.gameserver.model.actor.Monster;2 m" [( n2 {2 B: ^: I& g6 j
- 2 q3 q; l* E/ d9 X' G, s
- public class AggressiveState implements MonsterState {
$ H2 ]8 P* H& r/ @ - @Override
' P+ w2 J$ b. b+ p - public void handleState(Monster monster) {
$ _9 w, e* m6 A S - // Агрессивная фаза боя+ f {% \" ]* Q5 E
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
& D }* q2 ]( @2 m: ~ - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки$ [( a( |8 ~1 C) ]* j7 u- ?
- }
* r; a; e+ |, ?; }3 | - }
% \8 f" K, ^6 l6 ^* l
Скопировать код Класс для финального состояния монстра:
# y9 I1 t+ o: B5 a/ S3 ?1 k- // Пакет org.l2jmobius.gameserver.model.actor.state7 _8 \* w8 g7 `" `& m& K( @; P
- package org.l2jmobius.gameserver.model.actor.state;9 B0 i9 u1 D% f( b
. g- C0 d* N" K3 R* L0 b/ ^. Q- import org.l2jmobius.gameserver.model.actor.Monster;
% q" k- Z. [2 O' L* W - 7 q8 w- ~ o. R
- public class FinalState implements MonsterState {
, c8 K# ~4 Y% ~: H - @Override6 ? W- k* p' [
- public void handleState(Monster monster) { V* X" r2 m$ B2 E
- // Финальная фаза боя
/ M- [! W- p9 K( z' v$ Y - System.out.println(monster.getName() + " готовится к финальной атаке!");
# h; C5 j" K; u4 T {" [ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
& r ]% u5 y9 |( ]) ?/ h: x - }: [$ W. l8 Z; S6 T
- }- q7 e/ I, N( r
Скопировать код
4 c. V* x8 _8 \8 m. @+ \Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
( Y: S, q7 c' R$ e/ e- // Пакет org.l2jmobius.gameserver.model.actor& {' f, C( J. ~* q5 v, I% k
- package org.l2jmobius.gameserver.model.actor;2 z5 z3 J/ `) V. }* A, q
0 H8 R, X, O, W& J- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
3 O, K9 V2 x% C; x- J - import org.l2jmobius.gameserver.model.actor.state.InitialState;- j8 K$ p- Q: K* x
# U' {& Y8 w% j! w$ ~- public class Monster extends Creature {
1 E& ?: L" m: y# V5 y) s! Q - private String name;3 w7 F* ]" C6 w4 G" T7 ]0 m
- private double attackPower;
2 {/ E0 V6 G6 ^ }' K, r& Q" x - private MonsterState state; // Текущее состояние монстра
9 {8 U# S9 t5 r! C0 b9 `
7 H8 q( j: y9 Q0 G- // Конструктор монстра8 Y, `/ n9 ^ B
- public Monster(String name, double attackPower) {6 l7 F' N5 \: t s
- this.name = name;/ K% h, n5 \( }5 }/ b1 D: Z1 r
- this.attackPower = attackPower;
: a: ^ N: N) W3 u3 K& [& R2 g; j! h, c - this.state = new InitialState(); // Устанавливаем начальное состояние
1 o% N. S( A, ^$ b; X - }
; G' M) d; K8 {7 M' l D, x - 0 M- P9 y' G0 W: s% }+ E) H3 @
- // Метод для смены состояния# F, E, M/ U& h- c" W; f# P; j
- public void setState(MonsterState newState) {( ]/ }. M# `8 Q+ H% I5 j
- this.state = newState;1 h& j! Q4 K+ h- F2 P
- }9 d$ V( k* R5 X* @ |$ W, A: c
0 m, p5 N1 [( F7 Q4 y7 P. z3 B2 R- // Выполнение действий на основе текущего состояния
% e" y' H' e$ t" k& R$ y - public void executeState() {& x" Z- A5 f' o
- state.handleState(this);
1 I2 X2 }' Y/ u6 X; |5 o - }: G& @; K+ t' s/ q5 n% Q- n
- 8 P( x/ h/ b' t6 R2 w9 }
- // Геттеры и сеттеры
/ g) N! \5 M$ a& ] - public String getName() {( O' M" a+ G9 _; o
- return name;: h4 w r' F% q% M( i1 r! d: p! ]
- }
% r( m: `3 t7 E2 }0 q$ H5 d: g - 3 e; w; y: a' f1 b* f1 q3 F- r
- public double getAttackPower() {
$ L0 I$ @0 D) i - return attackPower;
: v9 U! J2 f! U; E, V) s - }8 X5 `+ r8 w) S1 F8 L/ B( u4 K! q, R
) Z$ V0 X7 R3 l) ]* q5 r- public void setAttackPower(double attackPower) {/ ~6 G) h- O" U! b7 S
- this.attackPower = attackPower;. G( U. @! o( j
- }
- L2 I# S0 _% V - }
! D3 o3 O) t1 n. {+ E( q, h, [! \
Скопировать код
5 k+ Q, c7 H9 D+ d- S) I/ r, _Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
3 v* Q7 _0 _6 V
9 O% j* S* w' X: }1 ^- // Пакет org.l2jmobius.gameserver.model.battle, W6 R) ?$ u& x9 ~3 v' w: c
- package org.l2jmobius.gameserver.model.battle;$ |% h) _% T+ A4 l% K' P" Q
- $ M2 K; `3 F2 a4 N
- import org.l2jmobius.gameserver.model.actor.Monster;1 ?( [+ _# e3 k2 j% b, P! D# Q
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;% g" ^% T" X) X; J% P
- import org.l2jmobius.gameserver.model.actor.state.FinalState;5 a4 i! p& g# s" a) V
- ! r0 Z; `0 f$ v, V2 }+ [
- public class BattleSimulation {1 N+ k( O) G1 m0 O4 A; m
- public static void main(String[] args) {$ _, o+ d+ E. ?) W9 X# p2 m
- // Создаем монстра с начальной атакой
$ \7 N2 N) \6 h3 A$ ^8 q - Monster monster = new Monster("Дракон", 100);( w- ~: ~% H T4 S# L
- 1 F0 v: {2 p& ~. H1 C. v
- // Начальная фаза% v9 m4 p* O- ]+ N5 ^
- monster.executeState();0 ^) ], o( J6 Q4 f+ {3 e$ Y
8 J V. R0 |9 I- // Переход в агрессивную фазу
# _+ l8 `: ?' D* D! j1 c \. z - monster.setState(new AggressiveState());+ }; W7 N- Q7 `# e+ G+ T" p
- monster.executeState();
6 u& G% U7 r7 F+ ^, { - % a, A- x4 c& |5 l; G0 r7 o2 O: Q; I1 z
- // Финальная фаза
4 x' t4 M, w4 t6 ` - monster.setState(new FinalState());
3 y. x- r( h8 q* w" q - monster.executeState();" x! ?6 f. ?& A$ @$ c/ h4 f) i
- }
, V3 e3 B; \) H2 {1 k; @ - }
5 c! p7 ]: \8 J, n
Скопировать код 8 Y n# K& j3 u6 W
Комментарии по структуре пакетов и классов:4 K$ c/ T$ T, [. u0 I( g% R- }
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
$ F, G+ j2 B1 R& P( W2 P ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
- p/ }5 O/ j/ ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!8 ^: n0 u) B* {* Z9 w3 h
* f. m8 |& R- i6 d
: F* w2 z! M3 S1 ~4 }5 D7 x& Y
+ _6 e! ]2 v& i$ O0 O' s O
/ E E7 o) ~# G4 m" A1 p/ @' a; S; L6 @! U
7 B. }: D( D- M/ c1 r, b
* T% G& p8 d5 U s
~' r# c2 T( ~: X; |/ |8 ?
9 o2 l- L% y3 f6 S4 F! F6 b; D0 C6 S. a. n" W \ X
# B) [* z7 u+ r+ e, _' l4 S0 o8 q
/ D" O0 D' Z' B' d& S# {! {
5 l7 s' t: I# ^" n0 X3 L' V |