Skip to content

Instantly share code, notes, and snippets.

@Lanse505
Created January 10, 2022 23:48
Show Gist options
  • Save Lanse505/c40f23ecd8c9c966dabd61e9e390cefc to your computer and use it in GitHub Desktop.
Save Lanse505/c40f23ecd8c9c966dabd61e9e390cefc to your computer and use it in GitHub Desktop.
package com.teamacronymcoders.essence.api.modified.rewrite.itemstack;
import com.teamacronymcoders.essence.api.holder.ModifierHolder;
import com.teamacronymcoders.essence.api.modifier.IModifier;
import com.teamacronymcoders.essence.api.modifier.ModifierInstance;
import com.teamacronymcoders.essence.common.util.helper.EssenceItemstackModifierHelpers;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import java.util.ArrayList;
import java.util.List;
public class ItemStackModifierHolder extends ModifierHolder<ItemStack> {
private final ItemStack stack;
public ItemStackModifierHolder() {
super();
stack = ItemStack.EMPTY;
}
public ItemStackModifierHolder(ItemStack stack) {
super();
this.stack = stack;
}
@Override
public CompoundTag serializeNBT() {
final CompoundTag holder = super.serializeNBT();
if (stack.hasTag() && stack.getTag() != null) {
stack.getTag().put(EssenceItemstackModifierHelpers.HOLDER, holder);
} else {
stack.getOrCreateTag().put(EssenceItemstackModifierHelpers.HOLDER, holder);
}
return holder;
}
@Override
public void deserializeNBT(CompoundTag tags) {
if (stack.getTag() != null) super.deserializeNBT(stack.getTag());
}
@SuppressWarnings("unchecked")
@Override
public boolean addModifierInstance(boolean simulate, ItemStack object, ModifierInstance... instances) {
List<ModifierInstance> copy = new ArrayList<>(List.of(instances));
for (ModifierInstance mi : getModifierInstances()) {
for (ModifierInstance addition : instances) {
if (mi.getModifier().get().equals(addition.getModifier().get())) {
copy.remove(addition);
mi.getModifier().get().mergeInstance(object, mi, addition);
}
}
}
if (!copy.isEmpty()) copy.forEach(instance -> getModifierInstances().add(instance));
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean removeModifierInstance(boolean simulate, ItemStack object, IModifier<ItemStack>... modifiers) {
List<ModifierInstance> instancesToRemove = new ArrayList<>();
for (ModifierInstance mi : getModifierInstances()) {
for (IModifier<ItemStack> remover : modifiers) {
if (mi.getModifier().get().equals(remover)) {
instancesToRemove.add(mi);
}
}
}
instancesToRemove.forEach(instance -> getModifierInstances().remove(instance));
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean levelUpModifier(boolean simulate, int increase, ItemStack object, IModifier<ItemStack>... modifiers) {
for (ModifierInstance mi : getModifierInstances()) {
for (IModifier<ItemStack> addition : modifiers) {
if (mi.getModifier().get().equals(addition)) {
mi.setLevel(Math.min(mi.getLevel() + increase, mi.getModifier().get().getMaxLevel(object)));
}
}
}
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean levelUpModifier(boolean simulate, int increase, ItemStack object, ModifierInstance... modifiersWithData) {
for (ModifierInstance mi : getModifierInstances()) {
for (ModifierInstance addition : modifiersWithData) {
if (mi.getModifier().get().equals(addition.getModifier().get())) {
mi.setLevel(Math.min(mi.getLevel() + increase, mi.getModifier().get().getMaxLevel(object)));
}
}
}
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean levelDownModifier(boolean simulate, int decrease, ItemStack object, IModifier<ItemStack>... modifiers) {
for (ModifierInstance mi : getModifierInstances()) {
for (IModifier<ItemStack> addition : modifiers) {
if (mi.getModifier().get().equals(addition)) {
mi.setLevel(Math.max(mi.getLevel() - decrease, mi.getModifier().get().getMinLevel(object)));
}
}
}
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean levelDownModifier(boolean simulate, int decrease, ItemStack object, ModifierInstance... modifiersWithData) {
for (ModifierInstance mi : getModifierInstances()) {
for (ModifierInstance addition : modifiersWithData) {
if (mi.getModifier().get().equals(addition.getModifier().get())) {
mi.setLevel(Math.min(mi.getLevel() - decrease, mi.getModifier().get().getMinLevel(object)));
}
}
}
return true;
}
@Override
public boolean levelSetModifier(boolean simulate, int level, ItemStack object, IModifier<ItemStack>... modifiers) {
for (ModifierInstance mi : getModifierInstances()) {
for (IModifier<ItemStack> setter : modifiers) {
if (mi.getModifier().get().equals(setter)) {
mi.setLevel(Math.min(setter.getMaxLevel(object), Math.max(setter.getMinLevel(object), level)));
}
}
}
return true;
}
@SuppressWarnings("unchecked")
@Override
public boolean levelSetModifier(boolean simulate, int level, ItemStack object, ModifierInstance... modifiersWithData) {
for (ModifierInstance mi : getModifierInstances()) {
for (ModifierInstance addition : modifiersWithData) {
if (mi.getModifier().get().equals(addition.getModifier().get())) {
mi.setLevel(Math.min(addition.getModifier().get().getMaxLevel(object), Math.max(addition.getModifier().get().getMinLevel(object), level)));
}
}
}
return true;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment