@@ -60,7 +60,7 @@ public class ManaSparkEntity extends SparkBaseEntity implements ManaSpark {
6060
6161 private final Set <ManaSpark > outgoingTransfers = Collections .newSetFromMap (new WeakHashMap <>());
6262
63- private final ArrayList <ManaSpark > transfersTowardsSelfToRegister = new ArrayList <>();
63+ private final ArrayList <ManaSpark > inboundTransfers = new ArrayList <>();
6464
6565 private boolean shouldFilterTransfers = true ;
6666 private boolean receiverWasFull = true ;
@@ -105,7 +105,7 @@ public void tick() {
105105 var receiver = getAttachedManaReceiver ();
106106
107107 SparkUpgradeType upgrade = getUpgrade ();
108- Collection <ManaSpark > transfers = getOutgoingTransfers ();
108+ Collection <ManaSpark > outgoingTransfers = getOutgoingTransfers ();
109109
110110 switch (upgrade ) {
111111 case DISPERSIVE -> {
@@ -171,12 +171,9 @@ public void tick() {
171171
172172 }
173173 case DOMINANT -> {
174- if (receiverWasFull && !receiver .isFull ()) {
174+ if (!receiver .isFull ()) {
175175 updateTransfers ();
176176 }
177- if (!transfersTowardsSelfToRegister .isEmpty ()) {
178- transfersTowardsSelfToRegister .remove (transfersTowardsSelfToRegister .size () - 1 ).registerTransfer (this );
179- }
180177 }
181178 // Recessive does not need to be handled because recessive sparks get notified in all relevant cases
182179 default -> {
@@ -188,9 +185,9 @@ public void tick() {
188185
189186 checkReceiverFull ();
190187
191- if (!transfers .isEmpty ()) {
192- int manaTotal = Math .min (TRANSFER_RATE * transfers .size (), receiver .getCurrentMana ());
193- int count = transfers .size ();
188+ if (!outgoingTransfers .isEmpty ()) {
189+ int manaTotal = Math .min (TRANSFER_RATE * outgoingTransfers .size (), receiver .getCurrentMana ());
190+ int count = outgoingTransfers .size ();
194191 int manaSpent = 0 ;
195192
196193 if (manaTotal > 0 ) {
@@ -199,7 +196,7 @@ public void tick() {
199196 shouldFilterTransfers = false ;
200197 }
201198
202- for (ManaSpark spark : transfers ) {
199+ for (ManaSpark spark : outgoingTransfers ) {
203200 count --;
204201 SparkAttachable attached = spark .getAttachedTile ();
205202 var attachedReceiver = spark .getAttachedManaReceiver ();
@@ -218,6 +215,36 @@ public void tick() {
218215 receiver .receiveMana (-manaSpent );
219216 }
220217 }
218+ if (!inboundTransfers .isEmpty ()) {
219+ int manaNeeded = Math .min (TRANSFER_RATE * inboundTransfers .size (), tile .getAvailableSpaceForMana ());
220+ int count = inboundTransfers .size ();
221+ int manaRecieved = 0 ;
222+
223+ if (manaNeeded > 0 ) {
224+ if (shouldFilterTransfers ) {
225+ filterTransfers ();
226+ shouldFilterTransfers = false ;
227+ }
228+
229+ inboundTransfers .sort (Comparator .comparingInt (s -> s .getAttachedManaReceiver ().getCurrentMana ()));
230+ for (ManaSpark spark : inboundTransfers ) {
231+ count --;
232+ SparkAttachable attached = spark .getAttachedTile ();
233+ var attachedReceiver = spark .getAttachedManaReceiver ();
234+ if (attached == null || attachedReceiver == null ) {
235+ shouldFilterTransfers = true ;
236+ continue ;
237+ }
238+
239+ int gained = Math .min (attachedReceiver .getCurrentMana (), (manaNeeded - manaRecieved ) / (count + 1 ));
240+ attachedReceiver .receiveMana (-gained );
241+ manaRecieved += gained ;
242+
243+ particlesFrom (spark .entity ());
244+ }
245+ receiver .receiveMana (manaRecieved );
246+ }
247+ }
221248
222249 firstTick = false ;
223250 }
@@ -234,7 +261,8 @@ public void checkReceiverFull() {
234261
235262 @ Override
236263 public void updateTransfers () {
237- transfersTowardsSelfToRegister .clear ();
264+ inboundTransfers .clear ();
265+ outgoingTransfers .clear ();
238266 switch (getUpgrade ()) {
239267 case RECESSIVE -> {
240268 var otherSparks = SparkHelper .getSparksAround (level (), getX (), getY () + (getBbHeight () / 2 ), getZ (), getNetwork ());
@@ -251,13 +279,13 @@ public void updateTransfers() {
251279 }
252280 case DOMINANT -> {
253281 List <ManaSpark > validSparks = SparkHelper .getSparksAround (level (), getX (), getY () + (getBbHeight () / 2 ), getZ (), getNetwork ());
282+ Collections .shuffle (validSparks );
254283 for (var spark : validSparks ) {
255284 SparkUpgradeType otherUpgrade = spark .getUpgrade ();
256285 if (spark != this && otherUpgrade == SparkUpgradeType .NONE && spark .getAttachedManaReceiver () instanceof ManaPool ) {
257- transfersTowardsSelfToRegister .add (spark );
286+ inboundTransfers .add (spark );
258287 }
259288 }
260- Collections .shuffle (transfersTowardsSelfToRegister );
261289 }
262290 }
263291 filterTransfers ();
@@ -268,6 +296,11 @@ private void particlesTowards(Entity e) {
268296 getId (), e .getId (), ColorHelper .getColorValue (getNetwork ())));
269297 }
270298
299+ private void particlesFrom (Entity e ) {
300+ XplatAbstractions .INSTANCE .sendToTracking (this , new BotaniaEffectPacket (EffectType .SPARK_MANA_FLOW , e .getX (), e .getY (), e .getZ (),
301+ e .getId (), getId (), ColorHelper .getColorValue (getNetwork ())));
302+ }
303+
271304 public static void particleBeam (Player player , Entity e1 , Entity e2 ) {
272305 if (e1 != null && e2 != null && !e1 .level ().isClientSide ) {
273306 XplatAbstractions .INSTANCE .sendToPlayer (player , new BotaniaEffectPacket (EffectType .SPARK_NET_INDICATOR ,
@@ -370,10 +403,10 @@ public ManaReceiver getAttachedManaReceiver() {
370403 }
371404
372405 private void filterTransfers () {
406+ SparkUpgradeType upgr = getUpgrade ();
373407 Iterator <ManaSpark > iter = outgoingTransfers .iterator ();
374408 while (iter .hasNext ()) {
375409 ManaSpark spark = iter .next ();
376- SparkUpgradeType upgr = getUpgrade ();
377410 SparkUpgradeType supgr = spark .getUpgrade ();
378411 ManaReceiver arecv = spark .getAttachedManaReceiver ();
379412
@@ -389,6 +422,24 @@ private void filterTransfers() {
389422 iter .remove ();
390423 }
391424 }
425+
426+ Iterator <ManaSpark > iter2 = inboundTransfers .iterator ();
427+ while (iter2 .hasNext ()) {
428+ ManaSpark spark = iter2 .next ();
429+ SparkUpgradeType supgr = spark .getUpgrade ();
430+ ManaReceiver arecv = spark .getAttachedManaReceiver ();
431+
432+ if (spark == this
433+ || !((Entity ) spark ).isAlive ()
434+ || getNetwork () != spark .getNetwork ()
435+ || arecv == null
436+ || arecv .getCurrentMana () == 0
437+ || getAttachedManaReceiver ().isFull ()
438+ || !(upgr == SparkUpgradeType .DOMINANT && supgr == SparkUpgradeType .NONE
439+ || !(arecv instanceof ManaPool ))) {
440+ iter2 .remove ();
441+ }
442+ }
392443 }
393444
394445 @ Override
0 commit comments