package joshie.harvest.crops.loot;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext;
import joshie.harvest.api.crops.Crop;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.conditions.LootCondition;
import net.minecraft.world.storage.loot.functions.LootFunction;
import javax.annotation.Nonnull;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import static joshie.harvest.core.lib.HFModInfo.MODID;
public class SetCropType extends LootFunction {
private static List<Crop> cropsList;
private final String crop;
@SuppressWarnings("WeakerAccess")
public SetCropType(LootCondition[] conditionsIn, String crop) {
super(conditionsIn);
this.crop = crop;
}
@Override
@Nonnull
public ItemStack apply(@Nonnull ItemStack stack, @Nonnull Random rand, @Nonnull LootContext context) {
if (crop.equals("randomCrop")) return random(true);
if (crop.equals("randomSeed")) return random(false);
ResourceLocation resource = crop.contains(":") ? new ResourceLocation(crop) : new ResourceLocation(MODID, crop);
Crop theCrop = Crop.REGISTRY.get(resource);
return theCrop.getCropStack(stack.stackSize);
}
public ItemStack random(boolean crop) {
if (cropsList == null) {
cropsList = new ArrayList<>(Crop.REGISTRY.values());
cropsList.remove(Crop.NULL_CROP);
}
Collections.shuffle(cropsList);
return crop ? cropsList.get(0).getCropStack(1) : cropsList.get(0).getSeedStack(1);
}
public static class Serializer extends LootFunction.Serializer<SetCropType> {
public Serializer() {
super(new ResourceLocation("hf_set_crop"), SetCropType.class);
}
public void serialize(@Nonnull JsonObject object, @Nonnull SetCropType functionClazz, @Nonnull JsonSerializationContext serializationContext) {
object.addProperty("crop", functionClazz.crop);
}
@Nonnull
public SetCropType deserialize(@Nonnull JsonObject object, @Nonnull JsonDeserializationContext deserializationContext, @Nonnull LootCondition[] conditionsIn) {
return new SetCropType(conditionsIn, object.get("crop").getAsString());
}
}
}