Rastos
Active member
Are you trolling me or do you really want me to help you?using System;
using System.Linq;
using BloodCloudStudio.Network.Mirror.Utility;
using gta_mirror.Containers;
using gta_mirror.Cores;
using gta_mirror.Events;
using Mirror;
using UnityEngine;
using VContainer;
using VContainer.Unity;
public class NetworkSpawner : AbstractNetworkBehaviour
{
[Inject] private IEventer _eventer;
private IObjectResolver _resolverClient;
private IObjectResolver _resolverServer;
protected override void ClientInit()
{
_resolverClient = LifetimeScope.Find<GameClientDI>().Container;
_eventer.Subscribe<EventNeedNetworkSpawnClient>(SpawnClient);
}
protected override void ServerInit()
{
_resolverServer = LifetimeScope.Find<GameServerDI>().Container;
_eventer.Subscribe<EventNeedNetworkSpawnServer>(SpawnServer);
_eventer.Subscribe<EventNeedNetworkSpawnGeneral>(SpawnGeneral);
}
private void SpawnGeneral(EventNeedNetworkSpawnGeneral eventNeedNetworkSpawnGeneral)
{
var spawnedObj = CreateObj(eventNeedNetworkSpawnGeneral);
if (eventNeedNetworkSpawnGeneral.Owner != null)
{
NetworkUtility.TrySpawn(spawnedObj, eventNeedNetworkSpawnGeneral.Owner);
}
else
{
NetworkUtility.TrySpawn(spawnedObj);
}
_resolverServer.InjectGameObject(spawnedObj);
InitializeObj(spawnedObj);
if (eventNeedNetworkSpawnGeneral.Guid == Guid.Empty)
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj});
}
else
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj, Guid = eventNeedNetworkSpawnGeneral.Guid}, eventNeedNetworkSpawnGeneral.Guid);
}
ClientRPCSpawnGeneral(spawnedObj.GetComponent<NetworkIdentity>(), eventNeedNetworkSpawnGeneral.Guid);
}
[ClientRpc]
private void ClientRPCSpawnGeneral(NetworkIdentity identityObject, Guid guid)
{
return;
_resolverClient.InjectGameObject(identityObject.gameObject);
InitializeObj(identityObject.gameObject);
if (guid == Guid.Empty)
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = identityObject.gameObject});
}
else
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = identityObject.gameObject, Guid = guid}, guid);
}
}
private void SpawnClient(EventNeedNetworkSpawnClient eventNeedNetworkSpawnClient)
{
var spawnedObj = CreateObj(eventNeedNetworkSpawnClient);
_resolverClient.InjectGameObject(spawnedObj);
InitializeObj(spawnedObj);
Debug.Log($"Spawned {spawnedObj.name} Guid = {eventNeedNetworkSpawnClient.Guid}");
if (eventNeedNetworkSpawnClient.Guid == Guid.Empty)
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj});
}
else
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj, Guid = eventNeedNetworkSpawnClient.Guid}, eventNeedNetworkSpawnClient.Guid);
}
}
private void SpawnServer(EventNeedNetworkSpawnServer eventNeedNetworkSpawn)
{
GameObject spawnedObj = CreateObj(eventNeedNetworkSpawn);
_resolverServer.InjectGameObject(spawnedObj);
InitializeObj(spawnedObj);
if (eventNeedNetworkSpawn.Guid == Guid.Empty)
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj});
}
else
{
_eventer.Publish(new EventNetworkSpawned(){ObjectSpawned = spawnedObj, Guid = eventNeedNetworkSpawn.Guid}, eventNeedNetworkSpawn.Guid);
}
}
private GameObject CreateObj(IEventSpawn eventSpawn)
{
if (eventSpawn.Parent)
{
return Instantiate(eventSpawn.Prefab, eventSpawn.Parent);
}
else
{
return Instantiate(eventSpawn.Prefab, eventSpawn.Position, eventSpawn.Rotation);
}
}
private void InitializeObj(GameObject obj)
{
var allMonoBehaviours = obj.GetComponentsInChildren<AbstractMonoBehaviour>()
.OrderByDescending(mb => mb.Priority)
.ToArray();
foreach (var component in allMonoBehaviours)
{
component.TryInit();
}
var allNetworkBehaviours = obj.GetComponentsInChildren<AbstractNetworkBehaviour>();
if (IsServerInit)
{
allNetworkBehaviours = allNetworkBehaviours.OrderByDescending(mb => mb.PriorityServer)
.ToArray();
foreach (var component in allNetworkBehaviours)
{
component.TryServerInit();
}
}
if (IsClientInit)
{
allNetworkBehaviours = allNetworkBehaviours.OrderByDescending(mb => mb.PriorityClient)
.ToArray();
foreach (var component in allNetworkBehaviours)
{
component.TryClientInit();
}
}
}
private void OnDestroy()
{
if (IsServerInit)
{
_eventer.Unsubscribe<EventNeedNetworkSpawnServer>(SpawnServer);
_eventer.Unsubscribe<EventNeedNetworkSpawnGeneral>(SpawnGeneral);
}
else
{
_eventer.Unsubscribe<EventNeedNetworkSpawnClient>(SpawnClient);
}
}
}
Next time, click on More Options and then Code, please.
Okay, add the NetInfo component for now; I've fixed that for the next update.




