/// <summary>Stores the shot data to the repository and invokes module extension points.</summary>
        private void ShootingRangeOnShot(object sender, ShotEventArgs e)
        {
            if (_sessionsAwaitingProgramNumber.ContainsKey(e.LaneNumber))
            {
                Session session = _sessionsAwaitingProgramNumber[e.LaneNumber];
                _sessionsAwaitingProgramNumber.Remove(e.LaneNumber);
                _sessionsOngoing.Add(e.LaneNumber, session);
                session.ProgramNumber = e.ProgramNumber;
                _sessionDataStore.Create(session);

                SubSession subSession = session.CreateSubSession();
                _sessionSubtotalDataStore.Create(subSession);

                AddShotToSubsession(e, subSession);
            }
            else if (_sessionsOngoing.ContainsKey(e.LaneNumber))
            {
                Session    session    = _sessionsOngoing[e.LaneNumber];
                SubSession subSession = session.CurrentSubsession();
                if (subSession.SessionSubtotalId == 0)
                {
                    _sessionSubtotalDataStore.Create(subSession);
                }
                AddShotToSubsession(e, subSession);
            }
            else
            {
                throw new InvalidOperationException("Session is not available.");
            }
        }
Example #2
0
 private static void OnShot(ShotEventArgs ev)
 {
     if (Scp457.Get(ev.Target) != null && ev.Hitbox._dmgMultiplier == HitboxIdentity.DamagePercent.Headshot)
     {
         ev.Damage /= 4;
     }
 }
        /// <summary>
        /// Выстрел по мне.
        /// </summary>
        private async void MyGameField_ShotMyField(object sender, ShotEventArgs e)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                Rectangle rectangle = new Rectangle();
                Player1Grid.Children.Add(rectangle);
                Grid.SetColumn(rectangle, e.Hits[0].X);
                Grid.SetRow(rectangle, e.Hits[0].Y);

                if (e.ShotResult == Game.ShotResult.Miss) //промах
                {
                    rectangle.Fill = new SolidColorBrush(killColor);
                    Model.CanShot  = true;
                }
                else if (e.ShotResult == Game.ShotResult.Damage) //ранил
                {
                    SetImage("ms-appx:///Assets/Ships/Hurt.png", 1, 1, e.Hits[0].X, e.Hits[0].Y, Player1Grid);
                    Model.CanShot = false;
                }
                else if (e.ShotResult == Game.ShotResult.Kill) //убил
                {
                    Ship s          = (Ship)e.Ship.Clone();
                    ClientShip ship = new ClientShip(s.Id, s.ShipClass, s.Orientation, s.Location); // сюда передается кораблик

                    KillShip(ship, Player1Grid);
                    SetImage("ms-appx:///Assets/Ships/Hurt.png", ship.ShipWidth, ship.ShipHeight, ship.Location.X, ship.Location.Y, Player1Grid);
                    Model.CanShot = false;
                }
            });

            if (MyGameField.IsGameOver)
            {
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    Canvas.SetZIndex(panel, 7);
                    panel.Background           = new SolidColorBrush(Colors.White);
                    tbGameResult.Text          = "Вы проиграли";
                    btnStartNewGame.Visibility = Visibility.Visible;
                });
            }

            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                if (Model.CanShot == true)
                {
                    tbWait.Visibility     = Visibility.Collapsed;
                    tbGo.Visibility       = Visibility.Visible;
                    progressRing.IsActive = false;
                }
                else
                {
                    StateObject state = new StateObject();
                    state.workSocket  = Model.PlayerSocket;
                    state.obj         = MyGameField;

                    Model.PlayerSocket.BeginReceive(state.buffer, 0, StateObject.BufferSize, SocketFlags.None, new AsyncCallback(ReceiveCallbackEnemyShot), state);
                }
            });
        }
Example #4
0
 private void _battleTheatre_ShotLanded(object sender, ShotEventArgs e)
 {
     if (e.Team != Team)
     {
         //trigger a battle status update to check the state of the ship
         BattleStatusUpdate(e.Location, e.Id);
     }
 }
Example #5
0
        protected virtual void OnShot(ShotEventArgs e)
        {
            EventHandler <ShotEventArgs> handler = Shot;

            if (handler != null)
            {
                handler(this, e);
            }
        }
Example #6
0
        private void OnShot(ShotEventArgs ev)
        {
            Player target = Player.Get(ev.Target);

            if (target != null && target == _player && target.Role != _player.Role)
            {
                UnDisguise();
            }
        }
        public void OnPlayerShotByPlayer(PlayerShotByPlayerEvent e)
        {
            var @event = new ShotEventArgs(Player.Get(e.Shooter.gameObject), e.Player.gameObject, e.HitBoxType, e.Distance, e.HitInfo.Amount);

            Handlers.Player.OnShot(@event);
            if ([email protected])
            {
                e.Cancelled = true;
            }
        }
 private void ShootingRangeOnBestShot(object sender, ShotEventArgs e)
 {
     if (_sessionsOngoing.ContainsKey(e.LaneNumber))
     {
         SubSession currentSubSession = _sessionsOngoing[e.LaneNumber].CurrentSubsession();
         Shot       shot =
             _shotDataStore.FindBySubSessionId(currentSubSession.SessionSubtotalId)
             .Single(_ => _.Ordinal == e.Ordinal);
         currentSubSession.BestShotId = shot.ShotId;
         _sessionSubtotalDataStore.Update(currentSubSession);
     }
 }
        private void AddShotToSubsession(ShotEventArgs e, SubSession subSession)
        {
            Shot shot = new Shot
            {
                PrimaryScore   = e.PrimaryScore,
                SecondaryScore = e.SecondaryScore,
                LaneNumber     = e.LaneNumber,
                SubtotalId     = subSession.SessionSubtotalId,
                Ordinal        = e.Ordinal,
            };

            _shotDataStore.Create(shot);
        }
Example #10
0
        public void ProcessShotMessage(ShotMessage shotMessage)
        {
            ShotEventArgs e = new ShotEventArgs
            {
                PrimaryScore   = shotMessage.PrimaryScore,
                SecondaryScore = shotMessage.SecondaryScore,
                ProgramNumber  = shotMessage.ProgramNumber,
                LaneNumber     = shotMessage.LaneNumber,
                LaneId         = shotMessage.LaneId,
                Ordinal        = shotMessage.ShotNbr,
            };

            OnShot(e);
        }
Example #11
0
        public void ProcessBestShotMessage(BestShotMessage bestShotMessage)
        {
            ShotEventArgs e = new ShotEventArgs
            {
                PrimaryScore   = bestShotMessage.PrimaryScore,
                SecondaryScore = bestShotMessage.SecondaryScore,
                ProgramNumber  = bestShotMessage.ProgramNumber,
                LaneNumber     = bestShotMessage.LaneNumber,
                LaneId         = bestShotMessage.LaneId,
                Ordinal        = bestShotMessage.ShotNbr,
            };

            OnBestShot(e);
        }
Example #12
0
        internal void Shot(ShotEventArgs ev)
        {
            if (Plugin.Instance.Config.Shot == "")
            {
                return;
            }
            string message = Plugin.Instance.Config.Shot.Replace("%player%", ev.Shooter.ToString());


            if (Plugin.Instance.Config.debug_to_console)
            {
                Log.Debug(message: "[ " + Plugin.Instance.Config.player_name + "] " + message);
            }
            Plugin.sendWebHook(Plugin.Instance.Config.player_url, message, Plugin.Instance.Config.player_name);
        }
Example #13
0
 private void OnPlayerShot(ShotEventArgs ev)
 {
     if (Scp999Manager.IsScp999(ev.Shooter))
     {
         ev.Damage = 0;
         var referenceHub = ev.Target.GetComponent <ReferenceHub>();
         if (referenceHub != null)
         {
             var player = Player.Get(referenceHub);
             if (player.Health + Config.HealPerShot <= player.MaxHealth * Config.MaxHealPercent / 100)
             {
                 player.Health += Config.HealPerShot;
             }
         }
     }
 }
        /// <summary>
        /// выстрел по противнику
        /// </summary>
        private async void EnemyGameField_EnemyShot(object sender, ShotEventArgs e)
        {
            await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
            {
                Rectangle rectangle = new Rectangle();
                Player2Grid.Children.Add(rectangle);
                Grid.SetColumn(rectangle, e.Hits[0].X);
                Grid.SetRow(rectangle, e.Hits[0].Y);

                if (e.ShotResult == Game.ShotResult.Miss) //промах
                {
                    rectangle.Fill = new SolidColorBrush(killColor);
                    Model.CanShot  = false;
                }
                else if (e.ShotResult == Game.ShotResult.Damage) //ранил
                {
                    SetImage("ms-appx:///Assets/Ships/Hurt.png", 1, 1, e.Hits[0].X, e.Hits[0].Y, Player2Grid);
                    Model.CanShot = true;
                }
                else if (e.ShotResult == Game.ShotResult.Kill) //убил
                {
                    Ship s          = (Ship)e.Ship.Clone();
                    ClientShip ship = new ClientShip(s.Id, s.ShipClass, s.Orientation, s.Location);

                    KillShip(ship, Player2Grid);
                    SetImage(ship.Source, ship.ShipWidth, ship.ShipHeight, ship.Location.X, ship.Location.Y, Player2Grid);
                    Model.CanShot = true;
                }
            });

            if (EnemyGameField.IsGameOver)
            {
                await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
                {
                    Canvas.SetZIndex(panel, 7);
                    panel.Background           = new SolidColorBrush(Colors.White);
                    tbGameResult.Text          = "Вы победили";
                    btnStartNewGame.Visibility = Visibility.Visible;
                });
            }

            await AwaitEnemyView();
        }
Example #15
0
 /// <summary>
 /// Invoked after a player's shot.
 /// </summary>
 /// <param name="ev">The <see cref="ShotEventArgs"/> instance.</param>
 public static void OnShot(ShotEventArgs ev) => Shot.InvokeSafely(ev);
Example #16
0
        private static bool Prefix(WeaponManager __instance, GameObject target, HitBoxType hitboxType, Vector3 dir, Vector3 sourcePos, Vector3 targetPos)
        {
            try
            {
                bool npc = Npc.Dictionary.ContainsKey(__instance.gameObject);

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

                int itemIndex = __instance._hub.inventory.GetItemIndex();

                if (!npc)
                {
                    if (itemIndex < 0 ||
                        itemIndex >= __instance._hub.inventory.items.Count ||
                        __instance.curWeapon < 0 ||
                        __instance._hub.inventory.curItem != __instance.weapons[__instance.curWeapon].inventoryID ||
                        __instance._hub.inventory.items[itemIndex].durability <= 0.0)
                    {
                        return(false);
                    }

                    if (Vector3.Distance(__instance._hub.playerMovementSync.RealModelPosition, sourcePos) > 5.5f)
                    {
                        __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.6 (difference between real source position and provided source position is too big)", "gray");
                        return(false);
                    }

                    if (sourcePos.y - __instance._hub.playerMovementSync.LastSafePosition.y > 1.78f)
                    {
                        __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.7 (Y axis difference between last safe position and provided source position is too big)", "gray");
                        return(false);
                    }

                    if (Math.Abs(sourcePos.y - __instance._hub.playerMovementSync.RealModelPosition.y) > 2.7f)
                    {
                        __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.8 (|Y| axis difference between real position and provided source position is too big)", "gray");
                        return(false);
                    }
                }

                if ((__instance._reloadCooldown > 0f || __instance._fireCooldown > 0f) && !__instance.isLocalPlayer)
                {
                    return(false);
                }

                Log.Debug("Invoking shooting event", Loader.ShouldDebugBeShown);

                var shootingEventArgs = new ShootingEventArgs(Player.Get(__instance.gameObject), target, targetPos);

                Exiled.Events.Handlers.Player.OnShooting(shootingEventArgs);

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

                targetPos = shootingEventArgs.Position;

                // <Exiled
                if (!npc)
                {
                    __instance._hub.inventory.items.ModifyDuration(itemIndex, __instance._hub.inventory.items[itemIndex].durability - 1f);
                }
                __instance.scp268.ServerDisable();
                __instance._fireCooldown = 1f / (__instance.weapons[__instance.curWeapon].shotsPerSecond * __instance.weapons[__instance.curWeapon].allEffects.firerateMultiplier) * 0.9f;

                float sourceRangeScale = __instance.weapons[__instance.curWeapon].allEffects.audioSourceRangeScale;
                sourceRangeScale = sourceRangeScale * sourceRangeScale * 70f;
                __instance.GetComponent <Scp939_VisionController>().MakeNoise(Mathf.Clamp(sourceRangeScale, 5f, 100f));

                bool flag = target != null;
                if (targetPos == Vector3.zero)
                {
                    if (Physics.Raycast(sourcePos, dir, out RaycastHit raycastHit, 500f, __instance.raycastMask))
                    {
                        HitboxIdentity component = raycastHit.collider.GetComponent <HitboxIdentity>();
                        if (component != null)
                        {
                            WeaponManager componentInParent = component.GetComponentInParent <WeaponManager>();
                            if (componentInParent != null)
                            {
                                flag       = false;
                                target     = componentInParent.gameObject;
                                hitboxType = component.id;
                                targetPos  = componentInParent.transform.position;
                            }
                        }
                    }
                }
                else if (Physics.Linecast(sourcePos, targetPos, out RaycastHit raycastHit, __instance.raycastMask))
                {
                    HitboxIdentity component = raycastHit.collider.GetComponent <HitboxIdentity>();
                    if (component != null)
                    {
                        WeaponManager componentInParent = component.GetComponentInParent <WeaponManager>();
                        if (componentInParent != null)
                        {
                            if (componentInParent.gameObject == target)
                            {
                                flag = false;
                            }
                            else if (componentInParent.scp268.Enabled)
                            {
                                flag       = false;
                                target     = componentInParent.gameObject;
                                hitboxType = component.id;
                                targetPos  = componentInParent.transform.position;
                            }
                        }
                    }
                }

                ReferenceHub referenceHub = null;
                if (target != null)
                {
                    referenceHub = ReferenceHub.GetHub(target);
                }

                if (referenceHub != null && __instance.GetShootPermission(referenceHub.characterClassManager, false))
                {
                    if (!npc)
                    {
                        if (Math.Abs(__instance._hub.playerMovementSync.RealModelPosition.y - referenceHub.playerMovementSync.RealModelPosition.y) > 35f)
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.1 (too big Y-axis difference between source and target)", "gray");
                            return(false);
                        }

                        if (Vector3.Distance(referenceHub.playerMovementSync.RealModelPosition, targetPos) > 5f)
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.2 (difference between real target position and provided target position is too big)", "gray");
                            return(false);
                        }

                        if (Physics.Linecast(__instance._hub.playerMovementSync.RealModelPosition, sourcePos, __instance.raycastServerMask))
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.3 (collision between source positions detected)", "gray");
                            return(false);
                        }

                        if (flag && Physics.Linecast(sourcePos, targetPos, __instance.raycastServerMask))
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.4 (collision on shot line detected)", "gray");
                            return(false);
                        }

                        if (referenceHub.gameObject == __instance.gameObject)
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.5 (target is itself)", "gray");
                            return(false);
                        }

                        Vector3 positionOffset = referenceHub.playerMovementSync.RealModelPosition - __instance._hub.playerMovementSync.RealModelPosition;
                        float   sqrMagnitude   = positionOffset.sqrMagnitude;
                        if (Math.Abs(positionOffset.y) < 10f && sqrMagnitude > 7.84f && (referenceHub.characterClassManager.CurClass != global::RoleType.Scp0492 || sqrMagnitude > 9f) && ((referenceHub.characterClassManager.CurClass != global::RoleType.Scp93953 && referenceHub.characterClassManager.CurClass != global::RoleType.Scp93989) || sqrMagnitude > 18.49f))
                        {
                            float angl = Math.Abs(global::Misc.AngleIgnoreY(positionOffset, __instance.transform.forward));
                            if (angl > 45f)
                            {
                                __instance.GetComponent <global::CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.12 (too big angle)", "gray");
                                return(false);
                            }
                            if (__instance._lastAngleReset > 0f && angl > 25f && Math.Abs(global::Misc.AngleIgnoreY(positionOffset, __instance._lastAngle)) > 60f)
                            {
                                __instance._lastAngle      = positionOffset;
                                __instance._lastAngleReset = 0.4f;
                                __instance.GetComponent <global::CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.13 (too big angle v2)", "gray");
                                return(false);
                            }
                            __instance._lastAngle      = positionOffset;
                            __instance._lastAngleReset = 0.4f;
                        }
                        if (__instance._lastRotationReset > 0f && (__instance._hub.playerMovementSync.Rotations.x < 68f || __instance._hub.playerMovementSync.Rotations.x > 295f))
                        {
                            float num5 = __instance._hub.playerMovementSync.Rotations.x - __instance._lastRotation;
                            if (num5 >= 0f && num5 <= 0.0005f)
                            {
                                __instance._lastRotation      = __instance._hub.playerMovementSync.Rotations.x;
                                __instance._lastRotationReset = 0.35f;
                                __instance.GetComponent <global::CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code W.9 (no recoil)", "gray");
                                return(false);
                            }
                        }
                        __instance._lastRotation      = __instance._hub.playerMovementSync.Rotations.x;
                        __instance._lastRotationReset = 0.35f;
                    }

                    float num2 = Vector3.Distance(__instance.camera.transform.position, target.transform.position);
                    float num3 = __instance.weapons[(int)__instance.curWeapon].damageOverDistance.Evaluate(num2);
                    switch (referenceHub.characterClassManager.CurClass)
                    {
                    case RoleType.Scp106:
                        num3 /= 10f;
                        goto IL_6D1;

                    case RoleType.Scp049:
                    case RoleType.Scp079:
                    case RoleType.Scp096:
                    case RoleType.Scp173:
                    case RoleType.Scp93953:
                    case RoleType.Scp93989:
                        goto IL_6D1;

                    default:
                        switch (hitboxType)
                        {
                        case HitBoxType.HEAD:
                            num3 *= 4;
                            float num4 = 1 / (__instance.weapons[(int)__instance.curWeapon].shotsPerSecond * __instance.weapons[(int)__instance.curWeapon].allEffects.firerateMultiplier);
                            __instance._headshotsL++;
                            __instance._headshotsS++;
                            __instance._headshotsResetS = num4 * 1.86f;
                            __instance._headshotsResetL = num4 * 2.9f;

                            if (__instance._headshotsS >= 3)
                            {
                                __instance._hub.playerMovementSync.AntiCheatKillPlayer("Headshots limit exceeded in time window A\n(debug code: W.10)", "W.10");
                                return(false);
                            }

                            if (__instance._headshotsL >= 4)
                            {
                                __instance._hub.playerMovementSync.AntiCheatKillPlayer("Headshots limit exceeded in time window B\n(debug code: W.11)", "W.11");
                                return(false);
                            }

                            break;

                        case HitBoxType.ARM:
                        case HitBoxType.LEG:
                            num3 /= 2;
                            break;
                        }

                        break;
                    }

IL_6D1:
                    num3 *= __instance.weapons[(int)__instance.curWeapon].allEffects.damageMultiplier;
                    num3 *= __instance.overallDamagerFactor;

                    // >Exiled
                    Log.Debug("Invoking late shoot.", Loader.ShouldDebugBeShown);

                    var shotEventArgs = new ShotEventArgs(Player.Get(__instance.gameObject), target, hitboxType, num2, num3);

                    Exiled.Events.Handlers.Player.OnShot(shotEventArgs);

                    if (!shotEventArgs.CanHurt)
                    {
                        return(false);
                    }

                    // <Exiled
                    __instance._hub.playerStats.HurtPlayer(
                        new PlayerStats.HitInfo(
                            shotEventArgs.Damage,
                            __instance._hub.LoggedNameFromRefHub(),
                            DamageTypes.FromWeaponId(__instance.curWeapon),
                            __instance._hub.queryProcessor.PlayerId),
                        referenceHub.gameObject);

                    __instance.RpcConfirmShot(hitmarker: true, __instance.curWeapon);
                    __instance.PlaceDecal(isBlood: true, new Ray(__instance.camera.position, dir), (int)referenceHub.characterClassManager.CurClass, num2);
                }
                else if (target != null && hitboxType == HitBoxType.WINDOW && target.GetComponent <BreakableWindow>() != null)
                {
                    float time   = Vector3.Distance(__instance.camera.transform.position, target.transform.position);
                    float damage = __instance.weapons[__instance.curWeapon].damageOverDistance.Evaluate(time);
                    target.GetComponent <BreakableWindow>().ServerDamageWindow(damage);
                    __instance.RpcConfirmShot(hitmarker: true, __instance.curWeapon);
                }
                else
                {
                    __instance.PlaceDecal(isBlood: false, new Ray(__instance.camera.position, dir), __instance.curWeapon, 0f);
                    __instance.RpcConfirmShot(hitmarker: false, __instance.curWeapon);
                }

                return(false);
            }
            catch (Exception e)
            {
                Exiled.API.Features.Log.Error($"{typeof(ShootFixPatch).FullName}.{nameof(Prefix)}:\n{e}");

                return(true);
            }
        }
 //-----------------------------------------------------------------------------------------------------
 public void cshot_Shot(object o, ShotEventArgs e)
 {
     try
     {
         StringBuilder sb = new StringBuilder();
         StringWriter  sw = new StringWriter(sb);
         using (JsonWriter writer = new JsonTextWriter(sw))
         {
             writer.Formatting = Formatting.None;
             writer.WriteStartArray();
             writer.WriteValue((int)ServerOpcode.play); //8
             writer.WriteStartArray();
             if (e.User.Position == 0)
             {
                 writer.WriteValue(1); //2 - next_turn_number
             }
             else
             {
                 writer.WriteValue(0);           //2 - next_turn_number
             }
             writer.WriteValue(e.User.Position); //0 - player_number
             writer.WriteValue(e.xb);            //1022 - x
             writer.WriteValue(e.yb);            //121 - y
             writer.WriteValue(e.look);          //1 - look
             writer.WriteValue(1);               //845 - delay
             //writer.WriteValue(0); //1 - next_turn_of_player
             if (e.User.Position == 0)
             {
                 writer.WriteValue(1); //2 - next_turn_of_player
             }
             else
             {
                 writer.WriteValue(0); //2 - next_turn_of_player
             }
             writer.WriteStartArray();
             writer.WriteEndArray();
             writer.WriteValue(799);  //799 - thor_x
             writer.WriteValue(-420); //-420 - thor_y
             writer.WriteValue(0);    //24 - thor_angle
             writer.WriteValue(40);   //0 - thor_damage
             writer.WriteValue(1);    //33
             writer.WriteValue(0);    //0
             writer.WriteValue(234);  //326
             writer.WriteStartArray();
             writer.WriteStartObject();
             writer.WritePropertyName("start");
             writer.WriteStartObject();
             writer.WritePropertyName("x");
             writer.WriteValue(e.xf);    //1042
             writer.WritePropertyName("y");
             writer.WriteValue(e.yf);    //95
             writer.WritePropertyName("ang");
             writer.WriteValue(e.angle); //24
             writer.WritePropertyName("power");
             writer.WriteValue(e.power); //101
             writer.WritePropertyName("ax");
             writer.WriteValue(e.ax);    //0
             writer.WritePropertyName("ay");
             writer.WriteValue(e.ay);    //398
             writer.WriteEndObject();
             writer.WritePropertyName("exp");
             writer.WriteValue(0);      //0
             writer.WritePropertyName("img");
             writer.WriteValue(0);      //0
             writer.WritePropertyName("time");
             writer.WriteValue(e.time); //1340
             //"hole":[887,95,60,40],"damages":[]}],150]
             if (e.col == true)
             {
                 writer.WritePropertyName("hole");
                 writer.WriteStartArray();
                 writer.WriteValue(e.cx);  //x hole
                 writer.WriteValue(e.cy);  //y hole
                 writer.WriteValue(36);    //w
                 writer.WriteValue(40);    //h
                 writer.WriteEndArray();
                 writer.WritePropertyName("damages");
                 writer.WriteStartArray();
                 writer.WriteEndArray();
             }
             writer.WriteEndObject();
             writer.WriteEndArray();
             writer.WriteValue(150);
             writer.WriteEndArray();
             writer.WriteEndArray();
         }
         SendAll(sb.ToString());
     }
     catch (Exception ex)
     {
         LogConsole.Show(LogType.ERROR, ex.ToString());
     }
 }
Example #18
0
        private static bool Prefix(WeaponManager __instance, GameObject target, string hitboxType, Vector3 dir, Vector3 sourcePos, Vector3 targetPos)
        {
            try
            {
                if (!__instance._iawRateLimit.CanExecute(true))
                {
                    return(false);
                }
                int itemIndex = __instance._hub.inventory.GetItemIndex();
                if (itemIndex < 0 || itemIndex >= __instance._hub.inventory.items.Count || __instance.curWeapon < 0 ||
                    ((__instance._reloadCooldown > 0.0 || __instance._fireCooldown > 0.0) &&
                     !__instance.isLocalPlayer) ||
                    (__instance._hub.inventory.curItem != __instance.weapons[__instance.curWeapon].inventoryID ||
                     __instance._hub.inventory.items[itemIndex].durability <= 0.0))
                {
                    return(false);
                }

                Log.Debug("Invoking shoot event", Loader.ShouldDebugBeShown);

                var shootingEventArgs = new ShootingEventArgs(Player.Get(__instance.gameObject), target, targetPos);

                Handlers.Player.OnShooting(shootingEventArgs);

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

                targetPos = shootingEventArgs.Position;

                if (Vector3.Distance(__instance.camera.transform.position, sourcePos) > 6.5)
                {
                    __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code 2.2 (difference between real source position and provided source position is too big)", "gray");
                }
                else
                {
                    __instance._hub.inventory.items.ModifyDuration(itemIndex, __instance._hub.inventory.items[itemIndex].durability - 1f);
                    __instance.scp268.ServerDisable();
                    __instance._fireCooldown = (float)(1.0 / (__instance.weapons[__instance.curWeapon].shotsPerSecond * (double)__instance.weapons[__instance.curWeapon].allEffects.firerateMultiplier) * 0.800000011920929);
                    float sourceRangeScale = __instance.weapons[__instance.curWeapon].allEffects.audioSourceRangeScale;
                    __instance.GetComponent <Scp939_VisionController>().MakeNoise(
                        Mathf.Clamp((float)(sourceRangeScale * (double)sourceRangeScale * 70.0), 5f, 100f));
                    bool flag = target != null;
                    if (targetPos == Vector3.zero)
                    {
                        if (Physics.Raycast(sourcePos, dir, out RaycastHit raycastHit, 500f, __instance.raycastMask))
                        {
                            HitboxIdentity component = raycastHit.collider.GetComponent <HitboxIdentity>();
                            if (component != null)
                            {
                                WeaponManager componentInParent = component.GetComponentInParent <WeaponManager>();
                                if (componentInParent != null)
                                {
                                    flag       = false;
                                    target     = componentInParent.gameObject;
                                    hitboxType = component.id;
                                    targetPos  = componentInParent.transform.position;
                                }
                            }
                        }
                    }
                    else
                    {
                        if (Physics.Linecast(sourcePos, targetPos, out RaycastHit raycastHit, __instance.raycastMask))
                        {
                            HitboxIdentity component = raycastHit.collider.GetComponent <HitboxIdentity>();
                            if (component != null)
                            {
                                WeaponManager componentInParent = component.GetComponentInParent <WeaponManager>();
                                if (componentInParent != null)
                                {
                                    if (componentInParent.gameObject == target)
                                    {
                                        flag = false;
                                    }
                                    else if (componentInParent.scp268.Enabled)
                                    {
                                        flag       = false;
                                        target     = componentInParent.gameObject;
                                        hitboxType = component.id;
                                        targetPos  = componentInParent.transform.position;
                                    }
                                }
                            }
                        }
                    }

                    CharacterClassManager c = null;
                    if (target != null)
                    {
                        c = target.GetComponent <CharacterClassManager>();
                    }
                    if (c != null && __instance.GetShootPermission(c, false))
                    {
                        if (Math.Abs(__instance.camera.transform.position.y - c.transform.position.y) > 40.0)
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(
                                __instance.connectionToClient,
                                "Shot rejected - Code 2.1 (too big Y-axis difference between source and target)",
                                "gray");
                        }
                        else if (Vector3.Distance(c.transform.position, targetPos) > 6.5)
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(
                                __instance.connectionToClient,
                                "Shot rejected - Code 2.3 (difference between real target position and provided target position is too big)",
                                "gray");
                        }
                        else if (Physics.Linecast(__instance.camera.transform.position, sourcePos, __instance.raycastServerMask))
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code 2.4 (collision between source positions detected)", "gray");
                        }
                        else if (flag && Physics.Linecast(sourcePos, targetPos, __instance.raycastServerMask))
                        {
                            __instance.GetComponent <CharacterClassManager>().TargetConsolePrint(__instance.connectionToClient, "Shot rejected - Code 2.5 (collision on shot line detected)", "gray");
                        }
                        else
                        {
                            float  num1  = Vector3.Distance(__instance.camera.transform.position, target.transform.position);
                            float  num2  = __instance.weapons[__instance.curWeapon].damageOverDistance.Evaluate(num1);
                            string upper = hitboxType.ToUpper();
                            if (upper != "HEAD")
                            {
                                if (upper != "LEG")
                                {
                                    if (upper == "SCP106")
                                    {
                                        num2 /= 10f;
                                    }
                                }
                                else
                                {
                                    num2 /= 2f;
                                }
                            }
                            else
                            {
                                num2 *= 4f;
                            }

                            Log.Debug("Invoking late shoot.", Loader.ShouldDebugBeShown);

                            var shotEventArgs = new ShotEventArgs(Player.Get(__instance.gameObject), target, hitboxType, num1, num2);

                            Handlers.Player.OnShot(shotEventArgs);

                            if (!shotEventArgs.CanHurt)
                            {
                                return(false);
                            }

                            __instance._hub.playerStats.HurtPlayer(
                                new PlayerStats.HitInfo(
                                    shotEventArgs.Damage * __instance.weapons[__instance.curWeapon].allEffects.damageMultiplier *
                                    __instance.overallDamagerFactor,
                                    __instance._hub.nicknameSync.MyNick + " (" + __instance._hub.characterClassManager.UserId + ")",
                                    DamageTypes.FromWeaponId(__instance.curWeapon),
                                    __instance._hub.queryProcessor.PlayerId), c.gameObject);
                            __instance.RpcConfirmShot(true, __instance.curWeapon);
                            __instance.PlaceDecal(true, new Ray(__instance.camera.position, dir), (int)c.CurClass, shotEventArgs.Damage);
                        }
                    }
                    else if (target != null && hitboxType == "window" && target.GetComponent <BreakableWindow>() != null)
                    {
                        float damage = __instance.weapons[__instance.curWeapon].damageOverDistance
                                       .Evaluate(Vector3.Distance(__instance.camera.transform.position, target.transform.position));
                        target.GetComponent <BreakableWindow>().ServerDamageWindow(damage);
                        __instance.RpcConfirmShot(true, __instance.curWeapon);
                    }
                    else
                    {
                        __instance.PlaceDecal(false, new Ray(__instance.camera.position, dir), __instance.curWeapon, 0.0f);
                        __instance.RpcConfirmShot(false, __instance.curWeapon);
                    }
                }

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

                return(true);
            }
        }