package com.mrcrayfish.furniture.blocks.tv;
import java.lang.reflect.Field;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.mrcrayfish.furniture.util.ReflectionUtil;
import net.minecraft.client.Minecraft;
import net.minecraft.client.audio.PositionedSoundRecord;
import net.minecraft.client.audio.SoundHandler;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.BlockPos;
import net.minecraftforge.fml.common.FMLCommonHandler;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
public class Channel
{
private static Map<BlockPos, PositionedSoundRecord> currentSounds = new ConcurrentHashMap<BlockPos, PositionedSoundRecord>();
private String channelName;
private TextureAtlasSprite atlas = null;
private ResourceLocation sound = null;
private SoundHandler soundHandler = null;
private Field counterField = null;
private static boolean init = false;
public Channel(String channelName)
{
this.channelName = channelName;
if(FMLCommonHandler.instance().getSide() == Side.CLIENT)
{
this.sound = new ResourceLocation("cfm:" + channelName);
this.soundHandler = Minecraft.getMinecraft().getSoundHandler();
}
}
@SideOnly(Side.CLIENT)
private void initRefleciton()
{
if(init)
return;
if (counterField != null)
return;
if (atlas == null)
atlas = Minecraft.getMinecraft().getTextureMapBlocks().getTextureExtry("cfm:blocks/" + channelName);
try {
this.counterField = ReflectionUtil.getField(atlas.getClass(), "frameCounter");
ReflectionUtil.makeAccessible(this.counterField);
} catch (NoSuchFieldException e) {
System.out.println("Unabled to initialized animation resetting for TV");
}
init = true;
}
@SideOnly(Side.CLIENT)
public void play(BlockPos pos) {
resetAnimation();
playSound(pos);
}
@SideOnly(Side.CLIENT)
public void resetAnimation() {
initRefleciton();
if (atlas != null && counterField != null) {
try {
counterField.setInt(atlas, 0);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
@SideOnly(Side.CLIENT)
private void playSound(BlockPos pos)
{
stopSound(pos);
PositionedSoundRecord sound = new PositionedSoundRecord(this.sound, SoundCategory.BLOCKS, (float)pos.getX() + 0.5F, (float)pos.getY() + 0.5F, false, 0, null, (float)pos.getZ() + 0.5F, 0, 0);
currentSounds.put(pos, sound);
soundHandler.playSound(sound);
}
@SideOnly(Side.CLIENT)
private static PositionedSoundRecord getSound(BlockPos soundPos)
{
for(BlockPos currentPos : currentSounds.keySet())
{
if(currentPos.equals(soundPos))
{
return currentSounds.get(currentPos);
}
}
return null;
}
@SideOnly(Side.CLIENT)
public static void stopSound(BlockPos pos)
{
PositionedSoundRecord sound = getSound(pos);
if(sound != null)
{
SoundHandler handler = Minecraft.getMinecraft().getSoundHandler();
if (handler.isSoundPlaying(sound))
{
handler.stopSound(sound);
}
currentSounds.remove(sound);
}
}
}