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); }
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); }
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); }
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); }
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); } }