- Test map from current mouse position now works properly in Hexen/UDMF maps with multiple player starts. Also works in maps without a valid player start now. Fixes #263.

This commit is contained in:
biwa 2019-04-16 18:05:21 +02:00 committed by spherallic
parent f59fbed358
commit 4f4a0bdf58
1 changed files with 42 additions and 18 deletions

View File

@ -82,6 +82,7 @@ namespace CodeImp.DoomBuilder.Editing
//mxd. used in "Play From Here" Action //mxd. used in "Play From Here" Action
private Thing playerStart; private Thing playerStart;
private Vector3D playerStartPosition; private Vector3D playerStartPosition;
private bool playerStartIsTempThing;
#endregion #endregion
@ -702,6 +703,22 @@ namespace CodeImp.DoomBuilder.Editing
return false; return false;
} }
//now check if cursor is located inside a sector
Sector s = General.Map.Map.GetSectorByCoordinates(mousemappos);
if (s == null)
{
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: mouse cursor must be inside a sector!");
return false;
}
//41 = player's height in Doom. Is that so in all other games as well?
if (s.CeilHeight - s.FloorHeight < 41)
{
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: sector is too low!");
return false;
}
//find Single Player Start. Should be type 1 in all games //find Single Player Start. Should be type 1 in all games
Thing start = null; Thing start = null;
@ -709,6 +726,11 @@ namespace CodeImp.DoomBuilder.Editing
{ {
if(t.Type == 1) if(t.Type == 1)
{ {
// biwa. In Hexen format and UDMF a map can have multiple valid player starts because of
// hubs. The player by default stats at the player start withe arg0 set to 0
if ((General.Map.HEXEN || General.Map.UDMF) && t.Args[0] != 0)
continue;
//store thing and position //store thing and position
if(start == null) if(start == null)
{ {
@ -724,24 +746,22 @@ namespace CodeImp.DoomBuilder.Editing
if(start == null) if(start == null)
{ {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: no Player 1 start found!"); // biwa. If there's no existing valid player start create one
playerStartIsTempThing = true;
start = General.Map.Map.CreateThing();
if (start != null)
{
General.Settings.ApplyDefaultThingSettings(start);
start.Type = 1;
} else
{
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: couldn't create player start!");
return false; return false;
} }
} else
//now check if cursor is located inside a sector
Sector s = General.Map.Map.GetSectorByCoordinates(mousemappos);
if(s == null)
{ {
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: mouse cursor must be inside a sector!"); playerStartIsTempThing = false;
return false;
}
//41 = player's height in Doom. Is that so in all other games as well?
if(s.CeilHeight - s.FloorHeight < 41)
{
General.MainWindow.DisplayStatus(StatusType.Warning, "Can't test from current position: sector is too low!");
return false;
} }
//store initial position //store initial position
@ -761,6 +781,10 @@ namespace CodeImp.DoomBuilder.Editing
{ {
//restore position //restore position
playerStart.Move(playerStartPosition); playerStart.Move(playerStartPosition);
if (playerStartIsTempThing) // biwa
General.Map.Map.RemoveThing(playerStart.Index);
playerStart = null; playerStart = null;
} }
} }