Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 A- b1 }; D& l% P5 Y* n
; _$ I/ m+ L0 A4 GЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; k6 W" P+ G( @* m
# R' G" k6 E3 g; x- iШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.8 ~) m! Z4 k* E! e8 @/ c6 R' H
3 z& z4 q/ u$ O8 d3 g! p
- // Пакет для состояний монстра% a& \! i, w+ s( w1 Z9 d
- package org.l2jmobius.gameserver.model.actor.state;/ S' i1 |: B5 q2 m$ }$ ]3 g; n
- ! }/ C7 N* ^: g# L2 \3 D4 x* J
- // Интерфейс, представляющий состояния монстра
( A X$ O9 K+ S - public interface MonsterState {
$ D* }3 X- K! ]7 Z3 k& B4 o - void handleState(Monster monster);
( n6 Q1 ?$ Z: Z2 }9 d8 P% Z - }
0 \0 u- a6 s# ^1 K; C
Скопировать код
8 u& S( l% R" P1 D+ ^7 \9 gШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. / u/ G8 D+ g- z& P
7 C( W3 X& v- ^9 [9 D1 DЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
7 Y9 z" v C( C' s) q: q2 \1 ~) _5 F+ Q) W) p
Класс для начального состояния монстра:' s4 C3 S; s5 ?) e; i
- // Пакет org.l2jmobius.gameserver.model.actor.state
( i( j( s9 M- t9 |% h/ i - package org.l2jmobius.gameserver.model.actor.state;) Y9 e9 I$ L% @/ Y: F. @
. X1 s3 d1 i' C4 J8 o+ |- import org.l2jmobius.gameserver.model.actor.Monster;
$ I, Y9 E* }3 \# r9 g - 4 X: S4 j- `! i" C! m* e8 B4 P
- public class InitialState implements MonsterState { z6 a/ J- z# k# L! J& r0 l
- @Override
; d0 [& Y3 D1 j5 O' Z3 F - public void handleState(Monster monster) {
9 l" f' k3 u; g' [ - // Начальная фаза боя! T3 I. L& U$ z: O% p
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");8 |: ?+ q& P9 X7 D. w2 i m
- }5 z( f* f! M/ G* g. f P
- }
% N3 x" }0 U+ u7 L# `* V
Скопировать код Класс для агрессивного состояния монстра:1 O k2 x4 a L8 \, A9 `- B
- // Пакет org.l2jmobius.gameserver.model.actor.state
: o. I1 j+ g, O( G7 v! S - package org.l2jmobius.gameserver.model.actor.state;
1 g1 A7 A' X0 P) u4 \- ` - % A9 z1 v! s- B9 \
- import org.l2jmobius.gameserver.model.actor.Monster;( g5 \- }" o R/ z+ K
2 j8 t1 g5 {& i# L3 F( A, S& d$ m- public class AggressiveState implements MonsterState {: Y. f0 x6 T2 {, @# A
- @Override+ A1 u- o3 V0 |7 K) J5 s
- public void handleState(Monster monster) {0 z& m; W; i# w1 L% o5 R( u" J% _
- // Агрессивная фаза боя
/ w) W9 z/ ]: f w0 {3 t# m - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");& g" F9 L$ }; F# u% {
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки3 |9 X: S) u0 r" u; d' J
- }5 ~) q- Y5 Q6 ^( s! q
- }- p8 v5 U% I' D' f7 s4 ]. L
Скопировать код Класс для финального состояния монстра:$ o8 [! J p6 a) B: |8 Y: b
- // Пакет org.l2jmobius.gameserver.model.actor.state
4 q, S8 q+ v0 N4 ^* ? - package org.l2jmobius.gameserver.model.actor.state;
" N" Q% {- q P/ b- F) A Y
3 e1 X- u( A+ E/ A& y- e- import org.l2jmobius.gameserver.model.actor.Monster;
; |) F! G/ x$ g% E% `% w. s - 3 B7 g; ^. e6 ~' \3 o5 B
- public class FinalState implements MonsterState {
$ H& O0 c7 g2 n. j0 e, ` - @Override( A3 f" f4 E E, O4 H$ Y# D
- public void handleState(Monster monster) {/ D& l, V; d# l8 u. E
- // Финальная фаза боя; f5 z/ s: b7 H X
- System.out.println(monster.getName() + " готовится к финальной атаке!");
6 f/ d* o. y+ ~) S3 @ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки- N) W0 Q+ o/ r0 R. e, G4 ?4 _/ A
- }
0 x3 U0 s) [1 a% a - }, }2 W+ e5 p2 G2 S. _- b
Скопировать код ! T2 v7 c' U9 b$ T. _
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
4 Q4 t# V# T* f; }- // Пакет org.l2jmobius.gameserver.model.actor
3 I# h1 F& s' R4 S# v1 m X - package org.l2jmobius.gameserver.model.actor;
3 l; T/ B8 Y/ S7 V/ ~ - * {0 @" q0 f2 f6 s. D9 I
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;7 j0 M7 Q0 ~" g$ \
- import org.l2jmobius.gameserver.model.actor.state.InitialState;$ j4 X$ M0 B4 C; I, ?2 }0 j: l
- * w: A+ p: ` ?7 ]
- public class Monster extends Creature {
/ Y3 G% a2 ]5 F% w. k - private String name;; Q: C. x8 c0 y X$ M
- private double attackPower;! l) i$ I7 \: ^: W2 B
- private MonsterState state; // Текущее состояние монстра
5 |3 C/ R1 t# a: [
Y8 {, h( g! o; m9 h! c9 p- // Конструктор монстра
8 p: B" D% x* ~+ }/ v - public Monster(String name, double attackPower) {" }5 E- [, C/ K. w1 S) r3 j, I
- this.name = name;' e6 }& _1 z7 y& `& |: O
- this.attackPower = attackPower;+ n) y: |" [9 U" P
- this.state = new InitialState(); // Устанавливаем начальное состояние
" a+ j) I$ ~- J" e$ t- O1 X: D6 X - }8 `% F5 o7 V- H& u
6 @" |0 N. {% l2 q- // Метод для смены состояния$ ~1 s0 K" ?& j: U" t0 N- L
- public void setState(MonsterState newState) {
$ K n7 w$ J/ L) z - this.state = newState;
2 p, u8 G( U2 b% X/ o6 u7 x - }
: D+ S# n5 D- d: L2 [9 ~- [ - * H9 e0 t; P: e( l$ f
- // Выполнение действий на основе текущего состояния
5 E3 M4 \& g* j2 ^ - public void executeState() {3 u- c6 \& E" g7 D; H3 U. F1 M
- state.handleState(this);
2 B+ I1 u# Q) Y8 u a6 Q - }1 k0 i' _7 u k* e* c
3 `8 F8 ]# R5 s( Y( n0 e- // Геттеры и сеттеры
P" ~- \! U& i/ X - public String getName() {
! E; L: _/ s0 ^5 @1 L: i' Y - return name;; S1 D- i( {& D, C
- }
( B$ A* F3 s3 ^/ @% y) P$ s: W
$ p, F. R$ x! q5 A+ v2 C2 E+ S- public double getAttackPower() {3 i* J* g+ G# r5 O# C+ \
- return attackPower;# O, w3 k, K3 C0 g4 g1 r
- }' f$ j3 s8 |# r
* e: K, D+ G- p( S; d- public void setAttackPower(double attackPower) {
5 S" l8 i# C7 [ - this.attackPower = attackPower; K9 n: i9 `+ c" |; k& ]1 I4 L0 z9 ^
- }
5 E1 Y7 e, f9 B - }1 m: P4 o1 g# Z. d ? Q
Скопировать код 7 {! f2 a: d4 n0 F8 O" T& w0 q
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
" j9 Y1 }! O! Q1 I; C9 V l7 T9 n [% O
- // Пакет org.l2jmobius.gameserver.model.battle: Q7 F6 y/ M0 _2 ?
- package org.l2jmobius.gameserver.model.battle;" o' {8 x: s5 a2 X2 e$ |# d
0 j W% w% ~( u) J# _3 O2 H- import org.l2jmobius.gameserver.model.actor.Monster;( l/ R \0 a( _/ ?! Q- F1 n
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;3 L5 }0 L2 |- G5 K6 ?$ C
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
2 d1 ?% K: A( p" v6 b. b - - N% G5 P+ t, C2 k5 ~
- public class BattleSimulation {$ H, ~) Q% y# g- }$ r# w) P
- public static void main(String[] args) {' w+ y5 F& a6 e$ q6 L
- // Создаем монстра с начальной атакой% V6 ]: O) i; T# d5 ~
- Monster monster = new Monster("Дракон", 100);6 h* M- R$ N. Z7 H) b
9 K6 t9 c$ [7 T9 C' `7 W/ j* x- // Начальная фаза
; B+ O- [. V9 c4 |: I - monster.executeState();! c9 ^ `8 U9 V9 H
7 E2 \9 Q9 ~4 j I! B- // Переход в агрессивную фазу
3 A1 R% c1 U6 S7 Z% H E - monster.setState(new AggressiveState());
5 V7 L9 U0 y" E0 L) I - monster.executeState();
" \0 v: Y5 G) [ b" X& u - " O! N9 N" r4 G5 Z* K9 W" {9 a
- // Финальная фаза
U; S- s7 h; E w- ^2 a - monster.setState(new FinalState());
+ f0 X1 e0 q b" V - monster.executeState();
$ W, }/ \7 Q7 v - }
2 p" F: [6 f0 A3 m% _* }+ \ - }: `! w- Y- U4 {) [/ L# |
Скопировать код 4 g# ~' t8 I; p. T2 ]/ }# K8 s
Комментарии по структуре пакетов и классов:( }. _& |' g F
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
$ H( m3 l: k, ?9 D/ g( d ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
$ q3 R! W9 S7 P4 a0 G( x5 \Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
: I* e, ?- O& N( W2 l7 ]& j/ I$ U, V
( W4 ^2 m8 K; {7 s; F
# B* l6 ^ g2 h% w" b, }" c+ t2 v% a# {9 j
$ h" @. x, E" m; O2 ]
6 E, H* z" f9 N) v# R9 _4 D( ]9 I% q$ u$ a, K3 X. w* C% F `6 O y7 c
7 l3 N* ~2 c; t8 F) {8 J% c/ e2 }9 @5 q7 P$ d9 v
/ r: \: O3 Q# p( j! |
6 q) [0 J ^4 L: @" I# v0 z3 r
3 ?, w% c, |' F- M$ ~& B" ~* ?5 i! `
9 y. i) x$ w0 {& _+ S9 S
|