11package studio .magemonkey .divinity .manager .listener .object ;
22
33import org .bukkit .Material ;
4- import org .bukkit .entity . Player ;
4+ import org .bukkit .NamespacedKey ;
55import org .bukkit .entity .Trident ;
66import org .bukkit .inventory .ItemStack ;
7+ import org .bukkit .inventory .meta .ItemMeta ;
8+ import org .bukkit .persistence .PersistentDataType ;
79import org .junit .jupiter .api .BeforeEach ;
8- import org .junit .jupiter .api .Disabled ;
910import org .junit .jupiter .api .Test ;
1011import org .mockbukkit .mockbukkit .entity .PlayerMock ;
12+ import studio .magemonkey .divinity .api .event .DivinityDamageEvent .Start ;
13+ import studio .magemonkey .divinity .stats .EntityStats ;
14+ import studio .magemonkey .divinity .stats .ProjectileStats ;
15+ import studio .magemonkey .divinity .stats .items .ItemStats ;
16+ import studio .magemonkey .divinity .stats .items .attributes .DamageAttribute ;
1117import studio .magemonkey .divinity .api .event .DivinityDamageEvent ;
1218import studio .magemonkey .divinity .testutil .MockedTest ;
1319
1420import static org .junit .jupiter .api .Assertions .assertEquals ;
21+ import static org .junit .jupiter .api .Assertions .assertTrue ;
1522
16- @ Disabled ("Methods are not implemented yet" )
1723public class VanillaWrapperListenerTest extends MockedTest {
18- private Player damager ;
19- private Player target ;
24+ private PlayerMock damager ;
25+ private PlayerMock target ;
2026
2127 @ BeforeEach
2228 public void setup () {
@@ -28,16 +34,12 @@ public void setup() {
2834 void swordDoesAppropriateDamage () {
2935 final double expectedDamage = 5 ;
3036 damager .getInventory ().setItemInMainHand (new ItemStack (Material .IRON_SWORD ));
31- ((PlayerMock ) target ).simulateDamage (5 , damager );
37+ EntityStats .purge (damager );
38+ target .simulateDamage (5 , damager );
3239 assertEventFired (DivinityDamageEvent .Start .class , event -> {
33- double damage = 0 ;
34- for (Double value : event .getDamageMap ().values ()) {
35- damage += value ;
36- }
37-
3840 assertEquals (target , event .getVictim (), "Event victim is not the target" );
3941 assertEquals (damager , event .getDamager (), "Event damager is not the damager" );
40- assertEquals (expectedDamage , damage , 0.001 );
42+ assertEquals (expectedDamage , getTotalDamage ( event ) , 0.001 );
4143
4244 return true ;
4345 });
@@ -46,24 +48,70 @@ void swordDoesAppropriateDamage() {
4648 }
4749
4850 @ Test
49- void tridentDoesAppropriateDamage () {
50- final double expectedDamage = 9 ;
51- Trident trident = target .getWorld ().spawn (target .getLocation (), Trident .class );
51+ void tridentUsesSavedVanillaWeaponDamageAfterSwap () {
52+ ItemStack tridentItem = new ItemStack (Material .TRIDENT );
53+ double expectedDamage = DamageAttribute .getVanillaDamage (tridentItem );
54+ Trident trident = target .getWorld ().spawn (target .getLocation (), Trident .class );
55+
56+ damager .getInventory ().setItemInMainHand (tridentItem );
57+ EntityStats .purge (damager );
58+
5259 trident .setShooter (damager );
53- ((PlayerMock ) target ).simulateDamage (9 , trident );
54- assertEventFired (DivinityDamageEvent .Start .class , event -> {
55- double damage = 0 ;
56- for (Double value : event .getDamageMap ().values ()) {
57- damage += value ;
58- }
60+ trident .setItem (tridentItem );
61+ ProjectileStats .setPower (trident , 1D );
62+
63+ damager .getInventory ().setItemInMainHand (new ItemStack (Material .AIR ));
64+ EntityStats .purge (damager );
5965
66+ target .simulateDamage (1 , trident );
67+ assertEventFired (Start .class , event -> {
6068 assertEquals (target , event .getVictim (), "Event victim is not the target" );
6169 assertEquals (damager , event .getDamager (), "Event damager is not the damager" );
62- assertEquals (expectedDamage , damage , 0.001 );
70+ assertEquals (Material .TRIDENT , event .getWeapon ().getType (), "Projectile weapon should be the trident" );
71+ assertEquals (expectedDamage , getTotalDamage (event ), 0.001 );
6372
6473 return true ;
6574 });
75+ }
6676
67- assertEquals (20 - expectedDamage , target .getHealth (), 0.001 );
77+ @ Test
78+ void tridentUsesSavedCustomWeaponDamageAfterSwap () {
79+ final double expectedDamage = 13D ;
80+ ItemStack customTrident = new ItemStack (Material .TRIDENT );
81+ setLegacyDamage (customTrident , ItemStats .getDamageByDefault (), expectedDamage );
82+
83+ damager .getInventory ().setItemInMainHand (customTrident );
84+ EntityStats .purge (damager );
85+
86+ Trident trident = target .getWorld ().spawn (target .getLocation (), Trident .class );
87+ trident .setShooter (damager );
88+ trident .setItem (customTrident );
89+ ProjectileStats .setPower (trident , 1D );
90+
91+ damager .getInventory ().setItemInMainHand (new ItemStack (Material .AIR ));
92+ EntityStats .purge (damager );
93+
94+ target .simulateDamage (1 , trident );
95+ assertEventFired (Start .class , event -> {
96+ assertEquals (target , event .getVictim (), "Event victim is not the target" );
97+ assertEquals (damager , event .getDamager (), "Event damager is not the damager" );
98+ assertEquals (Material .TRIDENT , event .getWeapon ().getType (), "Projectile weapon should be the trident" );
99+ assertEquals (expectedDamage , getTotalDamage (event ), 0.001 );
100+ assertTrue (getTotalDamage (event ) > 1D , "Projectile damage should come from the saved trident, not raw event damage" );
101+
102+ return true ;
103+ });
104+ }
105+
106+ private double getTotalDamage (Start event ) {
107+ return event .getDamageMap ().values ().stream ().mapToDouble (Double ::doubleValue ).sum ();
108+ }
109+
110+ private void setLegacyDamage (ItemStack item , DamageAttribute attribute , double value ) {
111+ ItemMeta meta = item .getItemMeta ();
112+ meta .getPersistentDataContainer ().set (NamespacedKey .fromString ("prorpgitems:item_damage_" + attribute .getId ()),
113+ PersistentDataType .DOUBLE ,
114+ value );
115+ item .setItemMeta (meta );
68116 }
69- }
117+ }
0 commit comments