//--------------------------------------------------------------------------------- // Purpose: Take a string, remove carriage return, remove comments, strips leading // and ending spaces //--------------------------------------------------------------------------------- void ClientMsg ( Color *col, const unsigned int seconds, const bool admin_only, const int level, const char* fmt, ... ) { player_t player; tchar szBuf[256]; va_list arg_ptr; va_start(arg_ptr, fmt); vsnprintf(szBuf, sizeof(szBuf)-1, fmt, arg_ptr); va_end(arg_ptr); Color admin_only_colour(255, 0, 0, 255); szBuf[sizeof(szBuf)-1] = 0; for (int i = 1; i <= max_players; i++ ) { player.index = i; if (!FindPlayerByIndex (&player)) { continue; } if (player.is_bot) { continue; } if (admin_only) { if (gpManiClient->HasAccess(player.index, ADMIN, ADMIN_BASIC_ADMIN)) { KeyValues *kv = new KeyValues("Msg"); kv->SetString("title", szBuf); kv->SetString("Msg", "message"); kv->SetColor("color", admin_only_colour); // Red kv->SetInt("level", level); kv->SetInt("time", seconds); helpers->CreateMessage(player.entity, DIALOG_MSG, kv, gpManiISPCCallback); kv->deleteThis(); } } else { KeyValues *kv = new KeyValues("Msg"); kv->SetString("title", szBuf); kv->SetString("Msg", "message"); kv->SetColor("color", *col); kv->SetInt("level", level); kv->SetInt("time", seconds); helpers->CreateMessage(player.entity, DIALOG_MSG, kv, gpManiISPCCallback); kv->deleteThis(); } } }
//----------------------------------------------------------------------------- // Recording //----------------------------------------------------------------------------- static inline void RecordBloodSprite( const Vector &start, const Vector &direction, int r, int g, int b, int a, int nSprayModelIndex, int nDropModelIndex, int size ) { if ( !ToolsEnabled() ) return; if ( clienttools->IsInRecordingMode() ) { Color clr( r, g, b, a ); const model_t* pSprayModel = (nSprayModelIndex != 0) ? modelinfo->GetModel( nSprayModelIndex ) : NULL; const model_t* pDropModel = (nDropModelIndex != 0) ? modelinfo->GetModel( nDropModelIndex ) : NULL; const char *pSprayModelName = pSprayModel ? modelinfo->GetModelName( pSprayModel ) : ""; const char *pDropModelName = pDropModel ? modelinfo->GetModelName( pDropModel ) : ""; KeyValues *msg = new KeyValues( "TempEntity" ); msg->SetInt( "te", TE_BLOOD_SPRITE ); msg->SetString( "name", "TE_BloodSprite" ); msg->SetFloat( "time", gpGlobals->curtime ); msg->SetFloat( "originx", start.x ); msg->SetFloat( "originy", start.y ); msg->SetFloat( "originz", start.z ); msg->SetFloat( "directionx", direction.x ); msg->SetFloat( "directiony", direction.y ); msg->SetFloat( "directionz", direction.z ); msg->SetColor( "color", clr ); msg->SetString( "spraymodel", pSprayModelName ); msg->SetString( "dropmodel", pDropModelName ); msg->SetInt( "size", size ); ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }
//--------------------------------------------------------------------------------- // Purpose: Take a string, remove carriage return, remove comments, strips leading // and ending spaces //--------------------------------------------------------------------------------- void ClientMsgSinglePlayer ( edict_t *pEntity, const unsigned int seconds, const int level, const char* fmt, ... ) { tchar szBuf[256]; va_list arg_ptr; va_start(arg_ptr, fmt); vsnprintf(szBuf, sizeof(szBuf)-1, fmt, arg_ptr); va_end(arg_ptr); szBuf[sizeof(szBuf)-1] = 0; KeyValues *kv = new KeyValues("Msg"); kv->SetString("title", szBuf); kv->SetString("Msg", "message"); kv->SetColor("color", Color(255, 255, 255, 255)); // White kv->SetInt("level", level); kv->SetInt("time", seconds); helpers->CreateMessage(pEntity, DIALOG_MSG, kv, gpManiISPCCallback); kv->deleteThis(); }
//--------------------------------------------------------------------------------- // Purpose: called on //--------------------------------------------------------------------------------- void CEmptyServerPlugin::ClientPutInServer( edict_t *pEntity, char const *playername ) { KeyValues *kv = new KeyValues( "msg" ); kv->SetString( "title", "Hello" ); kv->SetString( "msg", "Hello there" ); kv->SetColor( "color", Color( 255, 0, 0, 255 )); kv->SetInt( "level", 5); kv->SetInt( "time", 10); helpers->CreateMessage( pEntity, DIALOG_MSG, kv, this ); kv->deleteThis(); }
void CBaseMapsPage::SetListCellColors(MapData *pData, KeyValues *pKvInto) { KeyValues *pCellColor = new KeyValues("cellcolor"); // KeyValues *pCellBGColor = new KeyValues("cellbgcolor"); KeyValues *pSub = pCellColor->CreateNewKey(); pSub->SetName(CFmtStr("%i", HEADER_MAP_NAME)); pSub->SetColor("color", pData->m_bInLibrary ? COLOR_BLUE : COLOR_WHITE); // pCellBGColor->AddSubKey(pSub->MakeCopy()); pKvInto->AddSubKey(pCellColor); // pKvInto->AddSubKey(pCellBGColor); }
//----------------------------------------------------------------------------- // Recording //----------------------------------------------------------------------------- void C_TEShatterSurface::RecordShatterSurface( ) { if ( !ToolsEnabled() ) return; if ( clienttools->IsInRecordingMode() ) { Color front( m_uchFrontColor[0], m_uchFrontColor[1], m_uchFrontColor[2], 255 ); Color back( m_uchBackColor[0], m_uchBackColor[1], m_uchBackColor[2], 255 ); KeyValues *msg = new KeyValues( "TempEntity" ); msg->SetInt( "te", TE_SHATTER_SURFACE ); msg->SetString( "name", "TE_ShatterSurface" ); msg->SetFloat( "time", gpGlobals->curtime ); msg->SetFloat( "originx", m_vecOrigin.x ); msg->SetFloat( "originy", m_vecOrigin.y ); msg->SetFloat( "originz", m_vecOrigin.z ); msg->SetFloat( "anglesx", m_vecAngles.x ); msg->SetFloat( "anglesy", m_vecAngles.y ); msg->SetFloat( "anglesz", m_vecAngles.z ); msg->SetFloat( "forcex", m_vecForce.x ); msg->SetFloat( "forcey", m_vecForce.y ); msg->SetFloat( "forcez", m_vecForce.z ); msg->SetFloat( "forceposx", m_vecForcePos.x ); msg->SetFloat( "forceposy", m_vecForcePos.y ); msg->SetFloat( "forceposz", m_vecForcePos.z ); msg->SetColor( "frontcolor", front ); msg->SetColor( "backcolor", back ); msg->SetFloat( "width", m_flWidth ); msg->SetFloat( "height", m_flHeight ); msg->SetFloat( "size", m_flShardSize ); msg->SetInt( "surfacetype", m_nSurfaceType ); ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }
//----------------------------------------------------------------------------- // Flat Grey Shaded //----------------------------------------------------------------------------- void CDmeDrawSettings::BindGray() { if ( !s_bFlatGrayMaterial ) { s_bFlatGrayMaterial = true; KeyValues *pKeyValues = new KeyValues( "VertexLitGeneric" ); pKeyValues->SetInt( "$flat", 1 ); pKeyValues->SetColor( "$color", Color( 1, 1, 1 ) ); s_FlatGrayMaterial.Init( "__DmeFlatGrey", pKeyValues ); } CMatRenderContextPtr pRenderContext( g_pMaterialSystem ); pRenderContext->Bind( s_FlatGrayMaterial ); m_IsAMaterialBound = true; }
void TE_DynamicLight( IRecipientFilter& filter, float delay, const Vector* org, int r, int g, int b, int exponent, float radius, float time, float decay, int nLightIndex ) { dlight_t *dl = effects->CL_AllocDlight( nLightIndex ); if ( !dl ) return; dl->origin = *org; dl->radius = radius; dl->color.r = r; dl->color.g = g; dl->color.b = b; dl->color.exponent = exponent; dl->die = gpGlobals->curtime + time; dl->decay = decay; if ( ToolsEnabled() && clienttools->IsInRecordingMode() ) { Color clr( r, g, b, 255 ); KeyValues *msg = new KeyValues( "TempEntity" ); msg->SetInt( "te", TE_DYNAMIC_LIGHT ); msg->SetString( "name", "TE_DynamicLight" ); msg->SetFloat( "time", gpGlobals->curtime ); msg->SetFloat( "duration", time ); msg->SetFloat( "originx", org->x ); msg->SetFloat( "originy", org->y ); msg->SetFloat( "originz", org->z ); msg->SetFloat( "radius", radius ); msg->SetFloat( "decay", decay ); msg->SetColor( "color", clr ); msg->SetInt( "exponent", exponent ); msg->SetInt( "lightindex", nLightIndex ); ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }
//--------------------------------------------------------------------------------- // Purpose: called when a client types in a command (only a subset of commands however, not CON_COMMAND's) //--------------------------------------------------------------------------------- PLUGIN_RESULT CEmptyServerPlugin::ClientCommand( edict_t *pEntity ) { const char *pcmd = engine->Cmd_Argv(0); if ( !pEntity || pEntity->IsFree() ) { return PLUGIN_CONTINUE; } if ( FStrEq( pcmd, "menu" ) ) { KeyValues *kv = new KeyValues( "menu" ); kv->SetString( "title", "You've got options, hit ESC" ); kv->SetInt( "level", 1 ); kv->SetColor( "color", Color( 255, 0, 0, 255 )); kv->SetInt( "time", 20 ); kv->SetString( "msg", "Pick an option\nOr don't." ); for( int i = 1; i < 9; i++ ) { char num[10], msg[10], cmd[10]; Q_snprintf( num, sizeof(num), "%i", i ); Q_snprintf( msg, sizeof(msg), "Option %i", i ); Q_snprintf( cmd, sizeof(cmd), "option%i", i ); KeyValues *item1 = kv->FindKey( num, true ); item1->SetString( "msg", msg ); item1->SetString( "command", cmd ); } helpers->CreateMessage( pEntity, DIALOG_MENU, kv, this ); kv->deleteThis(); return PLUGIN_STOP; // we handled this function } else if ( FStrEq( pcmd, "rich" ) ) { KeyValues *kv = new KeyValues( "menu" ); kv->SetString( "title", "A rich message" ); kv->SetInt( "level", 1 ); kv->SetInt( "time", 20 ); kv->SetString( "msg", "This is a long long long text string.\n\nIt also has line breaks." ); helpers->CreateMessage( pEntity, DIALOG_TEXT, kv, this ); kv->deleteThis(); return PLUGIN_STOP; // we handled this function } else if ( FStrEq( pcmd, "msg" ) ) { KeyValues *kv = new KeyValues( "menu" ); kv->SetString( "title", "Just a simple hello" ); kv->SetInt( "level", 1 ); kv->SetInt( "time", 20 ); helpers->CreateMessage( pEntity, DIALOG_MSG, kv, this ); kv->deleteThis(); return PLUGIN_STOP; // we handled this function } else if ( FStrEq( pcmd, "entry" ) ) { KeyValues *kv = new KeyValues( "entry" ); kv->SetString( "title", "Stuff" ); kv->SetString( "msg", "Enter something" ); kv->SetString( "command", "say" ); // anything they enter into the dialog turns into a say command kv->SetInt( "level", 1 ); kv->SetInt( "time", 20 ); helpers->CreateMessage( pEntity, DIALOG_ENTRY, kv, this ); kv->deleteThis(); return PLUGIN_STOP; // we handled this function } return PLUGIN_CONTINUE; }
//----------------------------------------------------------------------------- // Purpose: // Input : scale - // attachmentIndex - // bOneFrame - //----------------------------------------------------------------------------- void FX_MuzzleEffectAttached( float scale, ClientEntityHandle_t hEntity, int attachmentIndex, unsigned char *pFlashColor, bool bOneFrame ) { VPROF_BUDGET( "FX_MuzzleEffect", VPROF_BUDGETGROUP_PARTICLE_RENDERING ); // If the material isn't available, let's not do anything. if ( g_Mat_SMG_Muzzleflash[0] == NULL ) { return; } CSmartPtr<CLocalSpaceEmitter> pSimple = CLocalSpaceEmitter::Create( "MuzzleFlash", hEntity, attachmentIndex ); Assert( pSimple ); if ( pSimple == NULL ) return; // Lock our bounding box pSimple->GetBinding().SetBBox( -( Vector( 16, 16, 16 ) * scale ), ( Vector( 16, 16, 16 ) * scale ) ); SimpleParticle *pParticle; Vector forward(1,0,0), offset; float flScale = random->RandomFloat( scale-0.25f, scale+0.25f ); if ( flScale < 0.5f ) { flScale = 0.5f; } else if ( flScale > 8.0f ) { flScale = 8.0f; } // // Flash // int i; for ( i = 1; i < 9; i++ ) { offset = (forward * (i*2.0f*scale)); pParticle = (SimpleParticle *) pSimple->AddParticle( sizeof( SimpleParticle ), g_Mat_SMG_Muzzleflash[random->RandomInt(0,3)], offset ); if ( pParticle == NULL ) return; pParticle->m_flLifetime = 0.0f; pParticle->m_flDieTime = bOneFrame ? 0.0001f : 0.1f; pParticle->m_vecVelocity.Init(); if ( !pFlashColor ) { pParticle->m_uchColor[0] = 255; pParticle->m_uchColor[1] = 255; pParticle->m_uchColor[2] = 255; } else { pParticle->m_uchColor[0] = pFlashColor[0]; pParticle->m_uchColor[1] = pFlashColor[1]; pParticle->m_uchColor[2] = pFlashColor[2]; } pParticle->m_uchStartAlpha = 255; pParticle->m_uchEndAlpha = 128; pParticle->m_uchStartSize = (random->RandomFloat( 6.0f, 9.0f ) * (12-(i))/9) * flScale; pParticle->m_uchEndSize = pParticle->m_uchStartSize; pParticle->m_flRoll = random->RandomInt( 0, 360 ); pParticle->m_flRollDelta = 0.0f; } if ( !ToolsEnabled() ) return; if ( !clienttools->IsInRecordingMode() ) return; C_BaseEntity *pEnt = ClientEntityList().GetBaseEntityFromHandle( hEntity ); if ( pEnt ) { pEnt->RecordToolMessage(); } // NOTE: Particle system destruction message will be sent by the particle effect itself. int nId = pSimple->AllocateToolParticleEffectId(); KeyValues *msg = new KeyValues( "OldParticleSystem_Create" ); msg->SetString( "name", "FX_MuzzleEffectAttached" ); msg->SetInt( "id", nId ); msg->SetFloat( "time", gpGlobals->curtime ); KeyValues *pEmitter = msg->FindKey( "DmeSpriteEmitter", true ); pEmitter->SetInt( "count", 9 ); pEmitter->SetFloat( "duration", 0 ); pEmitter->SetString( "material", "effects/muzzleflash2" ); // FIXME - create DmeMultiMaterialSpriteEmitter to support the 4 materials of muzzleflash pEmitter->SetInt( "active", true ); KeyValues *pInitializers = pEmitter->FindKey( "initializers", true ); KeyValues *pPosition = pInitializers->FindKey( "DmeLinearAttachedPositionInitializer", true ); pPosition->SetPtr( "entindex", (void*)pEnt->entindex() ); pPosition->SetInt( "attachmentIndex", attachmentIndex ); pPosition->SetFloat( "linearOffsetX", 2.0f * scale ); // TODO - create a DmeConstantLifetimeInitializer KeyValues *pLifetime = pInitializers->FindKey( "DmeRandomLifetimeInitializer", true ); pLifetime->SetFloat( "minLifetime", bOneFrame ? 1.0f / 24.0f : 0.1f ); pLifetime->SetFloat( "maxLifetime", bOneFrame ? 1.0f / 24.0f : 0.1f ); KeyValues *pVelocity = pInitializers->FindKey( "DmeConstantVelocityInitializer", true ); pVelocity->SetFloat( "velocityX", 0.0f ); pVelocity->SetFloat( "velocityY", 0.0f ); pVelocity->SetFloat( "velocityZ", 0.0f ); KeyValues *pRoll = pInitializers->FindKey( "DmeRandomRollInitializer", true ); pRoll->SetFloat( "minRoll", 0.0f ); pRoll->SetFloat( "maxRoll", 360.0f ); // TODO - create a DmeConstantRollSpeedInitializer KeyValues *pRollSpeed = pInitializers->FindKey( "DmeRandomRollSpeedInitializer", true ); pRollSpeed->SetFloat( "minRollSpeed", 0.0f ); pRollSpeed->SetFloat( "maxRollSpeed", 0.0f ); // TODO - create a DmeConstantColorInitializer KeyValues *pColor = pInitializers->FindKey( "DmeRandomInterpolatedColorInitializer", true ); Color color( pFlashColor ? pFlashColor[ 0 ] : 255, pFlashColor ? pFlashColor[ 1 ] : 255, pFlashColor ? pFlashColor[ 2 ] : 255, 255 ); pColor->SetColor( "color1", color ); pColor->SetColor( "color2", color ); // TODO - create a DmeConstantAlphaInitializer KeyValues *pAlpha = pInitializers->FindKey( "DmeRandomAlphaInitializer", true ); pAlpha->SetInt( "minStartAlpha", 255 ); pAlpha->SetInt( "maxStartAlpha", 255 ); pAlpha->SetInt( "minEndAlpha", 128 ); pAlpha->SetInt( "maxEndAlpha", 128 ); // size = rand(6..9) * indexed(12/9..4/9) * flScale = rand(6..9) * ( 4f + f * i ) KeyValues *pSize = pInitializers->FindKey( "DmeMuzzleFlashSizeInitializer", true ); float f = flScale / 9.0f; pSize->SetFloat( "indexedBase", 4.0f * f ); pSize->SetFloat( "indexedDelta", f ); pSize->SetFloat( "minRandomFactor", 6.0f ); pSize->SetFloat( "maxRandomFactor", 9.0f ); /* KeyValues *pUpdaters = pEmitter->FindKey( "updaters", true ); pUpdaters->FindKey( "DmePositionVelocityUpdater", true ); pUpdaters->FindKey( "DmeRollUpdater", true ); pUpdaters->FindKey( "DmeAlphaLinearUpdater", true ); pUpdaters->FindKey( "DmeSizeUpdater", true ); */ ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); }
//----------------------------------------------------------------------------- // Purpose: Sets a value in a panel //----------------------------------------------------------------------------- void AnimationController::SetValue(ActiveAnimation_t& anim, Panel *panel, UtlSymId_t var, Value_t &value) { if (var == m_sPosition) { int x = (int)value.a + GetRelativeOffset( anim.align, true ); int y = (int)value.b + GetRelativeOffset( anim.align, false ); panel->SetPos(x, y); } else if (var == m_sSize) { panel->SetSize((int)value.a, (int)value.b); } else if (var == m_sFgColor) { Color col = panel->GetFgColor(); col[0] = (unsigned char)value.a; col[1] = (unsigned char)value.b; col[2] = (unsigned char)value.c; col[3] = (unsigned char)value.d; panel->SetFgColor(col); } else if (var == m_sBgColor) { Color col = panel->GetBgColor(); col[0] = (unsigned char)value.a; col[1] = (unsigned char)value.b; col[2] = (unsigned char)value.c; col[3] = (unsigned char)value.d; panel->SetBgColor(col); } else if (var == m_sXPos) { int newx = (int)value.a + GetRelativeOffset( anim.align, true ); int x, y; panel->GetPos( x, y ); x = newx; panel->SetPos(x, y); } else if (var == m_sYPos) { int newy = (int)value.a + GetRelativeOffset( anim.align, false ); int x, y; panel->GetPos( x, y ); y = newy; panel->SetPos(x, y); } else if (var == m_sWide) { int neww = (int)value.a; int w, h; panel->GetSize( w, h ); w = neww; panel->SetSize(w, h); } else if (var == m_sTall) { int newh = (int)value.a; int w, h; panel->GetSize( w, h ); h = newh; panel->SetSize(w, h); } else { KeyValues *inputData = new KeyValues(g_ScriptSymbols.String(var)); // set the custom value if (value.b == 0.0f && value.c == 0.0f && value.d == 0.0f) { // only the first value is non-zero, so probably just a float value inputData->SetFloat(g_ScriptSymbols.String(var), value.a); } else { // multivalue, set the color Color col((unsigned char)value.a, (unsigned char)value.b, (unsigned char)value.c, (unsigned char)value.d); inputData->SetColor(g_ScriptSymbols.String(var), col); } if (!panel->SetInfo(inputData)) { // Assert(!("Unhandlable var in AnimationController::SetValue())")); } inputData->deleteThis(); } }
//----------------------------------------------------------------------------- // This is called after sending this entity's recording state //----------------------------------------------------------------------------- void C_ParticleSmokeGrenade::CleanupToolRecordingState( KeyValues *msg ) { if ( !ToolsEnabled() ) return; BaseClass::CleanupToolRecordingState( msg ); m_SmokeTrail.CleanupToolRecordingState( msg ); // Generally, this is used to allow the entity to clean up // allocated state it put into the message, but here we're going // to use it to send particle system messages because we // know the grenade has been recorded at this point if ( !clienttools->IsInRecordingMode() ) return; // NOTE: Particle system destruction message will be sent by the particle effect itself. if ( m_bVolumeFilled && GetToolParticleEffectId() == TOOLPARTICLESYSTEMID_INVALID ) { // Needed for retriggering of the smoke grenade m_bVolumeFilled = false; int nId = AllocateToolParticleEffectId(); KeyValues *msg = new KeyValues( "OldParticleSystem_Create" ); msg->SetString( "name", "C_ParticleSmokeGrenade" ); msg->SetInt( "id", nId ); msg->SetFloat( "time", gpGlobals->curtime ); KeyValues *pEmitter = msg->FindKey( "DmeSpriteEmitter", true ); pEmitter->SetInt( "count", NUM_PARTICLES_PER_DIMENSION * NUM_PARTICLES_PER_DIMENSION * NUM_PARTICLES_PER_DIMENSION ); pEmitter->SetFloat( "duration", 0 ); pEmitter->SetString( "material", "particle/particle_smokegrenade1" ); pEmitter->SetInt( "active", true ); KeyValues *pInitializers = pEmitter->FindKey( "initializers", true ); KeyValues *pPosition = pInitializers->FindKey( "DmeVoxelPositionInitializer", true ); pPosition->SetFloat( "centerx", m_SmokeBasePos.x ); pPosition->SetFloat( "centery", m_SmokeBasePos.y ); pPosition->SetFloat( "centerz", m_SmokeBasePos.z ); pPosition->SetFloat( "particlesPerDimension", m_xCount ); pPosition->SetFloat( "particleSpacing", m_SpacingRadius ); KeyValues *pLifetime = pInitializers->FindKey( "DmeRandomLifetimeInitializer", true ); pLifetime->SetFloat( "minLifetime", m_FadeEndTime ); pLifetime->SetFloat( "maxLifetime", m_FadeEndTime ); KeyValues *pVelocity = pInitializers->FindKey( "DmeAttachmentVelocityInitializer", true ); pVelocity->SetPtr( "entindex", (void*)entindex() ); pVelocity->SetFloat( "minRandomSpeed", 10 ); pVelocity->SetFloat( "maxRandomSpeed", 20 ); KeyValues *pRoll = pInitializers->FindKey( "DmeRandomRollInitializer", true ); pRoll->SetFloat( "minRoll", -6.0f ); pRoll->SetFloat( "maxRoll", 6.0f ); KeyValues *pRollSpeed = pInitializers->FindKey( "DmeRandomRollSpeedInitializer", true ); pRollSpeed->SetFloat( "minRollSpeed", -ROTATION_SPEED ); pRollSpeed->SetFloat( "maxRollSpeed", ROTATION_SPEED ); KeyValues *pColor = pInitializers->FindKey( "DmeRandomInterpolatedColorInitializer", true ); Color c1( clamp( m_MinColor.x * 255.0f, 0, 255 ), clamp( m_MinColor.y * 255.0f, 0, 255 ), clamp( m_MinColor.z * 255.0f, 0, 255 ), 255 ); Color c2( clamp( m_MaxColor.x * 255.0f, 0, 255 ), clamp( m_MaxColor.y * 255.0f, 0, 255 ), clamp( m_MaxColor.z * 255.0f, 0, 255 ), 255 ); pColor->SetColor( "color1", c1 ); pColor->SetColor( "color2", c2 ); KeyValues *pAlpha = pInitializers->FindKey( "DmeRandomAlphaInitializer", true ); pAlpha->SetInt( "minStartAlpha", 255 ); pAlpha->SetInt( "maxStartAlpha", 255 ); pAlpha->SetInt( "minEndAlpha", 0 ); pAlpha->SetInt( "maxEndAlpha", 0 ); KeyValues *pSize = pInitializers->FindKey( "DmeRandomSizeInitializer", true ); pSize->SetFloat( "minStartSize", SMOKEPARTICLE_SIZE ); pSize->SetFloat( "maxStartSize", SMOKEPARTICLE_SIZE ); pSize->SetFloat( "minEndSize", SMOKEPARTICLE_SIZE ); pSize->SetFloat( "maxEndSize", SMOKEPARTICLE_SIZE ); pInitializers->FindKey( "DmeSolidKillInitializer", true ); KeyValues *pUpdaters = pEmitter->FindKey( "updaters", true ); pUpdaters->FindKey( "DmeRollUpdater", true ); pUpdaters->FindKey( "DmeColorUpdater", true ); KeyValues *pAlphaCosineUpdater = pUpdaters->FindKey( "DmeAlphaCosineUpdater", true ); pAlphaCosineUpdater->SetFloat( "duration", m_FadeEndTime - m_FadeStartTime ); pUpdaters->FindKey( "DmeColorDynamicLightUpdater", true ); KeyValues *pSmokeGrenadeUpdater = pUpdaters->FindKey( "DmeSmokeGrenadeUpdater", true ); pSmokeGrenadeUpdater->SetFloat( "centerx", m_SmokeBasePos.x ); pSmokeGrenadeUpdater->SetFloat( "centery", m_SmokeBasePos.y ); pSmokeGrenadeUpdater->SetFloat( "centerz", m_SmokeBasePos.z ); pSmokeGrenadeUpdater->SetFloat( "particlesPerDimension", m_xCount ); pSmokeGrenadeUpdater->SetFloat( "particleSpacing", m_SpacingRadius ); pSmokeGrenadeUpdater->SetFloat( "radiusExpandTime", SMOKESPHERE_EXPAND_TIME ); pSmokeGrenadeUpdater->SetFloat( "cutoffFraction", 0.7f ); ToolFramework_PostToolMessage( HTOOLHANDLE_INVALID, msg ); msg->deleteThis(); } }
void SamplePlugin::Hook_ClientCommand(edict_t *pEntity) #endif { #if SOURCE_ENGINE <= SE_DARKMESSIAH CCommand args; #endif if (!pEntity || pEntity->IsFree()) { return; } const char *cmd = args.Arg(0); if (strcmp(cmd, "menu") == 0) { KeyValues *kv = new KeyValues("menu"); kv->SetString("title", "You've got options, hit ESC"); kv->SetInt("level", 1); kv->SetColor("color", Color(255, 0, 0, 255)); kv->SetInt("time", 20); kv->SetString("msg", "Pick an option\nOr don't."); for (int i = 1; i < 9; i++) { char num[10], msg[10], cmd[10]; MM_Format( num, sizeof(num), "%i", i ); MM_Format( msg, sizeof(msg), "Option %i", i ); MM_Format( cmd, sizeof(cmd), "option %i", i ); KeyValues *item1 = kv->FindKey(num, true); item1->SetString("msg", msg); item1->SetString("command", cmd); } helpers->CreateMessage(pEntity, DIALOG_MENU, kv, vsp_callbacks); kv->deleteThis(); RETURN_META(MRES_SUPERCEDE); } else if (strcmp(cmd, "rich") == 0) { KeyValues *kv = new KeyValues("menu"); kv->SetString("title", "A rich message"); kv->SetInt("level", 1); kv->SetInt("time", 20); kv->SetString("msg", "This is a long long long text string.\n\nIt also has line breaks."); helpers->CreateMessage(pEntity, DIALOG_TEXT, kv, vsp_callbacks); kv->deleteThis(); RETURN_META(MRES_SUPERCEDE); } else if (strcmp(cmd, "msg") == 0) { KeyValues *kv = new KeyValues("menu"); kv->SetString("title", "Just a simple hello"); kv->SetInt("level", 1); kv->SetInt("time", 20); helpers->CreateMessage(pEntity, DIALOG_MSG, kv, vsp_callbacks); kv->deleteThis(); RETURN_META(MRES_SUPERCEDE); } else if (strcmp(cmd, "entry") == 0) { KeyValues *kv = new KeyValues("entry"); kv->SetString("title", "Stuff"); kv->SetString("msg", "Enter something"); kv->SetString("command", "say"); // anything they enter into the dialog turns into a say command kv->SetInt("level", 1); kv->SetInt("time", 20); helpers->CreateMessage(pEntity, DIALOG_ENTRY, kv, vsp_callbacks); kv->deleteThis(); RETURN_META(MRES_SUPERCEDE); } }