• Opsive has been nominated for TWO Unity Awards: Publisher of the Year and Best Development Tool (Behavior Designer Pro)! Your support means everything, cast your vote here: https://awards.unity.com/vote

Many Errors

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);
}


}
}
Are you trolling me or do you really want me to help you?
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.
 
Are you trolling me or do you really want me to help you?
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.
Sorry, I just haven't used forums like this before so I didn't know about this feature.
 
Sorry, I just haven't used forums like this before so I didn't know about this feature.
I'd be happy to help you, but if you change all my code, it's normal that you'll get errors.

Is this the player you spawn like that?
Doesn't work you need to use NetworkUtility.TryAddPlayerForConnection().
 
Я был бы рад вам помочь, но если вы измените весь мой код, вполне нормально, что вы получите ошибки.

Это тот игрок, которого ты создаешь таким образом?
Не работает, нужно использовать NetworkUtility.TryAddPlayerForConnection().
I'm not creating a custom player, I'm adding a car, it's just like a general class for spawn
 
Found a problem with the fact that pinging or interpolation is bad if the server is not a host but a dedicated one. On Client
 
Found a problem with the fact that pinging or interpolation is bad if the server is not a host but a dedicated one. On Client
Go to simulation manager bridge and change the remote interpolation multiplier.
I'll test this but go to discord to participate in debugging.

=> You speak to dedicated server or just server only?
=> Are you sure you are on server authoritative model?
=> Are you on v0.8.3?
 
Last edited:
Are you sure you have this version?

v0.8.3 (Published)​

  • Fixed remote interpolations
  • Added compressed vector3 direction
  • Fixed remote impacts
  • Added network agent run boolean
  • Fixed remote and owner network animator
  • Fixed remote and owner moving platform
 
Вы уверены, что у вас именно эта версия?

v0.8.3 (Опубликовано)​

  • Исправлены удаленные интерполяции
  • Добавлено сжатое направление vector3
  • Фиксированные удаленные воздействия
  • Добавлен сетевой агент запускает логическое значение
  • Исправлен удаленный и сетевой аниматор владельца
  • Стационарная удаленная и перемещаемая платформа владельца
yes
 
=> You speak to dedicated server or just server only?
=> Are you sure you are on server authoritative model?
=> Are you on v0.8.3?
I was talking about serveronly (but in the future I wanted to do it on a dedicated server). Where to configure server authoritative model? Yes, I'm on version 0.8.3.
 
I was talking about serveronly (but in the future I wanted to do it on a dedicated server). Where to configure server authoritative model? Yes, I'm on version 0.8.3.
There is no problem on this side, how much did you set the send rate in the network manager?
It's written in the demo: in AuthorityManager.cs on the NetworkManager GO.
 
Found a problem with the fact that pinging or interpolation is bad if the server is not a host but a dedicated one. On Client
Ah well it was simply the authoritative model, sorry I didn't read it properly.

Client Authoritative Model => Host (Cannot be Server Only)
Server Authoritative Model => Server Only (Can be Host for Test)
 
Last edited:
Hello, discovered more bugs.
1) When a player aims at the targeting (host at least) and connecting client at this time, the client crashes and says that it can not target anyone aim
2) When a player sits in the car (Rccp package) (host at least) and connecting client, it crashes and says it can not sit in the car
3) When aim is enabled by default (as an ability, without aiming), enemy ai looks normal, but if you give Enemy Tag to a player, the one who is aiming starts wobbling the camera.
Capture d'écran 2025-07-16 162136.png
Capture d'écran 2025-07-16 162150.png

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);
}


}
}
Capture d'écran 2025-07-16 162050.png
Capture d'écran 2025-07-16 162119.png
Capture d'écran 2025-07-16 162854.png
 
Back
Top