Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
" a" E; w+ e2 ~& q0 g) `. D* R; S# l+ {7 o6 u
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра. C- B8 R' |' b
+ x5 m( K. \2 S! o% B4 oШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
$ r8 {$ r; ^: I% m4 J& q0 L
2 M" Z. F) p3 B2 |- // Пакет для состояний монстра
+ b: b" _. P& Z. T - package org.l2jmobius.gameserver.model.actor.state;
0 {8 x8 i1 F5 N' ]- p+ R* n
3 u+ c+ R3 W7 p# S9 Z/ v- // Интерфейс, представляющий состояния монстра
9 O0 l @) D- r: L - public interface MonsterState {
# k" c6 t$ f' @5 K# T# n - void handleState(Monster monster);+ T- L+ {7 n4 m+ W6 f3 @
- }( D) C5 S7 A5 N
Скопировать код
! O" N' f1 `& P+ KШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
0 Z1 s& b& ?* ~4 k8 a7 i1 t, q1 U' b* {
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.5 q$ `4 `2 d8 |: G2 P4 E# _
% @2 x6 E4 u$ f4 Z+ g
Класс для начального состояния монстра:- n4 x, c% l, H0 N) b
- // Пакет org.l2jmobius.gameserver.model.actor.state
1 _# b" V4 d" g% r8 k3 K( b - package org.l2jmobius.gameserver.model.actor.state;) m1 R3 B: J8 B) Q4 c% {( s' g7 h
- , |; ?+ m% L! r r- |3 F' ] Z
- import org.l2jmobius.gameserver.model.actor.Monster;- b% V, t% K/ j/ A h, e
- + D1 M6 P) @" ` w
- public class InitialState implements MonsterState {" y' {& j3 L5 D0 j- g7 [% H
- @Override
0 F& `, C" m- a1 _ - public void handleState(Monster monster) { e# v5 ]& E! o r3 v( I1 q, f5 D
- // Начальная фаза боя* L) r3 S/ U0 `2 w
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 D+ z1 A8 P" o4 c/ C7 d - }
) \0 D1 u5 ^7 ? - }
% D. R4 l$ t5 a* Q F, m, h
Скопировать код Класс для агрессивного состояния монстра:
" }. M- ^& h7 h9 h2 m; o- // Пакет org.l2jmobius.gameserver.model.actor.state
$ c2 Z% N$ k& ]4 r+ X - package org.l2jmobius.gameserver.model.actor.state;
2 j; y- Q% p- ]/ _. D' ^/ Q7 k4 ^ g
$ f c, [: \1 \6 I- import org.l2jmobius.gameserver.model.actor.Monster;
- d! C6 n4 ~0 G" U' k
: Y# V7 u$ w6 ~+ ^% l% j0 K- public class AggressiveState implements MonsterState {
1 _2 ~; _# r& T$ T - @Override
8 i, P+ Y& Q3 M - public void handleState(Monster monster) {4 g5 `7 f4 W0 C$ U ^& m6 O- p
- // Агрессивная фаза боя
( J% R# |5 h( H; E9 P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");5 I5 @5 s& G3 a" W% i1 x# g1 p
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
) }" o! y/ f; W. ` - }6 ~. l: ^4 M4 v, C8 m" Z
- }, B' j: y% ?4 E4 L! A" ~- @1 ^8 ?/ {
Скопировать код Класс для финального состояния монстра:7 Z$ P# B8 Z, W
- // Пакет org.l2jmobius.gameserver.model.actor.state, s3 T% N6 G: G! u' E
- package org.l2jmobius.gameserver.model.actor.state;
@4 {" T4 _: ]% m1 G0 m( M
% S# x& f$ i; H9 M7 J2 r9 y- i- import org.l2jmobius.gameserver.model.actor.Monster;
' h$ f( G& k0 B* R2 s2 r
; e# B6 ]: M; M1 w8 O2 i& Y- public class FinalState implements MonsterState {
9 @1 `) k; t0 e9 M1 | - @Override: ]3 m4 I) J# ?6 ^8 d0 D" ^- j
- public void handleState(Monster monster) {; f) E+ t) j' ^+ g0 C
- // Финальная фаза боя
$ l5 Q/ L* G% y! I5 ?1 m: J$ W3 ~ - System.out.println(monster.getName() + " готовится к финальной атаке!");) Y2 I3 V& D1 E6 }" A4 `
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки, ?, G5 U7 @/ l, C
- } X9 w. V% |$ X% T. N5 l0 G
- }
4 i8 z( ?5 k$ ]- u' z4 f7 Y& w
Скопировать код
' P, F' A3 S5 \# W8 _Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 \& S7 c0 g& P* o7 v" k
- // Пакет org.l2jmobius.gameserver.model.actor, K- Q6 t$ Q, B0 H" U; T5 b: i9 _* f9 K
- package org.l2jmobius.gameserver.model.actor;5 |- Q0 y* x/ ?) {0 o
# k, u: K: o. d- import org.l2jmobius.gameserver.model.actor.state.MonsterState;" f" y! _. Y1 r( F, [4 I
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
1 d4 s, R+ [0 z/ P - ' m. A, z/ I1 T1 ~
- public class Monster extends Creature {. H: O% S9 q5 P+ T R7 ]
- private String name;3 r( x1 q L |, f6 Q4 }
- private double attackPower;
$ i3 k, W! C5 b' K - private MonsterState state; // Текущее состояние монстра
: [0 E. y( B. `/ D; t' H/ f - ! G! Z& Y0 [/ P/ v# @% E1 ]) Y
- // Конструктор монстра/ L8 l$ P9 P; ?! v F
- public Monster(String name, double attackPower) {/ G2 q- B% F$ P; k* U
- this.name = name;& z" G d& C. ?- S" j; H+ i! @
- this.attackPower = attackPower;/ V( y4 F" d! I
- this.state = new InitialState(); // Устанавливаем начальное состояние
7 I; N6 x% z8 I% E) A2 p# y& l - }
' ^3 J8 @/ G( l: f4 V; v; f - 5 ^. m. y P9 j* _! v! @& |2 Y d: p
- // Метод для смены состояния! p' K) x' J+ K7 V0 ~
- public void setState(MonsterState newState) {8 n/ P# M6 @; A7 y
- this.state = newState;4 Z# ~& U: `- w6 e% W) z: A |+ U
- }
) S; c7 P7 {$ N- F/ y - 4 f5 g; n6 ~& h- a: V R+ s
- // Выполнение действий на основе текущего состояния# V4 s7 ^7 f4 T/ l% G# N
- public void executeState() {. G0 K& g/ e- A
- state.handleState(this);
7 |. U) [( @; X' s - }
2 n6 {# K/ u, m9 y7 U8 v$ _! a/ V$ g
9 I6 b- Y: l% |9 ~! c8 \; f5 }( Q! ~- // Геттеры и сеттеры* _) `% b) l) W
- public String getName() {: `0 A$ m) `+ [% O$ d
- return name;
# g$ E% g) y# i4 G8 o' I - }7 i5 p. x" c4 T/ d r$ J4 J
2 Q2 E( C+ z- e5 j2 Q- public double getAttackPower() {
- J+ |' \ b( u: t8 O7 B1 F* D - return attackPower;
% o: [# ]. Y1 }' { - }% l8 w, H8 b+ X
8 Z- k. }7 E0 g0 c, z8 n- public void setAttackPower(double attackPower) {
1 X# g* v1 l: Q# p1 x+ U/ [7 p1 ^; C/ b - this.attackPower = attackPower;4 e* I& E5 x" }6 u% R e- c3 I8 Y' |
- }# P/ p" l+ `5 D& b h
- }# ~0 @3 X, a3 O1 {2 p6 Z
Скопировать код 0 d( t& c# z3 \0 w
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.0 l$ |. T/ H. E: v2 S) a5 R
+ ^* P% g [# e- p* Y# \- // Пакет org.l2jmobius.gameserver.model.battle4 Z' y& p# z! ?3 q
- package org.l2jmobius.gameserver.model.battle;; |. z0 ~ @9 O2 N5 M0 K
- 1 w# z4 }& i( t* b* ~
- import org.l2jmobius.gameserver.model.actor.Monster;! ^# I+ B) r8 r2 c9 F4 s: m
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
2 G2 Y" K6 h3 S; T( S# X! Z+ {# }: P - import org.l2jmobius.gameserver.model.actor.state.FinalState;% ^- Z9 d1 X% Y$ A, W
- , t! S2 w O6 n1 V, {8 _+ v$ r* ]
- public class BattleSimulation {7 x8 x- J; X) `( V, t. y4 h
- public static void main(String[] args) {- C6 b1 F ~& |5 s v, e7 w- \
- // Создаем монстра с начальной атакой; R' C# g2 c/ e% ~
- Monster monster = new Monster("Дракон", 100);% v* Y& k. m# f
* U/ m' _- t1 j3 {" a- // Начальная фаза" B9 e" T0 o% a& D6 `) L! S
- monster.executeState();2 ]& D4 X5 o- T, h
8 u& Q* F' g! `- D0 I% U( r- // Переход в агрессивную фазу3 b9 s9 J) N; o' q5 A, X4 o6 X
- monster.setState(new AggressiveState());
$ m: C8 Z+ a" D$ M' B - monster.executeState();
8 R4 y6 d2 j8 L) q5 x0 ?+ S5 z
$ n0 w" o6 v2 {+ b+ A/ [5 b- // Финальная фаза
) P0 W! N9 Q% u& ?/ z- a - monster.setState(new FinalState());2 t5 ?4 w( p+ S1 t9 d& L" t
- monster.executeState();: p! S7 o; F# i/ h$ [5 t2 t X; l i* r
- }6 q' S, i+ O3 Y: e/ T
- }: j: q" N' B8 ~) y
Скопировать код * t/ D, J/ I7 }3 q
Комментарии по структуре пакетов и классов:
! [# g. |; [" }- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
1 F0 |6 ? w' d ~0 W& {3 Q: Y5 p ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
, j% M- n# G& Q8 N; ?Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!6 z( I0 b* i* O+ M' ?- r/ I
( u' N) j1 g) G1 j% ~
0 P4 J' u9 w+ u$ n* P" M2 W0 s$ x4 I
3 H+ u$ @4 X8 V. a4 S
" Z2 j' |( [; U8 K6 f) W) C5 @% R+ {( e" Y
! L1 n6 a0 V/ Z& p( w
. n7 Z* [+ }* n6 R7 `
9 h, X) r9 `, K+ h$ ^+ ^+ W6 b
7 f6 g3 C, q* q. @) R$ |& j$ y% U( z- ]7 w4 W% n/ O
" l1 r! U6 R, X+ r4 i8 V1 `$ H
' N* v0 G" e# k5 h9 P
b& Q! J2 J; v1 w4 x$ \0 z |