/**
* Copyright (c) Lambda Innovation, 2013-2016
* This file is part of the AcademyCraft mod.
* https://github.com/LambdaInnovation/AcademyCraft
* Licensed under GPLv3, see project root for more information.
*/
package cn.academy.vanilla.electromaster.item;
import cn.academy.core.item.ACItem;
import cn.academy.vanilla.electromaster.client.renderer.RendererCoinThrowing;
import cn.academy.vanilla.electromaster.entity.EntityCoinThrowing;
import cn.academy.vanilla.electromaster.event.CoinThrowEvent;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegItem;
import cn.lambdalib.util.mc.StackUtils;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.PlayerTickEvent;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
import net.minecraftforge.common.MinecraftForge;
import java.util.HashMap;
import java.util.Map;
/**
*
* @author KSkun
*/
@Registrant
public class ItemCoin extends ACItem {
@RegItem.Render
@SideOnly(Side.CLIENT)
public static RendererCoinThrowing.ItemRender renderCoin;
// Key: PlayerName
static Map<String, EntityCoinThrowing> client = new HashMap(), server = new HashMap();
public ItemCoin() {
super("coin");
setTextureName("academy:coin_front");
FMLCommonHandler.instance().bus().register(this);
}
@SubscribeEvent
public void onPlayerTick(PlayerTickEvent event) {
EntityPlayer player = event.player;
Map<String, EntityCoinThrowing> map = getMap(player);
EntityCoinThrowing etc = getPlayerCoin(player);
if(etc != null) {
if(etc.isDead ||
etc.worldObj.provider.dimensionId != player.worldObj.provider.dimensionId) {
map.remove(player.getCommandSenderName());
}
}
}
@Override
public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
if(getPlayerCoin(player) != null) {
return stack;
}
//Spawn at both side, not syncing for render effect purpose
EntityCoinThrowing etc = new EntityCoinThrowing(player, stack);
world.spawnEntityInWorld(etc);
player.playSound("academy:entity.flipcoin", 0.5F, 1.0F);
setPlayerCoin(player, etc);
MinecraftForge.EVENT_BUS.post(new CoinThrowEvent(player, etc));
if(!player.capabilities.isCreativeMode) {
--stack.stackSize;
}
return stack;
}
public static EntityCoinThrowing getPlayerCoin(EntityPlayer player) {
EntityCoinThrowing etc = getMap(player).get(player.getCommandSenderName());
if(etc != null && !etc.isDead)
return etc;
return null;
}
public static void setPlayerCoin(EntityPlayer player, EntityCoinThrowing etc) {
Map<String, EntityCoinThrowing> map = getMap(player);
map.put(player.getCommandSenderName(), etc);
}
private static Map<String, EntityCoinThrowing> getMap(EntityPlayer player) {
return player.worldObj.isRemote ? client : server;
}
}