Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). $ K( E$ N0 k$ Y: o. n' f; P
$ ~6 P& M8 i: Q& Q$ F0 ?( t
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
5 y- N+ V* V- l* ~/ r: t& E* r
& b5 } g- Y( ~* iШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.' D5 n' ~6 g8 n+ r: H/ Q* C9 `2 `9 l, b
/ U0 t* v3 O8 M8 P
- // Пакет для состояний монстра' @8 k: f: O" _/ R8 p& F
- package org.l2jmobius.gameserver.model.actor.state;
* Y: h, ~/ G$ O J1 m* \! G( E
! h8 a" K% P( O- // Интерфейс, представляющий состояния монстра
2 z9 }' z& T* @, j5 R - public interface MonsterState {
c$ a. n# G0 O7 {0 e! H - void handleState(Monster monster);
- {2 I. r, h6 \0 S$ T7 h - }
/ U* k+ c2 Z1 j7 t2 V. c( U
Скопировать код
$ ~ _0 f; P2 |- _' o nШаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. ; x* [" z* D% M: ]+ |& D; `9 G
6 f4 u+ ? L& R$ G
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.% O! r- h- {" y2 n2 b, P
- O% z2 m9 C: e: Z. T, m
Класс для начального состояния монстра:5 Q5 x Y" X3 _) a( a% f3 T
- // Пакет org.l2jmobius.gameserver.model.actor.state
/ }4 ?) X; Z+ p - package org.l2jmobius.gameserver.model.actor.state; @- N0 w3 t+ g& S, c0 n0 _* W
- # u7 U, @2 V/ |2 v- |$ H5 j! l' ~
- import org.l2jmobius.gameserver.model.actor.Monster;
! U# L2 {7 _5 A; ^ - % `* ]+ x' n- o* p7 Q! m4 j" m1 R
- public class InitialState implements MonsterState {
2 G' N, l$ m. u" j9 q! K( Q - @Override
% h- F0 ]! w4 {; D1 g6 Q! x+ K - public void handleState(Monster monster) {3 z! j* U- ]9 u# @1 {: P$ f9 D8 p
- // Начальная фаза боя
6 \+ }1 t Q# N1 B6 b# \ p - System.out.println(monster.getName() + " начинает бой с обычной атакой.");
8 v; S s7 H" R! c7 l - }
4 Y* T$ r" ?! ~8 { - }" e! e5 w/ T' u/ v$ y2 p
Скопировать код Класс для агрессивного состояния монстра:- @2 a" u: u4 X' u: L# g" ]1 R3 ]
- // Пакет org.l2jmobius.gameserver.model.actor.state
7 d& M0 Y4 Y8 h - package org.l2jmobius.gameserver.model.actor.state;
* |, ^" [9 Y# d$ }) ]5 B) W
/ d. d9 n+ w( |" B* W- import org.l2jmobius.gameserver.model.actor.Monster;) X' e* q0 N3 `; H/ `4 Y' [
- _; X# a0 J- s5 ]- i/ F( K) V: f- public class AggressiveState implements MonsterState {
+ R0 G& V3 I8 u/ l9 u4 w - @Override
8 R. `9 H1 d+ {8 Y% R/ j( I6 c - public void handleState(Monster monster) {3 p, O1 I0 X; K8 d4 ]; q
- // Агрессивная фаза боя
0 W* U+ V! z. ~2 r+ }0 O1 _ - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
& Q, f! u! \8 x" X/ Y% i - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
2 z2 `7 j% `+ k - }
8 R: W7 ]8 t) J2 Z - }# U+ n7 H2 Z0 A* y
Скопировать код Класс для финального состояния монстра:6 k" @1 c' G9 A2 L/ q# @
- // Пакет org.l2jmobius.gameserver.model.actor.state7 E. { K9 L! q
- package org.l2jmobius.gameserver.model.actor.state;* ?3 V+ I' y. {$ ]
- H: B* ?6 h2 @' w" k9 l" _2 D7 c
- import org.l2jmobius.gameserver.model.actor.Monster;/ r) @ Y7 y% N3 y
- 1 a7 d# @- \. h$ _: z
- public class FinalState implements MonsterState {) N9 w, ?+ i$ f8 T7 t3 h
- @Override
- w1 u3 \# [2 n8 t1 l - public void handleState(Monster monster) {1 g5 D' f t/ h' [2 \9 y
- // Финальная фаза боя
: {- k4 B0 w% B, Q' }8 r, ] - System.out.println(monster.getName() + " готовится к финальной атаке!");
" Y/ q/ N' l, F( E; h% W - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки' H2 b1 F/ i) d% N
- }: X, S' i# W& j) L( ^' u- S. a+ R! y& t
- }. }) ~- y& m. }: b. x3 D1 s/ n
Скопировать код 9 Y$ A+ J: T3 U( _) f; y2 V
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
8 h3 \9 R# \ W: i- // Пакет org.l2jmobius.gameserver.model.actor; P8 W5 P2 [5 U' [ j7 @
- package org.l2jmobius.gameserver.model.actor;0 d3 G8 O6 _% e; n! g% Z4 s
: Z! U8 M8 ?# z4 r. G6 ^- import org.l2jmobius.gameserver.model.actor.state.MonsterState;$ A* u, I5 K& x% G
- import org.l2jmobius.gameserver.model.actor.state.InitialState;4 T' i/ `! @1 z0 F Z: Q' Y
- : h5 k! A) y6 D# S, Z
- public class Monster extends Creature {
8 [- T" z. x6 {# q9 j. g/ [ L# e - private String name;
`: ]2 u9 A$ a9 ^/ t6 k6 f) ] - private double attackPower;( `! `& n, I6 {" W, _( k
- private MonsterState state; // Текущее состояние монстра
( L/ w& a# u. s8 L3 w1 ~
' I* }; y; y. \4 ^( L5 t- // Конструктор монстра
8 Z4 m8 X- I5 w% O - public Monster(String name, double attackPower) {. S' D i7 \/ K7 C3 ]& Z
- this.name = name;
4 \% G R5 A9 I9 J1 O - this.attackPower = attackPower;1 l% y) Z* D! T
- this.state = new InitialState(); // Устанавливаем начальное состояние
7 l3 w k4 B& [7 _+ O0 F - }
( h4 d- O3 @# a3 S$ u) F# B
/ B# M+ d) Q! G9 j$ y- // Метод для смены состояния
$ F( ^0 P6 U. V - public void setState(MonsterState newState) {$ g+ M, @- x8 J
- this.state = newState;% U" ~) }1 e0 n$ E
- }
2 \& b5 [0 ?9 H0 L! l - 0 O8 i$ c: f1 ~- w& P
- // Выполнение действий на основе текущего состояния
( r5 v: u" ?8 l E& A1 N! f- E - public void executeState() {
3 A. @" |& N0 F2 ? - state.handleState(this);
5 j% a4 v2 ?: l( z9 R9 T - }
0 n/ b- \, n( }. @$ v - + Y& ]7 ~5 k! ]' S9 ?2 f
- // Геттеры и сеттеры/ `2 U+ E$ u i% P7 y9 G
- public String getName() {4 F' k9 ?; |+ g' B l, A
- return name;- Q* J5 p( Y6 N2 g
- }' b" U' j/ G1 ~/ d# c; w
+ e0 A& j- w8 V o$ V' C5 ?6 e2 }- public double getAttackPower() {
6 i1 V% c" F2 T" W - return attackPower;
3 N$ e* i, O- | W1 Z - }3 F( a3 ] m! e8 F) Y8 ]; Q' C
/ S! i0 }' w) i9 r- public void setAttackPower(double attackPower) {8 L9 `) I' o9 C: `5 J) C
- this.attackPower = attackPower;
0 ^& u# o5 i+ Y8 H6 H - }) m5 \3 x& y ]1 G9 {: Y' Y$ r/ l
- }8 K& M; {. `% g0 ?0 ]2 `6 l( T
Скопировать код & ^$ R. n* E9 h7 t" C
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.
+ F" G* C7 f: I( z; n7 X5 J1 R; H( r- q: Q- ?
- // Пакет org.l2jmobius.gameserver.model.battle
& k0 ~% {7 L( @; p - package org.l2jmobius.gameserver.model.battle;* k( ~7 ?/ ]- [
' z, P& i5 H" z" k$ X3 f9 i- import org.l2jmobius.gameserver.model.actor.Monster;
+ @# W5 m. i& M) M - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
$ x7 }- _2 _9 i" f" r - import org.l2jmobius.gameserver.model.actor.state.FinalState;
2 }9 l, q7 v8 |6 @
- i/ n i. Z3 f, k( }& B# `- public class BattleSimulation {* I# ^- ?# j: V- b6 N4 u% W' j: X
- public static void main(String[] args) {/ F* i% x1 e: h" E% U4 T3 c
- // Создаем монстра с начальной атакой
& ^7 r# j3 q4 V - Monster monster = new Monster("Дракон", 100);
/ a# k) a: I" o8 V0 e4 Y - / q- ~& ]8 y! L& C- R, V
- // Начальная фаза) I d8 z" _: G L; ?
- monster.executeState();
+ y2 K9 F1 r# g S, |/ h
; K9 R' }, |0 ~6 l- // Переход в агрессивную фазу
0 {4 K Q9 r, U3 {: J" a - monster.setState(new AggressiveState());
( ]. X5 q' f& o8 y; d! s9 | - monster.executeState();
- {8 s" }3 j6 Z3 W% P$ ^5 _" n$ Q2 e - - G: I( y- Z7 @' G- B* e" P0 o
- // Финальная фаза
& f e+ h3 S; }! P4 u* S9 y - monster.setState(new FinalState());
3 m: V# l# s2 l - monster.executeState();6 N* W+ _3 z3 R" n2 T r% m
- }1 P7 m2 _$ \# b% W8 A' {
- }
6 D, }" p9 v! a
Скопировать код , [0 v* G* ?+ I1 K8 s/ D
Комментарии по структуре пакетов и классов:2 { s2 C9 H2 o) {) n- }
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.
: ]( ^% ]4 P8 l, M: s ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
. {3 t5 `5 U, C- OЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!
' q/ N4 \. M8 S' f( @. m# \' z. e
( x# t: ^) \( o' L, d# q( D1 p, Q4 \4 r) X$ z3 Q# T: ?
* y. {7 e# m; r' I3 I) U2 H; [
7 @ s* W1 Q6 Y1 q4 r# h8 }, f! e M" y8 u! d4 d
" S+ Y- v; o) }& \
5 r" U" {# X; |7 s4 R! o; W) p3 n
- z; j$ k3 n1 O' S+ e0 \& a* W# a% Z/ q7 }
) p4 o, V- e( |
. y6 z/ v- k: f( ]( Q' B/ u
. @, u# s" d+ z' x% Z0 G) S$ N, I6 b% p" X5 `
|