Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
05ade69
commit 0db251b
Showing
6 changed files
with
230 additions
and
220 deletions.
There are no files selected for viewing
52 changes: 52 additions & 0 deletions
52
src/main/java/org/auioc/mcmod/arnicalib/game/effect/EffectUtils.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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_"); | ||
} | ||
|
||
} |
81 changes: 81 additions & 0 deletions
81
src/main/java/org/auioc/mcmod/arnicalib/game/effect/MobEffectInstanceSerializer.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
} | ||
|
||
} |
14 changes: 14 additions & 0 deletions
14
src/main/java/org/auioc/mcmod/arnicalib/game/effect/MobEffectPredicates.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; | ||
|
||
} |
81 changes: 81 additions & 0 deletions
81
src/main/java/org/auioc/mcmod/arnicalib/game/effect/MobEffectRegistry.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.