예제 #1
0
        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));
        }
예제 #2
0
        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);
        }