package hunternif.mc.atlas.marker;
import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.PlayerEvent.PlayerLoggedInEvent;
import net.minecraftforge.fml.common.network.FMLNetworkEvent.ClientConnectedToServerEvent;
/**
* Handles the world-saved data with global markers.
* <p>
* When in single player, this instance is shared between the client and the
* server, so the packet-based synchronization becomes redundant.
* </p>
* <p>
* When connecting to a remote server, data has to be reset, see
* {@link #onClientConnectedToServer(ClientConnectedToServerEvent)}
* </p>
* @author Hunternif
*/
public class GlobalMarkersDataHandler {
private static final String DATA_KEY = "aAtlasGlobalMarkers";
private GlobalMarkersData data;
@SubscribeEvent(priority=EventPriority.HIGHEST)
public void onWorldLoad(WorldEvent.Load event) {
if (!event.getWorld().isRemote && event.getWorld().provider.getDimension() == 0) {
data = (GlobalMarkersData) event.getWorld().loadData(GlobalMarkersData.class, DATA_KEY);
if (data == null) {
data = new GlobalMarkersData(DATA_KEY);
data.markDirty();
event.getWorld().setData(DATA_KEY, data);
}
}
}
/**
* This method sets {@link #data} to null when the client connects to a
* remote server. It is required in order that global markers data is not
* transferred from a previous world the client visited.
* <p>
* Using a "connect" event instead of "disconnect" because according to a
* form post, the latter event isn't actually fired on the client.
* </p>
*/
@SubscribeEvent
public void onClientConnectedToServer(ClientConnectedToServerEvent event) {
if (!event.isLocal()) { // make sure it's not an integrated server
data = null;
}
}
public GlobalMarkersData getData() {
if (data == null) { // This will happen on the client
data = new GlobalMarkersData(DATA_KEY);
}
return data;
}
/** Synchronizes global markers with the connecting client. */
@SubscribeEvent
public void onPlayerLogin(PlayerLoggedInEvent event) {
data.syncOnPlayer(event.player);
}
}