1+ package dev .overgrown .thaumaturge .spell .impl .vitium ;
2+
3+ import dev .overgrown .thaumaturge .spell .pattern .AspectEffect ;
4+ import dev .overgrown .thaumaturge .spell .modifier .ModifierEffect ;
5+ import dev .overgrown .thaumaturge .spell .modifier .PowerModifierEffect ;
6+ import dev .overgrown .thaumaturge .spell .tier .*;
7+ import net .minecraft .entity .LivingEntity ;
8+ import net .minecraft .entity .damage .DamageSource ;
9+ import net .minecraft .entity .damage .DamageTypes ;
10+ import net .minecraft .server .network .ServerPlayerEntity ;
11+ import net .minecraft .util .math .Box ;
12+ import net .minecraft .util .math .Vec3d ;
13+
14+ import java .util .List ;
15+
16+ public class VitiumEffect implements AspectEffect {
17+
18+ private static final float BASE_DAMAGE = 3.0f ;
19+ private static final float AOE_RADIUS = 3.0f ;
20+ private static final float CASTER_DAMAGE_CHANCE = 0.1f ; // 10% chance
21+
22+ @ Override
23+ public void applySelf (SelfSpellDelivery delivery ) {
24+ ServerPlayerEntity caster = delivery .getCaster ();
25+ float damageAmount = calculateDamage (delivery .getModifiers ());
26+ applyMagicDamage (caster , caster , damageAmount );
27+ }
28+
29+ @ Override
30+ public void applyTargeted (TargetedSpellDelivery delivery ) {
31+ if (delivery .isEntityTarget () && delivery .getTargetEntity () instanceof LivingEntity target ) {
32+ float damageAmount = calculateDamage (delivery .getModifiers ());
33+ applyMagicDamage (target , delivery .getCaster (), damageAmount );
34+ }
35+ }
36+
37+ @ Override
38+ public void applyAoe (AoeSpellDelivery delivery ) {
39+ ServerPlayerEntity caster = delivery .getCaster ();
40+ Vec3d center = Vec3d .ofCenter (delivery .getCenter ());
41+ float damageAmount = calculateDamage (delivery .getModifiers ());
42+
43+ // Get entities in sphere around caster
44+ Box box = new Box (
45+ center .getX () - AOE_RADIUS , center .getY () - AOE_RADIUS , center .getZ () - AOE_RADIUS ,
46+ center .getX () + AOE_RADIUS , center .getY () + AOE_RADIUS , center .getZ () + AOE_RADIUS
47+ );
48+
49+ List <LivingEntity > entities = delivery .getWorld ().getEntitiesByClass (
50+ LivingEntity .class , box ,
51+ entity -> entity != caster && entity .isAlive ()
52+ );
53+
54+ // Damage all entities in AOE
55+ for (LivingEntity entity : entities ) {
56+ applyMagicDamage (entity , caster , damageAmount );
57+ }
58+
59+ // 10% chance to damage caster
60+ if (delivery .getWorld ().random .nextFloat () < CASTER_DAMAGE_CHANCE ) {
61+ applyMagicDamage (caster , caster , damageAmount );
62+ }
63+ }
64+
65+ private float calculateDamage (List <ModifierEffect > modifiers ) {
66+ float damage = BASE_DAMAGE ;
67+ for (ModifierEffect mod : modifiers ) {
68+ if (mod instanceof PowerModifierEffect powerMod ) {
69+ damage *= powerMod .getMultiplier ();
70+ }
71+ }
72+ return damage ;
73+ }
74+
75+ private void applyMagicDamage (LivingEntity target , ServerPlayerEntity source , float amount ) {
76+ DamageSource damageSource = source .getWorld ().getDamageSources ().create (DamageTypes .MAGIC , source );
77+ target .damage (damageSource , amount );
78+ }
79+ }
0 commit comments