Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
( k6 T4 ?1 l5 u. y- D, {3 l) b1 D' M
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.4 i+ Y: ?; M" }2 J
$ E8 k1 ^$ i9 l% R" m4 sШаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
* j1 n7 C# Y- x* Z" G# s; y6 ~
2 S7 ~ [' i) W# u( Y3 a: V$ D: D- // Пакет для состояний монстра
; F. t3 [1 |% W8 q) u4 g - package org.l2jmobius.gameserver.model.actor.state;, t* D9 e% E2 [0 A1 D
- H8 L( x1 ? E: q
- // Интерфейс, представляющий состояния монстра
3 P9 T; M1 V: Z4 I; [/ Y$ n - public interface MonsterState {6 s( u9 q6 O. s+ W; i& M
- void handleState(Monster monster);; F% t" y0 P2 U: U: ?9 L
- }- n+ S; j; K5 i; G
Скопировать код % q# x: z# }0 {9 r5 R4 n5 E
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState. + f+ Q7 W* ~4 C! ~1 P1 Y
3 S: Z4 E: H. n, P0 i# I# D1 b
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.
$ d$ `( _' N& p3 q2 A& y9 K2 `7 q. ?& _5 B/ \
Класс для начального состояния монстра:
* i' j' \5 ~* `' s5 J- // Пакет org.l2jmobius.gameserver.model.actor.state
. f- P& I! I) L* `3 W. } - package org.l2jmobius.gameserver.model.actor.state;
& u* T$ A: C) y/ E" q% O - 9 ^- `7 K* _. Z) V
- import org.l2jmobius.gameserver.model.actor.Monster; T1 _2 t# F s5 d% d. {% m
- 4 k1 ^3 S% ]# x$ @, D
- public class InitialState implements MonsterState {. }2 C3 n% f( E, d1 z7 i
- @Override! } j$ B0 A$ u( ^, N$ e- T
- public void handleState(Monster monster) {
, m! _/ Z8 m" n! m - // Начальная фаза боя
) S% M7 |+ z6 Z/ W6 ^+ ~5 {/ O - System.out.println(monster.getName() + " начинает бой с обычной атакой.");; K1 g( }4 I2 ]7 S
- }
+ ~! V5 N Q) i8 u; n6 ?1 E - }; L( L2 z: k$ {
Скопировать код Класс для агрессивного состояния монстра:
4 n }9 ?+ ?; B1 Q& B: o2 n- // Пакет org.l2jmobius.gameserver.model.actor.state
+ x9 E. `1 ~/ o% q4 l - package org.l2jmobius.gameserver.model.actor.state;- v: n: z3 F( @) k8 I& m
: H6 h, |: K& S+ Y" F3 N, R) @- import org.l2jmobius.gameserver.model.actor.Monster;2 G, h A' A" ?! F
. X/ _9 K" Q. h' F6 f* ?1 |& n- public class AggressiveState implements MonsterState {' H9 p9 x: [, v0 b* L2 Q) s
- @Override
+ y ^7 X$ b& M- i& c5 s9 a9 ] - public void handleState(Monster monster) {
% u, O8 I4 `( C( h* X0 ] - // Агрессивная фаза боя- G: F5 D6 D, N) R1 K# L
- System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");1 n1 P) _) A5 U& Z& C
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки
2 O, p# S M5 H3 `- b A8 ^9 W - }
% z* h' O8 }9 o9 u - }0 g# |! x1 q+ u9 B9 v
Скопировать код Класс для финального состояния монстра:0 Q/ Q( E- X( T$ S' Y1 V
- // Пакет org.l2jmobius.gameserver.model.actor.state
" {) | b0 D. p7 Y3 P9 g( e - package org.l2jmobius.gameserver.model.actor.state;' s2 F6 k! ^* _+ G
+ L. `. D( x4 H. C# {5 w- import org.l2jmobius.gameserver.model.actor.Monster;
W( f7 N/ @0 `7 F; q0 S
1 ~9 H$ @1 _0 b7 X* ^, w- public class FinalState implements MonsterState {# L' P3 z$ E" Y8 b% A/ r* U. _
- @Override
2 v; m, O. C) k) Q3 ? - public void handleState(Monster monster) {
4 `+ K8 M( `) Z/ q - // Финальная фаза боя
4 J- g2 X& G0 q i - System.out.println(monster.getName() + " готовится к финальной атаке!");
8 f" h* t1 b# v, v- @2 P - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки5 [2 p! T( q% P8 w- x* G4 D
- }! v" |, }8 r- I5 \4 l- \0 O
- }
7 T* U/ F& |+ y% j6 c+ ~) N
Скопировать код
" h- `$ S U2 \( ]$ g% G- O: S( |/ cШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.
+ M7 h9 s' q* Y0 ~" H S/ K- // Пакет org.l2jmobius.gameserver.model.actor5 P. f7 ]# O* l: Z% K3 Y5 N
- package org.l2jmobius.gameserver.model.actor;
( F9 Y2 {% i. u/ M. m# X - . E9 a1 H) H, Q" m' z+ N
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;
% M, ~1 b2 Y8 T) z& `8 X" C! } - import org.l2jmobius.gameserver.model.actor.state.InitialState;
% z; m8 ]( x, \( s9 m- V - 8 p6 e/ b+ V+ z# c
- public class Monster extends Creature {$ G7 l5 Q: e0 y6 f" V
- private String name;
+ B% ?$ ^ q+ } - private double attackPower;
$ n4 X% W# ^3 G/ H2 B, p - private MonsterState state; // Текущее состояние монстра- p! y. r+ g0 U
- 4 S, \2 X! t+ I' l% K/ a' }
- // Конструктор монстра7 r6 C2 N) x/ ?$ u- L+ X' w
- public Monster(String name, double attackPower) {
9 R. o# Z8 E0 i- D {+ R8 N) W& ] - this.name = name;
% d- o/ @4 h! V$ H9 h r - this.attackPower = attackPower;
8 n8 h) m9 R: w% [8 a" g - this.state = new InitialState(); // Устанавливаем начальное состояние
8 G. f- F0 [" ?, d' [# f - }* y! K! ]- [# o
- $ k( _, I; p+ ?/ D2 N
- // Метод для смены состояния/ h7 T& S& Q2 D& A6 D
- public void setState(MonsterState newState) {! ^( d4 [( y) ~% ?/ t3 B8 l
- this.state = newState;
! [% E! P* d0 Z4 o s9 |1 d8 } - }' j# V; s S. B# o
- + r+ l9 x& X6 M4 L, v2 g! V$ }6 l
- // Выполнение действий на основе текущего состояния
0 Z3 U+ B1 Q6 w - public void executeState() {+ E3 I5 X; M& h. i- q' L
- state.handleState(this);3 Q1 ?" I+ C M0 e( G* K X
- }# U" h" h3 A% y2 k: e
- " D! d) x; Z8 v0 ^: }2 b+ H6 b& O
- // Геттеры и сеттеры+ s! X1 R( y& l. C) @" p3 m
- public String getName() {
' b- ]/ S3 I- K - return name;
. S; O0 G. x- b$ y6 V) V6 d - }# t: d& V8 z3 A% ?/ }! K; x
- 2 }5 Z6 a! d4 y, _/ [5 }' w' r
- public double getAttackPower() {
- i* o* a0 Y1 n6 N - return attackPower;
+ M F6 [% R2 v - }1 X: ?) X. U+ g; Y1 i
- c. x4 `3 P/ F% j! W& i; @. e- public void setAttackPower(double attackPower) {7 x( i" q- x7 Y
- this.attackPower = attackPower;& L2 r" P7 n) }
- }
% E9 x3 t$ l! r$ A - }+ Y0 o. W$ ~6 o# X
Скопировать код
& \: `0 t' L8 {4 g: gШаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра." t( q: U. ?9 y, ?( F6 p
U) |/ J. Z9 p3 `+ H7 t9 j1 P! F- // Пакет org.l2jmobius.gameserver.model.battle4 ]7 j x, B; t a9 H
- package org.l2jmobius.gameserver.model.battle;- P m8 t1 T) S: _, d
. k" o" u% j3 m% X- import org.l2jmobius.gameserver.model.actor.Monster;
7 @8 b+ S5 R( L4 _+ u - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;- U' P; Z6 \) S, \' J
- import org.l2jmobius.gameserver.model.actor.state.FinalState;" C! K! q3 Y' n8 K/ K6 Y* ~
3 I) e, a8 a I- m C" l" T5 g- public class BattleSimulation {
9 S7 | n4 ?8 @: { - public static void main(String[] args) {1 R' s8 W9 t$ H3 i2 M7 Q
- // Создаем монстра с начальной атакой# E( t. Y/ `: v( _$ M+ k$ w
- Monster monster = new Monster("Дракон", 100);! C2 B; ~' C) W! i$ b- [
1 G, Z+ t. `3 L- // Начальная фаза
. u. [5 h( Y y - monster.executeState();
M. p4 z+ x! a" }5 Z# I - ' D+ j+ Y- Y6 K$ J
- // Переход в агрессивную фазу2 B" ^1 S7 r( |
- monster.setState(new AggressiveState());" O6 |) R5 _. Z0 t$ C
- monster.executeState();( p, L' p/ S/ K
- 0 z- Z( M$ g$ d
- // Финальная фаза( R# r1 \1 ]; n
- monster.setState(new FinalState());
5 [& V' |8 r# [) l - monster.executeState();" l2 i/ {% h3 }/ ]; y
- }- w1 v$ c5 O* g+ p. F7 \
- }5 N- m; w7 _/ V9 g' z
Скопировать код
( g8 f" F$ D/ f4 h! CКомментарии по структуре пакетов и классов:9 \8 F0 h9 {8 K- y$ \+ {( K! d
- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.: K- S# j* m- P! s2 c* d: N
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код." D1 _' |0 O6 b7 V
Если появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!1 F% v8 y3 @0 r' u; t; | S$ L
; x" `. j) {7 X% h. C% D- E0 ^+ A& i. V. k8 `
7 v% O; E3 Q# L, S7 [ L) K
8 Q+ Q2 _. |& T' c, w! y B# T1 ?; E' U7 g! l9 Z# g
4 }5 i6 I! Q& f( t) e0 H y) T+ Q, b1 k' H' t
( ]" k9 _( ^8 _' u" n3 L6 l( N
0 B4 Y$ O* Y' y0 s* Z8 y. i% ^* _( W0 M4 o1 m( g
- V9 |* U; h8 B3 k" N8 Z, ]* s' c' L; C" f2 c& l) {3 i5 c* b/ s
9 V9 j) b9 S$ ?. p
; T1 u+ V' H a |