UltimateZoneBuilder/Source/Plugins/BuilderModes/VisualModes/EffectPlaneCopySlope.cs

131 lines
3.4 KiB
C#
Raw Normal View History

using CodeImp.DoomBuilder.Map;
namespace CodeImp.DoomBuilder.BuilderModes
{
internal class EffectPlaneCopySlope : SectorEffect
{
// Linedef that is used to create this effect
private readonly Linedef linedef;
private readonly bool front;
public EffectPlaneCopySlope(SectorData data, Linedef sourcelinedef, bool front) : base(data)
{
this.linedef = sourcelinedef;
this.front = front;
// New effect added: This sector needs an update!
if(data.Mode.VisualSectorExists(data.Sector))
{
BaseVisualSector vs = (BaseVisualSector)data.Mode.GetVisualSector(data.Sector);
vs.UpdateSectorGeometry(true);
}
}
// This makes sure we are updated with the source linedef information
public override void Update()
{
Sector sourcesector = null;
SectorData sourcesectordata = null;
// Copy slopes from tagged sectors
//check which arguments we must use
int floorArg = (front ? 0 : 2);
int ceilingArg = (front ? 1 : 3);
//find sector to align floor to
if(linedef.Args[floorArg] > 0)
{
foreach(Sector s in General.Map.Map.Sectors)
{
if(s.Tags.Contains(linedef.Args[floorArg]))
{
sourcesector = s;
break;
}
}
if(sourcesector != null)
{
sourcesectordata = data.Mode.GetSectorData(sourcesector);
if(!sourcesectordata.Updated) sourcesectordata.Update();
data.Floor.plane = sourcesectordata.Floor.plane;
sourcesectordata.AddUpdateSector(data.Sector, true);
}
}
if(linedef.Args[ceilingArg] > 0)
{
//find sector to align ceiling to
if(linedef.Args[ceilingArg] != linedef.Args[floorArg])
{
sourcesector = null;
foreach(Sector s in General.Map.Map.Sectors)
{
if(s.Tags.Contains(linedef.Args[ceilingArg]))
{
sourcesector = s;
break;
}
}
if(sourcesector != null)
{
sourcesectordata = data.Mode.GetSectorData(sourcesector);
if(!sourcesectordata.Updated) sourcesectordata.Update();
data.Ceiling.plane = sourcesectordata.Ceiling.plane;
sourcesectordata.AddUpdateSector(data.Sector, true);
}
}
else if(sourcesector != null) //ceiling uses the same sector as floor
{
data.Ceiling.plane = sourcesectordata.Ceiling.plane;
}
}
//check the flags...
bool copyFloor = false;
bool copyCeiling = false;
if(linedef.Args[4] > 0 && linedef.Args[4] != 3 && linedef.Args[4] != 12)
{
if(front)
{
copyFloor = (linedef.Args[4] & 2) == 2;
copyCeiling = (linedef.Args[4] & 8) == 8;
}
else
{
copyFloor = (linedef.Args[4] & 1) == 1;
copyCeiling = (linedef.Args[4] & 4) == 4;
}
}
// Copy slope across the line
if(!copyFloor && !copyCeiling) return;
//get appropriate source sector data
sourcesectordata = data.Mode.GetSectorData(front ? linedef.Back.Sector : linedef.Front.Sector);
if(!sourcesectordata.Updated) sourcesectordata.Update();
//copy floor slope?
if(copyFloor)
{
data.Floor.plane = sourcesectordata.Floor.plane;
sourcesectordata.AddUpdateSector(data.Sector, true);
}
//copy ceiling slope?
if(copyCeiling)
{
data.Ceiling.plane = sourcesectordata.Ceiling.plane;
sourcesectordata.AddUpdateSector(data.Sector, true);
}
}
}
}