예제 #1
0
        public static bool Prefix(NetworkConnection conn, DisarmMessage msg)
        {
            try
            {
                if (!DisarmingHandlers.ServerCheckCooldown(conn) || !ReferenceHub.TryGetHub(conn.identity.gameObject, out ReferenceHub hub))
                {
                    return(false);
                }

                if (!msg.PlayerIsNull)
                {
                    Vector3 vector3 = msg.PlayerToDisarm.transform.position - hub.transform.position;
                    if (vector3.sqrMagnitude > 20.0 || (msg.PlayerToDisarm.inventory.CurInstance is not null && msg.PlayerToDisarm.inventory.CurInstance.TierFlags != ItemTierFlags.Common))
                    {
                        return(false);
                    }
                }

                bool flag1 = !msg.PlayerIsNull && msg.PlayerToDisarm.inventory.IsDisarmed();
                bool flag2 = !msg.PlayerIsNull && hub.CanDisarm(msg.PlayerToDisarm);

                if (flag1 && !msg.Disarm)
                {
                    if (!hub.inventory.IsDisarmed())
                    {
                        var ev = new RemovingHandcuffsEventArgs(API.Features.Player.Get(hub), API.Features.Player.Get(msg.PlayerToDisarm));

                        Player.OnRemovingHandcuffs(ev);

                        if (!ev.IsAllowed)
                        {
                            return(false);
                        }

                        msg.PlayerToDisarm.inventory.SetDisarmedStatus(null);
                    }
                }
                else if (!flag1 & flag2 && msg.Disarm)
                {
                    if (msg.PlayerToDisarm.inventory.CurInstance is null || msg.PlayerToDisarm.inventory.CurInstance.CanHolster())
                    {
                        if (msg.PlayerToDisarm.characterClassManager.CurRole.team == Team.MTF && hub.characterClassManager.CurClass == RoleType.ClassD)
                        {
                            AchievementHandlerBase.ServerAchieve(hub.networkIdentity.connectionToClient, AchievementName.TablesHaveTurned);
                        }

                        var ev = new HandcuffingEventArgs(API.Features.Player.Get(hub), API.Features.Player.Get(msg.PlayerToDisarm));

                        Player.OnHandcuffing(ev);

                        if (!ev.IsAllowed)
                        {
                            return(false);
                        }

                        msg.PlayerToDisarm.inventory.SetDisarmedStatus(hub.inventory);
                    }
                }
                else
                {
                    hub.networkIdentity.connectionToClient.Send <DisarmedPlayersListMessage>(DisarmingHandlers.NewDisarmedList, 0);
                    return(false);
                }

                DisarmingHandlers.NewDisarmedList.SendToAuthenticated <DisarmedPlayersListMessage>();

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

                return(true);
            }
        }
예제 #2
0
        private static bool OnDisarm(NetworkConnection conn, DisarmMessage msg)
        {
            try
            {
                var cuffer = conn.GetPlayer();
                var target = msg.PlayerToDisarm?.GetPlayer();

                if (!msg.PlayerIsNull)
                {
                    if ((msg.PlayerToDisarm.transform.position - cuffer.Position).sqrMagnitude > 20f)
                    {
                        return(false);
                    }

                    if (msg.PlayerToDisarm.inventory.CurInstance != null && msg.PlayerToDisarm.inventory.CurInstance.TierFlags != ItemTierFlags.Common)
                    {
                        return(false);
                    }
                }

                var flag  = !msg.PlayerIsNull && msg.PlayerToDisarm.inventory.IsDisarmed();
                var flag2 = !msg.PlayerIsNull && DisarmedPlayers.CanDisarm(cuffer.Hub, msg.PlayerToDisarm);

                if (flag && !msg.Disarm)
                {
                    if (!cuffer.IsCuffed)
                    {
                        SynapseController.Server.Events.Player.InvokeUncuff(cuffer, target, out var allow);
                        if (!allow)
                        {
                            return(false);
                        }
                        msg.PlayerToDisarm.inventory.SetDisarmedStatus(null);
                    }
                }
                else
                {
                    if (flag || !flag2 || !msg.Disarm)
                    {
                        cuffer.NetworkIdentity.connectionToClient.Send(DisarmingHandlers.NewDisarmedList, 0);
                        return(false);
                    }
                    if (msg.PlayerToDisarm.inventory.CurInstance == null || msg.PlayerToDisarm.inventory.CurInstance.CanHolster())
                    {
                        SynapseController.Server.Events.Player.InvokePlayerCuffTargetEvent(target, cuffer, out var allow2);

                        if (!allow2)
                        {
                            return(false);
                        }

                        msg.PlayerToDisarm.inventory.SetDisarmedStatus(cuffer.VanillaInventory);
                    }
                }

                NetworkServer.SendToAll(DisarmingHandlers.NewDisarmedList, 0, false);
                return(false);
            }
            catch (Exception e)
            {
                Synapse.Api.Logger.Get.Error($"Synapse-Event: PlayerCuffTarget event failed!!\n{e}");
                return(true);
            }
        }