/// <summary> /// Recherche l'Actor contrôlant l'entité d'ID args[0] et lui assigne un script EntityController. /// </summary> void SetControlledEntity(object[] args) { BloodAndBileEngine.Debugger.Log("Prise de contrôle de l'entité " + args[0], UnityEngine.Color.magenta); Actor[] actors = UnityEngine.GameObject.FindObjectsOfType <Actor>(); Actor act = null; int i = 0; uint entityID; if (args[0] is string) { uint.TryParse((string)args[0], out entityID); } else { entityID = (uint)args[0]; } while (i < actors.Length && act == null) { if (actors[i].GetControlledEntity().ID == entityID) { act = actors[i]; ControlledEntity = actors[i].GetControlledEntity(); } i++; } if (act != null && act.GetComponent <EntityController>() == null) { act.gameObject.AddComponent <EntityController>(); } }
/// <summary> /// Exécutée dès qu'une entité est instanciée dans ce match. /// </summary> void OnEntitySpawned(BloodAndBileEngine.Entity entity) { entity.RegisterOnEntityDestroyedCallback(OnEntityDestroyed); LivingEntities.Add(entity); // Envoi de la commande aux clients ModuleMatch.SendCommandToPlayers("CreateEntity", entity.ID); }
/// <summary> /// Provoque la destruction de l'entité contrôlée par le joueur. /// </summary> public override void OnPlayerDisconnected(int coID) { BloodAndBileEngine.Entity entity = GetControlledEntity(coID); if (entity != null) { entity.Destroy(); } }
public void SetControlledEntity(int connectionID, BloodAndBileEngine.Entity entity) { BloodAndBileEngine.Debugger.Log("Le joueur " + connectionID + " contrôle désormais l'entité " + entity.ID); bool linkExists = false; foreach (PlayerToEntityLink link in PlayerControlledEntities) { if (link.ConnectionID == connectionID) { link.Entity = entity; linkExists = true; } } if (!linkExists) { BloodAndBileEngine.Debugger.Log("Lien crée..."); PlayerControlledEntities.Add(new PlayerToEntityLink(connectionID, entity)); } }
private void Update() { if (EntityIDInitialized) { BloodAndBileEngine.Entity entity = GetControlledEntity(); Vector3 xzPosition = transform.position; xzPosition.y = 0; Vector3 xzEntityPosition = GetControlledEntity().Position; xzEntityPosition.y = 0; float xzSquareDist = (xzPosition - xzEntityPosition).sqrMagnitude; if (TrackPosition) { // "Lerper" constamment vers la position de l'entité. if ((transform.position - entity.Position).sqrMagnitude < 1) { transform.position = Vector3.Lerp(transform.position, entity.Position, Time.deltaTime * 4); } else { transform.position = Vector3.Lerp(transform.position, entity.Position, Time.deltaTime / 2); } } else if (xzSquareDist > 16) { transform.position = entity.Position; } if (TrackRotation) { transform.rotation = Quaternion.Lerp(transform.rotation, entity.Rotation, Time.deltaTime * 6); } // Toujours appliquer la bonne hauteur à la position de l'entité float height = GetControlledEntity().GetWorldState().GetData <BloodAndBileEngine.WorldState.CellSystem>().GetCellFromPosition(transform.position.z, transform.position.x).GetHeightFrom2DCoordinates(transform.position.z, transform.position.x); transform.Translate(0f, height - transform.position.y, 0f); } if (GetControlledEntity().Destroyed) { ReactToEvent("Death"); Die(); } }
void OnEntityDestroyed(BloodAndBileEngine.Entity entity) { BloodAndBileEngine.Debugger.Log("EntitiesStateModule : Entité " + entity.ID + " détruite !"); LivingEntities.Remove(entity); ModuleMatch.SendCommandToPlayers("KillEntity", entity.ID); PlayerToEntityLink destroyedLink = null; foreach (PlayerToEntityLink link in PlayerControlledEntities) { if (link.Entity == entity) { destroyedLink = link; } } if (destroyedLink != null) { BloodAndBileEngine.Debugger.Log("Destruction de l'entité joueur " + entity.ID, UnityEngine.Color.yellow); PlayerControlledEntities.Remove(destroyedLink); } }
void SpawnPlayers() { //Création des joueurs, placement sur la map, et assignation d'un connexionID pour chaque List <int> usedCells = new List <int>(); foreach (int coId in ModuleMatch.GetPlayerConnectionIDs()) { BloodAndBileEngine.WorldState.Cell cell = ModuleMatch.GetModule <MapStateModule>().GetWorldState().GetData <BloodAndBileEngine.WorldState.CellSystem>().FindSpawnPoint(usedCells.ToArray()); if (cell != null) { usedCells.Add(cell.ID); BloodAndBileEngine.Entity player = SpawnPlayer(coId, cell); SetControlledEntity(coId, player); BloodAndBileEngine.Debugger.Log("Entité joueur d'ID " + player.ID + " associée à la connexion d'ID " + coId); } else { BloodAndBileEngine.Debugger.Log("Aucun point de spawn trouvé !"); } } }
/// <summary> /// Création des entités créées, destruction des entités détruites, /// et synchronisation des autres. /// </summary> /// <param name="stateUpdate"></param> public void OnStateUpdate(BloodAndBileEngine.Networking.Messaging.NetworkMessages.StateUpdateMessage stateUpdate) { // Synchronisation // Chaque EntitySynchronizationDataObject a un identifiant d'entité à synchroniser, il suffit donc // d'appliquer la synchronisation à l'entité en question. BloodAndBileEngine.EntitySynchronizationDataObject[] synchObject = (BloodAndBileEngine.EntitySynchronizationDataObject[])(stateUpdate.GetStateUpdateInfo("EntitySynchronization")[0].Information); if (synchObject == null || synchObject.Length == 0) { BloodAndBileEngine.Debugger.Log("ERREUR : pas de EntitySynchronizationDataObject !", UnityEngine.Color.red); } foreach (BloodAndBileEngine.EntitySynchronizationDataObject SynchData in synchObject) { BloodAndBileEngine.Entity entity = BloodAndBileEngine.EntitiesManager.GetEntityFromID(SynchData.GetEntityID()); BloodAndBileEngine.EntitySynchroniserComponent synchComponent = (BloodAndBileEngine.EntitySynchroniserComponent)entity.GetComponent(typeof(BloodAndBileEngine.EntitySynchroniserComponent)); if (synchComponent != null) { synchComponent.GetSynchronizationData().SetSynchInfoFromSynchObject(SynchData); synchComponent.OnSynch(); } } }
/// <summary> /// Appelée lorsqu'une commande "CreateEntity" a été reçue du serveur. /// </summary> public void OnCreateEntityCommand(params object[] args) { if (args.Length > 0) { uint id; if (!(args[0] is uint)) { if (args[0] is string) { if (!uint.TryParse((string)args[0], out id)) { BloodAndBileEngine.Debugger.Log("ERREUR : l'ID de l'entité à créer n'est pas un nombre !", UnityEngine.Color.red); return; } } else { BloodAndBileEngine.Debugger.Log("ERREUR : l'ID de l'entité à créer doit être de type uint ou string !", UnityEngine.Color.red); return; } } else { id = (uint)args[0]; } // Si on arrive ici, alors id contient une valeur valide. BloodAndBileEngine.Entity entity = EntityFactory.BuildEntity(id, UnityEngine.Vector3.zero, UnityEngine.Quaternion.identity, 1.0f, 1.0f); if (entity != null) { EntityRenderer.OnEntityCreation(id); } } else { BloodAndBileEngine.Debugger.Log("ERREUR : La commande 'CreateEntity' prend un paramètre !", UnityEngine.Color.red); } }
public void OnDestroyEntityCommand(params object[] args) { if (args.Length > 0) { uint id; if (!(args[0] is uint)) { if (args[0] is string) { if (!uint.TryParse((string)args[0], out id)) { BloodAndBileEngine.Debugger.Log("ERREUR : l'ID de l'entité à détruire n'est pas un nombre !", UnityEngine.Color.red); return; } } else { BloodAndBileEngine.Debugger.Log("ERREUR : l'ID de l'entité à détruire doit être de type uint ou string !", UnityEngine.Color.red); return; } } else { id = (uint)args[0]; } // Si on arrive ici, alors id contient une valeur valide. BloodAndBileEngine.Entity entity = BloodAndBileEngine.EntitiesManager.GetEntityFromID(id); entity.Destroy(); } else { BloodAndBileEngine.Debugger.Log("ERREUR : La commande 'DestroyEntity' prend un paramètre !", UnityEngine.Color.red); } }
public BloodAndBileEngine.Entity SpawnPlayer(int playerConnectionID, BloodAndBileEngine.WorldState.Cell cell) { BloodAndBileEngine.Debugger.Log("SpawnPlayer aux coordonnées " + cell.GetPosition()); BloodAndBileEngine.Entity player = EntityFactory.BuildPlayer(cell.GetPosition(), UnityEngine.Quaternion.identity, 0.5f, 2.0f); return(player); }
public PlayerToEntityLink(int coID, BloodAndBileEngine.Entity e) { ConnectionID = coID; Entity = e; }