//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; }
//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; }
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; }