Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 4 l. x; K6 g2 H7 P) h1 C
6 L/ R+ H4 I$ V0 i6 AЭтот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
6 y. h+ F0 g7 t: k: P e |. Q2 `: r
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния. R J2 q: ?5 V
: P% W4 R, X8 p. g) k, F0 h
- // Пакет для состояний монстра
2 L, f9 t4 J" ^( { - package org.l2jmobius.gameserver.model.actor.state;5 P, I( Y0 ]+ g" ~# t; t
3 V% P* {2 w) j* a8 m- // Интерфейс, представляющий состояния монстра" e, t/ E5 k1 T, V7 R
- public interface MonsterState {
0 g! h$ l8 |- Z9 E2 R7 t - void handleState(Monster monster); {- S4 f& [% O+ ^+ v, E
- }- k' ^9 z: k1 d
Скопировать код
3 n% m* Y% A3 r w% XШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
/ W; K- I1 a5 e" z& P) Q1 p
$ f' D7 H9 q5 R- i- p7 c$ sЭти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.$ D9 d- C$ m; W* Q9 l
& Y! P r/ j. j% {* V: c6 s; `Класс для начального состояния монстра:" f5 ] A+ j @& N
- // Пакет org.l2jmobius.gameserver.model.actor.state7 k# p$ `/ e( x: m7 i5 x& B
- package org.l2jmobius.gameserver.model.actor.state;: }/ Y) u, Z7 ], A8 p
- 2 t9 i4 e" u6 n1 L5 @. Y8 Q+ q
- import org.l2jmobius.gameserver.model.actor.Monster;
4 h h% z* Q/ H" q J - 6 q% g' w2 B$ B+ U1 |% b* B! z
- public class InitialState implements MonsterState {
8 ~ Y: ~8 ~5 I4 |5 M5 K - @Override6 s9 W# N( \/ I, V! `
- public void handleState(Monster monster) {4 Y& L3 b1 c. P& J- s1 @
- // Начальная фаза боя- {" m% C4 g* L; r+ o
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");, P9 s; @& k* d$ L' O! p) d b
- } i2 W8 e, A9 {& T+ }% C! P
- }
. G& v, g% m+ Q3 n3 `8 }7 m. m# g- b
Скопировать код Класс для агрессивного состояния монстра:
8 _: } H, z/ s* ^' R u0 _- // Пакет org.l2jmobius.gameserver.model.actor.state
/ r' F4 D" F U2 @4 g! x d! g - package org.l2jmobius.gameserver.model.actor.state;% g2 M- Q4 ]) y4 X& x
) k7 H% ?) X+ M. w# Z4 I1 f, s9 [- import org.l2jmobius.gameserver.model.actor.Monster;1 X J0 `) i2 [3 w' Z; D# M
3 ?- ^- I+ q; i- public class AggressiveState implements MonsterState {
+ X( F: l* w5 f% ^+ Q9 p - @Override: J3 K% l0 U/ ]7 U" s5 o% C7 z; b
- public void handleState(Monster monster) {
8 V9 d" C( m: J8 F% } - // Агрессивная фаза боя, h/ C L3 y7 }: G6 f: H2 I2 g
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
2 }; S% f* l) [ M - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
. g( [* M; ?9 H2 V9 K - }' t% h) ?: s( ?7 O
- }
R8 Y+ H9 @! Q Z' T2 o' {
Скопировать код Класс для финального состояния монстра:: k. R9 v% G5 D# Q
- // Пакет org.l2jmobius.gameserver.model.actor.state6 z" C/ X, t/ A4 n& K& e
- package org.l2jmobius.gameserver.model.actor.state;- x4 U; c g5 ^' }8 [
- 9 h. q& f4 O. A/ ]; K# a
- import org.l2jmobius.gameserver.model.actor.Monster;
7 V( q- F7 o) g& i2 }( t
: |) }+ p9 k: i ~) E- public class FinalState implements MonsterState {0 \; k! z. ~2 F8 E
- @Override
( g2 }) j. I1 M0 ^- o* g - public void handleState(Monster monster) {6 k7 G* A3 T4 V% C( [/ c/ j
- // Финальная фаза боя
$ s, a4 D/ R, [7 Z9 e4 Y; E5 m - System.out.println(monster.getName() + " готовится к финальной атаке!");( y( M" C( T: ^5 g% {% }
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки% e8 }# ], a# M% C6 V
- }* J7 E* S# x. h8 s& }% {* s2 Z
- }9 e: w: K' A! n7 e3 c7 i/ y9 e
Скопировать код ( X4 n+ M" }" {' `( h- L
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.4 z4 U4 B; p4 C) M. Y' z
- // Пакет org.l2jmobius.gameserver.model.actor
+ A8 x0 I# T4 y: `8 X% R - package org.l2jmobius.gameserver.model.actor;6 C) {9 ~4 y9 l) S* F0 t! K
* D3 C, k3 o$ v( k8 U" d* J, p- import org.l2jmobius.gameserver.model.actor.state.MonsterState;" G! G- v! \) g/ B9 B9 a- \
- import org.l2jmobius.gameserver.model.actor.state.InitialState; Q& o. O* N( _1 q1 X* S
- 7 }1 x0 i2 ^0 J0 j ?2 y2 y
- public class Monster extends Creature {8 M6 j/ W& a0 g+ U. C( I' N
- private String name;. G, C' E: @: U
- private double attackPower;
/ Z+ F. | i$ {/ t - private MonsterState state; // Текущее состояние монстра" h0 r# e$ P1 [5 W! h8 m
- * P& u! U1 j; S& ?7 [" x0 v
- // Конструктор монстра
; ]! b" A. w2 V+ }+ C2 i - public Monster(String name, double attackPower) {- O- s; [3 F1 e5 n$ w
- this.name = name;
9 K$ e) V( Q6 b# j8 M - this.attackPower = attackPower;
) c' M" d1 R5 @2 S3 P' |8 N - this.state = new InitialState(); // Устанавливаем начальное состояние
* K8 P. U. w2 k1 x( ]. d# \ - }- T' o/ b$ V, \# r o) o; a
- + N9 z' l* i0 O% H
- // Метод для смены состояния
& J) i5 \* n8 j6 {) U& y: z - public void setState(MonsterState newState) {
, I5 q: J I, h - this.state = newState;1 P# ]) v: H: l' \
- }
9 g4 j- i5 U/ q* K" P% d* v
! p# n5 A5 H! P2 U6 c- // Выполнение действий на основе текущего состояния4 h- q. z& h3 i. a: P g) X) j
- public void executeState() {* \- @- `1 \# R
- state.handleState(this);
; g0 B6 f `' U" _, Z/ B - }) @( e7 J5 s0 M
3 @+ e! \' f5 B$ A; S5 f6 S- // Геттеры и сеттеры
- d& P! c. d7 p" Q! c7 }' _, Q& _ - public String getName() {
* l) }/ x9 d% o3 Z# l/ l - return name;8 Q( z" F% b9 a4 s* D
- }" P8 U+ R9 D; _3 {
- ' U3 V Y% R! [, J
- public double getAttackPower() {* p/ Z* j4 x( X& H! {% y% S$ k
- return attackPower;( W3 n/ u5 J, A) |& ]: c: x' X) |
- }4 ^) }1 J" U( ?7 @
- 6 [2 }" a9 a' C; V
- public void setAttackPower(double attackPower) {" f* a3 X, _4 F; b1 k f9 p
- this.attackPower = attackPower;5 Q+ U& X! b$ s. |
- }
* I! W# Z2 a# E - }& D0 J! s% y; X9 J1 D$ p' J
Скопировать код
4 k; r3 e$ M" N# `7 e* cШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
- @4 ~* Q; B1 F2 P0 D ?1 G. _+ F
- // Пакет org.l2jmobius.gameserver.model.battle! X: f# G, b9 j0 S
- package org.l2jmobius.gameserver.model.battle;$ x* ~& W3 E d9 |/ y0 N
- ) e, n3 a1 z: m+ l- I' S' M( D
- import org.l2jmobius.gameserver.model.actor.Monster;
, |7 M- C. o6 F/ w2 N - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
4 q0 K. o7 f# b" o/ L& z - import org.l2jmobius.gameserver.model.actor.state.FinalState;
5 W5 t* `& {5 |- L
( g& p% g2 l( f! @2 T, n g8 {3 a- public class BattleSimulation {
+ K+ T2 u9 t) Z' Y: p W; c - public static void main(String[] args) {
% d; A7 O) g2 z% z/ y - // Создаем монстра с начальной атакой$ [# J- x; Q% |9 l9 z. a* c
- Monster monster = new Monster("Дракон", 100);" q4 m% `* M& W; U/ m# C* ~
- : h% i3 r, u6 n0 ]7 R7 z
- // Начальная фаза, q& e0 r. o, r S* b) b) }
- monster.executeState();
1 Y8 H2 j6 H! s6 D: j+ @9 q% o% h - : l& i1 z% ^6 t
- // Переход в агрессивную фазу
. g5 f/ }: B. q+ ] - monster.setState(new AggressiveState());' |' N! H. L+ q; M8 O% t
- monster.executeState();* y; L: e. b7 ~
- Z0 i# b# X! n1 `# X1 V
- // Финальная фаза
7 i( ]& U6 o! U+ M; W9 q - monster.setState(new FinalState());
: Y4 h' W- C; z2 Y! P - monster.executeState();0 N% @8 X3 M# ?7 G2 U! X
- }9 A* S+ \; a E6 m3 P4 u
- }+ g3 S. R7 K# t9 q9 Z/ f( ~
Скопировать код 1 V1 x8 H5 a0 Z; ` o
Комментарии по структуре пакетов и классов:4 T+ b* m: B; y* b6 E# D3 |
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
9 O1 Q w) }; Z, f, J; U ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
( r. k4 a$ w( q9 m( `Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!$ f' Q- {; E! w8 n
2 _" G/ S& M$ P1 c: R
+ Z1 T2 z% G5 J
9 [3 x, T/ g0 L; f- _8 [" i
& t6 g( C, q3 Z+ R; P7 Y! {2 J1 p* v& A6 ^& u. @
. ^( e. d. }8 w* n4 j1 p& r% \; O8 e+ H
" V/ `1 d6 }/ Z: @4 j
( G0 y+ M J$ p6 c! V$ @" o( X; ]; B. H4 M
: v2 W) a+ Q& d7 ^* |5 q
$ N( r* ^. C1 f" D6 d, ?$ C) e
7 E2 g) o( q; F9 ]
6 G3 F. _# u" ^2 W* R |