Example #1
0
void Camera::HandleFOVMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	if( crParsedMsg.GetArgCount() >= 3 )
	{
		m_fFovY = (float)atof( crParsedMsg.GetArg(1) );
		m_fFovAspectScale = (float)atof( crParsedMsg.GetArg(2) );

		float fT = 0.0f;

		if( crParsedMsg.GetArgCount() >= 4 )
		{
			fT = (float)atof( crParsedMsg.GetArg(3) );
		}

		CAutoMessage cMsg;
		cMsg.Writeuint8(MID_SFX_MESSAGE);
		cMsg.Writeuint8(SFX_CAMERA_ID);
		cMsg.WriteObject(m_hObject);
		cMsg.Writeuint8(CAMFX_FOV);
		cMsg.Writefloat(m_fFovY);
		cMsg.Writefloat(m_fFovAspectScale);
		cMsg.Writefloat(fT);

		// Send the message to all connected clients
		g_pLTServer->SendToClient(cMsg.Read(), NULL, MESSAGE_GUARANTEED);

		// Update the SpecialFX Message...

		CreateSFXMsg();
	}
}
Example #2
0
void Controller::HandleFlickerCommand(const CParsedMsg &cMsg)
{
	const char *pMin, *pMax, *pMessage;

	if (cMsg.GetArgCount() < 4)
	{
		ShowTriggerError(cMsg);
		return;
	}

	pMin = cMsg.GetArg(1);
	pMax = cMsg.GetArg(2);
	pMessage = cMsg.GetArg(3);
	if(strlen(pMessage) > MAX_FLICKERMSG_LEN)
	{
        g_pLTServer->CPrint("Controller: Warning, msg '%s' greater than %d", pMessage, MAX_FLICKERMSG_LEN);
	}

	m_fIntervalMin = (float)atof(pMin);
	m_fIntervalMax = (float)atof(pMax);
	SAFE_STRCPY(m_FlickerMsg, pMessage);
	m_FlickerCounter = FLICKER_FOREVER;

	if(cMsg.GetArgCount() >= 5)
	{
        m_FlickerCounter = (uint32)atof(cMsg.GetArg(4));
	}

    m_fNextFlickerTime = g_pLTServer->GetTime() + GetRandom(m_fIntervalMin, m_fIntervalMax);
	m_State = CState_Flicker;
    Activate();
}
Example #3
0
bool TextureFX::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_SetVar("SETVAR");

	bool bUpdate = false;

	if ((cMsg.GetArg(0) == s_cTok_SetVar) && (cMsg.GetArgCount() >= 4))
	{
		uint32 nStage	= (uint32)atoi(cMsg.GetArg(1)) - 1;
		uint32 nVar		= (uint32)atoi(cMsg.GetArg(2)) - 1;
		float  fVal		= (float)atof(cMsg.GetArg(3));

		if((nStage < NUM_STAGES) && (nVar < NUM_VARS))
		{
			//save the variable
			m_Stages[nStage].m_fVars[nVar] = fVal;

			//mark it as changes
			m_Stages[nStage].m_nChanged |= (1 << nVar);

			//we need to update the clients
			bUpdate = true;
		}
	}
	else
		return GameBase::OnTrigger(hSender, cMsg);

	// Tell the clients about the change
	if(bUpdate)
		UpdateClients();

	return true;
}
Example #4
0
void Spawner::HandleSpawnFromMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
    LTVector	vPos;
    LTRotation	rRot;
    const char *pName = "";

    ObjArray<HOBJECT, 1> objArray;
    g_pLTServer->FindNamedObjects( const_cast<char*>(crParsedMsg.GetArg(1).c_str()), objArray );

    // Spawn the target object from the position of the specified object...
    if( objArray.NumObjects() == 1 )
    {
        g_pLTServer->GetObjectPos( objArray.GetObject(0), &vPos );
        g_pLTServer->GetObjectRotation( objArray.GetObject(0), &rRot );
    }
    else
    {
        g_pLTServer->GetObjectPos( m_hObject, &vPos );
        g_pLTServer->GetObjectRotation( m_hObject, &rRot );
    }

    // Rename the object if desired
    if( crParsedMsg.GetArgCount() > 2 )
    {
        pName = crParsedMsg.GetArg(2);
    }

    // Spawn using a target template...
    Spawn( m_sTarget.c_str(), pName, vPos, rRot );
}
Example #5
0
void GameBase::HandleMoveMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	// Make sure we have all the arguments.
	if( crParsedMsg.GetArgCount( ) < 4 )
		return;

	static CParsedMsg::CToken s_cTok_SetPos( "SETPOS" );
	bool bSetPos = ( crParsedMsg.GetArg( 0 ) == s_cTok_SetPos );

	// Get the position they specified.  This is in WorldEdit space.
	LTVector vPos;
	vPos.x = ( float )atof( crParsedMsg.GetArg( 1 ));
	vPos.y = ( float )atof( crParsedMsg.GetArg( 2 ));
	vPos.z = ( float )atof( crParsedMsg.GetArg( 3 ));

	// Transform the position to runtime space.
	LTVector vOffset;
	g_pLTServer->GetSourceWorldOffset(vOffset);
	vPos -= vOffset;

	if( bSetPos )
		g_pLTServer->SetObjectPos( m_hObject, vPos );
	else
		g_pLTServer->Physics()->MoveObject( m_hObject, vPos, 0 );
}
Example #6
0
void GunMount::HandleFireMsg( HOBJECT hSender, const CParsedMsg &cMsg )
{
	static CParsedMsg::CToken	s_cTok_Fire( "FIRE" );
	static CParsedMsg::CToken	s_cTok_BeginFire( "BEGINFIRE" );
	static CParsedMsg::CToken	s_cTok_EndFire( "ENDFIRE" );

	if (cMsg.GetArg(0) == s_cTok_Fire)
	{
		// Check if they specified how many rounds to fire.
		if( cMsg.GetArgCount( ) > 1 )
		{
			m_nRoundsToFire = atoi( cMsg.GetArg( 1 ));
		}
		else
		{
			m_nRoundsToFire = 1;
		}

		StartPreFiring( );
		return;
	}
	else if (cMsg.GetArg(0) == s_cTok_BeginFire)
	{
		m_nRoundsToFire = -1;
		StartPreFiring( );
		return;
	}
	else if (cMsg.GetArg(0) == s_cTok_EndFire)
	{
		StartPostFiring( );
	}
}
Example #7
0
bool CAIState::HandleCommand(const CParsedMsg &cMsg)
{
	// If the command starts with the type name if this state,
	// handle it.
	if( cMsg.GetArg(0) == s_aszStateTypes[GetStateType()] )
	{
		// First token specifies the state.  Skip it.

		char szTempBuffer[256];
		char* szName;
		char* szValue;
		for(uint8 iToken=1; iToken < cMsg.GetArgCount(); ++iToken)
		{
			SAFE_STRCPY(szTempBuffer, cMsg.GetArg(iToken));
			szName  = strtok(szTempBuffer, "=");
			szValue = strtok(LTNULL, "");

			// Check for legal NAME=VALUE pair.
			AIASSERT(szName && szValue, LTNULL, "CAIState::HandleCommand: Name or Value is NULL.");
			if ( !(szName && szValue) )
			{
		        g_pLTServer->CPrint("Garbage name/value pair = %s", cMsg.GetArg(iToken).c_str());
				continue;
			}

			HandleNameValuePair(szName, szValue);
		}	

		return true;
	}

	return false;
}
Example #8
0
void CCheatMgr::BootPlayer(CParsedMsg &cMsg)
{
	if (!IsMultiplayerGame()) return;

	CClientInfoMgr *pCIMgr = g_pGameClientShell->GetInterfaceMgr( )->GetClientInfoMgr();
	if (!pCIMgr) return;

	if( cMsg.GetArgCount() < 2 )
		return;

	// The full name of the player might be split between several 
	// arguments of the message so build the name from all arguments
	// except the name of the actual cheat (Arg 1).
	
	char szPlayerName[MAX_PLAYER_NAME] = {0};
	cMsg.ReCreateMsg( szPlayerName, sizeof( szPlayerName ), 1 );

	CLIENT_INFO* pInfo = pCIMgr->GetFirstClient();
	while (pInfo && stricmp(pInfo->sName.c_str(),szPlayerName) != 0)
		pInfo = pInfo->pNext;

	if (pInfo)
	{

		// Tell the server
		SendCheatMessage( CHEAT_BOOT, pInfo->nID );
	}
}
void AINavMeshLinkAbstract::HandleMaxActiveAwarenessMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	if( crParsedMsg.GetArgCount() > 1 )
	{
		m_eMaxActiveAwareness = StringToAwareness( crParsedMsg.GetArg(1) );
	}
}
Example #10
0
void LightBase::HandleRadiusMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 2)
	{
		//read in our new dimensions and apply them
		m_fLightRadius =	LTMAX((float)atof(crParsedMsg.GetArg(1)), 0.0f);						
		g_pLTServer->SetLightRadius(m_hObject, m_fLightRadius);
	}
}
Example #11
0
void LightBase::HandleTextureMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 2)
	{
		//read in our new dimensions and apply them
		m_sLightTexture = crParsedMsg.GetArg(1);			
		g_pLTServer->SetLightTexture(m_hObject, m_sLightTexture.c_str());
	}
}
Example #12
0
void LightBase::HandleIntensityMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 2)
	{
		//read in our new dimensions and apply them
		m_fIntensityScale =	LTCLAMP((float)atof(crParsedMsg.GetArg(1)), 0.0f, 1.0f);						
		g_pLTServer->SetLightIntensityScale(m_hObject, m_fIntensityScale);
	}
}
Example #13
0
void WorldModel::HandleDetachMsg( const CParsedMsg &cMsg )
{
	if( cMsg.GetArgCount() >= 2 )
	{
		// Look for the specific objects we want to detach
		for( uint i = 1; i < cMsg.GetArgCount( ); i++ )
		{
			const char *pObjName = cMsg.GetArg(i).c_str();
			if( !pObjName )
				break;

			ObjArray<HOBJECT, 1> objArray;
			g_pLTServer->FindNamedObjects( const_cast<char *>(pObjName), objArray );

			if( objArray.NumObjects() )
			{
				DetachObject( objArray.GetObject( 0 ) );
			}
		}
	}
	else
	{
		// Remove an Object we attached using the AttachDir...

		if( m_hAttachDirObj )
		{
			DetachObject( m_hAttachDirObj );
			m_hAttachDirObj = NULL;
		}
		else
		{
			// Objects attached via ATTACH ....
			while( m_AttachMsgObjList.size( ))
			{
				ObjRefNotifierList::iterator msgiter = m_AttachMsgObjList.begin( );
				HOBJECT hObj = *msgiter;
				if( hObj )
					DetachObject( hObj );

				m_AttachMsgObjList.erase( msgiter );
			}
		}
	}
}
Example #14
0
void LightBase::HandleDimsMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 4)
	{
		//read in our new dimensions and apply them
		m_vDirectionalDims.Init(	LTMAX(0.0f, (float)atof(crParsedMsg.GetArg(1))),
									LTMAX(0.0f, (float)atof(crParsedMsg.GetArg(2))),
									LTMAX(0.0f, (float)atof(crParsedMsg.GetArg(3))));
		g_pLTServer->SetLightDirectionalDims(m_hObject, m_vDirectionalDims * LTVector(0.5f, 0.5f, 1.0f));
	}
}
Example #15
0
void LightBase::HandleColorMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 4)
	{
		//read in our new dimensions and apply them
		m_vColor.Init(	LTCLAMP((float)atof(crParsedMsg.GetArg(1)), 0.0f, 255.0f) / 255.0f,
						LTCLAMP((float)atof(crParsedMsg.GetArg(2)), 0.0f, 255.0f) / 255.0f,
						LTCLAMP((float)atof(crParsedMsg.GetArg(3)), 0.0f, 255.0f) / 255.0f);
		g_pLTServer->SetObjectColor(m_hObject, m_vColor.x, m_vColor.y, m_vColor.z, 1.0f);
	}
}
Example #16
0
void SecurityCamera::HandleGadgetMsg(const CParsedMsg &cMsg)
{
	if (cMsg.GetArgCount() < 2) return;

	AMMO const *pAmmo = g_pWeaponMgr->GetAmmo(atol(cMsg.GetArg(1)));
	if (!pAmmo) return;

	if (pAmmo->eInstDamageType == DT_CAMERA_DISABLER)
	{
		SetState(eStateDisabled);
	}
}
Example #17
0
void AINavMeshLinkAbstract::HandleMaxEnabledAwarenessMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	if( crParsedMsg.GetArgCount() > 1 )
	{
		m_eMaxEnabledAwareness = StringToAwareness( crParsedMsg.GetArg(1) );

		// All AIs need to clear existing knowledge of paths,
		// because enabling and disabling NavMeshLinks changes the connectivity.

		g_pAIPathMgrNavMesh->InvalidatePathKnowledge( hSender );
	}
}
Example #18
0
void LightBase::HandleSpotFOVMsg( HOBJECT /*hSender*/, const CParsedMsg &crParsedMsg )
{
	if(crParsedMsg.GetArgCount() == 3)
	{
		//read in our new dimensions and apply them
		m_fSpotFovX = LTCLAMP((float)atof(crParsedMsg.GetArg(1)), 0.0f, 90.0f);			
		m_fSpotFovY = LTCLAMP((float)atof(crParsedMsg.GetArg(2)), 0.0f, 90.0f);

		g_pLTServer->SetLightSpotInfo(m_hObject,	MATH_DEGREES_TO_RADIANS(m_fSpotFovX * 0.5f), 
													MATH_DEGREES_TO_RADIANS(m_fSpotFovY * 0.5f), 
													m_fSpotNearClip); 
	}
}
Example #19
0
bool WorldModel::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_Attach(KEY_ATTACH);
	static CParsedMsg::CToken s_cTok_Detach(KEY_DETACH);
	static CParsedMsg::CToken s_cTok_AttachClass("ATTACHCLASS");
	static CParsedMsg::CToken s_cTok_Destroy( "DESTROY" );
	static CParsedMsg::CToken s_cTok_Activate( "ACTIVATE" );

	if( cMsg.GetArg(0) == s_cTok_Attach && cMsg.GetArgCount() == 1 )
	{
		HandleAttachMsg( cMsg, "Prop" );
	}
	else if( cMsg.GetArg(0) == s_cTok_Attach && cMsg.GetArgCount() > 1 )
	{
		HandleAttachMsg( cMsg, LTNULL );
	}
	else if( cMsg.GetArg(0) == s_cTok_Detach )
	{
		HandleDetachMsg( cMsg );
	}
	else if( cMsg.GetArg(0) == s_cTok_AttachClass && cMsg.GetArgCount() == 2 )
	{
		HandleAttachMsg( cMsg, cMsg.GetArg(1).c_str() );
	}
	else if( cMsg.GetArg(0) == s_cTok_Destroy )
	{
		// Allow the WorldModel to be destroyed and then let the aggregate destroy it...
		
		m_DamageModel.SetNeverDestroy( LTFALSE );
	}
	else if( cMsg.GetArg(0) == s_cTok_Activate )
	{
		HandleActivateMsg( hSender, cMsg );
	}
	else
		return GameBase::OnTrigger(hSender, cMsg);

	return true;
}
Example #20
0
bool PickupItem::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_Activate("ACTIVATE");
	static CParsedMsg::CToken s_cTok_Team( "TEAM" );

	if( cMsg.GetArg(0) == s_cTok_Activate )
	{
		// Can't activate before we've respawned.
		if( m_bWasPickedUp )
			return true;

		// If the object is dead, it can't pick up stuff...

		if (IsPlayer(hSender))
		{
			CPlayerObj* pPlayer = (CPlayerObj*)g_pLTServer->HandleToObject(hSender);

			if (!pPlayer || pPlayer->IsDead()) return true;

			SetPlayerObj(hSender);

			ObjectTouch(hSender);
		}
		else
		{
			SetPlayerObj(LTNULL);
			return true;
		}
	}
	else if (cMsg.GetArg(0) == s_cTok_Team)
	{
		if( cMsg.GetArgCount( ) > 1 )
		{
			uint32 nTeamId = atoi( cMsg.GetArg( 1 ));
			if( nTeamId < MAX_TEAMS )
			{
				SetTeamId( nTeamId );
			}
			else
			{
				SetTeamId( INVALID_TEAM );
			}

			return true;
		}
	}
	else
		return GameBase::OnTrigger(hSender, cMsg);

	return true;
}
Example #21
0
void GameBase::HandleSetRotationMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	// Make sure we have all the arguments.
	if( crParsedMsg.GetArgCount( ) < 4 )
		return;

	// Get the euler angles.  Convert to radians.
	LTVector vEulerAngle;
	vEulerAngle.y = (( float )atof( crParsedMsg.GetArg( 1 )) * MATH_PI / 180.0f );
	vEulerAngle.x = (( float )atof( crParsedMsg.GetArg( 2 )) * MATH_PI / 180.0f );
	vEulerAngle.z = (( float )atof( crParsedMsg.GetArg( 3 )) * MATH_PI / 180.0f );

	LTRotation rRot( vEulerAngle.x, vEulerAngle.y, vEulerAngle.z );
	g_pLTServer->SetObjectRotation( m_hObject, rRot );
}
Example #22
0
void CAIWeaponAbstract::DefaultHandleModelString( CAI* pAI, const CParsedMsg& cParsedMsg )
{
	if (!pAI)
	{
		return;
	}

	static CParsedMsg::CToken s_cTok_CineFireWeapon("CINEFIRE");
	static CParsedMsg::CToken s_cTok_FireWeapon(c_szKeyFireWeapon);
	static CParsedMsg::CToken s_cTok_Throw(c_szKeyThrow);

	// FIRE and THROW 

	// When an AI is throwing a grenade, the thrown weapon ought to be
	// the current weapon.  If this changes, and they firing needs to
	// operate differently at a low level, either this default 
	// implementation can change, or the grenade can provide its own 
	// implementation.
	if (cParsedMsg.GetArg(0) == s_cTok_FireWeapon ||
		cParsedMsg.GetArg(0) == s_cTok_Throw )
	{
		if (cParsedMsg.GetArgCount() > 1)
		{
			const char* const pszSocketName = cParsedMsg.GetArg(1).c_str();
			m_szFireSocketName = pszSocketName ? pszSocketName : "";
		}
		else
		{
			m_szFireSocketName = "";
		}

		Fire(pAI);
		return;
	}

	// Cinematic firing.

	if( cParsedMsg.GetArg(0) == s_cTok_CineFireWeapon )
	{
		Cinefire(pAI);
		return;
	}
}
Example #23
0
void Spawner::HandleSpawnMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
    LTVector	vPos;
    LTRotation	rRot;
    const char *pName = "";

    // Spawn the target object from this spawners position...

    g_pLTServer->GetObjectPos( m_hObject, &vPos );
    g_pLTServer->GetObjectRotation( m_hObject, &rRot );

    // Rename the object if desired
    if( crParsedMsg.GetArgCount() > 1 )
    {
        pName = crParsedMsg.GetArg(1);
    }

    // Spawn using a target template...
    Spawn( m_sTarget.c_str(), pName, vPos, rRot );
}
Example #24
0
void GameBase::HandleCopyXFormMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	// Make sure we have all the arguments.
	if( crParsedMsg.GetArgCount( ) < 2 )
		return;

	// Get the target object.
	HOBJECT hTarget = NULL;
	FindNamedObject( crParsedMsg.GetArg( 1 ), hTarget, false );
	if( !hTarget )
		return;

	// Set the position for this object.
	LTVector vPos;
	g_pLTServer->GetObjectPos( hTarget, &vPos );
	g_pLTServer->SetObjectPos( m_hObject, vPos );

	// Set the rotation for this object.
	LTRotation rRot;
	g_pLTServer->GetObjectRotation( hTarget, &rRot );
	g_pLTServer->SetObjectRotation( m_hObject, rRot );
}
Example #25
0
void AINavMeshLinkAbstract::HandleAllMsgs( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	g_vtAIConsoleVar.Init( g_pLTServer, "AIShowMessages", NULL, 0.0f );
	if( g_vtAIConsoleVar.GetFloat() <= 0.0f )
	{
		return;
	}

	switch( crParsedMsg.GetArgCount() )
	{
		case 1: ObjectCPrint( GetName(), "Received Msg: %s", crParsedMsg.GetArg( 0 ).c_str() );
			break;
		case 2: ObjectCPrint( GetName(), "Received Msg: %s %s", crParsedMsg.GetArg( 0 ).c_str(), crParsedMsg.GetArg( 1 ).c_str() );
			break;
		case 3: ObjectCPrint( GetName(), "Received Msg: %s %s %s", crParsedMsg.GetArg( 0 ).c_str(), crParsedMsg.GetArg( 1 ).c_str(), crParsedMsg.GetArg( 2 ).c_str() );
			break;
		case 4: ObjectCPrint( GetName(), "Received Msg: %s %s %s %s", crParsedMsg.GetArg( 0 ).c_str(), crParsedMsg.GetArg( 1 ).c_str(), crParsedMsg.GetArg( 2 ).c_str(), crParsedMsg.GetArg( 3 ).c_str() );
			break;
		default: ObjectCPrint( GetName(), "Received Msg: %s %s %s %s ...", crParsedMsg.GetArg( 0 ).c_str(), crParsedMsg.GetArg( 1 ).c_str(), crParsedMsg.GetArg( 2 ).c_str(), crParsedMsg.GetArg( 3 ).c_str() );
			break;
	}
}
Example #26
0
void CCheatMgr::GimmeGun( CParsedMsg &cMsg )
{
	if( !g_pWeaponMgr || cMsg.GetArgCount() < 2 )
		return;

	// The full name of the weapon might be split between several 
	// arguments of the message so build the name from all arguments
	// except the name of the actual cheat (Arg 1).
	
	char szWeaponName[WMGR_MAX_NAME_LENGTH] = {0};
	cMsg.ReCreateMsg( szWeaponName, sizeof( szWeaponName ), 1 );

	const WEAPON *pWeapon = LTNULL;

	if( (szWeaponName[0] >= '0' && szWeaponName[0] <= '9') && strlen(szWeaponName) < 4 )
	{
		pWeapon = g_pWeaponMgr->GetWeapon( atoi( szWeaponName ));
	}
	else
	{
		pWeapon = g_pWeaponMgr->GetWeapon( szWeaponName );
	}

	char szMessage[256] = {0};

	if( pWeapon )
	{
		SendCheatMessage( CHEAT_GIMMEGUN, pWeapon->nId );

		sprintf( szMessage, "Giving weapon '%s' ID: %i", pWeapon->szName, pWeapon->nId );
		g_pChatMsgs->AddMessage( szMessage, kMsgCheatConfirm );
	}
	else
	{
		sprintf( szMessage, "Weapon '%s' does not exist!", szWeaponName );
		g_pChatMsgs->AddMessage( szMessage, kMsgCheatConfirm );
	}

}
Example #27
0
void AINavMeshLinkAbstract::HandleActiveMsg( HOBJECT hSender, const CParsedMsg &crParsedMsg )
{
	if( crParsedMsg.GetArgCount() > 1 )
	{
		// Activate or deactivate the link.

		const char* pszArg = crParsedMsg.GetArg(1);	
		SetNMLinkActive( IsTrueChar( pszArg[0] ) );

		// Clear timeout if link is deactivated.

		if( m_bTraversalTimedOut && !m_bLinkActive )
		{
			// Clear timeout.

			m_bTraversalTimedOut = false;

			// All AIs need to clear existing knowledge of paths,
			// because enabling and disabling NavMeshLinks changes the connectivity.

			g_pAIPathMgrNavMesh->InvalidatePathKnowledge( hSender );
		}
	}
}
Example #28
0
bool DoomsDayDevice::OnTrigger( HOBJECT hSender, const CParsedMsg &cMsg )
{
	static CParsedMsg::CToken	s_cTok_Fire( "FIRE" );
	static CParsedMsg::CToken	s_cTok_Team( "TEAM" );

	if( cMsg.GetArg( 0 ) == s_cTok_Fire )
	{
		// The fire trigger should come from a player.
		CPlayerObj* pPlayerObj = dynamic_cast< CPlayerObj* >( g_pLTServer->HandleToObject( hSender ));
		if( !pPlayerObj )
			return false;

		Fire( *pPlayerObj );
		return true;
	}
	else if (cMsg.GetArg(0) == s_cTok_Team)
	{
		if( cMsg.GetArgCount( ) > 1 )
		{
			uint32 nTeamId = atoi( cMsg.GetArg( 1 ));
			if( nTeamId < MAX_TEAMS )
			{
				m_nOwningTeamID = nTeamId;
			}
			else
			{
				m_nOwningTeamID = INVALID_TEAM;
			}

			return true;
		}
	}

	
	return PropType::OnTrigger( hSender, cMsg );
}
Example #29
0
// ----------------------------------------------------------------------- //
//
//	ROUTINE:	CTronPlayerObj::OnTrigger
//
//	PURPOSE:	Process a trigger message
//
// ----------------------------------------------------------------------- //
bool CTronPlayerObj::OnTrigger(HOBJECT hSender, const CParsedMsg &cMsg)
{
	static CParsedMsg::CToken s_cTok_Acquire_Subroutine(TRIGGER_ACQUIRE_SUBROUTINE);
	static CParsedMsg::CToken s_cTok_Acquire_Additive(TRIGGER_ACQUIRE_ADDITIVE);
	static CParsedMsg::CToken s_cTok_Acquire_Procedural(TRIGGER_ACQUIRE_PROCEDURAL);
	static CParsedMsg::CToken s_cTok_Acquire_Primitive(TRIGGER_ACQUIRE_PRIMITIVE);
	static CParsedMsg::CToken s_cTok_Add_Build_Points(TRIGGER_ADD_BUILD_POINTS);
	static CParsedMsg::CToken s_cTok_Start_LightCycle(TRIGGER_START_LIGHTCYCLE);
	static CParsedMsg::CToken s_cTok_End_LightCycle(TRIGGER_END_LIGHTCYCLE);

	if(cMsg.GetArg(0) == s_cTok_Acquire_Subroutine)
	{
		char const* pSub = cMsg.GetArg(1);
		char const* pState = NULL;
		char const* pCondition = NULL;

		// Check for a 3rd and/or 4th parameter
		if(cMsg.GetArgCount() > 2)
		{
			// Check for a 3rd param
			if(CheckSubState(cMsg.GetArg(2)))
			{
				pState = cMsg.GetArg(2);
			}
			else if(CheckSubCondition(cMsg.GetArg(2)))
			{
				pCondition = cMsg.GetArg(2);
			}
			else
			{
				g_pLTServer->CPrint("ERROR - Could not give subroutine to the player with bad 2nd param = (%s). Bad level designer. BAD!!!\n",cMsg.GetArg(2));
				ASSERT(FALSE);
				return false;
			}
			
			// Check for a 4th param
			if(cMsg.GetArgCount() > 3)
			{
				if(CheckSubState(cMsg.GetArg(3)))
				{
					pState = cMsg.GetArg(3);
				}
				else if(CheckSubCondition(cMsg.GetArg(3)))
				{
					pCondition = cMsg.GetArg(3);
				}
				else
				{
					g_pLTServer->CPrint("ERROR - Could not give subroutine to the player with bad 3rd param = (%s). Bad level designer. BAD!!!\n",cMsg.GetArg(3));
					ASSERT(FALSE);
					return false;
				}
			}
		}

		return AcquireSubroutine(pSub,pState,pCondition);
	}
	else if(cMsg.GetArg(0) == s_cTok_Acquire_Additive)
	{
		return AcquireAdditive(cMsg.GetArg(1));
	}
	else if(cMsg.GetArg(0) == s_cTok_Acquire_Procedural)
	{
		return AcquireProcedural(cMsg.GetArg(1));
	}
	else if(cMsg.GetArg(0) == s_cTok_Acquire_Primitive)
	{
		return AcquirePrimitive(cMsg.GetArg(1));
	}
	else if(cMsg.GetArg(0) == s_cTok_Add_Build_Points)
	{
		if(cMsg.GetArgCount() > 1)
		{
			int nBuildPoints = atoi(cMsg.GetArg(1));
			m_nBuildPoints += nBuildPoints;
#ifdef _DEBUG
			g_pLTServer->CPrint("%d Build Points added to player. Total is now %d\n",nBuildPoints,m_nBuildPoints);
#endif
		}

		return true;
	}
	else if(cMsg.GetArg(0) == s_cTok_Start_LightCycle)
	{
		StartLightCycle();
	}
	else if(cMsg.GetArg(0) == s_cTok_End_LightCycle)
	{
		EndLightCycle();
	}
	
	// Base-class it
	return(CPlayerObj::OnTrigger(hSender, cMsg));
}
Example #30
0
void WorldModel::HandleAttachMsg( const CParsedMsg &cMsg, const char *szClass )
{
	if( cMsg.GetArgCount() >= 2 && !szClass )
	{
		// Look for the specific objects we want to attach

		for( uint i = 1; i < cMsg.GetArgCount( ); i++ )
		{
			const char *pObjName = cMsg.GetArg(i).c_str();
			if( !pObjName )
				break;

			ObjArray<HOBJECT, 1> objArray;
			g_pLTServer->FindNamedObjects( const_cast<char*>(pObjName), objArray );

			if( objArray.NumObjects() )
			{
				AttachObject( objArray.GetObject( 0 ) );
			}
		}
	}
	else
	{
		if( m_vAttachDir.MagSqr() > 1.0f )
		{
			// Grab an object in the direction of the attach vector and attach it

			IntersectQuery	IQuery;
			IntersectInfo	IInfo;

			g_pLTServer->GetObjectPos( m_hObject, &IQuery.m_From );
			IQuery.m_To = IQuery.m_From + m_vAttachDir;

			IQuery.m_Flags = INTERSECT_OBJECTS | IGNORE_NONSOLID;

			if( g_pLTServer->IntersectSegment( &IQuery, &IInfo ) )
			{
				// Only attach objects of a specific class type...

				if( IInfo.m_hObject && IsKindOf( IInfo.m_hObject, szClass ))
				{
					if( m_hAttachDirObj )
						DetachObject( m_hAttachDirObj );

					m_hAttachDirObj = IInfo.m_hObject;
					AttachObject( m_hAttachDirObj );
				}
			}
		}
		else
		{
			LTVector	vPos;
			LTRotation	rRot;
			LTMatrix	mMat;

			g_pLTServer->GetObjectPos( m_hObject, &vPos );
			g_pLTServer->GetObjectRotation( m_hObject, &rRot );
			rRot.ConvertToMatrix( mMat );

			LTVector vMin, vMax, vDims;

			g_pPhysicsLT->GetObjectDims( m_hObject, &vDims );

			vMin = mMat * (vPos - vDims);
			vMax = mMat * (vPos + vDims);

			ObjectList *pObjList = g_pLTServer->GetBoxIntersecters( &vMin, &vMax );
			if( !pObjList )
				return;

			HOBJECT hObj;

			ObjectLink *pLink = pObjList->m_pFirstLink;
			while( pLink )
			{
				hObj = pLink->m_hObject;
				if( hObj && IsKindOf( hObj, szClass ))
				{
					AttachObject( hObj );

					// add it to our list of objects attached via the ATTACH message...
					LTObjRefNotifier ref( *this );
					ref = hObj;
					m_AttachMsgObjList.push_back( ref );
				}
				pLink = pLink->m_pNext;
			}

			g_pLTServer->RelinquishList( pObjList );
			pObjList = NULL;
		}
	}
}