internal void InvokePickup(SOPickupEventArgs ev) => PickupEvent?.Invoke(ev);
        private static bool OnPickup(SearchCoordinator __instance)
        {
            try
            {
                var item      = __instance.Completor.TargetPickup?.GetSynapseItem();
                var schematic = item.PickupBase?.GetComponent <SynapseObjectScript>();
                var def       = schematic?.Object as DefaultSynapseObject;

                if (item == null)
                {
                    return(true);
                }

                if (!item.CanBePickedUp && (def == null || def.Parent.ItemParent == null))
                {
                    __instance.SessionPipe.Invalidate();
                    return(false);
                }

                if (__instance.Completor.ValidateUpdate())
                {
                    if (NetworkTime.time < __instance.SessionPipe.Session.FinishTime)
                    {
                        return(false);
                    }

                    var player = __instance.GetPlayer();
                    var allow  = true;

                    var change = def?.Parent?.ItemParent != null;
                    if (change)
                    {
                        item = def.Parent.ItemParent;
                    }

                    try
                    {
                        if (schematic != null)
                        {
                            var ev = new SOPickupEventArgs
                            {
                                Object = schematic.Object as SynapseItemObject,
                                Player = player
                            };
                            Server.Get.Events.SynapseObject.InvokePickup(ev);
                            if (!ev.Allow)
                            {
                                __instance.SessionPipe.Invalidate();
                                return(false);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Get.Error($"Synapse-Event: SynapseObject Pickup failed!!\n{ex}");
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerPickUpEvent(player, item, out allow);
                    }
                    catch (Exception e)
                    {
                        Logger.Get.Error($"Synapse-Event: PlayerPickUp failed!!\n{e}");
                    }

                    if (!allow)
                    {
                        __instance.SessionPipe.Invalidate();
                        return(false);
                    }

                    if (change)
                    {
                        __instance.SessionPipe.Invalidate();
                        player.Inventory.AddItem(def.Parent.ItemParent);
                        return(false);
                    }

                    __instance.Completor.Complete();
                }
                else
                {
                    __instance.SessionPipe.Invalidate();
                }

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerPickUp Patch failed!!\n{e}");
                return(true);
            }
        }
Beispiel #3
0
        private static bool OnPickup(SearchCoordinator __instance)
        {
            try
            {
                var item = __instance.Completor.TargetPickup?.GetSynapseItem();

                if (item == null)
                {
                    return(true);
                }

                if (item.CanBePickedUp && __instance.Completor.ValidateUpdate())
                {
                    if (NetworkTime.time < __instance.SessionPipe.Session.FinishTime)
                    {
                        return(false);
                    }

                    var player = __instance.GetPlayer();
                    var allow  = true;

                    try
                    {
                        if (item.PickupBase.gameObject.TryGetComponent <SynapseObjectScript>(out var obj))
                        {
                            var ev = new SOPickupEventArgs
                            {
                                Object = obj.Object as SynapseItemObject,
                                Player = player
                            };
                            Server.Get.Events.SynapseObject.InvokePickup(ev);
                            if (!ev.Allow)
                            {
                                __instance.SessionPipe.Invalidate();
                                return(false);
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        Logger.Get.Error($"Synapse-Event: SynapseObject Pickup failed!!\n{ex}");
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerPickUpEvent(player, item, out allow);
                    }
                    catch (Exception e)
                    {
                        Logger.Get.Error($"Synapse-Event: PlayerPickUp failed!!\n{e}");
                    }

                    if (!allow)
                    {
                        __instance.SessionPipe.Invalidate();
                        return(false);
                    }

                    __instance.Completor.Complete();
                }
                else
                {
                    __instance.SessionPipe.Invalidate();
                }

                return(false);
            }
            catch (Exception e)
            {
                Logger.Get.Error($"Synapse-Event: PlayerPickUp Patch failed!!\n{e}");
                return(true);
            }
        }