예제 #1
0
        public Pickable AddPickable(int value, int count, Vector3 position, Vector3?velocity, Matrix?stuckMatrix)
        {
            Pickable pickable = new Pickable();

            pickable.Value        = value;
            pickable.Count        = count;
            pickable.Position     = position;
            pickable.StuckMatrix  = stuckMatrix;
            pickable.CreationTime = m_subsystemGameInfo.TotalElapsedGameTime;
            if (velocity.HasValue)
            {
                pickable.Velocity = velocity.Value;
            }
            else if (Terrain.ExtractContents(value) == 248)
            {
                Vector2 vector = m_random.Vector2(1.5f, 2f);
                pickable.Velocity = new Vector3(vector.X, 3f, vector.Y);
            }
            else
            {
                pickable.Velocity = new Vector3(m_random.Float(-0.5f, 0.5f), m_random.Float(1f, 1.2f), m_random.Float(-0.5f, 0.5f));
            }
            m_pickables.Add(pickable);
            if (this.PickableAdded != null)
            {
                this.PickableAdded(pickable);
            }
            return(pickable);
        }
        public Vector3 FindSafePlace()
        {
            Vector3 vector       = 0.5f * (m_componentCreature.ComponentBody.BoundingBox.Min + m_componentCreature.ComponentBody.BoundingBox.Max);
            Vector3?herdPosition = (m_componentHerdBehavior != null) ? m_componentHerdBehavior.FindHerdCenter() : null;
            float   num          = float.NegativeInfinity;
            Vector3 result       = vector;

            for (int i = 0; i < 40; i++)
            {
                Vector2 vector2 = m_random.Vector2(1f, 1f);
                float   y       = 0.4f * m_random.Float(-1f, 1f);
                Vector3 v       = Vector3.Normalize(new Vector3(vector2.X, y, vector2.Y));
                Vector3 vector3 = vector + m_random.Float(10f, 20f) * v;
                TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(vector, vector3, useInteractionBoxes : false, skipAirBlocks : false, delegate(int value, float d)
                {
                    int num3 = Terrain.ExtractContents(value);
                    return(!(BlocksManager.Blocks[num3] is WaterBlock));
                });
                Vector3 vector4 = terrainRaycastResult.HasValue ? (vector + v * terrainRaycastResult.Value.Distance) : vector3;
                float   num2    = ScoreSafePlace(vector, vector4, herdPosition);
                if (num2 > num)
                {
                    num    = num2;
                    result = vector4;
                }
            }
            return(result);
        }
        public Vector3?FindDestination()
        {
            Vector3 vector = 0.5f * (m_componentCreature.ComponentBody.BoundingBox.Min + m_componentCreature.ComponentBody.BoundingBox.Max);
            float   num    = 2f;
            Vector3?result = null;
            float   num2   = m_random.Float(10f, 16f);

            for (int i = 0; i < 16; i++)
            {
                Vector2 vector2 = m_random.Vector2(1f, 1f);
                float   y       = 0.3f * m_random.Float(-0.9f, 1f);
                Vector3 v       = Vector3.Normalize(new Vector3(vector2.X, y, vector2.Y));
                Vector3 vector3 = vector + num2 * v;
                TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(vector, vector3, useInteractionBoxes : false, skipAirBlocks : false, delegate(int value, float d)
                {
                    int num3 = Terrain.ExtractContents(value);
                    return(!(BlocksManager.Blocks[num3] is WaterBlock));
                });
                if (!terrainRaycastResult.HasValue)
                {
                    if (num2 > num)
                    {
                        result = vector3;
                        num    = num2;
                    }
                }
                else if (terrainRaycastResult.Value.Distance > num)
                {
                    result = vector + v * terrainRaycastResult.Value.Distance;
                    num    = terrainRaycastResult.Value.Distance;
                }
            }
            return(result);
        }
예제 #4
0
        public void Update(float dt)
        {
            ComponentPlayer componentPlayer = (m_subsystemPlayers.ComponentPlayers.Count > 0) ? m_subsystemPlayers.ComponentPlayers[0] : null;

            if (componentPlayer == null)
            {
                return;
            }
            if (m_newYearCelebrationTimeRemaining <= 0f && Time.PeriodicEvent(5.0, 0.0) && m_subsystemSky.SkyLightIntensity == 0f && !componentPlayer.ComponentSleep.IsSleeping)
            {
                DateTime now = DateTime.Now;
                if (now.Year > SettingsManager.NewYearCelebrationLastYear && now.Month == 1 && now.Day == 1 && now.Hour == 0 && now.Minute < 59)
                {
                    SettingsManager.NewYearCelebrationLastYear = now.Year;
                    m_newYearCelebrationTimeRemaining          = 180f;
                    componentPlayer.ComponentGui.DisplayLargeMessage("Happy New Year!", "--- Enjoy the fireworks ---", 15f, 3f);
                }
            }
            if (!(m_newYearCelebrationTimeRemaining > 0f))
            {
                return;
            }
            m_newYearCelebrationTimeRemaining -= dt;
            float num = (m_newYearCelebrationTimeRemaining > 10f) ? MathUtils.Lerp(1f, 7f, 0.5f * MathUtils.Sin(0.25f * m_newYearCelebrationTimeRemaining) + 0.5f) : 20f;

            if (m_random.Float(0f, 1f) < num * dt)
            {
                Vector2 vector  = m_random.Vector2(35f, 50f);
                Vector3 vector2 = componentPlayer.ComponentBody.Position + new Vector3(vector.X, 0f, vector.Y);
                TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(new Vector3(vector2.X, 120f, vector2.Z), new Vector3(vector2.X, 40f, vector2.Z), useInteractionBoxes: false, skipAirBlocks: true, null);
                if (terrainRaycastResult.HasValue)
                {
                    int data = 0;
                    data = FireworksBlock.SetShape(data, (FireworksBlock.Shape)m_random.Int(0, 7));
                    data = FireworksBlock.SetColor(data, m_random.Int(0, 7));
                    data = FireworksBlock.SetAltitude(data, m_random.Int(0, 1));
                    data = FireworksBlock.SetFlickering(data, m_random.Float(0f, 1f) < 0.25f);
                    int     value    = Terrain.MakeBlockValue(215, 0, data);
                    Vector3 position = new Vector3(terrainRaycastResult.Value.CellFace.Point.X, terrainRaycastResult.Value.CellFace.Point.Y + 1, terrainRaycastResult.Value.CellFace.Point.Z);
                    m_subsystemProjectiles.FireProjectile(value, position, new Vector3(m_random.Float(-3f, 3f), 45f, m_random.Float(-3f, 3f)), Vector3.Zero, null);
                }
            }
        }
        public Vector3?FindSurfaceDestination()
        {
            Vector3 vector  = 0.5f * (m_componentCreature.ComponentBody.BoundingBox.Min + m_componentCreature.ComponentBody.BoundingBox.Max);
            Vector3 forward = m_componentCreature.ComponentBody.Matrix.Forward;
            float   s       = 2f * m_componentCreature.ComponentBody.ImmersionDepth;

            for (int i = 0; i < 16; i++)
            {
                Vector2 vector2 = (i < 4) ? (new Vector2(forward.X, forward.Z) + m_random.Vector2(0f, 0.25f)) : m_random.Vector2(0.5f, 1f);
                Vector3 v       = Vector3.Normalize(new Vector3(vector2.X, 1f, vector2.Y));
                Vector3 end     = vector + s * v;
                TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(vector, end, useInteractionBoxes: false, skipAirBlocks: false, (int value, float d) => Terrain.ExtractContents(value) != 18);
                if (terrainRaycastResult.HasValue && Terrain.ExtractContents(terrainRaycastResult.Value.Value) == 0)
                {
                    return(new Vector3((float)terrainRaycastResult.Value.CellFace.X + 0.5f, terrainRaycastResult.Value.CellFace.Y, (float)terrainRaycastResult.Value.CellFace.Z + 0.5f));
                }
            }
            return(null);
        }
예제 #6
0
        public Vector3 FindDestination()
        {
            Vector3 position = m_componentCreature.ComponentBody.Position;
            float   num      = 0f;
            Vector3 result   = position;

            for (int i = 0; i < 16; i++)
            {
                Vector2 vector  = Vector2.Normalize(m_random.Vector2(1f)) * m_random.Float(6f, 12f);
                Vector3 vector2 = new Vector3(position.X + vector.X, 0f, position.Z + vector.Y);
                vector2.Y = m_subsystemTerrain.Terrain.GetTopHeight(Terrain.ToCell(vector2.X), Terrain.ToCell(vector2.Z)) + 1;
                float num2 = ScoreDestination(vector2);
                if (num2 > num)
                {
                    num    = num2;
                    result = vector2;
                }
            }
            return(result);
        }
예제 #7
0
 public Vector3?FindDestination()
 {
     for (int i = 0; i < 8; i++)
     {
         Vector2 vector  = m_random.Vector2(1f, 1f);
         float   y       = 0.2f * m_random.Float(-0.8f, 1f);
         Vector3 v       = Vector3.Normalize(new Vector3(vector.X, y, vector.Y));
         Vector3 vector2 = m_componentCreature.ComponentBody.Position + m_random.Float(8f, 16f) * v;
         TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(m_componentCreature.ComponentBody.Position, vector2, useInteractionBoxes : false, skipAirBlocks : false, delegate(int value, float d)
         {
             int num = Terrain.ExtractContents(value);
             return(!(BlocksManager.Blocks[num] is WaterBlock));
         });
         if (!terrainRaycastResult.HasValue)
         {
             return(vector2);
         }
         if (terrainRaycastResult.Value.Distance > 4f)
         {
             return(m_componentCreature.ComponentBody.Position + v * terrainRaycastResult.Value.Distance);
         }
     }
     return(null);
 }
예제 #8
0
 public void Injure(float amount, ComponentCreature attacker, bool ignoreInvulnerability, string cause)
 {
     if (!(amount > 0f) || (!ignoreInvulnerability && IsInvulnerable))
     {
         return;
     }
     if (Health > 0f)
     {
         if (m_componentCreature.PlayerStats != null)
         {
             if (attacker != null)
             {
                 m_componentCreature.PlayerStats.HitsReceived++;
             }
             m_componentCreature.PlayerStats.TotalHealthLost += MathUtils.Min(amount, Health);
         }
         Health = MathUtils.Max(Health - amount, 0f);
         if (Health <= 0f)
         {
             CauseOfDeath = cause;
             if (m_componentCreature.PlayerStats != null)
             {
                 m_componentCreature.PlayerStats.AddDeathRecord(new PlayerStats.DeathRecord
                 {
                     Day      = m_subsystemTimeOfDay.Day,
                     Location = m_componentCreature.ComponentBody.Position,
                     Cause    = cause
                 });
             }
             if (attacker != null)
             {
                 ComponentPlayer componentPlayer = attacker.Entity.FindComponent <ComponentPlayer>();
                 if (componentPlayer != null)
                 {
                     if (m_componentPlayer != null)
                     {
                         componentPlayer.PlayerStats.PlayerKills++;
                     }
                     else if (m_componentCreature.Category == CreatureCategory.LandPredator || m_componentCreature.Category == CreatureCategory.LandOther)
                     {
                         componentPlayer.PlayerStats.LandCreatureKills++;
                     }
                     else if (m_componentCreature.Category == CreatureCategory.WaterPredator || m_componentCreature.Category == CreatureCategory.WaterOther)
                     {
                         componentPlayer.PlayerStats.WaterCreatureKills++;
                     }
                     else
                     {
                         componentPlayer.PlayerStats.AirCreatureKills++;
                     }
                     int num = (int)MathUtils.Ceiling(m_componentCreature.ComponentHealth.AttackResilience / 12f);
                     for (int i = 0; i < num; i++)
                     {
                         Vector2 vector = m_random.Vector2(2.5f, 3.5f);
                         m_subsystemPickables.AddPickable(248, 1, m_componentCreature.ComponentBody.Position, new Vector3(vector.X, 6f, vector.Y), null);
                     }
                 }
             }
         }
     }
     if (attacker != null && this.Attacked != null)
     {
         this.Attacked(attacker);
     }
 }