Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert player intialization refactor #789

Merged
merged 1 commit into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
224 changes: 210 additions & 14 deletions Assets/Scripts/Control&Input/Peer2PeerTransport.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,6 @@ public struct PlayerDetails
public string body;
public string barrel;
public string extension;

public string PlayerNameWithIndex()
{
var mySteamID = steamID;
if (Peer2PeerTransport.PlayerDetails.Count(p => p.steamID == mySteamID) > 1)
return $"{name} {localInputID + 1}";
return name;
}
}

public struct PlayerConnectedMessage : NetworkMessage
Expand Down Expand Up @@ -143,6 +135,8 @@ public class Peer2PeerTransport : NetworkManager
private const int AIFPSPlayerPrefabIndex = 2;
private const int TrainingPlayerPrefabIndex = 4;

private const int NetworkPlayerLayer = 3;

private PlayerFactory playerFactory;
private static Transform[] spawnPoints;
private static Stack<Transform> spawnPointStack;
Expand Down Expand Up @@ -707,8 +701,8 @@ private IEnumerator SendSpawnRequestsAfterSceneLoad(string originalSceneName)

#endregion

#region Spawn FPS players

#region Spawn players

private void SpawnPlayer(NetworkConnectionToClient connection, SpawnPlayerMessage message, int prefabIndexOffset = 0)
{
Expand Down Expand Up @@ -760,22 +754,161 @@ private void OnSpawnFPSPlayer(NetworkConnectionToClient connection, SpawnPlayerM

private void InitializeFPSPlayer(InitializePlayerMessage message)
{
StartCoroutine(WaitAndInitializePlayer(message, false));
StartCoroutine(WaitAndInitializeFPSPlayer(message));
}

// TODO move this somewhere else?
public static string PlayerNameWithIndex(PlayerDetails playerDetails)
{
var playerName = playerDetails.name;
if (players.Values.Count(p => p.steamID == playerDetails.steamID) > 1)
playerName = $"{playerName} {playerDetails.localInputID + 1}";
return playerName;
}

private void UpdateIdentityFromDetails(PlayerIdentity identity, PlayerDetails playerDetails)
{
identity.UpdateFromDetails(playerDetails, PlayerNameWithIndex(playerDetails));
}

private IEnumerator WaitAndInitializeFPSPlayer(InitializePlayerMessage message)
{
// Wait until player object is spawned
PlayerManager player = null;
while (player == null)
{
player = FindObjectsOfType<PlayerManager>()
.FirstOrDefault(p => p.id == message.id);
yield return null;
}

if (!player)
{
Debug.LogError($"Could not find player object for id {message.id}");
yield break;
}

if (!players.TryGetValue(message.id, out var playerDetails))
{
Debug.LogError($"Could not find player details for id {message.id}");
yield break;
}

var playerManager = player.GetComponent<PlayerManager>();

player.transform.position = message.position;
player.transform.rotation = message.rotation;

var cameraOffset = player.transform.Find("CameraOffset");
playerManager.GetComponent<AmmoBoxCollector>().enabled = true;

if (playerDetails.type is PlayerType.Local)
{
Debug.Log($"Spawning local player {playerDetails.id}");
var input = PlayerInputManagerController.Singleton.LocalPlayerInputs[playerDetails.localInputID];

// Reset camera transform (it may have been kerfluffled by the spectator cam thingy)
input.transform.localPosition = Vector3.zero;
input.transform.localRotation = Quaternion.identity;
input.PlayerCamera.transform.localRotation = Quaternion.identity;
input.PlayerCamera.transform.localPosition = Vector3.zero;

// Make playerInput child of player it's attached to
input.transform.parent = player.transform;
// Set received playerInput (and most importantly its camera) at an offset from player's position
input.transform.localPosition = cameraOffset.localPosition;
input.transform.rotation = player.transform.rotation;

// Enable Camera
input.PlayerCamera.enabled = true;
input.PlayerCamera.orthographic = false;

playerManager.HUDController.gameObject.SetActive(true);
var movement = player.GetComponent<PlayerMovement>();

// The identity sits on the input in this case, so edit that
var identity = input.GetComponent<PlayerIdentity>();
UpdateIdentityFromDetails(identity, playerDetails);

// Update player's movement script with which playerInput it should attach listeners to
playerManager.SetPlayerInput(input);
var gunHolder = input.transform.GetChild(0);
playerManager.SetGun(gunHolder);

// Set unique layer for player
playerManager.SetLayer(input.playerInput.playerIndex);
movement.SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad);

if (GunFactory.TryGetGunAchievement(playerManager.identity.Body, playerManager.identity.Barrel,
playerManager.identity.Extension, out var achievement))
SteamManager.Singleton.UnlockAchievement(achievement);
}
else if (playerDetails.type is PlayerType.AI && NetworkServer.active)
{
Debug.Log($"Spawning AI player {playerDetails.id}");
AIManager manager = player.GetComponent<AIManager>();
manager.SetLayer(NetworkPlayerLayer);
UpdateIdentityFromDetails(playerManager.identity, playerDetails);
manager.SetIdentity(playerManager.identity);
manager.GetComponent<AIMovement>().SetInitialRotation(message.rotation.eulerAngles.y * Mathf.Deg2Rad);
}
else
{
Debug.Log($"Spawning network player {playerDetails.id}");

UpdateIdentityFromDetails(playerManager.identity, playerDetails);

// TODO do some other version of disabling HUD completely
Destroy(playerManager.HUDController);

// Disable physics
playerManager.GetComponent<Rigidbody>().isKinematic = true;

// Create display gun structure
var gunHolderParent = new GameObject("DisplayGunParent").transform;
gunHolderParent.parent = player.transform;
gunHolderParent.position = cameraOffset.position;
gunHolderParent.rotation = player.transform.rotation;
var gunHolder = new GameObject("DisplayGunHolder").transform;
gunHolder.parent = gunHolderParent.transform;
gunHolder.localPosition = Vector3.zero;
gunHolder.localRotation = Quaternion.identity;
playerManager.SetLayer(NetworkPlayerLayer);
// Can't initialize quite like the AIs because of where the GunController network behaviour is located :(
playerManager.SetGun(gunHolder);
}

playerManager.ApplyIdentity();

// This ensures that behaviours on the gun have identities.
// SHOULD be safe to initialize them here as this is at roughly the same point on all clients
player.GetComponent<NetworkIdentity>().InitializeNetworkBehaviours();

if (MatchController.Singleton)
{
MatchController.Singleton.RegisterPlayer(playerManager);
}

playerInstances[player.id] = player;
}

#endregion

#region Bidding spawning

private void OnSpawnBiddingPlayer(NetworkConnectionToClient connection, SpawnPlayerMessage message)
{
SpawnPlayer(connection, message, BiddingPlayerPrefabIndexOffset);
}

private void InitializeBiddingPlayer(InitializePlayerMessage message)
{
StartCoroutine(WaitAndInitializePlayer(message, true));
StartCoroutine(WaitAndInitializeBiddingPlayer(message));
}

private IEnumerator WaitAndInitializePlayer(InitializePlayerMessage message, bool isBidding = false)
private IEnumerator WaitAndInitializeBiddingPlayer(InitializePlayerMessage message)
{
// Wait until player object is spawned
// Wait until players must've been spawned
PlayerManager player = null;
while (player == null)
{
Expand All @@ -796,7 +929,70 @@ private IEnumerator WaitAndInitializePlayer(InitializePlayerMessage message, boo
yield break;
}

PlayerFactory.InitializePlayer(message, player, playerDetails, isBidding);
var playerManager = player.GetComponent<PlayerManager>();

player.transform.position = message.position;
player.transform.rotation = message.rotation;

var cameraOffset = player.transform.Find("CameraOffset");
playerManager.GetComponent<AmmoBoxCollector>().enabled = true;

if (playerDetails.type is PlayerType.Local)
{
Debug.Log($"Spawning local player {playerDetails.id}");
var input = PlayerInputManagerController.Singleton.LocalPlayerInputs[playerDetails.localInputID];

// Reset camera transform (ensuring we don't mess up in weapon building)
input.transform.localPosition = Vector3.zero;
input.transform.localRotation = Quaternion.identity;
input.PlayerCamera.transform.localRotation = Quaternion.identity;
input.PlayerCamera.transform.localPosition = Vector3.zero;

// Make playerInput child of player it's attached to
input.transform.parent = player.transform;
// Set received playerInput (and most importantly its camera) at an offset from player's position
input.transform.localPosition = cameraOffset.localPosition;
input.transform.rotation = player.transform.rotation;

// Disable Camera
input.PlayerCamera.enabled = false;

// Update player's movement script with which playerInput it should attach listeners to
playerManager.SetPlayerInput(input);
player.GetComponent<HealthController>().enabled = false;

// The identity sits on the input in this case, so edit that
var identity = input.GetComponent<PlayerIdentity>();
UpdateIdentityFromDetails(identity, playerDetails);
}
else if (playerDetails.type is PlayerType.AI && NetworkServer.active)
{
Debug.Log($"Spawning AI player {playerDetails.id}");
AIManager manager = player.GetComponent<AIManager>();
manager.SetLayer(NetworkPlayerLayer);
UpdateIdentityFromDetails(playerManager.identity, playerDetails);
manager.SetIdentity(manager.identity);
}
else
{
Debug.Log($"Spawning network player {playerDetails.id}");

UpdateIdentityFromDetails(playerManager.identity, playerDetails);

// Disable physics
playerManager.GetComponent<Rigidbody>().isKinematic = true;
}

playerManager.ApplyIdentity();

// This ensures that behaviours on the gun have identities.
// SHOULD be safe to initialize them here as this is at roughly the same point on all clients
player.GetComponent<NetworkIdentity>().InitializeNetworkBehaviours();

if (MatchController.Singleton)
{
MatchController.Singleton.RegisterPlayer(playerManager);
}

playerInstances[player.id] = player;
}
Expand Down
Loading