Example #1
0
File: Entity.cs Project: oas/MiNET
        public virtual void OnTick(Entity[] entities)
        {
            SeenEntities.Clear();
            UnseenEntities.Clear();
            Age++;

            HealthManager.OnTick();
        }
Example #2
0
File: Entity.cs Project: oas/MiNET
        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);
        }
Example #3
0
        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();
        }