public void Update(float dt) { if (m_firePointsCopy.Count == 0) { m_firePointsCopy.Count += m_fireData.Count; m_fireData.Keys.CopyTo(m_firePointsCopy.Array, 0); m_copyIndex = 0; m_lastScanDuration = (float)(m_subsystemTime.GameTime - m_lastScanTime); m_lastScanTime = m_subsystemTime.GameTime; if (m_firePointsCopy.Count == 0) { m_fireSoundVolume = 0f; } } if (m_firePointsCopy.Count > 0) { float num = MathUtils.Min(1f * dt * (float)m_firePointsCopy.Count + m_remainderToScan, 50f); int num2 = (int)num; m_remainderToScan = num - (float)num2; int num3 = MathUtils.Min(m_copyIndex + num2, m_firePointsCopy.Count); while (m_copyIndex < num3) { if (m_fireData.TryGetValue(m_firePointsCopy.Array[m_copyIndex], out FireData value)) { int x = value.Point.X; int y = value.Point.Y; int z = value.Point.Z; int num4 = Terrain.ExtractData(base.SubsystemTerrain.Terrain.GetCellValue(x, y, z)); m_fireSoundIntensity += 1f / (m_subsystemAudio.CalculateListenerDistanceSquared(new Vector3(x, y, z)) + 0.01f); if ((num4 & 1) != 0) { value.Time0 -= m_lastScanDuration; if (value.Time0 <= 0f) { QueueBurnAway(x, y, z + 1, value.FireExpandability * 0.85f); } foreach (KeyValuePair <Point3, float> expansionProbability in m_expansionProbabilities) { if (m_random.Float(0f, 1f) < expansionProbability.Value * m_lastScanDuration * value.FireExpandability) { m_toExpand[new Point3(x + expansionProbability.Key.X, y + expansionProbability.Key.Y, z + 1 + expansionProbability.Key.Z)] = value.FireExpandability * 0.85f; } } } if ((num4 & 2) != 0) { value.Time1 -= m_lastScanDuration; if (value.Time1 <= 0f) { QueueBurnAway(x + 1, y, z, value.FireExpandability * 0.85f); } foreach (KeyValuePair <Point3, float> expansionProbability2 in m_expansionProbabilities) { if (m_random.Float(0f, 1f) < expansionProbability2.Value * m_lastScanDuration * value.FireExpandability) { m_toExpand[new Point3(x + 1 + expansionProbability2.Key.X, y + expansionProbability2.Key.Y, z + expansionProbability2.Key.Z)] = value.FireExpandability * 0.85f; } } } if ((num4 & 4) != 0) { value.Time2 -= m_lastScanDuration; if (value.Time2 <= 0f) { QueueBurnAway(x, y, z - 1, value.FireExpandability * 0.85f); } foreach (KeyValuePair <Point3, float> expansionProbability3 in m_expansionProbabilities) { if (m_random.Float(0f, 1f) < expansionProbability3.Value * m_lastScanDuration * value.FireExpandability) { m_toExpand[new Point3(x + expansionProbability3.Key.X, y + expansionProbability3.Key.Y, z - 1 + expansionProbability3.Key.Z)] = value.FireExpandability * 0.85f; } } } if ((num4 & 8) != 0) { value.Time3 -= m_lastScanDuration; if (value.Time3 <= 0f) { QueueBurnAway(x - 1, y, z, value.FireExpandability * 0.85f); } foreach (KeyValuePair <Point3, float> expansionProbability4 in m_expansionProbabilities) { if (m_random.Float(0f, 1f) < expansionProbability4.Value * m_lastScanDuration * value.FireExpandability) { m_toExpand[new Point3(x - 1 + expansionProbability4.Key.X, y + expansionProbability4.Key.Y, z + expansionProbability4.Key.Z)] = value.FireExpandability * 0.85f; } } } if (num4 == 0) { value.Time5 -= m_lastScanDuration; if (value.Time5 <= 0f) { QueueBurnAway(x, y - 1, z, value.FireExpandability * 0.85f); } } } m_copyIndex++; } if (m_copyIndex >= m_firePointsCopy.Count) { m_fireSoundVolume = 0.75f * m_fireSoundIntensity; m_firePointsCopy.Clear(); m_fireSoundIntensity = 0f; } } if (m_subsystemTime.PeriodicGameTimeEvent(5.0, 0.0)) { int num5 = 0; int num6 = 0; foreach (KeyValuePair <Point3, float> item in m_toBurnAway) { Point3 key = item.Key; float value2 = item.Value; base.SubsystemTerrain.ChangeCell(key.X, key.Y, key.Z, Terrain.ReplaceContents(0, 0)); if (value2 > 0.25f) { for (int i = 0; i < 5; i++) { Point3 point = CellFace.FaceToPoint3(i); SetCellOnFire(key.X + point.X, key.Y + point.Y, key.Z + point.Z, value2); } } float num7 = m_subsystemViews.CalculateDistanceFromNearestView(new Vector3(key)); if (num5 < 15 && num7 < 24f) { m_subsystemParticles.AddParticleSystem(new BurntDebrisParticleSystem(base.SubsystemTerrain, key.X, key.Y, key.Z)); num5++; } if (num6 < 4 && num7 < 16f) { m_subsystemAudio.PlayRandomSound("Audio/Sizzles", 1f, m_random.Float(-0.25f, 0.25f), new Vector3(key.X, key.Y, key.Z), 3f, autoDelay: true); num6++; } } foreach (KeyValuePair <Point3, float> item2 in m_toExpand) { SetCellOnFire(item2.Key.X, item2.Key.Y, item2.Key.Z, item2.Value); } m_toBurnAway.Clear(); m_toExpand.Clear(); } m_subsystemAmbientSounds.FireSoundVolume = MathUtils.Max(m_subsystemAmbientSounds.FireSoundVolume, m_fireSoundVolume); }
public void HandleAxisCollision(int axis, float move, ref Vector3 position, bool isSmoothRising) { Vector3 boxSize = BoxSize; m_collisionBoxes.Clear(); if (IsSneaking && axis != 1) { FindSneakCollisionBoxes(position, new Vector2(boxSize.X - 0.08f, boxSize.Z - 0.08f), m_collisionBoxes); } Vector3 v; switch (axis) { case 0: position.X += move; v = new Vector3(0f, 0.04f, 0.04f); break; case 1: position.Y += move; v = new Vector3(0.04f, 0f, 0.04f); break; default: position.Z += move; v = new Vector3(0.04f, 0.04f, 0f); break; } BoundingBox boundingBox = new BoundingBox(position - new Vector3(boxSize.X / 2f, 0f, boxSize.Z / 2f) + v, position + new Vector3(boxSize.X / 2f, boxSize.Y, boxSize.Z / 2f) - v); FindTerrainCollisionBoxes(boundingBox, m_collisionBoxes); m_collisionBoxes.AddRange(m_movingBlocksCollisionBoxes); float num; CollisionBox pushingCollisionBox; if ((axis != 1) | isSmoothRising) { BoundingBox smoothRiseBox = boundingBox; smoothRiseBox.Min.Y += MaxSmoothRiseHeight; num = CalculateSmoothRisePushBack(boundingBox, smoothRiseBox, axis, m_collisionBoxes, out pushingCollisionBox); } else { num = CalculatePushBack(boundingBox, axis, m_collisionBoxes, out pushingCollisionBox); } BoundingBox box = new BoundingBox(position - new Vector3(boxSize.X / 2f, 0f, boxSize.Z / 2f) + v, position + new Vector3(boxSize.X / 2f, boxSize.Y, boxSize.Z / 2f) - v); CollisionBox pushingCollisionBox2; float num2 = CalculatePushBack(box, axis, m_bodiesCollisionBoxes, out pushingCollisionBox2); if (MathUtils.Abs(num) > MathUtils.Abs(num2)) { if (num == 0f) { return; } int num3 = Terrain.ExtractContents(pushingCollisionBox.BlockValue); if (BlocksManager.Blocks[num3].HasCollisionBehavior) { SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(num3); for (int i = 0; i < blockBehaviors.Length; i++) { Vector3 vector = (pushingCollisionBox.Box.Min + pushingCollisionBox.Box.Max) / 2f; CellFace cellFace = CellFace.FromAxisAndDirection(Terrain.ToCell(vector.X), Terrain.ToCell(vector.Y), Terrain.ToCell(vector.Z), axis, 0f - GetVectorComponent(m_velocity, axis)); blockBehaviors[i].OnCollide(cellFace, GetVectorComponent(m_velocity, axis), this); } } switch (axis) { case 0: position.X += num; m_velocity.X = pushingCollisionBox.BlockVelocity.X; break; case 1: position.Y += num; m_velocity.Y = pushingCollisionBox.BlockVelocity.Y; if (move < 0f) { StandingOnValue = pushingCollisionBox.BlockValue; StandingOnBody = pushingCollisionBox.ComponentBody; StandingOnVelocity = pushingCollisionBox.BlockVelocity; } break; default: position.Z += num; m_velocity.Z = pushingCollisionBox.BlockVelocity.Z; break; } } else { if (num2 == 0f) { return; } ComponentBody componentBody = pushingCollisionBox2.ComponentBody; switch (axis) { case 0: InelasticCollision(m_velocity.X, componentBody.m_velocity.X, Mass, componentBody.Mass, 0.5f, out m_velocity.X, out componentBody.m_velocity.X); position.X += num2; break; case 1: InelasticCollision(m_velocity.Y, componentBody.m_velocity.Y, Mass, componentBody.Mass, 0.5f, out m_velocity.Y, out componentBody.m_velocity.Y); position.Y += num2; if (move < 0f) { StandingOnValue = pushingCollisionBox2.BlockValue; StandingOnBody = pushingCollisionBox2.ComponentBody; StandingOnVelocity = new Vector3(componentBody.m_velocity.X, 0f, componentBody.m_velocity.Z); } break; default: InelasticCollision(m_velocity.Z, componentBody.m_velocity.Z, Mass, componentBody.Mass, 0.5f, out m_velocity.Z, out componentBody.m_velocity.Z); position.Z += num2; break; } if (this.CollidedWithBody != null) { this.CollidedWithBody(componentBody); } if (componentBody.CollidedWithBody != null) { componentBody.CollidedWithBody(this); } } }
public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z) { int data = Terrain.ExtractData(value); int rotation = GetRotation(data); int designIndex = GetDesignIndex(data); FurnitureDesign design = terrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex); if (design != null) { int num = CellFace.OppositeFace((face < 4) ? ((face - rotation + 4) % 4) : face); if ((design.MountingFacesMask & (1 << num)) != 0 && SubsystemElectricity.GetConnectorDirection(face, 0, connectorFace).HasValue) { Point3 point = CellFace.FaceToPoint3(face); int cellValue = terrain.Terrain.GetCellValue(x - point.X, y - point.Y, z - point.Z); if (!BlocksManager.Blocks[Terrain.ExtractContents(cellValue)].IsFaceTransparent(terrain, CellFace.OppositeFace(num), cellValue)) { if (design.InteractionMode == FurnitureInteractionMode.Multistate || design.InteractionMode == FurnitureInteractionMode.ConnectedMultistate) { return(ElectricConnectorType.Input); } if (design.InteractionMode == FurnitureInteractionMode.ElectricButton || design.InteractionMode == FurnitureInteractionMode.ElectricSwitch) { return(ElectricConnectorType.Output); } } } } return(null); }
public override void OnCollide(CellFace cellFace, float velocity, ComponentBody componentBody) { Press(componentBody.Mass); componentBody.ApplyImpulse(new Vector3(0f, -2E-05f, 0f)); }
public DigitalToAnalogConverterElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { }
public SevenSegmentDisplayElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { m_subsystemGlow = subsystemElectricity.Project.FindSubsystem <SubsystemGlow>(throwOnError: true); }
public void ScanDesign(CellFace start, Vector3 direction, ComponentMiner componentMiner) { FurnitureDesign design = null; FurnitureDesign furnitureDesign = null; Dictionary <Point3, int> valuesDictionary = new Dictionary <Point3, int>(); Point3 point = start.Point; Point3 point2 = start.Point; int startValue = base.SubsystemTerrain.Terrain.GetCellValue(start.Point.X, start.Point.Y, start.Point.Z); int num = Terrain.ExtractContents(startValue); if (BlocksManager.Blocks[num] is FurnitureBlock) { int designIndex = FurnitureBlock.GetDesignIndex(Terrain.ExtractData(startValue)); furnitureDesign = GetDesign(designIndex); if (furnitureDesign == null) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Unsuitable block found", Color.White, blinking: true, playNotificationSound: false); return; } design = furnitureDesign.Clone(); design.LinkedDesign = null; design.InteractionMode = FurnitureInteractionMode.None; valuesDictionary.Add(start.Point, startValue); } else { Stack <Point3> val = new Stack <Point3>(); val.Push(start.Point); while (val.Count > 0) { Point3 key = val.Pop(); if (valuesDictionary.ContainsKey(key)) { continue; } int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(key.X, key.Y, key.Z); if (IsValueDisallowed(cellValue)) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Unsuitable block found", Color.White, blinking: true, playNotificationSound: false); return; } if (IsValueAllowed(cellValue)) { if (key.X < point.X) { point.X = key.X; } if (key.Y < point.Y) { point.Y = key.Y; } if (key.Z < point.Z) { point.Z = key.Z; } if (key.X > point2.X) { point2.X = key.X; } if (key.Y > point2.Y) { point2.Y = key.Y; } if (key.Z > point2.Z) { point2.Z = key.Z; } if (MathUtils.Abs(point.X - point2.X) >= 16 || MathUtils.Abs(point.Y - point2.Y) >= 16 || MathUtils.Abs(point.Z - point2.Z) >= 16) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Furniture design is too large", Color.White, blinking: true, playNotificationSound: false); return; } valuesDictionary[key] = cellValue; val.Push(new Point3(key.X - 1, key.Y, key.Z)); val.Push(new Point3(key.X + 1, key.Y, key.Z)); val.Push(new Point3(key.X, key.Y - 1, key.Z)); val.Push(new Point3(key.X, key.Y + 1, key.Z)); val.Push(new Point3(key.X, key.Y, key.Z - 1)); val.Push(new Point3(key.X, key.Y, key.Z + 1)); } } if (valuesDictionary.Count == 0) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("No suitable blocks found", Color.White, blinking: true, playNotificationSound: false); return; } design = new FurnitureDesign(base.SubsystemTerrain); Point3 point3 = point2 - point; int num2 = MathUtils.Max(MathUtils.Max(point3.X, point3.Y, point3.Z) + 1, 2); int[] array = new int[num2 * num2 * num2]; foreach (KeyValuePair <Point3, int> item in valuesDictionary) { Point3 point4 = item.Key - point; array[point4.X + point4.Y * num2 + point4.Z * num2 * num2] = item.Value; } design.SetValues(num2, array); int steps = (start.Face > 3) ? CellFace.Vector3ToFace(direction, 3) : CellFace.OppositeFace(start.Face); design.Rotate(1, steps); Point3 location = design.Box.Location; Point3 point5 = new Point3(design.Resolution) - (design.Box.Location + design.Box.Size); Point3 delta = new Point3((point5.X - location.X) / 2, -location.Y, (point5.Z - location.Z) / 2); design.Shift(delta); } BuildFurnitureDialog dialog = new BuildFurnitureDialog(design, furnitureDesign, delegate(bool result) { if (result) { design = TryAddDesign(design); if (design == null) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Too many different furniture designs", Color.White, blinking: true, playNotificationSound: false); } else { if (m_subsystemGameInfo.WorldSettings.GameMode != 0) { foreach (KeyValuePair <Point3, int> item2 in valuesDictionary) { base.SubsystemTerrain.DestroyCell(0, item2.Key.X, item2.Key.Y, item2.Key.Z, 0, noDrop: true, noParticleSystem: true); } } int value = Terrain.MakeBlockValue(227, 0, FurnitureBlock.SetDesignIndex(0, design.Index, design.ShadowStrengthFactor, design.IsLightEmitter)); int num3 = MathUtils.Clamp(design.Resolution, 4, 8); Matrix matrix = componentMiner.ComponentCreature.ComponentBody.Matrix; Vector3 position = matrix.Translation + 1f * matrix.Forward + 1f * Vector3.UnitY; m_subsystemPickables.AddPickable(value, num3, position, null, null); componentMiner.DamageActiveTool(1); componentMiner.Poke(forceRestart: false); for (int i = 0; i < 3; i++) { Time.QueueTimeDelayedExecution(Time.FrameStartTime + (double)((float)i * 0.25f), delegate { m_subsystemSoundMaterials.PlayImpactSound(startValue, new Vector3(start.Point), 1f); }); } if (componentMiner.ComponentCreature.PlayerStats != null) { componentMiner.ComponentCreature.PlayerStats.FurnitureItemsMade += num3; } } } }); if (componentMiner.ComponentPlayer != null) { DialogsManager.ShowDialog(componentMiner.ComponentPlayer.GuiWidget, dialog); } }
public virtual bool ShouldGenerateFace(SubsystemTerrain subsystemTerrain, int face, int value, int neighborValue) { return(BlocksManager.Blocks[Terrain.ExtractContents(neighborValue)].IsFaceTransparent(subsystemTerrain, CellFace.OppositeFace(face), neighborValue)); }
public override int GetFaceTextureSlot(int face, int value) { int direction = Terrain.ExtractData(value) >> 15; return(face == 4 || face == 5 ? 170 : face == direction ? 120 : face == CellFace.OppositeFace(direction) ? 110 : 170); }
public ButtonElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { }
public override void OnHitByProjectile(CellFace cellFace, WorldItem worldItem) { Press(); }
public PhotodiodeElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { m_voltage = CalculateVoltage(); }
public ElectricConnectorType?GetConnectorType(SubsystemTerrain terrain, int value, int face, int connectorFace, int x, int y, int z) { int wiredFace = GetWiredFace(Terrain.ExtractData(value)); if ((face == wiredFace || face == CellFace.OppositeFace(wiredFace)) && connectorFace == CellFace.OppositeFace(face)) { return(ElectricConnectorType.InputOutput); } return(null); }
public override void GenerateTerrainVertices(BlockGeometryGenerator generator, TerrainGeometry geometry, int value, int x, int y, int z) { TerrainGeometrySubset subsetAlphaTest = geometry.SubsetAlphaTest; DynamicArray <TerrainVertex> vertices = subsetAlphaTest.Vertices; DynamicArray <ushort> indices = subsetAlphaTest.Indices; int count = vertices.Count; int data = Terrain.ExtractData(value); int num = Terrain.ExtractLight(value); int face = GetFace(data); float s = LightingManager.LightIntensityByLightValueAndFace[num + 16 * CellFace.OppositeFace(face)]; Color color = BlockColorsMap.IvyColorsMap.Lookup(generator.Terrain, x, y, z) * s; color.A = byte.MaxValue; switch (face) { case 0: vertices.Count += 4; BlockGeometryGenerator.SetupLitCornerVertex(x, y, z + 1, color, DefaultTextureSlot, 0, ref vertices.Array[count]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y, z + 1, color, DefaultTextureSlot, 1, ref vertices.Array[count + 1]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y + 1, z + 1, color, DefaultTextureSlot, 2, ref vertices.Array[count + 2]); BlockGeometryGenerator.SetupLitCornerVertex(x, y + 1, z + 1, color, DefaultTextureSlot, 3, ref vertices.Array[count + 3]); indices.Add((ushort)count); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 1)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 3)); indices.Add((ushort)count); indices.Add((ushort)count); indices.Add((ushort)(count + 3)); indices.Add((ushort)(count + 2)); break; case 1: vertices.Count += 4; BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y, z, color, DefaultTextureSlot, 0, ref vertices.Array[count]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y + 1, z, color, DefaultTextureSlot, 3, ref vertices.Array[count + 1]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y + 1, z + 1, color, DefaultTextureSlot, 2, ref vertices.Array[count + 2]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y, z + 1, color, DefaultTextureSlot, 1, ref vertices.Array[count + 3]); indices.Add((ushort)count); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 1)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 3)); indices.Add((ushort)count); indices.Add((ushort)count); indices.Add((ushort)(count + 3)); indices.Add((ushort)(count + 2)); break; case 2: vertices.Count += 4; BlockGeometryGenerator.SetupLitCornerVertex(x, y, z, color, DefaultTextureSlot, 0, ref vertices.Array[count]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y, z, color, DefaultTextureSlot, 1, ref vertices.Array[count + 1]); BlockGeometryGenerator.SetupLitCornerVertex(x + 1, y + 1, z, color, DefaultTextureSlot, 2, ref vertices.Array[count + 2]); BlockGeometryGenerator.SetupLitCornerVertex(x, y + 1, z, color, DefaultTextureSlot, 3, ref vertices.Array[count + 3]); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 2)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)count); indices.Add((ushort)(count + 3)); indices.Add((ushort)(count + 3)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); break; case 3: vertices.Count += 4; BlockGeometryGenerator.SetupLitCornerVertex(x, y, z, color, DefaultTextureSlot, 0, ref vertices.Array[count]); BlockGeometryGenerator.SetupLitCornerVertex(x, y + 1, z, color, DefaultTextureSlot, 3, ref vertices.Array[count + 1]); BlockGeometryGenerator.SetupLitCornerVertex(x, y + 1, z + 1, color, DefaultTextureSlot, 2, ref vertices.Array[count + 2]); BlockGeometryGenerator.SetupLitCornerVertex(x, y, z + 1, color, DefaultTextureSlot, 1, ref vertices.Array[count + 3]); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 1)); indices.Add((ushort)(count + 2)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); indices.Add((ushort)count); indices.Add((ushort)(count + 3)); indices.Add((ushort)(count + 3)); indices.Add((ushort)count); indices.Add((ushort)(count + 2)); break; } }
public NorGateElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { }
public static Point3 RotationToDirection(int rotation) { return(CellFace.FaceToPoint3((rotation + 2) % 4)); }
public void Update(float dt) { Point3 coordinates = m_componentBlockEntity.Coordinates; if (m_updateSmeltingRecipe) { m_updateSmeltingRecipe = false; result[0] = m_matchedIngredients[7]; result[1] = m_matchedIngredients[8]; result[2] = m_matchedIngredients[9]; bool flag = FindSmeltingRecipe(5f); if (result[0] != m_matchedIngredients[7] || result[1] != m_matchedIngredients[8] || result[2] != m_matchedIngredients[9]) { SmeltingProgress = 0f; m_time = 0; } m_smeltingRecipe2 = flag; if (flag != m_smeltingRecipe) { m_smeltingRecipe = flag; SmeltingProgress = 0f; m_time = 0; } } if (m_smeltingRecipe2 && Utils.SubsystemTime.PeriodicGameTimeEvent(0.2, 0.0)) { int num = 1; int num2 = 0; var point = CellFace.FaceToPoint3(FourDirectionalBlock.GetDirection(Utils.Terrain.GetCellValue(coordinates.X, coordinates.Y, coordinates.Z))); int num3 = coordinates.X - point.X; int num4 = coordinates.Y - point.Y; int num5 = coordinates.Z - point.Z, v; for (int i = -1; i < 2; i++) { for (int j = -1; j < 3; j++) { for (int k = -1; k < 2; k++) { int cellContents = Utils.Terrain.GetCellContents(num3 + i, num4 + j, num5 + k); if (i * i + k * k > 0 && j >= 1 && cellContents != 73) { num = 0; break; } if (i * i + k * k == 1 && j == 0 && cellContents == 0 && (v = Terrain.ReplaceLight(Utils.Terrain.GetCellValue(num3 + 2 * i, num4 + j, num5 + 2 * k), 0)) != (BlastBlowerBlock.Index | FurnaceNBlock.SetHeatLevel(Terrain.ExtractData(v), 1) << 14) && (num3 + i != coordinates.X || num5 + k != coordinates.Z)) { num = 0; break; } if (i * i + k * k == 1 && j == 0 && cellContents == 0) { num2 = 1; } if (i * i + k * k == 1 && j == 0 && cellContents != 0 && cellContents != 73 && (num3 + i != coordinates.X || num5 + k != coordinates.Z)) { num = 0; break; } if (i * i + k * k == 2 && j == 0 && cellContents != 73) { num = 0; break; } if (j < 0 && cellContents != 73) { num = 0; break; } } } } if (num == 0 || num2 == 0) { m_smeltingRecipe = false; } if (num == 1 && num2 >= 1 && !m_smeltingRecipe) { m_smeltingRecipe = m_smeltingRecipe2; } } m_time++; if (!m_smeltingRecipe) { HeatLevel = 0f; m_fireTimeRemaining = 0f; SmeltingProgress = 0f; } if (m_smeltingRecipe && m_fireTimeRemaining <= 0f) { HeatLevel = 5f; } if (m_smeltingRecipe) { SmeltingProgress = MathUtils.Min(SmeltingProgress + 0.1f * dt, 1f); if (SmeltingProgress >= 1f) { int[] array = { IronOreChunkBlock.Index, ItemBlock.IdTable["IronOrePowder"], CoalChunkBlock.Index, ItemBlock.IdTable["CoalPowder"], SandBlock.Index, PigmentBlock.Index, IronIngotBlock.Index }; for (int l = 0; l < 7; l++) { if (m_matchedIngredients[l] > 0) { int b = array[l]; for (int m = 0; m < m_furnaceSize; m++) { if (m_slots[m].Count > 0 && GetSlotValue(m) == b) { if (m_slots[m].Count >= m_matchedIngredients[l]) { m_slots[m].Count -= m_matchedIngredients[l]; m_matchedIngredients[l] = 0; } else { m_matchedIngredients[l] -= m_slots[m].Count; m_slots[m].Count = 0; } if (m_matchedIngredients[l] == 0) { break; } } } } } if (m_matchedIngredients[8] >= 1) { m_slots[ResultSlotIndex].Value = ItemBlock.IdTable["SteelIngot"]; m_slots[ResultSlotIndex].Count += m_matchedIngredients[8]; } if (m_matchedIngredients[7] >= 1) { m_slots[RemainsSlotIndex].Value = ItemBlock.IdTable["ScrapIron"]; m_slots[RemainsSlotIndex].Count += m_matchedIngredients[7]; } if (m_matchedIngredients[9] >= 1) { m_slots[ResultSlotIndex].Value = IronIngotBlock.Index; m_slots[ResultSlotIndex].Count += m_matchedIngredients[9]; } m_smeltingRecipe = false; SmeltingProgress = 0f; m_updateSmeltingRecipe = true; } } }
public override bool OnUse(Ray3 ray, ComponentMiner componentMiner) { IInventory inventory = componentMiner.Inventory; int activeBlockValue = componentMiner.ActiveBlockValue; int num = Terrain.ExtractContents(activeBlockValue); if (num == 90) { object obj = componentMiner.Raycast(ray, RaycastMode.Gathering); if (obj is TerrainRaycastResult) { CellFace cellFace = ((TerrainRaycastResult)obj).CellFace; int cellValue = base.SubsystemTerrain.Terrain.GetCellValue(cellFace.X, cellFace.Y, cellFace.Z); int num2 = Terrain.ExtractContents(cellValue); int data = Terrain.ExtractData(cellValue); Block block = BlocksManager.Blocks[num2]; if (block is WaterBlock && FluidBlock.GetLevel(data) == 0) { int value = Terrain.ReplaceContents(activeBlockValue, 91); inventory.RemoveSlotItems(inventory.ActiveSlotIndex, inventory.GetSlotCount(inventory.ActiveSlotIndex)); if (inventory.GetSlotCount(inventory.ActiveSlotIndex) == 0) { inventory.AddSlotItems(inventory.ActiveSlotIndex, value, 1); } base.SubsystemTerrain.DestroyCell(0, cellFace.X, cellFace.Y, cellFace.Z, 0, noDrop: false, noParticleSystem: false); return(true); } if (block is MagmaBlock && FluidBlock.GetLevel(data) == 0) { int value2 = Terrain.ReplaceContents(activeBlockValue, 93); inventory.RemoveSlotItems(inventory.ActiveSlotIndex, inventory.GetSlotCount(inventory.ActiveSlotIndex)); if (inventory.GetSlotCount(inventory.ActiveSlotIndex) == 0) { inventory.AddSlotItems(inventory.ActiveSlotIndex, value2, 1); } base.SubsystemTerrain.DestroyCell(0, cellFace.X, cellFace.Y, cellFace.Z, 0, noDrop: false, noParticleSystem: false); return(true); } } else if (obj is BodyRaycastResult) { ComponentUdder componentUdder = ((BodyRaycastResult)obj).ComponentBody.Entity.FindComponent <ComponentUdder>(); if (componentUdder != null && componentUdder.Milk(componentMiner)) { int value3 = Terrain.ReplaceContents(activeBlockValue, 110); inventory.RemoveSlotItems(inventory.ActiveSlotIndex, inventory.GetSlotCount(inventory.ActiveSlotIndex)); if (inventory.GetSlotCount(inventory.ActiveSlotIndex) == 0) { inventory.AddSlotItems(inventory.ActiveSlotIndex, value3, 1); } m_subsystemAudio.PlaySound("Audio/Milked", 1f, 0f, ray.Position, 2f, autoDelay: true); } return(true); } } if (num == 91) { TerrainRaycastResult?terrainRaycastResult = componentMiner.Raycast <TerrainRaycastResult>(ray, RaycastMode.Interaction); if (terrainRaycastResult.HasValue && componentMiner.Place(terrainRaycastResult.Value, Terrain.MakeBlockValue(18))) { inventory.RemoveSlotItems(inventory.ActiveSlotIndex, 1); if (inventory.GetSlotCount(inventory.ActiveSlotIndex) == 0) { int value4 = Terrain.ReplaceContents(activeBlockValue, 90); inventory.AddSlotItems(inventory.ActiveSlotIndex, value4, 1); } return(true); } } if (num == 93) { TerrainRaycastResult?terrainRaycastResult2 = componentMiner.Raycast <TerrainRaycastResult>(ray, RaycastMode.Interaction); if (terrainRaycastResult2.HasValue) { if (componentMiner.Place(terrainRaycastResult2.Value, Terrain.MakeBlockValue(92))) { inventory.RemoveSlotItems(inventory.ActiveSlotIndex, 1); if (inventory.GetSlotCount(inventory.ActiveSlotIndex) == 0) { int value5 = Terrain.ReplaceContents(activeBlockValue, 90); inventory.AddSlotItems(inventory.ActiveSlotIndex, value5, 1); } } return(true); } } switch (num) { case 110: case 245: return(true); case 251: case 252: return(true); case 128: case 129: { TerrainRaycastResult?terrainRaycastResult3 = componentMiner.Raycast <TerrainRaycastResult>(ray, RaycastMode.Digging); if (terrainRaycastResult3.HasValue) { CellFace cellFace2 = terrainRaycastResult3.Value.CellFace; int cellValue2 = base.SubsystemTerrain.Terrain.GetCellValue(cellFace2.X, cellFace2.Y, cellFace2.Z); int num3 = Terrain.ExtractContents(cellValue2); Block block2 = BlocksManager.Blocks[num3]; if (block2 is IPaintableBlock) { Vector3 normal = CellFace.FaceToVector3(terrainRaycastResult3.Value.CellFace.Face); Vector3 position = terrainRaycastResult3.Value.HitPoint(); int? num4 = (num == 128) ? null : new int?(PaintBucketBlock.GetColor(Terrain.ExtractData(activeBlockValue))); Color color = num4.HasValue ? SubsystemPalette.GetColor(base.SubsystemTerrain, num4) : new Color(128, 128, 128, 128); int value6 = ((IPaintableBlock)block2).Paint(base.SubsystemTerrain, cellValue2, num4); base.SubsystemTerrain.ChangeCell(cellFace2.X, cellFace2.Y, cellFace2.Z, value6); componentMiner.DamageActiveTool(1); m_subsystemAudio.PlayRandomSound("Audio/Paint", 0.4f, m_random.Float(-0.1f, 0.1f), componentMiner.ComponentCreature.ComponentBody.Position, 2f, autoDelay: true); m_subsystemParticles.AddParticleSystem(new PaintParticleSystem(base.SubsystemTerrain, position, normal, color)); } return(true); } break; } } return(false); }
public override void OnHitByProjectile(CellFace cellFace, WorldItem worldItem) => Utils.OnHitByProjectile(cellFace, worldItem);
public ThermometerElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { m_subsystemMetersBlockBehavior = base.SubsystemElectricity.Project.FindSubsystem <SubsystemMetersBlockBehavior>(throwOnError: true); }
public PressurePlateElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { }
public void DrawReticleHighlight(Camera camera) { if (camera.Eye.HasValue && m_highlightRaycastResult is TerrainRaycastResult) { TerrainRaycastResult terrainRaycastResult = (TerrainRaycastResult)m_highlightRaycastResult; Vector3 vector = terrainRaycastResult.HitPoint(); Vector3 vector2 = (!(BlocksManager.Blocks[Terrain.ExtractContents(terrainRaycastResult.Value)] is CrossBlock)) ? CellFace.FaceToVector3(terrainRaycastResult.CellFace.Face) : (-terrainRaycastResult.Ray.Direction); float num = Vector3.Distance(camera.ViewPosition, vector); float s = 0.03f + MathUtils.Min(0.008f * num, 0.04f); float s2 = 0.01f * num; Vector3 v = (MathUtils.Abs(Vector3.Dot(vector2, Vector3.UnitY)) < 0.5f) ? Vector3.UnitY : Vector3.UnitX; Vector3 vector3 = Vector3.Normalize(Vector3.Cross(vector2, v)); Vector3 v2 = Vector3.Normalize(Vector3.Cross(vector2, vector3)); Subtexture subtexture = ContentManager.Get <Subtexture>("Textures/Atlas/Reticle"); TexturedBatch3D texturedBatch3D = m_primitivesRenderer3D.TexturedBatch(subtexture.Texture, useAlphaTest: false, 0, DepthStencilState.DepthRead, null, null, SamplerState.LinearClamp); Vector3 p = vector + s * (-vector3 + v2) + s2 * vector2; Vector3 p2 = vector + s * (vector3 + v2) + s2 * vector2; Vector3 p3 = vector + s * (vector3 - v2) + s2 * vector2; Vector3 p4 = vector + s * (-vector3 - v2) + s2 * vector2; Vector2 texCoord = new Vector2(subtexture.TopLeft.X, subtexture.TopLeft.Y); Vector2 texCoord2 = new Vector2(subtexture.BottomRight.X, subtexture.TopLeft.Y); Vector2 texCoord3 = new Vector2(subtexture.BottomRight.X, subtexture.BottomRight.Y); Vector2 texCoord4 = new Vector2(subtexture.TopLeft.X, subtexture.BottomRight.Y); texturedBatch3D.QueueQuad(p, p2, p3, p4, texCoord, texCoord2, texCoord3, texCoord4, Color.White); texturedBatch3D.Flush(camera.ViewProjectionMatrix); } }
public void Update(float dt) { double totalElapsedGameTime = m_subsystemGameInfo.TotalElapsedGameTime; foreach (Projectile projectile in m_projectiles) { if (projectile.ToRemove) { m_projectilesToRemove.Add(projectile); } else { Block block = BlocksManager.Blocks[Terrain.ExtractContents(projectile.Value)]; if (totalElapsedGameTime - projectile.CreationTime > 40.0) { projectile.ToRemove = true; } TerrainChunk chunkAtCell = m_subsystemTerrain.Terrain.GetChunkAtCell(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Z)); if (chunkAtCell == null || chunkAtCell.State <= TerrainChunkState.InvalidContents4) { projectile.NoChunk = true; if (projectile.TrailParticleSystem != null) { projectile.TrailParticleSystem.IsStopped = true; } } else { projectile.NoChunk = false; Vector3 position = projectile.Position; Vector3 vector = position + projectile.Velocity * dt; Vector3 v = block.ProjectileTipOffset * Vector3.Normalize(projectile.Velocity); BodyRaycastResult? bodyRaycastResult = m_subsystemBodies.Raycast(position + v, vector + v, 0.2f, (ComponentBody body, float distance) => true); TerrainRaycastResult?terrainRaycastResult = m_subsystemTerrain.Raycast(position + v, vector + v, useInteractionBoxes: false, skipAirBlocks: true, (int value, float distance) => BlocksManager.Blocks[Terrain.ExtractContents(value)].IsCollidable); bool flag = block.DisintegratesOnHit; if (terrainRaycastResult.HasValue || bodyRaycastResult.HasValue) { CellFace? cellFace = terrainRaycastResult.HasValue ? new CellFace?(terrainRaycastResult.Value.CellFace) : null; ComponentBody componentBody = bodyRaycastResult.HasValue ? bodyRaycastResult.Value.ComponentBody : null; SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(Terrain.ExtractContents(projectile.Value)); for (int i = 0; i < blockBehaviors.Length; i++) { flag |= blockBehaviors[i].OnHitAsProjectile(cellFace, componentBody, projectile); } projectile.ToRemove |= flag; } Vector3?vector2 = null; if (bodyRaycastResult.HasValue && (!terrainRaycastResult.HasValue || bodyRaycastResult.Value.Distance < terrainRaycastResult.Value.Distance)) { if (projectile.Velocity.Length() > 10f) { ComponentMiner.AttackBody(bodyRaycastResult.Value.ComponentBody, projectile.Owner, bodyRaycastResult.Value.HitPoint(), Vector3.Normalize(projectile.Velocity), block.GetProjectilePower(projectile.Value), isMeleeAttack: false); if (projectile.Owner != null && projectile.Owner.PlayerStats != null) { projectile.Owner.PlayerStats.RangedHits++; } } if (projectile.IsIncendiary) { bodyRaycastResult.Value.ComponentBody.Entity.FindComponent <ComponentOnFire>()?.SetOnFire(projectile?.Owner, m_random.Float(6f, 8f)); } vector = position; projectile.Velocity *= -0.05f; projectile.Velocity += m_random.Vector3(0.33f * projectile.Velocity.Length()); projectile.AngularVelocity *= -0.05f; } else if (terrainRaycastResult.HasValue) { CellFace cellFace2 = terrainRaycastResult.Value.CellFace; int cellValue = m_subsystemTerrain.Terrain.GetCellValue(cellFace2.X, cellFace2.Y, cellFace2.Z); int num = Terrain.ExtractContents(cellValue); Block block2 = BlocksManager.Blocks[num]; float num2 = projectile.Velocity.Length(); SubsystemBlockBehavior[] blockBehaviors2 = m_subsystemBlockBehaviors.GetBlockBehaviors(num); for (int j = 0; j < blockBehaviors2.Length; j++) { blockBehaviors2[j].OnHitByProjectile(cellFace2, projectile); } if (num2 > 10f && m_random.Float(0f, 1f) > block2.ProjectileResilience) { m_subsystemTerrain.DestroyCell(0, cellFace2.X, cellFace2.Y, cellFace2.Z, 0, noDrop: true, noParticleSystem: false); m_subsystemSoundMaterials.PlayImpactSound(cellValue, position, 1f); } if (projectile.IsIncendiary) { m_subsystemFireBlockBehavior.SetCellOnFire(terrainRaycastResult.Value.CellFace.X, terrainRaycastResult.Value.CellFace.Y, terrainRaycastResult.Value.CellFace.Z, 1f); Vector3 vector3 = projectile.Position - 0.75f * Vector3.Normalize(projectile.Velocity); for (int k = 0; k < 8; k++) { Vector3 v2 = (k == 0) ? Vector3.Normalize(projectile.Velocity) : m_random.Vector3(1.5f); TerrainRaycastResult?terrainRaycastResult2 = m_subsystemTerrain.Raycast(vector3, vector3 + v2, useInteractionBoxes: false, skipAirBlocks: true, (int value, float distance) => true); if (terrainRaycastResult2.HasValue) { m_subsystemFireBlockBehavior.SetCellOnFire(terrainRaycastResult2.Value.CellFace.X, terrainRaycastResult2.Value.CellFace.Y, terrainRaycastResult2.Value.CellFace.Z, 1f); } } } if (num2 > 5f) { m_subsystemSoundMaterials.PlayImpactSound(cellValue, position, 1f); } if (block.IsStickable && num2 > 10f && m_random.Bool(block2.ProjectileStickProbability)) { Vector3 v3 = Vector3.Normalize(projectile.Velocity); float s = MathUtils.Lerp(0.1f, 0.2f, MathUtils.Saturate((num2 - 15f) / 20f)); vector2 = position + terrainRaycastResult.Value.Distance * Vector3.Normalize(projectile.Velocity) + v3 * s; } else { Plane plane = cellFace2.CalculatePlane(); vector = position; if (plane.Normal.X != 0f) { projectile.Velocity *= new Vector3(-0.3f, 0.3f, 0.3f); } if (plane.Normal.Y != 0f) { projectile.Velocity *= new Vector3(0.3f, -0.3f, 0.3f); } if (plane.Normal.Z != 0f) { projectile.Velocity *= new Vector3(0.3f, 0.3f, -0.3f); } float num3 = projectile.Velocity.Length(); projectile.Velocity = num3 * Vector3.Normalize(projectile.Velocity + m_random.Vector3(num3 / 6f, num3 / 3f)); projectile.AngularVelocity *= -0.3f; } MakeProjectileNoise(projectile); } if (terrainRaycastResult.HasValue || bodyRaycastResult.HasValue) { if (flag) { m_subsystemParticles.AddParticleSystem(block.CreateDebrisParticleSystem(m_subsystemTerrain, projectile.Position, projectile.Value, 1f)); } else if (!projectile.ToRemove && (vector2.HasValue || projectile.Velocity.Length() < 1f)) { if (projectile.ProjectileStoppedAction == ProjectileStoppedAction.TurnIntoPickable) { int num4 = BlocksManager.DamageItem(projectile.Value, 1); if (num4 != 0) { if (vector2.HasValue) { CalculateVelocityAlignMatrix(block, vector2.Value, projectile.Velocity, out Matrix matrix); m_subsystemPickables.AddPickable(num4, 1, projectile.Position, Vector3.Zero, matrix); } else { m_subsystemPickables.AddPickable(num4, 1, position, Vector3.Zero, null); } } projectile.ToRemove = true; } else if (projectile.ProjectileStoppedAction == ProjectileStoppedAction.Disappear) { projectile.ToRemove = true; } } } float num5 = projectile.IsInWater ? MathUtils.Pow(0.001f, dt) : MathUtils.Pow(block.ProjectileDamping, dt); projectile.Velocity.Y += -10f * dt; projectile.Velocity *= num5; projectile.AngularVelocity *= num5; projectile.Position = vector; projectile.Rotation += projectile.AngularVelocity * dt; if (projectile.TrailParticleSystem != null) { if (!m_subsystemParticles.ContainsParticleSystem((ParticleSystemBase)projectile.TrailParticleSystem)) { m_subsystemParticles.AddParticleSystem((ParticleSystemBase)projectile.TrailParticleSystem); } Vector3 v4 = (projectile.TrailOffset != Vector3.Zero) ? Vector3.TransformNormal(projectile.TrailOffset, Matrix.CreateFromAxisAngle(Vector3.Normalize(projectile.Rotation), projectile.Rotation.Length())) : Vector3.Zero; projectile.TrailParticleSystem.Position = projectile.Position + v4; if (projectile.IsInWater) { projectile.TrailParticleSystem.IsStopped = true; } } bool flag2 = IsWater(projectile.Position); if (projectile.IsInWater != flag2) { if (flag2) { float num6 = new Vector2(projectile.Velocity.X + projectile.Velocity.Z).Length(); if (num6 > 6f && num6 > 4f * MathUtils.Abs(projectile.Velocity.Y)) { projectile.Velocity *= 0.5f; projectile.Velocity.Y *= -1f; flag2 = false; } else { projectile.Velocity *= 0.2f; } float?surfaceHeight = m_subsystemFluidBlockBehavior.GetSurfaceHeight(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Y), Terrain.ToCell(projectile.Position.Z)); if (surfaceHeight.HasValue) { m_subsystemParticles.AddParticleSystem(new WaterSplashParticleSystem(m_subsystemTerrain, new Vector3(projectile.Position.X, surfaceHeight.Value, projectile.Position.Z), large: false)); m_subsystemAudio.PlayRandomSound("Audio/Splashes", 1f, m_random.Float(-0.2f, 0.2f), projectile.Position, 6f, autoDelay: true); MakeProjectileNoise(projectile); } } projectile.IsInWater = flag2; } if (IsMagma(projectile.Position)) { m_subsystemParticles.AddParticleSystem(new MagmaSplashParticleSystem(m_subsystemTerrain, projectile.Position, large: false)); m_subsystemAudio.PlayRandomSound("Audio/Sizzles", 1f, m_random.Float(-0.2f, 0.2f), projectile.Position, 3f, autoDelay: true); projectile.ToRemove = true; m_subsystemExplosions.TryExplodeBlock(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Y), Terrain.ToCell(projectile.Position.Z), projectile.Value); } if (m_subsystemTime.PeriodicGameTimeEvent(1.0, (double)(projectile.GetHashCode() % 100) / 100.0) && (m_subsystemFireBlockBehavior.IsCellOnFire(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Y + 0.1f), Terrain.ToCell(projectile.Position.Z)) || m_subsystemFireBlockBehavior.IsCellOnFire(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Y + 0.1f) - 1, Terrain.ToCell(projectile.Position.Z)))) { m_subsystemAudio.PlayRandomSound("Audio/Sizzles", 1f, m_random.Float(-0.2f, 0.2f), projectile.Position, 3f, autoDelay: true); projectile.ToRemove = true; m_subsystemExplosions.TryExplodeBlock(Terrain.ToCell(projectile.Position.X), Terrain.ToCell(projectile.Position.Y), Terrain.ToCell(projectile.Position.Z), projectile.Value); } } } } foreach (Projectile item in m_projectilesToRemove) { if (item.TrailParticleSystem != null) { item.TrailParticleSystem.IsStopped = true; } m_projectiles.Remove(item); if (this.ProjectileRemoved != null) { this.ProjectileRemoved(item); } } m_projectilesToRemove.Clear(); }
public RealTimeClockElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { m_subsystemTimeOfDay = base.SubsystemElectricity.Project.FindSubsystem <SubsystemTimeOfDay>(throwOnError: true); }
public MountedElectricElement(SubsystemElectricity subsystemElectricity, CellFace cellFace) : base(subsystemElectricity, cellFace) { }
public override void Draw(DrawContext dc) { if (Design == null) { return; } Matrix matrix; if (Mode == ViewMode.Perspective) { Viewport viewport = Display.Viewport; Vector3 vector = new Vector3(0.5f, 0.5f, 0.5f); Matrix m = Matrix.CreateLookAt(2.65f * m_direction + vector, vector, Vector3.UnitY); Matrix m2 = Matrix.CreatePerspectiveFieldOfView(1.2f, base.ActualSize.X / base.ActualSize.Y, 0.4f, 4f); Matrix m3 = MatrixUtils.CreateScaleTranslation(base.ActualSize.X, 0f - base.ActualSize.Y, base.ActualSize.X / 2f, base.ActualSize.Y / 2f) * base.GlobalTransform * MatrixUtils.CreateScaleTranslation(2f / (float)viewport.Width, -2f / (float)viewport.Height, -1f, 1f); matrix = m * m2 * m3; FlatBatch3D flatBatch3D = m_primitivesRenderer3d.FlatBatch(1, DepthStencilState.DepthRead); for (int i = 0; i <= Design.Resolution; i++) { float num = (float)i / (float)Design.Resolution; Color color = (i % 2 == 0) ? new Color(56, 56, 56, 56) : new Color(28, 28, 28, 28); color *= base.GlobalColorTransform; flatBatch3D.QueueLine(new Vector3(num, 0f, 0f), new Vector3(num, 0f, 1f), color); flatBatch3D.QueueLine(new Vector3(0f, 0f, num), new Vector3(1f, 0f, num), color); flatBatch3D.QueueLine(new Vector3(0f, num, 0f), new Vector3(0f, num, 1f), color); flatBatch3D.QueueLine(new Vector3(0f, 0f, num), new Vector3(0f, 1f, num), color); flatBatch3D.QueueLine(new Vector3(0f, num, 1f), new Vector3(1f, num, 1f), color); flatBatch3D.QueueLine(new Vector3(num, 0f, 1f), new Vector3(num, 1f, 1f), color); } Color color2 = new Color(64, 64, 64, 255) * base.GlobalColorTransform; FontBatch3D fontBatch3D = m_primitivesRenderer3d.FontBatch(ContentManager.Get <BitmapFont>("Fonts/Pericles"), 1); fontBatch3D.QueueText("Front", new Vector3(0.5f, 0f, 0f), 0.004f * new Vector3(-1f, 0f, 0f), 0.004f * new Vector3(0f, 0f, -1f), color2, TextAnchor.HorizontalCenter); fontBatch3D.QueueText("Side", new Vector3(1f, 0f, 0.5f), 0.004f * new Vector3(0f, 0f, -1f), 0.004f * new Vector3(1f, 0f, 0f), color2, TextAnchor.HorizontalCenter); if (DrawDebugFurniture) { DebugDraw(); } } else { Vector3 position; Vector3 up; if (Mode == ViewMode.Side) { position = new Vector3(1f, 0f, 0f); up = new Vector3(0f, 1f, 0f); } else if (Mode != ViewMode.Top) { position = new Vector3(0f, 0f, -1f); up = new Vector3(0f, 1f, 0f); } else { position = new Vector3(0f, 1f, 0f); up = new Vector3(0f, 0f, 1f); } Viewport viewport2 = Display.Viewport; float num2 = MathUtils.Min(base.ActualSize.X, base.ActualSize.Y); Matrix m4 = Matrix.CreateLookAt(position, new Vector3(0f, 0f, 0f), up); Matrix m5 = Matrix.CreateOrthographic(2f, 2f, -10f, 10f); Matrix m6 = MatrixUtils.CreateScaleTranslation(num2, 0f - num2, base.ActualSize.X / 2f, base.ActualSize.Y / 2f) * base.GlobalTransform * MatrixUtils.CreateScaleTranslation(2f / (float)viewport2.Width, -2f / (float)viewport2.Height, -1f, 1f); matrix = Matrix.CreateTranslation(-0.5f, -0.5f, -0.5f) * m4 * m5 * m6; FlatBatch2D flatBatch2D = m_primitivesRenderer2d.FlatBatch(); Matrix m7 = base.GlobalTransform; for (int j = 1; j < Design.Resolution; j++) { float num3 = (float)j / (float)Design.Resolution; Vector2 v = new Vector2(base.ActualSize.X * num3, 0f); Vector2 v2 = new Vector2(base.ActualSize.X * num3, base.ActualSize.Y); Vector2 v3 = new Vector2(0f, base.ActualSize.Y * num3); Vector2 v4 = new Vector2(base.ActualSize.X, base.ActualSize.Y * num3); Vector2.Transform(ref v, ref m7, out v); Vector2.Transform(ref v2, ref m7, out v2); Vector2.Transform(ref v3, ref m7, out v3); Vector2.Transform(ref v4, ref m7, out v4); Color color3 = (j % 2 == 0) ? new Color(0, 0, 0, 56) : new Color(0, 0, 0, 28); Color color4 = (j % 2 == 0) ? new Color(56, 56, 56, 56) : new Color(28, 28, 28, 28); color3 *= base.GlobalColorTransform; color4 *= base.GlobalColorTransform; flatBatch2D.QueueLine(v, v2, 0f, (j % 2 == 0) ? color3 : (color3 * 0.75f)); flatBatch2D.QueueLine(v + new Vector2(1f, 0f), v2 + new Vector2(1f, 0f), 0f, color4); flatBatch2D.QueueLine(v3, v4, 0f, color3); flatBatch2D.QueueLine(v3 + new Vector2(0f, 1f), v4 + new Vector2(0f, 1f), 0f, color4); } } Matrix matrix2 = Matrix.Identity; FurnitureGeometry geometry = Design.Geometry; for (int k = 0; k < 6; k++) { Color globalColorTransform = base.GlobalColorTransform; if (Mode == ViewMode.Perspective) { float num4 = LightingManager.LightIntensityByLightValueAndFace[15 + 16 * CellFace.OppositeFace(k)]; globalColorTransform *= new Color(num4, num4, num4); } if (geometry.SubsetOpaqueByFace[k] != null) { BlocksManager.DrawMeshBlock(m_primitivesRenderer3d, geometry.SubsetOpaqueByFace[k], globalColorTransform, 1f, ref matrix2, null); } if (geometry.SubsetAlphaTestByFace[k] != null) { BlocksManager.DrawMeshBlock(m_primitivesRenderer3d, geometry.SubsetAlphaTestByFace[k], globalColorTransform, 1f, ref matrix2, null); } } m_primitivesRenderer3d.Flush(matrix); m_primitivesRenderer2d.Flush(); }
public override bool IsFaceTransparent(SubsystemTerrain subsystemTerrain, int face, int value) { int mountingFace = GetMountingFace(Terrain.ExtractData(value)); return(face != CellFace.OppositeFace(mountingFace)); }
public override void DrawBlock(PrimitivesRenderer3D primitivesRenderer, int value, Color color, float size, ref Matrix matrix, DrawBlockEnvironmentData environmentData) { if (environmentData.SubsystemTerrain == null) { return; } int designIndex = GetDesignIndex(Terrain.ExtractData(value)); FurnitureDesign design = environmentData.SubsystemTerrain.SubsystemFurnitureBlockBehavior.GetDesign(designIndex); if (design == null) { return; } Vector3 v = default(Vector3); v.X = -0.5f * (float)(design.Box.Left + design.Box.Right) / (float)design.Resolution; v.Y = -0.5f * (float)(design.Box.Top + design.Box.Bottom) / (float)design.Resolution; v.Z = -0.5f * (float)(design.Box.Near + design.Box.Far) / (float)design.Resolution; Matrix matrix2 = Matrix.CreateTranslation(v * size) * matrix; FurnitureGeometry geometry = design.Geometry; for (int i = 0; i < 6; i++) { float s = LightingManager.LightIntensityByLightValueAndFace[environmentData.Light + 16 * CellFace.OppositeFace(i)]; Color color2 = Color.MultiplyColorOnly(color, s); if (geometry.SubsetOpaqueByFace[i] != null) { BlocksManager.DrawMeshBlock(primitivesRenderer, geometry.SubsetOpaqueByFace[i], color2, size, ref matrix2, environmentData); } if (geometry.SubsetAlphaTestByFace[i] != null) { BlocksManager.DrawMeshBlock(primitivesRenderer, geometry.SubsetAlphaTestByFace[i], color2, size, ref matrix2, environmentData); } } }