/// <summary> /// SNet_Transform, position message /// </summary> /// <param name="value">Incoming message</param> private void OnPos(string[] value) { SNet_Transform.Pos readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Transform.Pos>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.Authorized(readMessage.s)) { return; // Sender didn't need tform sync. } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.controller != null && readMessage.i != id.identity) { return; // Player sync is client authoritative. This is not allowed. } if (id.controller != null && Vector3.Distance(id.transform.position, readMessage.p) > 0.5f) { id.tform.tweener.TweenFor(readMessage.p); } else { id.transform.position = readMessage.p; } } }
/// <summary> /// Rigidbody Message /// </summary> /// <param name="value">Incoming message</param> private void OnRB(string[] value) { SNet_Rigidbody.RB readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Rigidbody.RB>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.Authorized(readMessage.s)) { return; // Sender didn't need rbody sync. } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.controller != null && readMessage.i != id.identity) { return; // Player rigibody sync is client authoritative. This is not allowed. } if (id.rbody != null && id.rbody.rBody != null) { id.rbody.rBody.velocity = readMessage.v; id.rbody.rBody.angularVelocity = readMessage.a; return; } } }
/// <summary> /// SNet_Transform, rotation message /// </summary> /// <param name="value">Incoming message</param> private void OnRot(string[] value) { SNet_Transform.Rot readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Transform.Rot>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.Authorized(readMessage.s)) { return; // Sender didn't need tform sync. } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.controller != null && readMessage.i != id.identity) { return; // Player sync is client authoritative. This is not allowed. } if (id.controller != null) { id.tform.tRot.eulerAngles = readMessage.r; } else { id.transform.eulerAngles = readMessage.r; } } }
/// <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> /// SNet_Animator Message /// </summary> /// <param name="value">Incoming message</param> private void OnA_Trigger(string[] value) { SNet_Animator.A_Trigger readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Animator.A_Trigger>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { id.animator.animator.SetTrigger(readMessage.id); } }
/// <summary> /// Player health, comes from master client (host) /// </summary> /// <param name="value">Incoming message</param> private void OnHealth(string[] value) { SNet_Controller.Health readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Controller.Health>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { id.controller.health = readMessage; } }
/// <summary> /// Some player shooted. /// </summary> /// <param name="value">Incoming message</param> private void OnSt(string[] value) { PlayerInventory.St readMessage = SNet_Network.SNetMessage.ReadMessage <PlayerInventory.St>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.s, out id)) { id.controller.Shoot(); } }
/// <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); } } }
public void OnVM(byte[] data, int length, ulong sender) { SNet_Identity go = null; SNet_Identity.find(sender, out go); Transform lobbyPlayer = SNet_Manager.instance.lobbyMemberHolder.Find(sender.ToString()); bool voiceDisable = false; if (lobbyPlayer.Find("voiceDisable").GetComponent <Toggle>().isOn) { voiceDisable = true; } if (go != null && go.controller.UI_PlayerAgent != null) { Transform voice = go.controller.UI_PlayerAgent.Find("voice"); voice.GetComponent <UIVisibility>().Open(); GameObject g = voice.Find("blocked").gameObject; if (g.activeSelf != voiceDisable) { g.SetActive(voiceDisable); } } lobbyPlayer.Find("speaking").GetComponent <UIVisibility>().Open(); if (voiceDisable) { return; } VoiceData vd = vdList.Find(x => x.id == sender); if (vd == null) { vd = new VoiceData(sender); vdList.Add(vd); } if (Client.Instance.Voice.Decompress(data, length, vd.ms)) { if (vd.ms.Length > stepSize && vd.playOffset == 0) { // The data is enough to play. vd.playOffset = 1; } } }
// Use this for initialization void Start() { identity = GetComponent <SNet_Identity>(); tweener = gameObject.GetComponent <Position_Tweener>(); if (tweener == null) { tweener = gameObject.AddComponent <Position_Tweener>(); } lastPosition = transform.position; lastRotation = transform.eulerAngles; list.Add(this); }
// Use this for initialization void Start() { rBody = GetComponent <Rigidbody>(); identity = GetComponent <SNet_Identity>(); controller = GetComponent <SNet_Controller>(); lastAngularVelocity = rBody.angularVelocity; lastVelocity = rBody.velocity; rMessage = new RB(identity.identity); nextUpdate = Time.time + Random.Range(1f, 3f); list.Add(this); }
/// <summary> /// Vehicle passengers data. /// </summary> /// <param name="value">Incoming message</param> private void OnV(string[] value) { SNet_Vehicle.V readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Vehicle.V>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; // Only host can send vehicle data } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.vehicle != null) { id.vehicle.vehicle = readMessage; int myClient_Driver = readMessage.p.FindIndex(x => x == Client.Instance.SteamId); id.vehicle.isLocalVehicle = myClient_Driver == 0; SNet_Identity[] currentPassangers = id.vehicle.passengerControllers.ToArray(); id.vehicle.passengerControllers.Clear(); foreach (ulong pid in readMessage.p) { if (pid == 0) { continue; } SNet_Identity psid = null; if (SNet_Identity.find(pid, out psid)) { id.vehicle.passengerControllers.Add(psid); psid.controller.currentVehicle = id; } } foreach (SNet_Identity cp in currentPassangers) { if (cp.controller.currentVehicle != null && !cp.controller.currentVehicle.vehicle.vehicle.p.Contains(cp.identity)) { cp.controller.currentVehicle = null; } } } } }
private void Start() { identity = GetComponent <SNet_Identity>(); if (isLocalPlayer) { localPlayer = this; UpdateCurrentAmmo(); if (InventorySelector.current != null) { InventorySelector.current.UpdateInventory(); } } }
private void Start() { identity = GetComponent <SNet_Identity>(); info = new VI(identity.identity); vehicle = new V(identity.identity); health = new VH(identity.identity, maxHealth); vehicle.p = new List <ulong>(); for (int i = 0; i < seatPoints.Count; i++) { vehicle.p.Add(0); } MonoBehaviourExtensions.Invoke(this, VehicleUpdate, 3f); }
/// <summary> /// Ragdoll impact message /// </summary> /// <param name="value">Incoming message</param> private void OnImpact(string[] value) { RagdollHelper.Impact readMessage = SNet_Network.SNetMessage.ReadMessage <RagdollHelper.Impact>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.ragdoll != null) { // Ragdoll is an option id.ragdoll.Impacted(readMessage); } } }
/// <summary> /// Player equips a new item /// </summary> /// <param name="value">Incoming message</param> private void OnEquipItem(string[] value) { PlayerInventory.EquipItem readMessage = SNet_Network.SNetMessage.ReadMessage <PlayerInventory.EquipItem>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.s, out id)) { if (id.controller != null && id.controller.inventory != null) { id.controller.inventory.Equip(readMessage.prefabName); } } }
public static bool find(ulong identity, out SNet_Identity gameObject) { gameObject = null; SNet_Identity id = list.Find(x => x.set && x.identity == identity); if (id == null) { return(false); } else { gameObject = id; return(true); } }
/// <summary> /// Data of a vehicle. /// Contains gas, brake, steering /// </summary> /// <param name="value">Incoming message</param> private void OnVI(string[] value) { SNet_Vehicle.VI readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Vehicle.VI>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.Authorized(readMessage.s)) { return; // sender doesnt need sync. } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { id.vehicle.info = readMessage; } }
/// <summary> /// Data of a vehicle. /// Contains health /// </summary> /// <param name="value">Incoming message</param> private void OnVH(string[] value) { SNet_Vehicle.VH readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Vehicle.VH>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; // only host can send this } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { id.vehicle.health = readMessage; } }
/// <summary> /// Player aim /// </summary> /// <param name="value">Incoming message</param> private void OnA(string[] value) { SNet_Controller.A readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Controller.A>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.Authorized(readMessage.s)) { return; } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.s, out id)) { id.controller.syncedAim = readMessage; } }
/// <summary> /// Item looted by player. /// </summary> /// <param name="value">Incoming message</param> private void OnPlayerItem(string[] value) { Item.PlayerItem readMessage = SNet_Network.SNetMessage.ReadMessage <Item.PlayerItem>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; // only host can send this } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.looter, out id)) { if (id.controller != null && id.controller.inventory != null) { id.controller.inventory.AddItem(readMessage); } } }
/// <summary> /// Networked object destroyed. /// </summary> /// <param name="value">Incoming message</param> private void OnDestroyed(string[] value) { SNet_Network.Destroyed readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Network.Destroyed>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; // Only the host can send this } if (SNet_Network.instance.isHost()) { return; // Host is already destroyed this object. } SNet_Identity go = null; if (SNet_Identity.find(readMessage.i, out go)) { Destroy(go.gameObject); } }
/// <summary> /// Some explosive has been exploded. /// </summary> /// <param name="value">Incoming message</param> private void OnExploded(string[] value) { Explosive.Exploded readMessage = SNet_Network.SNetMessage.ReadMessage <Explosive.Exploded>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost(readMessage.s)) { return; } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { if (id.explosive != null) { id.explosive.Explode(); } } }
/// <summary> /// Inventory status /// Inventory list, and current item of a player. /// Called when a new player connects. /// </summary> /// <param name="value">Incoming message</param> private void OnIS(string[] value) { PlayerInventory.IS readMessage = SNet_Network.SNetMessage.ReadMessage <PlayerInventory.IS>(value[0]); readMessage.s = ulong.Parse(value[1]); if (readMessage.s == Client.Instance.SteamId) { return; // Sender already has the updated inventory. } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.s, out id)) { if (id.controller != null && id.controller.inventory != null) { id.controller.inventory.inv = readMessage; id.controller.inventory.Equip(readMessage.ci.prefabName); } } }
/// <summary> /// Player spawn. /// </summary> /// <param name="value">Incoming message</param> private void OnSpawn_Player(string[] value) { SNet_Network.Spawn_Player readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Network.Spawn_Player>(value[0]); readMessage.s = ulong.Parse(value[1]); if (GameMap.instance == null) { return; } SNet_Identity go = null; if (SNet_Identity.find(readMessage.i, out go)) { // Already have that identity. return; } Debug.Log("Spawn_Player(): " + readMessage.s); 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>(); bool isLocalPlayer = readMessage.s == Client.Instance.SteamId; prefab.gameObject.AddComponent <PlayerInventory>().isLocalPlayer = isLocalPlayer; prefab.gameObject.AddComponent <SNet_Controller>().isLocalPlayer = isLocalPlayer; prefab.gameObject.AddComponent <SNet_Animator>(); identity.Set(readMessage.i, readMessage.b); }
/// <summary> /// Change seat request /// </summary> /// <param name="value"></param> private void OnCSRequest(string[] value) { ChangeSeat.CSRequest readMessage = SNet_Network.SNetMessage.ReadMessage <ChangeSeat.CSRequest>(value[0]); readMessage.s = ulong.Parse(value[1]); if (!SNet_Network.instance.isHost()) { return; // Only host can receive this data } SNet_Identity id = null; if ( SNet_Identity.find(readMessage.s, out id)) { if (id.controller.currentVehicle == null) { return; } if (id.controller.currentVehicle.vehicle.vehicle.p[readMessage.idx] != 0) { return; } int currentSeat = id.controller.currentVehicle.vehicle.vehicle.p.FindIndex(x => x == readMessage.s); if (currentSeat == -1) { return; } id.controller.currentVehicle.vehicle.vehicle.p[currentSeat] = 0; id.controller.currentVehicle.vehicle.vehicle.p[readMessage.idx] = readMessage.s; id.controller.currentVehicle.vehicle.VehicleUpdate(); } }
/// <summary> /// Some player has been hit /// </summary> /// <param name="value">Incoming message</param> private void OnUserHit(string[] value) { SNet_Controller.UserHit readMessage = SNet_Network.SNetMessage.ReadMessage <SNet_Controller.UserHit>(value[0]); readMessage.s = ulong.Parse(value[1]); SNet_Identity id = null; if ( SNet_Identity.find(readMessage.i, out id)) { /* * UI DAMAGE EFFECT * */ if (id.controller == SNet_Controller.user && !SNet_Controller.user.isDead) { UI_UserHit.instance.panel.alpha = 1; Vector3 vec1 = readMessage.h - id.transform.position; Vector3 vec2 = id.transform.forward; float angle = Vector3.Angle(vec1, vec2); Vector3 cross = Vector3.Cross(vec1, vec2); if (cross.y < 0) { angle = -angle; } UI_UserHit.instance.incoming.eulerAngles = new Vector3(0, 0, angle); } SNet_Controller.Health health = new SNet_Controller.Health(id.identity); health.v = id.controller.health.v - readMessage.v; id.controller.health = health; } }
void Shoot_CurrentItem() { if (inventory.prefab == null) { return; } switch (inventory.inv.ci.itemType) { case Item.PlayerItem.ItemType.Bullet: case Item.PlayerItem.ItemType.Knife: { RaycastHit hit; if (Physics.Raycast(inventory.prefab.firePoint.position, MouseOrbitImproved.instance.transform.forward, out hit, inventory.inv.ci.range, ~hitMask)) { if (isLocalPlayer) { if (inventory.inv.ci.itemType == Item.PlayerItem.ItemType.Bullet) { SNet_Network.instance.Send_Spawn("bulletImpact", hit.point, Quaternion.LookRotation(-inventory.prefab.firePoint.forward), Vector3.zero, 0); } if (hit.collider.CompareTag("Explosive")) { hit.collider.GetComponent <Explosive>().Explode_Request(); return; } /* * ONLY LOCAL PLAYER CAN MAKE HIT. * Bone damage multipliers are the parts of the user. * If you are making a third person shooter game you can use the ragdoll bones for this. * Add bone damage multipliers to the bones have colliders. * * For example if you are making a car fight game (non-humanoid) drop the bone damage multiplier to the car has collider. * */ SNet_Identity id = hit.collider.transform.root.GetComponent <SNet_Identity>(); if (id != null) { BoneDamageMultiplier bone = hit.collider.GetComponent <BoneDamageMultiplier>(); if (bone != null) { // Hit an agent UserHit userHit = new UserHit(id.identity); userHit.v = Mathf.RoundToInt(inventory.inv.ci.damage * bone.damageModifier); userHit.h = transform.position; SNet_Network.instance.Send_Message(userHit); /* * IMPACT TO BONE * */ SNet_Network.instance.Send_Message(new RagdollHelper.Impact(identity.identity, bone.name, inventory.prefab.firePoint.forward, inventory.inv.ci.damage / 100f)); } else { if (id.vehicle != null) { /* * VEHICLE HEALTH IS HOST CONTROLLED * */ if (SNet_Network.instance.isHost()) { id.vehicle.health = new SNet_Vehicle.VH(id.identity, Mathf.RoundToInt(id.vehicle.health.v - inventory.inv.ci.damage / id.vehicle.armor)); SNet_Network.instance.Send_Message(id.vehicle.health); } /* * */ } if (id.rbody != null) { id.rbody.rBody.AddForce(inventory.prefab.firePoint.forward * inventory.inv.ci.damage, ForceMode.Force); id.rbody.nextUpdate = 0; // Update now } } } } } } break; case Item.PlayerItem.ItemType.Throwable: if (isLocalPlayer) { Quaternion high = new Quaternion(); high.eulerAngles = inventory.inv.ci.throwableRotation; SNet_Network.instance.SpawnRequest(inventory.inv.ci.ThrowPrefab, inventory.prefab.firePoint.position, MouseOrbitImproved.instance.transform.rotation * high, Vector3.zero, inventory.inv.ci.ThrowForce); } break; } if (inventory.inv.ci.countable) { inventory.inv.ci.ammo--; if (isLocalPlayer) { // Update ammo inventory.UpdateCurrentAmmo(); InventorySelector.current.UI_UpdateCurrentAmmo(); } } }
public void Explode() { if (exploded) { return; } exploded = true; /* * EXPLOSIVE EFFECT * */ Destroy(Instantiate(explosionParticle, transform.position, explosionParticle.rotation).gameObject, 5); /* * */ if (!SNet_Network.instance.isHost()) { return; } // HITTING Collider[] colliders = Physics.OverlapSphere(transform.position, radius, ~SNet_Controller.hitMask); List <SNet_Identity> alreadyHit = new List <SNet_Identity>(); foreach (Collider c in colliders) { if (c.gameObject == gameObject) { continue; } float distance = Vector3.Distance(transform.position, c.transform.position); int tDamage = Mathf.RoundToInt(damage / (1 + Mathf.Pow(distance, 2) / 10)); if (c.gameObject.layer == 9) { // Player SNet_Identity id = c.transform.root.GetComponent <SNet_Identity>(); if (!alreadyHit.Contains(id) && !id.controller.isDead) { // If its not dead. alreadyHit.Add(id); SNet_Controller.UserHit hit = new SNet_Controller.UserHit(id.identity); hit.v = tDamage; hit.h = transform.position; SNet_Network.instance.Send_Message(hit); // Ragdoll bone push SNet_Network.instance.Send_Message(new RagdollHelper.Impact(id.identity, c.gameObject.name, c.transform.position - transform.position, tDamage / 150f)); } } else { SNet_Identity id = c.GetComponent <SNet_Identity>(); if (id != null) { if (id.rbody != null) { id.rbody.rBody.AddExplosionForce((radius - distance) * damage * id.rbody.rBody.mass / 4, transform.position, radius); id.rbody.nextUpdate = 0; // Update now. } if (id.vehicle != null) { /* * VEHICLE HEALTH IS HOST CONTROLLED * */ if (SNet_Network.instance.isHost()) { if (!alreadyHit.Contains(id)) { alreadyHit.Add(id); id.vehicle.health = new SNet_Vehicle.VH(id.identity, Mathf.RoundToInt(id.vehicle.health.v - tDamage / id.vehicle.armor)); SNet_Network.instance.Send_Message(id.vehicle.health); } } /* * */ } } if (c.gameObject.CompareTag("Explosive")) { c.gameObject.GetComponent <Explosive>().Explode_Request(); } } } Destroy(gameObject); // Destroy after explode. }