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