//RANGED MOD CHANGES---------------------------------------------------


        protected override void FireRangedWeapon()
        {
            InventoryItemView inventoryItemView = _equipmentSlots[0];

            TheForest.Items.Item itemCache = inventoryItemView.ItemCache;
            bool flag  = itemCache._maxAmount < 0;
            bool flag2 = false;

            if (flag || RemoveItem(itemCache._ammoItemId, 1, false, true))
            {
                InventoryItemView    inventoryItemView2 = _inventoryItemViewsCache[itemCache._ammoItemId][0];
                TheForest.Items.Item itemCache2         = inventoryItemView2.ItemCache;
                FakeParent           component          = inventoryItemView2._held.GetComponent <FakeParent>();
                if (UseAltWorldPrefab)
                {
                    Debug.Log("Firing " + itemCache._name + " with '" + inventoryItemView.ActiveBonus + "' ammo (alt=" + UseAltWorldPrefab + ")");
                }
                GameObject gameObject = (!(bool)component || component.gameObject.activeSelf) ? Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, inventoryItemView2._held.transform.position, inventoryItemView2._held.transform.rotation) : Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, component.RealPosition, component.RealRotation);
                gameObject.transform.localScale *= ModdedPlayer.instance.ProjectileSizeRatio;
                if ((bool)gameObject.GetComponent <Rigidbody>())
                {
                    if (itemCache.MatchRangedStyle(TheForest.Items.Item.RangedStyle.Shoot))
                    {
                        gameObject.GetComponent <Rigidbody>().AddForce(gameObject.transform.TransformDirection(Vector3.forward * (0.016666f / Time.fixedDeltaTime) * ModdedPlayer.instance.ProjectileSpeedRatio * itemCache._projectileThrowForceRange), ForceMode.VelocityChange);
                    }
                    else
                    {
                        float num = Time.time - _weaponChargeStartTime;
                        if (ForestVR.Enabled)
                        {
                            gameObject.GetComponent <Rigidbody>().AddForce(inventoryItemView2._held.transform.up * ModdedPlayer.instance.ProjectileSpeedRatio * itemCache._projectileThrowForceRange);
                        }
                        else
                        {
                            gameObject.GetComponent <Rigidbody>().AddForce(inventoryItemView2._held.transform.up * ModdedPlayer.instance.ProjectileSpeedRatio * Mathf.Clamp01(num / itemCache._projectileMaxChargeDuration) * (0.016666f / Time.fixedDeltaTime) * itemCache._projectileThrowForceRange);
                        }
                        if (LocalPlayer.Inventory.HasInSlot(TheForest.Items.Item.EquipmentSlot.RightHand, LocalPlayer.AnimControl._bowId))
                        {
                            gameObject.SendMessage("setCraftedBowDamage", SendMessageOptions.DontRequireReceiver);
                        }
                    }
                    inventoryItemView._held.SendMessage("OnAmmoFired", gameObject, SendMessageOptions.DontRequireReceiver);
                }
                if (itemCache._attackReleaseSFX != 0)
                {
                    LocalPlayer.Sfx.SendMessage(itemCache._attackReleaseSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                }
                Mood.HitRumble();
            }
            else
            {
                flag2 = true;
                if (itemCache._dryFireSFX != 0)
                {
                    LocalPlayer.Sfx.SendMessage(itemCache._dryFireSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                }
            }
            if (flag)
            {
                UnequipItemAtSlot(itemCache._equipmentSlot, false, false, flag);
            }
            else
            {
                ToggleAmmo(inventoryItemView, true);
            }
            _weaponChargeStartTime = 0f;
            SetReloadDelay((!flag2) ? itemCache._reloadDuration : itemCache._dryFireReloadDuration);
            _isThrowing = false;
        }
Exemple #2
0
        protected override void ThrowProjectile()
        {
            this._isThrowing = false;
            InventoryItemView inventoryItemView = this._equipmentSlots[0];

            if (inventoryItemView != null)
            {
                TheForest.Items.Item itemCache = inventoryItemView.ItemCache;
                bool       flag       = itemCache._maxAmount < 0;
                GameObject gameObject = UnityEngine.Object.Instantiate <GameObject>((!this.UseAltWorldPrefab) ? inventoryItemView._worldPrefab : inventoryItemView._altWorldPrefab, inventoryItemView._held.transform.position, inventoryItemView._held.transform.rotation);
                gameObject.transform.localScale *= ModdedPlayer.instance.ProjectileSizeRatio;
                Rigidbody component  = gameObject.GetComponent <Rigidbody>();
                Collider  component2 = gameObject.GetComponent <Collider>();
                if (BoltNetwork.isRunning)
                {
                    BoltEntity component3 = gameObject.GetComponent <BoltEntity>();
                    if (component3 != null)
                    {
                        BoltNetwork.Attach(gameObject);
                    }
                }
                Vector3 force = ((float)itemCache._projectileThrowForceRange) * ModdedPlayer.instance.ProjectileSpeedRatio * (0.016666f / Time.fixedDeltaTime) * TheForest.Utils.LocalPlayer.MainCamTr.forward;
                if (SpellActions.BIA_bonusDamage > 0)
                {
                    gameObject.transform.localScale *= 1.5f;
                    force *= 2f;
                    component.useGravity = false;
                    if (ModReferences.bloodInfusedMaterial == null)
                    {
                        ModReferences.bloodInfusedMaterial = BuilderCore.Core.CreateMaterial(new BuilderCore.BuildingData()
                        {
                            EmissionColor = new Color(0.4f, 0, 0),
                            renderMode    = BuilderCore.BuildingData.RenderMode.Fade,
                            MainColor     = Color.red,
                            Metalic       = 1f,
                            Smoothness    = 0.8f,
                        });
                    }
                    //gameObject.GetComponent<Renderer>().material = bloodInfusedMaterial;
                    var trail = gameObject.AddComponent <TrailRenderer>();
                    trail.widthCurve      = new AnimationCurve(new Keyframe[] { new Keyframe(0f, 1f, 0f, 0f), new Keyframe(0.5f, 1f, 0f, 0f), new Keyframe(1f, 0.006248474f, 0f, 0f), });
                    trail.material        = ModReferences.bloodInfusedMaterial;
                    trail.widthMultiplier = 0.85f;
                    trail.time            = 2f;
                    trail.autodestruct    = false;
                }
                if (inventoryItemView.ActiveBonus == TheForest.Items.Craft.WeaponStatUpgrade.Types.StickyProjectile)
                {
                    if (component2 != null)
                    {
                        gameObject.AddComponent <global::StickyBomb>();
                        SphereCollider sphereCollider = gameObject.AddComponent <SphereCollider>();
                        sphereCollider.isTrigger = true;
                        sphereCollider.radius    = 0.8f;
                    }
                    else
                    {
                        Collider componentInChildren = gameObject.GetComponentInChildren <Collider>();
                        if (componentInChildren != null)
                        {
                            componentInChildren.gameObject.AddComponent <global::StickyBomb>();
                        }
                    }
                }

                component.AddForce(force);

                inventoryItemView._held.SendMessage("OnProjectileThrown", gameObject, SendMessageOptions.DontRequireReceiver);
                inventoryItemView.ActiveBonus = (TheForest.Items.Craft.WeaponStatUpgrade.Types)(-1);
                if (!global::ForestVR.Enabled)
                {
                    if (itemCache._rangedStyle == TheForest.Items.Item.RangedStyle.Bell)
                    {
                        component.AddTorque((float)itemCache._projectileThrowTorqueRange * base.transform.forward);
                    }
                    else if (itemCache._rangedStyle == TheForest.Items.Item.RangedStyle.Forward)
                    {
                        component.AddTorque((float)itemCache._projectileThrowTorqueRange * TheForest.Utils.LocalPlayer.MainCamTr.forward);
                    }
                }
                if (base.transform.GetComponent <Collider>().enabled&& component2 && component2.enabled)
                {
                    Physics.IgnoreCollision(base.transform.GetComponent <Collider>(), component2);
                }
                if (!flag)
                {
                    this.MemorizeOverrideItem(TheForest.Items.Item.EquipmentSlot.RightHand);
                }
                bool equipPrevious = true;
                if (TheForest.Utils.LocalPlayer.FpCharacter.Sitting || TheForest.Utils.LocalPlayer.AnimControl.onRope || TheForest.Utils.LocalPlayer.FpCharacter.SailingRaft)
                {
                    equipPrevious = false;
                }
                if (ModdedPlayer.instance.ReusabilityChance < Random.value)
                {
                    this.UnequipItemAtSlot(itemCache._equipmentSlot, false, false, equipPrevious);
                }
                TheForest.Utils.LocalPlayer.Sfx.PlayThrow();
            }
        }
Exemple #3
0
        //RANGED MOD CHANGES---------------------------------------------------

        //      public override void Start()
        //      {
        //          base.Start();
        //          string log = "";
        //          foreach (var list in _inventoryItemViewsCache)
        //          {
        //              foreach (var item in list.Value)
        //              {
        //                  try
        //                  {
        //string s = "• _inventoryItemViewsCache[" + list.Key + "][" + list.Value + "]\n" +
        //                      "\tItem: " + item.ItemCache._name + " " + item.ItemCache._id;
        //                  s += "\n\tHeld Gameobject" + item._held.name + "\n\n";
        //                  log += s;
        //                  }
        //                  catch (System.Exception)
        //                  {

        //                  }
        //              }
        //          }
        //          ModAPI.Log.Write(log);
        //      }
        protected override void FireRangedWeapon()
        {
            if (ModSettings.IsDedicated)
            {
                return;
            }

            InventoryItemView inventoryItemView = _equipmentSlots[0];

            TheForest.Items.Item itemCache = inventoryItemView.ItemCache;
            bool flag    = itemCache._maxAmount < 0;
            bool flag2   = false;
            int  repeats = 1;

            if (Effects.Multishot.IsOn)
            {
                if (SpellCaster.RemoveStamina(5 * ModdedPlayer.instance.MultishotCount * ModdedPlayer.instance.MultishotCount))
                {
                    repeats += ModdedPlayer.instance.MultishotCount;
                }
                else
                {
                    Effects.Multishot.IsOn = false;
                    Effects.Multishot.localPlayerInstance.SetActive(false);
                }
            }
            for (int i = 0; i < repeats; i++)
            {
                if (flag || RemoveItem(itemCache._ammoItemId, 1, false, true))
                {
                    ModdedPlayer.instance.lastShotProjectile = itemCache;
                    InventoryItemView    inventoryItemView2 = _inventoryItemViewsCache[itemCache._ammoItemId][0];
                    TheForest.Items.Item itemCache2         = inventoryItemView2.ItemCache;
                    FakeParent           component          = inventoryItemView2._held.GetComponent <FakeParent>();
                    Vector3 pos = inventoryItemView2._held.transform.position;
                    if (i > 0 && i < 9)
                    {
                        pos += inventoryItemView2._held.transform.right * Mathf.Cos(45 * (i - 1)) * 0.5f + inventoryItemView2._held.transform.up * Mathf.Sin(45 * (i + 1)) * 5f;
                    }
                    else if (i >= 9 && i < 22)
                    {
                        pos += inventoryItemView2._held.transform.right * Mathf.Cos(30 * (i + 5)) * 1f + inventoryItemView2._held.transform.up * Mathf.Sin(30 * (i + 5)) * 1f;
                    }
                    else if (i > 21)
                    {
                        pos += inventoryItemView2._held.transform.right * Mathf.Cos(25 * (i)) * 1.5f + inventoryItemView2._held.transform.up * Mathf.Sin(25 * (i)) * 1.5f;
                    }

                    GameObject gameObject = (!(bool)component || component.gameObject.activeSelf) ? Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, pos, inventoryItemView2._held.transform.rotation) : Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, component.RealPosition, component.RealRotation);
                    gameObject.transform.localScale *= ModdedPlayer.instance.ProjectileSizeRatio;
                    gameObject.AddComponent <ProjectileIgnoreCollision>();

                    if ((bool)gameObject.GetComponent <Rigidbody>())
                    {
                        if (itemCache.MatchRangedStyle(TheForest.Items.Item.RangedStyle.Shoot))
                        {
                            gameObject.GetComponent <Rigidbody>().AddForce(gameObject.transform.TransformDirection(Vector3.forward * (0.016666f / Time.fixedDeltaTime) * ModdedPlayer.instance.ProjectileSpeedRatio * itemCache._projectileThrowForceRange), ForceMode.VelocityChange);
                        }
                        else
                        {
                            float num = Time.time - _weaponChargeStartTime;
                            if (ForestVR.Enabled)
                            {
                                gameObject.GetComponent <Rigidbody>().AddForce(inventoryItemView2._held.transform.up * ModdedPlayer.instance.ProjectileSpeedRatio * itemCache._projectileThrowForceRange);
                            }
                            else
                            {
                                gameObject.GetComponent <Rigidbody>().AddForce(inventoryItemView2._held.transform.up * ModdedPlayer.instance.ProjectileSpeedRatio * Mathf.Clamp01(num / itemCache._projectileMaxChargeDuration) * (0.016666f / Time.fixedDeltaTime) * itemCache._projectileThrowForceRange);
                            }
                            if (LocalPlayer.Inventory.HasInSlot(TheForest.Items.Item.EquipmentSlot.RightHand, LocalPlayer.AnimControl._bowId))
                            {
                                gameObject.SendMessage("setCraftedBowDamage", SendMessageOptions.DontRequireReceiver);
                            }
                        }
                        inventoryItemView._held.SendMessage("OnAmmoFired", gameObject, SendMessageOptions.DontRequireReceiver);
                    }
                    if (itemCache._attackReleaseSFX != 0)
                    {
                        LocalPlayer.Sfx.SendMessage(itemCache._attackReleaseSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                    }
                    Mood.HitRumble();
                }
                else
                {
                    flag2 = true;
                    if (itemCache._dryFireSFX != 0)
                    {
                        LocalPlayer.Sfx.SendMessage(itemCache._dryFireSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                    }
                }
            }
            if (flag)
            {
                UnequipItemAtSlot(itemCache._equipmentSlot, false, false, flag);
            }
            else
            {
                ToggleAmmo(inventoryItemView, true);
            }
            _weaponChargeStartTime = 0f;
            SetReloadDelay((!flag2) ? itemCache._reloadDuration : itemCache._dryFireReloadDuration);
            _isThrowing = false;
        }
Exemple #4
0
        public IEnumerator AsyncRangedFire(PlayerInventory inv, float _weaponChargeStartTime, InventoryItemView inventoryItemView, InventoryItemView inventoryItemView2, bool noconsume)
        {
            TheForest.Items.Item itemCache = inventoryItemView.ItemCache;
            bool       flag        = itemCache._maxAmount < 0;
            int        repeats     = ModdedPlayer.RangedRepetitions();
            Vector3    forceUp     = inventoryItemView2._held.transform.up;
            Vector3    right       = inventoryItemView2._held.transform.right;
            Vector3    up          = inventoryItemView2._held.transform.up;
            Vector3    originalPos = inventoryItemView2._held.transform.position;
            FakeParent component   = inventoryItemView2._held.GetComponent <FakeParent>();
            Quaternion rotation    = inventoryItemView2._held.transform.rotation;

            TheForest.Items.Item itemCache2 = inventoryItemView2.ItemCache;
            for (int i = 0; i < repeats; i++)
            {
                if (noconsume)
                {
                    Vector3 pos = originalPos;
                    if (i > 0)
                    {
                        // pos += 0.5f * up * (i + 1) / 3;
                        pos += 0.5f * right * (((i - 1) % 3) - 1);
                    }

                    GameObject projectileObject = (!(bool)component || component.gameObject.activeSelf) ? Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, pos, rotation) : Object.Instantiate(itemCache2._ammoPrefabs.GetPrefabForBonus(inventoryItemView.ActiveBonus, true).gameObject, pos, rotation);

                    projectileObject.transform.localScale *= ModdedPlayer.Stats.projectileSize;


                    try
                    {
                        projectileObject.transform.GetChild(0).gameObject.layer = 19;
                    }
                    catch (System.Exception)
                    {
                        throw;
                    }
                    projectileObject.layer = 19;
                    Physics.IgnoreLayerCollision(19, 19, true);
                    if (noconsume)
                    {
                        GameObject.Destroy(projectileObject, 40f);
                    }
                    else
                    {
                        if (i >= 4)
                        {
                            GameObject.Destroy(projectileObject, 40);                                     //if spamming arrows, delete 4th and further after really short time
                        }
                    }
                    if ((bool)projectileObject.GetComponent <Rigidbody>())
                    {
                        if (itemCache.MatchRangedStyle(TheForest.Items.Item.RangedStyle.Shoot))
                        {
                            projectileObject.GetComponent <Rigidbody>().AddForce(projectileObject.transform.TransformDirection(Vector3.forward * (0.016666f / Time.fixedDeltaTime) * ModdedPlayer.Stats.projectileSpeed * itemCache._projectileThrowForceRange), ForceMode.VelocityChange);
                        }
                        else
                        {
                            float num = Time.time - _weaponChargeStartTime;
                            if (ForestVR.Enabled)
                            {
                                projectileObject.GetComponent <Rigidbody>().AddForce(inventoryItemView2._held.transform.up * ModdedPlayer.Stats.projectileSpeed * itemCache._projectileThrowForceRange);
                            }
                            else
                            {
                                Vector3 proj_force = forceUp * ModdedPlayer.Stats.projectileSpeed * Mathf.Clamp01(num / itemCache._projectileMaxChargeDuration) * (0.016666f / Time.fixedDeltaTime) * itemCache._projectileThrowForceRange;
                                var     proj_rb    = projectileObject.GetComponent <Rigidbody>();
                                proj_rb.collisionDetectionMode = CollisionDetectionMode.ContinuousDynamic;
                                var col = projectileObject.GetComponent <CapsuleCollider>();
                                if (col)
                                {
                                    col.height *= ModdedPlayer.Stats.projectileSpeed;
                                }
                                else
                                {
                                    Debug.LogError("No capsule collider on projectile");
                                }
                                if (GreatBow.isEnabled)
                                {
                                    proj_force        *= 1.1f;
                                    proj_rb.useGravity = false;
                                }
                                if (ModdedPlayer.Stats.spell_bia_AccumulatedDamage > 0)
                                {
                                    proj_force        *= 1.1f;
                                    proj_rb.useGravity = false;
                                    if (ModReferences.bloodInfusedMaterial == null)
                                    {
                                        ModReferences.bloodInfusedMaterial = BuilderCore.Core.CreateMaterial(new BuilderCore.BuildingData()
                                        {
                                            EmissionColor = new Color(0.6f, 0.1f, 0),
                                            renderMode    = BuilderCore.BuildingData.RenderMode.Opaque,
                                            MainColor     = Color.red,
                                            Metalic       = 1f,
                                            Smoothness    = 0.9f,
                                        });
                                    }
                                    var trail = projectileObject.AddComponent <TrailRenderer>();
                                    trail.widthCurve      = new AnimationCurve(new Keyframe[] { new Keyframe(0f, 1f, 0f, 0f), new Keyframe(0.5f, 1f, 0f, 0f), new Keyframe(1f, 0.006248474f, 0f, 0f), });
                                    trail.material        = ModReferences.bloodInfusedMaterial;
                                    trail.widthMultiplier = 0.45f;
                                    trail.time            = 1.25f;
                                    trail.autodestruct    = false;
                                }
                                if (i > 0)
                                {
                                    float dmgPen = 1;
                                    for (int k = 0; k < i; k++)
                                    {
                                        dmgPen *= ModdedPlayer.Stats.perk_multishotDamagePennalty.Value;
                                    }
                                    //using XBArrowDamageMod as a typename here results in erros with modapi
                                    projectileObject.SendMessage("ModifyStartingDamage", dmgPen, SendMessageOptions.DontRequireReceiver);
                                }
                                proj_rb.AddForce(proj_force);
                            }
                            if (LocalPlayer.Inventory.HasInSlot(TheForest.Items.Item.EquipmentSlot.RightHand, LocalPlayer.AnimControl._bowId))
                            {
                                projectileObject.SendMessage("setCraftedBowDamage", SendMessageOptions.DontRequireReceiver);
                            }
                        }
                        inventoryItemView._held.SendMessage("OnAmmoFired", projectileObject, SendMessageOptions.DontRequireReceiver);
                    }
                    if (itemCache._attackReleaseSFX != 0)
                    {
                        LocalPlayer.Sfx.SendMessage(itemCache._attackReleaseSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                    }
                    Mood.HitRumble();
                }
                else
                {
                    if (itemCache._dryFireSFX != 0)
                    {
                        LocalPlayer.Sfx.SendMessage(itemCache._dryFireSFX.ToString(), SendMessageOptions.DontRequireReceiver);
                    }
                }
                if (i % 2 == 1)
                {
                    yield return(null);
                }
            }
            if (flag)
            {
                inv.UnequipItemAtSlot(itemCache._equipmentSlot, false, false, flag);
            }
            else
            {
                inv.ToggleAmmo(inventoryItemView, true);
            }

            yield break;
        }