namespace CAMMenu { final class BuyableItem { private string m_szDescription; private string m_szEntityName; private uint m_uiCost = 0; private bool m_bAllPlayers = true; string Description { get const { return m_szDescription; } set { m_szDescription = value; } } string EntityName { get const { return m_szEntityName; } set { m_szEntityName = value; } } uint Cost { get const { return m_uiCost; } set { m_uiCost = value; } } bool AllPlayers { get const { return m_bAllPlayers; } set { m_bAllPlayers = value; } } BuyableItem( const string& in szDescription, const string& in szEntityName, const uint uiCost, const bool bAllPlayers = true ) { m_szDescription = szDescription; m_szEntityName = szEntityName; m_uiCost = uiCost; m_bAllPlayers = bAllPlayers; } void Buy( CBasePlayer@ pPlayer = null ) { if( !m_bAllPlayers && pPlayer is null ) return; if( m_bAllPlayers ) { for( int iPlayer = 1; iPlayer <= g_Engine.maxClients; ++iPlayer ) { CBasePlayer@ pPl = g_PlayerFuncs.FindPlayerByIndex( iPlayer ); if( pPl !is null ) { GiveItem( pPl ); } } } else { GiveItem( pPlayer ); } } private void GiveItem( CBasePlayer@ pPlayer ) const { const uint uiMoney = uint( pPlayer.pev.frags ); g_Game.AlertMessage( at_console, "frags: %1, money: %2\n", pPlayer.pev.frags, uiMoney ); if( pPlayer.pev.frags <= -1 ) { g_PlayerFuncs.ClientPrint(pPlayer,HUD_PRINTTALK,"Not enough money(frags) - Cost: " + m_uiCost + "\n"); return; } if( uiMoney >= m_uiCost ) { const uint uiLeft = uiMoney - m_uiCost; pPlayer.pev.frags -= m_uiCost; pPlayer.GiveNamedItem( m_szEntityName ); } else { g_PlayerFuncs.ClientPrint(pPlayer,HUD_PRINTTALK,"Not enough money(frags) - Cost: " + m_uiCost + "\n"); return; } } } final class CAMMenu { array m_Items; private CTextMenu@ m_pCAMMenu = null; private CTextMenu@ m_pCAMReportMenu = null; private CTextMenu@ m_pCAMTacticalMenu = null; private CTextMenu@ m_pCAMSocialMenu = null; void RemoveItems() { if( m_Items !is null ) { m_Items.removeRange( 0, m_Items.length() ); } } void AddItem( BuyableItem@ pItem ) { if( pItem is null ) return; if( m_Items.findByRef( @pItem ) != -1 ) return; m_Items.insertLast( pItem ); if( m_pCAMMenu !is null ) @m_pCAMMenu = null; } void Show( CBasePlayer@ pPlayer = null ) { if( m_pCAMMenu is null ) CreateMenu(); if( pPlayer !is null ) m_pCAMMenu.Open( 0, 0, pPlayer ); else m_pCAMMenu.Open( 0, 0 ); } private void CreateMenu() { @m_pCAMMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAMCallback ) ); m_pCAMMenu.SetTitle( "CA Male Responses" ); m_pCAMMenu.AddItem( "Report", null ); m_pCAMMenu.AddItem( "Tactical", null ); m_pCAMMenu.AddItem( "Social", null ); m_pCAMMenu.Register(); @m_pCAMReportMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAMReportCallback ) ); m_pCAMReportMenu.SetTitle( "CA Male Report" ); m_pCAMReportMenu.AddItem( "Roger that", null ); m_pCAMReportMenu.AddItem( "Negative", null ); m_pCAMReportMenu.AddItem( "No way", null ); m_pCAMReportMenu.AddItem( "In position", null ); //m_pCAMReportMenu.AddItem( "A site", null ); //m_pCAMReportMenu.AddItem( "B site", null ); m_pCAMReportMenu.AddItem( "Covering fire", null ); m_pCAMReportMenu.AddItem( "Heading to your position", null ); m_pCAMReportMenu.AddItem( "Sector clear", null ); m_pCAMReportMenu.AddItem( "Enemy down", null ); m_pCAMReportMenu.Register(); @m_pCAMTacticalMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAMTacticalCallback ) ); m_pCAMTacticalMenu.SetTitle( "CA Male Tactical" ); m_pCAMTacticalMenu.AddItem( "Go, go, go", null ); m_pCAMTacticalMenu.AddItem( "Follow me", null ); m_pCAMTacticalMenu.AddItem( "Regroup", null ); m_pCAMTacticalMenu.AddItem( "Hold your positions", null ); m_pCAMTacticalMenu.AddItem( "Take cover", null ); m_pCAMTacticalMenu.AddItem( "Report in", null ); m_pCAMTacticalMenu.AddItem( "Open fire", null ); m_pCAMTacticalMenu.AddItem( "Cease fire", null ); m_pCAMTacticalMenu.AddItem( "Fall back", null ); m_pCAMTacticalMenu.AddItem( "Fire in the hole", null ); m_pCAMTacticalMenu.AddItem( "Planting mine", null ); m_pCAMTacticalMenu.AddItem( "No ammo", null ); m_pCAMTacticalMenu.AddItem( "I am hit", null ); m_pCAMTacticalMenu.Register(); @m_pCAMSocialMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAMSocialCallback ) ); m_pCAMSocialMenu.SetTitle( "CA Male Social" ); m_pCAMSocialMenu.AddItem( "I'm on it", null ); m_pCAMSocialMenu.AddItem( "Thank you", null ); m_pCAMSocialMenu.AddItem( "Sorry", null ); m_pCAMSocialMenu.AddItem( "Careful", null ); m_pCAMSocialMenu.AddItem( "Nice shot", null ); m_pCAMSocialMenu.AddItem( "Good job", null ); m_pCAMSocialMenu.AddItem( "Hoo-ah!", null ); m_pCAMSocialMenu.AddItem( "Coward!", null ); m_pCAMSocialMenu.AddItem( "I don't wanna die!", null ); m_pCAMSocialMenu.AddItem( "Don't shoot me", null ); m_pCAMSocialMenu.Register(); } private void CAMCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { if ( !pPlayer.IsAlive() ) { g_PlayerFuncs.SayText( pPlayer, "[CAM] You must be alive\n" ); return; } if ( (pPlayer.pev.effects & EF_NODRAW) == EF_NODRAW ) { g_PlayerFuncs.ClientPrint( pPlayer, HUD_PRINTTALK, "[CAM] You can't use the voice menu while controlling an NPC\n" ); return; } if( pItem !is null ) { string sChoice = pItem.m_szName; if( sChoice == "Report" ) m_pCAMReportMenu.Open( 0, 0, pPlayer ); if( sChoice == "Tactical" ) m_pCAMTacticalMenu.Open( 0, 0, pPlayer ); if( sChoice == "Social" ) m_pCAMSocialMenu.Open( 0, 0, pPlayer ); } } private void CAMReportCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { Vector vecOrigin = pPlayer.pev.origin; if( pItem !is null ) { string sChoice = pItem.m_szName; if( sChoice == "Roger that" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_ROGERTHAT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); //SND_SKIP_ORIGIN_USE_ENT, PITCH_NORM ); //g_SoundSystem.PlaySound( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_ROGERTHAT_MA.wav", 0.5, 0.0, 0, PITCH_NORM, true, g_vecZero ); //SND_SKIP_ORIGIN_USE_ENT, PITCH_NORM ); //g_SoundSystem.PlaySound( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_ROGERTHAT_MA.wav", 0.5, 0.0, 0, PITCH_NORM, 0, true, vecOrigin ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Roger that.\n"); } if( sChoice == "Negative" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_NEGATIVE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Negative.\n"); } if( sChoice == "No way" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_NOWAY_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": No way.\n"); } if( sChoice == "In position" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_INPOSITION_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": In position.\n"); } if( sChoice == "A site" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/vma_alphasite_ma.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Roger that\n"); } if( sChoice == "B site" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/vma_bravosite_ma.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Roger that.\n"); } if( sChoice == "Covering fire" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_COVERINGFIRE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Covering fire.\n"); GetSoundEntInstance().InsertSound ( bits_SOUND_COMBAT, pPlayer.pev.origin, NORMAL_GUN_VOLUME, 0.3, pPlayer ); } if( sChoice == "Heading to your position" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_HEADINGTOYOURPOSITION_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Heading to your position.\n"); } if( sChoice == "Sector clear" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_SECTORCLEAR_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Sector clear.\n"); } if( sChoice == "Enemy down" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_ENEMYDOWN_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Enemy down.\n"); } } } private void CAMTacticalCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { if( pItem !is null ) { string sChoice = pItem.m_szName; if( sChoice == "Go, go, go" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_GOGOGO_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Go! Go! Go!\n"); GetSoundEntInstance().InsertSound ( bits_SOUND_COMBAT, pPlayer.pev.origin, NORMAL_GUN_VOLUME, 0.3, pPlayer ); } if( sChoice == "Follow me" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_FOLLOWME_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Follow me.\n"); GetSoundEntInstance().InsertSound ( bits_SOUND_COMBAT, pPlayer.pev.origin, NORMAL_GUN_VOLUME, 0.3, pPlayer ); } if( sChoice == "Regroup" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_REGROUP_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Regroup.\n"); } if( sChoice == "Hold your positions" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_HOLDYOURPOSITIONS_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Hold your positions.\n"); } if( sChoice == "Take cover" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_TAKECOVER_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Take cover.\n"); } if( sChoice == "Report in" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_REPORTIN_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Report in.\n"); } if( sChoice == "Open fire" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_OPENFIRE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Open fire.\n"); GetSoundEntInstance().InsertSound ( bits_SOUND_COMBAT, pPlayer.pev.origin, NORMAL_GUN_VOLUME, 0.3, pPlayer ); } if( sChoice == "Cease fire" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_CEASEFIRE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Cease fire.\n"); } if( sChoice == "Fall back" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_FALLBACK_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Fall back.\n"); } if( sChoice == "Fire in the hole" ) { switch ( Math.RandomLong( 1, 3 ) ) { case 1: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_FIREINTHEHOLE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Fire in the hole.\n"); } break; case 2: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_FRAGOUT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Frag out.\n"); } break; case 3: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_GRENADE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Grenade.\n"); } break; } } if( sChoice == "Planting mine" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_PLANTINGAMINE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Planting a mine.\n"); } if( sChoice == "No ammo" ) { switch ( Math.RandomLong( 1, 2 ) ) { case 1: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_EMPTYAMMO_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": I'm empty.\n"); } break; case 2: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_OUTOFAMMO_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": Out of ammo.\n"); } break; } } if( sChoice == "I am hit" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_IMHIT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": I'm hit.\n"); } } } private void CAMSocialCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { if( pItem !is null ) { string sChoice = pItem.m_szName; if( sChoice == "I'm on it" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_IMONIT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": I'm on it.\n"); } if( sChoice == "Thank you" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_THANKYOU_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Thank you.\n"); } if( sChoice == "Sorry" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_SORRY_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Sorry.\n"); } if( sChoice == "Careful" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_CAREFUL_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Careful.\n"); } if( sChoice == "Nice shot" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_NICESHOT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Nice shot.\n"); } if( sChoice == "Good job" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_GOODJOB_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Good job.\n"); } if( sChoice == "Hoo-ah!" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_HOORAH_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Hoo-ah!\n"); } if( sChoice == "Coward!" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_COWARD_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Coward!\n"); } if( sChoice == "I don't wanna die!" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_IDONTWANNADIE_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": I don't want to die!\n"); } if( sChoice == "Don't shoot me" ) { switch ( Math.RandomLong( 1, 2 ) ) { case 1: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_WATCHURSHOT_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Watch your shot!\n"); } break; case 2: { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_HEYSAMETEAM_MA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Hey, same team!\n"); } break; } } } } } }