/*
* This file is part of Matter Overdrive
* Copyright (c) 2015., Simeon Radivoev, All rights reserved.
*
* Matter Overdrive is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Matter Overdrive is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Matter Overdrive. If not, see <http://www.gnu.org/licenses>.
*/
package matteroverdrive.entity.player;
import cpw.mods.fml.common.eventhandler.Event;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.api.events.MOEventQuest;
import matteroverdrive.api.quest.IQuestReward;
import matteroverdrive.api.quest.QuestStack;
import matteroverdrive.data.quest.PlayerQuestData;
import matteroverdrive.gui.GuiDataPad;
import matteroverdrive.handler.GoogleAnalyticsCommon;
import matteroverdrive.init.MatterOverdriveItems;
import matteroverdrive.network.packet.client.quest.PacketSyncQuests;
import matteroverdrive.network.packet.client.quest.PacketUpdateQuest;
import matteroverdrive.proxy.ClientProxy;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ChatComponentText;
import net.minecraft.world.World;
import net.minecraftforge.common.IExtendedEntityProperties;
import net.minecraftforge.common.MinecraftForge;
import java.util.ArrayList;
import java.util.EnumSet;
import java.util.List;
/**
* Created by Simeon on 11/19/2015.
*/
public class MOExtendedProperties implements IExtendedEntityProperties
{
public static final String EXT_PROP_NAME = "MOPlayer";
private EntityPlayer player;
private PlayerQuestData questData;
public MOExtendedProperties(EntityPlayer player)
{
this.player = player;
questData = new PlayerQuestData(this);
}
public static void register(EntityPlayer player)
{
player.registerExtendedProperties(EXT_PROP_NAME, new MOExtendedProperties(player));
}
public static MOExtendedProperties get(EntityPlayer player)
{
return (MOExtendedProperties) player.getExtendedProperties(EXT_PROP_NAME);
}
@Override
public void saveNBTData(NBTTagCompound compound) {
NBTTagCompound questNBT = new NBTTagCompound();
questData.writeToNBT(questNBT, EnumSet.allOf(PlayerQuestData.DataType.class));
compound.setTag("QuestData",questNBT);
}
@Override
public void loadNBTData(NBTTagCompound compound)
{
NBTTagCompound questNBT = compound.getCompoundTag("QuestData");
questData.readFromNBT(questNBT,EnumSet.allOf(PlayerQuestData.DataType.class));
}
public void sync(EnumSet<PlayerQuestData.DataType> dataTypes)
{
if (player != null && !player.worldObj.isRemote && player instanceof EntityPlayerMP)
{
MatterOverdrive.packetPipeline.sendTo(new PacketSyncQuests(questData,dataTypes),(EntityPlayerMP) player);
}
}
public void copy(MOExtendedProperties oterExtendetProperies)
{
NBTTagCompound tagCompound = new NBTTagCompound();
oterExtendetProperies.saveNBTData(tagCompound);
loadNBTData(tagCompound);
}
public void addQuest(QuestStack questStack)
{
if (!MinecraftForge.EVENT_BUS.post(new MOEventQuest.Added(questStack, player)))
{
if (isServer())
{
if (questData.getActiveQuests().size() <= 0 && questData.getCompletedQuests().size() <= 0)
{
player.inventory.addItemStackToInventory(new ItemStack(MatterOverdriveItems.dataPad));
}
QuestStack addedQuest = questData.addQuest(questStack);
if (addedQuest != null)
{
addedQuest.getQuest().initQuestStack(player.getRNG(), addedQuest, player);
MatterOverdrive.packetPipeline.sendTo(new PacketUpdateQuest(addedQuest, PacketUpdateQuest.ADD_QUEST), (EntityPlayerMP) player);
}
} else
{
QuestStack addedQuest = questData.addQuest(questStack);
MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_QUESTS,GoogleAnalyticsCommon.EVENT_ACTION_QUEST_ACCEPT,addedQuest.getTitle(),player);
ClientProxy.questHud.addStartedQuest(addedQuest);
}
}
}
public void update(Side side)
{
if (side.equals(Side.SERVER))
{
questData.manageQuestCompletion();
}
}
public boolean hasCompletedQuest(QuestStack questStack)
{
return questData.hasCompletedQuest(questStack);
}
public boolean hasQuest(QuestStack questStack)
{
return questData.hasQuest(questStack);
}
public void onQuestCompleted(QuestStack questStack,int index)
{
if (isServer()) {
List<IQuestReward> rewards = new ArrayList<>();
questStack.addRewards(rewards, getPlayer());
int xp = questStack.getXP(getPlayer());
MOEventQuest.Completed event = new MOEventQuest.Completed(questStack, player,xp,rewards);
if (!MinecraftForge.EVENT_BUS.post(event))
{
MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_QUESTS,GoogleAnalyticsCommon.EVENT_ACTION_QUEST_COMPLETE,event.questStack.getTitle(),player);
questData.addQuestToCompleted(questStack);
getPlayer().addExperience(event.xp);
questStack.addRewards(rewards, getPlayer());
InventoryPlayer inventoryPlayer = getPlayer().inventory;
for (IQuestReward reward : rewards)
{
reward.giveReward(questStack,getPlayer());
}
questStack.getQuest().onCompleted(questStack,player);
player.addChatMessage(new ChatComponentText(String.format("[Matter Overdrive] %1$s completed %2$s", player.getDisplayName(), questStack.getTitle(player))));
}
MatterOverdrive.packetPipeline.sendTo(new PacketUpdateQuest(index, questStack, PacketUpdateQuest.COMPLETE_QUEST), (EntityPlayerMP) player);
}else
{
ClientProxy.questHud.addCompletedQuest(questStack);
getQuestData().getCompletedQuests().add(questStack);
getQuestData().removeQuest(index);
if (Minecraft.getMinecraft().currentScreen instanceof GuiDataPad)
{
((GuiDataPad) Minecraft.getMinecraft().currentScreen).refreshQuests(this);
}
}
}
public void onQuestAbandoned(QuestStack questStack)
{
if (isServer())
{
}
else
{
MatterOverdrive.proxy.getGoogleAnalytics().sendEventHit(GoogleAnalyticsCommon.EVENT_CATEGORY_QUESTS,GoogleAnalyticsCommon.EVENT_ACTION_QUEST_ABANDON,questStack.getTitle(),player);
if (Minecraft.getMinecraft().currentScreen instanceof GuiDataPad)
{
((GuiDataPad) Minecraft.getMinecraft().currentScreen).refreshQuests(this);
}
}
}
@SideOnly(Side.CLIENT)
public void updateQuestFromServer(int index, QuestStack questStack)
{
if (index < getQuestData().getActiveQuests().size())
{
ClientProxy.questHud.addObjectivesChanged(getQuestData().getActiveQuests().get(index),questStack);
getQuestData().getActiveQuests().set(index, questStack);
}
}
public boolean isServer()
{
return player != null && !player.worldObj.isRemote;
}
public PlayerQuestData getQuestData()
{
return questData;
}
public void onEvent(Event event)
{
questData.onEvent(event);
}
@Override
public void init(Entity entity, World world)
{
}
public EntityPlayer getPlayer()
{
return player;
}
}