Пример #1
0
            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);
            }
Пример #2
0
 /// <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);
 }
Пример #3
0
 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)}");
         }
     }
 }