Skip to content

Commit

Permalink
refactor(next): effect
Browse files Browse the repository at this point in the history
  • Loading branch information
WakelessSloth56 committed Sep 27, 2022
1 parent 05ade69 commit 0db251b
Show file tree
Hide file tree
Showing 6 changed files with 230 additions and 220 deletions.
@@ -0,0 +1,52 @@
package org.auioc.mcmod.arnicalib.game.effect;

import java.util.ArrayList;
import java.util.function.Predicate;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.item.ItemStack;
import net.minecraftforge.fml.util.ObfuscationReflectionHelper;

public interface EffectUtils {

static void removeEffect(LivingEntity entity, Predicate<MobEffectInstance> predicate) {
var toRemove = new ArrayList<MobEffect>();

entity.getActiveEffects().forEach((instance) -> {
if (predicate.test(instance)) toRemove.add(instance.getEffect());
});

toRemove.forEach((effect) -> entity.removeEffect(effect));
}

static int getEffectLevel(LivingEntity entity, MobEffect effect) {
var instance = entity.getEffect(effect);
return (instance == null) ? 0 : instance.getAmplifier() + 1;
}

static MobEffectInstance makeIncurable(MobEffectInstance instance) {
instance.setCurativeItems(new ArrayList<ItemStack>());
return instance;
}


static void setDuration(MobEffectInstance instance, int duration) {
((IHMobEffectInstance) instance).setDuration(duration);
}

static void setAmplifier(MobEffectInstance instance, int amplifier) {
((IHMobEffectInstance) instance).setAmplifier(amplifier);
}

@Deprecated
static void setDurationReflection(MobEffectInstance instance, int duration) {
ObfuscationReflectionHelper.setPrivateValue(MobEffectInstance.class, instance, duration, "f_19503_");
}

@Deprecated
static void setAmplifierReflection(MobEffectInstance instance, int amplifier) {
ObfuscationReflectionHelper.setPrivateValue(MobEffectInstance.class, instance, amplifier, "f_19504_");
}

}
@@ -0,0 +1,81 @@
package org.auioc.mcmod.arnicalib.game.effect;

import java.util.ArrayList;
import java.util.List;
import org.auioc.mcmod.arnicalib.base.validate.Validate;
import org.auioc.mcmod.arnicalib.utils.game.ItemUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonSyntaxException;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectInstance;
import net.minecraft.world.item.ItemStack;

public class MobEffectInstanceSerializer {

public static MobEffectInstance fromJson(JsonObject json) {
String id = GsonHelper.getAsString(json, "id");
MobEffect effect = MobEffectRegistry.getOrElseThrow(id);

int duration = GsonHelper.getAsInt(json, "duration", 1);

int amplifier = GsonHelper.getAsInt(json, "amplifier", 0);
Validate.isInCloseInterval(0, 255, amplifier);

boolean ambient = GsonHelper.getAsBoolean(json, "ambient", false);
boolean visible = GsonHelper.getAsBoolean(json, "visible", true);
boolean showIcon = GsonHelper.getAsBoolean(json, "show_icon", true);

MobEffectInstance hiddenEffect = (MobEffectInstance) null;
if (json.has("hidden_effect")) {
JsonObject hiddenEffectJson = GsonHelper.getAsJsonObject(json, "hidden_effect");
if (hiddenEffectJson.has("id") && !GsonHelper.getAsString(hiddenEffectJson, "id").equals(id)) throw new JsonSyntaxException("The id of the hidden effect must be unset or equal to the parent effect");
else hiddenEffectJson.addProperty("id", id);
if (GsonHelper.getAsInt(hiddenEffectJson, "duration", 1) <= duration) throw new JsonSyntaxException("The duration of the hidden effect must be greater than the parent effect");
hiddenEffect = fromJson(hiddenEffectJson);
}

MobEffectInstance instance = new MobEffectInstance(effect, duration, amplifier, ambient, visible, showIcon, hiddenEffect);

if (json.has("curative_items")) {
JsonArray curativeItemsJson = GsonHelper.getAsJsonArray(json, "curative_items");
List<ItemStack> curativeItems = new ArrayList<ItemStack>();
for (var element : curativeItemsJson) {
var curativeItemId = GsonHelper.convertToString(element, "curative_item");
curativeItems.add(new ItemStack(ItemUtils.getItemOrElseThrow(curativeItemId)));
}
instance.setCurativeItems(curativeItems);
}

return instance;
}

public static void toJson(MobEffectInstance instance, JsonObject json) {
json.addProperty("id", instance.getEffect().getRegistryName().toString());
json.addProperty("duration", instance.getDuration());
json.addProperty("amplifier", instance.getAmplifier());
json.addProperty("ambient", instance.isAmbient());
json.addProperty("visible", instance.isVisible());
json.addProperty("show_icon", instance.showIcon());

JsonArray curativeItems = new JsonArray();
for (ItemStack itemStack : instance.getCurativeItems()) {
curativeItems.add(itemStack.getItem().getRegistryName().toString());
}
json.add("curative_items", curativeItems);

if (((IHMobEffectInstance) instance).getHiddenEffect() != null) {
JsonObject hiddenEffect = new JsonObject();
toJson(((IHMobEffectInstance) instance).getHiddenEffect(), hiddenEffect);
json.add("hidden_effect", hiddenEffect);
}
}

public static JsonObject toJson(MobEffectInstance instance) {
JsonObject json = new JsonObject();
toJson(instance, json);
return json;
}

}
@@ -0,0 +1,14 @@
package org.auioc.mcmod.arnicalib.game.effect;

import java.util.function.Predicate;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraft.world.effect.MobEffectInstance;

public class MobEffectPredicates {

public static final Predicate<MobEffectInstance> IS_BENEFICIAL = (e) -> e.getEffect().isBeneficial();
public static final Predicate<MobEffectInstance> IS_NOT_BENEFICIAL = (e) -> !e.getEffect().isBeneficial();
public static final Predicate<MobEffectInstance> IS_HARMFUL = (e) -> e.getEffect().getCategory() == MobEffectCategory.HARMFUL;
public static final Predicate<MobEffectInstance> IS_NEUTRAL = (e) -> e.getEffect().getCategory() == MobEffectCategory.NEUTRAL;

}
@@ -0,0 +1,81 @@
package org.auioc.mcmod.arnicalib.game.effect;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import org.auioc.mcmod.arnicalib.base.random.RandomUtils;
import org.auioc.mcmod.arnicalib.game.registry.RegistryEntryException;
import org.auioc.mcmod.arnicalib.utils.game.OrderedForgeRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.effect.MobEffect;
import net.minecraft.world.effect.MobEffectCategory;
import net.minecraftforge.registries.ForgeRegistries;

public class MobEffectRegistry {

@Nonnull
@Deprecated
public static Optional<MobEffect> get(int id) {
return Optional.ofNullable(MobEffect.byId(id));
}

@Nonnull
public static Optional<MobEffect> get(ResourceLocation id) {
return Optional.ofNullable(ForgeRegistries.MOB_EFFECTS.containsKey(id) ? ForgeRegistries.MOB_EFFECTS.getValue(id) : null);
}

@Nonnull
public static Optional<MobEffect> get(String id) {
return get(new ResourceLocation(id));
}

@Nonnull
public static MobEffect getOrElseThrow(ResourceLocation id) {
return get(id).orElseThrow(RegistryEntryException.UNKNOWN_MOB_EFFECT.create(id.toString()));
}

@Nonnull
public static MobEffect getOrElseThrow(String id) {
return get(id).orElseThrow(RegistryEntryException.UNKNOWN_MOB_EFFECT.create(id));
}

public static List<MobEffect> getAll(@Nullable MobEffectCategory type) {
var effectsList = new ArrayList<MobEffect>();
for (var effect : ForgeRegistries.MOB_EFFECTS.getValues()) {
if (type == null || effect.getCategory() == type) {
effectsList.add(effect);
}
}
return effectsList;
}

public static List<MobEffect> getHarmfulEffects() {
return getAll(MobEffectCategory.HARMFUL);
}

public static List<MobEffect> getBeneficialEffects() {
return getAll(MobEffectCategory.BENEFICIAL);
}

public static List<MobEffect> getNeutralEffects() {
return getAll(MobEffectCategory.NEUTRAL);
}

public static List<MobEffect> getAll() {
return getAll(null);
}

public static MobEffect getRandom(boolean useOrderedRegestry) {
if (useOrderedRegestry) {
return RandomUtils.pickOneFromList(OrderedForgeRegistries.MOB_EFFECTS.get()).getValue();
}
return RandomUtils.pickOneFromCollection(ForgeRegistries.MOB_EFFECTS.getValues());
}

public static MobEffect getRandom() {
return getRandom(true);
}

}
Expand Up @@ -3,8 +3,8 @@
import java.util.ArrayList;
import java.util.List;
import org.auioc.mcmod.arnicalib.base.validate.Validate;
import org.auioc.mcmod.arnicalib.game.effect.MobEffectInstanceSerializer;
import org.auioc.mcmod.arnicalib.server.loot.AHLootItemFunctions;
import org.auioc.mcmod.arnicalib.utils.game.EffectUtils;
import com.google.gson.JsonArray;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonElement;
Expand Down Expand Up @@ -49,7 +49,7 @@ public SetCustomEffectsFunction deserialize(JsonObject json, JsonDeserialization
JsonArray effectsJson = GsonHelper.getAsJsonArray(json, "effects");
Validate.isTrue(!effectsJson.isEmpty(), "The mob effect instance list must be not empty");
for (JsonElement element : effectsJson) {
effects.add(EffectUtils.deserializeFromJson(GsonHelper.convertToJsonObject(element, "mobEffectInstance")));
effects.add(MobEffectInstanceSerializer.fromJson(GsonHelper.convertToJsonObject(element, "mobEffectInstance")));
}

return new SetCustomEffectsFunction(conditions, effects);
Expand Down

0 comments on commit 0db251b

Please sign in to comment.