Skip to content

Commit

Permalink
Add portalcubed:fling trigger
Browse files Browse the repository at this point in the history
This takes two predicates:
+ `launcher` is a location predicate with the position of the Faith Plate.
+ `force` is a distance predicate with the XYZ values specified in the Faith Plate GUI.
  • Loading branch information
Gaming32 committed Jul 21, 2023
1 parent 0c89d64 commit 685caf7
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,9 @@ public boolean matches(ServerLevel level, @Nullable Vec3 position, EnergyPellet
@Override
public JsonObject serializeToJson(SerializationContext context) {
final JsonObject result = super.serializeToJson(context);
result.add("pellet", pellet.serializeToJson());
if (pellet != EntityPredicate.ANY) {
result.add("pellet", pellet.serializeToJson());
}
return result;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package com.fusionflux.portalcubed.advancements.triggers;

import com.google.gson.JsonObject;
import net.minecraft.advancements.critereon.*;
import net.minecraft.core.BlockPos;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;

import static com.fusionflux.portalcubed.PortalCubed.id;

public class FlingTrigger extends SimpleCriterionTrigger<FlingTrigger.TriggerInstance> {
public static final ResourceLocation ID = id("fling");

@NotNull
@Override
public ResourceLocation getId() {
return ID;
}

@NotNull
@Override
protected TriggerInstance createInstance(JsonObject json, ContextAwarePredicate predicate, DeserializationContext deserializationContext) {
return new TriggerInstance(
predicate,
LocationPredicate.fromJson(json.get("launcher")),
DistancePredicate.fromJson(json.get("force"))
);
}

public void trigger(ServerPlayer player, BlockPos launcherPos, Vec3 launcherForce) {
trigger(player, conditions -> conditions.matches(player.serverLevel(), launcherPos, launcherForce));
}

public static class TriggerInstance extends AbstractCriterionTriggerInstance {
private final LocationPredicate launcher;
private final DistancePredicate force;

public TriggerInstance(ContextAwarePredicate player, LocationPredicate launcher, DistancePredicate force) {
super(ID, player);
this.launcher = launcher;
this.force = force;
}

public boolean matches(ServerLevel level, BlockPos launcherPos, Vec3 launcherForce) {
return launcher.matches(level, launcherPos.getX() + 0.5, launcherPos.getY() + 0.5, launcherPos.getZ() + 0.5) &&
force.matches(0, 0, 0, launcherForce.x, launcherForce.y, launcherForce.z);
}

@NotNull
@Override
public JsonObject serializeToJson(SerializationContext context) {
final JsonObject result = super.serializeToJson(context);
if (launcher != LocationPredicate.ANY) {
result.add("launcher", launcher.serializeToJson());
}
if (force != DistancePredicate.ANY) {
result.add("force", force.serializeToJson());
}
return result;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,10 @@

public class PortalCubedTriggers {
public static final BounceTrigger BOUNCE = new BounceTrigger();
public static final FlingTrigger FLING = new FlingTrigger();

public static void register() {
CriteriaTriggers.register(BOUNCE);
CriteriaTriggers.register(FLING);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.fusionflux.portalcubed.blocks.blockentities;

import com.fusionflux.portalcubed.advancements.triggers.PortalCubedTriggers;
import com.fusionflux.portalcubed.blocks.FaithPlateBlock;
import com.fusionflux.portalcubed.blocks.PortalCubedBlocks;
import com.fusionflux.portalcubed.client.packet.PortalCubedClientPackets;
Expand Down Expand Up @@ -30,6 +31,7 @@
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.quiltmc.qsl.networking.api.PacketByteBufs;
import org.quiltmc.qsl.networking.api.ServerPlayNetworking;
Expand Down Expand Up @@ -79,7 +81,11 @@ public void tick(Level world, BlockPos pos, BlockState state) {
continue;
}
if (launch) {
RayonIntegration.INSTANCE.setVelocity(liver, new Vec3(velX, velY, velZ));
final Vec3 force = new Vec3(velX, velY, velZ);
RayonIntegration.INSTANCE.setVelocity(liver, force);
if (liver instanceof ServerPlayer player) {
PortalCubedTriggers.FLING.trigger(player, worldPosition, force);
}
}
timer = 5;
if (!world.isClientSide) {
Expand Down Expand Up @@ -173,6 +179,7 @@ public void writeScreenOpeningData(ServerPlayer player, FriendlyByteBuf buf) {
buf.writeDouble(velZ);
}

@NotNull
@Override
public Component getDisplayName() {
return Component.empty();
Expand Down

0 comments on commit 685caf7

Please sign in to comment.