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(); } }
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(); }
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; }
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 ); }
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 ); }
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( ); } }
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; }
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) ); } }
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); } }
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()); } }
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); } }
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 ); } } } }
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)); } }
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); } }
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); } }
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 ); } }
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); } }
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; }
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; }
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 ); }
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; } }
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 ); }
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 ); }
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; } }
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 ); } }
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 ); } } }
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 ); }
// ----------------------------------------------------------------------- // // // 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)); }
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; } } }