Skip to content

Instantly share code, notes, and snippets.

@Lanse505
Last active January 1, 2022 00:45
Show Gist options
  • Save Lanse505/817c7f93a9a843c38c7dc11495eb0685 to your computer and use it in GitHub Desktop.
Save Lanse505/817c7f93a9a843c38c7dc11495eb0685 to your computer and use it in GitHub Desktop.
package com.teamacronymcoders.essence.common.capability.itemstack.modifier;
import com.google.common.collect.Lists;
import com.teamacronymcoders.essence.api.holder.ModifierHolder;
import com.teamacronymcoders.essence.api.holder.ModifierInstance;
import com.teamacronymcoders.essence.api.modified.IModified;
import com.teamacronymcoders.essence.api.modifier.core.Modifier;
import com.teamacronymcoders.essence.common.util.helper.EssenceItemstackModifierHelpers;
import net.minecraft.nbt.ListTag;
import net.minecraft.nbt.Tag;
import net.minecraft.world.item.ItemStack;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ItemStackModifierHolder extends ModifierHolder<ItemStack> {
private ItemStack stack;
public ItemStackModifierHolder() {
super();
}
public ItemStackModifierHolder(ItemStack stack) {
super();
this.stack = stack;
}
@Override
public boolean addModifierInstance(boolean simulate, ItemStack object, ModifierInstance... instances) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : instances) {
if (!sim.contains(instance)) {
sim.add(instance);
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : instances) {
if (!getModifierInstances().contains(instance)) {
getModifierInstances().add(instance);
modified.decreaseFreeModifiers(instance.getModifier().getModifierCountValue(instance.getLevel()));
}
}
return true;
}
return false;
}
@Override
public boolean removeModifierInstance(boolean simulate, ItemStack object, Modifier... modifiers) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = Lists.newArrayList(getModifierInstances());
for (Modifier modifier : modifiers) {
sim.removeIf(instance -> instance.getModifier() == modifier);
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
if (modifiers != null && modifiers.length > 0) {
int cmc = Arrays.stream(modifiers).map(modifier -> {
if (modifier != null) {
List<ModifierInstance> instancesToRemove = new ArrayList<>();
int val = this.getModifierInstances().stream().filter(instance -> instance != null && instance.getModifier() == modifier)
.map(instance -> {
instancesToRemove.add(instance);
return instance.getModifier().getModifierCountValue(instance.getLevel());
}).reduce(0, Integer::sum);
if (!instancesToRemove.isEmpty()) instancesToRemove.forEach(instance -> this.getModifierInstances().remove(instance));
return val;
}
return 0;
}).reduce(0, Integer::sum);
modified.addModifierWithoutIncreasingAdditional(cmc);
return true;
}
return false;
}
return false;
}
@Override
public boolean levelUpModifier(boolean simulate, int increase, ItemStack object, Modifier... modifiers) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
boolean matched = false;
for (Modifier modifier : modifiers) {
if (instance.getModifier() == modifier) {
matched = true;
break;
}
}
if (matched) {
Modifier stackCoreModifier = instance.getModifier();
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (Modifier modifier : modifiers) {
if (instance.getModifier() == modifier) {
matched = true;
break;
}
}
if (matched) {
Modifier stackCoreModifier = instance.getModifier();
int x = stackCoreModifier.getModifierCountValue(instance.getLevel());
int y = stackCoreModifier.getModifierCountValue(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
if (x < y) {
modified.decreaseFreeModifiers(y - x);
}
}
}
return true;
}
return false;
}
@Override
public boolean levelUpModifier(boolean simulate, int increase, ItemStack object, ModifierInstance... modifiersWithData) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
boolean matched = false;
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
matched = true;
break;
}
}
if (matched) {
Modifier stackCoreModifier = instance.getModifier();
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
matched = true;
break;
}
}
if (matched) {
Modifier stackCoreModifier = instance.getModifier();
int x = stackCoreModifier.getModifierCountValue(instance.getLevel());
int y = stackCoreModifier.getModifierCountValue(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
if (x < y) {
modified.decreaseFreeModifiers(y - x);
}
}
}
return true;
}
return false;
}
@Override
public boolean levelDownModifier(boolean simulate, int decrease, ItemStack object, Modifier... modifiers) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
boolean matched = false;
for (Modifier modifier : modifiers) {
if (instance.getModifier() == modifier) {
matched = true;
break;
}
}
if (matched) {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
sim.remove(instance);
continue;
}
instance.setLevel(instance.getLevel() - decrease);
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (Modifier modifier : modifiers) {
if (modifier == instance.getModifier()) {
matched = true;
break;
}
}
if (matched) {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
removeModifierInstance(false, object, instance.getModifier());
continue;
}
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(instance.getLevel() - decrease);
instance.setLevel(instance.getLevel() - decrease);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
}
}
return true;
}
return false;
}
@Override
public boolean levelDownModifier(boolean simulate, int decrease, ItemStack object, ModifierInstance... modifiersWithData) {
boolean result = false;
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
boolean matched = false;
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
matched = true;
break;
}
}
if (matched) {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
sim.remove(instance);
continue;
}
instance.setLevel(instance.getLevel() - decrease);
}
}
result = modified.recheck(sim);
} else if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
matched = true;
break;
}
}
if (matched) {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
removeModifierInstance(false, object, instance.getModifier());
continue;
}
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(instance.getLevel() - decrease);
instance.setLevel(instance.getLevel() - decrease);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
}
}
result = true;
}
return result;
}
@Override
public boolean levelSetModifier(boolean simulate, int level, ItemStack object, Modifier... modifiers) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
for (Modifier modifier : modifiers) {
if (instance.getModifier() == modifier) {
instance.setLevel(level);
break;
}
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (Modifier modifier : modifiers) {
if (instance.getModifier() == modifier) {
matched = true;
break;
}
}
if (matched) {
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(level);
instance.setLevel(level);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
if (x < 0) {
modified.decreaseFreeModifiers(x);
}
}
}
return true;
}
return false;
}
@Override
public boolean levelSetModifier(boolean simulate, int level, ItemStack object, ModifierInstance... modifiersWithData) {
if (simulate && object.getItem() instanceof IModified modified) {
List<ModifierInstance> sim = getModifierInstances();
for (ModifierInstance instance : sim) {
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
instance.setLevel(level);
break;
}
}
}
return modified.recheck(sim);
}
if (object.getItem() instanceof IModified modified) {
for (ModifierInstance instance : getModifierInstances()) {
boolean matched = false;
for (ModifierInstance modifier : modifiersWithData) {
if (instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()) {
matched = true;
break;
}
}
if (matched) {
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(level);
instance.setLevel(level);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
if (x < 0) {
modified.decreaseFreeModifiers(x);
}
}
}
return true;
}
return false;
}
@Override
public ListTag serializeNBT() {
final ListTag listNBT = new ListTag();
for (ModifierInstance instance : getModifierInstances()) {
listNBT.add(instance.serializeNBT());
}
stack.getOrCreateTag().put(EssenceItemstackModifierHelpers.TAG_MODIFIERS, listNBT);
return listNBT;
}
@Override
public void deserializeNBT(ListTag nbt) {
super.deserializeNBT(nbt.size() > 0 ? nbt : stack.getOrCreateTag().getList(EssenceItemstackModifierHelpers.TAG_MODIFIERS, Tag.TAG_COMPOUND));
}
}
package com.teamacronymcoders.essence.api.holder;
import com.google.common.collect.Lists;
import com.teamacronymcoders.essence.api.modified.IModified;
import com.teamacronymcoders.essence.api.modifier.core.Modifier;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.ListTag;
import net.minecraftforge.common.util.INBTSerializable;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public abstract class ModifierHolder<T> implements IModifierHolder<T>, INBTSerializable<ListTag> {
private final List<ModifierInstance> modifiers;
public ModifierHolder() {
modifiers = new ArrayList<>();
}
@Override
public boolean addModifierInstance(boolean simulate, T object, ModifierInstance... instances) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = modifiers;
for (ModifierInstance instance : instances) {
if (!sim.contains(instance)) {
sim.add(instance);
}
}
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
for (ModifierInstance instance : instances) {
if (!modifiers.contains(instance)) {
modifiers.add(instance);
modified.decreaseFreeModifiers(instance.getModifier().getModifierCountValue(instance.getLevel()));
}
}
return true;
}
return false;
}
@Override
public boolean removeModifierInstance(boolean simulate, T object, Modifier... modifiers) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = Lists.newArrayList(this.modifiers);
Arrays.stream(modifiers).forEach(modifier -> sim.stream().filter(instance -> instance.getModifier() == modifier).forEach(sim::remove));
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
int cmc = Arrays.stream(modifiers).map(modifier -> this.modifiers.stream().filter(instance -> instance.getModifier() == modifier)
.map(instance -> {
this.modifiers.remove(instance);
return instance.getModifier().getModifierCountValue(instance.getLevel());
}).reduce(0, Integer::sum)).reduce(0, Integer::sum);
modified.addModifierWithoutIncreasingAdditional(cmc);
return true;
}
return false;
}
@Override
public boolean levelUpModifier(boolean simulate, int increase, T object, Modifier... modifiers) {
if (simulate && object instanceof IModified) {
IModified modified = (IModified) object;
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> instance.getModifier() == modifier))
.forEach(instance -> {
Modifier stackCoreModifier = instance.getModifier();
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> instance.getModifier() == modifier))
.forEach(instance -> {
Modifier stackCoreModifier = instance.getModifier();
int x = stackCoreModifier.getModifierCountValue(instance.getLevel());
int y = stackCoreModifier.getModifierCountValue(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
if (x < y) {
modified.decreaseFreeModifiers(y - x);
}
});
return true;
}
return false;
}
@Override
public boolean levelUpModifier(boolean simulate, int increase, T object, ModifierInstance... modifiersWithData) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
Modifier stackCoreModifier = instance.getModifier();
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
Modifier stackCoreModifier = instance.getModifier();
int x = stackCoreModifier.getModifierCountValue(instance.getLevel());
int y = stackCoreModifier.getModifierCountValue(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
instance.setLevel(Math.min(instance.getLevel() + increase, stackCoreModifier.getMaxLevel()));
if (x < y) {
modified.decreaseFreeModifiers(y - x);
}
});
return true;
}
return false;
}
@Override
public boolean levelDownModifier(boolean simulate, int decrease, T object, Modifier... modifiers) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> instance.getModifier() == modifier))
.forEach(instance -> {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
sim.remove(instance);
return;
}
instance.setLevel(instance.getLevel() - decrease);
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> modifier == instance.getModifier()))
.forEach(instance -> {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
removeModifierInstance(false, object, instance.getModifier());
return;
}
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(instance.getLevel() - decrease);
instance.setLevel(instance.getLevel() - decrease);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
});
return true;
}
return false;
}
@Override
public boolean levelDownModifier(boolean simulate, int decrease, T object, ModifierInstance... modifiersWithData) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
sim.remove(instance);
return;
}
instance.setLevel(instance.getLevel() - decrease);
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
int level = instance.getLevel();
if (level - decrease < instance.getModifier().getMinLevel()) {
removeModifierInstance(false, object, instance.getModifier());
return;
}
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(instance.getLevel() - decrease);
instance.setLevel(instance.getLevel() - decrease);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
});
return true;
}
return false;
}
@Override
public boolean levelSetModifier(boolean simulate, int level, T object, Modifier... modifiers) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> instance.getModifier() == modifier))
.forEach(instance -> {
instance.setLevel(level);
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiers).anyMatch(modifier -> instance.getModifier() == modifier))
.forEach(instance -> {
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(level);
instance.setLevel(level);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
if (x < 0) {
modified.decreaseFreeModifiers(x);
}
});
return true;
}
return false;
}
@Override
public boolean levelSetModifier(boolean simulate, int level, T object, ModifierInstance... modifiersWithData) {
if (simulate && object instanceof IModified modified) {
List<ModifierInstance> sim = this.modifiers;
sim.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
instance.setLevel(level);
});
return modified.recheck(sim);
}
if (object instanceof IModified modified) {
this.modifiers.stream()
.filter(instance -> Arrays.stream(modifiersWithData).anyMatch(modifier -> instance.getModifier() == modifier.getModifier() && instance.getModifierData() == modifier.getModifierData()))
.forEach(instance -> {
int x = instance.getModifier().getModifierCountValue(instance.getLevel()) - instance.getModifier().getModifierCountValue(level);
instance.setLevel(level);
if (x > 0) {
modified.addModifierWithoutIncreasingAdditional(x);
}
if (x < 0) {
modified.decreaseFreeModifiers(x);
}
});
return true;
}
return false;
}
@Nonnull
@Override
public List<ModifierInstance> getModifierInstances() {
return modifiers;
}
@Override
public void clearModifiers() {
modifiers.clear();
}
@Override
public ListTag serializeNBT() {
final ListTag listNBT = new ListTag();
for (ModifierInstance instance : modifiers) {
listNBT.add(instance.serializeNBT());
}
return listNBT;
}
@Override
public void deserializeNBT(ListTag tags) {
this.modifiers.clear();
for (int i = 0; i < tags.size(); i++) {
final CompoundTag compoundTag = tags.getCompound(i);
final ModifierInstance instance = new ModifierInstance();
instance.deserializeNBT(compoundTag);
this.modifiers.add(instance);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment