/**
* 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.terminal;
import cn.academy.terminal.event.AppInstalledEvent;
import cn.academy.terminal.event.TerminalInstalledEvent;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.s11n.SerializeIncluded;
import cn.lambdalib.s11n.nbt.NBTS11n;
import cn.lambdalib.s11n.network.NetworkMessage;
import cn.lambdalib.s11n.network.NetworkMessage.Listener;
import cn.lambdalib.util.datapart.DataPart;
import cn.lambdalib.util.datapart.EntityData;
import cn.lambdalib.util.datapart.RegDataPart;
import cpw.mods.fml.relauncher.Side;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.MinecraftForge;
import java.util.BitSet;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author WeAthFolD
*/
@Registrant
@RegDataPart(EntityPlayer.class)
public class TerminalData extends DataPart<EntityPlayer> {
public static TerminalData get(EntityPlayer player) {
return EntityData.get(player).getPart(TerminalData.class);
}
@SerializeIncluded
private BitSet installedList = new BitSet();
@SerializeIncluded
private boolean isInstalled;
public TerminalData() {
setClientNeedSync();
setNBTStorage();
}
public List<App> getInstalledApps() {
return AppRegistry.enumeration().stream().filter(this::isInstalled).collect(Collectors.toList());
}
public boolean isInstalled(App app) {
return app.isPreInstalled() || installedList.get(app.getID());
}
public boolean isTerminalInstalled() {
return isInstalled;
}
/**
* Server only. Installs the data terminal.
*/
public void install() {
checkSide(Side.SERVER);
if (!isInstalled) {
isInstalled = true;
sync();
informTerminalInstall();
NetworkMessage.sendTo(getEntity(), this, "terminal_inst");
}
}
/**
* Server only. Installs the given app.
*/
public void installApp(App app) {
checkSide(Side.SERVER);
if (!isInstalled(app)) {
int id = app.getID();
installedList.set(id, true);
sync();
informAppInstall(id);
NetworkMessage.sendTo(getEntity(), this, "app_inst", id);
}
}
@Override
public void fromNBT(NBTTagCompound tag) {
NBTS11n.read(tag, this);
}
@Override
public void toNBT(NBTTagCompound tag) {
NBTS11n.write(tag, this);
}
@Listener(channel="terminal_inst", side=Side.CLIENT)
private void informTerminalInstall() {
MinecraftForge.EVENT_BUS.post(new TerminalInstalledEvent(getEntity()));
}
@Listener(channel="app_inst", side=Side.CLIENT)
private void informAppInstall(int appid) {
MinecraftForge.EVENT_BUS.post(new AppInstalledEvent(getEntity(), AppRegistry.enumeration().get(appid)));
}
}