Search in sources :

Example 1 with GetStatModifierEvent

use of net.silentchaos512.gear.api.event.GetStatModifierEvent in project Silent-Gear by SilentChaos512.

the class AbstractGearPart method getStatModifiers.

@Override
public Collection<StatInstance> getStatModifiers(IPartData part, PartType partType, StatGearKey key, ItemStack gear) {
    List<StatInstance> mods = new ArrayList<>(this.stats.get(key));
    GetStatModifierEvent event = new GetStatModifierEvent((PartData) part, (ItemStat) key.getStat(), mods);
    MinecraftForge.EVENT_BUS.post(event);
    return event.getModifiers();
}
Also used : GetStatModifierEvent(net.silentchaos512.gear.api.event.GetStatModifierEvent)

Example 2 with GetStatModifierEvent

use of net.silentchaos512.gear.api.event.GetStatModifierEvent in project Silent-Gear by SilentChaos512.

the class CompoundPart method getStatModifiers.

@Override
public Collection<StatInstance> getStatModifiers(IPartData part, PartType partType, StatGearKey key, ItemStack gear) {
    // Get the materials and all the stat modifiers they provide for this stat
    List<IMaterialInstance> materials = getMaterials(part);
    List<StatInstance> statMods = materials.stream().flatMap(m -> m.getStatModifiers(partType, key).stream()).collect(Collectors.toList());
    // Get any base modifiers for this part (could be none)
    statMods.addAll(this.stats.get(key));
    if (statMods.isEmpty()) {
        // No modifiers for this stat, so doing anything else is pointless
        return statMods;
    }
    GetStatModifierEvent event = new GetStatModifierEvent((PartData) part, (ItemStat) key.getStat(), statMods);
    MinecraftForge.EVENT_BUS.post(event);
    // Average together all modifiers of the same op. This makes things like rods with varying
    // numbers of materials more "sane".
    List<StatInstance> ret = new ArrayList<>(event.getModifiers());
    for (StatInstance.Operation op : StatInstance.Operation.values()) {
        Collection<StatInstance> modsForOp = ret.stream().filter(s -> s.getOp() == op).collect(Collectors.toList());
        if (modsForOp.size() > 1) {
            StatInstance mod = compressModifiers(modsForOp, op, key);
            ret.removeIf(inst -> inst.getOp() == op);
            ret.add(mod);
        }
    }
    // Synergy
    if (key.getStat().doesSynergyApply()) {
        final float synergy = SynergyUtils.getSynergy(this.partType, materials, getTraits(part, PartGearKey.of(gearType, partType), gear));
        if (!MathUtils.floatsEqual(synergy, 1.0f)) {
            final float multi = synergy - 1f;
            for (int i = 0; i < ret.size(); ++i) {
                StatInstance oldMod = ret.get(i);
                float value = oldMod.getValue();
                // Taking the abs of value times multi makes negative mods become less negative
                StatInstance newMod = oldMod.copySetValue(value + Math.abs(value) * multi);
                ret.remove(i);
                ret.add(i, newMod);
            }
        }
    }
    return ret;
}
Also used : JsonParseException(com.google.gson.JsonParseException) ResourceLocation(net.minecraft.resources.ResourceLocation) SilentGear(net.silentchaos512.gear.SilentGear) JsonObject(com.google.gson.JsonObject) MaterialInstance(net.silentchaos512.gear.gear.material.MaterialInstance) GearHelper(net.silentchaos512.gear.util.GearHelper) MaterialManager(net.silentchaos512.gear.gear.material.MaterialManager) FriendlyByteBuf(net.minecraft.network.FriendlyByteBuf) PartGearKey(net.silentchaos512.gear.api.util.PartGearKey) Function(java.util.function.Function) ArrayList(java.util.ArrayList) ICoreItem(net.silentchaos512.gear.api.item.ICoreItem) IPartData(net.silentchaos512.gear.api.part.IPartData) GsonHelper(net.minecraft.util.GsonHelper) ColorUtils(net.silentchaos512.gear.client.util.ColorUtils) Nullable(javax.annotation.Nullable) StatInstance(net.silentchaos512.gear.api.stats.StatInstance) ItemStat(net.silentchaos512.gear.api.stats.ItemStat) Component(net.minecraft.network.chat.Component) StatGearKey(net.silentchaos512.gear.api.util.StatGearKey) MathUtils(net.silentchaos512.utils.MathUtils) Collection(java.util.Collection) SynergyUtils(net.silentchaos512.gear.util.SynergyUtils) Collectors(java.util.stream.Collectors) PartType(net.silentchaos512.gear.api.part.PartType) GearType(net.silentchaos512.gear.api.item.GearType) IMaterial(net.silentchaos512.gear.api.material.IMaterial) MinecraftForge(net.minecraftforge.common.MinecraftForge) List(java.util.List) IPartSerializer(net.silentchaos512.gear.api.part.IPartSerializer) IMaterialInstance(net.silentchaos512.gear.api.material.IMaterialInstance) MaterialList(net.silentchaos512.gear.api.material.MaterialList) TraitInstance(net.silentchaos512.gear.api.traits.TraitInstance) GetStatModifierEvent(net.silentchaos512.gear.api.event.GetStatModifierEvent) ItemStack(net.minecraft.world.item.ItemStack) TraitHelper(net.silentchaos512.gear.util.TraitHelper) CompoundPartItem(net.silentchaos512.gear.item.CompoundPartItem) Collections(java.util.Collections) GetStatModifierEvent(net.silentchaos512.gear.api.event.GetStatModifierEvent) IMaterialInstance(net.silentchaos512.gear.api.material.IMaterialInstance) ArrayList(java.util.ArrayList) StatInstance(net.silentchaos512.gear.api.stats.StatInstance)

Aggregations

GetStatModifierEvent (net.silentchaos512.gear.api.event.GetStatModifierEvent)2 JsonObject (com.google.gson.JsonObject)1 JsonParseException (com.google.gson.JsonParseException)1 ArrayList (java.util.ArrayList)1 Collection (java.util.Collection)1 Collections (java.util.Collections)1 List (java.util.List)1 Function (java.util.function.Function)1 Collectors (java.util.stream.Collectors)1 Nullable (javax.annotation.Nullable)1 FriendlyByteBuf (net.minecraft.network.FriendlyByteBuf)1 Component (net.minecraft.network.chat.Component)1 ResourceLocation (net.minecraft.resources.ResourceLocation)1 GsonHelper (net.minecraft.util.GsonHelper)1 ItemStack (net.minecraft.world.item.ItemStack)1 MinecraftForge (net.minecraftforge.common.MinecraftForge)1 SilentGear (net.silentchaos512.gear.SilentGear)1 GearType (net.silentchaos512.gear.api.item.GearType)1 ICoreItem (net.silentchaos512.gear.api.item.ICoreItem)1 IMaterial (net.silentchaos512.gear.api.material.IMaterial)1