public override bool ShouldExecute() { if (entity.World.Rand.NextDouble() < 0.005) { return(false); } if (cooldownUntilMs > entity.World.ElapsedMilliseconds) { return(false); } if (cooldownUntilTotalHours > entity.World.Calendar.TotalHours) { return(false); } if (whenInEmotionState != null && !entity.HasEmotionState(whenInEmotionState)) { return(false); } if (whenNotInEmotionState != null && entity.HasEmotionState(whenNotInEmotionState)) { return(false); } EntityBehaviorMultiply bh = entity.GetBehavior <EntityBehaviorMultiply>(); if (bh != null && !bh.ShouldEat) { return(false); } IPointOfInterest nearestPoi = porregistry.GetNearestPoi(entity.ServerPos.XYZ, 32, (poi) => { if (poi.Type != "food") { return(false); } if ((target = poi as IAnimalFoodSource)?.IsSuitableFor(entity) == true) { FailedAttempt attempt; failedSeekTargets.TryGetValue(target, out attempt); if (attempt == null || (attempt.Count < 4 || attempt.LastTryMs < world.ElapsedMilliseconds - 60000)) { return(true); } } return(false); }); return(nearestPoi != null); }
public override bool ShouldExecute() { if (entity.World.Rand.NextDouble() < 0.005) { return(false); } // Don't search more often than every 15 seconds if (lastPOISearchTotalMs + 15000 > entity.World.ElapsedMilliseconds) { return(false); } if (cooldownUntilMs > entity.World.ElapsedMilliseconds) { return(false); } if (cooldownUntilTotalHours > entity.World.Calendar.TotalHours) { return(false); } if (whenInEmotionState != null && !entity.HasEmotionState(whenInEmotionState)) { return(false); } if (whenNotInEmotionState != null && entity.HasEmotionState(whenNotInEmotionState)) { return(false); } EntityBehaviorMultiply bh = entity.GetBehavior <EntityBehaviorMultiply>(); if (bh != null && !bh.ShouldEat && entity.World.Rand.NextDouble() < 0.996) { return(false); // 0.4% chance go to the food source anyway just because (without eating anything). } targetPoi = null; extraTargetDist = 0; lastPOISearchTotalMs = entity.World.ElapsedMilliseconds; entity.World.Api.ModLoader.GetModSystem <EntityPartitioning>().WalkEntities(entity.ServerPos.XYZ, 10, (e) => { if (e is EntityItem) { EntityItem ei = (EntityItem)e; EnumFoodCategory?cat = ei.Itemstack?.Collectible?.NutritionProps?.FoodCategory; if (cat != null && eatItemCategories.Contains((EnumFoodCategory)cat)) { targetPoi = new LooseItemFoodSource(ei); return(false); } AssetLocation code = ei.Itemstack?.Collectible?.Code; if (code != null && eatItemCodes.Contains(code)) { targetPoi = new LooseItemFoodSource(ei); return(false); } } if (searchPlayerInv && e is EntityPlayer eplr) { if (eplr.Player.InventoryManager.Find(slot => slot.Inventory is InventoryBasePlayer && !slot.Empty && eatItemCodes.Contains(slot.Itemstack.Collectible.Code))) { targetPoi = new PlayerPoi(eplr); } } return(true); }); if (targetPoi == null) { targetPoi = porregistry.GetNearestPoi(entity.ServerPos.XYZ, 48, (poi) => { if (poi.Type != "food") { return(false); } IAnimalFoodSource foodPoi; if ((foodPoi = poi as IAnimalFoodSource)?.IsSuitableFor(entity) == true) { FailedAttempt attempt; failedSeekTargets.TryGetValue(foodPoi, out attempt); if (attempt == null || (attempt.Count < 4 || attempt.LastTryMs < world.ElapsedMilliseconds - 60000)) { return(true); } } return(false); }) as IAnimalFoodSource; } /*if (targetPoi != null) * { * if (targetPoi is BlockEntity || targetPoi is Block) * { * Block block = entity.World.BlockAccessor.GetBlock(targetPoi.Position.AsBlockPos); * Cuboidf[] collboxes = block.GetCollisionBoxes(entity.World.BlockAccessor, targetPoi.Position.AsBlockPos); * if (collboxes != null && collboxes.Length != 0 && collboxes[0].Y2 > 0.3f) * { * extraTargetDist = 0.15f; * } * } * }*/ return(targetPoi != null); }