Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). ' A- T$ S1 W7 x# a' t9 b
+ g; p5 E$ o z% S4 Q' Z0 c9 m& R
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
D2 @' Q' P0 m) ?. L9 N& z8 H5 I+ ?* W, w' F
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.- ^0 R9 }0 I' {- X; m: ^) P
$ V( _. N9 E- a" p1 M- // Пакет для состояний монстра6 P0 P8 D! W' Z# w. a5 ~( {
- package org.l2jmobius.gameserver.model.actor.state;
6 s- N: ?) k1 K
g- m; ]& r6 \% X' \7 R" D! x- // Интерфейс, представляющий состояния монстра
7 V, ?4 `& C7 e7 m - public interface MonsterState {" {( W1 R! Y3 N' ~
- void handleState(Monster monster);" C8 T' q' Q/ |: I N
- }* Z0 b Q% D# d, k5 H7 C1 t/ L" ]
Скопировать код
0 o i, X7 W4 x' ` m( H( n3 WШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
7 d7 i. q6 Y/ O; |& E u! |% X
+ `6 U% A: M5 [9 r+ ]5 ^8 l7 jЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
# ~' d1 ~ u) L. G+ m% u$ u
, k, S2 ^0 d4 p* C0 d$ fКласс для начального состояния монстра:
4 F" Y7 @2 l! M7 s) O: o( }- // Пакет org.l2jmobius.gameserver.model.actor.state
- J4 d8 M. l0 e% c6 i& u3 R - package org.l2jmobius.gameserver.model.actor.state;
- J8 {+ |2 T7 P; P
. K+ o. C! x; p1 n% H- o( W- import org.l2jmobius.gameserver.model.actor.Monster;
* p' e; {* H; H$ @ - 9 F Y9 s K% G1 P e4 o
- public class InitialState implements MonsterState {
& D; p& q, Q" z - @Override; Z4 n6 y% o. x/ o% j
- public void handleState(Monster monster) {( n3 }9 A$ k; N/ s
- // Начальная фаза боя% L0 ^, `3 C! y+ [9 r! W
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");3 ^$ Y1 N( S0 A8 C. U
- }' _. _7 i' H8 ]. k+ W: U3 _" M: H3 I
- }. k% h8 x% _2 ]
Скопировать код Класс для агрессивного состояния монстра:
+ Q; A$ A( r0 X; i& |: r1 s b- // Пакет org.l2jmobius.gameserver.model.actor.state1 E4 ]) b0 o" K; L* r% o
- package org.l2jmobius.gameserver.model.actor.state;
& [; Y7 _: L/ h
, B. @# V- ~3 w) }* n- import org.l2jmobius.gameserver.model.actor.Monster;- B* [. }8 Y9 ~7 ^ i0 M' G: R
$ q6 U; T; }: E1 s0 K+ N- public class AggressiveState implements MonsterState {& G7 o1 }( d: S
- @Override
8 ~4 B( b: ~6 u- @/ c - public void handleState(Monster monster) {
+ L, [0 ^# Q; f& S3 G6 B! E. {- I - // Агрессивная фаза боя
& A) Z: ^- Y7 Y8 A6 W - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");0 _3 Z" L$ Y& U9 v/ ]
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
- e; a. ]* y% p( T! n' T" p6 O - }; o. I; [: b% f1 ^& [# E
- }4 z4 E6 ] d( M( g9 g) i
Скопировать код Класс для финального состояния монстра:* v$ @5 r) y G/ @$ O
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 Z% q. L/ }& i) o- H - package org.l2jmobius.gameserver.model.actor.state;
) |$ {- a, d, w% E7 t - 1 ~% K, [8 P6 d, M6 ?, z
- import org.l2jmobius.gameserver.model.actor.Monster;
' Q# x: E9 u% i* e% v8 O7 {. D- m - # {4 P- e& M) A0 |% J' Z& ]
- public class FinalState implements MonsterState {; ~ [7 X0 n+ B6 m
- @Override
( u2 V& f5 P* ?) w6 p% D8 \ - public void handleState(Monster monster) {3 ~ S3 L$ J" ^6 |5 R! n) X
- // Финальная фаза боя
3 X% ~+ `1 c p- ?+ X - System.out.println(monster.getName() + " готовится к финальной атаке!");+ D/ {: [" ?* ^) v& r; `
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
: D- }" v3 P! _! \$ u1 \1 ` - }6 i+ f3 b+ P ]( s' n% |7 }1 F
- } Z9 ]* f* m) z5 A$ R% ~
Скопировать код $ p. ]0 Q" t9 ]
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- a, ]2 d) u* z& f: U) L1 S- // Пакет org.l2jmobius.gameserver.model.actor
# p3 |/ a' g6 |1 B9 S! n - package org.l2jmobius.gameserver.model.actor;
2 o: U# j$ K. g$ d! r. E - 9 m J- K3 x8 e9 I8 [7 d
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 D* w; t! X- P# m+ `; T6 X1 A
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
8 K# u' r( K* e6 R4 R
4 l0 j1 b8 {# j9 i' b- public class Monster extends Creature {
4 a6 i* N# f3 K* p5 A0 I2 ^ - private String name;
1 Y* V: H5 y; h* j - private double attackPower;
5 a6 d: p1 x% |6 z# G6 N( _3 V - private MonsterState state; // Текущее состояние монстра! M1 S" C$ A0 _& m( g% @$ [
! {1 {& F8 ?& Q2 r' l- // Конструктор монстра
/ C9 q( q! M+ [" @3 ? - public Monster(String name, double attackPower) {
: B9 P. c1 W' A, _/ _# M - this.name = name; E/ @' ], s k3 `; ?7 N' F
- this.attackPower = attackPower;
( T! t/ D3 t2 U D( q - this.state = new InitialState(); // Устанавливаем начальное состояние
( A. E ?+ ~! ~, d, ? - }
+ h; x8 I k: R
! f4 U- h$ x9 R# c% H- // Метод для смены состояния" Q8 D9 u( l4 Q! z
- public void setState(MonsterState newState) {
: y2 Z1 l" [" n# x7 z3 k& R - this.state = newState;
6 i, g/ ]! D! O2 R- U/ n$ {' u - }/ x7 m% y7 Y- [: H/ j# J
+ o1 w/ f" @9 W$ G' k* R. p- // Выполнение действий на основе текущего состояния
3 S# U9 N" Z' K) Z5 q6 K - public void executeState() {
" [% q$ B- U1 k6 s8 I1 G% F" u' |( C6 ` - state.handleState(this);
* ^$ F* S) J; \# X% \2 [3 ?1 }6 ] - }
2 T- ^' g0 ?; g( R
/ K8 `) ?$ `2 N$ v9 X- // Геттеры и сеттеры
+ }' R" s2 O8 Z8 V; q - public String getName() {) Z% G' S2 E& H1 K9 n/ ^
- return name;4 c' K4 X' i- x' [+ c6 E2 {
- }
& j9 X' o+ n/ x5 @4 r4 p& M. }! t4 j - / t$ \. }9 Y- g( ^6 _) |* x
- public double getAttackPower() {
2 s8 ]- o( u9 ]1 b - return attackPower;
, \5 G& J! L" \3 u - }1 c g: _; |0 X
: m- V/ ~$ N1 w, ]: M% f1 p- public void setAttackPower(double attackPower) {
" i) {* ]0 l/ x" f+ T: W - this.attackPower = attackPower;3 o5 q# A6 D& `; P+ U @
- }
, a! N. f. h( w6 @ - }( T. y; o! G. M8 A3 I
Скопировать код ) }' y: `1 X1 L& e# A9 v
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.6 U: a- `6 g/ J( z
1 r1 I. {% L$ h3 |; G
- // Пакет org.l2jmobius.gameserver.model.battle. z% d. m% d3 N8 h
- package org.l2jmobius.gameserver.model.battle;
( p/ l4 T( R9 H! b - ' g1 X1 [/ F9 I! v$ s) l( q! R
- import org.l2jmobius.gameserver.model.actor.Monster;
% ]5 D) V g" r1 X' E8 C- X1 E - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;: W) {3 ^' t0 u) u {) M1 u" v& u
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
) N2 D. `& r8 o, ?2 z
0 F4 f9 v" Q9 {' }' H- public class BattleSimulation {
; ]7 O$ O) V/ P, X7 b# e - public static void main(String[] args) {; B; h; I" x9 W, E
- // Создаем монстра с начальной атакой d5 L) x1 e+ e- x& Z$ `) a" E$ S5 L' E/ R
- Monster monster = new Monster("Дракон", 100);
7 B* U1 J" L% c1 w- [- g
& j2 R( a" ^. _# r- // Начальная фаза
( }% b! s0 {( C+ E& ~ - monster.executeState();$ L0 u9 A! }4 i6 U& ~
- + z. Y( x# i# N7 H0 S
- // Переход в агрессивную фазу. J3 w n! b' X& y: n( N: u
- monster.setState(new AggressiveState());
L5 u" F* [% X0 ^2 b- s+ G6 \ - monster.executeState();
/ ^ W- q7 o. B& f! I" ^6 x, [! J. d& s
/ X5 h+ ^' ?8 r5 K& d3 z# n+ P- // Финальная фаза
) \$ Y! i* |% g$ d4 F6 `" w - monster.setState(new FinalState());
. e1 Z+ c/ o$ A$ Q - monster.executeState();6 N3 p4 W9 Z( @- W
- }# ?7 N. u, b1 `
- }
L E7 F# L, F: u) i) `! z
Скопировать код
& f% R5 S& Y) s9 j9 aКомментарии по структуре пакетов и классов:' N* }& ?7 z" I2 j$ b9 A6 Y e
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
8 F* J$ y, g& s D8 N4 n ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код. A' ]4 X4 T2 M, u5 t) l+ r7 ~2 T
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!* B4 I+ G V* R: x
: \! r* v# n& j) y
w; a2 M; B+ g( r! c; B
' k' s' C$ p/ b/ i. J6 t7 a' f
5 E7 }6 a5 S0 E- w9 M9 i* q
1 {8 C2 ^0 R* s; O+ a
& `5 q) B8 ?% f& h4 |* V: X/ ]) b3 W& o/ C8 q0 n
E: u( }8 n. A s9 O
" J+ g. g% V& n% V
- }1 ?; H: e+ i* |; w2 k
2 q- p! t8 y, D3 |/ h, O
! O9 g- E6 ?# t3 Y3 G( H
+ [5 y2 ^! J/ c' e
0 H( d4 s1 V c3 B; Z) [$ P# F |