Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
' n' `0 L) Z6 J0 v
6 x0 J( _3 O3 z8 m% C6 i, l' ?Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
W/ q: p M7 p. X9 r$ }& _
& \" W" O8 g' XШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.3 Z9 A6 V0 ^6 v7 n' ]
7 g9 v! L) q1 C2 f. y* d- W- // Пакет для состояний монстра
0 C! B! U( N( {! A( I* p( m - package org.l2jmobius.gameserver.model.actor.state;
+ s( @% ^6 \" d: D) \ - # R8 u8 w. P& H* y
- // Интерфейс, представляющий состояния монстра
5 |; y4 r( i D; B8 a7 e `6 \ - public interface MonsterState {
! X% p# s2 t, E I' G4 A( }8 Y& ^ - void handleState(Monster monster);
0 e. o# [* S# o0 A4 C - }
, V( d# V1 C7 }3 ?& T: H5 o1 [9 U
Скопировать код
2 o9 Y( i6 d& e- u% \9 l/ {/ ~Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 9 p# |, B8 \. p5 g& b- i; H
9 i* K. U/ \! f; T/ H k8 n
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ b4 L0 l' ^1 D9 z% P, S a, Q8 L6 A1 O! k8 J1 W/ ^
Класс для начального состояния монстра:; b9 Q" o* q2 D1 f5 b% `2 F3 {
- // Пакет org.l2jmobius.gameserver.model.actor.state
9 \1 p" r1 Q& ~# B2 y% D2 u - package org.l2jmobius.gameserver.model.actor.state;
6 m) j, I* `2 @- m5 n( a# u5 U% A4 ^" I
0 M1 Y8 q/ T! G- import org.l2jmobius.gameserver.model.actor.Monster;# O8 ~8 B8 t! N }
0 G, u( s! _2 T- c c D7 ]- public class InitialState implements MonsterState {
0 S1 q) |0 K7 t - @Override: \1 q, k1 [3 I& O8 S# c
- public void handleState(Monster monster) {) j5 H9 E* ]: m; i$ E8 X+ k) p
- // Начальная фаза боя
' q, v% J% [7 h - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
2 D$ G9 M& V1 w+ Z+ } - }
0 I* n% s% i/ F. o - }/ w" l( f$ u; E
Скопировать код Класс для агрессивного состояния монстра:0 c! ^; O1 V0 p+ t2 F. a% x
- // Пакет org.l2jmobius.gameserver.model.actor.state6 ~$ l A" j! ~0 ^! G& K) ^
- package org.l2jmobius.gameserver.model.actor.state;
, ~0 E1 z4 I, E" C
! v: n8 q$ u$ o( \2 P- import org.l2jmobius.gameserver.model.actor.Monster;' Z; q% G3 ?# L- G
- _9 ^0 r2 F+ _& U i
- public class AggressiveState implements MonsterState {) d$ b! R- y9 v: y5 b* o% ^
- @Override
- U. ? [8 F# Z/ Y: s+ m# A3 ?. ^ - public void handleState(Monster monster) {
# o% U3 V+ v9 l2 F4 l - // Агрессивная фаза боя
+ x5 D$ V9 |8 U6 N# w3 p - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");9 D( ^) y( k" n8 a) V1 z
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки& S. P; e% a' o ]; {7 D
- }' p" O; W$ i& t- J. h( w
- }' y! L7 B+ d q9 U2 t* s
Скопировать код Класс для финального состояния монстра:$ z4 U' y: |: |" ?
- // Пакет org.l2jmobius.gameserver.model.actor.state
8 _" S! A% y9 J7 [ - package org.l2jmobius.gameserver.model.actor.state;
4 ^9 C3 c& y, b( R
5 o. v7 J# S3 ]# B. A9 L- import org.l2jmobius.gameserver.model.actor.Monster;
9 S5 P6 E- v: S, T# }
2 Z" |3 ?5 o* C5 D3 D- public class FinalState implements MonsterState {
5 l/ Q2 r$ W3 x1 H9 x - @Override
8 \; o+ _) A2 ^ - public void handleState(Monster monster) {
: t/ @4 Z3 O8 e. m2 | - // Финальная фаза боя
1 D: V2 t" X: k+ V& G - System.out.println(monster.getName() + " готовится к финальной атаке!");+ m- i8 i# r% z1 C# c4 q
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
) ~8 m4 u; p8 l/ f. q - }( _1 r' W. y- u, p/ A
- }
, D! r. b& D5 D# R
Скопировать код 0 ?; n4 a) N- J' L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
F8 |+ Z+ N" c" Z- // Пакет org.l2jmobius.gameserver.model.actor
; V* B* m' a* Z+ p$ O+ d# o - package org.l2jmobius.gameserver.model.actor;% K7 k9 `+ \& m5 s" [- R
- ; P6 S- ` g& D; v! e; J
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;0 w8 R( I7 J. f5 {2 Z$ }
- import org.l2jmobius.gameserver.model.actor.state.InitialState;, w$ \5 D/ y; a" z5 m
- 6 o) }4 O7 S7 i4 m6 c$ R- }& S! O
- public class Monster extends Creature {3 {, ~6 Y5 Y& B6 {0 \
- private String name;% v7 g, S' a2 ?4 X. I+ z: `
- private double attackPower;& S; H. U0 ^: M8 m; J' l: G E
- private MonsterState state; // Текущее состояние монстра
% j% c- c W+ `; q0 `' G5 E1 ?: F - . n! }( T2 V7 D& P, P. g
- // Конструктор монстра6 ~% y! w& Z* B6 }* ]+ K% K6 m
- public Monster(String name, double attackPower) {: m1 r5 Y/ @) ^5 t
- this.name = name;+ m. J* }! b% O2 o$ V
- this.attackPower = attackPower;) P1 V6 l8 w6 v# t" f
- this.state = new InitialState(); // Устанавливаем начальное состояние; P6 P0 T6 a) V( \1 L% R) E% Y, {
- }
0 s; t- m9 p8 w - / R# y3 U/ R% M6 D B* T& U
- // Метод для смены состояния1 M/ o5 x4 \! M* o
- public void setState(MonsterState newState) {' f8 N6 {: ]! Q; E8 q9 n
- this.state = newState;
, i7 R. k# L+ h0 o6 q/ K - }4 p3 @- A( M# c) j6 W
. I F* ]) w9 I( r6 a) |6 ]5 U- // Выполнение действий на основе текущего состояния
3 _2 }4 i3 o0 D* @ - public void executeState() {/ Y' L$ A& M b+ z c
- state.handleState(this);! n+ a; |1 ^2 q
- }5 Q/ t: h+ s. r/ t# N* I3 c* B: P
) U+ H0 j0 s5 I- // Геттеры и сеттеры
* P7 e5 n, h! N6 B6 _ - public String getName() {
3 E* g9 w+ `$ C. D9 N: Q - return name;
) t" b; u$ e: F6 p$ s - }
/ l; G) p9 D3 y& W& _( L; W
# Y4 o1 l5 ?, B0 f! H- public double getAttackPower() {
. w% y' L/ n" p6 [5 e+ R) G g. A - return attackPower;
, C+ h) o* P/ }$ ~7 N2 b - }
8 c+ c% x! r2 `& B; H - & W# [0 m4 O0 w
- public void setAttackPower(double attackPower) {% R* b$ r( C% \* i- y, L# |
- this.attackPower = attackPower;+ p7 a6 Z7 _# q2 n' n6 O7 u
- }
& H) z+ z5 W \# l - }
6 a; {+ A4 p3 R% Z
Скопировать код % t) i6 n2 o. d% t
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.$ R7 b. {$ L: A3 ~; A8 Z
" y7 ]; M5 G% U. h+ D6 {
- // Пакет org.l2jmobius.gameserver.model.battle* n1 C- |& P( G1 D6 p% ` q: k6 ^+ f
- package org.l2jmobius.gameserver.model.battle;
5 V( \6 h, {9 ^1 l3 X6 i- W
/ c' p) b3 d' Q' f- import org.l2jmobius.gameserver.model.actor.Monster; C% {" P! w( z1 R, Z o2 ^
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;; \9 W! d7 w0 O
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
' z g3 b. t6 @ - ' l5 `; b" m$ T6 s
- public class BattleSimulation {; g% p6 b& q! \
- public static void main(String[] args) {
6 F3 D& _; f1 i2 s5 n; { - // Создаем монстра с начальной атакой
: `" A2 B! w' ^" h, y! l( D* W2 S, _9 q - Monster monster = new Monster("Дракон", 100);) M0 U$ Y" F! v. ?5 G! v# X1 u
* W0 S+ [/ U* {* C2 t- // Начальная фаза5 i1 R( s; }8 C8 ], e8 _/ t
- monster.executeState();+ v6 F# y/ |/ I0 ]* Y7 s: Q0 K) D
- * A+ R4 q5 g# C4 E% u& t# w# c( [: `
- // Переход в агрессивную фазу: ~+ F& ~# u) t! u# J/ V4 v8 b
- monster.setState(new AggressiveState());# Q$ ^1 C( V, A3 C/ ?# C# x
- monster.executeState(); r8 b" } b3 W: _8 x
8 q2 U7 o3 z, e, t) I4 j9 W7 O- // Финальная фаза& ` q; b- l7 w2 V: M# k
- monster.setState(new FinalState());
/ F% r+ V1 j5 y6 U4 {0 F U9 A - monster.executeState();1 F% I, e6 { r
- }8 ]: e' M8 e/ Q2 }' l) T
- }
4 ?4 M0 ~/ v3 @& v. Y3 d
Скопировать код + z2 A6 W! F& G p ?- G
Комментарии по структуре пакетов и классов:
/ d# M. U1 {8 B' f; K7 G( }% p- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.( c' R+ v9 [( G7 z) y4 _
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.6 _/ A0 u Q: ]" @# y
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ L0 F# `7 x. ]$ e8 y% Y- a
! a" o- t' T3 f* b- O6 R1 O, X7 {- S# d
+ W% M; J! H4 s$ @: Y5 r* A0 A: j
# X s! |" D3 f8 c5 b0 m* o
: O! u W' G: N) G: _) g e. n
( w- A R9 t+ G5 X% u I: q7 }, o/ {7 W: z
, g/ W' D- e& C+ ~
- M B4 Y( e# j2 a
" N k2 F2 S, i2 ~& n: a5 j# V0 |, G. I+ x1 l f
' m6 A9 s) K* ^) `( T, r, Q) ]- m- p2 F! v
0 ]* C1 j" w7 @, z' { |