Space Engineers

Space Engineers

SurvivalMirror
Popcorn 19 Nov, 2024 @ 11:47am
The code
If someone can see the problem or removed calls since 2021, since I can't

SurvivalMirror.cs
using Sandbox.Definitions; using Sandbox.Game; using Sandbox.Game.Entities; using Sandbox.ModAPI; using System; using System.Collections.Generic; using VRage; using VRage.Game; using VRage.Game.Components; using VRage.Game.ModAPI; using VRage.Input; using VRage.ModAPI; using VRage.ObjectBuilders; using VRage.Utils; using VRageMath; namespace SurvivalMirror { [MySessionComponentDescriptor(MyUpdateOrder.AfterSimulation)] public class SurvivalMirror : MySessionComponentBase { private static MyEasyNetworkManager network = new MyEasyNetworkManager(32158); private bool useMirror; private MirrorMode mirrorMode = MirrorMode.None | MirrorMode.Offset; private Dictionary<IMyCubeGrid, Mirror> mirrors = new Dictionary<IMyCubeGrid, Mirror>(); public override void Init(MyObjectBuilder_SessionComponent sessionComponent) { if (!MyAPIGateway.Utilities.IsDedicated) { MyEntities.OnEntityAdd += OnEntAdd; foreach (IMyEntity ent in MyEntities.GetEntities()) { OnEntAdd(ent); } } network.OnRecievedPacket += OnPacketRecieved; } public void OnPacketRecieved(int packetID, ulong senderId, byte[] packetData, bool IsFromServer) { if (packetID == 1) { PacketNewBlock packet = MyAPIGateway.Utilities.SerializeFromBinary<PacketNewBlock>(packetData); IMyCubeGrid grid = MyEntities.GetEntityById(packet.GridId) as IMyCubeGrid; if (grid != null) { grid.AddBlock(packet.Block, false); } } } public override void BeforeStart() { network.Register(); } protected override void UnloadData() { network?.UnRegister(); network = null; } public void OnEntAdd(IMyEntity e) { if (e != null && !e.MarkedForClose && e.Physics != null && e is IMyCubeGrid) { IMyCubeGrid myGrid = e as IMyCubeGrid; if (!mirrors.ContainsKey(myGrid)) { mirrors.Add(myGrid, new Mirror(0, MirrorMode.None)); myGrid.OnBlockAdded += OnBlockAddToGrid; } } } public void OnBlockAddToGrid(IMySlimBlock block) { if (!useMirror || IsCreative()) return; if (block != null && mirrors.ContainsKey(block.CubeGrid)) { IHitInfo hit; MyAPIGateway.Physics.CastRay(Session.Camera.WorldMatrix.Translation, Session.Camera.WorldMatrix.Translation + (Session.Camera.WorldMatrix.Forward * 10), out hit); if (hit != null && hit.HitEntity != null && hit.HitEntity is IMyCubeGrid) { IMyCubeGrid grid = hit.HitEntity as IMyCubeGrid; Vector3D pos; MyCubeBuilder.Static.GetAddPosition(out pos); Vector3I gridPos = grid.WorldToGridInteger(pos); if (block.CubeGrid == grid && grid.GetCubeBlock(gridPos) == block) { CreateMirrors(block); } } } } private void CreateMirrors(IMySlimBlock block) { if (block != null && mirrors.ContainsKey(block.CubeGrid)) { IMyCubeGrid grid = block.CubeGrid; Mirror mirror = mirrors[block.CubeGrid]; Vector3I blockPos = block.Min; Vector3I mirrorPos = MirrorUtils.GetMirrorBlockPos(mirror.Mode, (int)mirror.Val, ref blockPos); Vector3 min = block.Min * grid.GridSize - new Vector3(grid.GridSize / 2f); Vector3 max = block.Max * grid.GridSize + new Vector3(grid.GridSize / 2f); BoundingBox boundingBox = new BoundingBox(min, max); if (boundingBox.Size.X > 1f * grid.GridSize || boundingBox.Size.Y > 1f * grid.GridSize || boundingBox.Size.Z > 1f * grid.GridSize) { Utils.Notify("Multiblocks are not supported as of right now, full support coming soon:tm:", 5000, "Red"); } TryAddMirrorBlock(mirrorPos, block); } } //Why cant I get the construction stockpile for the first ♥♥♥♥♥♥♥ item of a Block private List<IMySlimBlock> neighborTest = new List<IMySlimBlock>(); private void TryAddMirrorBlock(Vector3I pos, IMySlimBlock block) { Mirror mirror = mirrors[block.CubeGrid]; if (block.CubeGrid.CanAddCube(pos)) { //change pos MyObjectBuilder_CubeBlock mirrorBuilder = block.GetObjectBuilder(true); mirrorBuilder.Min = new SerializableVector3I(pos.X, pos.Y, pos.Z); mirrorBuilder.EntityId = 0; //re orientate the block across the mirror Matrix matrix = Matrix.CreateFromDir(Base6Directions.GetVector(mirrorBuilder.BlockOrientation.Forward), Base6Directions.GetVector(mirrorBuilder.BlockOrientation.Up)); MySymmetryAxisEnum currentAxis = MySymmetryAxisEnum.None; Vector3 vector = mirror.Mode.ToVector(); if (MyUtils.IsZero(Math.Abs(Vector3.Dot(matrix.Right, vector)) - 1f, 1E-05f)) { currentAxis = ((MyCubeBlockDefinition)block.BlockDefinition).SymmetryX; } else if (MyUtils.IsZero(Math.Abs(Vector3.Dot(matrix.Up, vector)) - 1f, 1E-05f)) { currentAxis = ((MyCubeBlockDefinition)block.BlockDefinition).SymmetryY; } else if (MyUtils.IsZero(Math.Abs(Vector3.Dot(matrix.Forward, vector)) - 1f, 1E-05f)) { currentAxis = ((MyCubeBlockDefinition)block.BlockDefinition).SymmetryZ; } matrix = MirrorUtils.KeenBlockMirror(currentAxis, ref matrix); Quaternion rot = Quaternion.CreateFromRotationMatrix(matrix); mirrorBuilder.BlockOrientation.Forward = Base6Directions.GetForward(rot); mirrorBuilder.BlockOrientation.Up = Base6Directions.GetUp(rot); //add block and check pos if full IMySlimBlock b = block.CubeGrid.AddBlock(mirrorBuilder, false); if (b != null) { neighborTest.Clear(); b.GetNeighbours(neighborTest); if (neighborTest.Count != 0 && (b.CubeGrid.IsStatic || !b.IsInVoxel()) && !b.IsInEntity()) { //Check inventory MyComponentDefinition comp = MyCubeBuilder.Static.CurrentBlockDefinition.Components[0].Definition; VRage.Game.ModAPI.Ingame.MyItemType type = new VRage.Game.ModAPI.Ingame.MyItemType(comp.Id.TypeId.ToString(), comp.Id.SubtypeName); if (!Session.Player.Character.GetInventory().ContainItems(2, type)) { Utils.Notify("Cannot place mirror block! missing: " + type.SubtypeId, 3000, "Red"); return; } MyObjectBuilder_PhysicalObject objectBuilder = (MyObjectBuilder_PhysicalObject)MyObjectBuilderSerializer.CreateNewObject(comp.Id); Session.Player.Character.GetInventory().RemoveItemsOfType(1, objectBuilder); network.TransmitToServer(new PacketNewBlock(b.CubeGrid.EntityId, mirrorBuilder)); b.PlayConstructionSound(MyIntegrityChangeEnum.ConstructionProcess); return; } b.CubeGrid.RemoveBlock(b, false); } } } private bool IsCreative() { return Session.CreativeMode || (Session.HasCreativeRights && Session.EnableCopyPaste); } public override void UpdateAfterSimulation() { if (Session != null && !MyAPIGateway.Utilities.IsDedicated && Session.Camera != null && Session.Player != null && MyCubeBuilder.Static.IsActivated && !IsCreative()) { //Check GUI if (!MyAPIGateway.Gui.ChatEntryVisible && MyAPIGateway.Gui.GetCurrentScreen == MyTerminalPageEnum.None && !MyAPIGateway.Gui.IsCursorVisible) { if (MyAPIGateway.Input.IsNewKeyPressed(MyKeys.M)) { RotateMirrorMode(); useMirror = true; if (mirrorMode != MirrorMode.None) { string color = "Blue"; switch (mirrorMode & ~MirrorMode.Offset) { case MirrorMode.X: color = "Red"; break; case MirrorMode.Y: color = "Green"; break; } Utils.Notify("Mirror select mode set to the " + (mirrorMode & ~MirrorMode.Offset).ToString() + " axis", 2000, color); } else { Utils.Notify("Mirror select set to none", 1000); } } if (MyAPIGateway.Input.IsNewKeyPressed(MyKeys.N)) { mirrorMode = MirrorMode.None; useMirror = !useMirror; Utils.Notify((useMirror ? "Enabled" : "Disabled") + " mirror mode", 1000, "Green"); } if (MyAPIGateway.Input.IsNewKeyPressed(MyKeys.RightButton)) { if (useMirror && mirrorMode != MirrorMode.None) { IHitInfo hit; MyAPIGateway.Physics.CastRay(Session.Camera.WorldMatrix.Translation, Session.Camera.WorldMatrix.Translation + (Session.Camera.WorldMatrix.Forward * 15), out hit); if (hit != null && hit.HitEntity != null && hit.HitEntity is IMyCubeGrid) { IMyCubeGrid grid = hit.HitEntity as IMyCubeGrid; int value = MirrorUtils.GetMirrorValue(grid.WorldToGridInteger(hit.Position - (hit.Normal * .01f)), mirrorMode); mirrors[grid] = new Mirror(value, mirrorMode); } else { mirrorMode = MirrorMode.None; } MyVisualScriptLogicProvider.PlayHudSoundLocal(); } } } if (useMirror) { IHitInfo hit; MyAPIGateway.Physics.CastRay(Session.Camera.WorldMatrix.Translation, Session.Camera.WorldMatrix.Translation + (Session.Camera.WorldMatrix.Forward * 15), out hit); if (hit != null && hit.HitEntity != null && hit.HitEntity is IMyCubeGrid) { IMyCubeGrid grid = hit.HitEntity as IMyCubeGrid; if (mirrors.ContainsKey(grid)) { Mirror mirror = mirrors[grid]; MirrorUtils.DrawSymmetryPlanes(mirror.Mode, (int)mirror.Val, grid); if (mirrorMode != MirrorMode.None) { int val = MirrorUtils.GetMirrorValue(grid.WorldToGridInteger(hit.Position - (hit.Normal * .01f)), mirrorMode); MirrorUtils.DrawSymmetryPlanes(mirrorMode, val, grid); } else if(mirror.Mode != MirrorMode.None) { Vector3D worldPos; MyCubeBuilder.Static.GetAddPosition(out worldPos); Vector3I pos = grid.WorldToGridInteger(worldPos); pos = MirrorUtils.GetMirrorBlockPos(mirror.Mode, (int)mirror.Val, ref pos); Utils.DrawCubeOnGrid(grid, pos, 255, 0, 0, 100); } } } } } } private void RotateMirrorMode() { if (!mirrorMode.HasFlag(MirrorMode.Offset)) { mirrorMode ^= MirrorMode.Offset; } else { mirrorMode ^= MirrorMode.Offset; switch ((int)mirrorMode) { case (int)MirrorMode.None: mirrorMode = MirrorMode.X; break; case (int)MirrorMode.X: mirrorMode = MirrorMode.Y; break; case (int)MirrorMode.Y: mirrorMode = MirrorMode.Z; break; case (int)MirrorMode.Z: mirrorMode = MirrorMode.None | MirrorMode.Offset; break; } } } } }