예제 #1
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;
                }
            }
        }
    }
예제 #2
0
    public void AddItem(Item.PlayerItem item)
    {
        Item.PlayerItem current = inv.l.Find(x => x.prefabName == item.prefabName);
        if (current != null)
        {
            current.ammo = (ushort)Mathf.Clamp(current.ammo + item.ammo, 0, item.maxammo);
        }
        else
        {
            inv.l.Add(item);

            /*
             * EQUIP IF IT's THE FIRST ITEM
             * */
            if (isLocalPlayer)
            {
                if (inv.l.Count == 1)
                {
                    Request_Equip(item.prefabName);
                }
            }
        }

        if (isLocalPlayer && InventorySelector.current != null)
        {
            if (!UpdateCurrentAmmo())
            {
                InventorySelector.current.UpdateInventory();
                InventorySelector.current.OnEnable(); // Update ammos
                SyncInventory();
            }
        }
    }
    public void OnEnable()
    {
        UpdateInventory();

        /*
         * UPDATE AMMO
         * */

        foreach (Transform t in holder)
        {
            if (t.gameObject.activeSelf)
            {
                Item.PlayerItem pi   = PlayerInventory.localPlayer.inv.l.Find(x => x.prefabName == t.name);
                Text            ammo = t.GetComponentInChildren <Text>();
                ammo.enabled = pi.ammo > 0;
                ammo.text    = PlayerInventory.localPlayer.inv.l.Find(x => x.prefabName == t.name).ammo.ToString();
            }
        }
    }
예제 #4
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);
            }
        }
    }
예제 #5
0
    public void Equip(string prefabName)
    {
        if (prefab != null)
        {
            if (prefab.item.prefabName == prefabName)
            {
                return;
            }

            prefab.SendMessage("Detach");
            Destroy(prefab.gameObject);
        }

        if (string.IsNullOrEmpty(prefabName))
        {
            if (prefab != null)
            {
                Destroy(prefab.gameObject);
            }
        }

        Item.PlayerItem willEquip = inv.l.Find(x => x.prefabName == prefabName);
        if (willEquip == null)
        {
            willEquip = new Item.PlayerItem();
        }

        inv.ci = willEquip;
        identity.controller.isShooting = false;

        prefab = null;

        if (!string.IsNullOrEmpty(prefabName))
        {
            Transform Tprefab = ResourcesLoader.prefabs.Find(x => x.name == prefabName);
            Transform tBone   = identity.animator.animator.GetBoneTransform(Tprefab.GetComponent <Item>().item.targetBone);

            prefab      = Instantiate(Tprefab, tBone).GetComponent <Item>();
            prefab.name = prefabName;

            Destroy(prefab.GetComponent <CustomScale>());

            Destroy(prefab.GetComponent <Snet_SceneObject_AutoSpawn>());

            Collider cldr = prefab.GetComponent <Collider>();
            if (cldr != null)
            {
                cldr.enabled = false;
            }

            Rigidbody rb = prefab.GetComponent <Rigidbody>();
            if (rb != null)
            {
                rb.isKinematic = true;
            }

            DestroyIn dIn = prefab.GetComponent <DestroyIn>();
            if (dIn != null)
            {
                dIn.enabled = false;
            }

            IKWeapon attacher = prefab.GetComponent <IKWeapon>();
            if (attacher != null)
            {
                attacher.Attach();
            }
        }

        SetState();

        if (isLocalPlayer)
        {
            if (Crosshair.instance == null || Crosshair.instance.normal == null)
            {
                return;
            }

            foreach (Transform t in Crosshair.instance.normal.transform)
            {
                t.GetComponent <UIVisibility>().Open(t.name == inv.ci.crossHair_Normal);
            }

            foreach (Transform t in Crosshair.instance.aimed.transform)
            {
                t.GetComponent <UIVisibility>().Open(t.name == inv.ci.crossHair_Aimed);
            }

            if (!UpdateCurrentAmmo())
            {
                SyncInventory();
            }
        }
    }