sin-sdk/areaportal.cpp

213 lines
4.2 KiB
C++
Raw Permalink Normal View History

1998-12-20 00:00:00 +00:00
//-----------------------------------------------------------------------------
//
// $Logfile:: /Quake 2 Engine/Sin/code/game/areaportal.cpp $
// $Revision:: 8 $
// $Author:: Jimdose $
// $Date:: 10/19/98 6:08p $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/areaportal.cpp $
//
// 8 10/19/98 6:08p Jimdose
// SetAreaPortals now cancels any waiting open or close portal events
//
// 7 8/28/98 7:14p Markd
// added world to trigger event
//
// 6 8/28/98 2:54p Markd
// Added Targets to AreaPortals
//
// 5 5/24/98 8:55p Jimdose
// Removed the char * cast from Q_stricmp call
//
// 4 5/20/98 11:11a Markd
// removed char * dependency
//
// 3 3/23/98 1:31p Jimdose
// Revamped event and command system
//
// 2 3/11/98 2:25p Jimdose
// Created file
//
// DESCRIPTION:
//
#include "g_local.h"
#include "entity.h"
#include "areaportal.h"
Event EV_AreaPortal_Open( "open" );
Event EV_AreaPortal_Close( "close" );
void SetAreaPortals
(
const char *name,
qboolean open
)
{
int t;
Entity *ent;
float time;
Event event;
if ( !name )
{
return;
}
// delay turning a portal off so that lerping models are in place when the portal goes off
if ( open )
{
time = 0;
event = EV_AreaPortal_Open;
}
else
{
time = FRAMETIME;
event = EV_AreaPortal_Close;
}
t = 0;
while( t = G_FindTarget( t, name ) )
{
ent = G_GetEntity( t );
assert( ent );
if ( Q_stricmp( ent->getClassID(), "func_areaportal" ) == 0 )
{
// Cancel any waiting portal events
ent->CancelEventsOfType( EV_AreaPortal_Open );
ent->CancelEventsOfType( EV_AreaPortal_Close );
ent->PostEvent( event, time );
}
}
}
/*****************************************************************************/
/*SINED func_areaportal (0 0 0) ?
This is a non-visible object that divides the world into
areas that are seperated when this portal is not activated.
Usually enclosed in the middle of a door.
/*****************************************************************************/
CLASS_DECLARATION( Entity, AreaPortal, "func_areaportal" );
ResponseDef AreaPortal::Responses[] =
{
{ &EV_AreaPortal_Open, ( Response )AreaPortal::Open },
{ &EV_AreaPortal_Close, ( Response )AreaPortal::Close },
{ NULL, NULL }
};
void AreaPortal::SetPortalState
(
qboolean state
)
{
portalstate = state;
gi.SetAreaPortalState( portalnum, portalstate );
}
qboolean AreaPortal::PortalOpen
(
void
)
{
return portalstate;
}
void AreaPortal::Open
(
Event *ev
)
{
const char *name;
SetPortalState( true );
//
// fire targets
//
name = Target();
if ( name && strcmp( name, "" ) )
{
int num;
Event *event;
Entity *ent;
num = 0;
do
{
num = G_FindTarget( num, name );
if ( !num )
{
break;
}
ent = G_GetEntity( num );
event = new Event( EV_Activate );
event->AddEntity( world );
ent->ProcessEvent( event );
}
while ( 1 );
}
}
void AreaPortal::Close
(
Event *ev
)
{
const char *name;
SetPortalState( false );
//
// fire targets
//
name = Target();
if ( name && strcmp( name, "" ) )
{
int num;
Event *event;
Entity *ent;
num = 0;
do
{
num = G_FindTarget( num, name );
if ( !num )
{
break;
}
ent = G_GetEntity( num );
event = new Event( EV_Activate );
event->AddEntity( world );
ent->ProcessEvent( event );
}
while ( 1 );
}
}
AreaPortal::AreaPortal()
{
portalnum = G_GetIntArg( "style" );
if ( !LoadingSavegame )
{
// always start closed, except during savegames
SetPortalState( false );
}
}