public override void OnEntitySpawn() { base.OnEntitySpawn(); id = entity.World.RegisterGameTickListener(dt => { runAwayFrom = null; try { runAwayFrom = poiRegistry.GetNearestPoi(entity.ServerPos.XYZ, 100, (poi) => { if (poi == null) { return(false); } float?fear = (poi as IPointOfFear)?.FearRadius; if (fear == null) { return(false); } return(poi.Position.DistanceTo(entity.Pos.XYZ) < fear && poi.Type == "scary"); }) as IPointOfFear; if (runAwayFrom == null) { return; } goTo = goTo ?? runAwayFrom.Position.AheadCopy(runAwayFrom.FearRadius + 5, 0, rand.NextDouble() * 360); while (goTo.AsBlockPos.GetBlock(entity.Api).Id != 0 && goTo.AsBlockPos.Y < world.BlockAccessor.MapSizeY) { goTo.Add(0, 1, 0); } } catch (Exception) { } }, 4000 + rand.Next(0, 1000)); }
public override bool ShouldExecute() { runAwayFrom = null; runAwayFrom = (IPointOfFear)poiRegistry.GetNearestPoi(entity.ServerPos.XYZ, 1000, (poi) => { float?fear = (poi as IPointOfFear)?.FearRadius; if (fear == null) { return(false); } return(poi.Position.DistanceTo(entity.Pos.XYZ) < fear && poi.Type == "scary"); }); return(runAwayFrom != null); }