func_plat: Added support for spawnflag 1, cleaned up some routines and touched up some documentation

This commit is contained in:
Marco Cawthorne 2020-08-31 06:59:32 +02:00
parent b129df68ed
commit f6fb7cf791

View file

@ -14,13 +14,19 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/*QUAKED func_plat (0 .5 .8) ?
/*QUAKED func_plat (0 .5 .8) ? FNCPLAT_TRIGGER
"targetname" Name
"speed" Speed of the lift in units per second
"height" Number of units the lift is supposed to move down
Brush that lets light to pass through it.
On idTech 2 BSPs, it will change texture variants when triggered.
It's a simple elevator. It goes down... and back up.
*/
enumflags
{
FNCPLAT_TRIGGER,
};
enum
{
PLATSTATE_RAISED,
@ -38,69 +44,14 @@ class func_plat:CBaseTrigger
void(void) func_plat;
virtual void(entity, int) Trigger;
virtual void(void) MoveUp;
virtual void(void) MoveDown;
virtual void(void) ArrivedUp;
virtual void(void) ArrivedDown;
virtual void(vector, void(void)) Move;
virtual void(void) MoveToggle;
virtual void(void) Respawn;
virtual void(void) touch;
};
void
func_plat::touch(void)
{
if (other.movetype != MOVETYPE_WALK) {
return;
}
Trigger(other, TRIG_TOGGLE);
}
void
func_plat::MoveDown(void)
{
vector vecDifference;
float flTravel, fTravelTime;
m_iState = PLATSTATE_DOWN;
vecDifference = ((m_oldOrigin - [0,0,m_flHeight]) - origin);
flTravel = vlen(vecDifference);
fTravelTime = (flTravel / m_flSpeed);
think = ArrivedDown;
if (fTravelTime < 0.1) {
velocity = [0,0,0];
nextthink = ltime + 0.1f;
return;
}
velocity = (vecDifference * (1.0f / fTravelTime));
nextthink = (ltime + fTravelTime);
}
void
func_plat::MoveUp(void)
{
vector vecDifference;
float flTravel, fTravelTime;
m_iState = PLATSTATE_UP;
vecDifference = (m_oldOrigin - origin);
flTravel = vlen(vecDifference);
fTravelTime = (flTravel / m_flSpeed);
think = ArrivedUp;
if (fTravelTime < 0.1) {
velocity = [0,0,0];
nextthink = ltime + 0.1f;
return;
}
velocity = (vecDifference * (1.0f / fTravelTime));
nextthink = (ltime + fTravelTime);
}
void
func_plat::ArrivedUp(void)
{
@ -116,15 +67,65 @@ func_plat::ArrivedDown(void)
}
void
func_plat::Trigger(entity act, int state)
func_plat::Move(vector vecDest, void() vFunc)
{
vector vecDifference;
float flTravel, fTravelTime;
m_iState = PLATSTATE_DOWN;
vecDifference = (vecDest - origin);
flTravel = vlen(vecDifference);
fTravelTime = (flTravel / m_flSpeed);
think = vFunc;
if (fTravelTime < 0.1) {
velocity = [0,0,0];
nextthink = ltime + 0.1f;
return;
}
velocity = (vecDifference * (1.0f / fTravelTime));
nextthink = (ltime + fTravelTime);
}
void
func_plat::MoveToggle(void)
{
if (m_iState == PLATSTATE_RAISED) {
MoveDown();
Move(m_oldOrigin - [0,0,m_flHeight], ArrivedDown);
} else if (m_iState == PLATSTATE_LOWERED) {
MoveUp();
Move(m_oldOrigin, ArrivedUp);
}
}
void
func_plat::Trigger(entity act, int state)
{
if (spawnflags & FNCPLAT_TRIGGER)
return;
switch (state) {
case TRIG_OFF:
Move(m_oldOrigin - [0,0,m_flHeight], ArrivedDown);
break;
case TRIG_ON:
Move(m_oldOrigin, ArrivedUp);
break;
default:
MoveToggle();
}
}
void
func_plat::touch(void)
{
if (other.movetype != MOVETYPE_WALK) {
return;
}
MoveToggle();
}
void
func_plat::Respawn(void)
{
@ -134,6 +135,8 @@ func_plat::Respawn(void)
SetOrigin(m_oldOrigin);
m_iState = PLATSTATE_RAISED;
think = __NULL__;
nextthink = 0.0f;
}
void