Skip to content

Commit 48bb409

Browse files
authored
Make Experience Lanterns pull in experience orbs (#288)
1 parent 068a4da commit 48bb409

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

src/main/java/plus/dragons/createenchantmentindustry/common/fluids/lantern/ExperienceLanternBlockEntity.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ public void tick() {
6767
if (!level.isClientSide && level.getGameTime() % 10 == 0) {
6868
drainExp();
6969
}
70+
if (!level.isClientSide && CEIConfig.fluids().experienceLanternPullToggle.get()) {
71+
pullExp();
72+
}
7073
}
7174

7275
public FluidTankBehaviour getTank() {
@@ -128,6 +131,19 @@ protected void drainExp() {
128131
}
129132
}
130133

134+
protected void pullExp() {
135+
List<ExperienceOrb> experienceOrbs = level.getEntitiesOfClass(ExperienceOrb.class, effectiveAABB.inflate(CEIConfig.fluids().experienceLanternPullRadius.get()));
136+
if (!experienceOrbs.isEmpty()) {
137+
for (var orb : experienceOrbs) {
138+
if (orb.getDeltaMovement().length() <= .5) {
139+
var pushForce = CEIConfig.fluids().experienceLanternPullForceMultiplier.get() * 1 / orb.position().distanceTo(getBlockPos().getCenter());
140+
var directionToLantern = getBlockPos().getCenter().subtract(orb.position()).normalize().multiply(pushForce, pushForce, pushForce);
141+
orb.push(directionToLantern);
142+
}
143+
}
144+
}
145+
}
146+
131147
@Override
132148
public void addBehaviours(List<BlockEntityBehaviour> behaviours) {
133149
tank = new FluidTankBehaviour(this, this::createTank);

src/main/java/plus/dragons/createenchantmentindustry/common/fluids/lantern/ExperienceLanternMovementBehavior.java

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import net.minecraft.world.entity.player.Player;
2929
import net.minecraft.world.level.Level;
3030
import net.minecraft.world.phys.AABB;
31+
import net.minecraft.world.phys.Vec3;
3132
import net.neoforged.neoforge.fluids.FluidStack;
3233
import net.neoforged.neoforge.fluids.capability.IFluidHandler;
3334
import plus.dragons.createenchantmentindustry.common.fluids.experience.ExperienceHelper;
@@ -37,11 +38,17 @@
3738
public class ExperienceLanternMovementBehavior implements MovementBehaviour {
3839
@Override
3940
public void tick(MovementContext context) {
41+
var effectiveAABB = new AABB(context.position.subtract(0.5d, 0.5d, 0.5d), context.position.add(0.5d, 0.5d, 0.5d)).inflate(0.5);
4042
if (!context.world.isClientSide && context.world.getGameTime() % 10 == 0) {
4143
drainExp(context.world,
42-
new AABB(context.position.subtract(0.5d, 0.5d, 0.5d), context.position.add(0.5d, 0.5d, 0.5d)).inflate(0.5),
44+
effectiveAABB,
4345
context.contraption.getStorage().getFluids());
4446
}
47+
if (!context.world.isClientSide && CEIConfig.fluids().experienceLanternPullToggle.get()) {
48+
pullExp(context.world,
49+
effectiveAABB,
50+
context.position);
51+
}
4552
}
4653

4754
protected void drainExp(Level level, AABB effectiveAABB, MountedFluidStorageWrapper tank) {
@@ -99,4 +106,17 @@ protected void drainExp(Level level, AABB effectiveAABB, MountedFluidStorageWrap
99106
}
100107
}
101108
}
109+
110+
protected void pullExp(Level level, AABB effectiveAABB, Vec3 position) {
111+
List<ExperienceOrb> experienceOrbs = level.getEntitiesOfClass(ExperienceOrb.class, effectiveAABB.inflate(CEIConfig.fluids().experienceLanternPullRadius.get()));
112+
if (!experienceOrbs.isEmpty()) {
113+
for (var orb : experienceOrbs) {
114+
if (orb.getDeltaMovement().length() <= .5) {
115+
var pushForce = CEIConfig.fluids().experienceLanternPullForceMultiplier.get() * 1 / orb.position().distanceTo(position);
116+
var directionToLantern = position.subtract(orb.position()).normalize().multiply(pushForce, pushForce, pushForce);
117+
orb.push(directionToLantern);
118+
}
119+
}
120+
}
121+
}
102122
}

src/main/java/plus/dragons/createenchantmentindustry/config/CEIFluidsConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,15 @@ public class CEIFluidsConfig extends ConfigBase {
8181
"experienceLanternDrainRate",
8282
Comments.experienceLanternDrainRate,
8383
RequiresRestart.SERVER.asComment());
84+
public final ConfigBool experienceLanternPullToggle = b(true,
85+
"experienceLanternPullToggle",
86+
Comments.experienceLanternPullToggle);
87+
public final ConfigInt experienceLanternPullRadius = i(10, 0,
88+
"experienceLanternPullRadius",
89+
Comments.experienceLanternPullRadius);
90+
public final ConfigFloat experienceLanternPullForceMultiplier = f(.075f, 0.0f, .5f,
91+
"experienceLanternPullForceMultiplier",
92+
Comments.experienceLanternPullForceMultiplier);
8493

8594
@Override
8695
public String getName() {
@@ -106,5 +115,8 @@ static class Comments {
106115
static final String blazeForgerFluidCapacity = "The amount of liquid a Blaze Forger can hold (mB).";
107116
static final String experienceLanternFluidCapacity = "The amount of liquid an Experience Lantern can hold (mB).";
108117
static final String experienceLanternDrainRate = "The amount of experience an Experience Lantern can drain from player per 0.5 ticks (mB).";
118+
static final String experienceLanternPullToggle = "Whether the Experience Lantern will pull in experience orbs from nearby.";
119+
static final String experienceLanternPullRadius = "The range at which experience orbs will be pulled into the lantern.";
120+
static final String experienceLanternPullForceMultiplier = "Modifier for the amount of force with which to pull the experience orbs.";
109121
}
110122
}

0 commit comments

Comments
 (0)