Add centerhitbox thing property

This commit is contained in:
spherallic 2023-06-10 01:13:54 +02:00
parent 61107eb6dd
commit ba4fca0861
5 changed files with 65 additions and 12 deletions

View file

@ -2345,12 +2345,14 @@ udmf
sprite = "internal:circlering";
width = 96;
height = 192;
centerhitbox = true;
}
605
{
title = "Circle of Rings (Big)";
sprite = "internal:circlebigring";
width = 192;
centerhitbox = true;
}
606
{
@ -2358,12 +2360,14 @@ udmf
sprite = "internal:circlesphere";
width = 96;
height = 192;
centerhitbox = true;
}
607
{
title = "Circle of Blue Spheres (Big)";
sprite = "internal:circlebigsphere";
width = 192;
centerhitbox = true;
}
608
{
@ -2371,12 +2375,14 @@ udmf
sprite = "internal:circleringsphere";
width = 96;
height = 192;
centerhitbox = true;
}
609
{
title = "Circle of Rings and Spheres (Big)";
sprite = "internal:circlebigringsphere";
width = 192;
centerhitbox = true;
}
610
{
@ -2405,6 +2411,7 @@ udmf
sprite = "RINGA0";
width = 96;
height = 192;
centerhitbox = true;
arg0
{
title = "Number of items";
@ -3589,6 +3596,7 @@ udmf
sprite = "WWSGAR";
width = 22;
height = 64;
wallsprite = true;
}
1213
{
@ -3596,6 +3604,7 @@ udmf
sprite = "WWS2AR";
width = 22;
height = 64;
wallsprite = true;
}
1214
{
@ -3603,6 +3612,7 @@ udmf
sprite = "WWS3ALAR";
width = 16;
height = 192;
wallsprite = true;
}
1215
{
@ -4491,6 +4501,7 @@ udmf
sprite = "internal:nightshoop";
width = 80;
height = 160;
centerhitbox = true;
arg0
{
title = "Radius";

View file

@ -59,7 +59,10 @@ namespace CodeImp.DoomBuilder.Config
private readonly bool fixedrotation; //mxd
private readonly bool absolutez;
private readonly float spritescale;
// SRB2 stuff
private readonly bool centerHitbox;
// Disposing
private bool isdisposed;
@ -93,6 +96,7 @@ namespace CodeImp.DoomBuilder.Config
public bool IsValid { get { return !isinvalid; } } //mxd
public bool AbsoluteZ { get { return absolutez; } }
public float SpriteScale { get { return spritescale; } }
public bool CenterHitbox { get { return centerHitbox; } }
public List<ThingTypeInfo> Things { get { return things; } }
public bool Optional { get { return optional; } }
@ -127,7 +131,8 @@ namespace CodeImp.DoomBuilder.Config
this.fixedrotation = parent.fixedrotation;
this.absolutez = parent.absolutez;
this.spritescale = parent.spritescale;
this.optional = parent.optional;
this.centerHitbox = parent.centerHitbox;
this.optional = parent.optional;
}
// Set default properties
else
@ -147,7 +152,8 @@ namespace CodeImp.DoomBuilder.Config
this.fixedrotation = false; //mxd
this.absolutez = false;
this.spritescale = 1.0f;
this.optional = false;
this.centerHitbox = false;
this.optional = false;
}
//mxd. Apply DecorateCategoryInfo overrides...
@ -214,7 +220,8 @@ namespace CodeImp.DoomBuilder.Config
this.fixedrotation = cfg.ReadSetting("thingtypes." + name + ".fixedrotation", parent.fixedrotation);
this.absolutez = cfg.ReadSetting("thingtypes." + name + ".absolutez", parent.absolutez);
this.spritescale = cfg.ReadSetting("thingtypes." + name + ".spritescale", parent.spritescale);
this.optional = cfg.ReadSetting("thingtypes." + name + ".optional", parent.optional);
this.centerHitbox = cfg.ReadSetting("thingtypes." + name + ".centerHitbox", parent.centerHitbox);
this.optional = cfg.ReadSetting("thingtypes." + name + ".optional", parent.optional);
}
else
{
@ -233,7 +240,8 @@ namespace CodeImp.DoomBuilder.Config
this.fixedrotation = cfg.ReadSetting("thingtypes." + name + ".fixedrotation", false); //mxd
this.absolutez = cfg.ReadSetting("thingtypes." + name + ".absolutez", false);
this.spritescale = cfg.ReadSetting("thingtypes." + name + ".spritescale", 1.0f);
this.optional = cfg.ReadSetting("thingtypes." + name + ".optional", false);
this.centerHitbox = cfg.ReadSetting("thingtypes." + name + ".centerHitbox", false);
this.optional = cfg.ReadSetting("thingtypes." + name + ".optional", false);
}
// Safety

View file

@ -98,6 +98,9 @@ namespace CodeImp.DoomBuilder.Config
private bool rollsprite;
private bool rollcenter;
// SRB2
private bool centerhitbox;
//mxd. Ambinent sound info
private AmbientSoundInfo ambientsound;
@ -152,6 +155,9 @@ namespace CodeImp.DoomBuilder.Config
public int ThingLink { get { return thinglink; } }
//SRB2
public bool CenterHitbox { get { return centerhitbox; } }
//mxd. Ambinent sound info
public AmbientSoundInfo AmbientSound { get { return ambientsound; } internal set { ambientsound = value; } }
@ -202,6 +208,8 @@ namespace CodeImp.DoomBuilder.Config
this.thinglink = 0;
this.optional = false; // [ZZ]
this.adduniversalfields = new List<string>();
// SRB2
this.centerhitbox = false;
// We have no destructor
GC.SuppressFinalize(this);
@ -243,6 +251,8 @@ namespace CodeImp.DoomBuilder.Config
this.locksprite = cfg.ReadSetting("thingtypes." + cat.Name + "." + key + ".locksprite", false); //mxd
this.classname = cfg.ReadSetting("thingtypes." + cat.Name + "." + key + ".class", String.Empty); //mxd
this.thinglink = cfg.ReadSetting("thingtypes." + cat.Name + "." + key + ".thinglink", 0);
// SRB2
this.centerhitbox = (cfg.ReadSetting("thingtypes." + cat.Name + "." + key + ".centerhitbox", cat.CenterHitbox));
// Read universal fields that should be added to this thing type
adduniversalfields = new List<string>();
@ -336,6 +346,9 @@ namespace CodeImp.DoomBuilder.Config
this.flagsrename = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); //mxd
this.adduniversalfields = new List<string>();
// SRB2
this.centerhitbox = cat.CenterHitbox;
// Safety
if(this.radius < 4f || this.fixedsize) this.radius = THING_FIXED_SIZE;
if(this.hangs && this.absolutez) this.hangs = false; //mxd
@ -384,6 +397,8 @@ namespace CodeImp.DoomBuilder.Config
this.spritescale = new SizeF(cat.SpriteScale, cat.SpriteScale);
this.flagsrename = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); //mxd
this.adduniversalfields = new List<string>();
// SRB2
this.centerhitbox = cat.CenterHitbox;
// Safety
if(this.hangs && this.absolutez) this.hangs = false; //mxd
@ -437,6 +452,8 @@ namespace CodeImp.DoomBuilder.Config
this.spritescale = new SizeF(cat.SpriteScale, cat.SpriteScale);
this.flagsrename = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); //mxd
this.adduniversalfields = new List<string>();
// SRB2
this.centerhitbox = cat.CenterHitbox;
// Safety
if(this.hangs && this.absolutez) this.hangs = false; //mxd
@ -494,14 +511,16 @@ namespace CodeImp.DoomBuilder.Config
this.spritescale = new SizeF(other.spritescale.Width, other.spritescale.Height);
this.flagsrename = new Dictionary<string, Dictionary<string, string>>(StringComparer.OrdinalIgnoreCase); //mxd
this.adduniversalfields = new List<string>(other.adduniversalfields);
// SRB2
this.centerhitbox = other.centerhitbox;
//mxd. Copy GZDoom rendering properties
this.rendermode = other.rendermode;
this.rollsprite = other.rollsprite;
this.rollcenter = other.rollcenter;
//
this.dynamiclighttype = other.dynamiclighttype;
//
this.dynamiclighttype = other.dynamiclighttype;
//
this.optional = other.optional;

View file

@ -574,8 +574,8 @@ namespace CodeImp.DoomBuilder.VisualModes
}
else
{
float top = position_v3.Z + thing.Height;
float bottom = position_v3.Z;
float top = position_v3.Z + (info.CenterHitbox ? thing.Height / 2 : thing.Height);
float bottom = position_v3.Z - (info.CenterHitbox ? thing.Height / 2 : 0);
WorldVertex v0 = new WorldVertex(-thing.Size + position_v3.X, -thing.Size + position_v3.Y, bottom);
WorldVertex v1 = new WorldVertex(-thing.Size + position_v3.X, thing.Size + position_v3.Y, bottom);
@ -606,7 +606,7 @@ namespace CodeImp.DoomBuilder.VisualModes
{
Matrix transform = Matrix.Scaling(thing.Size, thing.Size, thing.Size)
* (Matrix.RotationY((float)-Thing.RollRad) * Matrix.RotationX((float)-Thing.PitchRad) * Matrix.RotationZ((float)Thing.Angle))
* (sizeless ? position : position * Matrix.Translation(0.0f, 0.0f, thingheight / 2f));
* ((sizeless || info.CenterHitbox) ? position : position * Matrix.Translation(0.0f, 0.0f, thingheight / 2f));
WorldVertex a0 = new WorldVertex(Vector3D.Transform(0.0f, 0.0f, 0.0f, transform)); //start
WorldVertex a1 = new WorldVertex(Vector3D.Transform(0.0f, -1.5f, 0.0f, transform)); //end

View file

@ -352,7 +352,17 @@ namespace CodeImp.DoomBuilder.BuilderModes
verts[3] = verts[0];
verts[4] = verts[2];
verts[5] = new WorldVertex((float)(+radius + offsets.x), 0.0f, (float)(offsets.y - hh), sectorcolor, ur, 1.0f);
}
}
else if (info.CenterHitbox)
{
float hh = height / 2;
verts[0] = new WorldVertex((float)(-radius + offsets.x), 0.0f, -hh, sectorcolor, 0.0f, 1.0f);
verts[1] = new WorldVertex((float)(-radius + offsets.x), 0.0f, hh, sectorcolor, 0.0f, 0.0f);
verts[2] = new WorldVertex((float)(+radius + offsets.x), 0.0f, hh, sectorcolor, 1.0f, 0.0f);
verts[3] = verts[0];
verts[4] = verts[2];
verts[5] = new WorldVertex((float)(+radius + offsets.x), 0.0f, -hh, sectorcolor, 1.0f, 1.0f);
}
else
{
verts[0] = new WorldVertex((float)(-radius + offsets.x), 0.0f, (float)offsets.y, sectorcolor, ul, 1.0f);
@ -481,7 +491,12 @@ namespace CodeImp.DoomBuilder.BuilderModes
{
boxp1 = new Vector3D(pos.x - thingradius, pos.y - thingradius, pos.z - thingradius/2);
boxp2 = new Vector3D(pos.x + thingradius, pos.y + thingradius, pos.z + thingradius/2);
}
}
else if (info.CenterHitbox)
{
boxp1 = new Vector3D(pos.x - thingradius, pos.y - thingradius, pos.z - thingheight / 2);
boxp2 = new Vector3D(pos.x + thingradius, pos.y + thingradius, pos.z + thingheight / 2);
}
else
{
boxp1 = new Vector3D(pos.x - thingradius, pos.y - thingradius, pos.z);