From 896047ad18334db4c38363a158d4120bdd6f8e22 Mon Sep 17 00:00:00 2001 From: TCDev <102576942+TCDev10@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:33:13 +0200 Subject: [PATCH 1/4] Trigger israel_simulator:mod_event per gli avanzamenti e hook nel gameplay --- .../advancement/AdvancementEvents.java | 38 +++++++++++++++++++ .../advancement/IsraelAdvancements.java | 27 +++++++++++++ .../advancement/IsraelEventTrigger.java | 34 +++++++++++++++++ .../israelsimulator/deadsea/DeadSeaSpa.java | 2 + .../easteregg/EasterEggManager.java | 1 + .../entity/event/PlaneCrashEntity.java | 8 ++++ .../israelsimulator/event/ModGameEvents.java | 1 + .../israelsimulator/festival/ShabbatRest.java | 1 + .../item/combat/PalantrioDroneItem.java | 1 + .../item/cultural/StarOfDavidItem.java | 2 + .../item/festival/ShofarItem.java | 1 + .../item/technology/LaptopItem.java | 3 ++ .../item/technology/SmartphoneItem.java | 2 + .../mossad/MossadMissions.java | 4 ++ .../registry/ModRegistries.java | 1 + .../israelsimulator/registry/ModTriggers.java | 25 ++++++++++++ .../synagogue/SynagogueManager.java | 1 + .../transport/TransportStopBlock.java | 4 ++ .../westernwall/WesternWallManager.java | 1 + 19 files changed, 157 insertions(+) create mode 100644 src/main/java/com/israelsimulator/advancement/AdvancementEvents.java create mode 100644 src/main/java/com/israelsimulator/advancement/IsraelAdvancements.java create mode 100644 src/main/java/com/israelsimulator/advancement/IsraelEventTrigger.java create mode 100644 src/main/java/com/israelsimulator/registry/ModTriggers.java diff --git a/src/main/java/com/israelsimulator/advancement/AdvancementEvents.java b/src/main/java/com/israelsimulator/advancement/AdvancementEvents.java new file mode 100644 index 0000000..05c0d75 --- /dev/null +++ b/src/main/java/com/israelsimulator/advancement/AdvancementEvents.java @@ -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; + } +} diff --git a/src/main/java/com/israelsimulator/advancement/IsraelAdvancements.java b/src/main/java/com/israelsimulator/advancement/IsraelAdvancements.java new file mode 100644 index 0000000..744b4a2 --- /dev/null +++ b/src/main/java/com/israelsimulator/advancement/IsraelAdvancements.java @@ -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())); + } + } +} diff --git a/src/main/java/com/israelsimulator/advancement/IsraelEventTrigger.java b/src/main/java/com/israelsimulator/advancement/IsraelEventTrigger.java new file mode 100644 index 0000000..f9e8787 --- /dev/null +++ b/src/main/java/com/israelsimulator/advancement/IsraelEventTrigger.java @@ -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 { + @Override + public Codec codec() { + return TriggerInstance.CODEC; + } + + public void trigger(ServerPlayer player, String event) { + this.trigger(player, instance -> instance.event().equals(event)); + } + + public record TriggerInstance(Optional player, String event) + implements SimpleCriterionTrigger.SimpleInstance { + public static final Codec 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)); + } +} diff --git a/src/main/java/com/israelsimulator/deadsea/DeadSeaSpa.java b/src/main/java/com/israelsimulator/deadsea/DeadSeaSpa.java index add20b9..f44ab28 100644 --- a/src/main/java/com/israelsimulator/deadsea/DeadSeaSpa.java +++ b/src/main/java/com/israelsimulator/deadsea/DeadSeaSpa.java @@ -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)); } @@ -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)); } diff --git a/src/main/java/com/israelsimulator/easteregg/EasterEggManager.java b/src/main/java/com/israelsimulator/easteregg/EasterEggManager.java index c081e2d..60679de 100644 --- a/src/main/java/com/israelsimulator/easteregg/EasterEggManager.java +++ b/src/main/java/com/israelsimulator/easteregg/EasterEggManager.java @@ -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)); diff --git a/src/main/java/com/israelsimulator/entity/event/PlaneCrashEntity.java b/src/main/java/com/israelsimulator/entity/event/PlaneCrashEntity.java index 0340f63..96e7a1a 100644 --- a/src/main/java/com/israelsimulator/entity/event/PlaneCrashEntity.java +++ b/src/main/java/com/israelsimulator/entity/event/PlaneCrashEntity.java @@ -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); diff --git a/src/main/java/com/israelsimulator/event/ModGameEvents.java b/src/main/java/com/israelsimulator/event/ModGameEvents.java index a55bc67..5bb28fd 100644 --- a/src/main/java/com/israelsimulator/event/ModGameEvents.java +++ b/src/main/java/com/israelsimulator/event/ModGameEvents.java @@ -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); } diff --git a/src/main/java/com/israelsimulator/festival/ShabbatRest.java b/src/main/java/com/israelsimulator/festival/ShabbatRest.java index 5c0daeb..6bf40c6 100644 --- a/src/main/java/com/israelsimulator/festival/ShabbatRest.java +++ b/src/main/java/com/israelsimulator/festival/ShabbatRest.java @@ -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)); } diff --git a/src/main/java/com/israelsimulator/item/combat/PalantrioDroneItem.java b/src/main/java/com/israelsimulator/item/combat/PalantrioDroneItem.java index e7aa61a..248345c 100644 --- a/src/main/java/com/israelsimulator/item/combat/PalantrioDroneItem.java +++ b/src/main/java/com/israelsimulator/item/combat/PalantrioDroneItem.java @@ -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); diff --git a/src/main/java/com/israelsimulator/item/cultural/StarOfDavidItem.java b/src/main/java/com/israelsimulator/item/cultural/StarOfDavidItem.java index f6e744d..3bc1b58 100644 --- a/src/main/java/com/israelsimulator/item/cultural/StarOfDavidItem.java +++ b/src/main/java/com/israelsimulator/item/cultural/StarOfDavidItem.java @@ -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); diff --git a/src/main/java/com/israelsimulator/item/festival/ShofarItem.java b/src/main/java/com/israelsimulator/item/festival/ShofarItem.java index 27d67a7..1e24326 100644 --- a/src/main/java/com/israelsimulator/item/festival/ShofarItem.java +++ b/src/main/java/com/israelsimulator/item/festival/ShofarItem.java @@ -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)); diff --git a/src/main/java/com/israelsimulator/item/technology/LaptopItem.java b/src/main/java/com/israelsimulator/item/technology/LaptopItem.java index 1c421be..5083e0d 100644 --- a/src/main/java/com/israelsimulator/item/technology/LaptopItem.java +++ b/src/main/java/com/israelsimulator/item/technology/LaptopItem.java @@ -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; @@ -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); diff --git a/src/main/java/com/israelsimulator/item/technology/SmartphoneItem.java b/src/main/java/com/israelsimulator/item/technology/SmartphoneItem.java index 914c591..a15e11a 100644 --- a/src/main/java/com/israelsimulator/item/technology/SmartphoneItem.java +++ b/src/main/java/com/israelsimulator/item/technology/SmartphoneItem.java @@ -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; } @@ -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); diff --git a/src/main/java/com/israelsimulator/mossad/MossadMissions.java b/src/main/java/com/israelsimulator/mossad/MossadMissions.java index 409dd05..631187b 100644 --- a/src/main/java/com/israelsimulator/mossad/MossadMissions.java +++ b/src/main/java/com/israelsimulator/mossad/MossadMissions.java @@ -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)); diff --git a/src/main/java/com/israelsimulator/registry/ModRegistries.java b/src/main/java/com/israelsimulator/registry/ModRegistries.java index cde140e..5ded66e 100644 --- a/src/main/java/com/israelsimulator/registry/ModRegistries.java +++ b/src/main/java/com/israelsimulator/registry/ModRegistries.java @@ -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); diff --git a/src/main/java/com/israelsimulator/registry/ModTriggers.java b/src/main/java/com/israelsimulator/registry/ModTriggers.java new file mode 100644 index 0000000..d1d0419 --- /dev/null +++ b/src/main/java/com/israelsimulator/registry/ModTriggers.java @@ -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> TRIGGERS = + DeferredRegister.create(Registries.TRIGGER_TYPE, IsraelSimulator.MOD_ID); + + /** {@code israel_simulator:mod_event}, see {@link IsraelEventTrigger}. */ + public static final DeferredHolder, IsraelEventTrigger> EVENT = + TRIGGERS.register("mod_event", IsraelEventTrigger::new); + + private ModTriggers() {} + + public static void register(IEventBus modEventBus) { + TRIGGERS.register(modEventBus); + } +} diff --git a/src/main/java/com/israelsimulator/synagogue/SynagogueManager.java b/src/main/java/com/israelsimulator/synagogue/SynagogueManager.java index d90640e..610828e 100644 --- a/src/main/java/com/israelsimulator/synagogue/SynagogueManager.java +++ b/src/main/java/com/israelsimulator/synagogue/SynagogueManager.java @@ -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")); diff --git a/src/main/java/com/israelsimulator/transport/TransportStopBlock.java b/src/main/java/com/israelsimulator/transport/TransportStopBlock.java index ccfa486..c3343ba 100644 --- a/src/main/java/com/israelsimulator/transport/TransportStopBlock.java +++ b/src/main/java/com/israelsimulator/transport/TransportStopBlock.java @@ -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()); diff --git a/src/main/java/com/israelsimulator/westernwall/WesternWallManager.java b/src/main/java/com/israelsimulator/westernwall/WesternWallManager.java index d2fd234..e015e92 100644 --- a/src/main/java/com/israelsimulator/westernwall/WesternWallManager.java +++ b/src/main/java/com/israelsimulator/westernwall/WesternWallManager.java @@ -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()); } From 07c210af0a2a75967ec2d716b7fa1d4a9896e76b Mon Sep 17 00:00:00 2001 From: TCDev <102576942+TCDev10@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:37:35 +0200 Subject: [PATCH 2/4] Avanzamenti rifatti: 14 corretti, 40 nuovi, test e chiavi en/it --- scripts/advancements/gen_advancements.py | 425 +++++++++++++++++ .../item/cultural/TefillinItem.java | 1 + .../assets/israel_simulator/lang/en_us.json | 138 ++++-- .../assets/israel_simulator/lang/it_it.json | 138 ++++-- .../advancement/combat/hava_nagila.json | 11 +- .../advancement/combat/kill_epstein.json | 42 ++ .../advancement/combat/kill_trump.json | 39 ++ .../advancement/combat/summon_bibi.json | 31 ++ .../advancement/cultural/ark_prayer.json | 31 ++ .../cultural/dressed_for_prayer.json | 49 ++ .../cultural/freedom_of_speech.json | 4 +- .../advancement/cultural/shalom.json | 31 +- .../advancement/cultural/shofar.json | 31 ++ .../advancement/cultural/tefillin_prayer.json | 31 ++ .../advancement/economy/blessed_trader.json | 34 +- .../advancement/economy/first_shekel.json | 35 ++ .../advancement/economy/five_diamonds.json | 19 +- .../advancement/economy/money_changer.json | 39 ++ .../advancement/economy/shuk_haggler.json | 39 ++ .../advancement/economy/small_change.json | 35 ++ .../advancement/events/plane_crash.json | 31 ++ .../exploration/ancient_sanctuary.json | 41 ++ .../exploration/dead_sea_souvenirs.json | 48 ++ .../exploration/dead_sea_tourist.json | 30 +- .../advancement/exploration/ein_gedi.json | 41 ++ .../advancement/exploration/gaza_strip.json | 41 ++ .../exploration/government_building.json | 41 ++ .../advancement/exploration/grand_market.json | 41 ++ .../advancement/exploration/jaffa.json | 29 +- .../exploration/judean_desert.json | 41 ++ .../exploration/master_explorer.json | 304 +++++++++++- .../advancement/exploration/tel_aviv.json | 41 ++ .../exploration/tel_aviv_nights.json | 34 +- .../exploration/tropical_island.json | 41 ++ .../advancement/exploration/twin_towers.json | 41 ++ .../exploration/visit_jerusalem.json | 31 +- .../exploration/welcome_to_israel.json | 29 +- .../advancement/exploration/western_wall.json | 41 ++ .../advancement/festival/all_festivals.json | 88 ++++ .../advancement/festival/hanukkah.json | 42 ++ .../advancement/festival/pesach.json | 42 ++ .../advancement/festival/purim.json | 42 ++ .../advancement/festival/shabbat_shalom.json | 31 ++ .../advancement/food/harvest.json | 74 +++ .../advancement/food/hummus_connoisseur.json | 66 +++ .../advancement/food/moshav.json | 41 ++ .../advancement/food/taste_of_israel.json | 223 +++++++++ .../mossad/counterintelligence.json | 39 ++ .../advancement/mossad/mossad_recruit.json | 31 ++ .../advancement/mossad/mossad_veteran.json | 31 ++ .../secret/hummus_connoisseur.json | 57 --- .../advancement/secret/not_on_shabbat.json | 31 ++ .../advancement/secret/secret_kippah_cat.json | 16 +- .../advancement/technology/drone_launch.json | 31 ++ .../advancement/technology/startup_exit.json | 34 ++ .../technology/startup_founder.json | 37 +- .../technology/startup_office.json | 41 ++ .../advancement/transport/first_train.json | 31 ++ .../advancement/transport/rav_kav.json | 31 ++ .../data/israel_simulator/recipe/rav_kav.json | 18 + .../AchievementsAndProgressionTest.java | 446 +++++++++++------- test.md | 40 ++ wiki/Transportation.md | 1 + 63 files changed, 3239 insertions(+), 474 deletions(-) create mode 100644 scripts/advancements/gen_advancements.py create mode 100644 src/main/resources/data/israel_simulator/advancement/combat/kill_epstein.json create mode 100644 src/main/resources/data/israel_simulator/advancement/combat/kill_trump.json create mode 100644 src/main/resources/data/israel_simulator/advancement/combat/summon_bibi.json create mode 100644 src/main/resources/data/israel_simulator/advancement/cultural/ark_prayer.json create mode 100644 src/main/resources/data/israel_simulator/advancement/cultural/dressed_for_prayer.json create mode 100644 src/main/resources/data/israel_simulator/advancement/cultural/shofar.json create mode 100644 src/main/resources/data/israel_simulator/advancement/cultural/tefillin_prayer.json create mode 100644 src/main/resources/data/israel_simulator/advancement/economy/first_shekel.json create mode 100644 src/main/resources/data/israel_simulator/advancement/economy/money_changer.json create mode 100644 src/main/resources/data/israel_simulator/advancement/economy/shuk_haggler.json create mode 100644 src/main/resources/data/israel_simulator/advancement/economy/small_change.json create mode 100644 src/main/resources/data/israel_simulator/advancement/events/plane_crash.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/ancient_sanctuary.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_souvenirs.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/ein_gedi.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/gaza_strip.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/government_building.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/grand_market.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/judean_desert.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/tropical_island.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/twin_towers.json create mode 100644 src/main/resources/data/israel_simulator/advancement/exploration/western_wall.json create mode 100644 src/main/resources/data/israel_simulator/advancement/festival/all_festivals.json create mode 100644 src/main/resources/data/israel_simulator/advancement/festival/hanukkah.json create mode 100644 src/main/resources/data/israel_simulator/advancement/festival/pesach.json create mode 100644 src/main/resources/data/israel_simulator/advancement/festival/purim.json create mode 100644 src/main/resources/data/israel_simulator/advancement/festival/shabbat_shalom.json create mode 100644 src/main/resources/data/israel_simulator/advancement/food/harvest.json create mode 100644 src/main/resources/data/israel_simulator/advancement/food/hummus_connoisseur.json create mode 100644 src/main/resources/data/israel_simulator/advancement/food/moshav.json create mode 100644 src/main/resources/data/israel_simulator/advancement/food/taste_of_israel.json create mode 100644 src/main/resources/data/israel_simulator/advancement/mossad/counterintelligence.json create mode 100644 src/main/resources/data/israel_simulator/advancement/mossad/mossad_recruit.json create mode 100644 src/main/resources/data/israel_simulator/advancement/mossad/mossad_veteran.json delete mode 100644 src/main/resources/data/israel_simulator/advancement/secret/hummus_connoisseur.json create mode 100644 src/main/resources/data/israel_simulator/advancement/secret/not_on_shabbat.json create mode 100644 src/main/resources/data/israel_simulator/advancement/technology/drone_launch.json create mode 100644 src/main/resources/data/israel_simulator/advancement/technology/startup_exit.json create mode 100644 src/main/resources/data/israel_simulator/advancement/technology/startup_office.json create mode 100644 src/main/resources/data/israel_simulator/advancement/transport/first_train.json create mode 100644 src/main/resources/data/israel_simulator/advancement/transport/rav_kav.json create mode 100644 src/main/resources/data/israel_simulator/recipe/rav_kav.json diff --git a/scripts/advancements/gen_advancements.py b/scripts/advancements/gen_advancements.py new file mode 100644 index 0000000..38b90a9 --- /dev/null +++ b/scripts/advancements/gen_advancements.py @@ -0,0 +1,425 @@ +#!/usr/bin/env python3 +"""Generates every advancement JSON under data/israel_simulator/advancement and their +en_us / it_it lang keys. Edit the ADVANCEMENTS table and rerun: + + python3 scripts/advancements/gen_advancements.py + +Old files in the advancement folder are removed first, so the folder always matches the table. +""" +import json +import os +import shutil + +ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..")) +ADV_DIR = os.path.join(ROOT, "src/main/resources/data/israel_simulator/advancement") +LANG_DIR = os.path.join(ROOT, "src/main/resources/assets/israel_simulator/lang") +NS = "israel_simulator" +KEY = "advancements.israel_simulator." + + +def mod(path): + return path if ":" in path else f"{NS}:{path}" + + +# ---- criteria ------------------------------------------------------------------------------- + +def player_pred(predicate, *extra): + return [{"condition": "minecraft:entity_properties", "entity": "this", "predicate": predicate}, *extra] + + +def in_structure(structure, *extra): + return {"trigger": "minecraft:location", + "conditions": {"player": player_pred({"minecraft:location": {"structures": mod(structure)}}, *extra)}} + + +def in_biome(biome): + return {"trigger": "minecraft:location", + "conditions": {"player": player_pred({"minecraft:location": {"biomes": mod(biome)}})}} + + +def wearing(**slots): + return {"trigger": "minecraft:location", + "conditions": {"player": player_pred({"minecraft:equipment": {s: {"items": mod(i)} for s, i in slots.items()}})}} + + +def has(item, count=None): + pred = {"items": mod(item)} + if count: + pred["count"] = {"min": count} + return {"trigger": "minecraft:inventory_changed", "conditions": {"items": [pred]}} + + +def eat(item): + return {"trigger": "minecraft:consume_item", "conditions": {"item": {"items": mod(item)}}} + + +def kill(entity): + return {"trigger": "minecraft:player_killed_entity", + "conditions": {"entity": [{"condition": "minecraft:entity_properties", "entity": "this", + "predicate": {"minecraft:entity_type": mod(entity)}}]}} + + +def trade(villager, item=None, player=None): + c = {"villager": [{"condition": "minecraft:entity_properties", "entity": "this", + "predicate": {"minecraft:entity_type": mod(villager)}}]} + if item: + c["item"] = {"items": mod(item)} + if player: + c["player"] = player + return {"trigger": "minecraft:villager_trade", "conditions": c} + + +def effect(eff): + return {"trigger": "minecraft:effects_changed", "conditions": {"effects": {mod(eff): {}}}} + + +def event(name): + return {"trigger": f"{NS}:mod_event", "conditions": {"event": name}} + + +NIGHT = {"condition": "minecraft:time_check", "clock": "minecraft:overworld", "period": 24000, + "value": {"min": 13000, "max": 23000}} + +FESTIVALS = ["shabbat", "rosh_hashanah", "yom_kippur", "sukkot", "hanukkah", "purim", "pesach"] +MOD_FOODS = ["tahini", "dates", "grapes", "olives", "citrus", "chickpeas", "tomato", "eggplant", "sesame_seeds", + "challah", "rugelach", "falafel", "hummus", "shakshuka", "sabich", "matzo", "sufganiyah", "hamantash"] +EXPLORER_STRUCTURES = ["jerusalem_city", "western_wall", "grand_market", "great_synagogue", "tel_aviv_city", + "jaffa_port", "government_building", "startup_office", "twin_towers", "gaza_strip", + "ein_gedi_oasis", "ancient_sanctuary", "dead_sea_resort", "agricultural_farm", + "mediterranean_village", "tropical_island"] + +AND = "and" +OR = "or" + +# ---- the tree ------------------------------------------------------------------------------- +# (folder/name, parent name, icon, frame, hidden, criteria dict, AND|OR, xp, +# en title, en description, it title, it description) + +A = [] + + +def adv(path, parent, icon, frame, criteria, mode, en, it, hidden=False, xp=0): + A.append(dict(path=path, parent=parent, icon=icon, frame=frame, criteria=criteria, mode=mode, + en=en, it=it, hidden=hidden, xp=xp)) + + +# Root +adv("exploration/welcome_to_israel", None, "israel_map", "task", + {"in_israel": {"trigger": "minecraft:location", "conditions": {"player": player_pred( + {"minecraft:location": {"biomes": f"#{NS}:is_israel_region"}})}}}, OR, + ("Welcome to Israel", "Set foot in one of Israel's biomes"), + ("Benvenuto in Israele", "Metti piede in uno dei biomi d'Israele")) + +# Jerusalem +adv("exploration/visit_jerusalem", "welcome_to_israel", "jerusalem_stone", "task", + {"jerusalem": in_biome("jerusalem")}, OR, + ("Visit Jerusalem", "Reach the hills of Jerusalem"), + ("Visita Gerusalemme", "Raggiungi le colline di Gerusalemme")) +adv("exploration/western_wall", "visit_jerusalem", "western_wall_stone", "task", + {"western_wall": in_structure("western_wall")}, OR, + ("The Kotel", "Stand before the Western Wall"), + ("Il Kotel", "Arriva davanti al Muro del Pianto")) +adv("economy/five_diamonds", "western_wall", "minecraft:diamond", "goal", + {"prayed": event("western_wall_prayer")}, OR, + ("Five Diamonds", "Pray at the Western Wall with a Kippah and a Prayer Note"), + ("Cinque Diamanti", "Prega al Muro del Pianto con la Kippah e un Biglietto di preghiera")) +adv("exploration/grand_market", "visit_jerusalem", "olives", "task", + {"grand_market": in_structure("grand_market")}, OR, + ("Shuk Day", "Get lost in the Grand Market"), + ("Giornata al Shuk", "Perditi nel Grande mercato")) +adv("economy/shuk_haggler", "grand_market", "citrus", "task", + {"traded": trade("shuk_vendor")}, OR, + ("Best Price for You, My Friend", "Buy something from a Shuk vendor"), + ("Prezzo Speciale per Te, Amico", "Compra qualcosa da un venditore dello Shuk")) +adv("cultural/ark_prayer", "visit_jerusalem", "prayer_note", "task", + {"prayed": event("ark_prayer")}, OR, + ("Before the Ark", "Pray at the Torah Ark of a synagogue"), + ("Davanti all'Arca", "Prega davanti all'Arca santa di una sinagoga")) + +# Tel Aviv and the coast +adv("exploration/tel_aviv", "welcome_to_israel", "smartphone", "task", + {"tel_aviv": in_structure("tel_aviv_city")}, OR, + ("The Bubble", "Arrive in Tel Aviv"), + ("La Bolla", "Arriva a Tel Aviv")) +adv("exploration/tel_aviv_nights", "tel_aviv", "falafel", "task", + {"tel_aviv_at_night": in_structure("tel_aviv_city", NIGHT)}, OR, + ("Tel Aviv Nights", "Be in Tel Aviv after dark. The city never sleeps"), + ("Notti a Tel Aviv", "Resta a Tel Aviv dopo il tramonto. La città non dorme mai")) +adv("exploration/government_building", "tel_aviv", "first_amendment", "task", + {"government": in_structure("government_building")}, OR, + ("Coalition Talks", "Walk into the Government Building"), + ("Trattative di Coalizione", "Entra nel Palazzo del governo")) +adv("exploration/twin_towers", "tel_aviv", "minecraft:glass", "task", + {"twin_towers": in_structure("twin_towers")}, OR, + ("Skyline", "Find the Twin Towers"), + ("Skyline", "Trova le Twin Towers")) +adv("events/plane_crash", "twin_towers", "missile", "goal", + {"witnessed": event("plane_crash")}, OR, + ("Brace for Impact", "Be near the Twin Towers when a plane hits them"), + ("Prepararsi all'Impatto", "Trovati vicino alle Twin Towers quando un aereo le colpisce")) +adv("exploration/jaffa", "tel_aviv", "citrus", "task", + {"jaffa_port": in_structure("jaffa_port")}, OR, + ("Jaffa Oranges", "Visit the old port of Jaffa"), + ("Arance di Giaffa", "Visita il porto antico di Giaffa")) +adv("exploration/gaza_strip", "jaffa", "minecraft:sandstone_wall", "task", + {"gaza": in_structure("gaza_strip")}, OR, + ("Behind the Fence", "Enter the Gaza Strip"), + ("Oltre la Recinzione", "Entra nella Striscia di Gaza")) +adv("exploration/tropical_island", "jaffa", "dates", "task", + {"island": in_structure("tropical_island")}, OR, + ("Private Island", "Land on the tropical island. Don't ask about the guest list"), + ("Isola Privata", "Sbarca sull'isola tropicale. Non chiedere della lista degli ospiti")) + +# Desert and Dead Sea +adv("exploration/judean_desert", "welcome_to_israel", "minecraft:sand", "task", + {"desert": in_biome("judean_desert")}, OR, + ("Into the Wilderness", "Enter the Judean Desert. Bring water"), + ("Nel Deserto", "Entra nel Deserto della Giudea. Porta dell'acqua")) +adv("exploration/ein_gedi", "judean_desert", "date_palm_leaves", "task", + {"ein_gedi": in_structure("ein_gedi_oasis")}, OR, + ("Oasis", "Find the Ein Gedi oasis"), + ("Oasi", "Trova l'oasi di Ein Gedi")) +adv("exploration/ancient_sanctuary", "judean_desert", "dead_sea_scroll_fragment", "task", + {"sanctuary": in_structure("ancient_sanctuary")}, OR, + ("Lost Sanctuary", "Discover the Ancient Sanctuary in the desert"), + ("Santuario Perduto", "Scopri il Santuario antico nel deserto")) +adv("exploration/dead_sea_tourist", "judean_desert", "dead_sea_mud", "goal", + {"floated": event("dead_sea_float"), "mud_bath": event("mud_bath")}, AND, + ("Dead Sea Tourist", "Float on the Dead Sea and soak in a mud bath"), + ("Turista del Mar Morto", "Galleggia sul Mar Morto e fai un bagno di fango")) +adv("exploration/dead_sea_souvenirs", "dead_sea_tourist", "salt_block", "task", + {"mud": has("dead_sea_mud"), "salt": has("salt_block")}, AND, + ("Salt and Mud", "Take home Dead Sea Mud and a Salt Block"), + ("Sale e Fango", "Porta a casa il Fango del Mar Morto e un Blocco di sale del Mar Morto")) + +adv("exploration/master_explorer", "welcome_to_israel", "walking_shoes", "challenge", + {s: in_structure(s) for s in EXPLORER_STRUCTURES}, AND, + ("Master Explorer", "Visit every major place in Israel, from the Kotel to the Gaza Strip"), + ("Grande Esploratore", "Visita tutti i luoghi principali d'Israele, dal Kotel alla Striscia di Gaza"), + xp=500) + +# Culture and wearables +adv("cultural/shalom", "welcome_to_israel", "kippah", "task", + {"kippah": wearing(head="kippah")}, OR, + ("Shalom!", "Put on a Kippah"), + ("Shalom!", "Indossa una Kippah")) +adv("cultural/dressed_for_prayer", "shalom", "talit", "task", + {"dressed": wearing(head="kippah", chest="talit", legs="tefillin")}, OR, + ("Fully Dressed", "Wear a Kippah, a Talit and Tefillin at the same time"), + ("Vestito di Tutto Punto", "Indossa insieme Kippah, Talit e Tefillin")) +adv("cultural/tefillin_prayer", "dressed_for_prayer", "tefillin", "task", + {"bound": event("tefillin_bound")}, OR, + ("Morning Prayer", "Bind the Tefillin during the day while wearing a Kippah"), + ("Preghiera del Mattino", "Lega i Tefillin di giorno indossando la Kippah")) +adv("cultural/shofar", "shalom", "shofar", "task", + {"blown": event("shofar_blow")}, OR, + ("Sound the Shofar", "Blow a Shofar"), + ("Suona lo Shofar", "Suona uno Shofar")) +adv("cultural/freedom_of_speech", "shalom", "first_amendment", "goal", + {"has_first_amendment": has("first_amendment")}, OR, + ("Freedom of Speech", "Grab the First Amendment at the end of the public speech"), + ("Libertà di Parola", "Prendi il Primo emendamento alla fine del discorso in piazza")) +adv("secret/secret_kippah_cat", "shalom", "kippah", "task", + {"cat_approves": event("kippah_cat")}, OR, + ("Honorary Feline Citizen", "Show your Kippah to a cat"), + ("Gatto Onorario", "Mostra la tua Kippah a un gatto"), + hidden=True) + +# Shabbat and festivals +adv("festival/shabbat_shalom", "welcome_to_israel", "challah", "task", + {"rested": event("shabbat_rest")}, OR, + ("Shabbat Shalom", "Rest on Shabbat: no breaking, building or fighting, and get the rest bonus"), + ("Shabbat Shalom", "Riposati di Shabbat: niente scavare, costruire o combattere, e ricevi il bonus riposo")) +adv("secret/not_on_shabbat", "shabbat_shalom", "laptop", "task", + {"tried": event("shabbat_work_blocked")}, OR, + ("Not Today", "Try to work on Shabbat"), + ("Non Oggi", "Prova a lavorare di Shabbat"), + hidden=True) +adv("festival/hanukkah", "shabbat_shalom", "menorah", "task", + {"hanukkah": event("festival_hanukkah"), "sufganiyah": eat("sufganiyah")}, AND, + ("Festival of Lights", "Be around for Hanukkah and eat a Sufganiyah"), + ("Festa delle Luci", "Vivi Hanukkah e mangia una Sufganiyah")) +adv("festival/purim", "shabbat_shalom", "hamantash", "task", + {"purim": event("festival_purim"), "hamantash": eat("hamantash")}, AND, + ("Chag Purim Sameach", "Be around for Purim and eat a Hamantash"), + ("Chag Purim Sameach", "Vivi Purim e mangia un Hamantash")) +adv("festival/pesach", "shabbat_shalom", "matzo", "task", + {"pesach": event("festival_pesach"), "matzo": eat("matzo")}, AND, + ("Let My People Go", "Be around for Pesach and eat Matzo"), + ("Lascia Andare il Mio Popolo", "Vivi Pesach e mangia la Matzah")) +adv("festival/all_festivals", "hanukkah", "shofar", "challenge", + {f: event("festival_" + f) for f in FESTIVALS}, AND, + ("A Year in Israel", "Live through Shabbat and every festival: Rosh Hashanah, Yom Kippur, Sukkot, Hanukkah, Purim and Pesach"), + ("Un Anno in Israele", "Vivi lo Shabbat e tutte le feste: Rosh Hashanah, Yom Kippur, Sukkot, Hanukkah, Purim e Pesach"), + xp=300) + +# Money +adv("economy/first_shekel", "welcome_to_israel", "shekel", "task", + {"shekel": has("shekel")}, OR, + ("Your First Shekel", "Get a Shekel"), + ("Il Tuo Primo Shekel", "Procurati uno Shekel")) +adv("economy/small_change", "first_shekel", "agora", "task", + {"agora": has("agora")}, OR, + ("Small Change", "Find an Agora. A hundred make a Shekel"), + ("Spiccioli", "Trova un'Agorà. Ne servono cento per fare uno Shekel")) +adv("economy/money_changer", "first_shekel", "ancient_coin", "task", + {"traded": trade("money_changer")}, OR, + ("Exchange Rate", "Trade with a Money Changer"), + ("Tasso di Cambio", "Fai uno scambio con un Cambiavalute")) + +# Bosses +adv("combat/summon_bibi", "welcome_to_israel", "star_of_david", "task", + {"summoned": event("bibi_summon")}, OR, + ("He's Back", "Summon Bibi with the Star of David"), + ("È Tornato", "Evoca Bibi con la Stella di Davide")) +adv("combat/hava_nagila", "summon_bibi", "hava_nagila_disc", "challenge", + {"kill_bibi_boss": kill("bibi_boss"), "has_disc": has("hava_nagila_disc")}, AND, + ("Hava Nagila", "Defeat Bibi and pick up the Hava Nagila disc"), + ("Hava Nagila", "Sconfiggi Bibi e prendi il disco Hava Nagila"), + xp=500) +adv("economy/blessed_trader", "hava_nagila", "rabbis_crown", "challenge", + {"crowned_trade": {"trigger": "minecraft:villager_trade", "conditions": { + "player": player_pred({"minecraft:equipment": {"head": {"items": mod("rabbis_crown")}}})}}}, OR, + ("Blessed Trader", "Trade with a villager while wearing the Rabbi's Crown"), + ("Mercante Benedetto", "Fai uno scambio con un abitante del villaggio indossando la Corona del rabbino"), + xp=200) +adv("combat/kill_trump", "summon_bibi", "minecraft:golden_helmet", "goal", + {"trump": kill("trump_miniboss")}, OR, + ("You're Fired!", "Defeat Donald Trump during the Bibi fight"), + ("Sei Licenziato!", "Sconfiggi Donald Trump durante lo scontro con Bibi")) +adv("combat/kill_epstein", "summon_bibi", "minecraft:paper", "challenge", + {"epstein": kill("jeffrey_epstein")}, OR, + ("Case Closed", "Defeat Jeffrey Epstein. This time it's for real"), + ("Caso Chiuso", "Sconfiggi Jeffrey Epstein. Stavolta sul serio"), + hidden=True, xp=300) + +# Mossad +adv("mossad/mossad_recruit", "welcome_to_israel", "sealed_dossier", "task", + {"mission": event("mossad_mission")}, OR, + ("Recruited", "Complete a mission for the Mossad Handler"), + ("Reclutato", "Completa una missione per il referente del Mossad")) +adv("mossad/counterintelligence", "mossad_recruit", "pistol", "task", + {"agent": kill("mossad_agent")}, OR, + ("Counterintelligence", "Take down a hostile Mossad agent"), + ("Controspionaggio", "Elimina un agente del Mossad ostile")) +adv("mossad/mossad_veteran", "mossad_recruit", "assault_rifle", "goal", + {"veteran": event("mossad_veteran")}, OR, + ("Katsa", "Complete 5 Mossad missions"), + ("Katsa", "Completa 5 missioni del Mossad")) + +# Startup Nation +adv("technology/startup_office", "welcome_to_israel", "drone_part", "task", + {"office": in_structure("startup_office")}, OR, + ("Startup Nation", "Visit a Startup Office"), + ("Nazione Startup", "Visita l'Ufficio di una startup")) +adv("technology/startup_founder", "startup_office", "laptop", "goal", + {"work_session": event("work_session"), "delivery_gig": event("delivery_gig")}, OR, + ("Startup Founder", "Work a session on the Laptop or do a delivery with the Smartphone"), + ("Fondatore di Startup", "Fai una sessione di lavoro col Portatile o una consegna con lo Smartphone")) +adv("technology/startup_exit", "startup_founder", "laptop", "challenge", + {"exit": event("startup_exit")}, OR, + ("Exit!", "Work your startup all the way to an exit"), + ("Exit!", "Porta la tua startup fino all'exit"), + xp=300) +adv("technology/drone_launch", "startup_office", "palantrio_drone", "task", + {"launched": event("drone_launch")}, OR, + ("Eye in the Sky", "Launch a Palantrio Drone"), + ("Occhio dal Cielo", "Lancia un Palantrio Drone")) + +# Transport +adv("transport/first_train", "welcome_to_israel", "transport_stop", "task", + {"ride": event("train_ride")}, OR, + ("All Aboard", "Take the train between Tel Aviv and Jerusalem"), + ("Tutti a Bordo", "Prendi il treno tra Tel Aviv e Gerusalemme")) +adv("transport/rav_kav", "first_train", "rav_kav", "task", + {"rav_kav_ride": event("train_ride_rav_kav")}, OR, + ("Tap and Go", "Ride the train with a Rav-Kav"), + ("Appoggia e Vai", "Viaggia in treno con la Rav-Kav")) + +# Farm and food +adv("food/moshav", "welcome_to_israel", "chickpeas", "task", + {"farm": in_structure("agricultural_farm")}, OR, + ("Moshav Life", "Visit a farm in the Israeli Farmland"), + ("Vita da Moshav", "Visita una fattoria nelle campagne israeliane")) +adv("food/harvest", "moshav", "eggplant", "task", + {c: has(c) for c in ["chickpeas", "tomato", "eggplant", "sesame_seeds"]}, AND, + ("Fruits of the Land", "Collect chickpeas, tomatoes, eggplants and sesame seeds"), + ("Frutti della Terra", "Raccogli ceci, pomodori, melanzane e semi di sesamo")) +adv("food/hummus_connoisseur", "harvest", "hummus", "goal", + {f: eat(f) for f in ["hummus", "falafel", "shakshuka", "sabich"]}, AND, + ("Hummus Connoisseur", "Eat Hummus, Falafel, Shakshuka and Sabich"), + ("Intenditore di Hummus", "Mangia Hummus, Falafel, Shakshuka e Sabich")) +adv("food/taste_of_israel", "hummus_connoisseur", "sabich", "challenge", + {f: eat(f) for f in MOD_FOODS}, AND, + ("Taste of Israel", "Eat every Israeli food in the mod"), + ("Sapore d'Israele", "Mangia tutti i cibi israeliani della mod"), + xp=300) + + +# ---- writer --------------------------------------------------------------------------------- + +def name_of(path): + return path.split("/")[-1] + + +def build(): + by_name = {} + for a in A: + n = name_of(a["path"]) + assert n not in by_name, "duplicate advancement name " + n + by_name[n] = a + out = {} + for a in A: + n = name_of(a["path"]) + display = { + "icon": {"id": mod(a["icon"])}, + "title": {"translate": KEY + n + ".title"}, + "description": {"translate": KEY + n + ".description"}, + "frame": a["frame"], + "show_toast": True, + "announce_to_chat": a["parent"] is not None, + "hidden": a["hidden"], + } + j = {} + if a["parent"] is None: + display = {"background": f"{NS}:gui/advancements/backgrounds/israel_flag", **display} + else: + j["parent"] = f"{NS}:" + by_name[a["parent"]]["path"] + j["display"] = display + j["criteria"] = a["criteria"] + keys = list(a["criteria"]) + j["requirements"] = [keys] if a["mode"] == OR else [[k] for k in keys] + if a["xp"]: + j["rewards"] = {"experience": a["xp"]} + out[a["path"]] = j + return out + + +def main(): + advs = build() + if os.path.isdir(ADV_DIR): + shutil.rmtree(ADV_DIR) + for path, j in advs.items(): + f = os.path.join(ADV_DIR, path + ".json") + os.makedirs(os.path.dirname(f), exist_ok=True) + with open(f, "w", encoding="utf-8") as fh: + json.dump(j, fh, indent=2, ensure_ascii=False) + fh.write("\n") + for lang, idx in (("en_us", "en"), ("it_it", "it")): + f = os.path.join(LANG_DIR, lang + ".json") + with open(f, encoding="utf-8") as fh: + data = json.load(fh) + data = {k: v for k, v in data.items() if not k.startswith(KEY)} + for a in A: + n = name_of(a["path"]) + title, desc = a[idx] + data[KEY + n + ".title"] = title + data[KEY + n + ".description"] = desc + with open(f, "w", encoding="utf-8") as fh: + json.dump(data, fh, indent=2, ensure_ascii=False) + fh.write("\n") + print(f"{len(advs)} advancements written") + + +if __name__ == "__main__": + main() diff --git a/src/main/java/com/israelsimulator/item/cultural/TefillinItem.java b/src/main/java/com/israelsimulator/item/cultural/TefillinItem.java index ce88a3b..c0ab7aa 100644 --- a/src/main/java/com/israelsimulator/item/cultural/TefillinItem.java +++ b/src/main/java/com/israelsimulator/item/cultural/TefillinItem.java @@ -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)); diff --git a/src/main/resources/assets/israel_simulator/lang/en_us.json b/src/main/resources/assets/israel_simulator/lang/en_us.json index 4de963f..8042dd3 100644 --- a/src/main/resources/assets/israel_simulator/lang/en_us.json +++ b/src/main/resources/assets/israel_simulator/lang/en_us.json @@ -292,8 +292,6 @@ "speech.israel_simulator.epstein.quote_0": "\"I know people in very high places! You'll never get away with this!\"", "speech.israel_simulator.epstein.quote_1": "\"My island records are sealed! You cannot audit me!\"", "speech.israel_simulator.epstein.quote_2": "\"Connections run deep... so very deep!\"", - "advancements.israel_simulator.hava_nagila.title": "Hava Nagila", - "advancements.israel_simulator.hava_nagila.description": "Kill Bibi and pick up the Hava Nagila disc", "block.israel_simulator.paved_road": "Paved Road", "block.israel_simulator.transport_stop": "Transit Stop", "entity.israel_simulator.bicycle": "Bicycle", @@ -319,32 +317,6 @@ "subtitles.israel_simulator.train_whistle": "Train whistles", "subtitles.israel_simulator.transit_travel": "Vehicle departs", "subtitles.israel_simulator.landmark_discovered": "Landmark found", - "advancements.israel_simulator.welcome_to_israel.title": "Welcome to Israel", - "advancements.israel_simulator.welcome_to_israel.description": "Get a Map of Israel and your first Shekel", - "advancements.israel_simulator.shalom.title": "Shalom!", - "advancements.israel_simulator.shalom.description": "Get a Shekel and a Falafel", - "advancements.israel_simulator.visit_jerusalem.title": "Visit Jerusalem", - "advancements.israel_simulator.visit_jerusalem.description": "Pick up Jerusalem Stone and Western Wall Stone", - "advancements.israel_simulator.tel_aviv_nights.title": "Tel Aviv Nights", - "advancements.israel_simulator.tel_aviv_nights.description": "Bring a bicycle to the Mediterranean coast", - "advancements.israel_simulator.jaffa.title": "Jaffa Oranges", - "advancements.israel_simulator.jaffa.description": "Get Citrus and an Ancient Coin", - "advancements.israel_simulator.dead_sea_tourist.title": "Dead Sea Tourist", - "advancements.israel_simulator.dead_sea_tourist.description": "Collect Dead Sea mud and a salt block", - "advancements.israel_simulator.five_diamonds.title": "Five Diamonds", - "advancements.israel_simulator.five_diamonds.description": "Have 5 diamonds at once", - "advancements.israel_simulator.blessed_trader.title": "Blessed Trader", - "advancements.israel_simulator.blessed_trader.description": "Wear the Rabbi's Crown and get the Blessed Trader effect", - "advancements.israel_simulator.freedom_of_speech.title": "Freedom of Speech", - "advancements.israel_simulator.freedom_of_speech.description": "Get the First Amendment from the public speech", - "advancements.israel_simulator.startup_founder.title": "Startup Founder", - "advancements.israel_simulator.startup_founder.description": "Get a laptop, a smartphone and a drone part", - "advancements.israel_simulator.master_explorer.title": "Master Explorer", - "advancements.israel_simulator.master_explorer.description": "Have a bicycle, walking shoes and a Map of Israel", - "advancements.israel_simulator.secret_kippah_cat.title": "Honorary Feline Citizen", - "advancements.israel_simulator.secret_kippah_cat.description": "A stray cat approves of your Kippah", - "advancements.israel_simulator.hummus_connoisseur.title": "Hummus Connoisseur", - "advancements.israel_simulator.hummus_connoisseur.description": "Get Hummus, Falafel and Sabich", "message.israel_simulator.western_wall_praying": "Praying...", "message.israel_simulator.western_wall_prayer_interrupted": "Your prayer was interrupted.", "district.israel_simulator.white_city": "White City", @@ -515,5 +487,113 @@ "message.israel_simulator.work.gig": "Delivery gig done: +%s ₪.", "message.israel_simulator.shabbat.work": "It's Shabbat: you are working. No rest bonus for a minute.", "message.israel_simulator.shabbat.rest": "Shabbat rest: Menuchah (regeneration)", - "item.israel_simulator.shuk_vendor_spawn_egg": "Shuk Vendor Spawn Egg" + "item.israel_simulator.shuk_vendor_spawn_egg": "Shuk Vendor Spawn Egg", + "advancements.israel_simulator.welcome_to_israel.title": "Welcome to Israel", + "advancements.israel_simulator.welcome_to_israel.description": "Set foot in one of Israel's biomes", + "advancements.israel_simulator.visit_jerusalem.title": "Visit Jerusalem", + "advancements.israel_simulator.visit_jerusalem.description": "Reach the hills of Jerusalem", + "advancements.israel_simulator.western_wall.title": "The Kotel", + "advancements.israel_simulator.western_wall.description": "Stand before the Western Wall", + "advancements.israel_simulator.five_diamonds.title": "Five Diamonds", + "advancements.israel_simulator.five_diamonds.description": "Pray at the Western Wall with a Kippah and a Prayer Note", + "advancements.israel_simulator.grand_market.title": "Shuk Day", + "advancements.israel_simulator.grand_market.description": "Get lost in the Grand Market", + "advancements.israel_simulator.shuk_haggler.title": "Best Price for You, My Friend", + "advancements.israel_simulator.shuk_haggler.description": "Buy something from a Shuk vendor", + "advancements.israel_simulator.ark_prayer.title": "Before the Ark", + "advancements.israel_simulator.ark_prayer.description": "Pray at the Torah Ark of a synagogue", + "advancements.israel_simulator.tel_aviv.title": "The Bubble", + "advancements.israel_simulator.tel_aviv.description": "Arrive in Tel Aviv", + "advancements.israel_simulator.tel_aviv_nights.title": "Tel Aviv Nights", + "advancements.israel_simulator.tel_aviv_nights.description": "Be in Tel Aviv after dark. The city never sleeps", + "advancements.israel_simulator.government_building.title": "Coalition Talks", + "advancements.israel_simulator.government_building.description": "Walk into the Government Building", + "advancements.israel_simulator.twin_towers.title": "Skyline", + "advancements.israel_simulator.twin_towers.description": "Find the Twin Towers", + "advancements.israel_simulator.plane_crash.title": "Brace for Impact", + "advancements.israel_simulator.plane_crash.description": "Be near the Twin Towers when a plane hits them", + "advancements.israel_simulator.jaffa.title": "Jaffa Oranges", + "advancements.israel_simulator.jaffa.description": "Visit the old port of Jaffa", + "advancements.israel_simulator.gaza_strip.title": "Behind the Fence", + "advancements.israel_simulator.gaza_strip.description": "Enter the Gaza Strip", + "advancements.israel_simulator.tropical_island.title": "Private Island", + "advancements.israel_simulator.tropical_island.description": "Land on the tropical island. Don't ask about the guest list", + "advancements.israel_simulator.judean_desert.title": "Into the Wilderness", + "advancements.israel_simulator.judean_desert.description": "Enter the Judean Desert. Bring water", + "advancements.israel_simulator.ein_gedi.title": "Oasis", + "advancements.israel_simulator.ein_gedi.description": "Find the Ein Gedi oasis", + "advancements.israel_simulator.ancient_sanctuary.title": "Lost Sanctuary", + "advancements.israel_simulator.ancient_sanctuary.description": "Discover the Ancient Sanctuary in the desert", + "advancements.israel_simulator.dead_sea_tourist.title": "Dead Sea Tourist", + "advancements.israel_simulator.dead_sea_tourist.description": "Float on the Dead Sea and soak in a mud bath", + "advancements.israel_simulator.dead_sea_souvenirs.title": "Salt and Mud", + "advancements.israel_simulator.dead_sea_souvenirs.description": "Take home Dead Sea Mud and a Salt Block", + "advancements.israel_simulator.master_explorer.title": "Master Explorer", + "advancements.israel_simulator.master_explorer.description": "Visit every major place in Israel, from the Kotel to the Gaza Strip", + "advancements.israel_simulator.shalom.title": "Shalom!", + "advancements.israel_simulator.shalom.description": "Put on a Kippah", + "advancements.israel_simulator.dressed_for_prayer.title": "Fully Dressed", + "advancements.israel_simulator.dressed_for_prayer.description": "Wear a Kippah, a Talit and Tefillin at the same time", + "advancements.israel_simulator.tefillin_prayer.title": "Morning Prayer", + "advancements.israel_simulator.tefillin_prayer.description": "Bind the Tefillin during the day while wearing a Kippah", + "advancements.israel_simulator.shofar.title": "Sound the Shofar", + "advancements.israel_simulator.shofar.description": "Blow a Shofar", + "advancements.israel_simulator.freedom_of_speech.title": "Freedom of Speech", + "advancements.israel_simulator.freedom_of_speech.description": "Grab the First Amendment at the end of the public speech", + "advancements.israel_simulator.secret_kippah_cat.title": "Honorary Feline Citizen", + "advancements.israel_simulator.secret_kippah_cat.description": "Show your Kippah to a cat", + "advancements.israel_simulator.shabbat_shalom.title": "Shabbat Shalom", + "advancements.israel_simulator.shabbat_shalom.description": "Rest on Shabbat: no breaking, building or fighting, and get the rest bonus", + "advancements.israel_simulator.not_on_shabbat.title": "Not Today", + "advancements.israel_simulator.not_on_shabbat.description": "Try to work on Shabbat", + "advancements.israel_simulator.hanukkah.title": "Festival of Lights", + "advancements.israel_simulator.hanukkah.description": "Be around for Hanukkah and eat a Sufganiyah", + "advancements.israel_simulator.purim.title": "Chag Purim Sameach", + "advancements.israel_simulator.purim.description": "Be around for Purim and eat a Hamantash", + "advancements.israel_simulator.pesach.title": "Let My People Go", + "advancements.israel_simulator.pesach.description": "Be around for Pesach and eat Matzo", + "advancements.israel_simulator.all_festivals.title": "A Year in Israel", + "advancements.israel_simulator.all_festivals.description": "Live through Shabbat and every festival: Rosh Hashanah, Yom Kippur, Sukkot, Hanukkah, Purim and Pesach", + "advancements.israel_simulator.first_shekel.title": "Your First Shekel", + "advancements.israel_simulator.first_shekel.description": "Get a Shekel", + "advancements.israel_simulator.small_change.title": "Small Change", + "advancements.israel_simulator.small_change.description": "Find an Agora. A hundred make a Shekel", + "advancements.israel_simulator.money_changer.title": "Exchange Rate", + "advancements.israel_simulator.money_changer.description": "Trade with a Money Changer", + "advancements.israel_simulator.summon_bibi.title": "He's Back", + "advancements.israel_simulator.summon_bibi.description": "Summon Bibi with the Star of David", + "advancements.israel_simulator.hava_nagila.title": "Hava Nagila", + "advancements.israel_simulator.hava_nagila.description": "Defeat Bibi and pick up the Hava Nagila disc", + "advancements.israel_simulator.blessed_trader.title": "Blessed Trader", + "advancements.israel_simulator.blessed_trader.description": "Trade with a villager while wearing the Rabbi's Crown", + "advancements.israel_simulator.kill_trump.title": "You're Fired!", + "advancements.israel_simulator.kill_trump.description": "Defeat Donald Trump during the Bibi fight", + "advancements.israel_simulator.kill_epstein.title": "Case Closed", + "advancements.israel_simulator.kill_epstein.description": "Defeat Jeffrey Epstein. This time it's for real", + "advancements.israel_simulator.mossad_recruit.title": "Recruited", + "advancements.israel_simulator.mossad_recruit.description": "Complete a mission for the Mossad Handler", + "advancements.israel_simulator.counterintelligence.title": "Counterintelligence", + "advancements.israel_simulator.counterintelligence.description": "Take down a hostile Mossad agent", + "advancements.israel_simulator.mossad_veteran.title": "Katsa", + "advancements.israel_simulator.mossad_veteran.description": "Complete 5 Mossad missions", + "advancements.israel_simulator.startup_office.title": "Startup Nation", + "advancements.israel_simulator.startup_office.description": "Visit a Startup Office", + "advancements.israel_simulator.startup_founder.title": "Startup Founder", + "advancements.israel_simulator.startup_founder.description": "Work a session on the Laptop or do a delivery with the Smartphone", + "advancements.israel_simulator.startup_exit.title": "Exit!", + "advancements.israel_simulator.startup_exit.description": "Work your startup all the way to an exit", + "advancements.israel_simulator.drone_launch.title": "Eye in the Sky", + "advancements.israel_simulator.drone_launch.description": "Launch a Palantrio Drone", + "advancements.israel_simulator.first_train.title": "All Aboard", + "advancements.israel_simulator.first_train.description": "Take the train between Tel Aviv and Jerusalem", + "advancements.israel_simulator.rav_kav.title": "Tap and Go", + "advancements.israel_simulator.rav_kav.description": "Ride the train with a Rav-Kav", + "advancements.israel_simulator.moshav.title": "Moshav Life", + "advancements.israel_simulator.moshav.description": "Visit a farm in the Israeli Farmland", + "advancements.israel_simulator.harvest.title": "Fruits of the Land", + "advancements.israel_simulator.harvest.description": "Collect chickpeas, tomatoes, eggplants and sesame seeds", + "advancements.israel_simulator.hummus_connoisseur.title": "Hummus Connoisseur", + "advancements.israel_simulator.hummus_connoisseur.description": "Eat Hummus, Falafel, Shakshuka and Sabich", + "advancements.israel_simulator.taste_of_israel.title": "Taste of Israel", + "advancements.israel_simulator.taste_of_israel.description": "Eat every Israeli food in the mod" } diff --git a/src/main/resources/assets/israel_simulator/lang/it_it.json b/src/main/resources/assets/israel_simulator/lang/it_it.json index 3e28fe0..bbe6ce5 100644 --- a/src/main/resources/assets/israel_simulator/lang/it_it.json +++ b/src/main/resources/assets/israel_simulator/lang/it_it.json @@ -292,8 +292,6 @@ "speech.israel_simulator.epstein.quote_0": "\"Conosco persone in altissimo loco! Non la passerete liscia!\"", "speech.israel_simulator.epstein.quote_1": "\"I registri della mia isola sono sigillati! Non potete controllarmi!\"", "speech.israel_simulator.epstein.quote_2": "\"I collegamenti sono profondi... infinitamente profondi!\"", - "advancements.israel_simulator.hava_nagila.title": "Hava Nagila", - "advancements.israel_simulator.hava_nagila.description": "Uccidi Bibi e prendi il disco Hava Nagila", "block.israel_simulator.paved_road": "Strada asfaltata", "block.israel_simulator.transport_stop": "Fermata", "entity.israel_simulator.bicycle": "Bicicletta", @@ -319,32 +317,6 @@ "subtitles.israel_simulator.train_whistle": "Fischio del treno", "subtitles.israel_simulator.transit_travel": "Mezzo in partenza", "subtitles.israel_simulator.landmark_discovered": "Luogo scoperto", - "advancements.israel_simulator.welcome_to_israel.title": "Benvenuto in Israele", - "advancements.israel_simulator.welcome_to_israel.description": "Procurati una Mappa d'Israele e il tuo primo Shekel", - "advancements.israel_simulator.shalom.title": "Shalom!", - "advancements.israel_simulator.shalom.description": "Procurati uno Shekel e un falafel", - "advancements.israel_simulator.visit_jerusalem.title": "Visita Gerusalemme", - "advancements.israel_simulator.visit_jerusalem.description": "Raccogli Pietra di Gerusalemme e Pietra del Muro del Pianto", - "advancements.israel_simulator.tel_aviv_nights.title": "Notti a Tel Aviv", - "advancements.israel_simulator.tel_aviv_nights.description": "Porta una bicicletta sulla costa mediterranea", - "advancements.israel_simulator.jaffa.title": "Arance di Giaffa", - "advancements.israel_simulator.jaffa.description": "Procurati degli agrumi e una moneta antica", - "advancements.israel_simulator.dead_sea_tourist.title": "Turista del Mar Morto", - "advancements.israel_simulator.dead_sea_tourist.description": "Raccogli il fango e un blocco di sale del Mar Morto", - "advancements.israel_simulator.five_diamonds.title": "Cinque Diamanti", - "advancements.israel_simulator.five_diamonds.description": "Metti da parte 5 diamanti", - "advancements.israel_simulator.blessed_trader.title": "Mercante benedetto", - "advancements.israel_simulator.blessed_trader.description": "Indossa la Corona del rabbino e ottieni Mercante benedetto", - "advancements.israel_simulator.freedom_of_speech.title": "Libertà di Parola", - "advancements.israel_simulator.freedom_of_speech.description": "Prendi il Primo emendamento al discorso in piazza", - "advancements.israel_simulator.startup_founder.title": "Fondatore di Startup", - "advancements.israel_simulator.startup_founder.description": "Procurati un portatile, uno smartphone e un pezzo di drone", - "advancements.israel_simulator.master_explorer.title": "Grande esploratore", - "advancements.israel_simulator.master_explorer.description": "Procurati una bicicletta, le scarpe da camminata e la Mappa d'Israele", - "advancements.israel_simulator.secret_kippah_cat.title": "Gatto onorario", - "advancements.israel_simulator.secret_kippah_cat.description": "Un gatto randagio approva la tua Kippah", - "advancements.israel_simulator.hummus_connoisseur.title": "Intenditore di hummus", - "advancements.israel_simulator.hummus_connoisseur.description": "Procurati hummus, falafel e sabich", "message.israel_simulator.western_wall_praying": "Preghiera in corso...", "message.israel_simulator.western_wall_prayer_interrupted": "La preghiera è stata interrotta.", "district.israel_simulator.white_city": "Città Bianca", @@ -515,5 +487,113 @@ "message.israel_simulator.work.gig": "Consegna fatta: +%s ₪.", "message.israel_simulator.shabbat.work": "È Shabbat e stai lavorando: niente bonus di riposo per un minuto.", "message.israel_simulator.shabbat.rest": "Riposo di Shabbat: Menuchah (rigenerazione)", - "item.israel_simulator.shuk_vendor_spawn_egg": "Uovo generatore di Venditore dello Shuk" + "item.israel_simulator.shuk_vendor_spawn_egg": "Uovo generatore di Venditore dello Shuk", + "advancements.israel_simulator.welcome_to_israel.title": "Benvenuto in Israele", + "advancements.israel_simulator.welcome_to_israel.description": "Metti piede in uno dei biomi d'Israele", + "advancements.israel_simulator.visit_jerusalem.title": "Visita Gerusalemme", + "advancements.israel_simulator.visit_jerusalem.description": "Raggiungi le colline di Gerusalemme", + "advancements.israel_simulator.western_wall.title": "Il Kotel", + "advancements.israel_simulator.western_wall.description": "Arriva davanti al Muro del Pianto", + "advancements.israel_simulator.five_diamonds.title": "Cinque Diamanti", + "advancements.israel_simulator.five_diamonds.description": "Prega al Muro del Pianto con la Kippah e un Biglietto di preghiera", + "advancements.israel_simulator.grand_market.title": "Giornata al Shuk", + "advancements.israel_simulator.grand_market.description": "Perditi nel Grande mercato", + "advancements.israel_simulator.shuk_haggler.title": "Prezzo Speciale per Te, Amico", + "advancements.israel_simulator.shuk_haggler.description": "Compra qualcosa da un venditore dello Shuk", + "advancements.israel_simulator.ark_prayer.title": "Davanti all'Arca", + "advancements.israel_simulator.ark_prayer.description": "Prega davanti all'Arca santa di una sinagoga", + "advancements.israel_simulator.tel_aviv.title": "La Bolla", + "advancements.israel_simulator.tel_aviv.description": "Arriva a Tel Aviv", + "advancements.israel_simulator.tel_aviv_nights.title": "Notti a Tel Aviv", + "advancements.israel_simulator.tel_aviv_nights.description": "Resta a Tel Aviv dopo il tramonto. La città non dorme mai", + "advancements.israel_simulator.government_building.title": "Trattative di Coalizione", + "advancements.israel_simulator.government_building.description": "Entra nel Palazzo del governo", + "advancements.israel_simulator.twin_towers.title": "Skyline", + "advancements.israel_simulator.twin_towers.description": "Trova le Twin Towers", + "advancements.israel_simulator.plane_crash.title": "Prepararsi all'Impatto", + "advancements.israel_simulator.plane_crash.description": "Trovati vicino alle Twin Towers quando un aereo le colpisce", + "advancements.israel_simulator.jaffa.title": "Arance di Giaffa", + "advancements.israel_simulator.jaffa.description": "Visita il porto antico di Giaffa", + "advancements.israel_simulator.gaza_strip.title": "Oltre la Recinzione", + "advancements.israel_simulator.gaza_strip.description": "Entra nella Striscia di Gaza", + "advancements.israel_simulator.tropical_island.title": "Isola Privata", + "advancements.israel_simulator.tropical_island.description": "Sbarca sull'isola tropicale. Non chiedere della lista degli ospiti", + "advancements.israel_simulator.judean_desert.title": "Nel Deserto", + "advancements.israel_simulator.judean_desert.description": "Entra nel Deserto della Giudea. Porta dell'acqua", + "advancements.israel_simulator.ein_gedi.title": "Oasi", + "advancements.israel_simulator.ein_gedi.description": "Trova l'oasi di Ein Gedi", + "advancements.israel_simulator.ancient_sanctuary.title": "Santuario Perduto", + "advancements.israel_simulator.ancient_sanctuary.description": "Scopri il Santuario antico nel deserto", + "advancements.israel_simulator.dead_sea_tourist.title": "Turista del Mar Morto", + "advancements.israel_simulator.dead_sea_tourist.description": "Galleggia sul Mar Morto e fai un bagno di fango", + "advancements.israel_simulator.dead_sea_souvenirs.title": "Sale e Fango", + "advancements.israel_simulator.dead_sea_souvenirs.description": "Porta a casa il Fango del Mar Morto e un Blocco di sale del Mar Morto", + "advancements.israel_simulator.master_explorer.title": "Grande Esploratore", + "advancements.israel_simulator.master_explorer.description": "Visita tutti i luoghi principali d'Israele, dal Kotel alla Striscia di Gaza", + "advancements.israel_simulator.shalom.title": "Shalom!", + "advancements.israel_simulator.shalom.description": "Indossa una Kippah", + "advancements.israel_simulator.dressed_for_prayer.title": "Vestito di Tutto Punto", + "advancements.israel_simulator.dressed_for_prayer.description": "Indossa insieme Kippah, Talit e Tefillin", + "advancements.israel_simulator.tefillin_prayer.title": "Preghiera del Mattino", + "advancements.israel_simulator.tefillin_prayer.description": "Lega i Tefillin di giorno indossando la Kippah", + "advancements.israel_simulator.shofar.title": "Suona lo Shofar", + "advancements.israel_simulator.shofar.description": "Suona uno Shofar", + "advancements.israel_simulator.freedom_of_speech.title": "Libertà di Parola", + "advancements.israel_simulator.freedom_of_speech.description": "Prendi il Primo emendamento alla fine del discorso in piazza", + "advancements.israel_simulator.secret_kippah_cat.title": "Gatto Onorario", + "advancements.israel_simulator.secret_kippah_cat.description": "Mostra la tua Kippah a un gatto", + "advancements.israel_simulator.shabbat_shalom.title": "Shabbat Shalom", + "advancements.israel_simulator.shabbat_shalom.description": "Riposati di Shabbat: niente scavare, costruire o combattere, e ricevi il bonus riposo", + "advancements.israel_simulator.not_on_shabbat.title": "Non Oggi", + "advancements.israel_simulator.not_on_shabbat.description": "Prova a lavorare di Shabbat", + "advancements.israel_simulator.hanukkah.title": "Festa delle Luci", + "advancements.israel_simulator.hanukkah.description": "Vivi Hanukkah e mangia una Sufganiyah", + "advancements.israel_simulator.purim.title": "Chag Purim Sameach", + "advancements.israel_simulator.purim.description": "Vivi Purim e mangia un Hamantash", + "advancements.israel_simulator.pesach.title": "Lascia Andare il Mio Popolo", + "advancements.israel_simulator.pesach.description": "Vivi Pesach e mangia la Matzah", + "advancements.israel_simulator.all_festivals.title": "Un Anno in Israele", + "advancements.israel_simulator.all_festivals.description": "Vivi lo Shabbat e tutte le feste: Rosh Hashanah, Yom Kippur, Sukkot, Hanukkah, Purim e Pesach", + "advancements.israel_simulator.first_shekel.title": "Il Tuo Primo Shekel", + "advancements.israel_simulator.first_shekel.description": "Procurati uno Shekel", + "advancements.israel_simulator.small_change.title": "Spiccioli", + "advancements.israel_simulator.small_change.description": "Trova un'Agorà. Ne servono cento per fare uno Shekel", + "advancements.israel_simulator.money_changer.title": "Tasso di Cambio", + "advancements.israel_simulator.money_changer.description": "Fai uno scambio con un Cambiavalute", + "advancements.israel_simulator.summon_bibi.title": "È Tornato", + "advancements.israel_simulator.summon_bibi.description": "Evoca Bibi con la Stella di Davide", + "advancements.israel_simulator.hava_nagila.title": "Hava Nagila", + "advancements.israel_simulator.hava_nagila.description": "Sconfiggi Bibi e prendi il disco Hava Nagila", + "advancements.israel_simulator.blessed_trader.title": "Mercante Benedetto", + "advancements.israel_simulator.blessed_trader.description": "Fai uno scambio con un abitante del villaggio indossando la Corona del rabbino", + "advancements.israel_simulator.kill_trump.title": "Sei Licenziato!", + "advancements.israel_simulator.kill_trump.description": "Sconfiggi Donald Trump durante lo scontro con Bibi", + "advancements.israel_simulator.kill_epstein.title": "Caso Chiuso", + "advancements.israel_simulator.kill_epstein.description": "Sconfiggi Jeffrey Epstein. Stavolta sul serio", + "advancements.israel_simulator.mossad_recruit.title": "Reclutato", + "advancements.israel_simulator.mossad_recruit.description": "Completa una missione per il referente del Mossad", + "advancements.israel_simulator.counterintelligence.title": "Controspionaggio", + "advancements.israel_simulator.counterintelligence.description": "Elimina un agente del Mossad ostile", + "advancements.israel_simulator.mossad_veteran.title": "Katsa", + "advancements.israel_simulator.mossad_veteran.description": "Completa 5 missioni del Mossad", + "advancements.israel_simulator.startup_office.title": "Nazione Startup", + "advancements.israel_simulator.startup_office.description": "Visita l'Ufficio di una startup", + "advancements.israel_simulator.startup_founder.title": "Fondatore di Startup", + "advancements.israel_simulator.startup_founder.description": "Fai una sessione di lavoro col Portatile o una consegna con lo Smartphone", + "advancements.israel_simulator.startup_exit.title": "Exit!", + "advancements.israel_simulator.startup_exit.description": "Porta la tua startup fino all'exit", + "advancements.israel_simulator.drone_launch.title": "Occhio dal Cielo", + "advancements.israel_simulator.drone_launch.description": "Lancia un Palantrio Drone", + "advancements.israel_simulator.first_train.title": "Tutti a Bordo", + "advancements.israel_simulator.first_train.description": "Prendi il treno tra Tel Aviv e Gerusalemme", + "advancements.israel_simulator.rav_kav.title": "Appoggia e Vai", + "advancements.israel_simulator.rav_kav.description": "Viaggia in treno con la Rav-Kav", + "advancements.israel_simulator.moshav.title": "Vita da Moshav", + "advancements.israel_simulator.moshav.description": "Visita una fattoria nelle campagne israeliane", + "advancements.israel_simulator.harvest.title": "Frutti della Terra", + "advancements.israel_simulator.harvest.description": "Raccogli ceci, pomodori, melanzane e semi di sesamo", + "advancements.israel_simulator.hummus_connoisseur.title": "Intenditore di Hummus", + "advancements.israel_simulator.hummus_connoisseur.description": "Mangia Hummus, Falafel, Shakshuka e Sabich", + "advancements.israel_simulator.taste_of_israel.title": "Sapore d'Israele", + "advancements.israel_simulator.taste_of_israel.description": "Mangia tutti i cibi israeliani della mod" } diff --git a/src/main/resources/data/israel_simulator/advancement/combat/hava_nagila.json b/src/main/resources/data/israel_simulator/advancement/combat/hava_nagila.json index 8cdefeb..16b8d86 100644 --- a/src/main/resources/data/israel_simulator/advancement/combat/hava_nagila.json +++ b/src/main/resources/data/israel_simulator/advancement/combat/hava_nagila.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:combat/summon_bibi", "display": { "icon": { "id": "israel_simulator:hava_nagila_disc" @@ -43,8 +43,13 @@ }, "requirements": [ [ - "kill_bibi_boss", + "kill_bibi_boss" + ], + [ "has_disc" ] - ] + ], + "rewards": { + "experience": 500 + } } diff --git a/src/main/resources/data/israel_simulator/advancement/combat/kill_epstein.json b/src/main/resources/data/israel_simulator/advancement/combat/kill_epstein.json new file mode 100644 index 0000000..3c93382 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/combat/kill_epstein.json @@ -0,0 +1,42 @@ +{ + "parent": "israel_simulator:combat/summon_bibi", + "display": { + "icon": { + "id": "minecraft:paper" + }, + "title": { + "translate": "advancements.israel_simulator.kill_epstein.title" + }, + "description": { + "translate": "advancements.israel_simulator.kill_epstein.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "criteria": { + "epstein": { + "trigger": "minecraft:player_killed_entity", + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:entity_type": "israel_simulator:jeffrey_epstein" + } + } + ] + } + } + }, + "requirements": [ + [ + "epstein" + ] + ], + "rewards": { + "experience": 300 + } +} diff --git a/src/main/resources/data/israel_simulator/advancement/combat/kill_trump.json b/src/main/resources/data/israel_simulator/advancement/combat/kill_trump.json new file mode 100644 index 0000000..e7afd4f --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/combat/kill_trump.json @@ -0,0 +1,39 @@ +{ + "parent": "israel_simulator:combat/summon_bibi", + "display": { + "icon": { + "id": "minecraft:golden_helmet" + }, + "title": { + "translate": "advancements.israel_simulator.kill_trump.title" + }, + "description": { + "translate": "advancements.israel_simulator.kill_trump.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "trump": { + "trigger": "minecraft:player_killed_entity", + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:entity_type": "israel_simulator:trump_miniboss" + } + } + ] + } + } + }, + "requirements": [ + [ + "trump" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/combat/summon_bibi.json b/src/main/resources/data/israel_simulator/advancement/combat/summon_bibi.json new file mode 100644 index 0000000..db04609 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/combat/summon_bibi.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:star_of_david" + }, + "title": { + "translate": "advancements.israel_simulator.summon_bibi.title" + }, + "description": { + "translate": "advancements.israel_simulator.summon_bibi.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "summoned": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "bibi_summon" + } + } + }, + "requirements": [ + [ + "summoned" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/ark_prayer.json b/src/main/resources/data/israel_simulator/advancement/cultural/ark_prayer.json new file mode 100644 index 0000000..dd1f55e --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/cultural/ark_prayer.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/visit_jerusalem", + "display": { + "icon": { + "id": "israel_simulator:prayer_note" + }, + "title": { + "translate": "advancements.israel_simulator.ark_prayer.title" + }, + "description": { + "translate": "advancements.israel_simulator.ark_prayer.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "prayed": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "ark_prayer" + } + } + }, + "requirements": [ + [ + "prayed" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/dressed_for_prayer.json b/src/main/resources/data/israel_simulator/advancement/cultural/dressed_for_prayer.json new file mode 100644 index 0000000..50b754c --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/cultural/dressed_for_prayer.json @@ -0,0 +1,49 @@ +{ + "parent": "israel_simulator:cultural/shalom", + "display": { + "icon": { + "id": "israel_simulator:talit" + }, + "title": { + "translate": "advancements.israel_simulator.dressed_for_prayer.title" + }, + "description": { + "translate": "advancements.israel_simulator.dressed_for_prayer.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "dressed": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:equipment": { + "head": { + "items": "israel_simulator:kippah" + }, + "chest": { + "items": "israel_simulator:talit" + }, + "legs": { + "items": "israel_simulator:tefillin" + } + } + } + } + ] + } + } + }, + "requirements": [ + [ + "dressed" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/freedom_of_speech.json b/src/main/resources/data/israel_simulator/advancement/cultural/freedom_of_speech.json index 42f6f8f..10ccc92 100644 --- a/src/main/resources/data/israel_simulator/advancement/cultural/freedom_of_speech.json +++ b/src/main/resources/data/israel_simulator/advancement/cultural/freedom_of_speech.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:cultural/shalom", "display": { "icon": { "id": "israel_simulator:first_amendment" @@ -10,7 +10,7 @@ "description": { "translate": "advancements.israel_simulator.freedom_of_speech.description" }, - "frame": "challenge", + "frame": "goal", "show_toast": true, "announce_to_chat": true, "hidden": false diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/shalom.json b/src/main/resources/data/israel_simulator/advancement/cultural/shalom.json index 2a309f1..66cf80c 100644 --- a/src/main/resources/data/israel_simulator/advancement/cultural/shalom.json +++ b/src/main/resources/data/israel_simulator/advancement/cultural/shalom.json @@ -2,7 +2,7 @@ "parent": "israel_simulator:exploration/welcome_to_israel", "display": { "icon": { - "id": "israel_simulator:shekel" + "id": "israel_simulator:kippah" }, "title": { "translate": "advancements.israel_simulator.shalom.title" @@ -16,22 +16,20 @@ "hidden": false }, "criteria": { - "has_shekel": { - "trigger": "minecraft:inventory_changed", + "kippah": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:shekel" - } - ] - } - }, - "has_cultural_food": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:falafel" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:equipment": { + "head": { + "items": "israel_simulator:kippah" + } + } + } } ] } @@ -39,8 +37,7 @@ }, "requirements": [ [ - "has_shekel", - "has_cultural_food" + "kippah" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/shofar.json b/src/main/resources/data/israel_simulator/advancement/cultural/shofar.json new file mode 100644 index 0000000..9942e0a --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/cultural/shofar.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:cultural/shalom", + "display": { + "icon": { + "id": "israel_simulator:shofar" + }, + "title": { + "translate": "advancements.israel_simulator.shofar.title" + }, + "description": { + "translate": "advancements.israel_simulator.shofar.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "blown": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "shofar_blow" + } + } + }, + "requirements": [ + [ + "blown" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/cultural/tefillin_prayer.json b/src/main/resources/data/israel_simulator/advancement/cultural/tefillin_prayer.json new file mode 100644 index 0000000..271f52e --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/cultural/tefillin_prayer.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:cultural/dressed_for_prayer", + "display": { + "icon": { + "id": "israel_simulator:tefillin" + }, + "title": { + "translate": "advancements.israel_simulator.tefillin_prayer.title" + }, + "description": { + "translate": "advancements.israel_simulator.tefillin_prayer.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "bound": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "tefillin_bound" + } + } + }, + "requirements": [ + [ + "bound" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/economy/blessed_trader.json b/src/main/resources/data/israel_simulator/advancement/economy/blessed_trader.json index 0153e99..a7c9b2e 100644 --- a/src/main/resources/data/israel_simulator/advancement/economy/blessed_trader.json +++ b/src/main/resources/data/israel_simulator/advancement/economy/blessed_trader.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:combat/hava_nagila", "display": { "icon": { "id": "israel_simulator:rabbis_crown" @@ -16,29 +16,31 @@ "hidden": false }, "criteria": { - "has_rabbis_crown": { - "trigger": "minecraft:inventory_changed", + "crowned_trade": { + "trigger": "minecraft:villager_trade", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:rabbis_crown" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:equipment": { + "head": { + "items": "israel_simulator:rabbis_crown" + } + } + } } ] } - }, - "has_blessed_trader_effect": { - "trigger": "minecraft:effects_changed", - "conditions": { - "effects": { - "israel_simulator:blessed_trader": {} - } - } } }, "requirements": [ [ - "has_rabbis_crown", - "has_blessed_trader_effect" + "crowned_trade" ] - ] + ], + "rewards": { + "experience": 200 + } } diff --git a/src/main/resources/data/israel_simulator/advancement/economy/first_shekel.json b/src/main/resources/data/israel_simulator/advancement/economy/first_shekel.json new file mode 100644 index 0000000..6033d3d --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/economy/first_shekel.json @@ -0,0 +1,35 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:shekel" + }, + "title": { + "translate": "advancements.israel_simulator.first_shekel.title" + }, + "description": { + "translate": "advancements.israel_simulator.first_shekel.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "shekel": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:shekel" + } + ] + } + } + }, + "requirements": [ + [ + "shekel" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/economy/five_diamonds.json b/src/main/resources/data/israel_simulator/advancement/economy/five_diamonds.json index 6a0f90e..1b1e0c5 100644 --- a/src/main/resources/data/israel_simulator/advancement/economy/five_diamonds.json +++ b/src/main/resources/data/israel_simulator/advancement/economy/five_diamonds.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:exploration/western_wall", "display": { "icon": { "id": "minecraft:diamond" @@ -10,29 +10,22 @@ "description": { "translate": "advancements.israel_simulator.five_diamonds.description" }, - "frame": "challenge", + "frame": "goal", "show_toast": true, "announce_to_chat": true, "hidden": false }, "criteria": { - "has_five_diamonds": { - "trigger": "minecraft:inventory_changed", + "prayed": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "minecraft:diamond", - "count": { - "min": 5 - } - } - ] + "event": "western_wall_prayer" } } }, "requirements": [ [ - "has_five_diamonds" + "prayed" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/economy/money_changer.json b/src/main/resources/data/israel_simulator/advancement/economy/money_changer.json new file mode 100644 index 0000000..13f7647 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/economy/money_changer.json @@ -0,0 +1,39 @@ +{ + "parent": "israel_simulator:economy/first_shekel", + "display": { + "icon": { + "id": "israel_simulator:ancient_coin" + }, + "title": { + "translate": "advancements.israel_simulator.money_changer.title" + }, + "description": { + "translate": "advancements.israel_simulator.money_changer.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "traded": { + "trigger": "minecraft:villager_trade", + "conditions": { + "villager": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:entity_type": "israel_simulator:money_changer" + } + } + ] + } + } + }, + "requirements": [ + [ + "traded" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/economy/shuk_haggler.json b/src/main/resources/data/israel_simulator/advancement/economy/shuk_haggler.json new file mode 100644 index 0000000..fa64bc2 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/economy/shuk_haggler.json @@ -0,0 +1,39 @@ +{ + "parent": "israel_simulator:exploration/grand_market", + "display": { + "icon": { + "id": "israel_simulator:citrus" + }, + "title": { + "translate": "advancements.israel_simulator.shuk_haggler.title" + }, + "description": { + "translate": "advancements.israel_simulator.shuk_haggler.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "traded": { + "trigger": "minecraft:villager_trade", + "conditions": { + "villager": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:entity_type": "israel_simulator:shuk_vendor" + } + } + ] + } + } + }, + "requirements": [ + [ + "traded" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/economy/small_change.json b/src/main/resources/data/israel_simulator/advancement/economy/small_change.json new file mode 100644 index 0000000..387172e --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/economy/small_change.json @@ -0,0 +1,35 @@ +{ + "parent": "israel_simulator:economy/first_shekel", + "display": { + "icon": { + "id": "israel_simulator:agora" + }, + "title": { + "translate": "advancements.israel_simulator.small_change.title" + }, + "description": { + "translate": "advancements.israel_simulator.small_change.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "agora": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:agora" + } + ] + } + } + }, + "requirements": [ + [ + "agora" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/events/plane_crash.json b/src/main/resources/data/israel_simulator/advancement/events/plane_crash.json new file mode 100644 index 0000000..4a152a0 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/events/plane_crash.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/twin_towers", + "display": { + "icon": { + "id": "israel_simulator:missile" + }, + "title": { + "translate": "advancements.israel_simulator.plane_crash.title" + }, + "description": { + "translate": "advancements.israel_simulator.plane_crash.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "witnessed": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "plane_crash" + } + } + }, + "requirements": [ + [ + "witnessed" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/ancient_sanctuary.json b/src/main/resources/data/israel_simulator/advancement/exploration/ancient_sanctuary.json new file mode 100644 index 0000000..3dcd78c --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/ancient_sanctuary.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/judean_desert", + "display": { + "icon": { + "id": "israel_simulator:dead_sea_scroll_fragment" + }, + "title": { + "translate": "advancements.israel_simulator.ancient_sanctuary.title" + }, + "description": { + "translate": "advancements.israel_simulator.ancient_sanctuary.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "sanctuary": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:ancient_sanctuary" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "sanctuary" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_souvenirs.json b/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_souvenirs.json new file mode 100644 index 0000000..7b0d751 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_souvenirs.json @@ -0,0 +1,48 @@ +{ + "parent": "israel_simulator:exploration/dead_sea_tourist", + "display": { + "icon": { + "id": "israel_simulator:salt_block" + }, + "title": { + "translate": "advancements.israel_simulator.dead_sea_souvenirs.title" + }, + "description": { + "translate": "advancements.israel_simulator.dead_sea_souvenirs.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "mud": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:dead_sea_mud" + } + ] + } + }, + "salt": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:salt_block" + } + ] + } + } + }, + "requirements": [ + [ + "mud" + ], + [ + "salt" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_tourist.json b/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_tourist.json index e28798d..a2eff1d 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_tourist.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/dead_sea_tourist.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:exploration/judean_desert", "display": { "icon": { "id": "israel_simulator:dead_sea_mud" @@ -10,37 +10,31 @@ "description": { "translate": "advancements.israel_simulator.dead_sea_tourist.description" }, - "frame": "task", + "frame": "goal", "show_toast": true, "announce_to_chat": true, "hidden": false }, "criteria": { - "has_dead_sea_mud": { - "trigger": "minecraft:inventory_changed", + "floated": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "israel_simulator:dead_sea_mud" - } - ] + "event": "dead_sea_float" } }, - "has_salt_block": { - "trigger": "minecraft:inventory_changed", + "mud_bath": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "israel_simulator:salt_block" - } - ] + "event": "mud_bath" } } }, "requirements": [ [ - "has_dead_sea_mud", - "has_salt_block" + "floated" + ], + [ + "mud_bath" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/ein_gedi.json b/src/main/resources/data/israel_simulator/advancement/exploration/ein_gedi.json new file mode 100644 index 0000000..8cf3a7c --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/ein_gedi.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/judean_desert", + "display": { + "icon": { + "id": "israel_simulator:date_palm_leaves" + }, + "title": { + "translate": "advancements.israel_simulator.ein_gedi.title" + }, + "description": { + "translate": "advancements.israel_simulator.ein_gedi.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "ein_gedi": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:ein_gedi_oasis" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "ein_gedi" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/gaza_strip.json b/src/main/resources/data/israel_simulator/advancement/exploration/gaza_strip.json new file mode 100644 index 0000000..d5ee039 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/gaza_strip.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/jaffa", + "display": { + "icon": { + "id": "minecraft:sandstone_wall" + }, + "title": { + "translate": "advancements.israel_simulator.gaza_strip.title" + }, + "description": { + "translate": "advancements.israel_simulator.gaza_strip.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "gaza": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:gaza_strip" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "gaza" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/government_building.json b/src/main/resources/data/israel_simulator/advancement/exploration/government_building.json new file mode 100644 index 0000000..712f67e --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/government_building.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/tel_aviv", + "display": { + "icon": { + "id": "israel_simulator:first_amendment" + }, + "title": { + "translate": "advancements.israel_simulator.government_building.title" + }, + "description": { + "translate": "advancements.israel_simulator.government_building.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "government": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:government_building" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "government" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/grand_market.json b/src/main/resources/data/israel_simulator/advancement/exploration/grand_market.json new file mode 100644 index 0000000..07f2f7a --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/grand_market.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/visit_jerusalem", + "display": { + "icon": { + "id": "israel_simulator:olives" + }, + "title": { + "translate": "advancements.israel_simulator.grand_market.title" + }, + "description": { + "translate": "advancements.israel_simulator.grand_market.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "grand_market": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:grand_market" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "grand_market" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/jaffa.json b/src/main/resources/data/israel_simulator/advancement/exploration/jaffa.json index a48ae8b..46e219e 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/jaffa.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/jaffa.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:exploration/tel_aviv", "display": { "icon": { "id": "israel_simulator:citrus" @@ -16,22 +16,18 @@ "hidden": false }, "criteria": { - "has_citrus": { - "trigger": "minecraft:inventory_changed", + "jaffa_port": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:citrus" - } - ] - } - }, - "has_ancient_coin": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:ancient_coin" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:jaffa_port" + } + } } ] } @@ -39,8 +35,7 @@ }, "requirements": [ [ - "has_citrus", - "has_ancient_coin" + "jaffa_port" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/judean_desert.json b/src/main/resources/data/israel_simulator/advancement/exploration/judean_desert.json new file mode 100644 index 0000000..c50ecdf --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/judean_desert.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "minecraft:sand" + }, + "title": { + "translate": "advancements.israel_simulator.judean_desert.title" + }, + "description": { + "translate": "advancements.israel_simulator.judean_desert.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "desert": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "biomes": "israel_simulator:judean_desert" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "desert" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/master_explorer.json b/src/main/resources/data/israel_simulator/advancement/exploration/master_explorer.json index 32f8beb..6b7065f 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/master_explorer.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/master_explorer.json @@ -16,32 +16,258 @@ "hidden": false }, "criteria": { - "has_shoes": { - "trigger": "minecraft:inventory_changed", + "jerusalem_city": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:walking_shoes" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:jerusalem_city" + } + } } ] } }, - "has_bicycle": { - "trigger": "minecraft:inventory_changed", + "western_wall": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:bicycle" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:western_wall" + } + } } ] } }, - "has_map": { - "trigger": "minecraft:inventory_changed", + "grand_market": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:israel_map" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:grand_market" + } + } + } + ] + } + }, + "great_synagogue": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:great_synagogue" + } + } + } + ] + } + }, + "tel_aviv_city": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:tel_aviv_city" + } + } + } + ] + } + }, + "jaffa_port": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:jaffa_port" + } + } + } + ] + } + }, + "government_building": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:government_building" + } + } + } + ] + } + }, + "startup_office": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:startup_office" + } + } + } + ] + } + }, + "twin_towers": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:twin_towers" + } + } + } + ] + } + }, + "gaza_strip": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:gaza_strip" + } + } + } + ] + } + }, + "ein_gedi_oasis": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:ein_gedi_oasis" + } + } + } + ] + } + }, + "ancient_sanctuary": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:ancient_sanctuary" + } + } + } + ] + } + }, + "dead_sea_resort": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:dead_sea_resort" + } + } + } + ] + } + }, + "agricultural_farm": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:agricultural_farm" + } + } + } + ] + } + }, + "mediterranean_village": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:mediterranean_village" + } + } + } + ] + } + }, + "tropical_island": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:tropical_island" + } + } } ] } @@ -49,9 +275,55 @@ }, "requirements": [ [ - "has_shoes", - "has_bicycle", - "has_map" + "jerusalem_city" + ], + [ + "western_wall" + ], + [ + "grand_market" + ], + [ + "great_synagogue" + ], + [ + "tel_aviv_city" + ], + [ + "jaffa_port" + ], + [ + "government_building" + ], + [ + "startup_office" + ], + [ + "twin_towers" + ], + [ + "gaza_strip" + ], + [ + "ein_gedi_oasis" + ], + [ + "ancient_sanctuary" + ], + [ + "dead_sea_resort" + ], + [ + "agricultural_farm" + ], + [ + "mediterranean_village" + ], + [ + "tropical_island" ] - ] + ], + "rewards": { + "experience": 500 + } } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv.json b/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv.json new file mode 100644 index 0000000..724bdea --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:smartphone" + }, + "title": { + "translate": "advancements.israel_simulator.tel_aviv.title" + }, + "description": { + "translate": "advancements.israel_simulator.tel_aviv.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "tel_aviv": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:tel_aviv_city" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "tel_aviv" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv_nights.json b/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv_nights.json index 13f2200..c8c5366 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv_nights.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/tel_aviv_nights.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:exploration/tel_aviv", "display": { "icon": { "id": "israel_simulator:falafel" @@ -16,20 +16,27 @@ "hidden": false }, "criteria": { - "night_in_coastal": { + "tel_aviv_at_night": { "trigger": "minecraft:location", "conditions": { - "location": { - "biomes": "israel_simulator:mediterranean_coast" - } - } - }, - "has_bicycle": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:tel_aviv_city" + } + } + }, { - "items": "israel_simulator:bicycle" + "condition": "minecraft:time_check", + "clock": "minecraft:overworld", + "period": 24000, + "value": { + "min": 13000, + "max": 23000 + } } ] } @@ -37,8 +44,7 @@ }, "requirements": [ [ - "night_in_coastal", - "has_bicycle" + "tel_aviv_at_night" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/tropical_island.json b/src/main/resources/data/israel_simulator/advancement/exploration/tropical_island.json new file mode 100644 index 0000000..c28d41c --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/tropical_island.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/jaffa", + "display": { + "icon": { + "id": "israel_simulator:dates" + }, + "title": { + "translate": "advancements.israel_simulator.tropical_island.title" + }, + "description": { + "translate": "advancements.israel_simulator.tropical_island.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "island": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:tropical_island" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "island" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/twin_towers.json b/src/main/resources/data/israel_simulator/advancement/exploration/twin_towers.json new file mode 100644 index 0000000..2fe124a --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/twin_towers.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/tel_aviv", + "display": { + "icon": { + "id": "minecraft:glass" + }, + "title": { + "translate": "advancements.israel_simulator.twin_towers.title" + }, + "description": { + "translate": "advancements.israel_simulator.twin_towers.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "twin_towers": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:twin_towers" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "twin_towers" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/visit_jerusalem.json b/src/main/resources/data/israel_simulator/advancement/exploration/visit_jerusalem.json index 09df6a6..b4b0856 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/visit_jerusalem.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/visit_jerusalem.json @@ -2,7 +2,7 @@ "parent": "israel_simulator:exploration/welcome_to_israel", "display": { "icon": { - "id": "israel_simulator:western_wall_stone" + "id": "israel_simulator:jerusalem_stone" }, "title": { "translate": "advancements.israel_simulator.visit_jerusalem.title" @@ -10,28 +10,24 @@ "description": { "translate": "advancements.israel_simulator.visit_jerusalem.description" }, - "frame": "goal", + "frame": "task", "show_toast": true, "announce_to_chat": true, "hidden": false }, "criteria": { - "has_stone": { - "trigger": "minecraft:inventory_changed", + "jerusalem": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:western_wall_stone" - } - ] - } - }, - "has_jerusalem_stone": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:jerusalem_stone" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "biomes": "israel_simulator:jerusalem" + } + } } ] } @@ -39,8 +35,7 @@ }, "requirements": [ [ - "has_stone", - "has_jerusalem_stone" + "jerusalem" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/welcome_to_israel.json b/src/main/resources/data/israel_simulator/advancement/exploration/welcome_to_israel.json index 59aa8e2..ec0aef3 100644 --- a/src/main/resources/data/israel_simulator/advancement/exploration/welcome_to_israel.json +++ b/src/main/resources/data/israel_simulator/advancement/exploration/welcome_to_israel.json @@ -12,26 +12,22 @@ }, "frame": "task", "show_toast": true, - "announce_to_chat": true, + "announce_to_chat": false, "hidden": false }, "criteria": { - "has_map": { - "trigger": "minecraft:inventory_changed", + "in_israel": { + "trigger": "minecraft:location", "conditions": { - "items": [ + "player": [ { - "items": "israel_simulator:israel_map" - } - ] - } - }, - "has_shekel": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:shekel" + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "biomes": "#israel_simulator:is_israel_region" + } + } } ] } @@ -39,8 +35,7 @@ }, "requirements": [ [ - "has_map", - "has_shekel" + "in_israel" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/exploration/western_wall.json b/src/main/resources/data/israel_simulator/advancement/exploration/western_wall.json new file mode 100644 index 0000000..c62aa02 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/exploration/western_wall.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/visit_jerusalem", + "display": { + "icon": { + "id": "israel_simulator:western_wall_stone" + }, + "title": { + "translate": "advancements.israel_simulator.western_wall.title" + }, + "description": { + "translate": "advancements.israel_simulator.western_wall.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "western_wall": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:western_wall" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "western_wall" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/festival/all_festivals.json b/src/main/resources/data/israel_simulator/advancement/festival/all_festivals.json new file mode 100644 index 0000000..90ed4ef --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/festival/all_festivals.json @@ -0,0 +1,88 @@ +{ + "parent": "israel_simulator:festival/hanukkah", + "display": { + "icon": { + "id": "israel_simulator:shofar" + }, + "title": { + "translate": "advancements.israel_simulator.all_festivals.title" + }, + "description": { + "translate": "advancements.israel_simulator.all_festivals.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "shabbat": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_shabbat" + } + }, + "rosh_hashanah": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_rosh_hashanah" + } + }, + "yom_kippur": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_yom_kippur" + } + }, + "sukkot": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_sukkot" + } + }, + "hanukkah": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_hanukkah" + } + }, + "purim": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_purim" + } + }, + "pesach": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_pesach" + } + } + }, + "requirements": [ + [ + "shabbat" + ], + [ + "rosh_hashanah" + ], + [ + "yom_kippur" + ], + [ + "sukkot" + ], + [ + "hanukkah" + ], + [ + "purim" + ], + [ + "pesach" + ] + ], + "rewards": { + "experience": 300 + } +} diff --git a/src/main/resources/data/israel_simulator/advancement/festival/hanukkah.json b/src/main/resources/data/israel_simulator/advancement/festival/hanukkah.json new file mode 100644 index 0000000..ebe9736 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/festival/hanukkah.json @@ -0,0 +1,42 @@ +{ + "parent": "israel_simulator:festival/shabbat_shalom", + "display": { + "icon": { + "id": "israel_simulator:menorah" + }, + "title": { + "translate": "advancements.israel_simulator.hanukkah.title" + }, + "description": { + "translate": "advancements.israel_simulator.hanukkah.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hanukkah": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_hanukkah" + } + }, + "sufganiyah": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:sufganiyah" + } + } + } + }, + "requirements": [ + [ + "hanukkah" + ], + [ + "sufganiyah" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/festival/pesach.json b/src/main/resources/data/israel_simulator/advancement/festival/pesach.json new file mode 100644 index 0000000..0857b15 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/festival/pesach.json @@ -0,0 +1,42 @@ +{ + "parent": "israel_simulator:festival/shabbat_shalom", + "display": { + "icon": { + "id": "israel_simulator:matzo" + }, + "title": { + "translate": "advancements.israel_simulator.pesach.title" + }, + "description": { + "translate": "advancements.israel_simulator.pesach.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "pesach": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_pesach" + } + }, + "matzo": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:matzo" + } + } + } + }, + "requirements": [ + [ + "pesach" + ], + [ + "matzo" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/festival/purim.json b/src/main/resources/data/israel_simulator/advancement/festival/purim.json new file mode 100644 index 0000000..816eca4 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/festival/purim.json @@ -0,0 +1,42 @@ +{ + "parent": "israel_simulator:festival/shabbat_shalom", + "display": { + "icon": { + "id": "israel_simulator:hamantash" + }, + "title": { + "translate": "advancements.israel_simulator.purim.title" + }, + "description": { + "translate": "advancements.israel_simulator.purim.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "purim": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "festival_purim" + } + }, + "hamantash": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:hamantash" + } + } + } + }, + "requirements": [ + [ + "purim" + ], + [ + "hamantash" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/festival/shabbat_shalom.json b/src/main/resources/data/israel_simulator/advancement/festival/shabbat_shalom.json new file mode 100644 index 0000000..9b324fd --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/festival/shabbat_shalom.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:challah" + }, + "title": { + "translate": "advancements.israel_simulator.shabbat_shalom.title" + }, + "description": { + "translate": "advancements.israel_simulator.shabbat_shalom.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "rested": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "shabbat_rest" + } + } + }, + "requirements": [ + [ + "rested" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/food/harvest.json b/src/main/resources/data/israel_simulator/advancement/food/harvest.json new file mode 100644 index 0000000..326b787 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/food/harvest.json @@ -0,0 +1,74 @@ +{ + "parent": "israel_simulator:food/moshav", + "display": { + "icon": { + "id": "israel_simulator:eggplant" + }, + "title": { + "translate": "advancements.israel_simulator.harvest.title" + }, + "description": { + "translate": "advancements.israel_simulator.harvest.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "chickpeas": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:chickpeas" + } + ] + } + }, + "tomato": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:tomato" + } + ] + } + }, + "eggplant": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:eggplant" + } + ] + } + }, + "sesame_seeds": { + "trigger": "minecraft:inventory_changed", + "conditions": { + "items": [ + { + "items": "israel_simulator:sesame_seeds" + } + ] + } + } + }, + "requirements": [ + [ + "chickpeas" + ], + [ + "tomato" + ], + [ + "eggplant" + ], + [ + "sesame_seeds" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/food/hummus_connoisseur.json b/src/main/resources/data/israel_simulator/advancement/food/hummus_connoisseur.json new file mode 100644 index 0000000..7498d93 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/food/hummus_connoisseur.json @@ -0,0 +1,66 @@ +{ + "parent": "israel_simulator:food/harvest", + "display": { + "icon": { + "id": "israel_simulator:hummus" + }, + "title": { + "translate": "advancements.israel_simulator.hummus_connoisseur.title" + }, + "description": { + "translate": "advancements.israel_simulator.hummus_connoisseur.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "hummus": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:hummus" + } + } + }, + "falafel": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:falafel" + } + } + }, + "shakshuka": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:shakshuka" + } + } + }, + "sabich": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:sabich" + } + } + } + }, + "requirements": [ + [ + "hummus" + ], + [ + "falafel" + ], + [ + "shakshuka" + ], + [ + "sabich" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/food/moshav.json b/src/main/resources/data/israel_simulator/advancement/food/moshav.json new file mode 100644 index 0000000..2d8b1d2 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/food/moshav.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:chickpeas" + }, + "title": { + "translate": "advancements.israel_simulator.moshav.title" + }, + "description": { + "translate": "advancements.israel_simulator.moshav.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "farm": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:agricultural_farm" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "farm" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/food/taste_of_israel.json b/src/main/resources/data/israel_simulator/advancement/food/taste_of_israel.json new file mode 100644 index 0000000..ada5b95 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/food/taste_of_israel.json @@ -0,0 +1,223 @@ +{ + "parent": "israel_simulator:food/hummus_connoisseur", + "display": { + "icon": { + "id": "israel_simulator:sabich" + }, + "title": { + "translate": "advancements.israel_simulator.taste_of_israel.title" + }, + "description": { + "translate": "advancements.israel_simulator.taste_of_israel.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "tahini": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:tahini" + } + } + }, + "dates": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:dates" + } + } + }, + "grapes": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:grapes" + } + } + }, + "olives": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:olives" + } + } + }, + "citrus": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:citrus" + } + } + }, + "chickpeas": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:chickpeas" + } + } + }, + "tomato": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:tomato" + } + } + }, + "eggplant": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:eggplant" + } + } + }, + "sesame_seeds": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:sesame_seeds" + } + } + }, + "challah": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:challah" + } + } + }, + "rugelach": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:rugelach" + } + } + }, + "falafel": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:falafel" + } + } + }, + "hummus": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:hummus" + } + } + }, + "shakshuka": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:shakshuka" + } + } + }, + "sabich": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:sabich" + } + } + }, + "matzo": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:matzo" + } + } + }, + "sufganiyah": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:sufganiyah" + } + } + }, + "hamantash": { + "trigger": "minecraft:consume_item", + "conditions": { + "item": { + "items": "israel_simulator:hamantash" + } + } + } + }, + "requirements": [ + [ + "tahini" + ], + [ + "dates" + ], + [ + "grapes" + ], + [ + "olives" + ], + [ + "citrus" + ], + [ + "chickpeas" + ], + [ + "tomato" + ], + [ + "eggplant" + ], + [ + "sesame_seeds" + ], + [ + "challah" + ], + [ + "rugelach" + ], + [ + "falafel" + ], + [ + "hummus" + ], + [ + "shakshuka" + ], + [ + "sabich" + ], + [ + "matzo" + ], + [ + "sufganiyah" + ], + [ + "hamantash" + ] + ], + "rewards": { + "experience": 300 + } +} diff --git a/src/main/resources/data/israel_simulator/advancement/mossad/counterintelligence.json b/src/main/resources/data/israel_simulator/advancement/mossad/counterintelligence.json new file mode 100644 index 0000000..061538f --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/mossad/counterintelligence.json @@ -0,0 +1,39 @@ +{ + "parent": "israel_simulator:mossad/mossad_recruit", + "display": { + "icon": { + "id": "israel_simulator:pistol" + }, + "title": { + "translate": "advancements.israel_simulator.counterintelligence.title" + }, + "description": { + "translate": "advancements.israel_simulator.counterintelligence.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "agent": { + "trigger": "minecraft:player_killed_entity", + "conditions": { + "entity": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:entity_type": "israel_simulator:mossad_agent" + } + } + ] + } + } + }, + "requirements": [ + [ + "agent" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/mossad/mossad_recruit.json b/src/main/resources/data/israel_simulator/advancement/mossad/mossad_recruit.json new file mode 100644 index 0000000..0d1796b --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/mossad/mossad_recruit.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:sealed_dossier" + }, + "title": { + "translate": "advancements.israel_simulator.mossad_recruit.title" + }, + "description": { + "translate": "advancements.israel_simulator.mossad_recruit.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "mission": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "mossad_mission" + } + } + }, + "requirements": [ + [ + "mission" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/mossad/mossad_veteran.json b/src/main/resources/data/israel_simulator/advancement/mossad/mossad_veteran.json new file mode 100644 index 0000000..3b6a98b --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/mossad/mossad_veteran.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:mossad/mossad_recruit", + "display": { + "icon": { + "id": "israel_simulator:assault_rifle" + }, + "title": { + "translate": "advancements.israel_simulator.mossad_veteran.title" + }, + "description": { + "translate": "advancements.israel_simulator.mossad_veteran.description" + }, + "frame": "goal", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "veteran": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "mossad_veteran" + } + } + }, + "requirements": [ + [ + "veteran" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/secret/hummus_connoisseur.json b/src/main/resources/data/israel_simulator/advancement/secret/hummus_connoisseur.json deleted file mode 100644 index 1143373..0000000 --- a/src/main/resources/data/israel_simulator/advancement/secret/hummus_connoisseur.json +++ /dev/null @@ -1,57 +0,0 @@ -{ - "parent": "israel_simulator:exploration/welcome_to_israel", - "display": { - "icon": { - "id": "israel_simulator:hummus" - }, - "title": { - "translate": "advancements.israel_simulator.hummus_connoisseur.title" - }, - "description": { - "translate": "advancements.israel_simulator.hummus_connoisseur.description" - }, - "frame": "goal", - "show_toast": true, - "announce_to_chat": true, - "hidden": true - }, - "criteria": { - "has_hummus": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:hummus" - } - ] - } - }, - "has_falafel": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:falafel" - } - ] - } - }, - "has_sabich": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:sabich" - } - ] - } - } - }, - "requirements": [ - [ - "has_hummus", - "has_falafel", - "has_sabich" - ] - ] -} diff --git a/src/main/resources/data/israel_simulator/advancement/secret/not_on_shabbat.json b/src/main/resources/data/israel_simulator/advancement/secret/not_on_shabbat.json new file mode 100644 index 0000000..139716c --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/secret/not_on_shabbat.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:festival/shabbat_shalom", + "display": { + "icon": { + "id": "israel_simulator:laptop" + }, + "title": { + "translate": "advancements.israel_simulator.not_on_shabbat.title" + }, + "description": { + "translate": "advancements.israel_simulator.not_on_shabbat.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": true + }, + "criteria": { + "tried": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "shabbat_work_blocked" + } + } + }, + "requirements": [ + [ + "tried" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/secret/secret_kippah_cat.json b/src/main/resources/data/israel_simulator/advancement/secret/secret_kippah_cat.json index 8e5c722..19d38f2 100644 --- a/src/main/resources/data/israel_simulator/advancement/secret/secret_kippah_cat.json +++ b/src/main/resources/data/israel_simulator/advancement/secret/secret_kippah_cat.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:cultural/shalom", "display": { "icon": { "id": "israel_simulator:kippah" @@ -10,26 +10,22 @@ "description": { "translate": "advancements.israel_simulator.secret_kippah_cat.description" }, - "frame": "challenge", + "frame": "task", "show_toast": true, "announce_to_chat": true, "hidden": true }, "criteria": { - "has_kippah": { - "trigger": "minecraft:inventory_changed", + "cat_approves": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "israel_simulator:kippah" - } - ] + "event": "kippah_cat" } } }, "requirements": [ [ - "has_kippah" + "cat_approves" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/technology/drone_launch.json b/src/main/resources/data/israel_simulator/advancement/technology/drone_launch.json new file mode 100644 index 0000000..ea6f4d1 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/technology/drone_launch.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:technology/startup_office", + "display": { + "icon": { + "id": "israel_simulator:palantrio_drone" + }, + "title": { + "translate": "advancements.israel_simulator.drone_launch.title" + }, + "description": { + "translate": "advancements.israel_simulator.drone_launch.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "launched": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "drone_launch" + } + } + }, + "requirements": [ + [ + "launched" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/technology/startup_exit.json b/src/main/resources/data/israel_simulator/advancement/technology/startup_exit.json new file mode 100644 index 0000000..a3e73d9 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/technology/startup_exit.json @@ -0,0 +1,34 @@ +{ + "parent": "israel_simulator:technology/startup_founder", + "display": { + "icon": { + "id": "israel_simulator:laptop" + }, + "title": { + "translate": "advancements.israel_simulator.startup_exit.title" + }, + "description": { + "translate": "advancements.israel_simulator.startup_exit.description" + }, + "frame": "challenge", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "exit": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "startup_exit" + } + } + }, + "requirements": [ + [ + "exit" + ] + ], + "rewards": { + "experience": 300 + } +} diff --git a/src/main/resources/data/israel_simulator/advancement/technology/startup_founder.json b/src/main/resources/data/israel_simulator/advancement/technology/startup_founder.json index 4d9eb68..9736451 100644 --- a/src/main/resources/data/israel_simulator/advancement/technology/startup_founder.json +++ b/src/main/resources/data/israel_simulator/advancement/technology/startup_founder.json @@ -1,5 +1,5 @@ { - "parent": "israel_simulator:exploration/welcome_to_israel", + "parent": "israel_simulator:technology/startup_office", "display": { "icon": { "id": "israel_simulator:laptop" @@ -16,42 +16,23 @@ "hidden": false }, "criteria": { - "has_laptop": { - "trigger": "minecraft:inventory_changed", + "work_session": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "israel_simulator:laptop" - } - ] + "event": "work_session" } }, - "has_smartphone": { - "trigger": "minecraft:inventory_changed", + "delivery_gig": { + "trigger": "israel_simulator:mod_event", "conditions": { - "items": [ - { - "items": "israel_simulator:smartphone" - } - ] - } - }, - "has_drone_part": { - "trigger": "minecraft:inventory_changed", - "conditions": { - "items": [ - { - "items": "israel_simulator:drone_part" - } - ] + "event": "delivery_gig" } } }, "requirements": [ [ - "has_laptop", - "has_smartphone", - "has_drone_part" + "work_session", + "delivery_gig" ] ] } diff --git a/src/main/resources/data/israel_simulator/advancement/technology/startup_office.json b/src/main/resources/data/israel_simulator/advancement/technology/startup_office.json new file mode 100644 index 0000000..faba25e --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/technology/startup_office.json @@ -0,0 +1,41 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:drone_part" + }, + "title": { + "translate": "advancements.israel_simulator.startup_office.title" + }, + "description": { + "translate": "advancements.israel_simulator.startup_office.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "office": { + "trigger": "minecraft:location", + "conditions": { + "player": [ + { + "condition": "minecraft:entity_properties", + "entity": "this", + "predicate": { + "minecraft:location": { + "structures": "israel_simulator:startup_office" + } + } + } + ] + } + } + }, + "requirements": [ + [ + "office" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/transport/first_train.json b/src/main/resources/data/israel_simulator/advancement/transport/first_train.json new file mode 100644 index 0000000..6c1a3ee --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/transport/first_train.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:exploration/welcome_to_israel", + "display": { + "icon": { + "id": "israel_simulator:transport_stop" + }, + "title": { + "translate": "advancements.israel_simulator.first_train.title" + }, + "description": { + "translate": "advancements.israel_simulator.first_train.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "ride": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "train_ride" + } + } + }, + "requirements": [ + [ + "ride" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/advancement/transport/rav_kav.json b/src/main/resources/data/israel_simulator/advancement/transport/rav_kav.json new file mode 100644 index 0000000..5869763 --- /dev/null +++ b/src/main/resources/data/israel_simulator/advancement/transport/rav_kav.json @@ -0,0 +1,31 @@ +{ + "parent": "israel_simulator:transport/first_train", + "display": { + "icon": { + "id": "israel_simulator:rav_kav" + }, + "title": { + "translate": "advancements.israel_simulator.rav_kav.title" + }, + "description": { + "translate": "advancements.israel_simulator.rav_kav.description" + }, + "frame": "task", + "show_toast": true, + "announce_to_chat": true, + "hidden": false + }, + "criteria": { + "rav_kav_ride": { + "trigger": "israel_simulator:mod_event", + "conditions": { + "event": "train_ride_rav_kav" + } + } + }, + "requirements": [ + [ + "rav_kav_ride" + ] + ] +} diff --git a/src/main/resources/data/israel_simulator/recipe/rav_kav.json b/src/main/resources/data/israel_simulator/recipe/rav_kav.json new file mode 100644 index 0000000..6344c1c --- /dev/null +++ b/src/main/resources/data/israel_simulator/recipe/rav_kav.json @@ -0,0 +1,18 @@ +{ + "type": "minecraft:crafting_shaped", + "category": "misc", + "pattern": [ + "SGS", + "SPS", + "SSS" + ], + "key": { + "S": "israel_simulator:shekel", + "G": "minecraft:gold_ingot", + "P": "minecraft:paper" + }, + "result": { + "count": 1, + "id": "israel_simulator:rav_kav" + } +} diff --git a/src/test/java/com/israelsimulator/advancement/AchievementsAndProgressionTest.java b/src/test/java/com/israelsimulator/advancement/AchievementsAndProgressionTest.java index d6e6f4c..e39bafa 100644 --- a/src/test/java/com/israelsimulator/advancement/AchievementsAndProgressionTest.java +++ b/src/test/java/com/israelsimulator/advancement/AchievementsAndProgressionTest.java @@ -4,218 +4,228 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.TreeSet; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; +/** + * The whole Israel-Simulator advancement tab: one root, every parent exists, every criterion is + * reachable, and every id an advancement names (items, entities, structures, biomes, effects, + * triggers, custom events) really exists in the mod or in vanilla. + */ public class AchievementsAndProgressionTest { - private static final List ADVANCEMENT_FILES = List.of( - "exploration/welcome_to_israel.json", - "cultural/shalom.json", - "exploration/visit_jerusalem.json", - "exploration/tel_aviv_nights.json", - "exploration/jaffa.json", - "exploration/dead_sea_tourist.json", - "economy/five_diamonds.json", - "economy/blessed_trader.json", - "combat/hava_nagila.json", - "cultural/freedom_of_speech.json", - "technology/startup_founder.json", - "exploration/master_explorer.json", - "secret/secret_kippah_cat.json", - "secret/hummus_connoisseur.json" - ); + private static final String NS = "israel_simulator:"; + private static final Path ADV_DIR = Path.of("src/main/resources/data/israel_simulator/advancement"); + private static final Path DATA = Path.of("src/main/resources/data/israel_simulator"); + private static final Path JAVA = Path.of("src/main/java/com/israelsimulator"); + private static final Path LANG = Path.of("src/main/resources/assets/israel_simulator/lang"); - @Test - public void testAllMilestoneAdvancementsExistAndAreValidJson() { - Path baseDir = Path.of("src/main/resources/data/israel_simulator/advancement"); - for (String subPath : ADVANCEMENT_FILES) { - Path file = baseDir.resolve(subPath); - assertTrue(Files.exists(file), "Advancement JSON file must exist: " + file); - - try { - String content = Files.readString(file, StandardCharsets.UTF_8); - JsonObject json = JsonParser.parseString(content).getAsJsonObject(); - assertTrue(json.has("display"), "Advancement must have display block: " + subPath); - JsonObject display = json.getAsJsonObject("display"); - assertTrue(display.has("icon"), "Display must have icon: " + subPath); - assertTrue(display.has("title"), "Display must have title: " + subPath); - assertTrue(display.has("description"), "Display must have description: " + subPath); - assertTrue(json.has("criteria"), "Advancement must have criteria: " + subPath); - } catch (Exception e) { - fail("Failed to parse advancement JSON " + subPath + ": " + e.getMessage()); + /** Vanilla triggers the mod's advancements may use. */ + private static final Set VANILLA_TRIGGERS = Set.of( + "minecraft:location", "minecraft:inventory_changed", "minecraft:consume_item", + "minecraft:player_killed_entity", "minecraft:villager_trade", "minecraft:effects_changed"); + private static final String MOD_EVENT = "israel_simulator:mod_event"; + + /** Original advancements that must keep their ids (docs, wiki and other tests point at them). */ + private static final List MILESTONES = List.of( + "exploration/welcome_to_israel", "cultural/shalom", "exploration/visit_jerusalem", + "exploration/tel_aviv_nights", "exploration/jaffa", "exploration/dead_sea_tourist", + "economy/five_diamonds", "economy/blessed_trader", "combat/hava_nagila", + "cultural/freedom_of_speech", "technology/startup_founder", "exploration/master_explorer", + "secret/secret_kippah_cat", "food/hummus_connoisseur"); + + private static final Map ADVANCEMENTS = new HashMap<>(); + private static JsonObject en; + private static JsonObject it; + + @BeforeAll + static void load() throws Exception { + try (Stream s = Files.walk(ADV_DIR)) { + for (Path f : s.filter(p -> p.toString().endsWith(".json")).toList()) { + String id = ADV_DIR.relativize(f).toString().replace('\\', '/').replace(".json", ""); + ADVANCEMENTS.put(NS + id, JsonParser.parseString(Files.readString(f, StandardCharsets.UTF_8)).getAsJsonObject()); } } + en = JsonParser.parseString(Files.readString(LANG.resolve("en_us.json"), StandardCharsets.UTF_8)).getAsJsonObject(); + it = JsonParser.parseString(Files.readString(LANG.resolve("it_it.json"), StandardCharsets.UTF_8)).getAsJsonObject(); } @Test - public void testAdvancementLocalizationStringsExistInEnUs() throws Exception { - Path langPath = Path.of("src/main/resources/assets/israel_simulator/lang/en_us.json"); - assertTrue(Files.exists(langPath), "en_us.json must exist"); - String content = Files.readString(langPath, StandardCharsets.UTF_8); - JsonObject json = JsonParser.parseString(content).getAsJsonObject(); - - String[] advancementKeys = { - "welcome_to_israel", - "shalom", - "visit_jerusalem", - "tel_aviv_nights", - "jaffa", - "dead_sea_tourist", - "five_diamonds", - "blessed_trader", - "hava_nagila", - "freedom_of_speech", - "startup_founder", - "master_explorer", - "secret_kippah_cat", - "hummus_connoisseur" - }; - - for (String key : advancementKeys) { - String titleKey = "advancements.israel_simulator." + key + ".title"; - String descKey = "advancements.israel_simulator." + key + ".description"; - - assertTrue(json.has(titleKey), "Missing title translation for: " + titleKey); - assertTrue(json.has(descKey), "Missing description translation for: " + descKey); - assertFalse(json.get(titleKey).getAsString().isBlank(), "Title cannot be blank: " + titleKey); - assertFalse(json.get(descKey).getAsString().isBlank(), "Desc cannot be blank: " + descKey); - } - } - - private static final Pattern REGISTERED_NAME = Pattern.compile( - "register(?:Item|SimpleItem|SimpleBlockItem|EntityType)?\\(\\s*\"([a-z0-9_]+)\"" - ); - - private static Set loadRegisteredNames(Path javaFile) throws Exception { - String src = Files.readString(javaFile, StandardCharsets.UTF_8); - Set names = new HashSet<>(); - Matcher m = REGISTERED_NAME.matcher(src); - while (m.find()) { - names.add(m.group(1)); + @DisplayName("Milestone advancements exist and there are plenty of advancements") + void milestonesExist() { + for (String m : MILESTONES) { + assertTrue(ADVANCEMENTS.containsKey(NS + m), "missing milestone advancement " + m); } - return names; + assertTrue(ADVANCEMENTS.size() >= 50, "expected at least 50 advancements, got " + ADVANCEMENTS.size()); } - private static void collectIds(JsonElement el, Set itemIds, Set entityTypeIds, String keyHint) { - if (el == null || el.isJsonNull()) { - return; + @Test + @DisplayName("One root; every parent exists; no cycles") + void treeIsConnected() { + List roots = new ArrayList<>(); + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + JsonObject json = e.getValue(); + if (!json.has("parent")) { + roots.add(e.getKey()); + assertTrue(json.getAsJsonObject("display").has("background"), "root needs a tab background"); + continue; + } + String parent = json.get("parent").getAsString(); + assertTrue(ADVANCEMENTS.containsKey(parent), e.getKey() + " has unknown parent " + parent); } - if (el.isJsonPrimitive() && el.getAsJsonPrimitive().isString()) { - String value = el.getAsString(); - if (!value.contains(":")) { - return; + assertEquals(List.of(NS + "exploration/welcome_to_israel"), roots, "exactly one root expected"); + for (String id : ADVANCEMENTS.keySet()) { + Set seen = new HashSet<>(); + String cur = id; + while (ADVANCEMENTS.get(cur).has("parent")) { + assertTrue(seen.add(cur), "cycle at " + id); + cur = ADVANCEMENTS.get(cur).get("parent").getAsString(); } - if ("minecraft:entity_type".equals(keyHint) || "type".equals(keyHint) && value.contains(":")) { - // entity type values under predicate minecraft:entity_type - if ("minecraft:entity_type".equals(keyHint)) { - entityTypeIds.add(value); + } + } + + @Test + @DisplayName("Display: icon, frame, and translated title/description in en_us and it_it") + void displaysAreComplete() { + Set frames = Set.of("task", "goal", "challenge"); + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + JsonObject display = e.getValue().getAsJsonObject("display"); + assertNotNull(display, e.getKey() + " has no display"); + assertTrue(display.getAsJsonObject("icon").has("id"), e.getKey() + " icon id"); + assertTrue(frames.contains(display.get("frame").getAsString()), e.getKey() + " frame"); + for (String part : List.of("title", "description")) { + String key = display.getAsJsonObject(part).get("translate").getAsString(); + assertTrue(key.startsWith("advancements.israel_simulator."), key); + assertTrue(en.has(key) && !en.get(key).getAsString().isBlank(), "en_us missing " + key); + assertTrue(it.has(key) && !it.get(key).getAsString().isBlank(), "it_it missing " + key); + } + } + } + + @Test + @DisplayName("Advancement lang keys are the same set in en_us and it_it, with no leftovers") + void langKeysMatch() { + Set used = new TreeSet<>(); + for (JsonObject json : ADVANCEMENTS.values()) { + JsonObject display = json.getAsJsonObject("display"); + used.add(display.getAsJsonObject("title").get("translate").getAsString()); + used.add(display.getAsJsonObject("description").get("translate").getAsString()); + } + Set enKeys = new TreeSet<>(); + Set itKeys = new TreeSet<>(); + en.keySet().stream().filter(k -> k.startsWith("advancements.israel_simulator.")).forEach(enKeys::add); + it.keySet().stream().filter(k -> k.startsWith("advancements.israel_simulator.")).forEach(itKeys::add); + assertEquals(enKeys, itKeys, "en_us and it_it advancement keys differ"); + assertEquals(used, enKeys, "unused or missing advancement lang keys"); + } + + @Test + @DisplayName("Every criterion is required and every requirement names a criterion") + void requirementsMatchCriteria() { + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + JsonObject criteria = e.getValue().getAsJsonObject("criteria"); + assertFalse(criteria.isEmpty(), e.getKey() + " has no criteria"); + Set required = new HashSet<>(); + for (JsonElement group : e.getValue().getAsJsonArray("requirements")) { + for (JsonElement name : group.getAsJsonArray()) { + assertTrue(criteria.has(name.getAsString()), e.getKey() + " requires unknown criterion " + name); + required.add(name.getAsString()); } } - return; + assertEquals(criteria.keySet(), required, e.getKey() + " has criteria outside the requirements"); } - if (el.isJsonObject()) { - JsonObject obj = el.getAsJsonObject(); - for (var entry : obj.entrySet()) { - String key = entry.getKey(); - JsonElement child = entry.getValue(); - if ("id".equals(key) || "items".equals(key) || "item".equals(key)) { - if (child.isJsonPrimitive()) { - itemIds.add(child.getAsString()); - } else if (child.isJsonArray()) { - for (JsonElement e : child.getAsJsonArray()) { - if (e.isJsonPrimitive()) { - itemIds.add(e.getAsString()); - } - } - } - } else if ("minecraft:entity_type".equals(key) && child.isJsonPrimitive()) { - entityTypeIds.add(child.getAsString()); - } else if ("type".equals(key) && child.isJsonPrimitive()) { - // Legacy / invalid bare entity type field — still flag for registry check - String v = child.getAsString(); - if (v.contains(":") && !v.startsWith("minecraft:") || v.startsWith("israel_simulator:")) { - // Only treat as entity if parent context looks like entity predicate; - // collected separately via minecraft:entity_type. Skip bare "type" for loot/recipe. - } + } + + @Test + @DisplayName("Triggers are vanilla or israel_simulator:mod_event with a known, fired event") + void triggersAndEventsExist() throws Exception { + String trigger = Files.readString(JAVA.resolve("registry/ModTriggers.java")); + assertTrue(trigger.contains("register(\"mod_event\""), "mod_event trigger must be registered"); + + Set events = constants(JAVA.resolve("advancement/AdvancementEvents.java")); + String prefix = "festival_"; + events.remove(prefix); + Set festivals = new HashSet<>(); + Matcher f = Pattern.compile("^\\s+[A-Z_]+\\(\\s*\"([a-z_]+)\"", Pattern.MULTILINE) + .matcher(Files.readString(JAVA.resolve("festival/FestivalType.java"))); + while (f.find()) festivals.add(prefix + f.group(1)); + assertEquals(7, festivals.size(), "festival ids: " + festivals); + + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + for (Map.Entry c : e.getValue().getAsJsonObject("criteria").entrySet()) { + JsonObject crit = c.getValue().getAsJsonObject(); + String t = crit.get("trigger").getAsString(); + if (t.equals(MOD_EVENT)) { + String ev = crit.getAsJsonObject("conditions").get("event").getAsString(); + assertTrue(events.contains(ev) || festivals.contains(ev), e.getKey() + " uses unknown event " + ev); } else { - collectIds(child, itemIds, entityTypeIds, key); + assertTrue(VANILLA_TRIGGERS.contains(t), e.getKey() + " uses unexpected trigger " + t); } } - return; } - if (el.isJsonArray()) { - for (JsonElement child : el.getAsJsonArray()) { - collectIds(child, itemIds, entityTypeIds, keyHint); - } + + // every event constant is really fired somewhere in the gameplay code + String allCode = allJava(); + Matcher m = Pattern.compile("public static final String ([A-Z_]+) = \"([a-z_]+)\"") + .matcher(Files.readString(JAVA.resolve("advancement/AdvancementEvents.java"))); + while (m.find()) { + if (m.group(2).equals(prefix)) continue; + assertTrue(allCode.contains("AdvancementEvents." + m.group(1) + ")"), + "event " + m.group(2) + " is never fired"); } } @Test - @DisplayName("Every item/entity id referenced by advancement JSONs is registered (mod) or vanilla") - public void testAdvancementReferencedIdsAreRegistered() throws Exception { - Set modItems = loadRegisteredNames(Path.of("src/main/java/com/israelsimulator/registry/ModItems.java")); - modItems.addAll(loadRegisteredNames(Path.of("src/main/java/com/israelsimulator/registry/ModBlocks.java"))); - Set modEntities = loadRegisteredNames(Path.of("src/main/java/com/israelsimulator/registry/ModEntities.java")); - - Path advDir = Path.of("src/main/resources/data/israel_simulator/advancement"); - assertTrue(Files.isDirectory(advDir), "advancement dir missing"); - - Set missingItems = new HashSet<>(); - Set missingEntities = new HashSet<>(); - try (Stream stream = Files.walk(advDir)) { - List files = stream.filter(p -> p.toString().endsWith(".json")).toList(); - assertFalse(files.isEmpty(), "expected advancement JSON files"); - for (Path file : files) { - JsonObject json = JsonParser.parseString(Files.readString(file, StandardCharsets.UTF_8)).getAsJsonObject(); - Set itemIds = new HashSet<>(); - Set entityTypeIds = new HashSet<>(); - collectIds(json, itemIds, entityTypeIds, ""); - for (String id : itemIds) { - if (id.startsWith("minecraft:")) { - continue; - } - assertTrue(id.startsWith("israel_simulator:"), - file + " references non-mod non-vanilla item id: " + id); - String path = id.substring("israel_simulator:".length()); - if (!modItems.contains(path)) { - missingItems.add(id + " (" + advDir.relativize(file) + ")"); - } - } - for (String id : entityTypeIds) { - if (id.startsWith("minecraft:")) { - continue; - } - assertTrue(id.startsWith("israel_simulator:"), - file + " references non-mod non-vanilla entity id: " + id); - String path = id.substring("israel_simulator:".length()); - if (!modEntities.contains(path)) { - missingEntities.add(id + " (" + advDir.relativize(file) + ")"); - } - } + @DisplayName("Every item, entity, structure, biome and effect id named by an advancement exists") + void referencedIdsExist() throws Exception { + Set items = registered(JAVA.resolve("registry/ModItems.java")); + items.addAll(registered(JAVA.resolve("registry/ModBlocks.java"))); + Set entities = registered(JAVA.resolve("registry/ModEntities.java")); + Set effects = registered(JAVA.resolve("registry/ModMobEffects.java")); + assertTrue(entities.contains("money_changer"), "constant-named entity ids must resolve"); + + List missing = new ArrayList<>(); + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + Refs refs = new Refs(); + collect(e.getValue(), null, refs); + for (String id : refs.items) check(missing, e.getKey(), "item", id, items.contains(local(id))); + for (String id : refs.entities) check(missing, e.getKey(), "entity", id, entities.contains(local(id))); + for (String id : refs.effects) check(missing, e.getKey(), "effect", id, effects.contains(local(id))); + for (String id : refs.structures) { + check(missing, e.getKey(), "structure", id, + Files.exists(DATA.resolve("worldgen/structure/" + local(id) + ".json"))); + } + for (String id : refs.biomes) { + boolean ok = id.startsWith("#") + ? Files.exists(DATA.resolve("tags/worldgen/biome/" + local(id.substring(1)) + ".json")) + : Files.exists(DATA.resolve("worldgen/biome/" + local(id) + ".json")); + check(missing, e.getKey(), "biome", id, ok); } } - assertTrue(missingItems.isEmpty(), "Advancement item ids not in ModItems/ModBlocks: " + missingItems); - assertTrue(missingEntities.isEmpty(), "Advancement entity ids not in ModEntities: " + missingEntities); + assertTrue(missing.isEmpty(), "Advancements reference ids that do not exist: " + missing); } @Test @DisplayName("Hava Nagila uses 26.2 entity_properties / minecraft:entity_type predicate form") - public void testHavaNagilaUsesModernEntityTypePredicate() throws Exception { - Path file = Path.of("src/main/resources/data/israel_simulator/advancement/combat/hava_nagila.json"); - JsonObject json = JsonParser.parseString(Files.readString(file, StandardCharsets.UTF_8)).getAsJsonObject(); + public void testHavaNagilaUsesModernEntityTypePredicate() { + JsonObject json = ADVANCEMENTS.get(NS + "combat/hava_nagila"); JsonElement entity = json.getAsJsonObject("criteria") .getAsJsonObject("kill_bibi_boss") .getAsJsonObject("conditions") @@ -225,8 +235,104 @@ public void testHavaNagilaUsesModernEntityTypePredicate() throws Exception { assertTrue(raw.contains("minecraft:entity_properties")); assertTrue(raw.contains("minecraft:entity_type")); assertTrue(raw.contains("israel_simulator:bibi_boss")); - assertFalse(raw.contains("\"type\":\"israel_simulator:bibi_boss\""), - "legacy bare type field must not be used"); + assertEquals(2, json.getAsJsonArray("requirements").size(), "kill AND disc, not either"); + } + + @Test + @DisplayName("Location criteria use the 26.2 player predicate, not a bare 'location' field") + void locationCriteriaUsePlayerPredicate() { + for (Map.Entry e : ADVANCEMENTS.entrySet()) { + for (Map.Entry c : e.getValue().getAsJsonObject("criteria").entrySet()) { + JsonObject crit = c.getValue().getAsJsonObject(); + if (!crit.get("trigger").getAsString().equals("minecraft:location")) continue; + JsonObject cond = crit.getAsJsonObject("conditions"); + assertFalse(cond.has("location"), e.getKey() + ": 'location' is not a field of minecraft:location"); + assertTrue(cond.get("player").isJsonArray(), e.getKey() + ": player predicate array expected"); + } + } + } + + // ---- helpers ---- + + private static final class Refs { + final Set items = new HashSet<>(); + final Set entities = new HashSet<>(); + final Set structures = new HashSet<>(); + final Set biomes = new HashSet<>(); + final Set effects = new HashSet<>(); } -} + private static void collect(JsonElement el, String key, Refs refs) { + if (el.isJsonArray()) { + for (JsonElement child : el.getAsJsonArray()) collect(child, key, refs); + return; + } + if (el.isJsonPrimitive()) { + if (!el.getAsJsonPrimitive().isString() || key == null) return; + String v = el.getAsString(); + switch (key) { + case "id", "items" -> refs.items.add(v); + case "minecraft:entity_type" -> refs.entities.add(v); + case "structures" -> refs.structures.add(v); + case "biomes" -> refs.biomes.add(v); + default -> { } + } + return; + } + if (!el.isJsonObject()) return; + for (Map.Entry e : el.getAsJsonObject().entrySet()) { + if ("effects".equals(e.getKey()) && e.getValue().isJsonObject()) { + refs.effects.addAll(e.getValue().getAsJsonObject().keySet()); + continue; + } + if ("display".equals(key) && !"icon".equals(e.getKey())) continue; + collect(e.getValue(), e.getKey(), refs); + } + } + + private static void check(List missing, String adv, String kind, String id, boolean exists) { + if (id.startsWith("minecraft:") || id.startsWith("#minecraft:")) return; + if (!exists) missing.add(kind + " " + id + " (" + adv + ")"); + } + + private static String local(String id) { + return id.startsWith(NS) ? id.substring(NS.length()) : "\u0000" + id; + } + + /** Names registered in a registry class; constant names (Foo.BAR) are resolved from the code. */ + private static Set registered(Path registry) throws Exception { + String src = Files.readString(registry, StandardCharsets.UTF_8); + Set names = new HashSet<>(); + Matcher m = Pattern.compile("\\.register(?:Item|SimpleItem|SimpleBlockItem|EntityType|Block|SimpleBlock)?\\(\\s*\"([a-z0-9_]+)\"").matcher(src); + while (m.find()) names.add(m.group(1)); + Matcher c = Pattern.compile("\\.register(?:Item|EntityType|Block)?\\(\\s*([A-Za-z.]+)\\.([A-Z_]+)\\s*,").matcher(src); + String code = allJava(); + while (c.find()) { + Matcher v = Pattern.compile(c.group(2) + "\\s*=\\s*\"([a-z0-9_]+)\"").matcher(code); + if (v.find()) names.add(v.group(1)); + } + return names; + } + + private static Set constants(Path javaFile) throws Exception { + Set out = new HashSet<>(); + Matcher m = Pattern.compile("= \"([a-z_]+)\"").matcher(Files.readString(javaFile)); + while (m.find()) out.add(m.group(1)); + return out; + } + + private static String cachedJava; + + private static String allJava() throws Exception { + if (cachedJava == null) { + StringBuilder sb = new StringBuilder(); + try (Stream s = Files.walk(JAVA)) { + for (Path p : s.filter(x -> x.toString().endsWith(".java")).toList()) { + sb.append(Files.readString(p, StandardCharsets.UTF_8)).append('\n'); + } + } + cachedJava = sb.toString(); + } + return cachedJava; + } +} diff --git a/test.md b/test.md index b9f17af..858641f 100644 --- a/test.md +++ b/test.md @@ -859,3 +859,43 @@ Non provato dall'utente in gioco. - Funzionamento atteso: ogni minuto, per ogni twin_towers con un giocatore entro 160 blocchi, parte un aereo da un punto a caso fuori dalla struttura (metà diagonale + 48-96 blocchi, quota del bersaglio + 0-15), puntato dritto al centro di una delle due torri scelta a caso, a un'altezza tra il 40% e l'85% della torre. Un solo aereo in volo per struttura; se non colpisce sparisce dopo 30 s. Sirena e titolo d'allarme solo ai giocatori vicini (256 blocchi). - Soluzione: `TwinTowersPlaneEvent` ora cerca le twin_towers nei chunk caricati vicino ai giocatori (senza caricare chunk), calcola le due torri dal template ruotato (`PoolElementStructurePiece`), sceglie un punto di partenza caricato evitando la rotta che attraversa l'altra torre. `PlaneCrashEntity` rompe e incendia solo blocchi dentro la torre colpita (calcolatore d'esplosione personalizzato) e non viene salvato su disco. - Verifica: solo la CI di GitHub, nessun test in gioco. Non provato dall'utente in gioco. + +## Avanzamenti rifatti +- Problema riscontrato: quasi tutti i 14 avanzamenti erano buggati. + - Tutti i criteri stavano in un solo gruppo `requirements`, quindi ne bastava uno qualsiasi. Bastava uno Shekel per "Welcome to Israel", tenere il disco per "Hava Nagila" senza uccidere Bibi, o avere un pezzo di drone per "Startup Founder". + - "Tel Aviv Nights" usava un campo `location` che `minecraft:location` non ha, quindi veniva ignorato. Si sbloccava ovunque, a qualsiasi ora, con la bicicletta in inventario. + - Mappa d'Israele, scarpe da camminata e bicicletta non si ottengono in sopravvivenza, quindi "Master Explorer" era impossibile. + - "Honorary Feline Citizen" si sbloccava raccogliendo una Kippah: mostrare la Kippah al gatto non dava niente. + - "Five Diamonds" chiedeva 5 diamanti qualsiasi invece della preghiera al Kotel. "Blessed Trader" chiedeva la Corona in inventario invece di uno scambio fatto indossandola. + - "Visit Jerusalem", "Jaffa", "Dead Sea Tourist" e "Hummus Connoisseur" chiedevano oggetti invece di luoghi o azioni. Per Hummus Connoisseur bastava averli in inventario, senza mangiarli, e mancava la shakshuka. + - L'albero era piatto: tutti i 13 avanzamenti stavano direttamente sotto la radice. + - La Rav-Kav non aveva una ricetta. +- Funzionamento atteso: un'unica scheda con la radice "Welcome to Israel", che si sblocca entrando in un bioma d'Israele. Sotto ci sono rami logici: Gerusalemme, Tel Aviv e costa, deserto e Mar Morto, cultura, Shabbat e feste, soldi, boss, Mossad, startup, treno, fattoria e cibo. Ogni avanzamento si sblocca solo facendo davvero la cosa descritta. +- Soluzione: + - Nuovo trigger `israel_simulator:mod_event` (`IsraelEventTrigger`, registrato in `ModTriggers`), con il campo `event`. Gli eventi stanno in `AdvancementEvents` e vengono lanciati dal codice: + - preghiere: preghiera al Muro, all'Arca e coi Tefillin; + - Shofar e gatto con la Kippah; + - Mar Morto: galleggiamento e bagno di fango; + - Shabbat: bonus riposo, e lavoro bloccato di Shabbat; + - startup: sessione col portatile, exit e consegna con lo smartphone; + - lancio del drone e treno, con o senza Rav-Kav; + - Mossad: missione completata e 5 missioni; + - evocazione di Bibi; + - aereo sulle twin_towers, per i giocatori entro 160 blocchi; + - feste, controllate una volta al secondo per giocatore. + - Gli avanzamenti si generano con `scripts/advancements/gen_advancements.py`, che scrive i JSON e le chiavi en_us/it_it. Gli avanzamenti sono 54: i 14 vecchi corretti, con lo stesso id (Hummus Connoisseur si sposta da `secret/` a `food/`), più 40 nuovi. + - Nuova ricetta della Rav-Kav: 7 Shekel, 1 lingotto d'oro e 1 carta. + - Il test `AchievementsAndProgressionTest` è stato riscritto e ora controlla: + - una sola radice e nessun genitore mancante; + - nessun criterio fuori dai `requirements`; + - stesse chiavi in en_us e it_it; + - che trigger, eventi, oggetti, entità, strutture, biomi ed effetti esistano davvero; + - che ogni evento venga lanciato da qualche parte nel codice. +- Da provare in gioco: + - entrare in un bioma d'Israele; + - stare a Tel Aviv di notte; + - pregare al Kotel; + - galleggiare sul Mar Morto e fare il bagno di fango; + - mostrare la Kippah a un gatto; + - fare uno scambio con la Corona del rabbino in testa. +- Verifica: solo la CI di GitHub, nessun test in gioco. Non provato dall'utente in gioco. diff --git a/wiki/Transportation.md b/wiki/Transportation.md index 78bc55c..1d1aa29 100644 --- a/wiki/Transportation.md +++ b/wiki/Transportation.md @@ -38,6 +38,7 @@ Comoda per girare per Tel Aviv, sul lungomare di Giaffa e sui sentieri. La Rav-Kav (`israel_simulator:rav_kav`) è la tessera dei mezzi pubblici: - **Tasto destro** con la tessera in mano per vedere se è attiva. - **Con la Rav-Kav il treno è gratis**, niente Shekel. +- **Ricetta**: 7 Shekel, 1 lingotto d'oro e 1 carta (in alto al centro l'oro, al centro la carta, il resto Shekel). --- From 3b5fcfeb323341ebde8b4291aee4bdb3f2829d88 Mon Sep 17 00:00:00 2001 From: TCDev <102576942+TCDev10@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:37:55 +0200 Subject: [PATCH 3/4] Avanzamenti: Giornata allo Shuk --- scripts/advancements/gen_advancements.py | 2 +- src/main/resources/assets/israel_simulator/lang/it_it.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/advancements/gen_advancements.py b/scripts/advancements/gen_advancements.py index 38b90a9..6077ab6 100644 --- a/scripts/advancements/gen_advancements.py +++ b/scripts/advancements/gen_advancements.py @@ -126,7 +126,7 @@ def adv(path, parent, icon, frame, criteria, mode, en, it, hidden=False, xp=0): adv("exploration/grand_market", "visit_jerusalem", "olives", "task", {"grand_market": in_structure("grand_market")}, OR, ("Shuk Day", "Get lost in the Grand Market"), - ("Giornata al Shuk", "Perditi nel Grande mercato")) + ("Giornata allo Shuk", "Perditi nel Grande mercato")) adv("economy/shuk_haggler", "grand_market", "citrus", "task", {"traded": trade("shuk_vendor")}, OR, ("Best Price for You, My Friend", "Buy something from a Shuk vendor"), diff --git a/src/main/resources/assets/israel_simulator/lang/it_it.json b/src/main/resources/assets/israel_simulator/lang/it_it.json index bbe6ce5..916a146 100644 --- a/src/main/resources/assets/israel_simulator/lang/it_it.json +++ b/src/main/resources/assets/israel_simulator/lang/it_it.json @@ -496,7 +496,7 @@ "advancements.israel_simulator.western_wall.description": "Arriva davanti al Muro del Pianto", "advancements.israel_simulator.five_diamonds.title": "Cinque Diamanti", "advancements.israel_simulator.five_diamonds.description": "Prega al Muro del Pianto con la Kippah e un Biglietto di preghiera", - "advancements.israel_simulator.grand_market.title": "Giornata al Shuk", + "advancements.israel_simulator.grand_market.title": "Giornata allo Shuk", "advancements.israel_simulator.grand_market.description": "Perditi nel Grande mercato", "advancements.israel_simulator.shuk_haggler.title": "Prezzo Speciale per Te, Amico", "advancements.israel_simulator.shuk_haggler.description": "Compra qualcosa da un venditore dello Shuk", From 2560de69b3d628a5873a58b5875fc34cc4a20808 Mon Sep 17 00:00:00 2001 From: TCDev <102576942+TCDev10@users.noreply.github.com> Date: Tue, 20 Oct 2026 12:39:06 +0200 Subject: [PATCH 4/4] test.md: spazio prima della voce avanzamenti --- test.md | 1 + 1 file changed, 1 insertion(+) diff --git a/test.md b/test.md index 798af89..82a5e31 100644 --- a/test.md +++ b/test.md @@ -865,6 +865,7 @@ Non provato dall'utente in gioco. - Funzionamento atteso: hanukkiah con base a gradini, fusto centrale, 4 coppie di bracci a U con 8 portacandele tutti alla stessa altezza e lo shamash rialzato al centro. Con `candles=0` ci sono 9 candele spente con lo stoppino. Con `candles=N` sono accesi lo shamash e N candele, partendo da destra guardando il lato sud; le fiammelle brillano anche al buio e le particelle escono proprio dalle fiamme. Nell'inventario, a terra e in mano la menorah si vede intera e di tre quarti. Il contorno e la collisione seguono il modello (base, bracci, shamash) invece del vecchio box unico. - Soluzione: modelli generati da `scripts/models/gen_menorah.py` (`menorah.json` + `menorah_lit_1..8.json`, 43 elementi sottili ciascuno, trasformazioni display per gui/terra/mano/cornice), blockstate con un modello per ogni valore di `candles`, nuova texture 16x16 solo per la menorah (oro, cera, stoppino, fiamma). In `MenorahBlock` nuova forma `Shapes.or` e particelle sulle posizioni reali delle fiamme. Id del blocco e proprietà `candles` invariati, quindi i mondi esistenti, le strutture e le decorazioni di Hanukkah nello Shuk funzionano come prima. - Verifica: solo validazione JSON/UV con Python e la CI di GitHub, nessun test in gioco. Non provato dall'utente in gioco. + ## Avanzamenti rifatti - Problema riscontrato: quasi tutti i 14 avanzamenti erano buggati. - Tutti i criteri stavano in un solo gruppo `requirements`, quindi ne bastava uno qualsiasi. Bastava uno Shekel per "Welcome to Israel", tenere il disco per "Hava Nagila" senza uccidere Bibi, o avere un pezzo di drone per "Startup Founder".