/**
* 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.energy.internal;
import cn.academy.core.AcademyCraft;
import cn.academy.energy.api.block.IWirelessGenerator;
import cn.academy.energy.api.block.IWirelessReceiver;
import cn.academy.energy.api.event.WirelessUserEvent.UserType;
import cn.academy.energy.api.event.node.LinkUserEvent;
import cn.academy.energy.api.event.node.UnlinkUserEvent;
import cn.academy.energy.api.event.wen.*;
import cn.academy.energy.internal.VBlocks.VNGenerator;
import cn.academy.energy.internal.VBlocks.VNReceiver;
import cn.academy.energy.internal.VBlocks.VWNode;
import cn.lambdalib.annoreg.core.Registrant;
import cn.lambdalib.annoreg.mc.RegEventHandler;
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.gameevent.TickEvent.Phase;
import cpw.mods.fml.common.gameevent.TickEvent.ServerTickEvent;
import net.minecraft.server.MinecraftServer;
import net.minecraft.world.WorldServer;
/**
* @author WeAthFolD
*
*/
@Registrant
public class WirelessSystem {
@RegEventHandler
public static WirelessSystem INSTANCE = new WirelessSystem();
private WirelessSystem() {}
@SubscribeEvent
public void onServerTick(ServerTickEvent event) {
if (event.phase == Phase.START)
return;
for(WorldServer ws : MinecraftServer.getServer().worldServers) {
WiWorldData data = WiWorldData.getNonCreate(ws);
if(data != null) {
data.tick();
}
}
}
@SubscribeEvent
public void onCreateNet(CreateNetworkEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
if(!data.createNetwork(event.mat, event.ssid, event.pwd)) {
event.setCanceled(true);
}
}
@SubscribeEvent
public void onDestroyNet(DestroyNetworkEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
WirelessNet net = data.getNetwork(event.mat);
if(net != null) net.dispose();
}
@SubscribeEvent
public void changePass(ChangePassEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
WirelessNet net = data.getNetwork(event.mat);
if(net == null || !net.resetPassword(event.pwd)) {
event.setCanceled(true);
}
}
@SubscribeEvent
public void linkNode(LinkNodeEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
WirelessNet net = data.getNetwork(event.matrix);
if(net == null || !net.addNode(new VWNode(event.node), event.pwd))
event.setCanceled(true);
}
@SubscribeEvent
public void unlinkNode(UnlinkNodeEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
WirelessNet net = data.getNetwork(event.node);
if(net != null)
net.removeNode(new VWNode(event.node));
}
@SubscribeEvent
public void linkUser(LinkUserEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
NodeConn conn = data.getNodeConnection(event.node);
if (event.needAuth) {
if (!event.node.getPassword().equals(event.password)) {
event.setCanceled(true);
return;
}
}
if(event.type == UserType.GENERATOR) {
if(!conn.addGenerator(new VNGenerator(event.getAsGenerator())))
event.setCanceled(true);
} else { //RECEIVER
if(!conn.addReceiver(new VNReceiver(event.getAsReceiver())))
event.setCanceled(true);
}
}
@SubscribeEvent
public void unlinkUser(UnlinkUserEvent event) {
WiWorldData data = WiWorldData.get(event.getWorld());
if(event.type == UserType.GENERATOR) {
IWirelessGenerator gen = event.getAsGenerator();
NodeConn conn = data.getNodeConnection(gen);
if(conn != null) conn.removeGenerator(new VNGenerator(gen));
} else { //RECEIVER
IWirelessReceiver rec = event.getAsReceiver();
NodeConn conn = data.getNodeConnection(rec);
if(conn != null) conn.removeReceiver(new VNReceiver(rec));
}
}
}