Esempio n. 1
0
        /// <summary>
        /// Checks blocks being built in creative with multiblock placement.
        /// </summary>
        /// <param name="__instance"></param>
        /// <param name="area"></param>
        /// <returns></returns>
        private static bool BuildBlocksArea(MyCubeGrid __instance, MyCubeGrid.MyBlockBuildArea area)
        {
            if (!BlockLimiterConfig.Instance.EnableLimits)
            {
                return(true);
            }

            var def  = MyDefinitionManager.Static.GetCubeBlockDefinition(area.DefinitionId);
            var grid = __instance;

            int blocksToBuild = (int)area.BuildAreaSize.X * (int)area.BuildAreaSize.Y * (int)area.BuildAreaSize.Z;


            if (grid == null)
            {
                Log.Debug("Null grid in BuildBlockHandler");
                return(true);
            }

            var remoteUserId = MyEventContext.Current.Sender.Value;
            var playerId     = Utilities.GetPlayerIdFromSteamId(remoteUserId);

            if (Block.IsWithinLimits(def, playerId, grid.EntityId, blocksToBuild, out var limitName))
            {
                return(true);
            }

            if (remoteUserId == 0 || !MySession.Static.Players.IsPlayerOnline(playerId))
            {
                return(false);
            }

            BlockLimiter.Instance.Log.Info($"Blocked {Utilities.GetPlayerNameFromSteamId(remoteUserId)} from placing {def.ToString().Substring(16)} due to limits");

            var msg = Utilities.GetMessage(BlockLimiterConfig.Instance.DenyMessage, new List <string>()
            {
                def.ToString().Substring(16)
            }, limitName);

            BlockLimiter.Instance.Torch.CurrentSession.Managers.GetManager <ChatManagerServer>()?
            .SendMessageAsOther(BlockLimiterConfig.Instance.ServerName, msg, Color.Red, remoteUserId);
            Utilities.SendFailSound(remoteUserId);
            Utilities.ValidationFailed();

            return(false);
        }
Esempio n. 2
0
        /// <summary>
        /// Checks blocks being built in creative with multiblock placement.
        /// </summary>
        /// <param name="__instance"></param>
        /// <param name="area"></param>
        /// <returns></returns>
        private static bool BuildBlocksArea(MyCubeGrid __instance, MyCubeGrid.MyBlockBuildArea area)
        {
            if (!BlockLimiterConfig.Instance.EnableLimits)
            {
                return(true);
            }

            var def  = MyDefinitionManager.Static.GetCubeBlockDefinition(area.DefinitionId);
            var grid = __instance;

            int blocksToBuild = (int)area.BuildAreaSize.X * (int)area.BuildAreaSize.Y * (int)area.BuildAreaSize.Z;


            if (grid == null)
            {
                BlockLimiter.Instance.Log.Debug("Null grid in BuildBlockHandler");
                return(true);
            }

            var remoteUserId = MyEventContext.Current.Sender.Value;
            var playerId     = Utilities.GetPlayerIdFromSteamId(remoteUserId);


            if (!Block.IsWithinLimits(def, playerId, grid.EntityId, blocksToBuild))
            {
                if (BlockLimiterConfig.Instance.EnableLog)
                {
                    BlockLimiter.Instance.Log.Info($"Blocked {Utilities.GetPlayerNameFromSteamId(remoteUserId)} from placing {def.ToString().Substring(16)} due to limits");
                }
                //ModCommunication.SendMessageTo(new NotificationMessage($"You've reach your limit for {b}",5000,MyFontEnum.Red),remoteUserId );
                var msg = BlockLimiterConfig.Instance.DenyMessage.Replace("{BN}", $"{def.ToString().Substring(16)}");
                MyVisualScriptLogicProvider.SendChatMessage($"{msg}", BlockLimiterConfig.Instance.ServerName, playerId, MyFontEnum.Red);
                Utilities.SendFailSound(remoteUserId);
                Utilities.ValidationFailed();

                return(false);
            }


            return(true);
        }
Esempio n. 3
0
        void StopBuilding()
        {
            if ((!GridAndBlockValid && !VoxelMapAndBlockValid && !MultiBlockCreationIsActivated) || MyEntities.MemoryLimitReachedReport)
            {
                foreach (var gizmoSpace in m_gizmo.Spaces)
                {
                    gizmoSpace.m_startBuild = null;
                    gizmoSpace.m_continueBuild = null;
                    gizmoSpace.m_startRemove = null;
                }
                return;
            }

            bool smallViewChange = CheckSmallViewChange();

            m_blocksBuildQueue.Clear();
            m_tmpBlockPositionList.Clear();

            UpdateGizmos(true, true, false);

            int enabledCount = 0;
            foreach (var gizmoSpace in m_gizmo.Spaces)
            {
                if (gizmoSpace.Enabled)
                    ++enabledCount;
            }

            foreach (var gizmoSpace in m_gizmo.Spaces)
            {
                if (!gizmoSpace.Enabled)
                    continue;

                if (gizmoSpace.m_startBuild != null && (gizmoSpace.m_continueBuild != null || smallViewChange))
                {
                    Vector3I gridPos = gizmoSpace.m_startBuild.Value;
                    Vector3I min = gizmoSpace.m_min - gizmoSpace.m_centerPos;
                    Vector3I max = gizmoSpace.m_max - gizmoSpace.m_centerPos;

                    Vector3I rotatedSize;
                    Vector3I.TransformNormal(ref CurrentBlockDefinition.Size, ref gizmoSpace.m_localMatrixAdd, out rotatedSize);
                    rotatedSize = Vector3I.Abs(rotatedSize);

                    Vector3I stepDelta;
                    Vector3I counter;
                    int stepCount;

                    if (smallViewChange)
                        gizmoSpace.m_continueBuild = gizmoSpace.m_startBuild;

                    ComputeSteps(gizmoSpace.m_startBuild.Value, gizmoSpace.m_continueBuild.Value, rotatedSize, out stepDelta, out counter, out stepCount);

                    Vector3I centerPos = gizmoSpace.m_centerPos;
                    Quaternion orientation = gizmoSpace.LocalOrientation;
                    MyDefinitionId definitionId = gizmoSpace.m_blockDefinition.Id;

                    // Blocks can be randomly rotated if line/plane building is used.
                    bool allowRandomRotation = gizmoSpace.m_blockDefinition.RandomRotation 
                        && gizmoSpace.m_blockDefinition.Size.X == gizmoSpace.m_blockDefinition.Size.Y && gizmoSpace.m_blockDefinition.Size.X == gizmoSpace.m_blockDefinition.Size.Z
                        && (gizmoSpace.m_blockDefinition.Rotation == MyBlockRotation.Both || gizmoSpace.m_blockDefinition.Rotation == MyBlockRotation.Vertical);

                    if (allowRandomRotation)
                    {
                        m_blocksBuildQueue.Clear();

                        Vector3I temp;
                        for (temp.X = 0; temp.X < counter.X; ++temp.X)
                        {
                            for (temp.Y = 0; temp.Y < counter.Y; ++temp.Y)
                            {
                                for (temp.Z = 0; temp.Z < counter.Z; ++temp.Z)
                                {
                                    Vector3I tempCenter = gizmoSpace.m_centerPos + temp * stepDelta;
                                    Vector3I tempMin = gizmoSpace.m_min + temp * stepDelta;
                                    Vector3I tempMax = gizmoSpace.m_max + temp * stepDelta;

                                    Quaternion tempOrientation;

                                    if (gizmoSpace.m_blockDefinition.Rotation == MyBlockRotation.Both)
                                    {
                                        Base6Directions.Direction forward = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);
                                        Base6Directions.Direction up = forward;
                                        
                                        while (Vector3I.Dot(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up)) != 0) 
                                            up = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);
                                        
                                        tempOrientation = Quaternion.CreateFromForwardUp(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up));
                                    }
                                    else
                                    {
                                        Base6Directions.Direction up = Base6Directions.Direction.Up;
                                        Base6Directions.Direction forward = up;

                                        while (Vector3I.Dot(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up)) != 0)
                                            forward = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);

                                        tempOrientation = Quaternion.CreateFromForwardUp(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up));
                                    }

                                    m_blocksBuildQueue.Add(new MyCubeGrid.MyBlockLocation(gizmoSpace.m_blockDefinition.Id, tempMin, tempMax, tempCenter, tempOrientation,
                                        MyEntityIdentifier.AllocateId(), MySession.LocalPlayerId, MySession.LocalCharacter.EntityId));
                                }
                            }
                        }

                        CurrentGrid.BuildBlocks(MyToolbar.ColorMaskHSV, m_blocksBuildQueue);
                    }
                    else
                    {
                        // New version of build code
                        MyCubeGrid.MyBlockBuildArea area = new MyCubeGrid.MyBlockBuildArea();
                        area.PosInGrid = centerPos;
                        area.BlockMin = new Vector3B(min);
                        area.BlockMax = new Vector3B(max);
                        area.BuildAreaSize = new Vector3UByte(counter);
                        area.StepDelta = new Vector3B(stepDelta);
                        area.OrientationForward = Base6Directions.GetForward(ref orientation);
                        area.OrientationUp = Base6Directions.GetUp(ref orientation);
                        area.DefinitionId = definitionId;
                        area.ColorMaskHSV = MyToolbar.ColorMaskHSV.PackHSVToUint();

                        CurrentGrid.BuildBlocks(MySession.LocalPlayerId, ref area);

                        // TODO: There will be message send instead of this, this will called and iterated after message success
                        //BuildByGizmo(ref min, ref max, ref stepDelta, ref counter, ref centerPos, ref orientation, ref definitionId);
                    }
                }
                else if (gizmoSpace.m_startRemove != null && (gizmoSpace.m_continueBuild != null || smallViewChange))
                {
                    MyGuiAudio.PlaySound(MyGuiSounds.HudDeleteBlock);

                    Vector3I min = gizmoSpace.m_startRemove.Value;
                    Vector3I max = gizmoSpace.m_startRemove.Value;

                    Vector3I stepDelta;
                    Vector3I counter;
                    int stepCount;
                    if (smallViewChange)
                        gizmoSpace.m_continueBuild = gizmoSpace.m_startRemove;

                    ComputeSteps(gizmoSpace.m_startRemove.Value, gizmoSpace.m_continueBuild.Value, Vector3I.One, out stepDelta, out counter, out stepCount);

                    min = Vector3I.Min(gizmoSpace.m_startRemove.Value, gizmoSpace.m_continueBuild.Value);
                    max = Vector3I.Max(gizmoSpace.m_startRemove.Value, gizmoSpace.m_continueBuild.Value);
                    var size = new Vector3UByte(max - min);
                    CurrentGrid.RazeBlocks(ref min, ref size);

                    //Vector3I offset = Vector3I.Zero;
                    //for (int i = 0; i < counter.X; i += 1, offset.X += stepDelta.X)
                    //{
                    //    offset.Y = 0;
                    //    for (int j = 0; j < counter.Y; j += 1, offset.Y += stepDelta.Y)
                    //    {
                    //        offset.Z = 0;
                    //        for (int k = 0; k < counter.Z; k += 1, offset.Z += stepDelta.Z)
                    //        {
                    //            Vector3I pos = gizmoSpace.m_startRemove.Value + offset;
                    //            if (CurrentGrid.CubeExists(pos))
                    //            {
                    //                m_tmpBlockPositionList.Add(pos);
                    //            }
                    //        }
                    //    }
                    //}
                }

                gizmoSpace.m_startBuild = null;
                gizmoSpace.m_continueBuild = null;
                gizmoSpace.m_startRemove = null;
            }

            if (m_blocksBuildQueue.Count > 0)
            {
                CurrentGrid.BuildBlocks(MyToolbar.ColorMaskHSV, m_blocksBuildQueue);
            }

            if (m_tmpBlockPositionList.Count > 0)
            {
                CurrentGrid.RazeBlocks(m_tmpBlockPositionList);
            }
        }
Esempio n. 4
0
        /// <summary>
        /// Stops continuous building/removing. Do not put any gizmo related stuff here.
        /// </summary>
        protected void StopBuilding(bool smallViewChange, ref Vector3I? startBuild, ref Vector3I? startRemove, ref Vector3I? continueBuild, Vector3I blockMinPosition, Vector3I blockMaxPosition, 
            Vector3I blockCenterPosition, ref Matrix localMatrixAdd, MyCubeBlockDefinition blockDefinition)
        {
            if (startBuild != null && (continueBuild != null || smallViewChange))
            {
                Vector3I min = blockMinPosition - blockCenterPosition;
                Vector3I max = blockMaxPosition - blockCenterPosition;

                Vector3I rotatedSize;
                Vector3I.TransformNormal(ref CurrentBlockDefinition.Size, ref localMatrixAdd, out rotatedSize);
                rotatedSize = Vector3I.Abs(rotatedSize);

                Vector3I stepDelta;
                Vector3I counter;
                int stepCount;

                if (smallViewChange)
                    continueBuild = startBuild;

                ComputeSteps(startBuild.Value, continueBuild.Value, rotatedSize, out stepDelta, out counter, out stepCount);

                Vector3I centerPos = blockCenterPosition;
                Quaternion orientation = Quaternion.CreateFromRotationMatrix(localMatrixAdd);
                MyDefinitionId definitionId = blockDefinition.Id;

                // Blocks can be randomly rotated if line/plane building is used.
                bool allowRandomRotation = blockDefinition.RandomRotation
                    && blockDefinition.Size.X == blockDefinition.Size.Y && blockDefinition.Size.X == blockDefinition.Size.Z
                    && (blockDefinition.Rotation == MyBlockRotation.Both || blockDefinition.Rotation == MyBlockRotation.Vertical);

                if (allowRandomRotation)
                {
                    m_blocksBuildQueue.Clear();

                    Vector3I temp;
                    for (temp.X = 0; temp.X < counter.X; ++temp.X)
                    {
                        for (temp.Y = 0; temp.Y < counter.Y; ++temp.Y)
                        {
                            for (temp.Z = 0; temp.Z < counter.Z; ++temp.Z)
                            {
                                Vector3I tempCenter = blockCenterPosition + temp * stepDelta;
                                Vector3I tempMin = blockMinPosition + temp * stepDelta;
                                Vector3I tempMax = blockMaxPosition + temp * stepDelta;

                                Quaternion tempOrientation;

                                if (blockDefinition.Rotation == MyBlockRotation.Both)
                                {
                                    Base6Directions.Direction forward = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);
                                    Base6Directions.Direction up = forward;

                                    while (Vector3I.Dot(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up)) != 0)
                                        up = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);

                                    tempOrientation = Quaternion.CreateFromForwardUp(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up));
                                }
                                else
                                {
                                    Base6Directions.Direction up = Base6Directions.Direction.Up;
                                    Base6Directions.Direction forward = up;

                                    while (Vector3I.Dot(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up)) != 0)
                                        forward = (Base6Directions.Direction)(Math.Abs(MyRandom.Instance.Next()) % 6);

                                    tempOrientation = Quaternion.CreateFromForwardUp(Base6Directions.GetIntVector(forward), Base6Directions.GetIntVector(up));
                                }

                                m_blocksBuildQueue.Add(new MyCubeGrid.MyBlockLocation(blockDefinition.Id, tempMin, tempMax, tempCenter, tempOrientation,
                                    MyEntityIdentifier.AllocateId(), MySession.Static.LocalPlayerId));
                            }
                        }
                    }
                    if (m_blocksBuildQueue.Count > 0)
                    {
                        MyGuiAudio.PlaySound(MyGuiSounds.HudPlaceBlock);
                    }
                }
                else
                {
                    // New version of build code
                    MyCubeGrid.MyBlockBuildArea area = new MyCubeGrid.MyBlockBuildArea();
                    area.PosInGrid = centerPos;
                    area.BlockMin = new Vector3B(min);
                    area.BlockMax = new Vector3B(max);
                    area.BuildAreaSize = new Vector3UByte(counter);
                    area.StepDelta = new Vector3B(stepDelta);
                    area.OrientationForward = Base6Directions.GetForward(ref orientation);
                    area.OrientationUp = Base6Directions.GetUp(ref orientation);
                    area.DefinitionId = definitionId;
                    area.ColorMaskHSV = MyPlayer.SelectedColor.PackHSVToUint();

                    CurrentGrid.BuildBlocks(ref area, MySession.Static.LocalCharacterEntityId, MySession.Static.LocalPlayerId);
                }
            }
            else if (startRemove != null && (continueBuild != null || smallViewChange))
            {
                MyGuiAudio.PlaySound(MyGuiSounds.HudDeleteBlock);

                Vector3I min = startRemove.Value;
                Vector3I max = startRemove.Value;

                Vector3I stepDelta;
                Vector3I counter;
                int stepCount;
                if (smallViewChange)
                    continueBuild = startRemove;

                ComputeSteps(startRemove.Value, continueBuild.Value, Vector3I.One, out stepDelta, out counter, out stepCount);

                min = Vector3I.Min(startRemove.Value, continueBuild.Value);
                max = Vector3I.Max(startRemove.Value, continueBuild.Value);
                var size = new Vector3UByte(max - min);
                CurrentGrid.RazeBlocks(ref min, ref size);
            }

            startBuild = null;
            continueBuild = null;
            startRemove = null;
        }