Skip to content

Commit

Permalink
add kill resurrected vampire advancement
Browse files Browse the repository at this point in the history
  • Loading branch information
Cheaterpaul committed Dec 3, 2023
1 parent 7aeb15e commit fdc276e
Show file tree
Hide file tree
Showing 8 changed files with 195 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
{
"parent": "vampirism:hunter/become_hunter",
"criteria": {
"killed": {
"conditions": {
"entity": [
{
"condition": "minecraft:entity_properties",
"entity": "this",
"predicate": {
"effects": {
"vampirism:neonatal": {}
},
"type_specific": {
"faction": {
"id": "vampirism:vampire"
},
"level": 1
}
}
}
]
},
"trigger": "minecraft:player_killed_entity"
},
"main": {
"conditions": {
"type": "LEVEL",
"faction": "vampirism:hunter",
"level": 1
},
"trigger": "vampirism:faction"
}
},
"display": {
"announce_to_chat": true,
"description": {
"extra": [
{
"text": "\n"
},
{
"translate": "advancement.vampirism.kill_resurrected_vampire.desc"
}
],
"translate": "advancement.vampirism.kill_resurrected_vampire"
},
"frame": "task",
"hidden": true,
"icon": {
"item": "vampirism:soul_orb_vampire"
},
"show_toast": true,
"title": {
"translate": "advancement.vampirism.kill_resurrected_vampire"
}
},
"requirements": [
[
"killed"
],
[
"main"
]
],
"sends_telemetry_event": true
}
1 change: 1 addition & 0 deletions src/main/java/de/teamlapen/vampirism/VampirismMod.java
Original file line number Diff line number Diff line change
Expand Up @@ -290,6 +290,7 @@ private void setup(final @NotNull FMLCommonSetupEvent event) {
ModEntitySelectors.registerSelectors();
event.enqueueWork(TerraBlenderCompat::registerBiomeProviderIfPresentUnsafe);
// VanillaStructureModifications.addVillageStructures(RegistryAccess.EMPTY);
event.enqueueWork(ModAdvancements::registerSubPredicatesUnsafe);

TelemetryCollector.execute();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package de.teamlapen.vampirism.advancements.critereon;

import com.google.common.base.Preconditions;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.mojang.datafixers.util.Pair;
import com.mojang.serialization.Codec;
import com.mojang.serialization.DataResult;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import de.teamlapen.vampirism.api.entity.factions.IFaction;
import de.teamlapen.vampirism.api.entity.factions.IPlayableFaction;
import de.teamlapen.vampirism.entity.factions.FactionPlayerHandler;
import net.minecraft.advancements.critereon.EntitySubPredicate;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.Vec3;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Range;

import java.util.Optional;

public class FactionSubPredicate implements EntitySubPredicate {

private static final Codec<FactionSubPredicate> CODEC = RecordCodecBuilder.create(instance -> instance.group(
IPlayableFaction.CODEC.optionalFieldOf("faction").forGetter(p -> Optional.ofNullable(p.faction)),
Codec.INT.fieldOf("level").forGetter(p -> p.level)
).apply(instance, (Optional<IFaction<?>> faction1, Integer level1) -> new FactionSubPredicate(((IPlayableFaction<?>) faction1.orElse(null)), level1)));

@Nullable
private final IPlayableFaction<?> faction;
@Range(from = 1, to = Integer.MAX_VALUE)
private final int level;

private FactionSubPredicate(@Nullable IPlayableFaction<?> faction, int level) {
Preconditions.checkArgument(level > 0, "Level must be greater than 0");
this.faction = faction;
this.level = level;
}

public static FactionSubPredicate of(@NotNull IPlayableFaction<?> faction) {
return new FactionSubPredicate(faction, 1);
}

public static FactionSubPredicate of(@NotNull IPlayableFaction<?> faction, @Range(from = 1, to = Integer.MAX_VALUE) int level) {
return new FactionSubPredicate(faction, level);
}

public static FactionSubPredicate of(@Range(from = 1, to = Integer.MAX_VALUE) int level) {
return new FactionSubPredicate(null, level);
}

@Override
public boolean matches(@NotNull Entity pEntity, @NotNull ServerLevel pLevel, @Nullable Vec3 p_218830_) {
if (pEntity instanceof Player player) {
return FactionPlayerHandler.getOpt(player).map(handler -> {
IPlayableFaction<?> currentFaction = handler.getCurrentFaction();
if (currentFaction != null) {
if (this.faction == null) {
return handler.getCurrentLevel() >= this.level;
} else if (currentFaction == this.faction) {
return handler.getCurrentLevel() >= this.level;
}
}
return false;
}).orElse(false);
}
return false;
}

@Override
public @NotNull JsonObject serializeCustomData() {
DataResult<JsonElement> jsonElementDataResult = CODEC.encodeStart(JsonOps.INSTANCE, this);
return jsonElementDataResult.result().orElseThrow().getAsJsonObject();
}

@Override
public @NotNull Type type() {
return FactionSubPredicate::fromJson;
}

public static FactionSubPredicate fromJson(JsonObject json) {
DataResult<Pair<FactionSubPredicate, JsonElement>> decode = CODEC.decode(JsonOps.INSTANCE, json);
return decode.result().orElseThrow().getFirst();
}
}
11 changes: 11 additions & 0 deletions src/main/java/de/teamlapen/vampirism/core/ModAdvancements.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package de.teamlapen.vampirism.core;

import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import de.teamlapen.vampirism.REFERENCE;
import de.teamlapen.vampirism.advancements.critereon.*;
import de.teamlapen.vampirism.mixin.EntitySubPredicateTypesAccessor;
import de.teamlapen.vampirism.mixin.PlayerAdvancementsAccessor;
import net.minecraft.advancements.CriteriaTriggers;
import net.minecraft.advancements.CriterionTrigger;
import net.minecraft.advancements.CriterionTriggerInstance;
import net.minecraft.advancements.critereon.EntitySubPredicate;
import net.minecraft.advancements.critereon.PlayerTrigger;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.PlayerAdvancements;
Expand Down Expand Up @@ -50,4 +54,11 @@ public static void revoke(PlayerTrigger trigger, ServerPlayer player) {
}
});
}

public static void registerSubPredicatesUnsafe() {
BiMap<String, EntitySubPredicate.Type> types = EntitySubPredicate.Types.TYPES;
types = HashBiMap.create(types);
types.put("vampirism:faction", FactionSubPredicate::fromJson);
EntitySubPredicateTypesAccessor.setTypes(types);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,12 @@ public void generate(@NotNull Advancement root, HolderLookup.@NotNull Provider h
.addCriterion("killed", new PlayerTrigger.TriggerInstance(ModAdvancements.TRIGGER_MOTHER_WIN.getId(), ContextAwarePredicate.ANY))
.addCriterion("main", FactionCriterionTrigger.level(VReference.HUNTER_FACTION, 1))
.save(consumer, REFERENCE.MODID + ":hunter/kill_mother");
Advancement kill_resurrected_vampire = Advancement.Builder.advancement()
.display(ModItems.SOUL_ORB_VAMPIRE.get(), Component.translatable("advancement.vampirism.kill_resurrected_vampire"), Component.translatable("advancement.vampirism.kill_resurrected_vampire").append("\n").append(Component.translatable("advancement.vampirism.kill_resurrected_vampire.desc")), null, FrameType.TASK, true, true, true)
.parent(become_hunter)
.addCriterion("killed", KilledTrigger.TriggerInstance.playerKilledEntity(EntityPredicate.Builder.entity().effects(MobEffectsPredicate.effects().and(ModEffects.NEONATAL.get())).subPredicate(FactionSubPredicate.of(VReference.VAMPIRE_FACTION))))
.addCriterion("main", FactionCriterionTrigger.level(VReference.HUNTER_FACTION, 1))
.save(consumer, REFERENCE.MODID + ":hunter/kill_resurrected_vampire");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package de.teamlapen.vampirism.mixin;

import com.google.common.collect.BiMap;
import net.minecraft.advancements.critereon.EntitySubPredicate;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Mutable;
import org.spongepowered.asm.mixin.gen.Accessor;

@Mixin(EntitySubPredicate.Types.class)
public interface EntitySubPredicateTypesAccessor {

@Final
@Mutable
@Accessor("TYPES")
static void setTypes(BiMap<String, EntitySubPredicate.Type> types) {
throw new IllegalStateException("Mixin failed to apply");
}
}
2 changes: 2 additions & 0 deletions src/main/resources/assets/vampirism/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@
"advancement.vampirism.vampire_kill_mother.desc": "You've have vanquishing the local source of power, a questionable accomplishment.",
"advancement.vampirism.resurrect": "I always come back",
"advancement.vampirism.resurrect.desc": "Resurrect as a vampire",
"advancement.vampirism.kill_resurrected_vampire": "Stay dead monster. You don't belong in this world",
"advancement.vampirism.kill_resurrected_vampire.desc": "Kill a recently resurrected vampire",
"__comment": "effect",
"effect.vampirism.sunscreen": "Sunscreen",
"effect.vampirism.thirst": "Thirst",
Expand Down
1 change: 1 addition & 0 deletions src/main/resources/vampirism.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"BeaconBeamSectionyMixin",
"BeaconBlockEntityMixin",
"CrossbowItemMixin",
"EntitySubPredicateTypesAccessor",
"IngredientAccessor",
"ItemMixin",
"LivingEntityAccessor",
Expand Down

0 comments on commit fdc276e

Please sign in to comment.