Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 7 i' Z/ L) c$ A2 u# G
* H; c9 M Q2 d+ S. g" k* U
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
- [1 s3 Y& i; Q, F, K: g$ B- d1 Y. G. [6 f [
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.+ }2 l- l U" x) `, L3 J6 U) G
. J3 f/ ^, H2 V$ ~- // Пакет для состояний монстра
7 }- _' y; {4 x! S8 O: k - package org.l2jmobius.gameserver.model.actor.state;
R3 m* p3 |/ X1 t0 e, g5 C, z
! J( ^0 W j6 v4 x; S1 \2 m. H- // Интерфейс, представляющий состояния монстра2 x# O' J- H2 D/ ]
- public interface MonsterState {5 s4 U1 M4 j! w0 L( \7 ?
- void handleState(Monster monster);
6 E) k B$ O( |. b - }
1 v: ^6 s! ^ Y& y
Скопировать код % @4 b* x; P' C0 Z& B3 p$ O* Q
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 0 ~( m1 F, x: W9 ^+ M7 {: K
- s% T8 u+ h# u, G- F
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.; e# H5 S& H) O" C3 o4 F* f
% P' S% @9 z+ ]Класс для начального состояния монстра:6 h% I9 m+ m' B" L+ l& x
- // Пакет org.l2jmobius.gameserver.model.actor.state2 ^/ i4 j7 P3 G( j: @- c
- package org.l2jmobius.gameserver.model.actor.state;: c' z. F5 D# S* I2 P
7 l( }4 R& \2 K; b3 Y& D% m- import org.l2jmobius.gameserver.model.actor.Monster;9 b/ s2 z" e2 [' |& u' u# W
- " l6 g9 o9 r8 e
- public class InitialState implements MonsterState {! s( B/ d- m0 G7 t7 w K
- @Override p) x0 \+ X% n3 ]$ r0 w$ v
- public void handleState(Monster monster) {
- M8 T1 T( d, d3 E' h - // Начальная фаза боя
4 p& h+ [2 L" y h% A! D; Z - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
$ [ T3 t Z: x/ A& \ - }* g0 l3 E5 w! V4 L& g" n: w8 i' ]
- }& s4 ~3 u7 Z. U9 _
Скопировать код Класс для агрессивного состояния монстра:
0 Q' a8 ^8 M( o, x m- // Пакет org.l2jmobius.gameserver.model.actor.state1 y" N! ]+ l5 e& C
- package org.l2jmobius.gameserver.model.actor.state;7 l& p! W% z/ |! ^ ?) P0 E' p9 Z9 V
- ; X' J! M) k* Z. L0 R7 \
- import org.l2jmobius.gameserver.model.actor.Monster;
* D/ c) F5 F: e
0 L' A( U# a- H* g- public class AggressiveState implements MonsterState {
. F; D1 L8 P$ k/ S* o1 D - @Override
: [+ F) d m- s- |- H - public void handleState(Monster monster) { f# R1 G& k8 v9 R
- // Агрессивная фаза боя3 ^! Y# A1 n. ~4 b7 N( i) P6 e
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
, w: B) [7 ^7 N+ Q: v - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
( Y, a3 S" G$ G" P! @+ e( v - }
$ y6 C8 X9 s6 H0 | - }" [1 u! W( f# Z9 f/ m
Скопировать код Класс для финального состояния монстра:; H% J- O0 X s; @/ ]
- // Пакет org.l2jmobius.gameserver.model.actor.state0 ]2 h( j- y w9 N! n% N7 Q+ {: ^. a
- package org.l2jmobius.gameserver.model.actor.state;
' a. d+ S4 L8 v: i
@) A# }. d+ P9 Z- import org.l2jmobius.gameserver.model.actor.Monster;
7 Q ^. O, @1 }1 O6 A: D% u
7 B R( x5 X' ^) R8 L E: n- public class FinalState implements MonsterState {
w7 q$ Y$ \' o: F, J - @Override: M. z/ T/ ]6 G! H1 z6 r; }- m$ w2 f' |
- public void handleState(Monster monster) {1 l; `% P* ?# M F/ u/ A+ V3 s
- // Финальная фаза боя0 y0 h0 g+ P- ~8 A; V+ J8 o+ q
- System.out.println(monster.getName() + " готовится к финальной атаке!");+ _ x J" q2 ?
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки( y; q, h1 h& j1 k" @5 g
- }# k* L4 W9 h- v) i& P
- }
) O' R7 v {; i4 F' S# h
Скопировать код / n7 K. Y6 e& F9 o+ a
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 S* N' z0 A4 V! E) b( l) f- // Пакет org.l2jmobius.gameserver.model.actor9 n6 r+ V2 _1 u9 B5 h
- package org.l2jmobius.gameserver.model.actor;- q( x7 N2 `; ^0 d
- " b9 c# b* o3 K- A2 ?5 w* ^
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;5 W6 g+ {# B8 l0 Q1 k
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
) Y$ i9 g& A) k5 `
5 m7 Z3 F/ C9 w; m; p* q, }6 i- public class Monster extends Creature {
/ V4 Q0 W4 G X$ D/ M* k, W - private String name;
/ u5 t" a+ v6 T9 q) a" ^, C - private double attackPower;
& y y& F' T* U5 k$ R+ Q - private MonsterState state; // Текущее состояние монстра9 Q) W+ n" y+ A+ c. F: L
- 9 D& L) v$ X3 Y# ~
- // Конструктор монстра5 Z' a$ \, V, C! J' q% E7 D5 x
- public Monster(String name, double attackPower) {
$ I1 R3 C! k2 _6 l$ B3 U9 ] - this.name = name; }( Q" ~5 @6 H; x# s
- this.attackPower = attackPower;
y/ s( ?" Y7 Y1 ^2 ~+ i( P - this.state = new InitialState(); // Устанавливаем начальное состояние; X, F; C" X3 H! a" ~' Q
- }
8 w3 W$ |/ p& A9 k5 T/ w; {: i) G3 [
5 V Y- f. ^7 I6 a: V5 u- // Метод для смены состояния! y' Z- j) ~9 |+ y
- public void setState(MonsterState newState) {1 t% c* b9 s; u0 ~
- this.state = newState;4 B# b6 T, x. b- J
- }
+ `0 L i" O8 M2 t - * I) k9 t6 e- Y! C( d2 O7 y- f; N
- // Выполнение действий на основе текущего состояния
( P" v+ {, o/ ~# E% U6 V - public void executeState() {" u, D* n2 i; S1 B) C
- state.handleState(this);4 l' @0 q2 a" J9 w# U5 ~, c: g- _& J
- }/ @6 }' K2 F0 N8 c+ X
- 2 D+ [7 S7 }9 A; U0 L% d( D
- // Геттеры и сеттеры; r/ g+ g [6 d/ @; K8 i1 A
- public String getName() {
- `( c$ U( S3 n: I, g - return name;
6 ~! V" s3 f6 z8 {0 M; x - }* f0 q* X8 L/ ]# A
- # Q+ I7 P4 z8 G j) d- a
- public double getAttackPower() {8 r) h) p( f7 m- R. `5 K. @0 g
- return attackPower;
2 C4 S( Y: u5 ]: }! i8 V1 v* x. f& T - }! z2 R2 G: ^4 ^
- ; u. f, K6 p# P! ?8 I5 `- U& L
- public void setAttackPower(double attackPower) {
9 X. ]3 _9 C. Y - this.attackPower = attackPower;
) B6 }0 h* F; N8 R2 K m2 @ - }
' f; r3 X0 l9 O" X- K6 z7 n - }# p- F1 V Y2 D/ H/ n
Скопировать код 8 @' C5 U5 ^4 W A
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
! f+ k1 L# k8 m7 i2 e, _& B3 p4 c% j1 o: z2 E0 u8 I l
- // Пакет org.l2jmobius.gameserver.model.battle, i+ B' r9 X, X7 E4 u
- package org.l2jmobius.gameserver.model.battle;
* ^1 L h/ O0 w* M
+ T* P A% [: G; w2 j- import org.l2jmobius.gameserver.model.actor.Monster;6 u& w: U+ E' B) X$ ^) u- X
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 ~" A+ n6 R' s( O0 A: k
- import org.l2jmobius.gameserver.model.actor.state.FinalState;; n2 t( k9 ?5 B( P4 A O
8 N( I: W3 u' w, m- public class BattleSimulation {
0 t% _# ?, I% H+ J - public static void main(String[] args) {5 {" S e) @* w! d
- // Создаем монстра с начальной атакой
3 R6 Z, r- S# [$ ~ - Monster monster = new Monster("Дракон", 100);* j4 F, q& w% ^
# B8 U$ W( E1 d+ Z2 g- // Начальная фаза
; @6 Q2 e3 F0 V6 a! [ - monster.executeState();: m" ^/ v' U( F: J
- + h' k3 q) S! G
- // Переход в агрессивную фазу
' D! d3 ?% {, ^ - monster.setState(new AggressiveState());/ a3 d- J1 q; `7 l$ L
- monster.executeState();4 {3 T& L2 Q% j6 C8 Q
0 o5 v: ` W* E! W5 U% Q- // Финальная фаза4 x$ i" s7 Q% @" U2 Y+ z9 q1 K
- monster.setState(new FinalState()); I' R4 a, Y7 g v7 b1 F. v5 d, }8 H
- monster.executeState();
Q: I8 g- N2 F2 H - }
5 E& K v8 j g+ y - }
8 B# A- K" ^, G0 w8 ~
Скопировать код 3 ?0 h, A& y! q% l
Комментарии по структуре пакетов и классов:1 w: F0 s9 R: b
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
( N6 f2 @0 G4 q% l ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
1 F: L' i9 C! j$ nЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!7 f9 c3 r4 l) b' A# Z
+ Q$ h* Z9 w6 S
. Y; L, I! i5 H& O
2 {7 [6 \" E& _
3 g5 L4 O% j) U! d8 G* Z4 J
% ~; |3 R% X9 g+ E' l# h( P
* P( m) u( W! n/ O1 C# s3 h+ e& X( E9 C+ O) Y, u6 s+ ?
# u: Z: z/ o* [
6 W$ C% s% y' C. U; k
* ~4 g. I' ^) `" d: w* v( M
, S9 I4 @/ b; L( Y/ l# Q2 }( E: B0 G: E
5 u1 E1 ?/ s) V4 ? L7 ~) u
! Q% W! d' f5 k |