public static void Process(ulong sender, params object[] args) { //Debug.Log("On Rec Connect Req Response"); //Core.net.OnConnectRequestResponse(sender, (int)args[0], (int)args[1]); int prefabId = (int)args[0]; int networkId = (int)args[1]; int owner = (int)args[2]; int controller = (int)args[3]; NetworkEntity e = Core.net.GetEntity(owner, networkId); //we send this event to an enity from client->entity controller if the client hasn't seen an update in a *while* //essentially the client is asking "what's going on" because they need to either take control, destroy the entity, or do something else. int scopeStatus = 0; if (e == null) { //this client is no longer has this entity. It was probably destroyed because out of scope. scopeStatus = 2; //But since B sent this message, B still cares about the entity, so B should take control of this immediately } else { //float p = e.Priority(sender, e.transform.position.x, e.transform.position.y, e.transform.position.z); float p = e.PriorityCaller(sender, true); if (p <= 0f) { //the sender is no longer getting updates because they are outside of priority (fell out of scope) //they should destroy locally on B, because B shouldn't care about it anymore scopeStatus = 1; } else { //the sender is still in scope, but isn't getting updates. Must mean there is just no data to be sent (static, non-moving entity?) //B should do nothing. Keep their entity around because it's still *important* and in scope. scopeStatus = 0; } } //the only other thing that can happen is if the receiver of this event is already disconnected. in which case this //event will never get processed. So the sender of this event needs to keep a timer (or listen for disconnects) //If the event never comes through B should take control of this entity because they obviously still care about it. Core.net.QueueMessage(sender, Core.net.GetMessageCode("EntityScopeResponse"), prefabId, networkId, owner, controller, scopeStatus); }