Для управления сложными взаимодействиями, такими как несколько фаз боя с разными состояниями монстра, лучший подход — использовать шаблон проектирования "Состояние" (State Pattern).
$ K- b E3 j* F& ~- C0 V1 V( ]- E; j7 T5 I. z0 g
Этот шаблон позволяет разделить логику поведения объекта на разные состояния и управлять ими более гибко, избегая перегрузки основного класса монстра.
4 X3 Y/ e" s) n" _8 p5 n+ t K, S5 e6 G
Шаг 1: Создание интерфейса для состояний монстраПервый шаг — создать интерфейс, который будет представлять разные состояния монстра. Этот интерфейс определяет метод, который будет вызываться в зависимости от текущего состояния.
4 i, L# n4 x. x
$ H9 o$ t. p, D _/ H! Q, i- // Пакет для состояний монстра
9 A! Q! Q1 g# C {2 N - package org.l2jmobius.gameserver.model.actor.state;0 t/ {. H$ o: Q% z, K* V
z q' D* P: d/ Z: U& d& H- // Интерфейс, представляющий состояния монстра0 t) M2 R' A% z' \% T0 x( _# [
- public interface MonsterState {
4 ]/ l; F2 h& o$ I! N0 s7 a8 ^+ J - void handleState(Monster monster);
% X4 i( x5 D% \* u) N - }8 D" {: w, @8 u. @* z( M
Скопировать код & Q2 Y+ n6 \' N9 L( A3 T
Шаг 2: Реализация различных состоянийТеперь создадим классы для каждого состояния: например, InitialState, AggressiveState и FinalState.
& B% j5 l! @! d& p. N; m) o. \ E; { k) w0 z6 F; c. l$ l
Эти состояния будут реализовывать интерфейс MonsterState и определять поведение монстра на разных этапах боя.0 `" j. [( c) l
9 H2 x' ~ \) w5 Q7 [$ f
Класс для начального состояния монстра:4 Z- r0 p8 g; a. n, c$ t+ \
- // Пакет org.l2jmobius.gameserver.model.actor.state
& J x; E) Q# m4 P - package org.l2jmobius.gameserver.model.actor.state;
' D' `/ c: h l% `, I( K - 4 b9 N+ f& D$ O/ ~, {
- import org.l2jmobius.gameserver.model.actor.Monster;; `2 p7 v! b) s% g4 V' R1 G1 L
: q1 Z- s6 ]5 i( t3 S& c* v- public class InitialState implements MonsterState {) r6 ~0 X( U8 V! @5 z7 T
- @Override( b- O, [8 ?* @1 X6 Z
- public void handleState(Monster monster) { C, G% _8 _4 G
- // Начальная фаза боя2 P7 _1 @; E, v- G
- System.out.println(monster.getName() + " начинает бой с обычной атакой.");
0 ]4 G _+ d5 \$ s# U - }
% R0 _; b3 O ` - }* B+ I% B P! d! P, M# d# z: Q) G
Скопировать код Класс для агрессивного состояния монстра:
& h, }5 f/ }$ q3 e- // Пакет org.l2jmobius.gameserver.model.actor.state) y' V& S! c. @0 X1 L# F
- package org.l2jmobius.gameserver.model.actor.state;
! c/ n) |! _) \, T, b
4 `- B e" e% f- import org.l2jmobius.gameserver.model.actor.Monster;
( m V9 J& f8 x. c) N- u - ; Z6 w4 ^0 d9 B
- public class AggressiveState implements MonsterState {7 y" v0 L5 b* Q# k3 V; g
- @Override4 g: C8 N$ R9 M* G: \& {1 y0 P8 [
- public void handleState(Monster monster) {' o7 v7 r% ]1 a$ G3 R
- // Агрессивная фаза боя
% ^! F5 {% l' ~( K% Z" Q - System.out.println(monster.getName() + " становится агрессивным! Атаки усиливаются.");( R6 F0 ]3 f2 m/ j" `9 @
- monster.setAttackPower(monster.getAttackPower() * 1.5); // Увеличиваем силу атаки) q% E, I# Y- x9 }
- }6 L7 S; n" M; S/ u% V# T, V# X
- }4 i& }4 N' M0 w! A$ U: L, H
Скопировать код Класс для финального состояния монстра:
1 @* Y1 c: Z7 b; v! p4 j9 `4 E- // Пакет org.l2jmobius.gameserver.model.actor.state
6 c2 a8 X& I, j8 l# N4 E) I - package org.l2jmobius.gameserver.model.actor.state;! d4 D$ h5 F6 t7 B; @4 P
' n4 E* {0 h6 q, Y" F% f- import org.l2jmobius.gameserver.model.actor.Monster;
. _, T2 L5 X* N - 2 E& E; m+ ?, Q. j+ \% m
- public class FinalState implements MonsterState {) N8 w1 H8 _( Q* V
- @Override
0 @: @' t# H! t4 ^, u4 v6 Z8 y - public void handleState(Monster monster) {
( }; _8 x$ o5 q6 B2 `2 \ - // Финальная фаза боя2 t) v* f1 V0 s1 d7 }
- System.out.println(monster.getName() + " готовится к финальной атаке!");
, s- ^% l( O% f3 ^* S- M - monster.setAttackPower(monster.getAttackPower() * 2); // Максимальная сила атаки
2 o0 J% U* _4 B2 t- O - }; Y2 N0 P4 G& p% [, T- f$ o* ^
- }
1 Y' X" }" x2 P& y: `0 Z6 k% ?* C
Скопировать код
7 g$ T5 O: _( \- pШаг 3: Изменение класса MonsterЧтобы монстр мог переключаться между состояниями, нам нужно обновить класс Monster. В этой сборке L2J_Mobius, классы для игровых объектов, таких как монстры, находятся в пакете org.l2jmobius.gameserver.model.actor.: l: o* D+ U* x7 b+ ^+ H- e
- // Пакет org.l2jmobius.gameserver.model.actor
. v) X! U- ]. B: P, r! l6 | - package org.l2jmobius.gameserver.model.actor;$ X& g# R) {7 `
- - }4 `8 }0 b) I8 g- \* z* k
- import org.l2jmobius.gameserver.model.actor.state.MonsterState;: l& {" n2 H5 e& M6 P2 I
- import org.l2jmobius.gameserver.model.actor.state.InitialState;9 L& e5 b8 L; ?
, J# B' x) Y7 M- public class Monster extends Creature {
) ^2 h' m; f$ E+ y2 d* k. Y - private String name;6 K. z& ^& j: u3 H
- private double attackPower;
# q. }" Y! J3 c& A% ?) |/ k0 J1 n - private MonsterState state; // Текущее состояние монстра
- O& u: n, J: }2 S6 e
; l! C4 ]2 A( V: K7 }& G- // Конструктор монстра, \ ?) ^, P# m/ N, Z" i
- public Monster(String name, double attackPower) {
2 j: m7 G" H" Z3 X% s - this.name = name;5 P) g( V7 A* d1 D5 g* e8 F* W4 B% F
- this.attackPower = attackPower;
6 s& w7 S5 M$ L' U' }. C7 \ c - this.state = new InitialState(); // Устанавливаем начальное состояние/ M, n" I: @0 \% ]8 ^7 y/ e) J
- }8 q7 o a/ q- u+ t
/ | n/ I2 C* B, F3 V/ |& p- // Метод для смены состояния
$ `3 P# ^7 E$ R/ C- U9 Y7 D/ O6 M - public void setState(MonsterState newState) {
f. P4 x5 q# L6 q; l E. a( V - this.state = newState;7 M$ G( r m7 z& V% d$ m
- }0 L0 v+ B: c+ c
- ) @. v# Z0 P% r" e K0 A
- // Выполнение действий на основе текущего состояния
% F7 U) x! {$ g6 X8 u; u! \ - public void executeState() {7 s; K" q/ w/ Y7 ?
- state.handleState(this);
4 K7 s7 d S- n5 g# |# U; [/ O - }9 r+ V2 l+ F1 w# H$ N$ U' `
- 7 d& a7 G' T3 ~
- // Геттеры и сеттеры
$ ~1 N; V: T9 V% U - public String getName() {6 s+ X$ {2 s/ B" m4 B- S
- return name;
/ Q Z. |/ m5 R - }
& o) i$ ^, O: c7 G - 0 x1 q" {/ d: }
- public double getAttackPower() {" w: @5 R" [- H+ k
- return attackPower;
- s: T* O$ O( \, `, O2 { - }, O6 x" v, ]: q: }
) C7 U. [/ [! F0 w& K- public void setAttackPower(double attackPower) { w7 \6 k/ x! `9 x9 B( v9 n
- this.attackPower = attackPower;
0 a6 P# o8 ~& g$ O. W) X# n. r& r - }
1 ^/ P6 d2 X4 K/ o; O2 ]4 t - }
9 I" M; d& ]8 B7 i& @) Q$ [
Скопировать код 8 D3 v% d. f: G/ \8 K; G
Шаг 4: Симуляция боя с фазамиТеперь мы можем протестировать логику боя с переключением состояний монстра.2 @& O+ k' h( c) j; a2 p: z
4 j; Y. a; `; s6 H4 Z* b/ z
- // Пакет org.l2jmobius.gameserver.model.battle
- u1 \; |! n) h - package org.l2jmobius.gameserver.model.battle;0 t) I. R; n1 ]
- : `" ^4 D; `/ t8 {5 q) w7 b
- import org.l2jmobius.gameserver.model.actor.Monster;
( L" }2 _) c' Y4 @5 G4 _( ^ - import org.l2jmobius.gameserver.model.actor.state.AggressiveState;2 j* Q$ z9 g4 Q8 L2 J6 G
- import org.l2jmobius.gameserver.model.actor.state.FinalState;
- W4 M0 R: T1 q M9 } - , `7 A# i X9 u, G
- public class BattleSimulation {
0 l; U4 K6 k, ]: S9 \. s - public static void main(String[] args) {: T( H9 D4 U/ M# R
- // Создаем монстра с начальной атакой+ u. ]+ I% H- m9 ]
- Monster monster = new Monster("Дракон", 100);$ R4 O8 X8 ^- D1 |9 h
- ( U/ n; G! j2 k6 d9 N4 m7 C+ P
- // Начальная фаза
+ f" J. k; k0 ` z4 F$ w' W/ J* L v - monster.executeState();
0 \! f& I/ P" O8 b, m, {# N - ! ?$ |' W3 o5 D9 G7 w9 x
- // Переход в агрессивную фазу: v; v4 f* u/ Q( [3 u4 U
- monster.setState(new AggressiveState());% K) s& S4 j( F4 K; H# v7 W
- monster.executeState();% B# e( E& m; l! V0 c% u
6 t) w9 h: `, y& a1 d3 e* u9 ^- // Финальная фаза- K/ S% z3 @" V7 b
- monster.setState(new FinalState());
3 I& L0 B1 n* e) \ - monster.executeState();
: h$ F1 ?6 Q. F E9 h- O R" o" D1 [ - }/ q5 m( |* K/ x3 `1 p5 K# l
- }
" R( t' U( k) f8 H
Скопировать код
0 O f! M0 Q' p; n$ GКомментарии по структуре пакетов и классов:
: r3 m9 A+ {% z( I8 n- Пакет org.l2jmobius.gameserver.model.actor: содержит основные игровые сущности, такие как Monster.
- Пакет org.l2jmobius.gameserver.model.actor.state: отвечает за реализацию состояний для объектов, таких как монстры.
- Пакет org.l2jmobius.gameserver.model.battle: может содержать примеры взаимодействий, такие как симуляция боевых сценариев.- n/ Y0 w6 q. U; p) S" ~" b" d3 d
ЗаключениеШаблон "Состояние" позволяет легко управлять фазами боя и не перегружать основной класс монстра. Это делает логику боевых сценариев более гибкой и масштабируемой. В будущем, если появятся новые фазы или состояния, их можно будет легко добавить, не изменяя основной код.
4 Q# a f2 j y5 h" cЕсли появятся дополнительные вопросы по реализации или структуре классов, буду рада помочь!( n4 g* K9 A+ @- Q
+ K7 I- N+ n; f% a
: a2 _6 @ ?& k3 S9 g: x- q5 k* t
. W/ K: V5 E5 T' E+ v
0 X% ~- D3 c+ e+ N! X& }
' |/ A5 O# n6 V0 S& U+ R+ V, Y9 z8 @' U/ R
P5 O# W% D% u9 o4 `
/ U$ x, U9 r: [1 c5 i$ u6 G9 |/ ?: L
. d, |$ k8 W5 f8 O
: v6 C0 Q8 w( ?1 G: \( {
2 ?$ D$ J. e9 h
) F2 Z( F! t( |+ _ |