package org.jrenner.fps.event;
import com.badlogic.gdx.math.Vector3;
import com.badlogic.gdx.utils.Array;
import com.badlogic.gdx.utils.GdxRuntimeException;
import org.jrenner.fps.LevelBuilder;
import org.jrenner.fps.Log;
import org.jrenner.fps.Main;
import org.jrenner.fps.Tools;
import org.jrenner.fps.View;
import org.jrenner.fps.effects.BulletHit;
import org.jrenner.fps.entity.DynamicEntity;
import org.jrenner.fps.entity.Entity;
import static org.jrenner.fps.event.ClientEvent.*;
public class ClientEventManager {
private final Array<ClientEvent> eventQueue = new Array<>();
private static final Vector3 tmp = new Vector3();
/** called from the main game thread, not the network thread, should be thread-safe with most game logic operations */
public void process() {
synchronized (eventQueue) {
for (ClientEvent event : eventQueue) {
if (event instanceof AssignPlayerId) {
AssignPlayerId assignPlayer = (AssignPlayerId) event;
Main.inst.client.assignClientPlayerToId(assignPlayer.id);
Log.debug("Player assigned to entity with ID: " + assignPlayer.id);
} else if (event instanceof CreateEntity) {
CreateEntity create = (CreateEntity) event;
DynamicEntity dynEnt = (DynamicEntity) Entity.getEntityById(create.id);
if (dynEnt != null) {
Log.debug("entity already exists, aborting.");
} else {
dynEnt = DynamicEntity.createEntity(create.id, create.isPlayer, create.graphicsType);
Log.debug("created entity: " + dynEnt.id);
}
} else if (event instanceof DestroyEntity) {
DestroyEntity destroy = (DestroyEntity) event;
Entity ent = Entity.getEntityById(destroy.id);
if (ent == null) {
Log.error("couldn't find entity to destroy, id: " + destroy.id);
} else {
ent.destroy();
Log.debug("destroyed entity, id: " + destroy.id);
}
} else if (event instanceof CreateBullet) {
// if this is both client and server, don't duplicate the bullet, it was already created by the server
if (!Main.isServer()) {
CreateBullet cb = (CreateBullet) event;
tmp.set(cb.x, cb.y, cb.z);
Log.debug("create bullet hit: " + Tools.fmt(tmp));
new BulletHit(tmp);
}
} else if (event instanceof ReceivedChatMessage) {
ReceivedChatMessage msg = (ReceivedChatMessage) event;
View.inst.hud.addChatMessage(msg.chat);
} else if (event instanceof CreateLevelStatics) {
LevelBuilder.buildStatics(((CreateLevelStatics) event).staticPieces);
} else {
throw new GdxRuntimeException("unhandled client event: " + event);
}
}
}
eventQueue.clear();
}
public void addEventToQueue(ClientEvent event) {
synchronized (eventQueue) {
eventQueue.add(event);
}
}
}