Renderer/src/main/java/electrosphere/client/scene/ClientSceneWrapper.java

162 lines
5.3 KiB
Java

package electrosphere.client.scene;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.joml.Vector3d;
import org.ode4j.ode.DContactGeom;
import electrosphere.collision.CollisionEngine;
import electrosphere.collision.CollisionEngine.CollisionResolutionCallback;
import electrosphere.collision.collidable.Collidable;
import electrosphere.collision.hitbox.HitboxManager;
import electrosphere.collision.hitbox.HitboxUtils;
import electrosphere.engine.Globals;
import electrosphere.entity.Entity;
import electrosphere.entity.Scene;
import electrosphere.logger.LoggerInterface;
/**
* Wrapper around the scene object to provide lots of much needed client-specific utility
* Does all the server<->client id translation and provides utilities to map between the two
*/
public class ClientSceneWrapper {
//entity id translation between server/client
Map<Integer,Integer> clientToServerIdMap = new ConcurrentHashMap<Integer,Integer>();
Map<Integer,Integer> serverToClientIdMap = new ConcurrentHashMap<Integer,Integer>();
//The scene backing the wrapper
Scene scene;
//The engine used to back physics collision checks in client
CollisionEngine collisionEngine;
//The hitbox manager
HitboxManager hitboxManager;
/**
* Constructor
* @param scene The scene
* @param collisionEngine The collision engine
*/
public ClientSceneWrapper(Scene scene, CollisionEngine collisionEngine){
this.scene = scene;
this.collisionEngine = collisionEngine;
this.hitboxManager = new HitboxManager(resolutionCallback);
}
/**
* Registers a server provided ID as a mapping to a given ID on the client
* @param clientId The client's generated ID
* @param serverId The server's provided ID
*/
public void mapIdToId(int clientId, int serverId){
LoggerInterface.loggerEngine.DEBUG("MapID: " + clientId + " <===> " + serverId);
clientToServerIdMap.put(clientId, serverId);
serverToClientIdMap.put(serverId, clientId);
}
/**
* Resolves a client ID to the equivalent ID on the server
* @param clientId The id provided by the client
* @return The equivalent id on the server
*/
public int mapClientToServerId(int clientId){
return clientToServerIdMap.get(clientId);
}
/**
* Translates the id provided by the server into the equivalent id on the client
* @param serverId The id provided by the server
* @return The equivalent id on the client
*/
public int mapServerToClientId(int serverId){
return serverToClientIdMap.get(serverId);
}
/**
* Checks if the scene wrapper contains the provided server id
* @param serverId The server id
* @return true if the map contains that id, false otherwise
*/
public boolean containsServerId(int serverId){
return serverToClientIdMap.containsKey(serverId);
}
/**
* Returns true if the server->client map contains a given id
* @param id The id to search for
* @return True if the server->client map contains the provided id
*/
public boolean serverToClientMapContainsId(int id){
return serverToClientIdMap.containsKey(id);
}
/**
* Gets the entity provided a server-provided id
* @param id The server-provided ID
* @return The entity in question
*/
public Entity getEntityFromServerId(int id){
return scene.getEntityFromId(mapServerToClientId(id));
}
/**
* Gets the scene backing this client scene wrapper
* @return The scene
*/
public Scene getScene(){
return this.scene;
}
/**
* Gets the collision engine backing the wrapper
* @return
*/
public CollisionEngine getCollisionEngine(){
return collisionEngine;
}
/**
* Gets the hitbox manager for the client
* @return The hitbox manager
*/
public HitboxManager getHitboxManager(){
return hitboxManager;
}
/**
* Destroys all entities outside simulation range
*/
public void destroyEntitiesOutsideSimRange(){
Globals.profiler.beginCpuSample("destroyEntitiesOutsideSimRange");
// if(Globals.drawCellManager != null && Globals.playerEntity != null){
// double cullRadius = Globals.drawCellManager.getDrawRadius() + ServerTerrainChunk.CHUNK_DIMENSION;
// Vector3d playerPosition = EntityUtils.getPosition(Globals.playerEntity);
// List<Entity> entityList = scene.getEntityList();
// for(Entity entity : entityList){
// Vector3d position = EntityUtils.getPosition(entity);
// if(playerPosition.distance(position) > cullRadius){
// EntityUtils.cleanUpEntity(entity);
// }
// }
// }
Globals.profiler.endCpuSample();
}
/**
* The resolution callback that is invoked once a collision has occurred
*/
CollisionResolutionCallback resolutionCallback = new CollisionResolutionCallback() {
@Override
public void resolve(DContactGeom geom, Collidable impactor, Collidable receiver, Vector3d normal, Vector3d localPosition, Vector3d worldPos, float magnitude) {
HitboxUtils.clientDamageHitboxColision(impactor.getParent(), receiver.getParent());
}
};
}