Skip to content
View in the app

A better way to browse. Learn more.

LCPDFR.com

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Blip Still Active After Arrest/Death.

Featured Replies

The process function I put was to depict the override process function you have in your call out.. You wouldn't call process from within process 

If you provide the entire .cs file I'll provide you with a clean, documented version of it. If you're worried someone will steal your code, then erase that worry.. It benefits everyone to share things as everyone learns from it

  • Replies 25
  • Views 1.9k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • ainesophaur
    ainesophaur

    It'd be better to keep the entire conversation in a list. Then you can sequentially show the text and remove it from the list. Once all the items are removed from the list, the conversation is over. T

  • ainesophaur
    ainesophaur

    Finally around to the computer and snagged a few mins to give an example of what I was talking about with dictionaries EDIT: Dont remove the items from the list :) there are smarter ways lik

  • alexguirre
    alexguirre

    You're creating two blips: ABlip = new Blip(Suspect); ABlip = Suspect.AttachBlip(); Both methods do the same, create a blip and attach it to the Suspect Ped, but ABlip o

  • Author
18 minutes ago, ainesophaur said:

The process function I put was to depict the override process function you have in your call out.. You wouldn't call process from within process 

If you provide the entire .cs file I'll provide you with a clean, documented version of it. If you're worried someone will steal your code, then erase that worry.. It benefits everyone to share things as everyone learns from it

Nope, not worried at all! Please excuse my messy code haha.

Spoiler

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Rage;
using Rage.Native;
using LSPD_First_Response.Mod.API;
using LSPD_First_Response.Mod.Callouts;
using LSPD_First_Response.Engine.Scripting.Entities;
using LSPD_First_Response.Engine;
using System.Drawing;

namespace ToastyCallouts.Callouts
{
    [CalloutInfo("SchoolShooting", CalloutProbability.VeryHigh)]

    public class SchoolShooting : Callout
    {
        public EMuggingState state;
        public LHandle Pursuit;
        public Vector3 SpawnPoint;
        public Blip myBlip;
        public Ped myShooter;
        public Ped myVictim1;
        public Ped myVictim2;
        public Ped myVictim3;
        public Ped myVictim4;
        public Ped myVictim5;
        public Ped myVictim6;
        public Ped myVictim7;
        public Vehicle myCopCarRight;
        public Vehicle myCopCarLeft;
        public Ped myCopPedLeft;
        public Ped myCopPedRight;

        enum ConversationTypes { Regular, None = 0 }

        ConversationTypes Current = ConversationTypes.None;

        Dictionary<ConversationTypes, List<String>> DialogMessages = new Dictionary<ConversationTypes, List<string>>()
        {
            { ConversationTypes.Regular, new List<string>()
            {
                "Testing Officer",
                "Okay, sounds good!"
            }
        }
        };

        public override bool OnBeforeCalloutDisplayed()
        {
            SpawnPoint SpawnPointmyShooter = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim1 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim2 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim3 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim4 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim5 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim6 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyVictim7 = new SpawnPoint(0.0f, new Vector3(-1758.445f, 125.273f, 64.774f));
            SpawnPoint SpawnPointmyCopCarRight = new SpawnPoint(0.0f, new Vector3(-1752.861f, 154.111f, 64.019f));
            SpawnPoint SpawnPointmyCopCarLeft = new SpawnPoint(0.0f, new Vector3(-1727.713f, 124.549f, 64.371f));
            SpawnPoint SpawnPointmyCopPedLeft = new SpawnPoint(0.0f, new Vector3(-1730.024f, 124.740f, 64.371f));
            SpawnPoint SpawnPointmyCopPedRight = new SpawnPoint(0.0f, new Vector3(-1751.655f, 154.822f, 64.371f));
            SpawnPoint = new Vector3(-1758.445f, 125.273f, 64.774f);
            Game.LogTrivial("New SpawnPoint's.");

            myShooter = new Ped(SpawnPointmyShooter.Position);
            myVictim1 = new Ped(SpawnPointmyVictim1.Position);
            myVictim2 = new Ped(SpawnPointmyVictim2.Position);
            myVictim3 = new Ped(SpawnPointmyVictim3.Position);
            myVictim4 = new Ped(SpawnPointmyVictim4.Position);
            myVictim5 = new Ped(SpawnPointmyVictim5.Position);
            myVictim6 = new Ped(SpawnPointmyVictim6.Position);
            myVictim7 = new Ped(SpawnPointmyVictim7.Position);
            myCopCarRight = new Vehicle("POLICE", SpawnPointmyCopCarRight.Position);
            myCopCarLeft = new Vehicle("POLICE", SpawnPointmyCopCarLeft.Position);
            myCopPedRight = new Ped("s_m_y_cop_01", SpawnPointmyCopPedRight.Position, 0.0f);
            myCopPedLeft = new Ped("s_m_y_cop_01", SpawnPointmyCopPedLeft.Position, 0.0f);
            Game.LogTrivial("Create Peds/Vehicle's.");

            ShowCalloutAreaBlipBeforeAccepting(new Vector3(-1758.445f, 125.273f, 64.774f), 30f);
            AddMinimumDistanceCheck(100f, new Vector3(-1758.445f, 125.273f, 64.774f));
            if (Game.LocalPlayer.Character.DistanceTo(SpawnPoint) > 300f) { return false; }
            Game.LogTrivial("Create Blip.");

            NativeFunction.CallByName<uint>("GIVE_WEAPON_TO_PED", myShooter, 0xBFEFFF6D, -1, true, true);
            NativeFunction.CallByName<uint>("GIVE_WEAPON_TO_PED", myCopPedRight, 0x1B06D571, -1, true, true);
            NativeFunction.CallByName<uint>("GIVE_WEAPON_TO_PED", myCopPedLeft, 0x1B06D571, -1, true, true);
            Game.LogTrivial("Give myShooter Weapon.");

            this.CalloutMessage = "School Shooting";
            this.CalloutPosition = new Vector3(-1758.445f, 125.273f, 64.774f);
            Game.LogTrivial("Callout Message's.");

            Functions.PlayScannerAudioUsingPosition("ATTENTION_ALL_UNITS OFFICERS_REPORT ASSAULT_WITH_WEAPON IN_OR_ON_POSITION", new Vector3(-1758.445f, 125.273f, 64.774f));
            Game.LogTrivial("Play Scanner Audio.");

            return base.OnBeforeCalloutDisplayed();
        }

        public override bool OnCalloutAccepted()
        {


            state = EMuggingState.EnRoute;
            Game.DisplayNotification("~b~Officer " + Settings.OfficerName + "~w~: Dispatch, show me responding Code 3 to the School Shooting.");
            Functions.PlayScannerAudio("10-4");

            myBlip = new Blip(myShooter);
            myBlip.Color = System.Drawing.Color.Red;
            myBlip.EnableRoute(System.Drawing.Color.Yellow);

            //Have the aggressor aim at the victim, and have the victim put their hands up. -1 makes the task permanent, or until we clear the task, which we do later.
            NativeFunction.CallByName<uint>("TASK_AIM_GUN_AT_ENTITY", myShooter, myVictim4, -1, true);
            NativeFunction.CallByName<uint>("TASK_AIM_GUN_AT_ENTITY", myCopPedRight, myShooter, -1, true);
            NativeFunction.CallByName<uint>("TASK_AIM_GUN_AT_ENTITY", myCopPedLeft, myShooter, -1, true);
            myVictim1.Tasks.PutHandsUp(-1, myShooter);
            myVictim2.Tasks.PutHandsUp(-1, myShooter);
            myVictim3.Tasks.PutHandsUp(-1, myShooter);
            myVictim4.Tasks.PutHandsUp(-1, myShooter);
            myVictim5.Tasks.PutHandsUp(-1, myShooter);
            myVictim6.Tasks.PutHandsUp(-1, myShooter);
            myVictim7.Tasks.PutHandsUp(-1, myShooter);

            //Block permanent events, so the victim doesn't flee if something disturbs them(A vehicle tapping them, etc..), as this would completely disrupt the callout's logic.
            myShooter.BlockPermanentEvents = true;
            myVictim1.BlockPermanentEvents = true;
            myVictim2.BlockPermanentEvents = true;
            myVictim3.BlockPermanentEvents = true;
            myVictim4.BlockPermanentEvents = true;
            myVictim5.BlockPermanentEvents = true;
            myVictim6.BlockPermanentEvents = true;
            myVictim7.BlockPermanentEvents = true;

            return base.OnCalloutAccepted();
        }

        public override void OnCalloutNotAccepted()
        {
            base.OnCalloutNotAccepted();

            Functions.PlayScannerAudio("AI_RESPONDING");

            if (myShooter.Exists())
            {
                myShooter.Delete();
            }
            if (myVictim1.Exists())
            {
                myVictim1.Delete();
            }
            if (myVictim2.Exists())
            {
                myVictim2.Delete();
            }
            if (myVictim3.Exists())
            {
                myVictim3.Delete();
            }
            if (myVictim4.Exists())
            {
                myVictim4.Delete();
            }
            if (myVictim5.Exists())
            {
                myVictim5.Delete();
            }
            if (myVictim6.Exists())
            {
                myVictim6.Delete();
            }
            if (myVictim7.Exists())
            {
                myVictim7.Delete();
            }
            if (myCopCarLeft.Exists())
            {
                myCopCarLeft.Delete();
            }
            if (myCopPedLeft.Exists())
            {
                myCopPedLeft.Delete();
            }
            if (myCopPedRight.Exists())
            {
                myCopPedRight.Delete();
            }
            if (myCopCarRight.Exists())
            {
                myCopCarRight.Delete();
            }

            if (myBlip.Exists()) myBlip.Delete();
        }
        public override void Process()
        {
            base.Process();

            //If the player is driving to the scene, and their distance to the scene is less than 15, start the callout's logic.
            if (state == EMuggingState.EnRoute && Game.LocalPlayer.Character.Position.DistanceTo(new Vector3(-1758.445f, 125.273f, 64.774f)) <= 20)
            {
                //Set the player as on scene
                state = EMuggingState.OnScene;

                //Start the callout's logic.
                StartMuggingScenario();
            }
            {
                { ConversationTypes.Regular, new List<string>()
            {
                "Hi Officer!",
                "Hey suspect, just testing!",
                "Okay bye now."
            };
                }
            };
            void Process()
                {
                List<String> messages = DialogMessages[ConversationTypes.Regular];
                String messageToShow = messages[0];
                messages.RemoveAt(0);
            }

                //If the state is DecisionMade(The aggressor already decided what random outcome to execute), and the Pursuit isn't running anymore, end the callout.
                if (state == EMuggingState.DecisionMade && !Functions.IsPursuitStillRunning(Pursuit))
            {
                this.End();
            }
            if (myShooter.IsDead)
            {
                Game.DisplayNotification("~b~Officer " + Settings.OfficerName + "~w~: Suspect is down, Code 4.");
                Functions.PlayScannerAudio("CODE4 SUSP_DOWN");

                End();
            }
            if (myShooter.IsCuffed)
            {
                Game.DisplayNotification("~b~Officer~w~: Suspect in custody, Code 4.");
                Functions.PlayScannerAudio("CODE4 SUSP_ARRESTED");

                End();
            }
       }

        public override void End()
        {
            if (myShooter.Exists()) myShooter.Dismiss();

            if (myVictim1.Exists()) myVictim1.Dismiss();
            if (myVictim2.Exists()) myVictim2.Dismiss();
            if (myVictim3.Exists()) myVictim3.Dismiss();
            if (myVictim4.Exists()) myVictim4.Dismiss();
            if (myVictim5.Exists()) myVictim5.Dismiss();
            if (myVictim6.Exists()) myVictim6.Dismiss();
            if (myVictim7.Exists()) myVictim7.Dismiss();
            if (myCopPedRight.Exists()) myCopPedRight.Dismiss();
            if (myCopPedLeft.Exists()) myCopPedLeft.Dismiss();
            if (myCopCarLeft.Exists()) myCopCarLeft.Dismiss();
            if (myCopCarRight.Exists()) myCopCarRight.Dismiss();

            if (myBlip.Exists()) myBlip.Delete();

            base.End();
        }

        public void StartMuggingScenario()
        {
            //ALWAYS START A NEW GAME FIBER IF YOU'RE GOING TO USE GameFiber.Sleep, DON'T SLEEP THE MAIN FIBER.
            GameFiber.StartNew(delegate
            {
                //Create the Pursuit
                this.Pursuit = Functions.CreatePursuit();

                //Pick a random number, to choose a random outcome
                int r = new Random().Next(1, 4);

                //Set the state to decision made, since the outcome is chosen.
                state = EMuggingState.DecisionMade;

                //Execute one of the random outcomes
                if (r == 1)
                {
                    //The aggressor kills the victim before fleeing from the scene, and the victim flees the scene, trying to escape the aggressor.
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim1, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim2, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim3, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim4, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim5, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim6, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim7, myShooter);

                    GameFiber.Sleep(3000);

                    myShooter.Tasks.PutHandsUp(-1, Game.LocalPlayer.Character);
                    NativeFunction.CallByName<uint>("SET_PED_DROPS_WEAPON", myShooter);
                    Game.DisplaySubtitle("~b~Officer " + Settings.OfficerName + "~w~: Dispatch, suspect is surrendering.", 5000);

                    //Now for another random outcome
                    if (new Random().Next(1, 3) == 2)
                    {
                        //The aggressor attacks the player.
                        myShooter.Tasks.FightAgainstClosestHatedTarget(30);
                        myCopPedLeft.Tasks.FireWeaponAt(myShooter, 30000, FiringPattern.FullAutomatic);
                        myCopPedRight.Tasks.FireWeaponAt(myShooter, 30000, FiringPattern.FullAutomatic);
                        Game.DisplaySubtitle("~b~Officer " + Settings.OfficerName + "~w~: SHOTS FIRED! GET SOME BACKUP HERE NOW!", 5000);
                        GameFiber.Sleep(3000);
                        Functions.PlayScannerAudio("NEED_BACKUP DISPATCH_SHOTS_FIRED REQUESTING_BACKUP");
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim1, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim2, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim3, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim4, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim5, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim6, myShooter);
                        NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim7, myShooter);

                        GameFiber.Sleep(5000);

                        Functions.AddPedToPursuit(this.Pursuit, myShooter);
                    }
                }
                else
                {
                    //The aggressor doesn't attack the victim, instead, both peds flee. We don't need to tell the aggressor to flee, as LSPDFR's Pursuit system does that for us.
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim1, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim2, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim3, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim4, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim5, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim6, myShooter);
                    NativeFunction.CallByName<uint>("TASK_REACT_AND_FLEE_PED", myVictim7, myShooter);

                    GameFiber.Sleep(5000);

                    Functions.AddPedToPursuit(this.Pursuit, myShooter);
                }
                //Dismiss the aggressor from our plugin
                myShooter.Dismiss();

                //Dispatch a backup unit.
                Functions.RequestBackup(Game.LocalPlayer.Character.Position, LSPD_First_Response.EBackupResponseType.Pursuit, LSPD_First_Response.EBackupUnitType.AirUnit);
                Functions.RequestBackup(Game.LocalPlayer.Character.Position, LSPD_First_Response.EBackupResponseType.Pursuit, LSPD_First_Response.EBackupUnitType.Ambulance);
                Functions.RequestBackup(Game.LocalPlayer.Character.Position, LSPD_First_Response.EBackupResponseType.Pursuit, LSPD_First_Response.EBackupUnitType.LocalUnit);
                Functions.RequestBackup(Game.LocalPlayer.Character.Position, LSPD_First_Response.EBackupResponseType.Pursuit, LSPD_First_Response.EBackupUnitType.LocalUnit);
            });
        }
    }
}

 

 

Give this a review.. I added comments in order to explain whats going on. It's not intended to copy & pasted, rather it should explain how to use the enumerators to cycle through messages

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LSPD_First_Response.Mod.Callouts;
using System.Windows.Forms;
using Rage;


namespace FR_Wanted
{

    public class WantedController : Callout
    {
        Vector3 SpawnPoint = new Vector3(-1758.445f, 125.273f, 64.774f);

        enum CalloutStates { None = 0, Traveling, OnScene, BeingAttacked };
        enum ConversationTypes { Impatient, Regular, Danger, None = 0 }
        /**
        * Imagine you had three different types of dialogs a suspect could use.
        * I used the enum above to track them and the variable below to track which one is picked
        */
        ConversationTypes Current = ConversationTypes.None;
        CalloutStates CalloutState = CalloutStates.None;
        List<String>.Enumerator CurrentDialog;

        /**
        * The below variable is a dictionary which means it stores items as a Key, Value pair rather
        * than a flat list.
        */

        Dictionary<ConversationTypes, List<String>> DialogMessages = new Dictionary<ConversationTypes, List<string>>()
        {
            /** 
            * We are creating the list of dictionary entries during the construction of the dictionary.
            * Alternatively we could have DialogMessages = new Dictionary() and then done the following..
            *  List<String> regular = new List<string>();
            *  regular.Add("Hello Officer");
            *  regular.Add("I'm sorry");
            *  ...
            *  DialogMessages.Add(ConversationTypes.Regular, regular);
            *
            *  But why have all that extra code :)
            *  http://stackoverflow.com/questions/17047602/proper-way-to-initialize-a-c-sharp-dictionary-with-values-already-in-it
            */
            { ConversationTypes.Regular, new List<string>()
                {
                    "Hello Officer",
                    "I'm sorry for not paying attention",
                    "Have a nice day"
                }
            },
            { ConversationTypes.Danger, new List<string>()
                {
                    "You better get away from me",
                    "I'm having a bad day",
                    "Ok time to die"
                }
            },
            { ConversationTypes.Impatient, new List<string>()
                {
                    "I dont have time for this",
                    "Can we hurry this up",
                    "Can you do anything right"
                }
            }
        };

        public override bool OnCalloutAccepted()
        {
            //We set our state for the conversation type
            Current = ConversationTypes.Impatient;
            CalloutState = CalloutStates.Traveling;
            //Set CurrentDialog to use an Enumerator of the List<String> of conversation messages
            CurrentDialog = DialogMessages[Current].GetEnumerator();
            return base.OnCalloutAccepted();
        }
        public override void Process()
        {
           if(CalloutState != CalloutStates.OnScene && Game.LocalPlayer.Character.Position.DistanceTo(SpawnPoint) <= 20f)
            {
                CalloutState = CalloutStates.OnScene;
            }
            /**
             * Imagine our keybinding was to use K as the conversation key
             * We want to check if the player presses K, and if they do, check to see if there is anything 
             * left to say in the conversation. If there isn't make the Ped flee
             * 
             * Current Dialog is an enumerator which has a method called MoveNext
             * which will give us a boolean if there are any more items to enumerate though
             */
            if (Game.IsKeyDown(Keys.K))
            {
                if (CurrentDialog.MoveNext())
                {
                    //Show the next message in the enumerator
                    Game.DisplaySubtitle(CurrentDialog.Current, 2000);
                }
                else
                {
                    //We have no more messages... if we had a Ped, we could do something like
                    // currentPed.Tasks.FightAgainst(Game.LocalPlayer.Character);
                    CalloutState = CalloutStates.BeingAttacked;
                }

            }            
            GameFiber.Yield();
        }
    }
}

 

  • Author

I believe I got it, but I think I'm going to have to change a few things around and assign different things because I have all kinds of Native Functions that I don't believe are going to register or are going to register funky because of how I implemented it, I didn't really blend it in good if you know what I mean. Thank you for all your guys' help, especially @ainesophaur! If I have anymore problems I'll post it on here, thank you! :)

 

EDIT: just fairly tested it, I believe it's working 100% properly, just need to edit the line of text and dialogue, thank you so much! Huge help!

Edited by ToastinYou

Keep your code as compartmentalized as possible. I create separate namespaces and classes for just about everything. It keeps everything clean and organized, and makes it much easier to debug if anything goes wrong.

Check out this thread for more tips/resources:

 

Edited by Stealth22

Stealth22
LSPDFR Tester | Plugin Developer
My Plugins: Code 3 Callouts | Traffic Control | Keep Calm | ALPR+

Please do not PM me for any kind of technical support.
I unfortunately do not have enough free time to answer every PM that I get. For issues with my plugins, please post in the comments section of the file, or it's forum thread. You'll get a much quicker response from me there than if you send me a PM; I do my best to respond to every question in the comments sections. For API/programming questions, please post them in the API Development forum, so all developers can benefit from the answer as well. Thanks!

38 minutes ago, Stealth22 said:

Keep your code as compartmentalized as possible. I create separate namespaces and classes for just about everything. It keeps everything clean and organized, and makes it much easier to debug if anything goes wrong.

That's what I always try to do...but in the end i start throwing bools all over the place and it's a mess to clean up :)

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

Recently Browsing 0

  • No registered users viewing this page.

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.