Skip to content

Commit b9d92b0

Browse files
authored
Rewrite Dominant Spark transfer (VazkiiMods#4963)
Fixes VazkiiMods#4833
1 parent eb45610 commit b9d92b0

File tree

1 file changed

+65
-14
lines changed

1 file changed

+65
-14
lines changed

Xplat/src/main/java/vazkii/botania/common/entity/ManaSparkEntity.java

Lines changed: 65 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)