package joshie.progression.criteria.rewards;
import com.google.gson.JsonObject;
import joshie.progression.Progression;
import joshie.progression.api.ProgressionAPI;
import joshie.progression.api.criteria.IField;
import joshie.progression.api.criteria.IFilterProvider;
import joshie.progression.api.criteria.ProgressionRule;
import joshie.progression.api.special.*;
import joshie.progression.gui.fields.ItemFilterFieldPreview;
import joshie.progression.helpers.ItemHelper;
import joshie.progression.helpers.SpawnItemHelper;
import joshie.progression.network.PacketHandler;
import joshie.progression.network.PacketRewardItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import java.util.List;
import java.util.Random;
import static joshie.progression.api.special.DisplayMode.EDIT;
import static joshie.progression.gui.core.GuiList.MODE;
import static net.minecraft.util.text.TextFormatting.BLUE;
@ProgressionRule(name="item", color=0xFFE599FF)
public class RewardItem extends RewardBaseItemFilter implements ICustomDisplayName, ICustomDescription, ICustomWidth, ICustomTooltip, ISpecialFieldProvider, IStackSizeable, IRequestItem, ISpecialJSON {
private static final Random rand = new Random();
public int stackSizeMin = 1;
public int stackSizeMax = 1;
@Override
public String getDisplayName() {
return MODE == EDIT ? Progression.translate(getProvider().getUnlocalisedName()) : Progression.translate(getProvider().getUnlocalisedName() + ".display");
}
@Override
public String getDescription() {
return "";
}
@Override
public int getWidth(DisplayMode mode) {
return mode == EDIT ? 100 : 55;
}
@Override
public void addTooltip(List list) {
list.add(BLUE + Progression.translate("item.free"));
list.add(getIcon().getDisplayName() + " x" + stackSizeMin + " to " + stackSizeMax);
}
@Override
public void addSpecialFields(List<IField> fields, DisplayMode mode) {
if (mode == EDIT) fields.add(new ItemFilterFieldPreview("filters", this, 50, 40, 2F));
else fields.add(new ItemFilterFieldPreview("filters", this, 5, 25, 2.8F));
}
@Override
public int getStackSize() {
int random = Math.max(0, (stackSizeMax - stackSizeMin));
int additional = 0;
if (random != 0) {
additional = rand.nextInt(random + 1);
}
return stackSizeMin + additional;
}
@Override
public ItemStack getRequestedStack(EntityPlayer player) {
int random = Math.max(0, (stackSizeMax - stackSizeMin));
int additional = 0;
if (random != 0) {
additional = player.worldObj.rand.nextInt(random + 1);
}
int amount = stackSizeMin + additional;
return ItemHelper.getRandomItemOfSize(filters, player, amount);
}
@Override
public void reward(EntityPlayer player, ItemStack stack) {
if (stack != null) {
for (IFilterProvider filter: filters) {
if (filter.getProvided().matches(stack)) {
PacketHandler.sendToClient(new PacketRewardItem(stack.copy()), (EntityPlayerMP) player);
SpawnItemHelper.addToPlayerInventory(player, stack.copy());
return;
}
}
}
}
@Override
public void reward(EntityPlayerMP player) {
ProgressionAPI.registry.requestItem(this, player);
}
@Override
public boolean onlySpecial() {
return false;
}
@Override
public void readFromJSON(JsonObject data) {
if (data.get("stackSize") != null) {
stackSizeMin = data.get("stackSize").getAsInt();
stackSizeMax = data.get("stackSize").getAsInt();
}
}
@Override
public void writeToJSON(JsonObject object) {}
}