Пример #1
0
    /// <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;
            }
        }
    }
Пример #2
0
    /// <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;
            }
        }
    }
Пример #3
0
    /// <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;
            }
        }
    }
Пример #4
0
    /// <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;
                }
            }
        }
    }
Пример #5
0
    /// <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;
        }
    }
Пример #6
0
    /// <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);
        }
    }
Пример #7
0
    /// <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;
        }
    }
Пример #8
0
    /// <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();
        }
    }
Пример #9
0
    /// <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);
            }
        }
    }
Пример #10
0
    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);
    }
Пример #13
0
    /// <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;
                    }
                }
            }
        }
    }
Пример #14
0
    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);
    }
Пример #16
0
    /// <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);
            }
        }
    }
Пример #17
0
    /// <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);
            }
        }
    }
Пример #18
0
    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);
        }
    }
Пример #19
0
    /// <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;
        }
    }
Пример #20
0
    /// <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;
        }
    }
Пример #21
0
    /// <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;
        }
    }
Пример #22
0
    /// <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);
            }
        }
    }
Пример #23
0
    /// <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);
        }
    }
Пример #24
0
    /// <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();
            }
        }
    }
Пример #25
0
    /// <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);
            }
        }
    }
Пример #26
0
    /// <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);
    }
Пример #27
0
    /// <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();
        }
    }
Пример #28
0
    /// <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;
        }
    }
Пример #29
0
    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();
            }
        }
    }
Пример #30
0
    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.
    }