/** * Handle data received by a client */ public void HandleClientPacket(ClientUpdatePacket packet) { /*foreach (var item in packet.DataPacketIds) * { * Logger.Info(this,$"client to handle {Enum.GetName(typeof(ClientPacketId), item)}"); * }*/ // Execute corresponding packet handlers if (packet.DataPacketIds.Contains(ClientPacketId.PlayerConnect)) { foreach (var playerConnect in packet.PlayerConnect.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerConnect, playerConnect); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerDisconnect)) { foreach (var playerDisconnect in packet.PlayerDisconnect.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerDisconnect, playerDisconnect); } } if (packet.DataPacketIds.Contains(ClientPacketId.ServerShutdown)) { ExecuteClientPacketHandler(ClientPacketId.ServerShutdown, null); } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerEnterScene)) { foreach (var playerEnterScene in packet.PlayerEnterScene.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerEnterScene, playerEnterScene); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerAlreadyInScene)) { ExecuteClientPacketHandler(ClientPacketId.PlayerAlreadyInScene, packet.PlayerAlreadyInScene); } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerLeaveScene)) { foreach (var playerLeaveScene in packet.PlayerLeaveScene.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerLeaveScene, playerLeaveScene); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerUpdate)) { foreach (var playerUpdate in packet.PlayerUpdates.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerUpdate, playerUpdate); } } if (packet.DataPacketIds.Contains(ClientPacketId.EntityUpdate)) { foreach (var entityUpdate in packet.EntityUpdates.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.EntityUpdate, entityUpdate); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerDeath)) { foreach (var playerDeath in packet.PlayerDeath.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerDeath, playerDeath); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerTeamUpdate)) { foreach (var playerTeamUpdate in packet.PlayerTeamUpdate.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerTeamUpdate, playerTeamUpdate); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate)) { foreach (var playerSkinUpdate in packet.PlayerSkinUpdate.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerSkinUpdate, playerSkinUpdate); } } if (packet.DataPacketIds.Contains(ClientPacketId.PlayerEmoteUpdate)) { foreach (var playerEmoteUpdate in packet.PlayerEmoteUpdate.DataInstances) { ExecuteClientPacketHandler(ClientPacketId.PlayerEmoteUpdate, playerEmoteUpdate); } } if (packet.DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated)) { ExecuteClientPacketHandler(ClientPacketId.GameSettingsUpdated, packet.GameSettingsUpdate); } }
// TODO: make sure that resent data does not overwrite newer instance of later sent reliable data public void SetLostReliableData(ClientUpdatePacket lostPacket) { if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerConnect)) { Logger.Info(this, " Resending PlayerConnect data"); DataPacketIds.Add(ClientPacketId.PlayerConnect); PlayerConnect.DataInstances.AddRange(lostPacket.PlayerConnect.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerDisconnect)) { Logger.Info(this, " Resending PlayerDisconnect data"); DataPacketIds.Add(ClientPacketId.PlayerDisconnect); PlayerDisconnect.DataInstances.AddRange(lostPacket.PlayerDisconnect.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerEnterScene)) { Logger.Info(this, " Resending PlayerEnterScene data"); DataPacketIds.Add(ClientPacketId.PlayerEnterScene); PlayerEnterScene.DataInstances.AddRange(lostPacket.PlayerEnterScene.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerAlreadyInScene)) { Logger.Info(this, " Resending PlayerAlreadyInScene data"); DataPacketIds.Add(ClientPacketId.PlayerAlreadyInScene); PlayerAlreadyInScene.PlayerEnterSceneList.AddRange(lostPacket.PlayerAlreadyInScene.PlayerEnterSceneList); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerLeaveScene)) { Logger.Info(this, " Resending PlayerLeaveScene data"); DataPacketIds.Add(ClientPacketId.PlayerLeaveScene); PlayerLeaveScene.DataInstances.AddRange(lostPacket.PlayerLeaveScene.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerDeath)) { Logger.Info(this, " Resending PlayerDeath data"); DataPacketIds.Add(ClientPacketId.PlayerDeath); PlayerDeath.DataInstances.AddRange(lostPacket.PlayerDeath.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerTeamUpdate)) { Logger.Info(this, " Resending PlayerTeamUpdate data"); DataPacketIds.Add(ClientPacketId.PlayerTeamUpdate); PlayerTeamUpdate.DataInstances.AddRange(lostPacket.PlayerTeamUpdate.DataInstances); } if (lostPacket.DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate)) { // Only update if the current packet does not already contain another skin update // since we want the latest update to arrive if (!DataPacketIds.Contains(ClientPacketId.PlayerSkinUpdate)) { Logger.Info(this, " Resending PlayerSkinUpdate data"); DataPacketIds.Add(ClientPacketId.PlayerSkinUpdate); PlayerSkinUpdate.DataInstances.AddRange(lostPacket.PlayerSkinUpdate.DataInstances); } } if (lostPacket.DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated)) { // Only update if the current packet does not already contain another settings update // since we want the latest update to arrive if (!DataPacketIds.Contains(ClientPacketId.GameSettingsUpdated)) { Logger.Info(this, " Resending GameSettingsUpdated data"); DataPacketIds.Add(ClientPacketId.GameSettingsUpdated); GameSettingsUpdate = lostPacket.GameSettingsUpdate; } } }