Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ t) I+ g6 I! P, |! Y/ P+ W5 a
& e7 y6 @# C3 cЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.1 X' `, U& J9 x8 ^" u# S
. q& Y! l$ }% W2 h" r9 D/ X) F3 z( ^# N4 X
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния., |3 W" I2 l) L
! V* d# a% c8 X9 ?
- // Пакет для состояний монстра
! ?/ Y4 E3 S/ I9 c9 a - package org.l2jmobius.gameserver.model.actor.state;
5 E) q& M' o1 J) G! t0 o8 | - 0 @/ D) `7 i) s2 V( K: N2 y
- // Интерфейс, представляющий состояния монстра, A( i0 I f; E$ K% o4 H2 ~+ C% e
- public interface MonsterState {
( {+ q$ Z1 X0 q - void handleState(Monster monster);5 c. t5 @* t0 Y5 R
- }
r+ k# T o5 D9 u( x
Скопировать код
8 c% H9 A F5 K* `5 W/ g* f# V% `Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
+ W' F% | a; Q9 O1 d) E& G+ [$ O6 Z* W+ t
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
w6 c$ W$ M1 g$ A7 b H
* Q4 U7 ^* C! ^/ mКласс для начального состояния монстра:
; ^% r; K9 G9 d* t- // Пакет org.l2jmobius.gameserver.model.actor.state6 D$ C. o* C6 ~
- package org.l2jmobius.gameserver.model.actor.state;
: h; H- q8 Z! P+ l) X0 t% W- i
`' _/ }9 Y& y) x- import org.l2jmobius.gameserver.model.actor.Monster;
, Y7 b F+ l- F" V8 _* M
8 N2 N/ H8 u& M+ L8 e- public class InitialState implements MonsterState {) c% [4 k' \# Q" x( a! Q: W
- @Override2 W' ]7 p3 ~( G+ t' Q
- public void handleState(Monster monster) {
% k/ c6 T' |" v6 t3 z. R - // Начальная фаза боя V. e. N- `0 U% o0 `! F8 @! r. m
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
2 b$ |0 L# `9 C9 \/ g) Q. @$ P$ e8 u - }% e' h% ^ s7 H/ t+ N
- }/ T" q8 a& K3 P9 K" o! L3 Q' k
Скопировать код Класс для агрессивного состояния монстра:
7 P' W$ O8 I0 B% r# |- p) c+ x- // Пакет org.l2jmobius.gameserver.model.actor.state
n: E& o) |7 `2 i( p( F9 _ - package org.l2jmobius.gameserver.model.actor.state;$ Z- f1 Z5 Q, G7 X I
. W) q8 l6 P, ~9 `, C. S0 C) y+ o- import org.l2jmobius.gameserver.model.actor.Monster;
3 y/ ?5 @" B' \# O H; T" R0 P- E. v& }
, U7 k- k) S7 K; e% g6 R* ?- public class AggressiveState implements MonsterState {
3 b. a: K( `8 h& F; A' Y5 ] - @Override
$ b! ^: r1 z4 I8 m! R2 X4 g6 p' J - public void handleState(Monster monster) {
+ R4 m$ J* }' z+ Z% r! M9 G - // Агрессивная фаза боя- B) h' j& p' g; C
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
+ D9 S: u' u) w& B/ L/ e - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
# o$ i! B2 f( X, y; w! X - }
5 o# ?9 }, q, B$ I' S7 C+ H- G - }4 K: H# |8 g& B+ Y6 G6 i: r
Скопировать код Класс для финального состояния монстра:, i% E2 K) m: q& m
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ b4 I! l. g. h6 F4 l - package org.l2jmobius.gameserver.model.actor.state;
/ T0 J2 Y; b( p: o9 K; Q
: t% g2 g( S! t8 D0 P+ ~- import org.l2jmobius.gameserver.model.actor.Monster;6 R9 w" c" y; K. d) L' O# p5 X
; ~6 q6 X2 U, E# \2 N/ p7 b/ d- public class FinalState implements MonsterState {7 f2 E7 s- t$ J% W% E8 h
- @Override% K" F, j+ b/ q+ I
- public void handleState(Monster monster) {
" T1 h6 ~8 j. n% I) a7 {; u - // Финальная фаза боя5 f8 R" |7 Z4 M! T& G
- System.out.println(monster.getName() + " готовится к финальной атаке!");
# ~% R0 B4 d4 @5 P+ V5 f - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки$ T# z9 x/ a+ |7 S8 Y5 c
- }
% p1 k X8 `* g( P6 R - }
) {# H/ ?' H% e* G& u( H
Скопировать код " Z% P" p# D$ p8 i e, {/ L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
- i( V B! _ }5 k' P' G- // Пакет org.l2jmobius.gameserver.model.actor$ y6 N* T- l( i/ |% f
- package org.l2jmobius.gameserver.model.actor;+ x( K! M4 d% J( o0 n+ k7 d
& ]5 F9 N6 J \% q U; l- import org.l2jmobius.gameserver.model.actor.state.MonsterState;+ p# e- J& X4 o: `
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
# A2 G9 P9 P! F1 a* @9 i
1 y5 P3 f" y( K/ z5 y0 c2 r! \. I- public class Monster extends Creature {3 ?% w! ?. l' ]0 J# h
- private String name;
: K( U6 L3 i2 h" S - private double attackPower;
, h! g0 I3 ?* R- m8 i9 q( f - private MonsterState state; // Текущее состояние монстра5 L+ ?* e4 i0 y( |6 H
- 6 E0 n5 p3 D9 G- o4 C- p* V
- // Конструктор монстра! T7 u5 d7 O$ e5 G2 r' x4 s- G
- public Monster(String name, double attackPower) {: n9 i- R/ Q# O) B& W$ Q/ [8 T
- this.name = name;
0 V- [7 t6 M* ?3 K. M5 X - this.attackPower = attackPower;
5 c+ D7 m8 i9 U7 ^ - this.state = new InitialState(); // Устанавливаем начальное состояние. Y9 T7 M/ ]) a1 ?
- }
3 z9 S! b( c% w* O% w6 T/ Y - ( o; g4 r, [' G5 }$ a G# A3 X/ V1 a
- // Метод для смены состояния9 r, ^( p! T- l8 ~) H" S' J
- public void setState(MonsterState newState) {# U/ {% L' b/ F! E3 ], M, n
- this.state = newState;$ W$ V `0 T2 ~3 R0 ?" s* q+ l
- }
* r. o. }5 X6 j7 q. w
- P! N6 }/ D- V- // Выполнение действий на основе текущего состояния' n) n4 O0 [4 G
- public void executeState() {
- D3 u; c P8 B& f - state.handleState(this);; \8 d0 i: D- F. q/ E; @* P4 M
- }1 x; O* B; |; c1 a
- $ y! g& C* {5 K# w' x8 U' k
- // Геттеры и сеттеры
% |4 i- b4 A2 @4 S+ a/ f - public String getName() {2 Z/ `1 E8 h5 c
- return name;' r( C# p! l* d* G M \
- }. k' w+ A5 e) N% E( X6 A# D
7 L9 S. O* q8 s4 H4 {5 K- public double getAttackPower() {( X2 I, [! K! S# X
- return attackPower;
- l6 G4 L& p8 u7 N, Y, f. n2 I - }% y+ ^. Q8 Y: p" ^
, K3 y$ ?- ]0 v, \) h L- public void setAttackPower(double attackPower) {
9 H5 I8 R3 G [) i3 T - this.attackPower = attackPower;
$ ]* }) B8 g1 T; k8 ^/ n; C - }
$ s! r2 H0 A+ Y) y7 ` - }9 U! x( |" ^% o+ x# \
Скопировать код 8 E8 _% M! h. G! i& k- a
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.1 _9 w$ s& D( O w! N& x: x/ h
& `8 _ {% T+ N, t; s- // Пакет org.l2jmobius.gameserver.model.battle
' t9 |2 Q. j5 E* t! w - package org.l2jmobius.gameserver.model.battle;% \* r+ f( }! S) l b
- ( B0 w; g7 s% _1 Q9 j8 {( M" ?
- import org.l2jmobius.gameserver.model.actor.Monster;% j% L. b$ Y3 N: {: m" ~, W
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;& G) h3 D- B' l( R3 \
- import org.l2jmobius.gameserver.model.actor.state.FinalState;, r' O% P0 ]0 ^1 r
: y2 Z& K# D+ Z- public class BattleSimulation {) M2 \( e2 }# b5 D& |
- public static void main(String[] args) {
+ T+ l3 W5 F) Q3 B - // Создаем монстра с начальной атакой
( o t5 w% j9 z& f6 ^ - Monster monster = new Monster("Дракон", 100);8 A6 I: n2 `, }/ q& X. z
- 0 c$ z% r$ B2 d- p
- // Начальная фаза
/ T1 j+ p% ]( t# i1 c7 f - monster.executeState();
/ {5 S* q% c8 N& c
( B6 K0 c, i& Y- // Переход в агрессивную фазу
, @* a3 v" W) q! @7 m: R - monster.setState(new AggressiveState());# k8 _0 S# w$ G: K, R
- monster.executeState();4 Z- M5 K1 u4 R7 O4 \) e* j k
- 8 O- K$ e; I9 o3 B' ~/ ?
- // Финальная фаза
6 P- ^8 e" D4 K, H) |4 }8 ? - monster.setState(new FinalState());8 [" N& N) \7 ]3 u) z
- monster.executeState();: Z. K2 _ z$ f9 { _( T
- }
* P, x* G8 `# E - } r8 p0 ?% B0 H! T% @
Скопировать код
% t" n8 R7 R& R6 kКомментарии по структуре пакетов и классов:
% V& N' M: y6 j- H, J- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
, w, z5 N9 J4 p4 b+ p ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
; H" n% i8 a& s1 wЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
" E2 T3 V9 ^- ]5 c0 A, p/ c5 t. L, F9 @
! ?% e" M/ @( \) Z' r. I8 r% S
! Y% a! M* S6 W+ [4 }. M/ O& h/ k. K0 d% O& m A$ j Z/ Y% m
! o& s" C$ Z% Z- E" h
- c( B! v# ~, F& a; n& {; s! ?' i7 |6 y c: X
( ~* u! w, P1 ?1 o6 @. `) p
% K* ^( a2 d# N" G: T/ `9 O, V& w8 G* i. @ b. {. t
1 L4 {) i0 z; L# X+ Z, m, Y
* }2 J# `/ ~6 E; g+ g+ ?
5 H9 {9 @5 T9 g1 P1 q7 _# S
0 v: P! b3 H! N4 C |