Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
425 changes: 425 additions & 0 deletions scripts/advancements/gen_advancements.py

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.israelsimulator.advancement;

/**
* Names of the {@code israel_simulator:mod_event} criteria. Every advancement that uses the custom
* trigger must name one of these (checked by AchievementsAndProgressionTest).
*/
public final class AdvancementEvents {
public static final String WESTERN_WALL_PRAYER = "western_wall_prayer";
public static final String ARK_PRAYER = "ark_prayer";
public static final String TEFILLIN_BOUND = "tefillin_bound";
public static final String SHOFAR_BLOW = "shofar_blow";
public static final String KIPPAH_CAT = "kippah_cat";
public static final String DEAD_SEA_FLOAT = "dead_sea_float";
public static final String MUD_BATH = "mud_bath";
public static final String SHABBAT_REST = "shabbat_rest";
public static final String SHABBAT_WORK_BLOCKED = "shabbat_work_blocked";
public static final String WORK_SESSION = "work_session";
public static final String STARTUP_EXIT = "startup_exit";
public static final String DELIVERY_GIG = "delivery_gig";
public static final String DRONE_LAUNCH = "drone_launch";
public static final String TRAIN_RIDE = "train_ride";
public static final String TRAIN_RIDE_RAV_KAV = "train_ride_rav_kav";
public static final String MOSSAD_MISSION = "mossad_mission";
public static final String MOSSAD_VETERAN = "mossad_veteran";
public static final String BIBI_SUMMON = "bibi_summon";
public static final String PLANE_CRASH = "plane_crash";
/** Prefix of the per-festival events: {@code festival_shabbat}, {@code festival_hanukkah}, ... */
public static final String FESTIVAL_PREFIX = "festival_";

/** Missions a player must complete for {@link #MOSSAD_VETERAN}. */
public static final int MOSSAD_VETERAN_MISSIONS = 5;

private AdvancementEvents() {}

public static String festival(String festivalId) {
return FESTIVAL_PREFIX + festivalId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.israelsimulator.advancement;

import com.israelsimulator.festival.FestivalManager;
import com.israelsimulator.festival.FestivalType;
import com.israelsimulator.registry.ModTriggers;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.entity.Entity;

/** Fires {@code israel_simulator:mod_event} criteria from gameplay code. Server side only; safe anywhere. */
public final class IsraelAdvancements {
private IsraelAdvancements() {}

public static void award(Entity entity, String event) {
if (!(entity instanceof ServerPlayer player) || !ModTriggers.EVENT.isBound()) {
return;
}
ModTriggers.EVENT.get().trigger(player, event);
}

/** Once a second per player: festivals (and Shabbat) the player is around for. */
public static void tickPlayer(ServerPlayer player) {
FestivalType festival = FestivalManager.getCurrentFestival(player.level().getGameTime());
if (festival != null) {
award(player, AdvancementEvents.festival(festival.getId()));
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.israelsimulator.advancement;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.Optional;
import net.minecraft.advancements.predicates.ContextAwarePredicate;
import net.minecraft.advancements.predicates.entity.EntityPredicate;
import net.minecraft.advancements.triggers.SimpleCriterionTrigger;
import net.minecraft.server.level.ServerPlayer;

/**
* {@code israel_simulator:mod_event}: one criterion trigger for every mod action that has no vanilla
* trigger (prayers, Dead Sea floating, startup work, train rides, festivals, ...). The advancement
* names the action in {@code conditions.event}; the code fires it through {@link IsraelAdvancements}.
* The valid names are the constants of {@link AdvancementEvents}.
*/
public class IsraelEventTrigger extends SimpleCriterionTrigger<IsraelEventTrigger.TriggerInstance> {
@Override
public Codec<TriggerInstance> codec() {
return TriggerInstance.CODEC;
}

public void trigger(ServerPlayer player, String event) {
this.trigger(player, instance -> instance.event().equals(event));
}

public record TriggerInstance(Optional<ContextAwarePredicate> player, String event)
implements SimpleCriterionTrigger.SimpleInstance {
public static final Codec<TriggerInstance> CODEC = RecordCodecBuilder.create(i -> i.group(
EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(TriggerInstance::player),
Codec.STRING.fieldOf("event").forGetter(TriggerInstance::event))
.apply(i, TriggerInstance::new));
}
}
2 changes: 2 additions & 0 deletions src/main/java/com/israelsimulator/deadsea/DeadSeaSpa.java
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ public static void tickPlayer(ServerPlayer player) {
lastBath.put(id, now);
soak.put(id, 0);
treat(player);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.MUD_BATH);
player.sendSystemMessage(Component.translatable("message.israel_simulator.dead_sea.mud_bath_done")
.withStyle(ChatFormatting.GOLD));
}
Expand All @@ -88,6 +89,7 @@ public static void tickPlayer(ServerPlayer player) {
if (f % FLOAT_SECONDS == 0) {
player.addEffect(new MobEffectInstance(MobEffects.REGENERATION, 100, 0, false, true, true));
if (f == FLOAT_SECONDS) {
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.DEAD_SEA_FLOAT);
player.sendSystemMessage(Component.translatable("message.israel_simulator.dead_sea.salt_float")
.withStyle(ChatFormatting.AQUA));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,7 @@ public static boolean interactWithCat(ServerPlayer player, Cat cat, ItemStack he
return false;
}
recordInteraction(cooldowns, player.getUUID(), now);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.KIPPAH_CAT);

player.sendSystemMessage(Component.literal("The cat squints approvingly at your Kippah and purrs in holy serenity.")
.withStyle(ChatFormatting.AQUA));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -273,10 +273,18 @@ private Vec3 getNosePosition() {
return this.position().add(dir.scale(21.0));
}

/** Players this close to the impact see the crash ("Brace for Impact" advancement). */
static final double PLANE_WITNESS_RANGE = 160.0;

private void detonatePlaneCrash(ServerLevel serverLevel) {
if (isEmbedded()) return;

this.entityData.set(DATA_EMBEDDED, true);
for (net.minecraft.server.level.ServerPlayer witness : serverLevel.players()) {
if (witness.isAlive() && !witness.isSpectator() && witness.distanceToSqr(this) <= PLANE_WITNESS_RANGE * PLANE_WITNESS_RANGE) {
com.israelsimulator.advancement.IsraelAdvancements.award(witness, com.israelsimulator.advancement.AdvancementEvents.PLANE_CRASH);
}
}
this.flightVelocity = Vec3.ZERO;
this.setDeltaMovement(Vec3.ZERO);
this.entityData.set(DATA_VEL_X, 0.0F);
Expand Down
1 change: 1 addition & 0 deletions src/main/java/com/israelsimulator/event/ModGameEvents.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,7 @@ public static void onEntityTick(net.neoforged.neoforge.event.tick.EntityTickEven
com.israelsimulator.westernwall.WesternWallManager.tickPlayer(serverPlayer);
if (serverPlayer.tickCount % 20 == 0) {
com.israelsimulator.deadsea.DeadSeaSpa.tickPlayer(serverPlayer);
com.israelsimulator.advancement.IsraelAdvancements.tickPlayer(serverPlayer);
com.israelsimulator.world.map.PlayerLandmarkTracker.checkProximityAndDiscover(serverPlayer);
com.israelsimulator.city.telaviv.TelAvivDistrictManager.checkPlayerDistrict(serverPlayer);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public static void tick(ServerLevel level) {
if (!rested(last, now)) continue;
p.addEffect(new MobEffectInstance(MobEffects.REGENERATION, REGEN_TICKS, 0, true, false, true));
p.addEffect(new MobEffectInstance(MobEffects.SATURATION, 1, 0, true, false, false));
com.israelsimulator.advancement.IsraelAdvancements.award(p, com.israelsimulator.advancement.AdvancementEvents.SHABBAT_REST);
p.sendOverlayMessage(Component.translatable("message.israel_simulator.shabbat.rest")
.withStyle(ChatFormatting.AQUA));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
drone.snapTo(pos.x, pos.y, pos.z, player.getYRot(), 0.0F);
drone.setOwner(player);
server.addFreshEntity(drone);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.DRONE_LAUNCH);
server.playSound(null, pos.x, pos.y, pos.z, SoundEvents.BEEHIVE_EXIT, SoundSource.PLAYERS, 1.0F, 1.5F);
}
player.getCooldowns().addCooldown(stack, COOLDOWN_TICKS);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
p.sendSystemMessage(summonMsg);
}

com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.BIBI_SUMMON);

// Consume Star of David in Survival mode
if (!player.getAbilities().instabuild) {
held.shrink(1);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {

// Apply blessings: BlessedEffect + Resistance + Strength if also wearing Talit
BlessedEffect.applyTo(player);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.TEFILLIN_BOUND);
boolean hasTalit = TalitItem.isWearingTalit(player);
if (hasTalit) {
player.addEffect(new MobEffectInstance(MobEffects.STRENGTH, 6000, 0));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
player.getX(), player.getY() + 1.0, player.getZ(),
20, 0.4, 0.4, 0.4, 0.2);

com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.SHOFAR_BLOW);
player.sendSystemMessage(Component.translatable("message.israel_simulator.shofar_blast")
.withStyle(ChatFormatting.GOLD));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
if (player.getCooldowns().isOnCooldown(stack)) return InteractionResult.FAIL;
if (WorkPlaces.isShabbat(level)) {
if (!level.isClientSide()) {
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.SHABBAT_WORK_BLOCKED);
player.sendSystemMessage(Component.translatable("message.israel_simulator.work.shabbat").withStyle(ChatFormatting.YELLOW));
}
return InteractionResult.FAIL;
Expand Down Expand Up @@ -60,10 +61,12 @@ public ItemStack finishUsingItem(ItemStack stack, Level level, LivingEntity enti
ItemStack money = new ItemStack(ModItems.SHEKEL.get(), pay);
if (!player.getInventory().add(money)) player.drop(money, false);
player.causeFoodExhaustion(StartupWork.WORK_EXHAUSTION);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.WORK_SESSION);
player.sendSystemMessage(Component.translatable(hub ? "message.israel_simulator.work.session_hub"
: "message.israel_simulator.work.session",
StartupWork.isExit(sessions) ? pay - StartupWork.EXIT_BONUS : pay, sessions).withStyle(ChatFormatting.GREEN));
if (StartupWork.isExit(sessions)) {
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.STARTUP_EXIT);
player.sendSystemMessage(Component.translatable("message.israel_simulator.work.exit", StartupWork.EXIT_BONUS)
.withStyle(ChatFormatting.GOLD));
level.playSound(null, player.blockPosition(), SoundEvents.PLAYER_LEVELUP, SoundSource.PLAYERS, 1.0F, 1.0F);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
}
}
if (WorkPlaces.isShabbat(level)) {
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.SHABBAT_WORK_BLOCKED);
player.sendSystemMessage(Component.translatable("message.israel_simulator.work.shabbat").withStyle(ChatFormatting.YELLOW));
return InteractionResult.SUCCESS;
}
Expand All @@ -50,6 +51,7 @@ public InteractionResult use(Level level, Player player, InteractionHand hand) {
ItemStack money = new ItemStack(ModItems.SHEKEL.get(), StartupWork.GIG_PAY);
if (!player.getInventory().add(money)) player.drop(money, false);
player.causeFoodExhaustion(1.0F);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.DELIVERY_GIG);
player.sendSystemMessage(Component.translatable("message.israel_simulator.work.gig", StartupWork.GIG_PAY)
.withStyle(ChatFormatting.GREEN));
level.playSound(null, player.blockPosition(), SoundEvents.NOTE_BLOCK_BELL.value(), SoundSource.PLAYERS, 0.7F, 1.6F);
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/israelsimulator/mossad/MossadMissions.java
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,10 @@ private static void complete(ServerPlayer player, MossadData data, MossadData.En
}
}
data.setDirty();
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.MOSSAD_MISSION);
if (e.completed >= com.israelsimulator.advancement.AdvancementEvents.MOSSAD_VETERAN_MISSIONS) {
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.MOSSAD_VETERAN);
}
player.level().playSound(null, player.blockPosition(), SoundEvents.PLAYER_LEVELUP, SoundSource.PLAYERS, 0.8F, 1.2F);
say(player, Component.translatable("mossad.israel_simulator.completed", Component.translatable(m.translationKey()),
m.reputationReward(), rep).withStyle(ChatFormatting.GREEN));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ public static void register(IEventBus modEventBus) {
ModMobEffects.register(modEventBus);
ModSoundEvents.register(modEventBus);
ModParticles.register(modEventBus);
ModTriggers.register(modEventBus);
ModWorldGen.register(modEventBus);
ModNetworking.register(modEventBus);
IsraelSimulatorData.register(modEventBus);
Expand Down
25 changes: 25 additions & 0 deletions src/main/java/com/israelsimulator/registry/ModTriggers.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.israelsimulator.registry;

import com.israelsimulator.IsraelSimulator;
import com.israelsimulator.advancement.IsraelEventTrigger;
import net.minecraft.advancements.triggers.CriterionTrigger;
import net.minecraft.core.registries.Registries;
import net.neoforged.bus.api.IEventBus;
import net.neoforged.neoforge.registries.DeferredHolder;
import net.neoforged.neoforge.registries.DeferredRegister;

/** Advancement criterion triggers of the mod. */
public final class ModTriggers {
public static final DeferredRegister<CriterionTrigger<?>> TRIGGERS =
DeferredRegister.create(Registries.TRIGGER_TYPE, IsraelSimulator.MOD_ID);

/** {@code israel_simulator:mod_event}, see {@link IsraelEventTrigger}. */
public static final DeferredHolder<CriterionTrigger<?>, IsraelEventTrigger> EVENT =
TRIGGERS.register("mod_event", IsraelEventTrigger::new);

private ModTriggers() {}

public static void register(IEventBus modEventBus) {
TRIGGERS.register(modEventBus);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ public static boolean tryArkPray(Player player, InteractionHand hand, BlockPos p

cooldowns.setLastUseTime(player.getUUID(), level.getGameTime());
BlessedEffect.applyTo(player);
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.ARK_PRAYER);

if (isOffering) {
player.sendSystemMessage(Component.translatable("message.israel_simulator.ark_offering_complete"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ private InteractionResult handleInteraction(Level level, BlockPos pos, Player pl
}

recordTransit(cooldowns, player.getUUID(), now);
com.israelsimulator.advancement.IsraelAdvancements.award(serverPlayer, com.israelsimulator.advancement.AdvancementEvents.TRAIN_RIDE);
if (hasRavKav) {
com.israelsimulator.advancement.IsraelAdvancements.award(serverPlayer, com.israelsimulator.advancement.AdvancementEvents.TRAIN_RIDE_RAV_KAV);
}

// Departure: whistle at the departing platform, a short dark "tunnel" while travelling
ModAudioManager.playTransitSound(level, pos, TransportType.TRAIN.name());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@ private static void complete(ServerPlayer player, WesternWallPrayerSession sessi
40, 0.6, 0.6, 0.6, 0.2);

player.sendSystemMessage(Component.translatable("message.israel_simulator.western_wall_blessed"));
com.israelsimulator.advancement.IsraelAdvancements.award(player, com.israelsimulator.advancement.AdvancementEvents.WESTERN_WALL_PRAYER);
player.sendOverlayMessage(Component.empty());
}

Expand Down
Loading
Loading