/*
* 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;
import cpw.mods.fml.relauncher.Side;
import matteroverdrive.MatterOverdrive;
import matteroverdrive.Reference;
import matteroverdrive.api.dialog.IDialogMessage;
import matteroverdrive.api.dialog.IDialogNpc;
import matteroverdrive.api.dialog.IDialogQuestGiver;
import matteroverdrive.api.dialog.IDialogRegistry;
import matteroverdrive.api.quest.QuestStack;
import matteroverdrive.client.render.conversation.DialogShot;
import matteroverdrive.dialog.*;
import matteroverdrive.entity.monster.EntityMutantScientist;
import matteroverdrive.entity.player.AndroidPlayer;
import matteroverdrive.entity.player.MOExtendedProperties;
import matteroverdrive.entity.tasks.EntityAITalkToPlayer;
import matteroverdrive.entity.tasks.EntityAIWatchDialogPlayer;
import matteroverdrive.init.MatterOverdriveDialogs;
import matteroverdrive.init.MatterOverdriveQuests;
import matteroverdrive.network.packet.server.PacketManageConversation;
import matteroverdrive.util.MOStringHelper;
import net.minecraft.entity.EntityAgeable;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.IEntityLivingData;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.ai.attributes.AttributeModifier;
import net.minecraft.entity.passive.EntityVillager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.potion.Potion;
import net.minecraft.potion.PotionEffect;
import net.minecraft.village.MerchantRecipeList;
import net.minecraft.world.World;
/**
* Created by Simeon on 5/30/2015.
*/
public class EntityVillagerMadScientist extends EntityVillager implements IDialogNpc, IDialogQuestGiver
{
private static DialogMessageQuestOnObjectivesCompleted convertMe;
private static DialogMessage canYouConvert;
private static DialogMessage whatDidYouDo;
private static DialogMessage cocktailOfAscension;
public static DialogMessage cocktailOfAscensionComplete;
private EntityPlayer dialogPlayer;
private IDialogMessage startMessage;
public EntityVillagerMadScientist(World world)
{
super(world, 666);
this.tasks.addTask(1,new EntityAITalkToPlayer(this));
this.tasks.addTask(1, new EntityAIWatchDialogPlayer(this));
setJunkie(rand.nextBoolean());
}
@Override
protected void entityInit()
{
super.entityInit();
this.dataWatcher.addObject(13, new Byte((byte) 0));
}
@Override
public IEntityLivingData onSpawnWithEgg(IEntityLivingData data)
{
this.getEntityAttribute(SharedMonsterAttributes.followRange).applyModifier(new AttributeModifier("Random spawn bonus", this.rand.nextGaussian() * 0.05D, 1));
return data;
}
public void writeEntityToNBT(NBTTagCompound nbtTagCompound)
{
super.writeEntityToNBT(nbtTagCompound);
nbtTagCompound.setBoolean("junkie", getJunkie());
}
public void readEntityFromNBT(NBTTagCompound nbtTagCompound)
{
super.readEntityFromNBT(nbtTagCompound);
setJunkie(nbtTagCompound.getBoolean("junkie"));
}
@Override
public EntityVillager createChild(EntityAgeable entity)
{
EntityVillagerMadScientist villager = new EntityVillagerMadScientist(this.worldObj);
villager.onSpawnWithEgg(null);
return villager;
}
@Override
public boolean interact(EntityPlayer player)
{
if (worldObj.isRemote)
{
MatterOverdrive.packetPipeline.sendToServer(new PacketManageConversation(this, true));
return true;
}
return false;
}
public MerchantRecipeList getRecipes(EntityPlayer player)
{
return super.getRecipes(player);
}
//region Dialog Functions
public static void registerDialogMessages(IDialogRegistry registry, Side side)
{
//region Human
convertMe = new DialogMessageQuestOnObjectivesCompleted(new QuestStack(MatterOverdriveQuests.punyHumans),new int[]{0});
registry.registerMessage(convertMe);
convertMe.loadQuestionFromLocalization("dialog.mad_scientist.convert.question");
canYouConvert = new DialogMessageQuestGive(new QuestStack(MatterOverdriveQuests.punyHumans));
registry.registerMessage(canYouConvert);
canYouConvert.loadMessageFromLocalization("dialog.mad_scientist.requirements.line");
canYouConvert.loadQuestionFromLocalization("dialog.mad_scientist.requirements.question");
canYouConvert.addOption(convertMe);
canYouConvert.addOption(MatterOverdriveDialogs.backHomeMessage);
//endregion
//region Android
DialogMessage undo = new DialogMessage();
registry.registerMessage(undo);
undo.loadMessageFromLocalization("dialog.mad_scientist.undo.line");
undo.loadQuestionFromLocalization("dialog.mad_scientist.undo.question");
undo.addOption(MatterOverdriveDialogs.trade);
undo.addOption(MatterOverdriveDialogs.backHomeMessage);
whatDidYouDo = new DialogMessageAndroidOnly();
registry.registerMessage(whatDidYouDo);
whatDidYouDo.loadMessageFromLocalization("dialog.mad_scientist.whatDidYouDo.line");
whatDidYouDo.loadQuestionFromLocalization("dialog.mad_scientist.whatDidYouDo.question");
whatDidYouDo.addOption(undo);
whatDidYouDo.addOption(MatterOverdriveDialogs.backHomeMessage);
//endregion
//region Junkie
DialogMessage acceptCocktail = new DialogMessageQuestGive(new QuestStack(MatterOverdriveQuests.cocktailOfAscension)).setReturnToMain(true).loadQuestionFromLocalization("dialog.mad_scientist.junkie.cocktail_quest.question.accept");
registry.registerMessage(acceptCocktail);
DialogMessage declineCocktail = new DialogMessageBackToMain().loadQuestionFromLocalization("dialog.mad_scientist.junkie.cocktail_quest.question.decline");
registry.registerMessage(declineCocktail);
DialogMessage[] cocktailQuest = MatterOverdrive.dialogFactory.constructMultipleLineDialog(DialogMessageQuestStart.class,"dialog.mad_scientist.junkie.cocktail_quest",8,". . . . . .");
((DialogMessageQuestStart)cocktailQuest[0]).setQuest(new QuestStack(MatterOverdriveQuests.cocktailOfAscension));
cocktailOfAscension = cocktailQuest[0];
DialogMessage lastLine = cocktailQuest[cocktailQuest.length-1];
lastLine.addOption(acceptCocktail);
lastLine.addOption(declineCocktail);
cocktailOfAscensionComplete = new DialogMessageQuestOnObjectivesCompleted(new QuestStack(MatterOverdriveQuests.cocktailOfAscension),new int[]{0,1,2});
cocktailOfAscensionComplete.loadMessageFromLocalization("dialog.mad_scientist.junkie.cocktail_quest.line");
cocktailOfAscensionComplete.loadQuestionFromLocalization("dialog.mad_scientist.junkie.cocktail_quest.complete.question");
DialogMessage areYouOk = new DialogMessageQuit().loadQuestionFromLocalization("dialog.mad_scientist.junkie.cocktail_quest.are_you_ok.question");
cocktailOfAscensionComplete.addOption(areYouOk);
//endregion
if (side == Side.CLIENT)
{
canYouConvert.setShots(DialogShot.closeUp);
undo.setShots(DialogShot.closeUp);
whatDidYouDo.setShots(DialogShot.fromBehindLeftClose);
for (int i = 0;i < cocktailQuest.length;i++)
{
MatterOverdrive.dialogFactory.addRandomShots(cocktailQuest[i]);
}
}
}
@Override
public IDialogMessage getStartDialogMessage(EntityPlayer player)
{
return this.startMessage;
}
@Override
public void setDialogPlayer(EntityPlayer player)
{
dialogPlayer = player;
if (player != null) {
startMessage = assembleStartingMessage(player);
}else
{
startMessage = null;
}
}
private IDialogMessage assembleStartingMessage(EntityPlayer player)
{
if (getJunkie())
{
DialogMessage mainJunkieMessage = new DialogMessageRandom().loadMessageFromLocalization("dialog.mad_scientist.junkie.main.line");
MatterOverdrive.dialogFactory.addOnlyVisibleOptions(player,this,mainJunkieMessage,canYouConvert,MatterOverdriveDialogs.trade,cocktailOfAscension,cocktailOfAscensionComplete,MatterOverdriveDialogs.quitMessage);
return mainJunkieMessage;
}else
{
if (AndroidPlayer.get(player).isAndroid())
{
DialogMessage mainAndroidMessage = new DialogMessageRandom();
mainAndroidMessage.loadMessageFromLocalization("dialog.mad_scientist.main.line.android");
mainAndroidMessage.addOption(whatDidYouDo);
mainAndroidMessage.addOption(MatterOverdriveDialogs.trade);
mainAndroidMessage.addOption(MatterOverdriveDialogs.quitMessage);
return mainAndroidMessage;
}
else
{
DialogMessage mainHumanMessage = new DialogMessageRandom();
mainHumanMessage.loadMessageFromLocalization("dialog.mad_scientist.main.line.human");
mainHumanMessage.addOption(canYouConvert);
mainHumanMessage.addOption(MatterOverdriveDialogs.quitMessage);
return mainHumanMessage;
}
}
}
@Override
public EntityPlayer getDialogPlayer() {
return dialogPlayer;
}
@Override
public boolean canTalkTo(EntityPlayer player)
{
return AndroidPlayer.get(player) == null || !AndroidPlayer.get(player).isTurning();
}
@Override
public EntityLiving getEntity() {
return this;
}
@Override
public void onPlayerInteract(EntityPlayer player,DialogMessage dialogMessage)
{
if (dialogMessage == cocktailOfAscensionComplete)
{
this.addPotionEffect(new PotionEffect(Potion.wither.id,1000,1));
worldObj.playSoundAtEntity(this, Reference.MOD_ID + ":" + "failed_animal_die_0",1,1);
//worldObj.createExplosion(this,posX,posY,posZ,3,false);
this.setDead();
EntityMutantScientist mutantScientist = new EntityMutantScientist(worldObj);
mutantScientist.spawnExplosionParticle();
mutantScientist.setPosition(posX,posY,posZ);
mutantScientist.onSpawnWithEgg(null);
worldObj.spawnEntityInWorld(mutantScientist);
}
else if (dialogMessage == convertMe)
{
MOExtendedProperties extendedProperties = MOExtendedProperties.get(player);
for (QuestStack questStack : extendedProperties.getQuestData().getActiveQuests())
{
if (questStack.getQuest() == MatterOverdriveQuests.punyHumans)
{
questStack.markComplited(player,false);
AndroidPlayer.get(player).startConversion();
}
}
}
}
@Override
public void giveQuest(IDialogMessage message,QuestStack questStack,EntityPlayer entityPlayer)
{
if (questStack != null)
{
MOExtendedProperties extendedProperties = MOExtendedProperties.get(entityPlayer);
if (extendedProperties != null && questStack.getQuest().canBeAccepted(questStack,entityPlayer))
{
QuestStack newQuestStack = questStack.copy();
newQuestStack.setGiver(this);
extendedProperties.addQuest(newQuestStack);
}
}
}
public void setJunkie(boolean junkie)
{
this.dataWatcher.updateObject(13, junkie ? (byte)1 : (byte)0);
if (junkie)
{
this.setCustomNameTag(MOStringHelper.translateToLocal("entity.mad_scientist.junkie.name"));
}
}
public boolean getJunkie()
{
return this.dataWatcher.getWatchableObjectByte(13) == (byte)1;
}
//endregion
}