Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
1 {4 X6 |4 z1 \$ w1 h% |. |$ P# h
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.# }3 m* N4 ~2 q J
1 ]4 b3 v* R' F5 n* Z7 JШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
! T. d, p, H6 ` `- z! z3 i( R5 I: ~8 B. d" ~1 P( |
- // Пакет для состояний монстра
! s0 n0 g, C* N$ G; t& {) D/ m - package org.l2jmobius.gameserver.model.actor.state;
, ]# r* m; o% I& c7 h4 @. l - . j: x1 `$ w( D( X$ w3 a4 D; |
- // Интерфейс, представляющий состояния монстра
) M* t) T' c, Y - public interface MonsterState {
- V/ S2 G4 v4 H: R2 p: B5 ]/ D - void handleState(Monster monster);
0 @2 _5 ~, \3 K6 W! Q# c - }' ] Y8 A0 T, v3 a. V
Скопировать код ' q, {# e. A' h9 K! [: A
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 4 Y, J4 b/ [% u% L" o
3 U h! p+ g$ T ~3 i
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 }- p3 @, ?4 e6 \4 `2 A7 i
( s* v9 `# r; {" f3 z+ DКласс для начального состояния монстра:
6 l; S6 E. B. B/ |, O+ ]- // Пакет org.l2jmobius.gameserver.model.actor.state x8 ^; a1 H3 \, b% a( ~
- package org.l2jmobius.gameserver.model.actor.state;3 {8 j+ Q0 _2 E+ w6 N; j& {, o
6 r! o% O! M; j- ]1 @; \! Z8 M- M- |- import org.l2jmobius.gameserver.model.actor.Monster;
h& T z2 i( g" e
6 |3 E, B( D+ g- O: r# Q- public class InitialState implements MonsterState {
$ s( L: w f1 r, [- e' U; Z4 @. f - @Override; Z4 z. ~& w; l/ ~3 k
- public void handleState(Monster monster) {+ e% X$ J! o) G" i8 q$ R
- // Начальная фаза боя
! p' O) K6 e w: \ - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
( P# v8 V$ j4 G) O# s3 \0 x: o - }3 E: Y" R1 e% R/ _% s
- }& A# b' _- n- ?1 |0 ]- u
Скопировать код Класс для агрессивного состояния монстра:2 E" C$ l, X. R
- // Пакет org.l2jmobius.gameserver.model.actor.state0 {" P; O# E# ^& b
- package org.l2jmobius.gameserver.model.actor.state;
5 R/ G' ^* X- `% E$ P
' `: e1 O+ n1 l8 T) X% @, }- import org.l2jmobius.gameserver.model.actor.Monster;8 X% K( U9 l5 Q6 a2 ^/ B
! _0 n- |! l/ v, q2 p- public class AggressiveState implements MonsterState {
9 U9 V2 r! ]4 ^; y k; b - @Override7 h# w- i% W2 _" X0 |
- public void handleState(Monster monster) {/ S3 d4 q% d+ N7 @$ R
- // Агрессивная фаза боя, f8 I$ Q4 }! H" l4 n) d
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");+ n. e, Z" p8 T
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки0 z2 s6 W/ v; m8 N9 s
- }
- Z# Y* E$ q _5 x - }
0 z7 U* u2 M L1 ]
Скопировать код Класс для финального состояния монстра:
( g# _# z0 n+ D1 J- // Пакет org.l2jmobius.gameserver.model.actor.state5 D$ [' E6 l0 X2 ?" [
- package org.l2jmobius.gameserver.model.actor.state;4 k# P4 v2 y5 U- \! l# S# m; F5 O: h
/ L3 A( `4 E2 a9 i( O p+ _+ p, u- import org.l2jmobius.gameserver.model.actor.Monster;! K$ M* E' P) N; B
+ d' f" y L$ u2 {- public class FinalState implements MonsterState {0 l2 A: B& S2 s# j/ m0 b1 |. u; t/ x
- @Override) o" g0 ]- t! e( s% i1 }$ L
- public void handleState(Monster monster) {
( t$ U1 d' Q+ u7 h - // Финальная фаза боя
, A R1 [% [2 D1 ^1 c - System.out.println(monster.getName() + " готовится к финальной атаке!");6 H5 N" q+ V; D( D
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
8 m$ Y2 W) L/ B" @ - }
. [6 g( h# u+ w9 @ - }9 w( s7 U: Q7 q: O
Скопировать код
6 _( O5 z8 m0 O g' b3 J: zШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.! L' L. f1 M3 O
- // Пакет org.l2jmobius.gameserver.model.actor
1 h6 K7 j! m1 t/ a2 C& z - package org.l2jmobius.gameserver.model.actor;
0 U2 K$ s! z& T6 d x) ?4 t
% a2 r0 F' I3 v2 ]7 N* t- import org.l2jmobius.gameserver.model.actor.state.MonsterState;3 q+ L0 w3 ~ R1 E2 v4 \9 H& y# \
- import org.l2jmobius.gameserver.model.actor.state.InitialState;' v2 p# J ^! u K1 z( {, n
- 8 x, N$ Y0 R9 v2 m* B. V
- public class Monster extends Creature {
- R/ {, R2 d9 s, t - private String name;# B; u! v; m' L) ?) H- [
- private double attackPower;
! |+ Q6 l/ G- G2 o A$ r - private MonsterState state; // Текущее состояние монстра
+ x" \/ _4 M' C" p
/ j! y3 M0 t/ b1 T1 N, ~% ?- // Конструктор монстра
% H- ]; a& t# f! I! F$ r: i2 S6 ] - public Monster(String name, double attackPower) {
/ o# \; W& K$ D. v* ? - this.name = name;
: o3 p# b7 u" N) w, i3 y% X - this.attackPower = attackPower;
4 Y# ~4 E w5 u) L) e - this.state = new InitialState(); // Устанавливаем начальное состояние
4 ^# j, v t, G! D' d# v, U - }
+ O# n7 C0 o9 Y6 K# I, h
8 c+ [! a/ J# Z+ F- // Метод для смены состояния
4 x8 V3 [5 O4 c, J - public void setState(MonsterState newState) {4 R3 u% @& J7 q! r' ` n5 u
- this.state = newState;' C8 n" e% b) K* K& d6 Z/ E
- }
/ z9 S' c1 Y+ x
( r! B9 V7 @$ v2 j* {- // Выполнение действий на основе текущего состояния7 e! G+ s$ b+ Y
- public void executeState() {% ]# `# S! w$ o Y' X! ^
- state.handleState(this);
2 N% v% I# v) R q - }
: O0 M% q. h h - : P5 c6 Q0 t0 X+ b7 I P
- // Геттеры и сеттеры
6 H& h' q' L* m5 g - public String getName() {
- X, \5 R& C8 }4 C - return name;* P7 N% |$ r5 U# `2 W H
- }) X( O# D( R7 y1 |( j
- ( A# Z+ r" T z5 \" p4 S
- public double getAttackPower() {
( ?' z/ Q" [4 O8 C - return attackPower;
8 ?0 o A3 ?# R1 _. ~ - }, D j# n* G! S! q
4 z8 H) i$ c9 I) Z$ n- public void setAttackPower(double attackPower) {' O4 U# o4 U P* n
- this.attackPower = attackPower;
6 f, A" \& Z! k) ?) y - }# u2 U0 V: f7 C8 M! x7 v$ E* y2 p; n
- }
( J0 M2 X9 n8 b/ P3 r; O
Скопировать код - K4 f/ b) k9 b$ F# r
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
& E, q; [9 G, l; V; y( n' V) i8 q4 r0 d
- // Пакет org.l2jmobius.gameserver.model.battle6 T/ i4 h7 {% x( T
- package org.l2jmobius.gameserver.model.battle;7 d6 d" w; U3 Y' q/ |; v+ _" f M
+ Y3 J8 Y/ c* Y* Q% U: Y- import org.l2jmobius.gameserver.model.actor.Monster;% \5 ?- A" C* I
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;+ i1 h" L' g9 V: s
- import org.l2jmobius.gameserver.model.actor.state.FinalState;* H% G9 X4 X' T: k0 D& K( L
- 2 m" j5 t8 S. Q: _
- public class BattleSimulation {
- q& q6 V" _7 O/ o- d; P - public static void main(String[] args) {
a) Z3 j, M$ b* @# X8 D - // Создаем монстра с начальной атакой
( m) m( Q) a7 [/ ]7 k - Monster monster = new Monster("Дракон", 100);' ^7 ^; \2 R) A7 j; m: j
- - X; G1 j/ W6 n/ A' W. ?
- // Начальная фаза2 J- I# [' @1 q; C% O! X; ]
- monster.executeState();
' y; {" M6 P$ T4 E0 h/ b - 6 a E) j1 m8 j9 _) D
- // Переход в агрессивную фазу5 V6 M! P9 a! a
- monster.setState(new AggressiveState());
* S. C+ i/ x2 m. i3 Z5 b0 G( m7 Q - monster.executeState();
, Z" {9 ]7 j' {) K" E" K( j
# e& _: g4 w; V- // Финальная фаза5 d; X5 E* h1 l7 x c6 z u% S# n
- monster.setState(new FinalState());
/ k8 R2 ~5 M. i" R - monster.executeState();3 G; P8 i$ u% W% S' c
- }, q: P! F8 Q/ K1 U D! p
- }- W4 `9 J5 H1 u
Скопировать код - G4 x% R# l9 B) j' ~% T
Комментарии по структуре пакетов и классов:2 W# `( ]: N7 _4 c, u
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
# Y& |5 }& D: V6 s: @; `3 F( A8 f ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.! l5 b! U3 f- J! x
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
1 l; ~- g2 W. y1 I0 p: i. S
5 m' E) g1 z# D4 y: M0 x+ L1 r0 o6 Y7 c+ T9 W
8 ^* k- N: O- B# k0 ?2 {: G/ N
( P5 `- v8 f7 V5 g# z
2 g( ]$ ]0 P) ]5 l
( p& ~: T* J; I+ ~1 N3 D' `( u* _9 N( W; H& ~
2 u4 i' n% E: N
& f7 T- z) S. |- |3 s: a# N/ X
2 [5 j4 g' C+ x! S" L7 q" @' z3 G: u7 h0 e( V
9 ?7 n) x5 M, j# c5 J) L
( a* S+ D5 p; v1 Z# W6 Q
* D1 P. E& L0 E/ } |