static bool Prefix(float dt, ref SE_Harpooned __instance) { Base_StatusEffect_UpdateStatusEffect.UpdateStatusEffect(__instance, dt); Character attacker = __instance.m_attacker; Character harpooned = __instance.m_character; if (!attacker || __instance.m_broken) { return(false); } float distance = Vector3.Distance(attacker.transform.position, harpooned.transform.position); if (attacker.IsBlocking() && distance > minDistance.Value) { ApplyForces0(dt, attacker, harpooned); DrainStamina(dt, __instance); } // Break connection if too far away or out of stamina if (distance > ImprovedHarpoon.maxDistance.Value) { __instance.m_broken = true; attacker.Message(MessageHud.MessageType.Center, "Line broke"); } if (!attacker.HaveStamina() || attacker.IsStaggering()) { __instance.m_broken = true; attacker.Message(MessageHud.MessageType.Center, harpooned.m_name + " escaped"); } return(false); }
/// <summary> /// Equivalent to SE_Harpooned except the attacker blocking does not end the harpooning, allows block to pull rope closer /// also added condition where the attacker getting staggered will release the target /// </summary> /// <param name="__result"></param> /// <param name="__instance"></param> /// <returns></returns> static bool Prefix(ref bool __result, SE_Harpooned __instance) { /// base.IsDone() logic if (__instance.m_ttl > 0f && __instance.m_time > __instance.m_ttl) { return(true); } else if (__instance.m_broken) { __result = true; } else if (!__instance.m_attacker) { __result = true; } else if (__instance.m_time > 2f && __instance.m_attacker.InAttack()) { __instance.m_attacker.Message(MessageHud.MessageType.Center, __instance.m_character.m_name + " released"); __result = true; } else { __result = false; } return(false); }
public static void DrainStamina(float dt, SE_Harpooned harpoonEffect) { harpoonEffect.m_drainStaminaTimer += dt; if (harpoonEffect.m_drainStaminaTimer > harpoonEffect.m_staminaDrainInterval) { float stamina_cost = pullStaminaCost.Value * (harpoonEffect.m_drainStaminaTimer / harpoonEffect.m_staminaDrainInterval); harpoonEffect.m_attacker.UseStamina(stamina_cost); harpoonEffect.m_drainStaminaTimer = 0f; } }
private static void Prefix(SE_Harpooned __instance, float dt, Character ___m_attacker) { if (___m_attacker.GetZDOID() == Player.m_localPlayer.GetZDOID()) { var x = Input.GetAxis("Mouse Wheel"); if (x != 0) { __instance.m_minDistance += x * (5 * dt); __instance.m_maxDistance += x * (5 * dt); var y = x * (5 * dt); __instance.m_minDistance = Mathf.Clamp(__instance.m_minDistance + y, 1f, 20f); __instance.m_maxDistance = Mathf.Clamp(__instance.m_maxDistance + y, 30f, 50f); MessageHud.instance.ShowMessage(MessageHud.MessageType.TopLeft, $"Harpoon Distance changed to {Math.Round(__instance.m_minDistance, 1)}"); } } }