@@ -73,4 +73,47 @@ protected boolean shouldSpawnCloud(BlockState state, LevelAccessor level, BlockP
73
73
return true ;
74
74
}
75
75
76
+ public static AreaEffectCloud spawnCloud (Level level , BlockPos pos , float size ) {
77
+ var vec = Vec3 .atCenterOf (pos );
78
+ var cloud = new AreaEffectCloud (level , vec .x , vec .y , vec .z );
79
+
80
+ getEffects (Math .max (1 , (int ) (size ))).forEach (cloud ::addEffect );
81
+
82
+ cloud .setParticle (OParticleTypes .LEAD_CLOUD .get ());
83
+ cloud .setRadius (1.5F * size );
84
+ cloud .setRadiusPerTick (-0.02F );
85
+ cloud .setDuration ((int ) (120 * size ));
86
+
87
+ level .addFreshEntity (cloud );
88
+ return cloud ;
89
+ }
90
+
91
+ public static void blowParticles (LevelAccessor level , BlockPos pos , Direction facing , int maxDistance ) {
92
+ var speed = 0.5 ;
93
+ maxDistance = Math .min (maxDistance , 8 );
94
+
95
+ for (int distance = 1 ; distance < maxDistance ; distance ++) {
96
+ var frontPos = pos .relative (facing , distance );
97
+ var frontState = level .getBlockState (frontPos );
98
+
99
+ if (frontState .getBlock () instanceof LeadOreBlock ) {
100
+ var vec = Vec3 .atCenterOf (frontPos );
101
+ level .addParticle (OParticleTypes .LEAD_BLOW .get (),
102
+ vec .x , vec .y , vec .z ,
103
+ facing .getStepX () * speed , facing .getStepY () * speed , facing .getStepZ () * speed
104
+ );
105
+
106
+ var targets = level .getEntitiesOfClass (LivingEntity .class , new AABB (frontPos , pos .relative (facing , maxDistance )).expandTowards (1 , 1 , 1 ));
107
+
108
+ targets .forEach (target -> {
109
+ getEffects (1 )
110
+ .filter (it -> !target .hasEffect (it .getEffect ()))
111
+ .forEach (target ::addEffect );
112
+ });
113
+
114
+ return ;
115
+ }
116
+ }
117
+ }
118
+
76
119
}
0 commit comments