213 lines
4.2 KiB
C++
213 lines
4.2 KiB
C++
|
//-----------------------------------------------------------------------------
|
||
|
//
|
||
|
// $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 );
|
||
|
}
|
||
|
}
|