Ejemplo n.º 1
0
        private static bool Prefix(ConsumableAndWearableItems __instance)
        {
            if (!__instance._interactRateLimit.CanExecute(true))
            {
                return(false);
            }

            __instance._cancel = false;
            if (__instance.cooldown > 0.0)
            {
                return(false);
            }

            for (int i = 0; i < __instance.usableItems.Length; ++i)
            {
                if (__instance.usableItems[i].inventoryID == __instance._hub.inventory.curItem && __instance.usableCooldowns[i] <= 0.0)
                {
                    var ev = new UsingMedicalItemEventArgs(API.Features.Player.Get(__instance.gameObject), __instance._hub.inventory.curItem, __instance.usableItems[i].animationDuration);

                    Player.OnUsingMedicalItem(ev);

                    __instance.cooldown = ev.Cooldown;

                    if (ev.IsAllowed)
                    {
                        Timing.RunCoroutine(__instance.UseMedicalItem(i), Segment.FixedUpdate);
                    }
                }
            }

            return(false);
        }
Ejemplo n.º 2
0
        private static bool Prefix(ConsumableAndWearableItems __instance)
        {
            try
            {
                if (!__instance._interactRateLimit.CanExecute(true))
                {
                    return(false);
                }

                for (int i = 0; i < __instance.usableItems.Length; ++i)
                {
                    if (__instance.usableItems[i].inventoryID == __instance._hub.inventory.curItem && __instance.usableItems[i].cancelableTime > 0f)
                    {
                        var ev = new StoppingMedicalItemEventArgs(API.Features.Player.Get(__instance.gameObject), __instance._hub.inventory.curItem, __instance.usableItems[i].animationDuration);

                        Player.OnStoppingMedicalItem(ev);

                        __instance._cancel = ev.IsAllowed;
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"Exiled.Events.Patches.Events.Player.StoppingMedicalItem: {e}\n{e.StackTrace}");

                return(true);
            }
        }
Ejemplo n.º 3
0
        public static bool Prefix(ConsumableAndWearableItems __instance)
        {
            if (EventPlugin.CancelMedicalEventPatchDisable)
            {
                return(true);
            }

            try
            {
                if (!__instance._interactRateLimit.CanExecute(true))
                {
                    return(false);
                }

                for (int i = 0; i < __instance.usableItems.Length; ++i)
                {
                    if (__instance.usableItems[i].inventoryID == __instance.inv.curItem && __instance.usableItems[i].cancelableTime > 0f)
                    {
                        bool allow = true;

                        Events.InvokeCancelMedicalItem(__instance.gameObject, __instance.inv.curItem, ref __instance.usableItems[i].animationDuration, ref allow);

                        __instance.cancel = allow;
                    }
                }

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"CancelMedicalItemEvent error: {exception}");
                return(true);
            }
        }
Ejemplo n.º 4
0
        private static void Prefix(ConsumableAndWearableItems __instance, ConsumableAndWearableItems.HealAnimation healAnimation, int mid)
        {
            if (healAnimation == ConsumableAndWearableItems.HealAnimation.DequipMedicalItem)
            {
                var ev = new UsedMedicalItemEventArgs(API.Features.Player.Get(__instance.gameObject), __instance.usableItems[mid].inventoryID);

                Player.OnMedicalItemUsed(ev);
            }
        }
Ejemplo n.º 5
0
 public static bool Prefix(ConsumableAndWearableItems __instance)
 {
     try
     {
         Events.InvokeUseItemEvent(__instance.GetPlayer(), __instance._hub.inventory.curItem, out bool allow);
         return(allow);
     }
     catch (Exception e)
     {
         Log.Error($"UseItemEvent Error: {e}");
         return(true);
     }
 }
Ejemplo n.º 6
0
 public static bool Prefix(ConsumableAndWearableItems __instance)
 {
     try
     {
         var allow = true;
         Server.Get.Events.Player.InvokePlayerItemUseEvent(__instance.GetPlayer(), __instance.GetPlayer().ItemInHand, ItemInteractState.Stopping, ref allow);
         return(allow);
     }
     catch (Exception e)
     {
         Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Stopping failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
         return(true);
     }
 }
Ejemplo n.º 7
0
 public static void Prefix(ConsumableAndWearableItems __instance, ConsumableAndWearableItems.HealAnimation animation, int mid)
 {
     try
     {
         if (animation == ConsumableAndWearableItems.HealAnimation.DequipMedicalItem)
         {
             Events.InvokeUsedMedicalItem(__instance.gameObject, __instance.usableItems[mid].inventoryID);
         }
     }
     catch (Exception exception)
     {
         Log.Error($"UsedMedicalItem error: {exception}");
         return;
     }
 }
Ejemplo n.º 8
0
        private static void Prefix(ConsumableAndWearableItems __instance, ConsumableAndWearableItems.HealAnimation healAnimation, int mid)
        {
            try
            {
                if (healAnimation == ConsumableAndWearableItems.HealAnimation.DequipMedicalItem)
                {
                    var ev = new UsedMedicalItemEventArgs(API.Features.Player.Get(__instance.gameObject), __instance.usableItems[mid].inventoryID);

                    Player.OnMedicalItemUsed(ev);
                }
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"Exiled.Events.Patches.Events.Player.UsedMedicalItem: {e}\n{e.StackTrace}");
            }
        }
Ejemplo n.º 9
0
        private static void Prefix(ConsumableAndWearableItems __instance, ConsumableAndWearableItems.HealAnimation healAnimation, int mid)
        {
            try
            {
                if (healAnimation == ConsumableAndWearableItems.HealAnimation.DequipMedicalItem)
                {
                    var ev = new DequippedMedicalItemEventArgs(API.Features.Player.Get(__instance.gameObject), __instance.usableItems[mid].inventoryID);

                    Player.OnMedicalItemDequipped(ev);
                }
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"{typeof(DequippedMedicalItem).FullName}:\n{e}");
            }
        }
Ejemplo n.º 10
0
        public static void Postfix(ConsumableAndWearableItems __instance, int mid)
        {
            ReferenceHub player   = ReferenceHub.GetHub(__instance.gameObject);
            ItemType     itemtype = __instance.usableItems[mid].inventoryID;

            Log.Debug($"[MedicalUsedPatch] {player?.GetNickname()} mid:{mid}/{itemtype}");

            if (itemtype == ItemType.Medkit || itemtype == ItemType.SCP500)
            {
                if (Coroutines.DOTDamages.TryGetValue(player, out CoroutineHandle handle))
                {
                    Log.Debug($"[939DOT] Removed {player.GetNickname()}");
                    Timing.KillCoroutines(handle);
                    Coroutines.DOTDamages.Remove(player);
                }
            }
        }
Ejemplo n.º 11
0
        public static bool Prefix(ConsumableAndWearableItems __instance)
        {
            if (EventPlugin.UseMedicalPatchDisable)
            {
                return(true);
            }

            try
            {
                if (!__instance._interactRateLimit.CanExecute())
                {
                    return(false);
                }

                __instance.cancel = false;

                if (__instance.cooldown > 0.0)
                {
                    return(false);
                }

                for (int i = 0; i < __instance.usableItems.Length; ++i)
                {
                    if (__instance.usableItems[i].inventoryID == __instance.inv.curItem && __instance.usableCooldowns[i] <= 0.0)
                    {
                        bool allow = true;

                        Events.InvokeUseMedicalItem(__instance.gameObject, __instance.inv.curItem, ref __instance.usableItems[i].animationDuration, ref allow);

                        if (allow)
                        {
                            Timing.RunCoroutine(__instance.UseMedicalItem(i), Segment.FixedUpdate);
                        }
                    }
                }

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"UseMedicalItemEvent error: {exception}");
                return(true);
            }
        }
Ejemplo n.º 12
0
        private static bool Prefix(ConsumableAndWearableItems __instance)
        {
            try
            {
                if (!__instance._interactRateLimit.CanExecute(true))
                {
                    return(false);
                }

                __instance._cancel = false;
                if (__instance.cooldown > 0f)
                {
                    return(false);
                }

                for (int i = 0; i < __instance.usableItems.Length; ++i)
                {
                    if (__instance.usableItems[i].inventoryID == __instance._hub.inventory.curItem &&
                        __instance.usableCooldowns[i] <= 0.0)
                    {
                        var ev = new UsingMedicalItemEventArgs(Player.Get(__instance.gameObject), __instance._hub.inventory.curItem, __instance.usableItems[i].animationDuration);

                        Handlers.Player.OnUsingMedicalItem(ev);

                        __instance.cooldown = ev.Cooldown;

                        if (ev.IsAllowed)
                        {
                            Timing.RunCoroutine(__instance.UseMedicalItem(i), Segment.FixedUpdate);
                        }
                    }
                }

                return(false);
            }
            catch (Exception exception)
            {
                Log.Error($"Exiled.Events.Patches.Events.Player.UsingMedicalItem: {exception}\n{exception.StackTrace}");

                return(true);
            }
        }
Ejemplo n.º 13
0
        private static bool Prefix(ConsumableAndWearableItems __instance)
        {
            if (!__instance._interactRateLimit.CanExecute(true))
            {
                return(false);
            }

            __instance._cancel = false;
            if (__instance.cooldown > 0f)
            {
                return(false);
            }

            for (int i = 0; i < __instance.usableItems.Length; i++)
            {
                if (__instance.usableItems[i].inventoryID == __instance._hub.inventory.curItem && __instance.usableCooldowns[i] <= 0f)
                {
                    try
                    {
                        var player = __instance.GetPlayer();
                        var item   = player.ItemInHand;
                        var allow  = true;
                        Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Initiating, ref allow);
                        if (!allow)
                        {
                            return(false);
                        }
                    }
                    catch (Exception e)
                    {
                        Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent Initiating failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    Timing.RunCoroutine(UseMedialItem(__instance, i));
                }
            }

            return(false);
        }
Ejemplo n.º 14
0
        public static IEnumerator <float> UseMedialItem(ConsumableAndWearableItems consumable, int mid)
        {
            //The only line you can decompile
            if (!NetworkServer.active)
            {
                yield break;
            }

            //Geting all variables
            var player     = consumable.GetPlayer();
            var item       = player.ItemInHand;
            var usableitem = consumable.usableItems[mid];

            //Start Animation
            consumable.healInProgress = true;
            consumable.SendRpc(ConsumableAndWearableItems.HealAnimation.StartHealing, mid);

            //Wait for Animation
            var start = UnityEngine.Time.time;

            while (UnityEngine.Time.time <= start + usableitem.animationDuration)
            {
                yield return(Timing.WaitForOneFrame);

                if (consumable._cancel && UnityEngine.Time.time < start + usableitem.cancelableTime)
                {
                    consumable.SendRpc(ConsumableAndWearableItems.HealAnimation.CancelHealing, mid);
                    yield break;
                }
            }

            //End Animation
            consumable.SendRpc(ConsumableAndWearableItems.HealAnimation.DequipMedicalItem, mid);

            //Event
            try
            {
                var allow = true;
                Server.Get.Events.Player.InvokePlayerItemUseEvent(player, item, ItemInteractState.Finalizing, ref allow);
                if (!allow)
                {
                    yield break;
                }
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerItemUseEvent finalizing failed!!\n{e}");
            }

            //Set Cooldown
            consumable.usableCooldowns[mid] = usableitem.cooldownAfterUse;
            consumable.RpcSetCooldown(mid, usableitem.cooldownAfterUse);

            //Adding Health/ArtificialHealth
            if (usableitem.instantHealth > 0)
            {
                player.PlayerStats.HealHPAmount(usableitem.instantHealth);
            }
            if (usableitem.artificialHealth > 0)
            {
                player.ArtificialHealth += usableitem.artificialHealth;
            }


            //Give Effects
            foreach (var effectstring in usableitem.effectsToInitialize)
            {
                var split = effectstring.Split('=');
                if (split.Count() > 1)
                {
                    player.PlayerEffectsController.EnableByString(split[0], float.Parse(split[1]));
                }
                else
                {
                    player.PlayerEffectsController.EnableByString(effectstring);
                }
            }

            //Scp500
            if (usableitem.inventoryID == ItemType.SCP500)
            {
                player.PlayerEffectsController.UseMedicalItem(usableitem.inventoryID);
            }

            consumable.healInProgress = false;

            //Destroy Item if it is one time use
            if (usableitem.inventoryID != ItemType.SCP268)
            {
                item.Destroy();
            }

            //HealOver Time
            if (usableitem.regenOverTime != null)
            {
                var process = new ConsumableAndWearableItems.HealthRegenerationProcess(usableitem.regenOverTime);
                var curve   = usableitem.regenOverTime;

                //TODO: fix this so that it actualy use the animation curve from above

                float HptoHeal;
                float time;
                switch (usableitem.inventoryID)
                {
                case ItemType.SCP500:
                    HptoHeal = 38;
                    time     = 12;
                    break;

                case ItemType.Adrenaline:
                    HptoHeal = 49;
                    time     = 20;
                    break;

                case ItemType.Painkillers:
                    HptoHeal = 26;
                    time     = 26;
                    break;

                default: yield break;
                }

                for (float i = 0; i <= time; i += time / HptoHeal)
                {
                    yield return(Timing.WaitForSeconds(time / HptoHeal));

                    consumable.hpToHeal++;
                }
            }
        }