package org.jrenner.fps.net.packages; import com.badlogic.gdx.utils.GdxRuntimeException; import com.badlogic.gdx.utils.Pool; import org.jrenner.fps.Log; import org.jrenner.fps.Main; import org.jrenner.fps.utils.Pooler; import org.jrenner.fps.entity.Entity; /** Contains game state information that is sent over the net from Server to Client */ public class ServerUpdate implements Pool.Poolable { public int tickNum; public int playerInputTick; // the last input processed from the player who will receive this update public EntityUpdate[] entityUpdates; private boolean processed; public static ServerUpdate createServerUpdate() { ServerUpdate serverUpdate = Pooler.serverUpdate(); synchronized (Entity.list) { serverUpdate.tickNum = Main.inst.server.tickNum; serverUpdate.entityUpdates = new EntityUpdate[Entity.list.size]; for (int i = 0; i < Entity.list.size; i++) { Entity ent = Entity.list.get(i); EntityUpdate entUpd = Pooler.entityUpdate(); entUpd.setEntityId(ent.id); entUpd.setPosition(ent.getPosition()); entUpd.setRotation(ent.getYaw(), ent.getPitch(), ent.getRoll()); serverUpdate.entityUpdates[i] = entUpd; } } return serverUpdate; } public void free() { for (EntityUpdate entUpd : entityUpdates) { Pooler.free(entUpd); } Pooler.free(this); } public void applyUpdates() { if (processed) throw new GdxRuntimeException("serverUpdate already processed"); for (EntityUpdate entUpdate : entityUpdates) { Entity ent = Entity.getEntityById(entUpdate.getEntityId()); if (ent != null) { if (Main.inst.client.player == null && ent.id == Main.inst.client.playerId) { Main.inst.client.assignClientPlayerToId(ent.id); Log.debug("Entity matched player id, entity was assigned to player: " + ent.id); } ent.interpolator.handleUpdateFromServer(entUpdate, playerInputTick); } } processed = true; free(); } @Override public void reset() { entityUpdates = null; processed = false; } }