public virtual void OnTick(Entity[] entities) { SeenEntities.Clear(); UnseenEntities.Clear(); Age++; HealthManager.OnTick(); }
public virtual bool CanSee(Entity target) { if (SeenEntities.Contains(target)) { return(true); } if (UnseenEntities.Contains(target)) { return(false); } Vector3 entityPos = KnownPosition + new Vector3(0, (float)(this is Player ? 1.62f : Height), 0); Vector3 targetPos = target.KnownPosition + new Vector3(0, (float)(target is Player ? 1.62f : target.Height), 0); float distance = Vector3.Distance(entityPos, targetPos); Vector3 rayPos = entityPos; var direction = Vector3.Normalize(targetPos - entityPos); if (distance < direction.Length()) { UnseenEntities.Add(target); return(true); } do { if (Level.GetBlock(rayPos).IsSolid) { //Log.Debug($"{GetType()} can not see target"); //BroadcastEntityEvent(); UnseenEntities.Add(target); return(false); } //var particle = new DustParticle(Level, Color.AntiqueWhite); //particle.Position = rayPos; //particle.Spawn(); rayPos += direction; } while (distance > Vector3.Distance(entityPos, rayPos)); SeenEntities.Add(target); return(true); }
public virtual void OnTick() { SeenEntities.Clear(); UnseenEntities.Clear(); Age++; HealthManager.OnTick(); if (_isHit && Age > _hitAnimationEnd) { _isHit = false; ModelRenderer.EntityColor = Color.White.ToVector3(); } if (DoRotationCalculations) { UpdateRotations(); } else { KnownPosition.Yaw = KnownPosition.HeadYaw; } _previousPosition = KnownPosition; if (ServerEntity && DateTime.UtcNow >= NextUpdate) { var distanceMoved = DistanceMoved; DistanceMoved = 0; //PreviousUpdate _mvSpeed = (float)(distanceMoved * (TimeSpan.FromSeconds(1) / (DateTime.UtcNow - PreviousUpdate))); PreviousUpdate = DateTime.UtcNow; NextUpdate = DateTime.UtcNow + TimeSpan.FromMilliseconds(500); } if (IsNoAi) { return; } // IsMoving = Velocity.LengthSquared() > 0f; var knownPos = new BlockCoordinates(new Vector3(KnownPosition.X, KnownPosition.Y, KnownPosition.Z)); var knownDown = KnownPosition.GetCoordinates3D(); if (!(Network is JavaNetworkProvider)) { knownDown = knownDown.BlockDown(); } var blockBelowFeet = Level?.GetBlockStates(knownDown.X, knownDown.Y, knownDown.Z); var feetBlock = Level?.GetBlockStates(knownPos.X, knownPos.Y, knownPos.Z).ToArray(); var headBlock = Level?.GetBlock(KnownPosition.GetCoordinates3D() + new BlockCoordinates(0, 1, 0)); if (headBlock != null) { if (headBlock.BlockMaterial == Material.Water || headBlock.IsWater) { HeadInWater = true; } else { HeadInWater = false; } } if (blockBelowFeet != null) { if (blockBelowFeet.Any(b => b.State.Block.BlockMaterial == Material.Water || b.State.Block.IsWater)) { AboveWater = true; } else { AboveWater = false; } } else { AboveWater = false; } if (feetBlock != null) { if (feetBlock.Any(b => b.State.Block.BlockMaterial == Material.Water || b.State.Block.IsWater)) { FeetInWater = true; } else { FeetInWater = false; } if (feetBlock.Any(b => b.State.Block.BlockMaterial == Material.Lava)) { IsInLava = true; } else { IsInLava = false; } if (!feetBlock.Any(x => x.Storage == 0 && x.State.Block.Solid)) { KnownPosition.OnGround = false; } } IsInWater = FeetInWater || HeadInWater; /* * if (headBlock != null) * { * if (headBlock.IsWater) * { * IsInWater = true; * } * else * { * IsInWater = false; * } * }*/ //HealthManager.OnTick(); }