Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern). 1 _" p }1 ], p: ~1 W& `8 f
; C! t& }7 T/ A) V
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.% t. ?+ p) S6 Q; i) y
; M; L8 M9 Y/ I I
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
' z$ @! H# `7 X/ F) s) x) {* w e" `8 h
; b4 Q3 d( S, V2 c( \2 q- // Пакет для состояний монстра
( k( f) J; l% ]6 m; n' m, r - package org.l2jmobius.gameserver.model.actor.state;% z4 b- y) S0 J) M4 ~' j6 W4 \5 N
- , H! j# Y# f6 }, F: A
- // Интерфейс, представляющий состояния монстра
$ @1 q& D& Q5 @4 }$ H. Y - public interface MonsterState {) p" I* f- Y: q! K& M, k
- void handleState(Monster monster);1 U7 y; m. J4 n4 u; c1 z4 q1 O
- }9 ^9 I7 a1 F0 N1 L
Скопировать код 1 _1 \8 e5 F! J- p" G
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. 3 I0 F8 k% t7 ~# V; i- {
% ]8 S& g5 Z" R q7 O
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.9 Z' w- ?5 L# g) l) I0 O0 S
, y- {2 j% F/ k3 L: K5 @( VКласс для начального состояния монстра:' `- Q; m/ d$ ~
- // Пакет org.l2jmobius.gameserver.model.actor.state
' H3 m C5 o0 ]* C - package org.l2jmobius.gameserver.model.actor.state;) C' U% x' q1 B3 \6 y' }) r
5 i: |5 W* N% Q% [- import org.l2jmobius.gameserver.model.actor.Monster;
. s: R* q1 U2 ]1 [
0 S! `: y, D: w8 U- public class InitialState implements MonsterState {
. R' G. Q" S0 a - @Override5 b8 v2 x6 j x
- public void handleState(Monster monster) {
1 k) t7 `! {) B6 {! ~6 { - // Начальная фаза боя
* \; r4 c: ^% Z0 b- z2 ] - System.out.println(monster.getName() + " начинает бой с обычной атакой.");" W" U, ]) U3 F. e$ \) v
- }# f0 a$ ]) \, S; k6 C
- }* `0 i+ X5 Q/ z
Скопировать код Класс для агрессивного состояния монстра:
0 k, `' |8 \4 m- g7 j# c, V- // Пакет org.l2jmobius.gameserver.model.actor.state
$ w5 m+ z7 x# |6 O5 y& F - package org.l2jmobius.gameserver.model.actor.state;& @% ?; R5 y1 k+ d5 }
- ' s3 L" Y1 o! @
- import org.l2jmobius.gameserver.model.actor.Monster;
& d+ ^* X" A G2 b, k
* S8 u' F. G( S/ i5 i- public class AggressiveState implements MonsterState {
- T2 p) B7 {* Q% `/ o - @Override
: Q. t) F* U% [/ W; r3 r% a1 c - public void handleState(Monster monster) {
; {' J) H) ]; w" h2 ^# `; j- D9 o- k( n# Q - // Агрессивная фаза боя0 \, E# N8 o' A, [ ~
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");
/ M. ?# O8 h) R2 d9 i, _( N - monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки% x# }; f& B+ w9 ?' `
- }
3 [* g4 L& m: a: R; D - }: W" a* n8 \. C' ]' _' w, I
Скопировать код Класс для финального состояния монстра:
5 E/ q/ u$ ?, s! ^8 r- // Пакет org.l2jmobius.gameserver.model.actor.state
; [1 e. \ P' O; f+ h8 ? - package org.l2jmobius.gameserver.model.actor.state;
' K" B. W- E8 e( M/ `" j) l7 c
6 Z% ?; m; v' o6 ^ T8 N* V/ ^- import org.l2jmobius.gameserver.model.actor.Monster;3 r3 O: j# R: s# i7 M# e
- , q+ q+ U: j3 @9 S1 g& `
- public class FinalState implements MonsterState {( z3 n) u* P- o ~% s' Y5 [7 d& {
- @Override! w# v* K) M/ K. d% c
- public void handleState(Monster monster) {6 H/ S- Q+ p% V. }9 q2 \
- // Финальная фаза боя8 [7 s" Z" ]' p* j% {! [
- System.out.println(monster.getName() + " готовится к финальной атаке!");
- s0 u; k1 g c3 T9 @ - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
( q& t' I- e# q) o - }0 I$ ^' I- ?# k
- }, L% ~( c; y) `; T( Q6 b6 e7 }% w) M
Скопировать код + T! [) f& d" S2 U! C$ X5 h6 N
Шаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.; T4 `- W: k/ c" ~
- // Пакет org.l2jmobius.gameserver.model.actor
! E2 h: k% Y* y$ X$ L; v - package org.l2jmobius.gameserver.model.actor;* u1 i. r' E+ Y
- : ~3 d: }/ S# ?$ W( b
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
% Y) Z1 A+ }: N - import org.l2jmobius.gameserver.model.actor.state.InitialState;0 }2 y- X$ X! ^8 U# ^4 ]
3 V+ h- H# Q+ _0 T" B' h3 U: ^) m% Z- public class Monster extends Creature {; r9 K& P7 G X$ c
- private String name;4 a6 N3 ^; p3 ~6 n/ j8 X% Y
- private double attackPower;
) q3 G: P% S3 h6 q - private MonsterState state; // Текущее состояние монстра
. ]4 J: Z3 r$ I7 O! |. x- X9 Z
1 ~- a. D; r9 D" ^3 N' |. P# O- // Конструктор монстра5 u% O, p: o2 o' ]& d
- public Monster(String name, double attackPower) {( p; B" r' x) Y6 u7 a$ |6 g% J
- this.name = name;% b/ V8 _$ r }8 V
- this.attackPower = attackPower;7 r% E6 J7 X& M! c! g& A
- this.state = new InitialState(); // Устанавливаем начальное состояние+ D+ X: f" g: i: o
- }, q% z. |5 z& M- x; H' F
- : H6 [ K6 h( G o* i5 _
- // Метод для смены состояния6 O1 Q- k# s+ N$ t7 L* Q* i$ `, v
- public void setState(MonsterState newState) {
! _! w/ z2 ^7 o6 G - this.state = newState;
+ S% q- z+ H' R+ C; V( ^3 @ - }
/ o5 H1 O0 W- _ - + `) D4 j3 m3 u: p
- // Выполнение действий на основе текущего состояния k+ C( U i8 e2 d4 V7 Y) Z
- public void executeState() {$ G( d0 b* X& E) l3 R
- state.handleState(this);
( g& W1 A% k2 l- e/ s) V$ z, G" p - }
3 V0 l2 t# L/ N+ o1 |( v! P# r2 p
) @) Q t' F" q0 \! l- // Геттеры и сеттеры
T/ g- y" @; Y! W$ W& K - public String getName() {4 N- T' H& r) q z g4 Q
- return name;! O$ g; r2 L! N& ^
- }; H8 j; A3 w4 }
- * [2 X8 G# W3 }, h8 F
- public double getAttackPower() {
- A# z$ I" @$ N7 t1 f. F3 P2 X7 n - return attackPower;
- F1 g: g3 b. v5 h( N. u9 N - }
, X8 o( n, a4 M
; j' }) _+ J- g2 Y6 N7 d- public void setAttackPower(double attackPower) {
- |( A" r! l' J" ]' ^2 e1 l7 N, C - this.attackPower = attackPower;$ _# d, ?- [4 \2 M% U# X, B
- }6 @' T! `0 J/ E7 O
- }8 T5 B+ m, [) t. m9 [4 X
Скопировать код
& z* h. ^$ S, o/ O% f3 d5 g& `0 `Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.4 z* x9 q* n; v6 [# s
& A) |/ a$ r7 M5 r- // Пакет org.l2jmobius.gameserver.model.battle: n) S, ]) y) |) }
- package org.l2jmobius.gameserver.model.battle;% I& _; ~$ `# ]4 ^! b! d B
- / T$ g: ~7 n& I7 I6 e1 T3 g6 D
- import org.l2jmobius.gameserver.model.actor.Monster;' \% q$ S! l0 g
- import org.l2jmobius.gameserver.model.actor.state.AggressiveState;
5 x6 m! H/ y3 _ - import org.l2jmobius.gameserver.model.actor.state.FinalState;" E- J1 S' m1 k1 U" r' a
- + S; S- J% a9 L* S
- public class BattleSimulation {0 T. |& f9 g4 t3 U1 q* d; |% e
- public static void main(String[] args) {
3 }; U# r5 e# M8 e* z5 D - // Создаем монстра с начальной атакой
/ @+ O% D8 h7 k. G - Monster monster = new Monster("Дракон", 100);
% m5 {6 X+ ~/ k9 ~
# Q! t, v3 Z3 D- // Начальная фаза
`7 Q) O- w, E! Q2 x - monster.executeState();, q: L# r$ ~# e# c7 G
- 9 Y% l8 W8 w: W
- // Переход в агрессивную фазу9 T K5 {3 m' Y7 b
- monster.setState(new AggressiveState());* w2 D; F" z5 @
- monster.executeState();
; k- h; H9 [# W7 P
, H9 ]' c! U$ p- // Финальная фаза
) l3 Y v4 b8 f6 J* {7 i - monster.setState(new FinalState());
" @2 z, T$ ^' B3 ^ - monster.executeState();; z! \7 I9 R. Z; V6 M) u
- }
- q8 ^$ H! y* y" L7 q - }9 f4 [* H, m' {3 p* g3 p
Скопировать код
# W' y3 [# p3 p% nКомментарии по структуре пакетов и классов:* B. v$ f" _! n2 a3 W8 I6 }8 A
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.6 X% _; r9 e% n1 ?% N* T% u
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
6 O3 h8 {1 X7 KЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!) A. F/ a, e$ V) h
& c& p/ h1 k) e$ N
. E4 P6 @8 N5 Z+ R+ u0 F" k+ x
# x3 n8 i( n4 ~0 @8 D8 Y
7 L) X' s+ @+ ?0 T f6 K
1 d" n1 H- P: v7 @6 s/ }' T
& M( r3 O5 ^! D: D$ |' P
, V* p G0 J, o' x& [# H3 s* g9 C1 _7 O! C( u3 \3 N* \
6 y) h7 W Y0 J9 d+ [
2 h" ~: ^( P( P4 b: Q4 I* x$ k0 D# V$ w9 z- X
: U. `) L1 Y9 [+ m8 Y% b& U8 F' w) T
/ I+ A: y8 f3 j6 c4 u4 w4 o+ l9 X |