namespace CAFMenu { 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 CAFMenu { array m_Items; private CTextMenu@ m_pCAFMenu = null; private CTextMenu@ m_pCAFReportMenu = null; private CTextMenu@ m_pCAFTacticalMenu = null; private CTextMenu@ m_pCAFSocialMenu = 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_pCAFMenu !is null ) @m_pCAFMenu = null; } void Show( CBasePlayer@ pPlayer = null ) { if( m_pCAFMenu is null ) CreateMenu(); if( pPlayer !is null ) m_pCAFMenu.Open( 0, 0, pPlayer ); else m_pCAFMenu.Open( 0, 0 ); } private void CreateMenu() { @m_pCAFMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAFCallback ) ); m_pCAFMenu.SetTitle( "CA Female Responses" ); m_pCAFMenu.AddItem( "Report", null ); m_pCAFMenu.AddItem( "Tactical", null ); m_pCAFMenu.AddItem( "Social", null ); m_pCAFMenu.Register(); @m_pCAFReportMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAFReportCallback ) ); m_pCAFReportMenu.SetTitle( "CA Female Report" ); m_pCAFReportMenu.AddItem( "Roger that", null ); m_pCAFReportMenu.AddItem( "Negative", null ); m_pCAFReportMenu.AddItem( "No way", null ); m_pCAFReportMenu.AddItem( "In position", null ); //m_pCAFReportMenu.AddItem( "A site", null ); //m_pCAFReportMenu.AddItem( "B site", null ); m_pCAFReportMenu.AddItem( "Covering fire", null ); m_pCAFReportMenu.AddItem( "Heading to your position", null ); m_pCAFReportMenu.AddItem( "Sector clear", null ); m_pCAFReportMenu.AddItem( "Enemy down", null ); m_pCAFReportMenu.Register(); @m_pCAFTacticalMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAFTacticalCallback ) ); m_pCAFTacticalMenu.SetTitle( "CA Female Tactical" ); m_pCAFTacticalMenu.AddItem( "Go, go, go", null ); m_pCAFTacticalMenu.AddItem( "Follow me", null ); m_pCAFTacticalMenu.AddItem( "Regroup", null ); m_pCAFTacticalMenu.AddItem( "Hold your positions", null ); m_pCAFTacticalMenu.AddItem( "Take cover", null ); m_pCAFTacticalMenu.AddItem( "Report in", null ); m_pCAFTacticalMenu.AddItem( "Open fire", null ); m_pCAFTacticalMenu.AddItem( "Cease fire", null ); m_pCAFTacticalMenu.AddItem( "Fall back", null ); m_pCAFTacticalMenu.AddItem( "Fire in the hole", null ); m_pCAFTacticalMenu.AddItem( "Planting mine", null ); m_pCAFTacticalMenu.AddItem( "No ammo", null ); m_pCAFTacticalMenu.AddItem( "I am hit", null ); m_pCAFTacticalMenu.Register(); @m_pCAFSocialMenu = CTextMenu( TextMenuPlayerSlotCallback( this.CAFSocialCallback ) ); m_pCAFSocialMenu.SetTitle( "CA Female Social" ); m_pCAFSocialMenu.AddItem( "I'm on it", null ); m_pCAFSocialMenu.AddItem( "Thank you", null ); m_pCAFSocialMenu.AddItem( "Sorry", null ); m_pCAFSocialMenu.AddItem( "Careful", null ); m_pCAFSocialMenu.AddItem( "Nice shot", null ); m_pCAFSocialMenu.AddItem( "Good job", null ); m_pCAFSocialMenu.AddItem( "Hoo-ah!", null ); m_pCAFSocialMenu.AddItem( "Coward!", null ); m_pCAFSocialMenu.AddItem( "I don't wanna die!", null ); m_pCAFSocialMenu.AddItem( "Don't shoot me", null ); m_pCAFSocialMenu.Register(); } private void CAFCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { if ( !pPlayer.IsAlive() ) { g_PlayerFuncs.SayText( pPlayer, "[CAF] You must be alive\n" ); return; } if ( (pPlayer.pev.effects & EF_NODRAW) == EF_NODRAW ) { g_PlayerFuncs.ClientPrint( pPlayer, HUD_PRINTTALK, "[CAF] 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_pCAFReportMenu.Open( 0, 0, pPlayer ); if( sChoice == "Tactical" ) m_pCAFTacticalMenu.Open( 0, 0, pPlayer ); if( sChoice == "Social" ) m_pCAFSocialMenu.Open( 0, 0, pPlayer ); } } private void CAFReportCallback( CTextMenu@ menu, CBasePlayer@ pPlayer, int iSlot, const CTextMenuItem@ pItem ) { if( pItem !is null ) { string sChoice = pItem.m_szName; if( sChoice == "Roger that" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_ROGERTHAT_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); 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_FA.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_FA.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_FA.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_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); } if( sChoice == "B site" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_BRAVOSITE_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); } if( sChoice == "Covering fire" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_COVERINGFIRE_FA.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_FA.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_FA.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_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Report] " + pPlayer.pev.netname +": Enemy down.\n"); } } } private void CAFTacticalCallback( 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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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, LOUD_GUN_VOLUME, 0.3, pPlayer ); } if( sChoice == "Cease fire" ) { g_SoundSystem.EmitSoundDyn( pPlayer.edict(), CHAN_VOICE, "combatarms2/VMA_CEASEFIRE_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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, "combatarms/VMA_IMHIT_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Tactical] " + pPlayer.pev.netname +": I'm hit.\n"); } } } private void CAFSocialCallback( 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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.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_FA.wav", 0.5, 0.0, 0, PITCH_NORM ); g_PlayerFuncs.ClientPrintAll(HUD_PRINTTALK, "[Social] " + pPlayer.pev.netname +": Hey, same team!\n"); } break; } } } } } }