Skip to content

Commit c3cdaf2

Browse files
committed
Rewrite Mana P2P to transfer only bursts
1 parent d877897 commit c3cdaf2

10 files changed

Lines changed: 156 additions & 191 deletions

src/main/java/appbot/ABItems.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import appeng.api.parts.PartModels;
2323
import appeng.core.definitions.AEItems;
2424
import appeng.items.parts.PartItem;
25-
import appeng.items.parts.PartModelsHelper;
2625

2726
public class ABItems {
2827

@@ -76,7 +75,7 @@ public class ABItems {
7675
256, 2.5));
7776

7877
public static final DeferredItem<PartItem<ManaP2PTunnelPart>> MANA_P2P_TUNNEL = Util.make(() -> {
79-
PartModels.registerModels(PartModelsHelper.createModels(ManaP2PTunnelPart.class));
78+
PartModels.registerModels(ManaP2PTunnelPart.getModels().stream().flatMap(x -> x.getModels().stream()).toList());
8079
return ITEMS.register("mana_p2p_tunnel",
8180
() -> new PartItem<>(new Item.Properties(), ManaP2PTunnelPart.class, ManaP2PTunnelPart::new));
8281
});

src/main/java/appbot/AppliedBotanicsForge.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,7 @@ public AppliedBotanicsForge(IEventBus bus) {
7777
});
7878
bus.addListener(EventPriority.LOWEST, this::registerGenericAdapters);
7979
bus.addListener((RegisterPartCapabilitiesEvent event) -> {
80-
event.register(BotaniaForgeCapabilities.MANA_RECEIVER, (object, context) -> object.getExposedApi(),
81-
ManaP2PTunnelPart.class);
82-
event.register(BotaniaForgeCapabilities.SPARK_ATTACHABLE, (object, context) -> object.getSparkAttachable(),
80+
event.register(BotaniaForgeCapabilities.MANA_RECEIVER, (object, context) -> object,
8381
ManaP2PTunnelPart.class);
8482
});
8583

src/main/java/appbot/ae2/ManaContainerItemStrategy.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,6 @@ public class ManaContainerItemStrategy implements ContainerItemStrategy<ManaKey,
2020

2121
@Override
2222
public @Nullable GenericStack getContainedStack(ItemStack stack) {
23-
if (stack.isEmpty()) {
24-
return null;
25-
}
26-
2723
var item = XplatAbstractions.INSTANCE.findManaItem(stack);
2824

2925
if (item != null) {
Lines changed: 103 additions & 179 deletions
Original file line numberDiff line numberDiff line change
@@ -1,233 +1,157 @@
11
package appbot.ae2;
22

3-
import java.util.Collections;
43
import java.util.List;
5-
import java.util.stream.Collectors;
64

7-
import org.jetbrains.annotations.Nullable;
5+
import org.jetbrains.annotations.UnknownNullability;
86

97
import net.minecraft.core.BlockPos;
10-
import net.minecraft.world.item.ItemStack;
8+
import net.minecraft.core.Direction;
9+
import net.minecraft.sounds.SoundSource;
10+
import net.minecraft.util.FastColor;
11+
import net.minecraft.util.Mth;
1112
import net.minecraft.world.level.Level;
13+
import net.minecraft.world.phys.Vec3;
1214

1315
import appbot.AppliedBotanics;
14-
import vazkii.botania.api.BotaniaForgeCapabilities;
15-
import vazkii.botania.api.mana.ManaPool;
1616
import vazkii.botania.api.mana.ManaReceiver;
17-
import vazkii.botania.api.mana.spark.SparkAttachable;
17+
import vazkii.botania.common.entity.BotaniaEntities;
18+
import vazkii.botania.common.entity.ManaBurstEntity;
19+
import vazkii.botania.common.handler.BotaniaSounds;
1820

1921
import appeng.api.config.Actionable;
22+
import appeng.api.config.PowerMultiplier;
2023
import appeng.api.parts.IPartItem;
2124
import appeng.api.parts.IPartModel;
22-
import appeng.items.parts.PartModels;
23-
import appeng.parts.p2p.CapabilityP2PTunnelPart;
25+
import appeng.core.AEConfig;
26+
import appeng.parts.AEBasePart;
2427
import appeng.parts.p2p.P2PModels;
28+
import appeng.parts.p2p.P2PTunnelPart;
2529

26-
public class ManaP2PTunnelPart extends CapabilityP2PTunnelPart<ManaP2PTunnelPart, ManaReceiver> {
30+
public class ManaP2PTunnelPart extends P2PTunnelPart<ManaP2PTunnelPart> implements ManaReceiver {
2731

32+
private static final double MANA_RETAINED = 0.95;
33+
private static final int EXTRA_TICKS_EXISTED = 1;
34+
35+
private static final float[] ROTX, ROTY;
2836
private static final P2PModels MODELS = new P2PModels(AppliedBotanics.id("part/mana_p2p_tunnel"));
29-
private final SparkAttachable sparkAttachable = new P2PSparkAttachable();
37+
38+
static {
39+
ROTX = new float[6];
40+
ROTY = new float[6];
41+
42+
ROTY[Direction.DOWN.get3DDataValue()] = -90;
43+
ROTY[Direction.UP.get3DDataValue()] = 90;
44+
45+
ROTX[Direction.DOWN.get3DDataValue()] = -90;
46+
ROTX[Direction.UP.get3DDataValue()] = -90;
47+
ROTX[Direction.NORTH.get3DDataValue()] = 0;
48+
ROTX[Direction.SOUTH.get3DDataValue()] = -180;
49+
ROTX[Direction.WEST.get3DDataValue()] = -90;
50+
ROTX[Direction.EAST.get3DDataValue()] = -270;
51+
}
3052

3153
public ManaP2PTunnelPart(IPartItem<?> partItem) {
32-
super(partItem, BotaniaForgeCapabilities.MANA_RECEIVER);
33-
inputHandler = new InputHandler();
34-
emptyHandler = new EmptyHandler();
54+
super(partItem);
3555
}
3656

37-
@PartModels
3857
public static List<IPartModel> getModels() {
3958
return MODELS.getModels();
4059
}
4160

61+
@Override
62+
protected float getPowerDrainPerTick() {
63+
return 2.0f;
64+
}
65+
4266
@Override
4367
public IPartModel getStaticModels() {
4468
return MODELS.getModel(this.isPowered(), this.isActive());
4569
}
4670

47-
@Nullable
48-
public SparkAttachable getSparkAttachable() {
49-
return isOutput() ? null : sparkAttachable;
71+
// <editor-fold desc="Fake ManaReceiver">
72+
@Override
73+
public @UnknownNullability Level getManaReceiverLevel() {
74+
return getLevel();
5075
}
5176

52-
private class P2PSparkAttachable implements SparkAttachable {
53-
54-
@Override
55-
public boolean canAttachSpark(ItemStack stack) {
56-
return true;
57-
}
58-
59-
@Override
60-
public int getAvailableSpaceForMana() {
61-
var space = 0;
62-
63-
for (var output : getOutputs()) {
64-
try (var guard = output.getAdjacentCapability()) {
65-
var receiver = guard.get();
66-
space += ManaHelper.getCapacity(receiver);
67-
}
68-
}
69-
70-
return space;
71-
}
72-
73-
@Override
74-
public boolean areIncomingTransfersDone() {
75-
for (var output : getOutputs()) {
76-
try (var guard = output.getAdjacentCapability()) {
77-
var receiver = guard.get();
78-
79-
if (receiver.canReceiveManaFromBursts() && !receiver.isFull()) {
80-
return true;
81-
}
82-
}
83-
}
84-
85-
return false;
86-
}
77+
@Override
78+
public BlockPos getManaReceiverPos() {
79+
return getBlockEntity().getBlockPos();
8780
}
8881

89-
private class InputHandler implements ManaReceiver, ManaPool, SafeMana {
90-
91-
@Override
92-
public Level getManaReceiverLevel() {
93-
return getLevel();
94-
}
95-
96-
@Override
97-
public BlockPos getManaReceiverPos() {
98-
return getHost().getLocation().getPos();
99-
}
100-
101-
@Override
102-
public int getCurrentMana() {
103-
return 0;
104-
}
105-
106-
@Override
107-
public boolean isFull() {
108-
for (var output : getOutputs()) {
109-
try (var guard = output.getAdjacentCapability()) {
110-
if (!guard.get().isFull()) {
111-
return false;
112-
}
113-
}
114-
}
115-
116-
return true;
117-
}
118-
119-
@Override
120-
public void receiveMana(int mana) {
121-
if (mana <= 0) {
122-
// if mana < 0, they're getting free mana...
123-
return;
124-
}
125-
126-
var outputs = getOutputStream()
127-
.filter(part -> {
128-
try (var guard = part.getAdjacentCapability()) {
129-
var receiver = guard.get();
130-
return receiver.canReceiveManaFromBursts() && !receiver.isFull();
131-
}
132-
})
133-
.collect(Collectors.toList());
134-
135-
if (outputs.isEmpty()) {
136-
return;
137-
}
138-
139-
Collections.shuffle(outputs);
140-
141-
deductTransportCost(mana / 100, ManaKeyType.TYPE);
142-
var manaForEach = mana / outputs.size();
143-
var spill = mana % outputs.size();
144-
145-
for (var output : outputs) {
146-
try (var guard = output.getAdjacentCapability()) {
147-
guard.get().receiveMana(manaForEach + (spill-- > 0 ? 1 : 0));
148-
}
149-
}
150-
}
82+
@Override
83+
public int getCurrentMana() {
84+
return 0;
85+
}
15186

152-
@Override
153-
public boolean canReceiveManaFromBursts() {
154-
for (var output : getOutputs()) {
155-
try (var guard = output.getAdjacentCapability()) {
156-
var result = guard.get();
87+
@Override
88+
public boolean isFull() {
89+
return !isActive() || isOutput() || getOutputStream().noneMatch(AEBasePart::isActive);
90+
}
15791

158-
if (result.canReceiveManaFromBursts()) {
159-
return true;
160-
}
161-
}
162-
}
92+
@Override
93+
public void receiveMana(int mana) {
94+
// voids mana, we want bursts only
95+
}
16396

164-
return false;
165-
}
97+
@Override
98+
public boolean canReceiveManaFromBursts() {
99+
return !isFull();
100+
}
101+
// </editor-fold>
166102

167-
@Override
168-
public boolean isOutputtingPower() {
169-
return false;
170-
}
103+
public void receiveManaFromBurst(ManaBurstEntity burst) {
104+
var node = getMainNode().getNode();
105+
int mana = burst.getMana();
171106

172-
@Override
173-
public int getMaxMana() {
174-
return getOutputStream()
175-
.map(part -> {
176-
try (var guard = part.getAdjacentCapability()) {
177-
return ManaHelper.getCapacity(guard.get());
178-
}
179-
})
180-
.reduce(0, Integer::sum);
107+
if (node == null || isFull() || mana <= 0) {
108+
return;
181109
}
182110

183-
@Override
184-
public int insert(int amount, Actionable mode) {
185-
var inserted = 0;
186-
187-
for (var output : getOutputs()) {
188-
try (var guard = output.getAdjacentCapability()) {
189-
inserted += SafeMana.conv(guard.get()).insert(amount - inserted, mode);
190-
}
191-
}
192-
193-
return inserted;
194-
}
111+
var outputs = getOutputStream().filter(AEBasePart::isActive).toList();
112+
if (outputs.isEmpty())
113+
return;
195114

196-
@Override
197-
public int extract(int amount, Actionable mode) {
198-
return 0;
199-
}
200-
}
115+
var output = outputs.get(getLevel().getRandom().nextInt(outputs.size()));
201116

202-
private class EmptyHandler implements ManaReceiver {
117+
var costFactor = AEConfig.instance().getP2PTunnelTransportTax();
203118

204-
@Override
205-
public Level getManaReceiverLevel() {
206-
return getLevel();
119+
if (costFactor > 0) {
120+
var energised = node.getGrid().getEnergyService().extractAEPower(mana * costFactor, Actionable.MODULATE,
121+
PowerMultiplier.ONE) / costFactor;
122+
mana = (int) (energised * MANA_RETAINED);
123+
} else {
124+
mana = (int) (mana * MANA_RETAINED);
207125
}
208126

209-
@Override
210-
public BlockPos getManaReceiverPos() {
211-
return getHost().getLocation().getPos();
127+
if (mana <= 0) {
128+
return;
212129
}
213130

214-
@Override
215-
public int getCurrentMana() {
216-
return 0;
217-
}
131+
var level = output.getLevel();
132+
var dir = output.getSide();
133+
var pos = output.getBlockEntity().getBlockPos();
218134

219-
@Override
220-
public boolean isFull() {
221-
return true;
222-
}
135+
int old = burst.getColor();
136+
int rainbow = Mth.hsvToRgb(level.getGameTime() * 2 % 360 / 360F, 1F, 1F);
137+
int newColor = FastColor.ARGB32.lerp(0.4f, old, rainbow);
223138

224-
@Override
225-
public void receiveMana(int mana) {
226-
}
139+
var newBurst = new ManaBurstEntity(BotaniaEntities.MANA_BURST, level);
140+
var at = Vec3.atCenterOf(pos).add(Vec3.atLowerCornerOf(dir.getNormal()).scale(0.5));
141+
newBurst.moveTo(at.x, at.y, at.z, ROTX[dir.get3DDataValue()], ROTY[dir.get3DDataValue()]);
142+
newBurst.setDeltaMovement(ManaBurstEntity.calculateBurstVelocity(newBurst.getXRot(), newBurst.getYRot()));
143+
newBurst.setColor(newColor);
144+
newBurst.setMana(mana);
145+
newBurst.setStartingMana(burst.getStartingMana());
146+
newBurst.setMinManaLoss(burst.getMinManaLoss());
147+
newBurst.setManaLossPerTick(burst.getManaLossPerTick());
148+
newBurst.setGravity(burst.getBurstGravity());
149+
burst.getBurstSourcePosition().ifPresent(newBurst::setBurstSourcePosition);
150+
newBurst.setSourceLens(burst.getSourceLens());
151+
newBurst.setTicksExisted(burst.getTicksExisted() + ManaP2PTunnelPart.EXTRA_TICKS_EXISTED);
227152

228-
@Override
229-
public boolean canReceiveManaFromBursts() {
230-
return false;
231-
}
153+
level.addFreshEntity(newBurst);
154+
level.playSound(null, pos, BotaniaSounds.spreaderFire, SoundSource.BLOCKS, 0.05F,
155+
0.7F + 0.3F * (float) Math.random());
232156
}
233157
}

src/main/java/appbot/item/cell/ManaCellHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class ManaCellHandler implements ICellHandler {
1616

1717
@Override
1818
public boolean isCell(ItemStack is) {
19-
return !is.isEmpty() && is.getItem() instanceof IManaCellItem;
19+
return is.getItem() instanceof IManaCellItem;
2020
}
2121

2222
@Nullable

src/main/java/appbot/mixins/BotaniaBlockEntitiesMixin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import vazkii.botania.common.block.block_entity.BotaniaBlockEntities;
1717
import vazkii.botania.common.lib.LibBlockNames;
1818

19-
@Mixin(value = BotaniaBlockEntities.class, remap = false)
19+
@Mixin(value = BotaniaBlockEntities.class)
2020
public abstract class BotaniaBlockEntitiesMixin {
2121

2222
@ModifyVariable(method = "type(Lnet/minecraft/resources/ResourceLocation;Lnet/minecraft/world/level/block/entity/BlockEntityType$BlockEntitySupplier;[Lnet/minecraft/world/level/block/Block;)Lnet/minecraft/world/level/block/entity/BlockEntityType;", at = @At("HEAD"), index = 1, argsOnly = true)

0 commit comments

Comments
 (0)