Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 0 M! p9 t% M B" e) U& a, g/ o* Q6 u
8 |' q6 L% b# {# KЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
' A& C, L( ~. e, i: x8 h! M9 o M4 L" H4 ?
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
6 v, R3 s4 C. k) e8 y3 S& Q
9 Z+ n: g7 u, L- ~; h) b7 K5 s- // Пакет для состояний монстра! I$ Y4 ~/ _! Y9 i. Y0 Z
- package org.l2jmobius.gameserver.model.actor.state;) O0 _" r& C7 h0 C8 f
- 1 z- k: G+ b" ~, u
- // Интерфейс, представляющий состояния монстра; a E$ e2 P, M
- public interface MonsterState {+ l. c `7 N( p" l; `
- void handleState(Monster monster);5 \2 k( }8 Q- l
- }7 X j) |; k5 t& K$ l# x: G* H. j9 f
Скопировать код
; G/ q" M3 X7 M# h" zШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
# Z w4 s0 i5 u& N7 V P7 M. W- v8 l1 q
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
/ a2 g6 s) V4 f% l
: _, `) M5 `1 YКласс для начального состояния монстра:
& ]. R3 O t$ b% D* p- // Пакет org.l2jmobius.gameserver.model.actor.state3 p1 J7 J6 |' n ?' ~
- package org.l2jmobius.gameserver.model.actor.state;
S5 a4 \9 p. N8 H* l6 C
! I/ q. O: u& Y% [* t- import org.l2jmobius.gameserver.model.actor.Monster;
3 I1 @8 t6 T; Z( L9 I0 s
8 W% g( w6 T2 K+ ^- public class InitialState implements MonsterState {1 c( L' z2 ^6 t: k
- @Override
1 a7 M4 N* O/ f: b. f2 f% C - public void handleState(Monster monster) {4 P' O* M' J+ v
- // Начальная фаза боя
) G$ S5 O- s- f - System.out.println(monster.getName() + " начинает бой с обычной атакой.");( ~, y% \8 w, f" _+ {3 z4 r" @
- }
9 `& U: T) k2 u! g( F4 m7 I - }/ Z9 T- w* a- g. z# M
Скопировать код Класс для агрессивного состояния монстра:) ?/ e8 _9 I# U: [
- // Пакет org.l2jmobius.gameserver.model.actor.state/ `, X5 h) G7 M" x
- package org.l2jmobius.gameserver.model.actor.state;8 T" K o0 B) }3 l/ ~3 W
- 0 ?1 W: Y) { B6 A* T7 M8 j# v. {$ |
- import org.l2jmobius.gameserver.model.actor.Monster;1 b, M0 H. E! Q& w9 Q6 e
- p% u5 t+ E7 a7 a, J' @! x- public class AggressiveState implements MonsterState {7 m/ n% }! q$ Y* B# K8 L, t/ O
- @Override
7 j1 D7 k4 [( O' y* \* l6 k - public void handleState(Monster monster) {
& C T% o( X: S, e - // Агрессивная фаза боя
/ K' q8 B6 m. v' i$ _4 J% c+ H" P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");* P% R3 [; T; K
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки5 z0 P7 C% D% ?# r9 l R0 v
- }
B$ f0 g; o% K' q" W) B* o0 M - }
3 {) A: r: R7 ?1 o9 ^% c% Z: e
Скопировать код Класс для финального состояния монстра:
7 L$ S3 z8 Q1 `1 ~3 j; Q# k4 O- // Пакет org.l2jmobius.gameserver.model.actor.state
* m0 @6 T% V4 V5 s, K - package org.l2jmobius.gameserver.model.actor.state;, p$ o4 k. T; `- K. v' o
- % f1 O# a1 J5 ?0 ]
- import org.l2jmobius.gameserver.model.actor.Monster;1 ]" ?- V' Y9 z5 M7 N
$ `" Q0 Z! y0 {' a8 s( o- f- public class FinalState implements MonsterState {
$ `" P- ^9 L$ i; i/ [; m - @Override
8 k, i: i0 {: u. D- Y; C - public void handleState(Monster monster) {
# d( {4 x2 P0 O/ M# [: @ t - // Финальная фаза боя" q1 [8 w0 y4 w: b- v
- System.out.println(monster.getName() + " готовится к финальной атаке!");, R! A" L$ ]' F" s9 R2 H
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки" t( n( C P3 N( c
- }
* m$ F5 L" }# n, T5 G' \* Q& t3 r% A - }
, X6 E3 R. }6 _8 a- A
Скопировать код
7 v4 k! \& I7 @Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
) L% ^; T; k' f) @$ W$ o( m- // Пакет org.l2jmobius.gameserver.model.actor
a! ^% [" T W* F - package org.l2jmobius.gameserver.model.actor;
7 t N$ W, ?) C
+ D# k, k% O& ^. u" p/ P# ~- import org.l2jmobius.gameserver.model.actor.state.MonsterState;- q2 G7 J% i7 n2 Y
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
3 I2 J/ S' a% j) u6 ?: l - 7 a/ V% v+ z; q) A
- public class Monster extends Creature {$ u# H. A$ o: U8 J# j2 n7 U
- private String name;! p" x. d! `1 E; Z; ]+ [
- private double attackPower;
! H/ a4 _. p: G6 r ` - private MonsterState state; // Текущее состояние монстра1 S) d8 t% U( @# q
5 I4 H, e9 X; k4 t8 Q' U- // Конструктор монстра% B( L6 Q8 L1 s7 h+ E8 \ z! W0 m' X
- public Monster(String name, double attackPower) {( D( a4 s! H7 T- d0 A
- this.name = name;
+ ~" F" c$ }2 R7 {3 x% ], @ - this.attackPower = attackPower;3 H, P0 D4 J7 t, {$ [
- this.state = new InitialState(); // Устанавливаем начальное состояние( ^5 z! b3 w6 K* A/ w
- }+ q5 v6 b. N% V) M
- / d4 Y# r8 h/ c9 N
- // Метод для смены состояния
6 T: S8 ^7 o' t, v/ [1 ? - public void setState(MonsterState newState) {& ?% H9 v, U. c3 L0 U9 T
- this.state = newState;6 @" v7 [. F. h- ~/ M- a
- }- P N9 G7 V& \2 u4 I: \4 E
- & c' L$ |( q2 R, z# r
- // Выполнение действий на основе текущего состояния) X" o2 ~/ g; A' t6 y( d8 f7 m# j
- public void executeState() {
! M! O5 K0 \. D) X3 F - state.handleState(this);
) G) i2 @; v z1 R, R - }
$ ]/ H Z+ L) v - ! T' A! O3 y* C, k
- // Геттеры и сеттеры& r7 ?; s) K" y7 Q4 s
- public String getName() {, h! V$ f. d3 K9 Y6 \& R; T7 @
- return name;) w3 L6 i6 z$ r/ _1 V2 h( h5 J
- }# x% Z9 |. U( G- w! F& w
- # ^5 P5 ]) d3 k O! S& \
- public double getAttackPower() {. @& p+ e6 `5 R
- return attackPower;
2 i. W( h" ^9 _3 ^2 K5 P4 F - }( p* V3 c9 R) G8 A# b
: B: c; U. s w7 l6 {- public void setAttackPower(double attackPower) {4 V; U! |3 Q. m# y; O( f. @! t* B. b
- this.attackPower = attackPower;
& H) w% ?+ |3 N4 F s1 r$ _& l/ w - }+ O- s1 j+ D- J. I
- }
$ L6 r8 Z; `4 i. [, C; d
Скопировать код
5 \3 s" m: _. E1 f9 d9 C3 yШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
; D9 {6 k& V4 s0 L* W6 P. F: P, _0 {3 B7 B* Q8 P: {5 X
- // Пакет org.l2jmobius.gameserver.model.battle
" U1 O n9 v8 L4 S - package org.l2jmobius.gameserver.model.battle;
) {' `' p0 d1 D/ h* l
2 w, g( N) U5 q4 O7 p- import org.l2jmobius.gameserver.model.actor.Monster;6 O: `0 Z/ o* o# ?2 g+ ]0 \
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
6 u% ]0 g; D( Q& ~ - import org.l2jmobius.gameserver.model.actor.state.FinalState;
\5 ~2 ]7 s! T# ~- c$ w
% D3 E$ b% f& \; `* u: \" b- public class BattleSimulation {9 P3 R3 K2 L& {/ R9 ^3 H# g
- public static void main(String[] args) {4 f: U5 o3 U% t0 H# k0 Z, O
- // Создаем монстра с начальной атакой
5 [9 c: x G8 { - Monster monster = new Monster("Дракон", 100);
: s2 ^; T+ D9 I - - l6 J( s3 ?/ Q+ F" O1 H: Z
- // Начальная фаза4 F' z5 j Y9 w
- monster.executeState();/ u, y7 y7 `/ O& W2 x
/ |8 B. y3 Q7 v& H" j3 }- // Переход в агрессивную фазу
! ^0 k0 b* v& |# q+ O& K - monster.setState(new AggressiveState());1 n5 D! l/ f1 [: H6 e6 Y0 d
- monster.executeState();
+ g, j4 P/ N- S4 u, y
' Y( I; u% j/ Z) q5 G8 w- // Финальная фаза
' k' [! p6 G" W( M" h3 K/ L - monster.setState(new FinalState());
. g8 g% z( {3 f- z6 W4 \/ s - monster.executeState();
3 ^6 W2 a5 e- ]! b - }
9 D/ n% v3 R) @2 U% P - }) t& T( |' f# H0 S1 R$ Q
Скопировать код 1 m. [* J" z; E2 p ~, O! e1 J3 n
Комментарии по структуре пакетов и классов:
4 a2 D3 b: U% D( p6 c ]- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
) c P+ U6 q; `& I. K( ] v ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.( }$ e; b8 b2 V% C5 Z
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!5 F; s9 W% _- o h) ?' L, S5 h- W2 e# n
, t+ g* E- N; E
# ?: i- C0 o9 e# Y& R4 o6 U" m x3 Z
1 L* j7 g4 Z( i0 j6 _
! q- D9 Y( V* s; j. h6 i
" \# Y* o% P0 ]. Q" F0 N* W- b+ }! _$ ]; Q
4 Q a# B6 J4 }. n
5 x7 d$ k ?+ l$ }; f f' S8 v7 V1 e; p9 R: N/ v; n
9 t2 K) U. a- U
0 W# @4 F/ a( h1 k$ M8 a5 _3 ^& w1 p0 `
3 _8 r1 g7 }* N! R' e |