/// <summary>Overridden from <see cref="Engine.EntitySystem.Entity.OnTick()"/>.</summary>
protected override void OnTick()
{
base.OnTick();
//single mode. recreate player units if need
if (EntitySystemWorld.Instance.IsSingle())
{
if (GameMap.Instance.GameType == GameMap.GameTypes.Action ||
GameMap.Instance.GameType == GameMap.GameTypes.TPSArcade ||
GameMap.Instance.GameType == GameMap.GameTypes.TurretDemo)
{
if (PlayerManager.Instance != null)
{
foreach (PlayerManager.ServerOrSingle_Player player in
PlayerManager.Instance.ServerOrSingle_Players)
{
if (player.Intellect == null || player.Intellect.ControlledObject == null)
{
ServerOrSingle_CreatePlayerUnit(player);
}
}
}
}
}
//networking mode
if (EntitySystemWorld.Instance.IsServer())
{
if (GameMap.Instance.GameType == GameMap.GameTypes.Action ||
GameMap.Instance.GameType == GameMap.GameTypes.TPSArcade ||
GameMap.Instance.GameType == GameMap.GameTypes.TurretDemo)
{
if (PlayerManager.Instance != null)
{
UserManagementServerNetworkService userManagementService =
GameNetworkServer.Instance.UserManagementService;
//remove users
again:
foreach (PlayerManager.ServerOrSingle_Player player in
PlayerManager.Instance.ServerOrSingle_Players)
{
if (player.User != null && player.User != userManagementService.ServerUser)
{
NetworkNode.ConnectedNode connectedNode = player.User.ConnectedNode;
if (connectedNode == null ||
connectedNode.Status != NetworkConnectionStatuses.Connected)
{
if (player.Intellect != null)
{
PlayerIntellect playerIntellect = player.Intellect as PlayerIntellect;
if (playerIntellect != null)
{
playerIntellect.TryToRestoreMainControlledUnit();
}
if (player.Intellect.ControlledObject != null)
{
player.Intellect.ControlledObject.Die();
}
player.Intellect.SetShouldDelete();
player.Intellect = null;
}
PlayerManager.Instance.ServerOrSingle_RemovePlayer(player);
goto again;
}
}
}
//add users
foreach (UserManagementServerNetworkService.UserInfo user in
userManagementService.Users)
{
//check whether "EntitySystem" service on the client
if (user.ConnectedNode != null)
{
if (!user.ConnectedNode.RemoteServices.Contains("EntitySystem"))
{
continue;
}
}
PlayerManager.ServerOrSingle_Player player = PlayerManager.Instance.
ServerOrSingle_GetPlayer(user);
if (player == null)
{
player = PlayerManager.Instance.Server_AddClientPlayer(user);
PlayerIntellect intellect = (PlayerIntellect)Entities.Instance.
Create("PlayerIntellect", World.Instance);
intellect.PostCreate();
player.Intellect = intellect;
if (GameNetworkServer.Instance.UserManagementService.ServerUser != user)
{
//player on client
RemoteEntityWorld remoteEntityWorld = GameNetworkServer.Instance.
EntitySystemService.GetRemoteEntityWorld(user);
intellect.Server_SendSetInstanceToClient(remoteEntityWorld);
}
else
{
//player on this server
PlayerIntellect.SetInstance(intellect);
}
}
}
//create units
foreach (PlayerManager.ServerOrSingle_Player player in
PlayerManager.Instance.ServerOrSingle_Players)
{
if (player.Intellect != null && player.Intellect.ControlledObject == null)
{
ServerOrSingle_CreatePlayerUnit(player);
}
}
}
}
}
}