aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/util/GT_FoodStat.java
blob: f9a0f50c5f10f49af8ef083364774cac77fbbee1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package gregtech.api.util;

import gregtech.api.damagesources.GT_DamageSources;
import gregtech.api.enums.SoundResource;
import gregtech.api.interfaces.IFoodStat;
import gregtech.api.items.GT_MetaBase_Item;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Items;
import net.minecraft.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.potion.PotionEffect;

public class GT_FoodStat implements IFoodStat {
    private final int mFoodLevel;
    private final int[] mPotionEffects;
    private final float mSaturation;
    private final EnumAction mAction;
    private final ItemStack mEmptyContainer;
    private final boolean mAlwaysEdible, mInvisibleParticles, mIsRotten;
    private boolean mExplosive = false, mMilk = false;

    /**
     * @param aFoodLevel          Amount of Food in Half Bacon [0 - 20]
     * @param aSaturation         Amount of Saturation [0.0F - 1.0F]
     * @param aAction             The Action to be used. If this is null, it uses the Eating Action
     * @param aEmptyContainer     An empty Container (Optional)
     * @param aAlwaysEdible       If this Item is always edible, like Golden Apples or Potions
     * @param aInvisibleParticles If the Particles of the Potion Effects are invisible
     * @param aPotionEffects      An Array of Potion Effects with %4==0 Elements as follows
     *                            ID of a Potion Effect. 0 for none
     *                            Duration of the Potion in Ticks
     *                            Level of the Effect. [0, 1, 2] are for [I, II, III]
     *                            The likelihood that this Potion Effect takes place upon being eaten [1 - 100]
     */
    public GT_FoodStat(
            int aFoodLevel,
            float aSaturation,
            EnumAction aAction,
            ItemStack aEmptyContainer,
            boolean aAlwaysEdible,
            boolean aInvisibleParticles,
            boolean aIsRotten,
            int... aPotionEffects) {
        mFoodLevel = aFoodLevel;
        mSaturation = aSaturation;
        mAction = aAction == null ? EnumAction.eat : aAction;
        mPotionEffects = aPotionEffects;
        mEmptyContainer = GT_Utility.copyOrNull(aEmptyContainer);
        mInvisibleParticles = aInvisibleParticles;
        mAlwaysEdible = aAlwaysEdible;
        mIsRotten = aIsRotten;
    }

    public GT_FoodStat setExplosive() {
        mExplosive = true;
        return this;
    }

    public GT_FoodStat setMilk() {
        mMilk = true;
        return this;
    }

    @Override
    public int getFoodLevel(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
        return mFoodLevel;
    }

    @Override
    public float getSaturation(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
        return mSaturation;
    }

    @Override
    public void onEaten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
        aStack.stackSize--;
        ItemStack tStack = GT_OreDictUnificator.get(GT_Utility.copyOrNull(mEmptyContainer));
        if (tStack != null && !aPlayer.inventory.addItemStackToInventory(tStack))
            aPlayer.dropPlayerItemWithRandomChoice(tStack, true);

        new WorldSpawnedEventBuilder.SoundAtEntityEventBuilder()
                .setIdentifier(SoundResource.RANDOM_BURP)
                .setVolume(0.5F)
                .setPitch(aPlayer.worldObj.rand.nextFloat() * 0.1F + 0.9F)
                .setEntity(aPlayer)
                .setWorld(aPlayer.worldObj)
                .run();

        if (!aPlayer.worldObj.isRemote) {
            if (mMilk) {
                aPlayer.curePotionEffects(new ItemStack(Items.milk_bucket, 1, 0));
            }
            for (int i = 3; i < mPotionEffects.length; i += 4) {
                if (aPlayer.worldObj.rand.nextInt(100) < mPotionEffects[i]) {
                    aPlayer.addPotionEffect(new PotionEffect(
                            mPotionEffects[i - 3], mPotionEffects[i - 2], mPotionEffects[i - 1], mInvisibleParticles));
                }
            }
            if (mExplosive) {
                new WorldSpawnedEventBuilder.ExplosionEffectEventBuilder()
                        .setSmoking(true)
                        .setFlaming(true)
                        .setStrength(4f)
                        .setPosition(aPlayer.posX, aPlayer.posY, aPlayer.posZ)
                        .setEntity(aPlayer)
                        .setWorld(aPlayer.worldObj)
                        .run();
                aPlayer.attackEntityFrom(GT_DamageSources.getExplodingDamage(), Float.MAX_VALUE);
            }
        }
    }

    @Override
    public EnumAction getFoodAction(GT_MetaBase_Item aItem, ItemStack aStack) {
        return mAction;
    }

    @Override
    public boolean alwaysEdible(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
        return mAlwaysEdible;
    }

    @Override
    public boolean isRotten(GT_MetaBase_Item aItem, ItemStack aStack, EntityPlayer aPlayer) {
        return mIsRotten;
    }
}