This commit is contained in:
2025-06-16 15:24:27 +02:00
commit 83a46b2fc4
1452 changed files with 214261 additions and 0 deletions

133
Assets/Scripts/MyClient.cs Normal file
View File

@ -0,0 +1,133 @@
using Mirror;
using Steamworks;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
[System.Serializable]
public struct PlayerInfoData
{
public string username;
public ulong steamId;
public PlayerInfoData(string username, ulong steamId)
{
this.username = username;
this.steamId = steamId;
}
}
public class MyClient : NetworkBehaviour
{
[SyncVar(hook = nameof(PlayerInfoUpdate))]
public PlayerInfoData playerInfo;
[SyncVar(hook = nameof(IsReadyUpdate))]
public bool IsReady;
[Header("Controller")]
[SerializeField] private GameObject controllerObj;
[SerializeField] private GameObject meshObj;
[SerializeField] private GameObject camHolder;
[SerializeField] private Behaviour[] controllerComponents;
public Sprite icon { get; private set; }
public CharacterSkinElement characterInstance { get; set; }
#region Steam PFP
protected Callback<AvatarImageLoaded_t> avatarImageLoaded;
private void OnAvatarImageLoaded(AvatarImageLoaded_t callback)
{
Debug.Log("Avatar loaded " + callback.m_steamID);
if (callback.m_steamID.m_SteamID != playerInfo.steamId) return;
SetIcon(callback.m_steamID);
}
void SetIcon(CSteamID steamId)
{
Texture2D tex = SteamHelper.GetAvatar(steamId);
if (tex)
icon = SteamHelper.ConvertTextureToSprite(tex);
}
#endregion
private void Start()
{
((MyNetworkManager)NetworkManager.singleton).allClients.Add(this);
if(CharacterSkinHandler.instance) CharacterSkinHandler.instance.SpawnCharacterMesh(this);
avatarImageLoaded = Callback<AvatarImageLoaded_t>.Create(OnAvatarImageLoaded);
if (SceneManager.GetActiveScene().name != "MainMenu")
{
ToggleController(true);
}
else
{
ToggleController(false);
}
}
void ToggleController(bool value)
{
controllerObj.SetActive(value);
meshObj.SetActive(value ? !isLocalPlayer : false);
camHolder.SetActive(value ? isLocalPlayer : false);
if (!isLocalPlayer)
value = false;
foreach (var component in controllerComponents)
{
component.enabled = value;
}
GetComponent<CharacterController>().enabled = value;
}
#region Ready Up
public void ToggleReady() => Cmd_ToggleReady();
[Command]
private void Cmd_ToggleReady()
{
IsReady = !IsReady;
}
#endregion
#region SyncVar Hooks
private void PlayerInfoUpdate(PlayerInfoData _, PlayerInfoData data)
{
if (characterInstance)
characterInstance.Initialize(this, IsReady);
SetIcon(new CSteamID(data.steamId));
}
public void IsReadyUpdate(bool _, bool value)
{
if (characterInstance)
characterInstance.Initialize(this, value);
if (isLocalPlayer)
{
MainMenu.instance.UpdateReadyButton(value);
}
}
#endregion
private void OnDestroy()
{
if (this && ((MyNetworkManager)NetworkManager.singleton))
((MyNetworkManager)NetworkManager.singleton).allClients.Remove(this);
if (characterInstance && !isLocalPlayer)
{
CharacterSkinHandler.instance.DestroyCharacterMesh(this);
}
}
}