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)); }
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; }