Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ w( }+ U) `1 O
) z P2 ]; I4 t! n6 B3 T
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
; x. T& V, n6 ^+ l- h0 V9 w; m! r' |0 t
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.7 w- J+ h E+ `( [
1 l _/ v+ ^0 f5 P- // Пакет для состояний монстра
( Y6 m: X8 ^4 Z3 d d+ C+ l - package org.l2jmobius.gameserver.model.actor.state;; \' _8 Z' S* g- r1 ?/ \0 N
- ; j( r0 _6 [: r
- // Интерфейс, представляющий состояния монстра
: ~/ A; Y; U0 p" a. S5 y0 K - public interface MonsterState {8 h. r) u6 J- h9 h+ A
- void handleState(Monster monster);7 n, v" f4 R, ~( p
- }
& f' {9 R9 z& M K, w
Скопировать код
8 U/ a5 [$ e$ C' k% X4 G# AШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& s" C$ z5 U- F! y7 q1 ?4 @ G( i3 a! u( w6 F% A; {" N
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.# ?4 E, v$ z) Y; [
$ U7 z4 _2 ~5 z
Класс для начального состояния монстра:8 |: k* Q( P0 C5 l9 L$ x7 i" g
- // Пакет org.l2jmobius.gameserver.model.actor.state* }. ^" h9 r: l" |" f" t5 P9 F
- package org.l2jmobius.gameserver.model.actor.state;0 ]. g; C6 P- M7 g( Z, X4 b
- , a$ ~' Y6 z0 I# m! b
- import org.l2jmobius.gameserver.model.actor.Monster;' i1 Z, Q' q- Z
( J! A* I* V- `- public class InitialState implements MonsterState {6 K6 K0 _8 k% b& l9 h9 ~
- @Override
: J, H u4 t" o: Y3 I7 ] - public void handleState(Monster monster) {( |$ _( q7 O) R$ c6 `% ~
- // Начальная фаза боя
J- F1 z6 C2 k# |8 h - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
$ M4 M4 V* o: n2 ~/ P - }9 f9 e7 M, z3 D8 o m
- }
9 ] g& g3 B7 ^
Скопировать код Класс для агрессивного состояния монстра:% x. g1 t0 I! `$ _3 x
- // Пакет org.l2jmobius.gameserver.model.actor.state( X. R% {2 Y# I+ c) {* R- B
- package org.l2jmobius.gameserver.model.actor.state;* J$ G7 m3 X/ B: u7 @
$ P% w1 V/ x4 b2 N& A4 t- import org.l2jmobius.gameserver.model.actor.Monster;* t! b* @' J% Y3 ]
$ p0 h" p* c" h' E2 ~- public class AggressiveState implements MonsterState {5 F! L9 C: K' B3 O
- @Override$ N f7 ^0 L1 u, V+ p
- public void handleState(Monster monster) {
. ~) y; ~' p1 A0 r7 [9 b4 S - // Агрессивная фаза боя
: d- P5 ~7 k5 r/ a/ o* v* P - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
5 u2 f6 V" |7 S( ~- J0 v - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки6 _3 i7 n. `' H. J
- }& L+ v7 [6 M4 M7 i3 f
- }2 w" G0 }) k& w/ \6 n
Скопировать код Класс для финального состояния монстра:& U! f/ Q7 k" ~# `
- // Пакет org.l2jmobius.gameserver.model.actor.state
1 L- d/ W4 t" Q T: g# k - package org.l2jmobius.gameserver.model.actor.state;
/ d9 g+ }5 ^+ X N - * c6 w) @" D) H s1 Q( d
- import org.l2jmobius.gameserver.model.actor.Monster;
9 _ d% ]/ Y. ]( P/ ?& R
, T) O: ^% _7 c9 b4 `0 ^0 w- public class FinalState implements MonsterState {
# E- ~4 m) _+ P6 F& O* @ - @Override' R3 ~8 n2 G) X! S( I l
- public void handleState(Monster monster) {
+ a& ?( C& A: w1 m$ N C - // Финальная фаза боя/ b6 j9 [! O: t8 S. J- p! S; R- k0 s3 @
- System.out.println(monster.getName() + " готовится к финальной атаке!");( E" B* B$ {! S( O, A1 z$ O
- monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки2 }" K$ d) T1 v5 z% A! x
- }1 r1 g6 r0 Y" C# v0 U7 Y
- }
; x8 O9 H/ h) m
Скопировать код 9 k1 D# z9 c. P$ c
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.2 }" I( N# W% ^% q- p) Q) F7 Z
- // Пакет org.l2jmobius.gameserver.model.actor
0 W( f+ U. r/ u1 d9 ^7 @& g R - package org.l2jmobius.gameserver.model.actor;' S% R- Q \" H9 H( t8 U+ C8 f
- - z- w* U7 \- e
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;# z+ U3 U+ s+ B+ e" ~" g
- import org.l2jmobius.gameserver.model.actor.state.InitialState;
7 E7 \/ I6 x7 f7 e - 5 k2 T3 \" F* y1 |% k
- public class Monster extends Creature {; Q' ^) U; [" }+ P
- private String name;
) o- B( H9 o8 t/ d$ u) }4 X1 J. B - private double attackPower;
@9 j' R* U* u' [! P - private MonsterState state; // Текущее состояние монстра8 _/ X" A3 Y5 z! l4 k+ ^; }6 @
6 g8 k4 Q) T8 b/ y2 d& s" @7 L0 @- // Конструктор монстра! Z/ |. j: w( p7 V; v! ?. [' O8 r
- public Monster(String name, double attackPower) {* Q1 X3 {& K% E8 @
- this.name = name;' ~) H# P; m. H3 W' G
- this.attackPower = attackPower;
! p% }7 N7 r7 F m+ N4 v1 w% F - this.state = new InitialState(); // Устанавливаем начальное состояние
. ] G1 {; c) W9 T# Q: n - } z& M; ]0 S+ n% j }& b4 q
- % O. G1 W: W! Z) w* s, I' _; i5 d. F
- // Метод для смены состояния
+ x, W0 H' P) z! K! z2 u - public void setState(MonsterState newState) {4 S) J- w8 ` g7 c* }% C3 ^; r6 x
- this.state = newState;- @0 r& B& Y3 U: E8 G {
- }% l! N5 t+ _7 a/ A9 j; o. r% ^7 c
- " }* M' y [5 e) |1 E+ I
- // Выполнение действий на основе текущего состояния
N- E* v- V) l0 j - public void executeState() {9 I4 t& X# k4 D0 \4 x
- state.handleState(this);
( I( o0 C3 n5 j - }/ X8 m! x7 N- N* X
- . b! O4 r% p6 M/ ~+ v6 }
- // Геттеры и сеттеры
) a1 p. z1 |" l) X$ [0 \. D - public String getName() {
8 [8 W: g8 G$ w. L& ?# `' a - return name;5 P# D3 |5 `! b; j5 z
- }# q- u% w' L6 m; d
0 h. |$ @5 c: V) T0 S! |' T- public double getAttackPower() {
& N" T& F9 m% [# I# _. G* e- e - return attackPower;* J0 M$ a. u5 i3 S0 \6 G# {6 E
- }
9 f, A& p; G0 Z) T - A n* O9 V# {# q; ?
- public void setAttackPower(double attackPower) {( u% T( I2 Z ^' n+ ]" D- L* r! }
- this.attackPower = attackPower;
q) R% d0 d1 P8 W2 I+ V" U - }( ~4 P4 b$ r0 ~! _* w7 F; s
- }2 U) q8 }1 K6 H! e; q7 A
Скопировать код
' [& o; A G; T+ _% h& W# oШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
4 M' v+ o. d0 h& E3 N. ]5 l+ e0 v( @$ q
- // Пакет org.l2jmobius.gameserver.model.battle
4 W, Y8 M- M/ a' a: t V - package org.l2jmobius.gameserver.model.battle;
+ C- P9 I- z3 {, q3 N$ f& F6 b
/ q' ]$ m9 V2 Y- import org.l2jmobius.gameserver.model.actor.Monster;
! X; }# E; M: a8 i, P5 U - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
+ `2 _$ i- A: p; S4 b- c - import org.l2jmobius.gameserver.model.actor.state.FinalState;
0 X7 R- L# t$ V* r, j8 j; z! `$ C6 v - ' E: c ^( x; C% a' ^( _
- public class BattleSimulation {1 ^2 D- K3 x5 W4 H+ h+ _
- public static void main(String[] args) {+ y. y' K5 A- p& n( M
- // Создаем монстра с начальной атакой
b& u! L$ q1 h3 l/ X, S# I - Monster monster = new Monster("Дракон", 100);
) |; E& s/ }5 h, p; U
) W+ F1 Y" b q- // Начальная фаза
5 L; W l$ h" G* G- }! p9 \4 Y - monster.executeState();
; {, k2 y% R0 k) u6 k9 a8 |6 |
2 |/ u- R6 c, D7 }; q- // Переход в агрессивную фазу
* f! ~/ N7 ` Y* C% g R( R - monster.setState(new AggressiveState());
' i( z: ]8 c/ Q/ f, Z/ @1 v - monster.executeState();
% j2 \ m- }1 ~4 x7 J2 x - ( b$ i( y+ }9 G. {; y) E
- // Финальная фаза
: a0 T4 u( l7 G% {4 ` - monster.setState(new FinalState());
5 u* r% d5 k5 {+ s4 ^0 v+ W - monster.executeState();
, F0 O. X0 a1 i; X - }2 }% q, d# l7 Q! m! h6 Q( E+ o
- } I7 k- ~8 D( S6 `3 R6 z3 t+ w1 J
Скопировать код
8 F9 k# j3 S1 x# r$ e ]Комментарии по структуре пакетов и классов:( E: M- P E# R) m Y6 V8 _
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
# f: w8 {# R9 T4 p0 G; ^/ w1 t# B ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.* P* a1 a0 l& P# ]1 Z/ R4 [/ g
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!0 [/ A; [ B- y8 c( q' Z
1 l3 g9 ~5 O$ [+ D! b# z( _* f! n/ J. I/ w9 f p7 d' n
! e5 x$ n3 X# Z1 V! I: O* ^; F# X( s0 ?0 U
* x# A8 P) }. ~1 a; a* u! B
3 `) @: i+ `5 T$ z! [& m
+ ?+ h7 ~3 f3 _3 N) t3 P; p
& [1 L( q! p- w* x0 W; i- ?
k9 l% @, ?; }9 |$ j5 t0 d% |/ I
6 e6 D: _( R5 X' O0 w; W& B* s1 f: A( X; S* s8 A
( D& s3 V6 p0 ]& u/ _$ |3 X
, ~5 a: ?& J5 w
|