Made the stuff networked

main
Hazim Bin Ijaz 1 month ago
parent 0bd0070054
commit 1afc48072e

@ -1084,6 +1084,7 @@ GameObject:
serializedVersion: 6 serializedVersion: 6
m_Component: m_Component:
- component: {fileID: 396364068} - component: {fileID: 396364068}
- component: {fileID: 396364069}
- component: {fileID: 396364067} - component: {fileID: 396364067}
m_Layer: 0 m_Layer: 0
m_Name: CrowManager m_Name: CrowManager
@ -1119,6 +1120,27 @@ Transform:
m_Children: [] m_Children: []
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!114 &396364069
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 396364066}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2177239848
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &451210155 --- !u!1 &451210155
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -8575,11 +8597,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.w propertyPath: m_LocalRotation.w
value: 0.8529446 value: 0.85294455
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0.39434478 value: 0.3943448
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
@ -8587,7 +8609,7 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734515771252668, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.14352977 value: -0.14352979
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516302391364, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516302391364, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_UpdateMethod propertyPath: m_UpdateMethod
@ -8619,11 +8641,11 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.3097298 value: 0.30972984
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516695783279, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.14506969 value: -0.1450697
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3} - target: {fileID: 1676734516724634599, guid: 0193228de87741d40a42e561901c9083, type: 3}
propertyPath: m_LocalPosition.z propertyPath: m_LocalPosition.z
@ -8736,15 +8758,15 @@ PrefabInstance:
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.x propertyPath: m_LocalRotation.x
value: 0.3943448 value: 0.39434484
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.y propertyPath: m_LocalRotation.y
value: 0.31044644 value: 0.3104465
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalRotation.z propertyPath: m_LocalRotation.z
value: -0.14352976 value: -0.1435298
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3} - target: {fileID: 203267159508449512, guid: 36b3ee75677a1544191c0ddaaadd8140, type: 3}
propertyPath: m_LocalEulerAnglesHint.x propertyPath: m_LocalEulerAnglesHint.x

@ -137,6 +137,7 @@ GameObject:
- component: {fileID: 240007730} - component: {fileID: 240007730}
- component: {fileID: 240007734} - component: {fileID: 240007734}
- component: {fileID: 240007733} - component: {fileID: 240007733}
- component: {fileID: 240007735}
m_Layer: 12 m_Layer: 12
m_Name: P (6) m_Name: P (6)
m_TagString: Untagged m_TagString: Untagged
@ -263,6 +264,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &240007735
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 240007728}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2651067327
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &286165426 --- !u!1 &286165426
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -273,6 +295,7 @@ GameObject:
m_Component: m_Component:
- component: {fileID: 286165427} - component: {fileID: 286165427}
- component: {fileID: 286165428} - component: {fileID: 286165428}
- component: {fileID: 286165429}
m_Layer: 0 m_Layer: 0
m_Name: Platforms m_Name: Platforms
m_TagString: Untagged m_TagString: Untagged
@ -314,6 +337,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: d9e826abe81bf7a4b88597fe93add614, type: 3} m_Script: {fileID: 11500000, guid: d9e826abe81bf7a4b88597fe93add614, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &286165429
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 286165426}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 635359751
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &676920371 --- !u!1 &676920371
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -328,6 +372,7 @@ GameObject:
- component: {fileID: 676920373} - component: {fileID: 676920373}
- component: {fileID: 676920377} - component: {fileID: 676920377}
- component: {fileID: 676920376} - component: {fileID: 676920376}
- component: {fileID: 676920378}
m_Layer: 12 m_Layer: 12
m_Name: P (2) m_Name: P (2)
m_TagString: Untagged m_TagString: Untagged
@ -454,6 +499,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &676920378
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 676920371}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2844845740
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &849256358 --- !u!1 &849256358
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -468,6 +534,7 @@ GameObject:
- component: {fileID: 849256360} - component: {fileID: 849256360}
- component: {fileID: 849256364} - component: {fileID: 849256364}
- component: {fileID: 849256363} - component: {fileID: 849256363}
- component: {fileID: 849256365}
m_Layer: 12 m_Layer: 12
m_Name: P (4) m_Name: P (4)
m_TagString: Untagged m_TagString: Untagged
@ -594,6 +661,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &849256365
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 849256358}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2133187149
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &949745746 --- !u!1 &949745746
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -726,6 +814,7 @@ GameObject:
- component: {fileID: 997499841} - component: {fileID: 997499841}
- component: {fileID: 997499845} - component: {fileID: 997499845}
- component: {fileID: 997499844} - component: {fileID: 997499844}
- component: {fileID: 997499846}
m_Layer: 12 m_Layer: 12
m_Name: P (7) m_Name: P (7)
m_TagString: Untagged m_TagString: Untagged
@ -852,6 +941,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &997499846
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 997499839}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 2541096383
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &1146060681 --- !u!1 &1146060681
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -866,6 +976,7 @@ GameObject:
- component: {fileID: 1146060683} - component: {fileID: 1146060683}
- component: {fileID: 1146060687} - component: {fileID: 1146060687}
- component: {fileID: 1146060686} - component: {fileID: 1146060686}
- component: {fileID: 1146060688}
m_Layer: 12 m_Layer: 12
m_Name: P (1) m_Name: P (1)
m_TagString: Untagged m_TagString: Untagged
@ -992,6 +1103,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &1146060688
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1146060681}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 4024356049
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &1415641637 --- !u!1 &1415641637
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1112,6 +1244,7 @@ GameObject:
- component: {fileID: 1463337824} - component: {fileID: 1463337824}
- component: {fileID: 1463337828} - component: {fileID: 1463337828}
- component: {fileID: 1463337827} - component: {fileID: 1463337827}
- component: {fileID: 1463337829}
m_Layer: 12 m_Layer: 12
m_Name: P (3) m_Name: P (3)
m_TagString: Untagged m_TagString: Untagged
@ -1238,6 +1371,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &1463337829
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1463337822}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 3652105053
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &1620155724 --- !u!1 &1620155724
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1252,6 +1406,7 @@ GameObject:
- component: {fileID: 1620155726} - component: {fileID: 1620155726}
- component: {fileID: 1620155730} - component: {fileID: 1620155730}
- component: {fileID: 1620155729} - component: {fileID: 1620155729}
- component: {fileID: 1620155731}
m_Layer: 12 m_Layer: 12
m_Name: P (5) m_Name: P (5)
m_TagString: Untagged m_TagString: Untagged
@ -1378,6 +1533,27 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3} m_Script: {fileID: 11500000, guid: fbadb65558c0b1a48b58b765317ed874, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
--- !u!114 &1620155731
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1620155724}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
m_Name:
m_EditorClassIdentifier:
GlobalObjectIdHash: 3970869814
InScenePlacedSourceGlobalObjectIdHash: 0
AlwaysReplicateAsRoot: 0
SynchronizeTransform: 1
ActiveSceneSynchronization: 0
SceneMigrationSynchronization: 1
SpawnWithObservers: 1
DontDestroyWithOwner: 0
AutoObjectParentSync: 1
--- !u!1 &2085312385 --- !u!1 &2085312385
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

@ -2,8 +2,9 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using Unity.BossRoom.Gameplay.GameplayObjects.Character; using Unity.BossRoom.Gameplay.GameplayObjects.Character;
using UnityEngine; using UnityEngine;
using Unity.Netcode;
public class CrowManager : MonoBehaviour public class CrowManager : NetworkBehaviour
{ {
public static CrowManager Instance { get; private set; } public static CrowManager Instance { get; private set; }
@ -21,17 +22,34 @@ public class CrowManager : MonoBehaviour
Instance = this; Instance = this;
} }
private void Start() public override void OnNetworkSpawn()
{ {
// players = FindObjectsOfType<ServerCharacter>().ToList(); if (!IsServer)
{
enabled = false; // Disable CrowManager on clients
return;
}
} }
private void Update() private void Update()
{ {
if (!IsServer) return; // Ensure logic only runs on the server
DetermineCrow(); DetermineCrow();
} }
/// <summary>
/// Populates the players list from active ServerCharacters in the scene.
/// </summary>
private void PopulatePlayersList()
{
players.Clear();
players = FindObjectsOfType<ServerCharacter>().ToList();
Debug.Log("CrowManager: Players list populated.");
}
/// <summary>
/// Determines which player should be the crow.
/// </summary>
private void DetermineCrow() private void DetermineCrow()
{ {
int unoccupiedPlayers = 0; int unoccupiedPlayers = 0;
@ -46,33 +64,40 @@ public class CrowManager : MonoBehaviour
} }
} }
// If exactly one player is not on a platform, assign as crow
if (unoccupiedPlayers == 1) if (unoccupiedPlayers == 1)
{ {
AssignCrow(potentialCrow); AssignCrow(potentialCrow);
} }
else if (unoccupiedPlayers == 0 && currentCrow != null) else if (unoccupiedPlayers == 0 && currentCrow != null)
{ {
// All players are on platforms, clear crow
ClearCrow(); ClearCrow();
} }
} }
/// <summary>
/// Assigns a player as the Crow.
/// </summary>
/// <param name="player">The ServerCharacter to assign as Crow.</param>
private void AssignCrow(ServerCharacter player) private void AssignCrow(ServerCharacter player)
{ {
if (currentCrow == player) return; // Already the crow if (currentCrow == player) return;
if (currentCrow != null) if (currentCrow != null)
{ {
// Clear old crow currentCrow.SetAsCrow(false); // Clear old crow
currentCrow.SetAsCrow(false);
} }
currentCrow = player; currentCrow = player;
currentCrow.SetAsCrow(true); currentCrow.SetAsCrow(true);
Debug.Log($"{currentCrow.name} is now the Crow."); Debug.Log($"{currentCrow.name} is now the Crow.");
// Notify all clients about the new crow
NotifyCrowChangeClientRpc(currentCrow.OwnerClientId);
} }
/// <summary>
/// Clears the current Crow if no player is unoccupied.
/// </summary>
private void ClearCrow() private void ClearCrow()
{ {
if (currentCrow != null) if (currentCrow != null)
@ -80,17 +105,80 @@ public class CrowManager : MonoBehaviour
currentCrow.SetAsCrow(false); currentCrow.SetAsCrow(false);
Debug.Log($"{currentCrow.name} is no longer the Crow."); Debug.Log($"{currentCrow.name} is no longer the Crow.");
currentCrow = null; currentCrow = null;
// Notify all clients about the crow being cleared
NotifyCrowChangeClientRpc(0); // 0 indicates no crow
}
}
/// <summary>
/// RPC to notify clients about the Crow change.
/// </summary>
/// <param name="crowClientId">The Client ID of the new crow, or 0 if no crow.</param>
[Rpc(SendTo.Everyone)]
private void NotifyCrowChangeClientRpc(ulong crowClientId)
{
foreach (var player in players)
{
if (player.OwnerClientId == crowClientId)
{
player.SetAsCrow(true);
currentCrow = player;
Debug.Log($"Client: {player.name} is the new Crow.");
}
else
{
player.SetAsCrow(false);
}
} }
} }
/// <summary>
/// Adds a character to the players list.
/// </summary>
/// <param name="character">The ServerCharacter to add.</param>
public void AddCharacterToList(ServerCharacter character) public void AddCharacterToList(ServerCharacter character)
{ {
players.Add(character); if (!players.Contains(character))
{
players.Add(character);
Debug.Log($"Player {character.name} added to CrowManager.");
}
} }
/// <summary>
/// Removes a character from the players list.
/// </summary>
/// <param name="character">The ServerCharacter to remove.</param>
public void RemoveCharacterFromList(ServerCharacter character) public void RemoveCharacterFromList(ServerCharacter character)
{ {
players.Remove(character); if (players.Contains(character))
{
players.Remove(character);
Debug.Log($"Player {character.name} removed from CrowManager.");
}
}
/// <summary>
/// Ensures the players list is updated when a player is spawned or despawned.
/// </summary>
/// <param name="character">The ServerCharacter to track.</param>
public void OnPlayerSpawned(ServerCharacter character)
{
AddCharacterToList(character);
}
public void OnPlayerDespawned(ServerCharacter character)
{
RemoveCharacterFromList(character);
}
/// <summary>
/// Retrieves the current Crow.
/// </summary>
/// <returns>The current Crow player.</returns>
public ServerCharacter GetCurrentCrow()
{
return currentCrow;
} }
} }

@ -155,6 +155,9 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
NetHealthState = GetComponent<NetworkHealthState>(); NetHealthState = GetComponent<NetworkHealthState>();
m_State = GetComponent<NetworkAvatarGuidState>(); m_State = GetComponent<NetworkAvatarGuidState>();
} }
//Hazim
[Rpc(SendTo.Everyone)] [Rpc(SendTo.Everyone)]
private void ShowSwapConfirmationPanelClientRpc() private void ShowSwapConfirmationPanelClientRpc()
{ {
@ -172,9 +175,6 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
} }
} }
} }
//Hazim
public void SetAsCrow(bool status) public void SetAsCrow(bool status)
{ {
IsCrow = status; IsCrow = status;
@ -206,27 +206,6 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
IsOnAPlatform = status; IsOnAPlatform = status;
} }
// private void OnTriggerEnter(Collider other)
// {
// if (TargetPlatformId == null) return;
//
// if (other.TryGetComponent(out Platform platform) && platform.PlatformID == TargetPlatformId)
// {
// if (platform.IsOccupied && platform.Occupier != this)
// {
// Debug.Log($"Platform {platform.PlatformID} was occupied. Now looking for others");
// // Platform is occupied, handle intervention
// // HandleOccupiedPlatform(platform);
// }
// else
// {
// // Occupy the platform
// Debug.Log($"Platform {platform.PlatformID} is being occupied");
// platform.Occupy(this);
// ClearTargetPlatform();
// }
// }
// }
private void HandleOccupiedPlatform(Platform currentPlatform) private void HandleOccupiedPlatform(Platform currentPlatform)
{ {
@ -319,10 +298,10 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
public override void OnNetworkSpawn() public override void OnNetworkSpawn()
{ {
CrowManager.Instance.OnPlayerSpawned(this);
if (!IsServer) { enabled = false; } if (!IsServer) { enabled = false; }
else else
{ {
CrowManager.Instance.AddCharacterToList(this);
NetLifeState.LifeState.OnValueChanged += OnLifeStateChanged; NetLifeState.LifeState.OnValueChanged += OnLifeStateChanged;
m_DamageReceiver.DamageReceived += ReceiveHP; m_DamageReceiver.DamageReceived += ReceiveHP;
m_DamageReceiver.CollisionEntered += CollisionEntered; m_DamageReceiver.CollisionEntered += CollisionEntered;
@ -343,8 +322,8 @@ namespace Unity.BossRoom.Gameplay.GameplayObjects.Character
public override void OnNetworkDespawn() public override void OnNetworkDespawn()
{ {
CrowManager.Instance.OnPlayerDespawned(this);
NetLifeState.LifeState.OnValueChanged -= OnLifeStateChanged; NetLifeState.LifeState.OnValueChanged -= OnLifeStateChanged;
CrowManager.Instance.RemoveCharacterFromList(this);
if (m_DamageReceiver) if (m_DamageReceiver)
{ {
m_DamageReceiver.DamageReceived -= ReceiveHP; m_DamageReceiver.DamageReceived -= ReceiveHP;

@ -1,16 +1,16 @@
using Unity.BossRoom.Gameplay.GameplayObjects.Character; using Unity.BossRoom.Gameplay.GameplayObjects.Character;
using Unity.Netcode;
using UnityEngine; using UnityEngine;
namespace Unity.Multiplayer.Samples.BossRoom namespace Unity.Multiplayer.Samples.BossRoom
{ {
[RequireComponent(typeof(Collider))] [RequireComponent(typeof(Collider))]
public class Platform : MonoBehaviour public class Platform : NetworkBehaviour
{ {
public int PlatformID { get; private set; } public int PlatformID { get; private set; }
public bool IsOccupied => Occupier != null; public bool IsOccupied => OccupierId.Value != 0;
public ServerCharacter Occupier { get; private set; }
private NetworkVariable<ulong> OccupierId = new NetworkVariable<ulong>(0, NetworkVariableReadPermission.Everyone, NetworkVariableWritePermission.Server);
private Collider m_PlatformCollider; private Collider m_PlatformCollider;
private void Awake() private void Awake()
@ -23,64 +23,83 @@ namespace Unity.Multiplayer.Samples.BossRoom
} }
} }
/// <summary>
/// Sets the unique ID for the platform.
/// </summary>
/// <param name="id">The unique ID to assign.</param>
public void AssignID(int id) public void AssignID(int id)
{ {
PlatformID = id; PlatformID = id;
Debug.Log($"Platform {name} assigned ID: {PlatformID}"); Debug.Log($"Platform {name} assigned ID: {PlatformID}");
} }
/// <summary>
/// Marks this platform as occupied by a specific player.
/// </summary>
/// <param name="player">The ServerCharacter occupying the platform.</param>
public void Occupy(ServerCharacter player) public void Occupy(ServerCharacter player)
{ {
if (!IsServer)
{
Debug.LogError("Occupy can only be called on the server.");
return;
}
if (IsOccupied) if (IsOccupied)
{ {
Debug.LogWarning($"Platform {name} is already occupied by {Occupier.name}."); Debug.LogWarning($"Platform {PlatformID} is already occupied.");
return; return;
} }
Occupier = player; OccupierId.Value = player.OwnerClientId;
Debug.Log($"{player.name} has occupied Platform {name}."); player.SetOnPlatform(true);
Debug.Log($"Platform {PlatformID} is now occupied by Player {player.OwnerClientId}.");
} }
/// <summary> public void Vacate(ServerCharacter player)
/// Clears the occupation of this platform.
/// </summary>
public void Vacate()
{ {
if (!IsOccupied) if (!IsServer)
{
Debug.LogError("Vacate can only be called on the server.");
return;
}
if (!IsOccupied || OccupierId.Value != player.OwnerClientId)
{ {
Debug.LogWarning($"Platform {name} is not currently occupied."); Debug.LogWarning($"Platform {PlatformID} is not occupied by Player {player.OwnerClientId}.");
return; return;
} }
Debug.Log($"{Occupier.name} has vacated Platform {name}."); OccupierId.Value = 0;
Occupier = null; player.SetOnPlatform(false);
Debug.Log($"Platform {PlatformID} is now vacated.");
} }
private void OnTriggerEnter(Collider other) private void OnTriggerEnter(Collider other)
{ {
if (!IsOccupied && other.TryGetComponent<ServerCharacter>(out var player)) if (!IsServer) return;
if (other.TryGetComponent<ServerCharacter>(out var player))
{ {
Occupy(player); if (!IsOccupied)
player.OnArrivalOnPlatform(); {
// Debug.Log($"{player.name} has entered Platform {name}."); Occupy(player);
player.OnArrivalOnPlatform();
}
else
{
Debug.Log($"Player {player.OwnerClientId} attempted to occupy an already occupied Platform {PlatformID}.");
}
} }
} }
public ulong GetOccupierId()
{
return OccupierId.Value;
}
private void OnTriggerExit(Collider other) private void OnTriggerExit(Collider other)
{ {
if (IsOccupied && other.TryGetComponent<ServerCharacter>(out var player) && player == Occupier) if (!IsServer) return;
if (other.TryGetComponent<ServerCharacter>(out var player) && OccupierId.Value == player.OwnerClientId)
{ {
Vacate(); Vacate(player);
player.OnLeavingPlatform(); player.OnLeavingPlatform();
Debug.Log($"{player.name} has exited Platform {name}.");
} }
} }
} }

@ -1,14 +1,14 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Unity.BossRoom.Gameplay.GameplayObjects.Character; using Unity.BossRoom.Gameplay.GameplayObjects.Character;
using Unity.Netcode;
using UnityEngine; using UnityEngine;
namespace Unity.Multiplayer.Samples.BossRoom namespace Unity.Multiplayer.Samples.BossRoom
{ {
public class PlatformManager : MonoBehaviour public class PlatformManager : NetworkBehaviour
{ {
public static PlatformManager Instance = null; public static PlatformManager Instance;
private List<Platform> m_Platforms; private List<Platform> m_Platforms;
private void Awake() private void Awake()
@ -16,25 +16,37 @@ namespace Unity.Multiplayer.Samples.BossRoom
if (Instance != null && Instance != this) if (Instance != null && Instance != this)
{ {
Destroy(gameObject); Destroy(gameObject);
} else { }
else
{
Instance = this; Instance = this;
} }
} }
private void Start() private void Start()
{ {
m_Platforms = GetComponentsInChildren<Platform>().ToList(); if (IsServer) // Ensure only the server assigns IDs and initializes
// Assign unique IDs to each platform
for (int i = 0; i < m_Platforms.Count; i++)
{ {
m_Platforms[i].AssignID(i + 1); // IDs start from 1 m_Platforms = GetComponentsInChildren<Platform>().ToList();
}
// Assign unique IDs to each platform
for (int i = 0; i < m_Platforms.Count; i++)
{
m_Platforms[i].AssignID(i + 1); // IDs start from 1
}
Debug.Log("All platforms have been assigned unique IDs."); Debug.Log("All platforms have been assigned unique IDs.");
}
} }
public Platform FindNearestUnoccupiedPlatform(Vector3 position) public Platform FindNearestUnoccupiedPlatform(Vector3 position)
{ {
if (!IsServer)
{
Debug.LogError("FindNearestUnoccupiedPlatform should only be called on the server.");
return null;
}
return m_Platforms return m_Platforms
.Where(platform => !platform.IsOccupied) .Where(platform => !platform.IsOccupied)
.OrderBy(platform => Vector3.Distance(position, platform.transform.position)) .OrderBy(platform => Vector3.Distance(position, platform.transform.position))
@ -45,15 +57,15 @@ namespace Unity.Multiplayer.Samples.BossRoom
{ {
return m_Platforms.All(platform => platform.IsOccupied); return m_Platforms.All(platform => platform.IsOccupied);
} }
/// <summary>
/// Finds an unoccupied platform and assigns the player to it.
/// </summary>
/// <param name="player">The ServerCharacter to assign.</param>
/// <returns>True if successfully assigned, false otherwise.</returns>
public bool AssignPlayerToPlatform(ServerCharacter player) public bool AssignPlayerToPlatform(ServerCharacter player)
{ {
if (!IsServer)
{
Debug.LogError("AssignPlayerToPlatform should only be called on the server.");
return false;
}
var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied); var platform = m_Platforms.FirstOrDefault(p => !p.IsOccupied);
if (platform != null) if (platform != null)
{ {
@ -65,26 +77,16 @@ namespace Unity.Multiplayer.Samples.BossRoom
return false; return false;
} }
/// <summary>
/// Finds the platform currently occupied by the given player.
/// </summary>
/// <param name="player">The ServerCharacter to search for.</param>
/// <returns>The platform occupied by the player, or null if not found.</returns>
public Platform GetPlatformOccupiedByPlayer(ServerCharacter player) public Platform GetPlatformOccupiedByPlayer(ServerCharacter player)
{ {
return m_Platforms.FirstOrDefault(p => p.Occupier == player); return m_Platforms.FirstOrDefault(p => p.IsOccupied && p.GetOccupierId() == player.OwnerClientId);
} }
/// <summary>
/// Checks if a specific platform is occupied.
/// </summary>
/// <param name="platform">The platform to check.</param>
/// <returns>True if the platform is occupied, false otherwise.</returns>
public bool IsPlatformOccupied(Platform platform) public bool IsPlatformOccupied(Platform platform)
{ {
return platform.IsOccupied; return platform.IsOccupied;
} }
public Vector3 GetPlatformPosition(int platformId) public Vector3 GetPlatformPosition(int platformId)
{ {
var platform = m_Platforms.FirstOrDefault(p => p.PlatformID == platformId); var platform = m_Platforms.FirstOrDefault(p => p.PlatformID == platformId);
@ -95,7 +97,5 @@ namespace Unity.Multiplayer.Samples.BossRoom
{ {
return m_Platforms.FirstOrDefault(p => p.PlatformID == platformId); return m_Platforms.FirstOrDefault(p => p.PlatformID == platformId);
} }
} }
} }

Loading…
Cancel
Save