/// <summary> /// A player interacts to a networked object. /// </summary> /// <param name="value">Incoming message</param> private void OnInteract(string[] value) { Interactor.Interact readMessage = SNet_Network.SNetMessage.ReadMessage <Interactor.Interact>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { // sender interacts the item. SNet_Identity sender = null; if (SNet_Identity.find(readMessage.s, out sender)) { switch (id.gameObject.tag) { case "Item": // Loot weapon or something Item item = id.GetComponent <Item>(); if (item != null && sender.controller != null) { Item.PlayerItem pi = sender.controller.GetComponent <PlayerInventory>().inv.l.Find(x => x.prefabName == item.item.prefabName); if (pi != null && pi.maxammo <= pi.ammo) { return; // Maximum ammo reached. } item.item.looter = sender.controller.GetComponent <SNet_Identity>().identity; SNet_Network.instance.Send_Message(item.item); Destroy(item.gameObject); } break; case "Vehicle": // Get into a vehicle SNet_Vehicle vehicle = id.GetComponent <SNet_Vehicle>(); int vIndex = vehicle.vehicle.p.FindIndex(x => x == sender.identity); if (vIndex != -1) { vehicle.vehicle.p [vIndex] = 0; vehicle.VehicleUpdate(); return; } vIndex = vehicle.vehicle.p.FindIndex(x => x == 0); // Empty seat if (!sender.controller.isDead && vIndex != -1 && !vehicle.vehicle.p.Contains(sender.identity)) { vehicle.vehicle.p[vIndex] = sender.identity; vehicle.VehicleUpdate(); } break; } } } }
/// <summary> /// Spawn lootable item on world. /// </summary> /// <param name="value">Incoming message</param> private void OnSpawn_Item(string[] value) { SNet_Network.Spawn_Item readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Network.Spawn_Item>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; // Only the host can send this } SNet_Identity go = null; if (SNet_Identity.find(readMessage.i, out go)) { if (readMessage.a > 0) { go.GetComponent <Item>().item.ammo = readMessage.a; } // Already have that identity. return; } Transform prefab = ResourcesLoader.prefabs.Find(x => x.name == readMessage.b); prefab = Instantiate(prefab, readMessage.p, readMessage.r); if (readMessage.c != Vector3.zero) { prefab.localScale = readMessage.c; } SNet_Identity identity = prefab.GetComponent <SNet_Identity>(); identity.Set(readMessage.i, readMessage.b); if (readMessage.a > 0) // or it has default ammo { identity.GetComponent <Item>().item.ammo = readMessage.a; } Collider cldr = prefab.GetComponent <Collider>(); if (cldr != null) { cldr.enabled = true; } Rigidbody rb = prefab.GetComponent <Rigidbody>(); if (rb != null) { rb.isKinematic = false; } DestroyIn dIn = prefab.GetComponent <DestroyIn>(); if (dIn != null) { dIn.enabled = true; } }
/// <summary> /// Something spawned on world. /// </summary> /// <param name="value">Incoming message</param> private void OnSpawn(string[] value) { SNet_Network.Spawn readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Network.Spawn>(value[0]); readMessage.s = ulong.Parse(value[1]); if (GameMap.instance == null || !SNet_Network.instance.isHost(readMessage.s)) { return; } SNet_Identity go = null; if (SNet_Identity.find(readMessage.i, out go)) { // Already have that identity. return; } Transform prefab = ResourcesLoader.prefabs.Find(x => x.name == readMessage.b); if (prefab == null) { Debug.Log("Null spawn prefab: " + readMessage.b); return; } string pName = prefab.name; prefab = Instantiate(prefab, readMessage.p, (readMessage.r != Quaternion.identity) ? readMessage.r : prefab.rotation); prefab.name = pName + " (Networked)"; if (readMessage.c != Vector3.zero) { prefab.localScale = readMessage.c; } Destroy(prefab.GetComponent <Snet_SceneObject_AutoSpawn>()); SNet_Identity identity = prefab.GetComponent <SNet_Identity>(); if (identity != null) { identity.Set(readMessage.i, readMessage.b); Rigidbody rBody = identity.GetComponent <Rigidbody>(); if (rBody != null) { // Default force rBody.AddForce(identity.transform.forward * readMessage.f); } } }