Unstable v0.10.600.0
This commit is contained in:
+44
-36
@@ -306,7 +306,7 @@ namespace Barotrauma.CharacterEditor
|
||||
var lastJoint = selectedJoints.LastOrDefault();
|
||||
if (lastJoint != null)
|
||||
{
|
||||
lastLimb = PlayerInput.KeyDown(Keys.LeftAlt) ? lastJoint.LimbB : lastJoint.LimbA;
|
||||
lastLimb = PlayerInput.KeyDown(Keys.LeftAlt) ? lastJoint.LimbA : lastJoint.LimbB;
|
||||
}
|
||||
}
|
||||
if (lastLimb != null)
|
||||
@@ -374,6 +374,14 @@ namespace Barotrauma.CharacterEditor
|
||||
if (Wizard.instance != null) { return; }
|
||||
spriteSheetRect = CalculateSpritesheetRectangle();
|
||||
// Handle shortcut keys
|
||||
if (PlayerInput.KeyHit(Keys.F1))
|
||||
{
|
||||
SetToggle(paramsToggle, !paramsToggle.Selected);
|
||||
}
|
||||
if (PlayerInput.KeyHit(Keys.F5))
|
||||
{
|
||||
RecreateRagdoll();
|
||||
}
|
||||
if (GUI.KeyboardDispatcher.Subscriber == null)
|
||||
{
|
||||
if (PlayerInput.KeyHit(Keys.D1))
|
||||
@@ -445,10 +453,6 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
SetToggle(showCollidersToggle, !showCollidersToggle.Selected);
|
||||
}
|
||||
if (PlayerInput.KeyHit(Keys.Tab))
|
||||
{
|
||||
SetToggle(paramsToggle, !paramsToggle.Selected);
|
||||
}
|
||||
if (PlayerInput.KeyHit(Keys.L))
|
||||
{
|
||||
SetToggle(lightsToggle, !lightsToggle.Selected);
|
||||
@@ -469,10 +473,6 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
SetToggle(ikToggle, !ikToggle.Selected);
|
||||
}
|
||||
if (PlayerInput.KeyHit(Keys.F5))
|
||||
{
|
||||
RecreateRagdoll();
|
||||
}
|
||||
}
|
||||
if (PlayerInput.KeyDown(InputType.Left) || PlayerInput.KeyDown(InputType.Right) || PlayerInput.KeyDown(InputType.Up) || PlayerInput.KeyDown(InputType.Down))
|
||||
{
|
||||
@@ -809,7 +809,13 @@ namespace Barotrauma.CharacterEditor
|
||||
else if (showColliders)
|
||||
{
|
||||
character.AnimController.Collider.DebugDraw(spriteBatch, Color.White, forceColor: true);
|
||||
character.AnimController.Limbs.ForEach(l => l.body.DebugDraw(spriteBatch, GUI.Style.Green, forceColor: true));
|
||||
foreach (var limb in character.AnimController.Limbs)
|
||||
{
|
||||
if (!limb.Hide)
|
||||
{
|
||||
limb.body.DebugDraw(spriteBatch, GUI.Style.Green, forceColor: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
spriteBatch.End();
|
||||
|
||||
@@ -935,7 +941,7 @@ namespace Barotrauma.CharacterEditor
|
||||
var lastJoint = selectedJoints.LastOrDefault();
|
||||
if (lastJoint != null)
|
||||
{
|
||||
lastLimb = PlayerInput.KeyDown(Keys.LeftAlt) ? lastJoint.LimbB : lastJoint.LimbA;
|
||||
lastLimb = PlayerInput.KeyDown(Keys.LeftAlt) ? lastJoint.LimbA : lastJoint.LimbB;
|
||||
}
|
||||
}
|
||||
if (lastLimb != null)
|
||||
@@ -953,14 +959,14 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
UpdateOtherLimbs(lastLimb, l => TryUpdateSubParam(l.Params, "spriteorientation", angle));
|
||||
}
|
||||
}, circleRadius: 40, widgetSize: 15, rotationOffset: MathHelper.Pi, autoFreeze: false, rounding: 10);
|
||||
}, circleRadius: 40, widgetSize: 15, rotationOffset: 0, autoFreeze: false, rounding: 10);
|
||||
}
|
||||
else
|
||||
{
|
||||
var topLeft = spriteSheetControls.RectTransform.TopLeft;
|
||||
GUI.DrawString(spriteBatch, new Vector2(topLeft.X + 350 * GUI.xScale, GameMain.GraphicsHeight - 95 * GUI.yScale), GetCharacterEditorTranslation("SpriteSheetOrientation") + ":", Color.White, Color.Gray * 0.5f, 10, GUI.Font);
|
||||
DrawRadialWidget(spriteBatch, new Vector2(topLeft.X + 610 * GUI.xScale, GameMain.GraphicsHeight - 75 * GUI.yScale), RagdollParams.SpritesheetOrientation, string.Empty, Color.White,
|
||||
angle => TryUpdateRagdollParam("spritesheetorientation", angle), circleRadius: 40, widgetSize: 15, rotationOffset: MathHelper.Pi, autoFreeze: false, rounding: 10);
|
||||
angle => TryUpdateRagdollParam("spritesheetorientation", angle), circleRadius: 40, widgetSize: 15, rotationOffset: 0, autoFreeze: false, rounding: 10);
|
||||
}
|
||||
}
|
||||
// Debug
|
||||
@@ -2383,7 +2389,7 @@ namespace Barotrauma.CharacterEditor
|
||||
IEnumerable<Limb> limbs = selectedLimbs;
|
||||
if (limbs.None())
|
||||
{
|
||||
limbs = selectedJoints.Select(j => PlayerInput.KeyDown(Keys.LeftAlt) ? j.LimbB : j.LimbA);
|
||||
limbs = selectedJoints.Select(j => PlayerInput.KeyDown(Keys.LeftAlt) ? j.LimbA : j.LimbB);
|
||||
}
|
||||
foreach (var limb in limbs)
|
||||
{
|
||||
@@ -3499,12 +3505,8 @@ namespace Barotrauma.CharacterEditor
|
||||
limbJoint.UpperLimit += MathHelper.TwoPi;
|
||||
}
|
||||
}
|
||||
|
||||
if (limbJoint.UpperLimit - limbJoint.LowerLimit > MathHelper.TwoPi)
|
||||
{
|
||||
limbJoint.LowerLimit = MathUtils.WrapAnglePi(limbJoint.LowerLimit);
|
||||
limbJoint.UpperLimit = MathUtils.WrapAnglePi(limbJoint.UpperLimit);
|
||||
}
|
||||
limbJoint.LowerLimit = MathUtils.WrapAnglePi(limbJoint.LowerLimit);
|
||||
limbJoint.UpperLimit = MathUtils.WrapAnglePi(limbJoint.UpperLimit);
|
||||
}
|
||||
|
||||
private Limb GetClosestLimbOnRagdoll(Vector2 targetPos, Func<Limb, bool> filter = null)
|
||||
@@ -4392,7 +4394,7 @@ namespace Barotrauma.CharacterEditor
|
||||
|
||||
if (!altDown && editJoints && selectedJoints.Any() && jointCreationMode == JointCreationMode.None)
|
||||
{
|
||||
GUI.DrawString(spriteBatch, new Vector2(GameMain.GraphicsWidth / 2 - 180, 250), GetCharacterEditorTranslation("HoldLeftAltToManipulateJoint"), Color.White, Color.Black * 0.5f, 10, GUI.Font);
|
||||
GUI.DrawString(spriteBatch, new Vector2(GameMain.GraphicsWidth / 2 - 180, 100), GetCharacterEditorTranslation("HoldLeftAltToManipulateJoint"), Color.White, Color.Black * 0.5f, 10, GUI.Font);
|
||||
}
|
||||
|
||||
foreach (Limb limb in character.AnimController.Limbs)
|
||||
@@ -4450,11 +4452,11 @@ namespace Barotrauma.CharacterEditor
|
||||
}
|
||||
if (editJoints)
|
||||
{
|
||||
if (altDown && joint.BodyA == limb.body.FarseerBody)
|
||||
if (!altDown && joint.BodyA == limb.body.FarseerBody)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!altDown && joint.BodyB == limb.body.FarseerBody)
|
||||
if (altDown && joint.BodyB == limb.body.FarseerBody)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
@@ -4465,7 +4467,13 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
if (joint.LimitEnabled && jointCreationMode == JointCreationMode.None)
|
||||
{
|
||||
DrawJointLimitWidgets(spriteBatch, limb, joint, tformedJointPos, autoFreeze: true, allowPairEditing: true, rotationOffset: limb.Rotation, holdPosition: true);
|
||||
var otherBody = limb == joint.LimbA ? joint.LimbB : joint.LimbA;
|
||||
float rotation = -otherBody.Rotation + limb.Params.GetSpriteOrientation();
|
||||
if (character.AnimController.Dir < 0)
|
||||
{
|
||||
rotation -= MathHelper.Pi;
|
||||
}
|
||||
DrawJointLimitWidgets(spriteBatch, limb, joint, tformedJointPos, autoFreeze: true, allowPairEditing: true, rotationOffset: rotation, holdPosition: true);
|
||||
}
|
||||
// Is the direction inversed incorrectly?
|
||||
Vector2 to = tformedJointPos + VectorExtensions.ForwardFlipped(joint.LimbB.Rotation - joint.LimbB.Params.GetSpriteOrientation(), 20);
|
||||
@@ -4898,7 +4906,7 @@ namespace Barotrauma.CharacterEditor
|
||||
void RecalculateCollider(Limb l)
|
||||
{
|
||||
// We want the collider to be slightly smaller than the source rect, because the source rect is usually a bit bigger than the graphic.
|
||||
float multiplier = 0.85f;
|
||||
float multiplier = 0.9f;
|
||||
l.body.SetSize(new Vector2(ConvertUnits.ToSimUnits(width), ConvertUnits.ToSimUnits(height)) * l.Scale * RagdollParams.TextureScale * multiplier);
|
||||
TryUpdateLimbParam(l, "radius", ConvertUnits.ToDisplayUnits(l.body.radius / l.Params.Scale / RagdollParams.LimbScale / RagdollParams.TextureScale));
|
||||
TryUpdateLimbParam(l, "width", ConvertUnits.ToDisplayUnits(l.body.width / l.Params.Scale / RagdollParams.LimbScale / RagdollParams.TextureScale));
|
||||
@@ -5010,7 +5018,7 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
if (joint.LimitEnabled && jointCreationMode == JointCreationMode.None)
|
||||
{
|
||||
DrawJointLimitWidgets(spriteBatch, limb, joint, tformedJointPos, autoFreeze: false, allowPairEditing: true, holdPosition: false);
|
||||
DrawJointLimitWidgets(spriteBatch, limb, joint, tformedJointPos, autoFreeze: false, allowPairEditing: true, holdPosition: false, rotationOffset: joint.LimbB.Params.GetSpriteOrientation());
|
||||
}
|
||||
if (jointSelectionWidget.IsControlled)
|
||||
{
|
||||
@@ -5071,7 +5079,7 @@ namespace Barotrauma.CharacterEditor
|
||||
|
||||
private void DrawJointLimitWidgets(SpriteBatch spriteBatch, Limb limb, LimbJoint joint, Vector2 drawPos, bool autoFreeze, bool allowPairEditing, bool holdPosition, float rotationOffset = 0)
|
||||
{
|
||||
rotationOffset -= limb.Params.GetSpriteOrientation();
|
||||
bool clockWise = joint.Params.ClockWiseRotation;
|
||||
Color angleColor = joint.UpperLimit - joint.LowerLimit > 0 ? GUI.Style.Green * 0.5f : GUI.Style.Red;
|
||||
DrawRadialWidget(spriteBatch, drawPos, MathHelper.ToDegrees(joint.UpperLimit), $"{joint.Params.Name}: {GetCharacterEditorTranslation("UpperLimit")}", Color.Cyan, angle =>
|
||||
{
|
||||
@@ -5111,7 +5119,7 @@ namespace Barotrauma.CharacterEditor
|
||||
DrawAngle(20, angleColor, 4);
|
||||
DrawAngle(40, Color.Cyan);
|
||||
GUI.DrawString(spriteBatch, drawPos, angle.FormatZeroDecimal(), Color.Black, backgroundColor: Color.Cyan, font: GUI.SmallFont);
|
||||
}, circleRadius: 40, rotationOffset: rotationOffset, displayAngle: false, clockWise: false, holdPosition: holdPosition);
|
||||
}, circleRadius: 40, rotationOffset: rotationOffset, displayAngle: false, clockWise: clockWise, holdPosition: holdPosition);
|
||||
DrawRadialWidget(spriteBatch, drawPos, MathHelper.ToDegrees(joint.LowerLimit), $"{joint.Params.Name}: {GetCharacterEditorTranslation("LowerLimit")}", Color.Yellow, angle =>
|
||||
{
|
||||
joint.LowerLimit = MathHelper.ToRadians(angle);
|
||||
@@ -5150,12 +5158,12 @@ namespace Barotrauma.CharacterEditor
|
||||
DrawAngle(20, angleColor, 4);
|
||||
DrawAngle(25, Color.Yellow);
|
||||
GUI.DrawString(spriteBatch, drawPos, angle.FormatZeroDecimal(), Color.Black, backgroundColor: Color.Yellow, font: GUI.SmallFont);
|
||||
}, circleRadius: 25, rotationOffset: rotationOffset, displayAngle: false, clockWise: false, holdPosition: holdPosition);
|
||||
}, circleRadius: 25, rotationOffset: rotationOffset, displayAngle: false, clockWise: clockWise, holdPosition: holdPosition);
|
||||
void DrawAngle(float radius, Color color, float thickness = 5)
|
||||
{
|
||||
float angle = joint.UpperLimit - joint.LowerLimit;
|
||||
ShapeExtensions.DrawSector(spriteBatch, drawPos, radius, angle, 40, color,
|
||||
offset: -rotationOffset - joint.UpperLimit + MathHelper.PiOver2, thickness: thickness);
|
||||
float offset = clockWise ? rotationOffset + joint.LowerLimit - MathHelper.PiOver2 : rotationOffset - joint.UpperLimit - MathHelper.PiOver2;
|
||||
ShapeExtensions.DrawSector(spriteBatch, drawPos, radius, angle, 40, color, offset: offset, thickness: thickness);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5244,8 +5252,8 @@ namespace Barotrauma.CharacterEditor
|
||||
{
|
||||
angle = 0;
|
||||
}
|
||||
float drawAngle = clockWise ? -angle : angle;
|
||||
var widgetDrawPos = drawPos + VectorExtensions.ForwardFlipped(MathHelper.ToRadians(drawAngle) + rotationOffset, circleRadius);
|
||||
float drawAngle = clockWise ? angle : -angle;
|
||||
var widgetDrawPos = drawPos + VectorExtensions.Forward(MathHelper.ToRadians(drawAngle) + rotationOffset - MathHelper.PiOver2, circleRadius);
|
||||
GUI.DrawLine(spriteBatch, drawPos, widgetDrawPos, color);
|
||||
DrawWidget(spriteBatch, widgetDrawPos, WidgetType.Rectangle, widgetSize, color, toolTip, () =>
|
||||
{
|
||||
@@ -5253,8 +5261,8 @@ namespace Barotrauma.CharacterEditor
|
||||
ShapeExtensions.DrawCircle(spriteBatch, drawPos, circleRadius, 40, color, thickness: 1);
|
||||
Vector2 d = PlayerInput.MousePosition - drawPos;
|
||||
float newAngle = clockWise
|
||||
? MathUtils.VectorToAngle(d) - MathHelper.PiOver2 + rotationOffset
|
||||
: -MathUtils.VectorToAngle(d) + MathHelper.PiOver2 - rotationOffset;
|
||||
? MathUtils.VectorToAngle(d) + MathHelper.PiOver2 - rotationOffset
|
||||
: -MathUtils.VectorToAngle(d) - MathHelper.PiOver2 + rotationOffset;
|
||||
angle = MathHelper.ToDegrees(wrapAnglePi ? MathUtils.WrapAnglePi(newAngle) : MathUtils.WrapAngleTwoPi(newAngle));
|
||||
angle = (float)Math.Round(angle / rounding) * rounding;
|
||||
if (angle >= 360 || angle <= -360) { angle = 0; }
|
||||
@@ -5263,7 +5271,7 @@ namespace Barotrauma.CharacterEditor
|
||||
GUI.DrawString(spriteBatch, drawPos, angle.FormatZeroDecimal(), Color.Black, backgroundColor: color, font: GUI.SmallFont);
|
||||
}
|
||||
onClick(angle);
|
||||
var zeroPos = drawPos + VectorExtensions.ForwardFlipped(rotationOffset, circleRadius);
|
||||
var zeroPos = drawPos + VectorExtensions.Forward(rotationOffset - MathHelper.PiOver2, circleRadius);
|
||||
GUI.DrawLine(spriteBatch, drawPos, zeroPos, GUI.Style.Red, width: 3);
|
||||
}, autoFreeze, holdPosition, onHovered: () =>
|
||||
{
|
||||
|
||||
@@ -335,6 +335,7 @@ namespace Barotrauma
|
||||
{
|
||||
base.Select();
|
||||
|
||||
GUI.PreventPauseMenuToggle = false;
|
||||
pointerLightSource = new LightSource(Vector2.Zero, 1000.0f, Color.White, submarine: null);
|
||||
GameMain.LightManager.AddLight(pointerLightSource);
|
||||
topPanel.ClearChildren();
|
||||
|
||||
@@ -424,6 +424,8 @@ namespace Barotrauma
|
||||
#region Selection
|
||||
public override void Select()
|
||||
{
|
||||
GUI.PreventPauseMenuToggle = false;
|
||||
|
||||
base.Select();
|
||||
|
||||
if (GameMain.Client != null)
|
||||
@@ -806,19 +808,6 @@ namespace Barotrauma
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool JoinServerClicked(GUIButton button, object obj)
|
||||
{
|
||||
GameMain.ServerListScreen.Select();
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool SteamWorkshopClicked(GUIButton button, object obj)
|
||||
{
|
||||
if (!Steam.SteamManager.IsInitialized) { return false; }
|
||||
GameMain.SteamWorkshopScreen.Select();
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool ChangeMaxPlayers(GUIButton button, object obj)
|
||||
{
|
||||
int.TryParse(maxPlayersBox.Text, out int currMaxPlayers);
|
||||
@@ -829,33 +818,10 @@ namespace Barotrauma
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool HostServerClicked(GUIButton button, object obj)
|
||||
private void StartServer()
|
||||
{
|
||||
string name = serverNameBox.Text;
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
serverNameBox.Flash();
|
||||
return false;
|
||||
}
|
||||
|
||||
/*if (!int.TryParse(portBox.Text, out int port) || port < 0 || port > 65535)
|
||||
{
|
||||
portBox.Text = NetConfig.DefaultPort.ToString();
|
||||
portBox.Flash();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
int queryPort = 0;
|
||||
#if USE_STEAM
|
||||
if (!int.TryParse(queryPortBox.Text, out queryPort) || queryPort < 0 || queryPort > 65535)
|
||||
{
|
||||
portBox.Text = NetConfig.DefaultQueryPort.ToString();
|
||||
portBox.Flash();
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
*/
|
||||
GameMain.NetLobbyScreen?.Release();
|
||||
GameMain.NetLobbyScreen = new NetLobbyScreen();
|
||||
try
|
||||
@@ -919,8 +885,6 @@ namespace Barotrauma
|
||||
{
|
||||
DebugConsole.ThrowError("Failed to start server", e);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool QuitClicked(GUIButton button, object obj)
|
||||
@@ -996,7 +960,7 @@ namespace Barotrauma
|
||||
GUI.Draw(Cam, spriteBatch);
|
||||
|
||||
#if !UNSTABLE
|
||||
string versionString = "Barotrauma v" + GameMain.Version + " (" + AssemblyInfo.GetBuildString() + ", branch " + AssemblyInfo.GetGitBranch() + ", revision " + AssemblyInfo.GetGitRevision() + ")";
|
||||
string versionString = "Barotrauma v" + GameMain.Version + " (" + AssemblyInfo.BuildString + ", branch " + AssemblyInfo.GitBranch + ", revision " + AssemblyInfo.GitRevision + ")";
|
||||
GUI.SmallFont.DrawString(spriteBatch, versionString, new Vector2(HUDLayoutSettings.Padding, GameMain.GraphicsHeight - GUI.SmallFont.MeasureString(versionString).Y - HUDLayoutSettings.Padding * 0.75f), Color.White * 0.7f);
|
||||
#endif
|
||||
if (selectedTab != Tab.Credits)
|
||||
@@ -1062,7 +1026,7 @@ namespace Barotrauma
|
||||
GameAnalyticsManager.AddErrorEventOnce(
|
||||
"MainMenuScreen.StartGame:IOException" + selectedSub.Name,
|
||||
GameAnalyticsSDK.Net.EGAErrorSeverity.Error,
|
||||
"Copying the file \"" + selectedSub.FilePath + "\" failed.\n" + e.Message + "\n" + Environment.StackTrace);
|
||||
"Copying the file \"" + selectedSub.FilePath + "\" failed.\n" + e.Message + "\n" + Environment.StackTrace.CleanupStackTrace());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1334,7 +1298,35 @@ namespace Barotrauma
|
||||
|
||||
new GUIButton(new RectTransform(new Vector2(0.4f, 0.07f), content.RectTransform), TextManager.Get("StartServerButton"), style: "GUIButtonLarge")
|
||||
{
|
||||
OnClicked = HostServerClicked
|
||||
OnClicked = (btn, userdata) =>
|
||||
{
|
||||
string name = serverNameBox.Text;
|
||||
if (string.IsNullOrEmpty(name))
|
||||
{
|
||||
serverNameBox.Flash();
|
||||
return false;
|
||||
}
|
||||
|
||||
if (ForbiddenWordFilter.IsForbidden(name, out string forbiddenWord))
|
||||
{
|
||||
var msgBox = new GUIMessageBox("",
|
||||
TextManager.GetWithVariables("forbiddenservernameverification", new string[] { "[forbiddenword]", "[servername]" }, new string[] { forbiddenWord, name }),
|
||||
new string[] { TextManager.Get("yes"), TextManager.Get("no") });
|
||||
msgBox.Buttons[0].OnClicked += (_, __) =>
|
||||
{
|
||||
StartServer();
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
msgBox.Buttons[1].OnClicked += msgBox.Close;
|
||||
}
|
||||
else
|
||||
{
|
||||
StartServer();
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1169,7 +1169,7 @@ namespace Barotrauma
|
||||
|
||||
Character.Controlled = null;
|
||||
GameMain.LightManager.LosEnabled = false;
|
||||
|
||||
GUI.PreventPauseMenuToggle = false;
|
||||
CampaignCharacterDiscarded = false;
|
||||
|
||||
chatInput.Select();
|
||||
@@ -2799,7 +2799,7 @@ namespace Barotrauma
|
||||
var variantButton = CreateJobVariantButton(jobPrefab, variantIndex, images.Length, jobButton);
|
||||
variantButton.OnClicked = (btn, obj) =>
|
||||
{
|
||||
currSelected.Selected = false;
|
||||
if (currSelected != null) { currSelected.Selected = false; }
|
||||
int k = ((Pair<JobPrefab, int>)obj).Second;
|
||||
btn.Parent.UserData = obj;
|
||||
for (int j = 0; j < images.Length; j++)
|
||||
|
||||
@@ -153,6 +153,7 @@ namespace Barotrauma
|
||||
private GUITickBox filterVoip;
|
||||
private List<GUITickBox> playStyleTickBoxes;
|
||||
private List<GUITickBox> gameModeTickBoxes;
|
||||
private GUITickBox filterOffensive;
|
||||
|
||||
private string sortedBy;
|
||||
|
||||
@@ -325,7 +326,7 @@ namespace Barotrauma
|
||||
|
||||
filterSameVersion = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterSameVersion"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterSameVersion"),
|
||||
UserData = TextManager.Get("FilterSameVersion"),
|
||||
Selected = true,
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
@@ -333,39 +334,47 @@ namespace Barotrauma
|
||||
|
||||
filterPassword = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterPassword"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterPassword"),
|
||||
UserData = TextManager.Get("FilterPassword"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterPassword.TextBlock);
|
||||
|
||||
filterIncompatible = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterIncompatibleServers"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterIncompatibleServers"),
|
||||
UserData = TextManager.Get("FilterIncompatibleServers"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterIncompatible.TextBlock);
|
||||
|
||||
filterFull = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterFullServers"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterFullServers"),
|
||||
UserData = TextManager.Get("FilterFullServers"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterFull.TextBlock);
|
||||
|
||||
filterEmpty = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterEmptyServers"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterEmptyServers"),
|
||||
UserData = TextManager.Get("FilterEmptyServers"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterEmpty.TextBlock);
|
||||
|
||||
filterWhitelisted = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterWhitelistedServers"))
|
||||
{
|
||||
ToolTip = TextManager.Get("FilterWhitelistedServers"),
|
||||
UserData = TextManager.Get("FilterWhitelistedServers"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterWhitelisted.TextBlock);
|
||||
|
||||
filterOffensive = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("FilterOffensiveServers"))
|
||||
{
|
||||
UserData = TextManager.Get("FilterOffensiveServers"),
|
||||
ToolTip = TextManager.Get("FilterOffensiveServersToolTip"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterOffensive.TextBlock);
|
||||
|
||||
// Filter Tags
|
||||
new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), filters.Content.RectTransform), TextManager.Get("servertags"), font: GUI.SubHeadingFont)
|
||||
{
|
||||
@@ -374,35 +383,35 @@ namespace Barotrauma
|
||||
|
||||
filterKarma = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("servertag.karma.true"))
|
||||
{
|
||||
ToolTip = TextManager.Get("servertag.karma.true"),
|
||||
UserData = TextManager.Get("servertag.karma.true"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterKarma.TextBlock);
|
||||
|
||||
filterTraitor = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("servertag.traitors.true"))
|
||||
{
|
||||
ToolTip = TextManager.Get("servertag.traitors.true"),
|
||||
UserData = TextManager.Get("servertag.traitors.true"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterTraitor.TextBlock);
|
||||
|
||||
filterFriendlyFire = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("servertag.friendlyfire.false"))
|
||||
{
|
||||
ToolTip = TextManager.Get("servertag.friendlyfire.false"),
|
||||
UserData = TextManager.Get("servertag.friendlyfire.false"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterFriendlyFire.TextBlock);
|
||||
|
||||
filterVoip = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("servertag.voip.false"))
|
||||
{
|
||||
ToolTip = TextManager.Get("servertag.voip.false"),
|
||||
UserData = TextManager.Get("servertag.voip.false"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterVoip.TextBlock);
|
||||
|
||||
filterModded = new GUITickBox(new RectTransform(new Vector2(1.0f, elementHeight), filters.Content.RectTransform), TextManager.Get("servertag.modded.true"))
|
||||
{
|
||||
ToolTip = TextManager.Get("servertag.modded.true"),
|
||||
UserData = TextManager.Get("servertag.modded.true"),
|
||||
OnSelected = (tickBox) => { FilterServers(); return true; }
|
||||
};
|
||||
filterTextList.Add(filterModded.TextBlock);
|
||||
@@ -449,7 +458,9 @@ namespace Barotrauma
|
||||
filters.Content.RectTransform.SizeChanged += () =>
|
||||
{
|
||||
filters.Content.RectTransform.RecalculateChildren(true, true);
|
||||
filterTextList.ForEach(t => t.Text = t.ToolTip);
|
||||
filterTextList.ForEach(t => t.Text = t.Parent.Parent.UserData as string);
|
||||
gameModeTickBoxes.ForEach(tb => tb.Text = tb.ToolTip);
|
||||
playStyleTickBoxes.ForEach(tb => tb.Text = tb.ToolTip);
|
||||
GUITextBlock.AutoScaleAndNormalize(filterTextList, defaultScale: 1.0f);
|
||||
if (filterTextList[0].TextScale < 0.8f)
|
||||
{
|
||||
@@ -579,7 +590,7 @@ namespace Barotrauma
|
||||
{
|
||||
ClientNameBox.Flash();
|
||||
ClientNameBox.Select();
|
||||
GUI.PlayUISound(GUISoundType.PickItemFail);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItemFail);
|
||||
return false;
|
||||
}
|
||||
ShowDirectJoinPrompt();
|
||||
@@ -1050,6 +1061,7 @@ namespace Barotrauma
|
||||
(!filterFull.Selected || serverInfo.PlayerCount < serverInfo.MaxPlayers) &&
|
||||
(!filterEmpty.Selected || serverInfo.PlayerCount > 0) &&
|
||||
(!filterWhitelisted.Selected || serverInfo.UsingWhiteList == true) &&
|
||||
(filterOffensive.Selected || !ForbiddenWordFilter.IsForbidden(serverInfo.ServerName)) &&
|
||||
(!filterKarma.Selected || serverInfo.KarmaEnabled == true) &&
|
||||
(!filterFriendlyFire.Selected || serverInfo.FriendlyFireEnabled == false) &&
|
||||
(!filterTraitor.Selected || serverInfo.TraitorsEnabled == YesNoMaybe.Yes || serverInfo.TraitorsEnabled == YesNoMaybe.Maybe) &&
|
||||
@@ -1406,7 +1418,7 @@ namespace Barotrauma
|
||||
#if DEBUG
|
||||
DebugConsole.ThrowError($"Failed to parse a Steam friend's connect command ({connectCommand})", e);
|
||||
#else
|
||||
DebugConsole.Log($"Failed to parse a Steam friend's connect command ({connectCommand})\n" + e.StackTrace);
|
||||
DebugConsole.Log($"Failed to parse a Steam friend's connect command ({connectCommand})\n" + e.StackTrace.CleanupStackTrace());
|
||||
#endif
|
||||
info.ConnectName = null;
|
||||
info.ConnectEndpoint = null;
|
||||
@@ -2109,7 +2121,7 @@ namespace Barotrauma
|
||||
{
|
||||
ClientNameBox.Flash();
|
||||
ClientNameBox.Select();
|
||||
GUI.PlayUISound(GUISoundType.PickItemFail);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItemFail);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -1156,7 +1156,7 @@ namespace Barotrauma
|
||||
|
||||
if (itemContentPackage == null)
|
||||
{
|
||||
string errorMsg = "Failed to edit workshop item (content package null)\n" + Environment.StackTrace;
|
||||
string errorMsg = "Failed to edit workshop item (content package null)\n" + Environment.StackTrace.CleanupStackTrace();
|
||||
DebugConsole.ThrowError(errorMsg);
|
||||
GameAnalyticsManager.AddErrorEventOnce("SteamWorkshopScreen.ShowCreateItemFrame:ContentPackageNull", GameAnalyticsSDK.Net.EGAErrorSeverity.Error, errorMsg);
|
||||
return;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
using Barotrauma.Extensions;
|
||||
using Barotrauma.Extensions;
|
||||
using Barotrauma.Items.Components;
|
||||
using Microsoft.Xna.Framework;
|
||||
using Microsoft.Xna.Framework.Graphics;
|
||||
@@ -33,6 +33,18 @@ namespace Barotrauma
|
||||
Default,
|
||||
Wiring
|
||||
}
|
||||
|
||||
public enum WarningType
|
||||
{
|
||||
NoWaypoints,
|
||||
NoHulls,
|
||||
DisconnectedVents,
|
||||
NoHumanSpawnpoints,
|
||||
NoCargoSpawnpoints,
|
||||
NoBallastTag,
|
||||
NonLinkedGaps,
|
||||
TooManyLights
|
||||
}
|
||||
|
||||
public static Vector2 MouseDragStart = Vector2.Zero;
|
||||
|
||||
@@ -85,11 +97,19 @@ namespace Barotrauma
|
||||
private GUIFrame previouslyUsedPanel;
|
||||
private GUIListBox previouslyUsedList;
|
||||
|
||||
private GUIFrame undoBufferPanel;
|
||||
private GUIListBox undoBufferList;
|
||||
|
||||
private GUIDropDown linkedSubBox;
|
||||
|
||||
private static GUIComponent autoSaveLabel;
|
||||
private static int maxAutoSaves = GameSettings.MaximumAutoSaves;
|
||||
|
||||
public static bool BulkItemBufferInUse;
|
||||
public static List<AddOrDeleteCommand> BulkItemBuffer = new List<AddOrDeleteCommand>();
|
||||
|
||||
public static List<WarningType> SuppressedWarnings = new List<WarningType>();
|
||||
|
||||
//a Character used for picking up and manipulating items
|
||||
private Character dummyCharacter;
|
||||
|
||||
@@ -109,12 +129,17 @@ namespace Barotrauma
|
||||
/// </summary>
|
||||
private Vector2 oldItemPosition;
|
||||
|
||||
/// <summary>
|
||||
/// Global undo/redo state for the sub editor and a selector index for it
|
||||
/// <see cref="Command"/>
|
||||
/// </summary>
|
||||
public static readonly List<Command> Commands = new List<Command>();
|
||||
private static int commandIndex;
|
||||
|
||||
private GUIFrame wiringToolPanel;
|
||||
|
||||
private DateTime editorSelectedTime;
|
||||
|
||||
private const string containerDeleteTag = "containerdelete";
|
||||
|
||||
private GUIImage previewImage;
|
||||
private GUILayoutGroup previewImageButtonHolder;
|
||||
|
||||
@@ -273,6 +298,7 @@ namespace Barotrauma
|
||||
OnClicked = (btn, userData) =>
|
||||
{
|
||||
previouslyUsedPanel.Visible = false;
|
||||
undoBufferPanel.Visible = false;
|
||||
showEntitiesPanel.Visible = !showEntitiesPanel.Visible;
|
||||
showEntitiesPanel.RectTransform.AbsoluteOffset = new Point(Math.Max(Math.Max(btn.Rect.X, entityCountPanel.Rect.Right), saveAssemblyFrame.Rect.Right), TopPanel.Rect.Height);
|
||||
return true;
|
||||
@@ -285,12 +311,26 @@ namespace Barotrauma
|
||||
OnClicked = (btn, userData) =>
|
||||
{
|
||||
showEntitiesPanel.Visible = false;
|
||||
undoBufferPanel.Visible = false;
|
||||
previouslyUsedPanel.Visible = !previouslyUsedPanel.Visible;
|
||||
previouslyUsedPanel.RectTransform.AbsoluteOffset = new Point(Math.Max(Math.Max(btn.Rect.X, entityCountPanel.Rect.Right), saveAssemblyFrame.Rect.Right), TopPanel.Rect.Height);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
var undoBufferButton = new GUIButton(new RectTransform(new Vector2(0.9f, 0.9f), paddedTopPanel.RectTransform, scaleBasis: ScaleBasis.BothHeight), "", style: "UndoHistoryButton")
|
||||
{
|
||||
ToolTip = TextManager.Get("Editor.UndoHistoryButton"),
|
||||
OnClicked = (btn, userData) =>
|
||||
{
|
||||
showEntitiesPanel.Visible = false;
|
||||
previouslyUsedPanel.Visible = false;
|
||||
undoBufferPanel.Visible = !undoBufferPanel.Visible;
|
||||
undoBufferPanel.RectTransform.AbsoluteOffset = new Point(Math.Max(Math.Max(btn.Rect.X, entityCountPanel.Rect.Right), saveAssemblyFrame.Rect.Right), TopPanel.Rect.Height);
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
new GUIFrame(new RectTransform(new Vector2(0.01f, 0.9f), paddedTopPanel.RectTransform), style: "VerticalLine");
|
||||
|
||||
subNameLabel = new GUITextBlock(new RectTransform(new Vector2(0.3f, 0.9f), paddedTopPanel.RectTransform, Anchor.CenterLeft),
|
||||
@@ -407,6 +447,45 @@ namespace Barotrauma
|
||||
|
||||
//-----------------------------------------------
|
||||
|
||||
undoBufferPanel = new GUIFrame(new RectTransform(new Vector2(0.15f, 0.2f), GUI.Canvas) { MinSize = new Point(200, 200) })
|
||||
{
|
||||
Visible = false
|
||||
};
|
||||
undoBufferList = new GUIListBox(new RectTransform(new Vector2(0.925f, 0.9f), undoBufferPanel.RectTransform, Anchor.Center))
|
||||
{
|
||||
ScrollBarVisible = true,
|
||||
OnSelected = (_, userData) =>
|
||||
{
|
||||
int index;
|
||||
if (userData is Command command)
|
||||
{
|
||||
index = Commands.IndexOf(command);
|
||||
}
|
||||
else
|
||||
{
|
||||
index = -1;
|
||||
}
|
||||
|
||||
int diff = index- commandIndex;
|
||||
int amount = Math.Abs(diff);
|
||||
|
||||
if (diff >= 0)
|
||||
{
|
||||
Redo(amount + 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
Undo(amount - 1);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
UpdateUndoHistoryPanel();
|
||||
|
||||
//-----------------------------------------------
|
||||
|
||||
showEntitiesPanel = new GUIFrame(new RectTransform(new Vector2(0.08f, 0.5f), GUI.Canvas)
|
||||
{
|
||||
MinSize = new Point(170, 0)
|
||||
@@ -885,6 +964,7 @@ namespace Barotrauma
|
||||
{
|
||||
base.Select();
|
||||
|
||||
GUI.PreventPauseMenuToggle = false;
|
||||
if (!Directory.Exists(autoSavePath))
|
||||
{
|
||||
System.IO.DirectoryInfo e = Directory.CreateDirectory(autoSavePath);
|
||||
@@ -1043,6 +1123,7 @@ namespace Barotrauma
|
||||
|
||||
MapEntity.DeselectAll();
|
||||
MapEntity.SelectionGroups.Clear();
|
||||
ClearUndoBuffer();
|
||||
|
||||
SetMode(Mode.Default);
|
||||
|
||||
@@ -1062,147 +1143,15 @@ namespace Barotrauma
|
||||
GameMain.World.ProcessChanges();
|
||||
}
|
||||
|
||||
if (GUIMessageBox.MessageBoxes.Any(mbox => (mbox as GUIMessageBox)?.Tag == containerDeleteTag))
|
||||
{
|
||||
for (int i = 0; i < GUIMessageBox.MessageBoxes.Count; i++)
|
||||
{
|
||||
GUIMessageBox box = GUIMessageBox.MessageBoxes[i] as GUIMessageBox;
|
||||
if (box != null && box.Tag != containerDeleteTag) continue;
|
||||
box?.Close();
|
||||
i--; // Take into account the message boxes removing themselves from the list when closed
|
||||
}
|
||||
}
|
||||
ClearFilter();
|
||||
}
|
||||
|
||||
public void HandleContainerContentsDeletion(Item itemToDelete, Inventory itemInventory)
|
||||
{
|
||||
string itemNames = string.Empty;
|
||||
|
||||
foreach (Item item in itemInventory.Items)
|
||||
{
|
||||
if (item == null) continue;
|
||||
itemNames += item.Name + "\n";
|
||||
}
|
||||
|
||||
if (itemNames.Length > 0)
|
||||
{
|
||||
// Multiple prompts open
|
||||
if (GUIMessageBox.MessageBoxes.Any(mbox => (mbox as GUIMessageBox)?.Tag == containerDeleteTag))
|
||||
{
|
||||
var msgBox = new GUIMessageBox(itemToDelete.Name, TextManager.Get("DeletingContainerWithItems") + itemNames, new[] { TextManager.Get("Yes"), TextManager.Get("No"), TextManager.Get("YesToAll"), TextManager.Get("NoToAll") }, tag: containerDeleteTag);
|
||||
|
||||
// Yes
|
||||
msgBox.Buttons[0].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
itemInventory.DeleteAllItems();
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
|
||||
// No
|
||||
msgBox.Buttons[1].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
if (Selected == GameMain.SubEditorScreen)
|
||||
{
|
||||
foreach (Item item in itemInventory.Items)
|
||||
{
|
||||
item?.Drop(null);
|
||||
}
|
||||
}
|
||||
else // If current screen is not subeditor, delete anyway to avoid lingering objects
|
||||
{
|
||||
itemInventory.DeleteAllItems();
|
||||
}
|
||||
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
|
||||
// Yes to All
|
||||
msgBox.Buttons[2].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
for (int i = 0; i < GUIMessageBox.MessageBoxes.Count; i++)
|
||||
{
|
||||
GUIMessageBox box = GUIMessageBox.MessageBoxes[i] as GUIMessageBox;
|
||||
if (box?.Tag != msgBox.Tag || box == msgBox) continue;
|
||||
GUIButton button = box?.Buttons[0];
|
||||
button?.OnClicked(button, button.UserData);
|
||||
i--; // Take into account the message boxes removing themselves from the list when closed
|
||||
}
|
||||
|
||||
itemInventory.DeleteAllItems();
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
|
||||
// No to all
|
||||
msgBox.Buttons[3].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
for (int i = 0; i < GUIMessageBox.MessageBoxes.Count; i++)
|
||||
{
|
||||
GUIMessageBox box = GUIMessageBox.MessageBoxes[i] as GUIMessageBox;
|
||||
if (box?.Tag != msgBox.Tag || box == msgBox) continue;
|
||||
GUIButton button = box?.Buttons[1];
|
||||
button?.OnClicked(button, button.UserData);
|
||||
i--; // Take into account the message boxes removing themselves from the list when closed
|
||||
}
|
||||
|
||||
if (Selected == GameMain.SubEditorScreen)
|
||||
{
|
||||
foreach (Item item in itemInventory.Items)
|
||||
{
|
||||
item?.Drop(null);
|
||||
}
|
||||
}
|
||||
else // If current screen is not subeditor, delete anyway to avoid lingering objects
|
||||
{
|
||||
itemInventory.DeleteAllItems();
|
||||
}
|
||||
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
else // Single prompt
|
||||
{
|
||||
var msgBox = new GUIMessageBox(itemToDelete.Name, TextManager.Get("DeletingContainerWithItems") + itemNames, new[] { TextManager.Get("Yes"), TextManager.Get("No") }, tag: containerDeleteTag);
|
||||
|
||||
// Yes
|
||||
msgBox.Buttons[0].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
itemInventory.DeleteAllItems();
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
|
||||
// No
|
||||
msgBox.Buttons[1].OnClicked = (btn, userdata) =>
|
||||
{
|
||||
if (Selected == GameMain.SubEditorScreen)
|
||||
{
|
||||
foreach (Item item in itemInventory.Items)
|
||||
{
|
||||
item?.Drop(null);
|
||||
}
|
||||
}
|
||||
else // If current screen is not subeditor, delete anyway to avoid lingering objects
|
||||
{
|
||||
itemInventory.DeleteAllItems();
|
||||
}
|
||||
|
||||
msgBox.Close();
|
||||
return true;
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateDummyCharacter()
|
||||
{
|
||||
if (dummyCharacter != null) RemoveDummyCharacter();
|
||||
|
||||
dummyCharacter = Character.Create(CharacterPrefab.HumanSpeciesName, Vector2.Zero, "", hasAi: false);
|
||||
dummyCharacter.Info.Name = "Galldren";
|
||||
|
||||
//make space for the entity menu
|
||||
for (int i = 0; i < dummyCharacter.Inventory.SlotPositions.Length; i++)
|
||||
@@ -2609,7 +2558,7 @@ namespace Barotrauma
|
||||
var selectedSub = new Submarine(selectedSubInfo);
|
||||
Submarine.MainSub = selectedSub;
|
||||
Submarine.MainSub.UpdateTransform(interpolate: false);
|
||||
|
||||
ClearUndoBuffer();
|
||||
CreateDummyCharacter();
|
||||
|
||||
string name = Submarine.MainSub.Info.Name;
|
||||
@@ -2790,6 +2739,7 @@ namespace Barotrauma
|
||||
|
||||
MapEntity.DeselectAll();
|
||||
MapEntity.FilteredSelectedList.Clear();
|
||||
ClearUndoBuffer();
|
||||
|
||||
CreateDummyCharacter();
|
||||
if (newMode == Mode.Wiring)
|
||||
@@ -2922,7 +2872,7 @@ namespace Barotrauma
|
||||
CreateBackgroundColorPicker();
|
||||
break;
|
||||
case "selectsame":
|
||||
IEnumerable<MapEntity> matching = MapEntity.mapEntityList.Where(e => targets.Any(t => t.prefab.Identifier == e.prefab.Identifier) && !MapEntity.SelectedList.Contains(e));
|
||||
IEnumerable<MapEntity> matching = MapEntity.mapEntityList.Where(e => e.prefab != null && targets.Any(t => t.prefab.Identifier == e.prefab.Identifier) && !MapEntity.SelectedList.Contains(e));
|
||||
MapEntity.SelectedList.AddRange(matching);
|
||||
break;
|
||||
case "copy":
|
||||
@@ -2935,7 +2885,8 @@ namespace Barotrauma
|
||||
MapEntity.Paste(cam.ScreenToWorld(contextMenu.Rect.Location.ToVector2()));
|
||||
break;
|
||||
case "delete":
|
||||
targets.ForEach(me => { me.Remove(); });
|
||||
StoreCommand(new AddOrDeleteCommand(targets, true));
|
||||
targets.ForEach(me => { if (!me.Removed) { me.Remove(); }});
|
||||
break;
|
||||
case "open" when target != null:
|
||||
OpenItem(target);
|
||||
@@ -3234,7 +3185,13 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
});
|
||||
GUI.PlayUISound(spawnedItem ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
|
||||
List<MapEntity> placedEntities = itemInstance.Where(it => !it.Removed).Cast<MapEntity>().ToList();
|
||||
if (placedEntities.Any())
|
||||
{
|
||||
StoreCommand(new AddOrDeleteCommand(placedEntities, false));
|
||||
}
|
||||
SoundPlayer.PlayUISound(spawnedItem ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
break;
|
||||
}
|
||||
case ItemPrefab itemPrefab when PlayerInput.IsShiftDown():
|
||||
@@ -3243,12 +3200,17 @@ namespace Barotrauma
|
||||
if (!inv.TryPutItem(item, dummyCharacter))
|
||||
{
|
||||
// We failed, remove the item so it doesn't stay at x:0,y:0
|
||||
GUI.PlayUISound(GUISoundType.PickItemFail);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItemFail);
|
||||
item.Remove();
|
||||
}
|
||||
else
|
||||
{
|
||||
GUI.PlayUISound(GUISoundType.PickItem);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItem);
|
||||
}
|
||||
|
||||
if (!item.Removed)
|
||||
{
|
||||
StoreCommand(new AddOrDeleteCommand(new List<MapEntity> { item }, false));
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -3257,7 +3219,7 @@ namespace Barotrauma
|
||||
{
|
||||
// Place the item into our hands
|
||||
DraggedItemPrefab = (MapEntityPrefab) obj;
|
||||
GUI.PlayUISound(GUISoundType.PickItem);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItem);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3265,7 +3227,7 @@ namespace Barotrauma
|
||||
}
|
||||
else
|
||||
{
|
||||
GUI.PlayUISound(GUISoundType.PickItem);
|
||||
SoundPlayer.PlayUISound(GUISoundType.PickItem);
|
||||
MapEntityPrefab.SelectPrefab(obj);
|
||||
}
|
||||
|
||||
@@ -3611,6 +3573,7 @@ namespace Barotrauma
|
||||
EntityMenu.AddToGUIUpdateList();
|
||||
showEntitiesPanel.AddToGUIUpdateList();
|
||||
previouslyUsedPanel.AddToGUIUpdateList();
|
||||
undoBufferPanel.AddToGUIUpdateList();
|
||||
entityCountPanel.AddToGUIUpdateList();
|
||||
TopPanel.AddToGUIUpdateList();
|
||||
|
||||
@@ -3655,10 +3618,7 @@ namespace Barotrauma
|
||||
/// </summary>
|
||||
private bool IsMouseOnEditorGUI()
|
||||
{
|
||||
if (GUI.MouseOn == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if (GUI.MouseOn == null) { return false; }
|
||||
|
||||
return (EntityMenu?.MouseRect.Contains(PlayerInput.MousePosition) ?? false)
|
||||
|| (entityCountPanel?.MouseRect.Contains(PlayerInput.MousePosition) ?? false)
|
||||
@@ -3666,6 +3626,91 @@ namespace Barotrauma
|
||||
|| (TopPanel?.MouseRect.Contains(PlayerInput.MousePosition) ?? false);
|
||||
}
|
||||
|
||||
private static void Redo(int amount)
|
||||
{
|
||||
for (int i = 0; i < amount; i++)
|
||||
{
|
||||
if (commandIndex < Commands.Count)
|
||||
{
|
||||
Command command = Commands[commandIndex++];
|
||||
command.Execute();
|
||||
}
|
||||
}
|
||||
GameMain.SubEditorScreen.UpdateUndoHistoryPanel();
|
||||
}
|
||||
|
||||
private static void Undo(int amount)
|
||||
{
|
||||
for (int i = 0; i < amount; i++)
|
||||
{
|
||||
if (commandIndex > 0)
|
||||
{
|
||||
Command command = Commands[--commandIndex];
|
||||
command.UnExecute();
|
||||
}
|
||||
}
|
||||
GameMain.SubEditorScreen.UpdateUndoHistoryPanel();
|
||||
}
|
||||
|
||||
private static void ClearUndoBuffer()
|
||||
{
|
||||
SerializableEntityEditor.PropertyChangesActive = false;
|
||||
SerializableEntityEditor.CommandBuffer = null;
|
||||
Commands.ForEach(cmd => cmd.Cleanup());
|
||||
Commands.Clear();
|
||||
commandIndex = 0;
|
||||
GameMain.SubEditorScreen.UpdateUndoHistoryPanel();
|
||||
}
|
||||
|
||||
public static void StoreCommand(Command command)
|
||||
{
|
||||
if (commandIndex != Commands.Count)
|
||||
{
|
||||
Commands.RemoveRange(commandIndex, Commands.Count - commandIndex);
|
||||
}
|
||||
Commands.Add(command);
|
||||
commandIndex++;
|
||||
|
||||
// Start removing old commands
|
||||
if (Commands.Count > Math.Clamp(GameSettings.SubEditorMaxUndoBuffer, 1, 10240))
|
||||
{
|
||||
Commands.First()?.Cleanup();
|
||||
Commands.RemoveRange(0, 1);
|
||||
commandIndex = Commands.Count;
|
||||
}
|
||||
|
||||
GameMain.SubEditorScreen.UpdateUndoHistoryPanel();
|
||||
}
|
||||
|
||||
public void UpdateUndoHistoryPanel()
|
||||
{
|
||||
if (undoBufferPanel == null) { return; }
|
||||
|
||||
undoBufferList.Content.Children.ForEachMod(component =>
|
||||
{
|
||||
undoBufferList.Content.RemoveChild(component);
|
||||
});
|
||||
|
||||
for (int i = 0; i < Commands.Count; i++)
|
||||
{
|
||||
Command command = Commands[i];
|
||||
string description = command.GetDescription();
|
||||
CreateTextBlock(description, description, i + 1, command).RectTransform.SetAsFirstChild();
|
||||
}
|
||||
|
||||
CreateTextBlock(TextManager.Get("undo.beginning"), TextManager.Get("undo.beginningtooltip"), 0, null);
|
||||
|
||||
GUITextBlock CreateTextBlock(string name, string description, int index, Command command)
|
||||
{
|
||||
return new GUITextBlock(new RectTransform(new Vector2(1.0f, 0.05f), undoBufferList.Content.RectTransform) { MinSize = new Point(0, 15) },
|
||||
ToolBox.LimitString(name, GUI.SmallFont, undoBufferList.Content.Rect.Width), font: GUI.SmallFont, textColor: index == commandIndex ? GUI.Style.Green : (Color?) null)
|
||||
{
|
||||
UserData = command,
|
||||
ToolTip = description
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Allows the game to run logic such as updating the world,
|
||||
/// checking for collisions, gathering input, and playing audio.
|
||||
@@ -3745,7 +3790,32 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (undoBufferPanel.Visible)
|
||||
{
|
||||
undoBufferList.Deselect();
|
||||
}
|
||||
|
||||
if (GUI.KeyboardDispatcher.Subscriber == null
|
||||
|| MapEntity.EditingHUD != null
|
||||
&& GUI.KeyboardDispatcher.Subscriber is GUIComponent sub
|
||||
&& MapEntity.EditingHUD.Children.Contains(sub))
|
||||
{
|
||||
if (PlayerInput.IsCtrlDown() && !WiringMode)
|
||||
{
|
||||
if (PlayerInput.KeyHit(Keys.Z))
|
||||
{
|
||||
// Ctrl+Shift+Z redos while Ctrl+Z undos
|
||||
if (PlayerInput.IsShiftDown()) { Redo(1); } else { Undo(1); }
|
||||
}
|
||||
|
||||
// ctrl+Y redo
|
||||
if (PlayerInput.KeyHit(Keys.Y))
|
||||
{
|
||||
Redo(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (GUI.KeyboardDispatcher.Subscriber == null)
|
||||
{
|
||||
@@ -4019,9 +4089,15 @@ namespace Barotrauma
|
||||
newItem.Remove();
|
||||
}
|
||||
|
||||
if (!newItem.Removed)
|
||||
{
|
||||
BulkItemBufferInUse = true;
|
||||
BulkItemBuffer.Add(new AddOrDeleteCommand(new List<MapEntity> { newItem }, false));
|
||||
}
|
||||
|
||||
if (!dragginMouse)
|
||||
{
|
||||
GUI.PlayUISound(spawnedItem ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
SoundPlayer.PlayUISound(spawnedItem ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4083,14 +4159,41 @@ namespace Barotrauma
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
List<MapEntity> placedEntities = itemInstance.Where(it => !it.Removed).Cast<MapEntity>().ToList();
|
||||
if (placedEntities.Any())
|
||||
{
|
||||
BulkItemBufferInUse = true;
|
||||
BulkItemBuffer.Add(new AddOrDeleteCommand(placedEntities, false));
|
||||
}
|
||||
}
|
||||
}
|
||||
GUI.PlayUISound(spawnedItems ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
|
||||
SoundPlayer.PlayUISound(spawnedItems ? GUISoundType.PickItem : GUISoundType.PickItemFail);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (BulkItemBufferInUse && PlayerInput.PrimaryMouseButtonReleased() && BulkItemBuffer.Any())
|
||||
{
|
||||
AddOrDeleteCommand master = BulkItemBuffer[0];
|
||||
for (int i = 1; i < BulkItemBuffer.Count; i++)
|
||||
{
|
||||
AddOrDeleteCommand command = BulkItemBuffer[i];
|
||||
command.MergeInto(master);
|
||||
}
|
||||
|
||||
StoreCommand(master);
|
||||
BulkItemBuffer.Clear();
|
||||
BulkItemBufferInUse = false;
|
||||
}
|
||||
|
||||
if (SerializableEntityEditor.PropertyChangesActive && (SerializableEntityEditor.NextCommandPush < DateTime.Now || MapEntity.EditingHUD == null))
|
||||
{
|
||||
SerializableEntityEditor.CommitCommandBuffer();
|
||||
}
|
||||
|
||||
// Update our mouse dragging state so we can easily slide thru slots while holding the mouse button down to place lots of items
|
||||
if (PlayerInput.PrimaryMouseButtonHeld())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user