/*
* spotless:off
* KubaTech - Gregtech Addon
* Copyright (C) 2022 - 2024 kuba6000
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library. If not, see .
* spotless:on
*/
package kubatech.loaders.item.items;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
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.item.EnumAction;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.stats.Achievement;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.AchievementPage;
import kubatech.api.utils.ModUtils;
import kubatech.loaders.ItemLoader;
import kubatech.loaders.item.ItemProxy;
public class ItemTeaCollection extends ItemProxy {
protected static TeaPage teapage;
protected static LinkedList achievements;
protected Achievement achievement;
private final String achievementname;
public ItemTeaCollection(String unlocalizedName) {
super("teacollection." + unlocalizedName, "tea/" + unlocalizedName);
achievementname = "teacollection." + unlocalizedName;
}
private static final int[][] achievement_poses = new int[][] { { 0, 0 }, { 2, 0 }, { 3, 1 }, { 4, 2 }, { 4, 4 },
{ 3, 5 }, { 2, 6 }, { 0, 6 }, { -1, 5 }, { -2, 4 }, { -2, 2 }, { -1, 1 }, { 1, 3 } };
boolean checkTeaOwner(ItemStack stack, UUID player) {
NBTTagCompound tag = stack.stackTagCompound;
if (tag == null || !stack.stackTagCompound.hasKey("TeaOwnerUUID")) return true;
return stack.stackTagCompound.getString("TeaOwnerUUID")
.equals(player.toString());
}
boolean checkTeaOwner(ItemStack stack, String player) {
NBTTagCompound tag = stack.stackTagCompound;
if (tag == null || !stack.stackTagCompound.hasKey("TeaOwner")) return true;
return stack.stackTagCompound.getString("TeaOwner")
.equals(player);
}
private boolean checkOrSetTeaOwner(ItemStack stack, EntityPlayer player) {
NBTTagCompound tag = stack.stackTagCompound;
if (tag == null || !stack.stackTagCompound.hasKey("TeaOwnerUUID")) {
stack.setTagInfo(
"TeaOwnerUUID",
new NBTTagString(
player.getPersistentID()
.toString()));
stack.setTagInfo("TeaOwner", new NBTTagString(player.getCommandSenderName()));
return true;
}
if (stack.stackTagCompound.getString("TeaOwnerUUID")
.equals(
player.getPersistentID()
.toString())) {
stack.setTagInfo("TeaOwner", new NBTTagString(player.getCommandSenderName()));
return true;
} else return false;
}
@Override
public void ItemInit(int index) {
super.ItemInit(index);
if (teapage == null) {
teapage = new TeaPage();
AchievementPage.registerAchievementPage(teapage);
achievements = teapage.getAchievementsOriginal();
}
achievements.add(
achievement = new Achievement(
achievementname,
achievementname,
achievement_poses[index][0],
achievement_poses[index][1],
new ItemStack(ItemLoader.kubaitems, 1, index),
null).registerStat());
}
@Override
public void addInformation(ItemStack stack, EntityPlayer entity, List tooltipList, boolean showDebugInfo) {
if (!checkTeaOwner(stack, entity.getCommandSenderName())) {
tooltipList.add(
EnumChatFormatting.GRAY.toString() + EnumChatFormatting.BOLD
+ EnumChatFormatting.ITALIC
+ StatCollector.translateToLocal("kubaitem.notyours"));
return;
}
tooltipList.add(EnumChatFormatting.GRAY + StatCollector.translateToLocal("kubaitem.fromcollection"));
tooltipList.add(
EnumChatFormatting.GRAY.toString() + EnumChatFormatting.BOLD
+ EnumChatFormatting.ITALIC
+ EnumChatFormatting.UNDERLINE
+ StatCollector.translateToLocal("kubaitem.teacollection"));
}
@Override
public EnumAction getItemUseAction(ItemStack stack) {
return EnumAction.drink;
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer entity) {
if (!checkTeaOwner(stack, entity.getCommandSenderName())) return stack;
entity.setItemInUse(stack, 32);
return stack;
}
@Override
public ItemStack onEaten(ItemStack stack, World world, EntityPlayer entity) {
if (world.isRemote) return stack;
if (!(entity instanceof EntityPlayerMP)) return stack;
entity.addChatComponentMessage(
new ChatComponentText(
EnumChatFormatting.GREEN + StatCollector.translateToLocal("kubaitem.teacollection.mmm")));
entity.triggerAchievement(achievement);
return stack;
}
@Override
public int getMaxItemUseDuration() {
return 32;
}
@Override
public String getDisplayName(ItemStack stack) {
if (!ModUtils.isClientSided || Minecraft.getMinecraft().thePlayer == null) {
return super.getDisplayName(stack);
}
// UUID is different on client if in offline mode I think
if (checkTeaOwner(stack, Minecraft.getMinecraft().thePlayer.getCommandSenderName())) {
return super.getDisplayName(stack);
}
return EnumChatFormatting.GOLD.toString() + EnumChatFormatting.BOLD + EnumChatFormatting.ITALIC + "???????";
}
@Override
public void onUpdate(ItemStack stack, World world, Entity entity, int slot, boolean isCurrentItem) {
if (world.isRemote) return;
if (!(entity instanceof EntityPlayerMP)) return;
checkOrSetTeaOwner(stack, (EntityPlayer) entity);
NBTTagCompound tag = stack.stackTagCompound;
if (tag.hasKey("display")) tag.removeTag("display");
}
private static class TeaPage extends AchievementPage {
public TeaPage() {
super("Tea");
}
final LinkedList unlockedAchievements = new LinkedList<>();
@Override
public List getAchievements() {
if (!ModUtils.isClientSided) return super.getAchievements();
if (new Throwable().getStackTrace()[1].getMethodName()
.equals("isAchievementInPages")) return super.getAchievements(); // 5HEAD FIX
unlockedAchievements.clear();
for (Achievement achievement : achievements) if (Minecraft.getMinecraft().thePlayer.getStatFileWriter()
.hasAchievementUnlocked(achievement)) unlockedAchievements.add(achievement);
return unlockedAchievements;
}
private LinkedList getAchievementsOriginal() {
return (LinkedList) super.getAchievements();
}
}
}