Пример #1
0
        public HuntingAnimal(Vector3 spawn, HuntingManager.AnimalTypes type, HuntingManager.AnimalState state)
        {
            handle = API.Shared.CreatePed((type == HuntingManager.AnimalTypes.Deer) ? (PedHash.Deer) : (PedHash.Boar),
                                          spawn, 0, 0);

            Spawn = spawn;
            Type  = type;
            State = state;

            StateTimer = new Timer()
            {
                Interval  = 1000,
                AutoReset = true
            };
            StateTimer.Elapsed += delegate { AnimalAi(this); };
            StateTimer.Start();

            HuntingManager.SpawnedAnimals.Add(this);
            API.Shared.SetEntitySharedData(handle, "IS_ANIMAL", true);
            API.Shared.SetEntitySharedData(handle, "ANIMAL_ID", HuntingManager.SpawnedAnimals.IndexOf(this));
        }
Пример #2
0
        public void AnimalAi(HuntingAnimal animal)
        {
            API.Shared.SetEntityPositionFrozen(handle, false);

            List <Player> playersInRadius = new List <Player>();

            foreach (var player in API.Shared.GetAllPlayers())
            {
                if (player == null)
                {
                    return;
                }

                if (player.Position.DistanceTo(API.Shared.GetEntityPosition(handle)) <= 500f)
                {
                    playersInRadius.Add(player);
                }
            }

            if (playersInRadius.Count > 0)
            {
                API.Shared.TriggerClientEvent(playersInRadius[0], "update_animal_position", handle);

                var tooClosePlayers = new List <Player>();
                foreach (var player in API.Shared.GetAllPlayers())
                {
                    if (player == null)
                    {
                        return;
                    }

                    if (player.Position.DistanceTo(API.Shared.GetEntityPosition(handle)) <= 50f)
                    {
                        tooClosePlayers.Add(player);
                    }
                }

                if (tooClosePlayers.Count > 0 && State != HuntingManager.AnimalState.Fleeing)
                {
                    State       = HuntingManager.AnimalState.Fleeing;
                    FleeingPed  = tooClosePlayers.First();
                    UpdateState = true;
                }

                StateChangeTick++;


                if (State != HuntingManager.AnimalState.Fleeing)
                {
                    if (StateChangeTick > 15)
                    {
                        var nextStateChance = Init.Random.Next(100);
                        if (nextStateChance < 35) // Graze
                        {
                            Ped p = API.Shared.GetEntityFromHandle <Ped>(handle);
                            State = HuntingManager.AnimalState.Grazing;
                            API.Shared.PlayPedScenario(p,
                                                       Type == HuntingManager.AnimalTypes.Deer ? "WORLD_DEER_GRAZING" : "WORLD_PIG_GRAZING");
                        }
                        else // Wander
                        {
                            State       = HuntingManager.AnimalState.Wandering;
                            Destination = HuntingManager.RandomFarawayDestination(API.Shared.GetEntityPosition(handle));
                            UpdateState = true;
                        }

                        StateChangeTick = 0;
                    }
                }
                else
                {
                    if (StateChangeTick > 20)
                    {
                        Ped p = API.Shared.GetEntityFromHandle <Ped>(handle);
                        State = HuntingManager.AnimalState.Grazing;
                        API.Shared.PlayPedScenario(p,
                                                   Type == HuntingManager.AnimalTypes.Deer ? "WORLD_DEER_GRAZING" : "WORLD_PIG_GRAZING");
                        StateChangeTick = 0;
                    }
                }
            }
            else
            {
                Ped p = API.Shared.GetEntityFromHandle <Ped>(handle);
                State = HuntingManager.AnimalState.Grazing;
                API.Shared.PlayPedScenario(p,
                                           Type == HuntingManager.AnimalTypes.Deer ? "WORLD_DEER_GRAZING" : "WORLD_PIG_GRAZING");
            }

            if (UpdateState != true)
            {
                return;
            }
            switch (State)
            {
            case HuntingManager.AnimalState.Fleeing:
                foreach (var p in playersInRadius)
                {
                    API.Shared.SendNativeToPlayer(p, Hash.TASK_SMART_FLEE_PED, handle, FleeingPed, 75f, 5000, 0, 0);
                }
                break;

            case HuntingManager.AnimalState.Grazing:
                Ped ped = API.Shared.GetEntityFromHandle <Ped>(handle);
                API.Shared.PlayPedScenario(ped,
                                           Type == HuntingManager.AnimalTypes.Deer ? "WORLD_DEER_GRAZING" : "WORLD_PIG_GRAZING");
                break;

            case HuntingManager.AnimalState.Wandering:
                foreach (var p in playersInRadius)
                {
                    API.Shared.SendNativeToPlayer(p, Hash.TASK_WANDER_IN_AREA, handle, Destination.X,
                                                  Destination.Y, Destination.Z, 25, 0, 0);
                }
                break;
            }
            UpdateState = false;
        }