QQ登录

只需一步,快速开始

搜索

免费自助文章链接,禁止站外链接:一次最多7天

工具/补丁 Contagion传染病 管理员插件源码

官方源代码API:点击查看

源码框架:

adminmenu.as
  1. //------------------------------------------------------------------------------------------------------------------------//
  2. #include "admin/core.as"
  3. #include "admin/base.as"
  4. //------------------------------------------------------------------------------------------------------------------------//

  5. void OnPluginInit()
  6. {
  7.         PluginData::SetVersion( "1.1" );
  8.         PluginData::SetAuthor( "JonnyBoy0719" );
  9.         PluginData::SetName( "Admin Menu" );

  10.         ConCommand::Create( "as_admin", ShowAdminMenu, "Show the admin menu", LEVEL_MODERATOR );

  11.         Events::Player::PlayerSay.Hook( @OnPlayerSay );
  12.         Events::Player::OnMenuExecuted.Hook( @OnMenuExecuted );

  13.         // Register base commands
  14.         AdminMenu::RegisterBaseCommands();
  15. }

  16. //------------------------------------------------------------------------------------------------------------------------//

  17. void OnPluginUnload()
  18. {
  19.         ConCommand::Remove( "as_admin" );
  20. }

  21. //------------------------------------------------------------------------------------------------------------------------//

  22. void ShowAdminMenu( CTerrorPlayer@ pPlayer, CASCommand@ pArgs )
  23. {
  24.         GoBackToAdminBase( pPlayer );
  25. }

  26. //------------------------------------------------------------------------------------------------------------------------//

  27. HookReturnCode OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue )
  28. {
  29.         g_AdminMenu.OnMenuExecuted( pPlayer, szID, iValue );
  30.         return HOOK_HANDLED;
  31. }

  32. //------------------------------------------------------------------------------------------------------------------------//

  33. void AdminMenu_RegisterItem( IAdminMenuItemBase @module )
  34. {
  35.         if ( module is null ) return;
  36.         g_AdminMenu.RegisterItem( module );
  37. }

  38. void AdminMenu_RemoveItem( string module_id )
  39. {
  40.         g_AdminMenu.RemoveItem( module_id );
  41. }

  42. void AdminMenu_BackToGroup( CTerrorPlayer@ pPlayer, int group )
  43. {
  44.         g_AdminMenu.BackToGroup( pPlayer, group );
  45. }

  46. //------------------------------------------------------------------------------------------------------------------------//

  47. void GoBackToAdminBase( CTerrorPlayer@ pPlayer )
  48. {
  49.         g_AdminMenu.OpenMenu( pPlayer );
  50. }

  51. //------------------------------------------------------------------------------------------------------------------------//

  52. void ThePresident_OnMapStart()
  53. {
  54.         g_AdminMenu.OnMapStart();
  55. }

  56. //------------------------------------------------------------------------------------------------------------------------//

  57. HookReturnCode OnPlayerSay( CTerrorPlayer@ pPlayer, CASCommand@ pArgs )
  58. {
  59.         string arg1 = pArgs.Arg( 1 );
  60.         if ( Utils.StrEql( arg1, "!admin" ) )
  61.         {
  62.                 GoBackToAdminBase( pPlayer );
  63.                 return HOOK_HANDLED;
  64.         }
  65.         return HOOK_CONTINUE;
  66. }
复制代码




  • admin

core.as
  1. //------------------------------------------------------------------------------------------------------------------------//
  2. // Interface
  3. #include "shared/interface.as"

  4. //------------------------------------------------------------------------------------------------------------------------//
  5. // Core class

  6. class CAdminMenu
  7. {
  8.         //------------------------------------------------------------------------------------------------------------------------//

  9.         IAdminMenuItemBase @GetItemFromResult( CTerrorPlayer@ pPlayer, int groupid, uint result )
  10.         {
  11.                 uint li = 0;
  12.                 for ( uint i = 0; i < items.length(); i++ )
  13.                 {
  14.                         IAdminMenuItemBase @pItem = items[i];
  15.                         if ( pItem is null ) continue;
  16.                         if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue;                // Make sure we have the right access
  17.                         if ( pItem.GetGroupID() != groupid ) continue;
  18.                         if ( result == li ) return pItem;
  19.                         li++;
  20.                 }
  21.                 return null;
  22.         }

  23.         IAdminMenuItemBase @GetItemFromResult( CTerrorPlayer@ pPlayer, string ItemName )
  24.         {
  25.                 for ( uint i = 0; i < items.length(); i++ )
  26.                 {
  27.                         IAdminMenuItemBase @pItem = items[i];
  28.                         if ( pItem is null ) continue;
  29.                         if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue;                // Make sure we have the right access
  30.                         if ( Utils.StrEql( ItemName, pItem.GetID() ) ) return pItem;
  31.                 }
  32.                 return null;
  33.         }

  34.         string GetGroupName( int groupid )
  35.         {
  36.                 switch( groupid )
  37.                 {
  38.                         case GROUP_PLAYER_CMD: return "Player Commands:";
  39.                         case GROUP_SERVER_CMD: return "Server Commands:";
  40.                         case GROUP_VOTE_CMD: return "Vote Commands:";
  41.                 }
  42.                 return "Unknown Group";
  43.         }

  44.         void AdminGroupCommands( CTerrorPlayer@ pPlayer, int groupid, uint page )
  45.         {
  46.                 Menu pMenu;
  47.                 pMenu.SetID( "admenu_grp;" + page + ";" + groupid );
  48.                 pMenu.SetTitle( GetGroupName( groupid ) );
  49.                 int li = 0;
  50.                 for ( uint i = page; i < items.length(); i++ )
  51.                 {
  52.                         IAdminMenuItemBase @pItem = items[i];
  53.                         if ( pItem is null ) continue;
  54.                         if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue;                // Make sure we have the right access
  55.                         if ( pItem.GetGroupID() != groupid ) continue;
  56.                         if ( li <= 6 )
  57.                         {
  58.                                 string szName = pItem.GetName();
  59.                                 if ( !pMenu.AddItem( szName ) ) break;
  60.                         }
  61.                         li++;
  62.                 }
  63.                 // Index 8 is always "Back"
  64.                 // Index 9 is always "Next"
  65.                 pMenu.SetBack( true );
  66.                 if ( li > 7 )
  67.                         pMenu.SetNext( true );
  68.                 pMenu.Display( pPlayer, -1 );
  69.         }

  70.         void OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue )
  71.         {
  72.                 // Sounds
  73.                 switch( iValue )
  74.                 {
  75.                         case 8:
  76.                                 pPlayer.PlayWwiseSound( "GUI_WindowClose", "", -1 );
  77.                         break;
  78.                         default:
  79.                                 pPlayer.PlayWwiseSound( "GUI_MainMenuSelect", "", -1 );
  80.                         break;
  81.                 }

  82.                 CASCommand @pArgs = StringToArgSplit( szID, ";" );
  83.                 string arg0 = pArgs.Arg( 0 );        // MainID
  84.                 string arg1 = pArgs.Arg( 1 );        // Page
  85.                 string arg2 = pArgs.Arg( 2 );        // Value

  86.                 // Show the groups
  87.                 if ( Utils.StrEql( szID, "adminmenu_base" ) )
  88.                 {
  89.                         switch( iValue )
  90.                         {
  91.                                 // Player Commands
  92.                                 case 1: AdminGroupCommands( pPlayer, GROUP_PLAYER_CMD, 0 ); break;
  93.                                 // Server Commands
  94.                                 case 2: AdminGroupCommands( pPlayer, GROUP_SERVER_CMD, 0 ); break;
  95.                                 // Vote Commands
  96.                                 case 3: AdminGroupCommands( pPlayer, GROUP_VOTE_CMD, 0 ); break;
  97.                         }
  98.                 }
  99.                 // When using the groups
  100.                 else if ( Utils.StrEql( arg0, "admenu_grp" ) )
  101.                 {
  102.                         uint page = parseUInt( arg1 );
  103.                         uint groupid = parseUInt( arg2 );
  104.                         uint result = page + iValue - 1; // Reduce 1 for the result
  105.                         switch( iValue )
  106.                         {
  107.                                 case 1:
  108.                                 case 2:
  109.                                 case 3:
  110.                                 case 4:
  111.                                 case 5:
  112.                                 case 6:
  113.                                 case 7:
  114.                                 {
  115.                                         IAdminMenuItemBase @pItem = GetItemFromResult( pPlayer, groupid, result );
  116.                                         if ( pItem is null ) break;
  117.                                         pItem.OnItemOpen( pPlayer );
  118.                                 }
  119.                                 break;
  120.                                 case 8:
  121.                                 {
  122.                                         if ( page > 0 )
  123.                                                 AdminGroupCommands( pPlayer, groupid, page - 7 );
  124.                                         else
  125.                                                 OpenMenu( pPlayer );
  126.                                 }
  127.                                 break;
  128.                                 case 9:
  129.                                 {
  130.                                         AdminGroupCommands( pPlayer, groupid, page + 7 );
  131.                                 }
  132.                                 break;
  133.                         }
  134.                 }
  135.                 // We are now using the menu argument
  136.                 else
  137.                 {
  138.                         IAdminMenuItemBase @pItem = GetItemFromResult( pPlayer, arg0 );
  139.                         if ( pItem is null ) return;
  140.                         pItem.OnMenuExecuted( pPlayer, pArgs, iValue );
  141.                 }
  142.         }

  143.         void OpenMenu( CTerrorPlayer@ pPlayer )
  144.         {
  145.                 if ( pPlayer is null ) return;
  146.                 if ( !AdminSystem.AdminExist( pPlayer ) )
  147.                 {
  148.                         CBasePlayer@ pBasePlayer = pPlayer.opCast();
  149.                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white}: You need to be an admin to access this command." );
  150.                         return;
  151.                 }
  152.                 Menu pMenu;
  153.                 pMenu.SetID( "adminmenu_base" );
  154.                 pMenu.SetTitle( "Admin Menu:" );
  155.                 pMenu.AddItem( "Player Commands" );
  156.                 pMenu.AddItem( "Server Commands" );
  157.                 pMenu.AddItem( "Vote Commands" );
  158.                 pMenu.Display( pPlayer, -1 );
  159.         }

  160.         void BackToGroup( CTerrorPlayer@ pPlayer, int group )
  161.         {
  162.                 AdminGroupCommands( pPlayer, group, 0 );
  163.         }

  164.         void RegisterItem( IAdminMenuItemBase @module )
  165.         {
  166.                 items.insertLast( module );
  167.         }

  168.         void OnMapStart()
  169.         {
  170.                 for ( uint i = 0; i < items.length(); i++ )
  171.                 {
  172.                         IAdminMenuItemBase @pItem = items[i];
  173.                         if ( pItem is null ) continue;
  174.                         pItem.OnMapStart();
  175.                 }
  176.         }

  177.         void RemoveItem( string module_id )
  178.         {
  179.                 int index = -1;
  180.                 for ( uint i = 0; i < items.length(); i++ )
  181.                 {
  182.                         IAdminMenuItemBase @pItem = items[i];
  183.                         if ( pItem is null ) continue;
  184.                         if ( !Utils.StrEql( module_id, pItem.GetID() ) ) continue;
  185.                         index = i;
  186.                         break;
  187.                 }
  188.                 if ( index < 0 ) return;
  189.                 items.removeAt( index );
  190.                 Log.PrintToServerConsole( LOGTYPE_INFO, "Removed Module ID [{gold}" + module_id + "{default}]");
  191.         }

  192.         //------------------------------------------------------------------------------------------------------------------------//
  193.         // Private accessors
  194.         private array<IAdminMenuItemBase@> items;
  195. }
  196. CAdminMenu @g_AdminMenu = CAdminMenu();
复制代码



base.as
  1. //------------------------------------------------------------------------------------------------------------------------//
  2. // Player Commands
  3. #include "menu/slay.as"
  4. #include "menu/slap.as"
  5. #include "menu/kick.as"
  6. #include "menu/ban.as"
  7. #include "menu/burn.as"
  8. #include "menu/teleport.as"
  9. #include "menu/mute.as"
  10. #include "menu/gag.as"
  11. #include "menu/silence.as"
  12. // Server Commands
  13. #include "menu/map.as"
  14. #include "menu/reloadadmins.as"
  15. // Vote Commands
  16. #include "menu/vote_map.as"
  17. #include "menu/vote_difficulty.as"
  18. #include "menu/vote_restart.as"
  19. //------------------------------------------------------------------------------------------------------------------------//

  20. namespace AdminMenu
  21. {
  22.         void RegisterBaseCommands()
  23.         {
  24.                 // Player Commands
  25.                 Slay::Register();
  26.                 Slap::Register();
  27.                 Kick::Register();
  28.                 Ban::Register();
  29.                 Burn::Register();
  30.                 Teleport::Register();
  31.                 Mute::Register();
  32.                 Gag::Register();
  33.                 Silence::Register();
  34.                 // Server Commands
  35.                 Map::Register();
  36.                 ReloadAdmins::Register();
  37.                 // Vote Commands
  38.                 Vote::RegisterVoteMap();
  39.                 Vote::RegisterVoteDiff();
  40.                 Vote::RegisterVoteRestart();
  41.         }
  42. }
复制代码


  • shared
interface.as
  1. //------------------------------------------------------------------------------------------------------------------------//
  2. // Interface Class

  3. class IAdminMenu
  4. {
  5.         void OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue ) {}
  6.         void OpenMenu( CTerrorPlayer@ pPlayer ) {}
  7.         void OnMapStart() {}
  8.         void BackToGroup( CTerrorPlayer@ pPlayer, int group ) {}
  9.         void RegisterItem( CAdminMenuItemBase @module ) {}
  10.         void RemoveItem( string module_id ) {}
  11. }

  12. shared class IAdminMenuItemBase
  13. {
  14.         protected string m_ID;
  15.         protected string m_Name;
  16.         protected int m_Group;
  17.         protected AdminAccessLevel_t m_Level;

  18.         string GetID() { return m_ID; }
  19.         string GetName() { return m_Name; }
  20.         int GetGroupID() { return m_Group; }
  21.         AdminAccessLevel_t GetAccessLevel() { return m_Level; }

  22.         void OnItemOpen( CTerrorPlayer @pPlayer ) { }
  23.         void OnMapStart() { }
  24.         void GoBack( CTerrorPlayer @pPlayer ) { }
  25.         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) {}
  26. }

  27. //------------------------------------------------------------------------------------------------------------------------//
  28. // Base Class
  29. class CAdminMenuItemBase : IAdminMenuItemBase
  30. {
  31.         void GoBack( CTerrorPlayer @pPlayer ) { AdminMenu_BackToGroup( pPlayer, m_Group ); }
  32. }

  33. class CAdminMenuItemTargetBase : CAdminMenuItemBase
  34. {
  35.         bool FillPlayers( Menu &out pMenu, uint page )
  36.         {
  37.                 int li = 0;
  38.                 for ( uint i = page; i <= uint(Globals.GetMaxClients()); i++ )
  39.                 {
  40.                         CTerrorPlayer @pTerror = ToTerrorPlayer( i );
  41.                         if ( pTerror is null ) continue;
  42.                         CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  43.                         if ( !pTerrorBasePlayer.IsConnected() ) continue;        // Don't list those who haven't even connected yet
  44.                         if ( pTerror.IsMarkedForKick() ) continue;                        // Don't list those who has been marked for being kicked, used by the built in "kick" and "ban".
  45.                         if ( li <= 6 )
  46.                         {
  47.                                 string szName = pTerror.GetPlayerName();
  48.                                 if ( !pMenu.AddItem( szName ) ) break;
  49.                         }
  50.                         li++;
  51.                 }
  52.                 if ( li == 0 ) return false;

  53.                 // Index 8 is always "Back"
  54.                 // Index 9 is always "Next"
  55.                 pMenu.SetBack( true );
  56.                 if ( li > 7 )
  57.                         pMenu.SetNext( true );
  58.                 return true;
  59.         }

  60.         CTerrorPlayer @GetPlayerFromResult( uint result )
  61.         {
  62.                 uint li = 1;
  63.                 for ( uint i = 1; i <= uint(Globals.GetMaxClients()); i++ )
  64.                 {
  65.                         CTerrorPlayer @pTerror = ToTerrorPlayer( i );
  66.                         if ( pTerror is null ) continue;
  67.                         CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  68.                         if ( !pTerrorBasePlayer.IsConnected() ) continue;        // Don't list those who haven't even connected yet
  69.                         if ( pTerror.IsMarkedForKick() ) continue;                        // Don't list those who has been marked for being kicked, used by the built in "kick" and "ban".
  70.                         if ( result == li ) return pTerror;
  71.                         li++;
  72.                 }
  73.                 return null;
  74.         }
  75. }

  76. //------------------------------------------------------------------------------------------------------------------------//
  77. // Static values

  78. const int GROUP_PLAYER_CMD = 0;
  79. const int GROUP_SERVER_CMD = 1;
  80. const int GROUP_VOTE_CMD = 2;
复制代码


  • menu

ban.as
  1. namespace AdminMenu
  2. {
  3.         namespace Ban
  4.         {
  5.                 class CMenuItem_Ban : CAdminMenuItemTargetBase
  6.                 {
  7.                         private array<string> s_banreasons;

  8.                         CMenuItem_Ban()
  9.                         {
  10.                                 m_ID = "as_ban";
  11.                                 m_Name = "Ban player";
  12.                                 m_Group = GROUP_PLAYER_CMD;
  13.                                 m_Level = LEVEL_MODERATOR;
  14.                                 PopulateBanReasons();
  15.                         }

  16.                         void PopulateBanReasons()
  17.                         {
  18.                                 FileSystem::CreateFolder( "adminbase" );
  19.                                 JsonValues@ temp = FileSystem::ReadFile( "adminbase/banreasons" );
  20.                                 if ( temp is null )
  21.                                 {
  22.                                         s_banreasons.insertLast( "No Reason" );
  23.                                         return;
  24.                                 }
  25.                                 int y = 0;
  26.                                 while( true )
  27.                                 {
  28.                                         string find = "reason" + y;
  29.                                         if ( FileSystem::Exists( temp, find        ) != 0 ) break;
  30.                                         y++;
  31.                                         s_banreasons.insertLast( FileSystem::GrabString( temp, find ) );
  32.                                 }
  33.                         }

  34.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  35.                         {
  36.                                 OnPageChanged( pPlayer, 1 );
  37.                         }

  38.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  39.                         {
  40.                                 Menu pMenu;
  41.                                 FillPlayers( pMenu, page );
  42.                                 pMenu.SetID( m_ID + ";" + page );
  43.                                 pMenu.SetTitle( m_Name );
  44.                                 pMenu.SetBack( true );
  45.                                 pMenu.Display( pPlayer, -1 );
  46.                         }

  47.                         bool FillReasons( Menu &out pMenu, uint page )
  48.                         {
  49.                                 int li = 0;
  50.                                 for ( uint i = page; i < s_banreasons.length(); i++ )
  51.                                 {
  52.                                         string reason = s_banreasons[i];
  53.                                         if ( li > 6 ) break;
  54.                                         if ( li == 5 ) reason = reason + "\n";
  55.                                         if ( !pMenu.AddItem( reason ) ) break;
  56.                                         li++;
  57.                                 }
  58.                                 if ( li == 0 ) return false;
  59.                                 // Index 8 is always "Back"
  60.                                 // Index 9 is always "Next"
  61.                                 pMenu.SetBack( true );
  62.                                 if ( li > 6 )
  63.                                         pMenu.SetNext( true );
  64.                                 return true;
  65.                         }

  66.                         void ShowBanTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
  67.                         {
  68.                                 Menu pMenu;
  69.                                 pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
  70.                                 pMenu.SetTitle( "Ban time:" );
  71.                                 pMenu.AddItem( "Permanent" );
  72.                                 pMenu.AddItem( "10 Minutes" );
  73.                                 pMenu.AddItem( "30 Minutes" );
  74.                                 pMenu.AddItem( "1 Hour" );
  75.                                 pMenu.AddItem( "4 Hours" );
  76.                                 pMenu.AddItem( "1 Day" );
  77.                                 pMenu.AddItem( "1 Week" );
  78.                                 pMenu.SetBack( true );
  79.                                 pMenu.Display( pPlayer, -1 );
  80.                         }

  81.                         string GetBanReasonFromResult( uint result )
  82.                         {
  83.                                 uint li = 0;
  84.                                 for ( uint i = 0; i < s_banreasons.length(); i++ )
  85.                                 {
  86.                                         string reason = s_banreasons[i];
  87.                                         if ( result == li ) return reason;
  88.                                         li++;
  89.                                 }
  90.                                 return "";
  91.                         }

  92.                         string BanTime( int iLength )
  93.                         {
  94.                                 string ret( "for {gold}" );
  95.                                 switch( iLength )
  96.                                 {
  97.                                         case 0: ret = "Permanently"; break;
  98.                                         case 10: ret += "10 Minutes"; break;
  99.                                         case 30: ret += "30 Minutes"; break;
  100.                                         case 60: ret += "1 Hour"; break;
  101.                                         case 240: ret += "4 Hours"; break;
  102.                                         case 1440: ret += "1 Day"; break;
  103.                                         case 10080: ret += "1 Week"; break;
  104.                                 }
  105.                                 return ret;
  106.                         }

  107.                         void DoBan( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
  108.                         {
  109.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  110.                                 if ( pTerror is null ) return;
  111.                                 string reason = GetBanReasonFromResult( result_reason );
  112.                                 if ( Utils.StrEql( reason, "" ) ) return;

  113.                                 string szName = pTerror.GetPlayerName();

  114.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  115.                                 if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
  116.                                 {
  117.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently ban {limegreen}" + szName );
  118.                                         OnPageChanged( pPlayer, 1 );
  119.                                         return;
  120.                                 }

  121.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Banned {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );

  122.                                 AdminSystem.Ban( pTerror, iLength, reason );
  123.                                 OnPageChanged( pPlayer, 1 );
  124.                         }

  125.                         void ShowBanReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
  126.                         {
  127.                                 Menu pMenu;
  128.                                 if ( !FillReasons( pMenu, page ) )
  129.                                 {
  130.                                         OnPageChanged( pPlayer, 1 );
  131.                                         return;
  132.                                 }
  133.                                 pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
  134.                                 pMenu.SetTitle( "Ban reason:" );
  135.                                 pMenu.SetBack( true );
  136.                                 pMenu.Display( pPlayer, -1 );
  137.                         }

  138.                         bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  139.                         {
  140.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  141.                                 if ( pTerror is null ) return false;
  142.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  143.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  144.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  145.                                 CBaseEntity@ pSelf = pBasePlayer.opCast();
  146.                                 if ( pSelf.entindex() == pBaseEntity.entindex() )
  147.                                 {
  148.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot ban yourself!" );
  149.                                         return false;
  150.                                 }
  151.                                 ShowBanReasonsMenu( pPlayer, result, 0 );
  152.                                 return true;
  153.                         }

  154.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  155.                         {
  156.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  157.                                 string arg1 = pArgs.Arg( 1 );        // Page
  158.                                 string arg2 = pArgs.Arg( 2 );        // Value
  159.                                 string arg3 = pArgs.Arg( 3 );        // Target
  160.                                 string arg4 = pArgs.Arg( 4 );        // Reason
  161.                                 uint page = parseUInt( arg1 );
  162.                                 uint target = parseUInt( arg3 );
  163.                                 uint result_reason = parseUInt( arg4 );
  164.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  165.                                 if ( Utils.StrEql( arg2, "time" ) )
  166.                                 {
  167.                                         switch( iValue )
  168.                                         {
  169.                                                 case 1:
  170.                                                 {
  171.                                                         DoBan( pPlayer, target, 0, result_reason );
  172.                                                 }
  173.                                                 break;
  174.                                                 case 2:
  175.                                                 {
  176.                                                         DoBan( pPlayer, target, 10, result_reason );
  177.                                                 }
  178.                                                 break;
  179.                                                 case 3:
  180.                                                 {
  181.                                                         DoBan( pPlayer, target, 30, result_reason );
  182.                                                 }
  183.                                                 break;
  184.                                                 case 4:
  185.                                                 {
  186.                                                         DoBan( pPlayer, target, 60, result_reason );
  187.                                                 }
  188.                                                 break;
  189.                                                 case 5:
  190.                                                 {
  191.                                                         DoBan( pPlayer, target, 240, result_reason );
  192.                                                 }
  193.                                                 break;
  194.                                                 case 6:
  195.                                                 {
  196.                                                         DoBan( pPlayer, target, 1440, result_reason );
  197.                                                 }
  198.                                                 break;
  199.                                                 case 7:
  200.                                                 {
  201.                                                         DoBan( pPlayer, target, 10080, result_reason );
  202.                                                 }
  203.                                                 break;
  204.                                                 case 8:
  205.                                                         ShowBanReasonsMenu( pPlayer, target, 0 );
  206.                                                 break;
  207.                                         }
  208.                                         return;
  209.                                 }
  210.                                 else if ( Utils.StrEql( arg2, "reason" ) )
  211.                                 {
  212.                                         switch( iValue )
  213.                                         {
  214.                                                 case 1:
  215.                                                 case 2:
  216.                                                 case 3:
  217.                                                 case 4:
  218.                                                 case 5:
  219.                                                 case 6:
  220.                                                 case 7:
  221.                                                 {
  222.                                                         ShowBanTimeMenu( pPlayer, target, result );
  223.                                                 }
  224.                                                 break;
  225.                                                 case 8:
  226.                                                 {
  227.                                                         if ( page > 0 )
  228.                                                                 ShowBanReasonsMenu( pPlayer, target, page - 7 );
  229.                                                         else
  230.                                                                 OnPageChanged( pPlayer, 1 );
  231.                                                 }
  232.                                                 break;
  233.                                                 case 9:
  234.                                                 {
  235.                                                         ShowBanReasonsMenu( pPlayer, target, page + 7 );
  236.                                                 }
  237.                                                 break;
  238.                                         }
  239.                                         return;
  240.                                 }
  241.                                 switch( iValue )
  242.                                 {
  243.                                         case 1:
  244.                                         case 2:
  245.                                         case 3:
  246.                                         case 4:
  247.                                         case 5:
  248.                                         case 6:
  249.                                         case 7:
  250.                                         {
  251.                                                 if ( !ExecuteArgument( pPlayer, result ) )
  252.                                                         OnPageChanged( pPlayer, page );
  253.                                         }
  254.                                         break;
  255.                                         case 8:
  256.                                         {
  257.                                                 if ( page > 1 )
  258.                                                         OnPageChanged( pPlayer, page - 7 );
  259.                                                 else
  260.                                                         GoBack( pPlayer );
  261.                                         }
  262.                                         break;
  263.                                         case 9:
  264.                                         {
  265.                                                 OnPageChanged( pPlayer, page + 7 );
  266.                                         }
  267.                                         break;
  268.                                 }
  269.                         }
  270.                 }

  271.                 void Register()
  272.                 {
  273.                         AdminMenu_RegisterItem( CMenuItem_Ban() );
  274.                 }
  275.         }
  276. }
复制代码

burn.as
  1. namespace AdminMenu
  2. {
  3.         namespace Burn
  4.         {
  5.                 class CMenuItem_Burn : CAdminMenuItemTargetBase
  6.                 {
  7.                         CMenuItem_Burn()
  8.                         {
  9.                                 m_ID = "as_burn";
  10.                                 m_Name = "Burn player";
  11.                                 m_Group = GROUP_PLAYER_CMD;
  12.                                 m_Level = LEVEL_MODERATOR;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 OnPageChanged( pPlayer, 1 );
  17.                         }

  18.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  19.                         {
  20.                                 Menu pMenu;
  21.                                 FillPlayers( pMenu, page );
  22.                                 pMenu.SetID( m_ID + ";" + page );
  23.                                 pMenu.SetTitle( m_Name );
  24.                                 pMenu.SetBack( true );
  25.                                 pMenu.Display( pPlayer, -1 );
  26.                         }

  27.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  28.                         {
  29.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  30.                                 if ( pTerror is null ) return;
  31.                                 string szName = pTerror.GetPlayerName();

  32.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  33.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  34.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();

  35.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} " + szName + " has been set on fire" );
  36.                                 // Take damage
  37.                                 CTakeDamageInfo info = CTakeDamageInfo( pBaseEntity, pBaseEntity, 8, DMG_BURN );
  38.                                 pBaseEntity.TakeDamage( info );
  39.                                 pBaseEntity.Ignite( 3.5f );
  40.                         }

  41.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  42.                         {
  43.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  44.                                 string arg1 = pArgs.Arg( 1 );        // Page
  45.                                 uint page = parseUInt( arg1 );
  46.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  47.                                 switch( iValue )
  48.                                 {
  49.                                         case 1:
  50.                                         case 2:
  51.                                         case 3:
  52.                                         case 4:
  53.                                         case 5:
  54.                                         case 6:
  55.                                         case 7:
  56.                                         {
  57.                                                 ExecuteArgument( pPlayer, result );
  58.                                                 OnPageChanged( pPlayer, page );
  59.                                         }
  60.                                         break;
  61.                                         case 8:
  62.                                         {
  63.                                                 if ( page > 1 )
  64.                                                         OnPageChanged( pPlayer, page - 7 );
  65.                                                 else
  66.                                                         GoBack( pPlayer );
  67.                                         }
  68.                                         break;
  69.                                         case 9:
  70.                                         {
  71.                                                 OnPageChanged( pPlayer, page + 7 );
  72.                                         }
  73.                                         break;
  74.                                 }
  75.                         }
  76.                 }

  77.                 void Register()
  78.                 {
  79.                         AdminMenu_RegisterItem( CMenuItem_Burn() );
  80.                 }
  81.         }
  82. }
复制代码


kick.as
  1. namespace AdminMenu
  2. {
  3.         namespace Kick
  4.         {
  5.                 class CMenuItem_Kick : CAdminMenuItemTargetBase
  6.                 {
  7.                         CMenuItem_Kick()
  8.                         {
  9.                                 m_ID = "as_kick";
  10.                                 m_Name = "Kick player";
  11.                                 m_Group = GROUP_PLAYER_CMD;
  12.                                 m_Level = LEVEL_MODERATOR;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 OnPageChanged( pPlayer, 1 );
  17.                         }

  18.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  19.                         {
  20.                                 Menu pMenu;
  21.                                 FillPlayers( pMenu, page );
  22.                                 pMenu.SetID( m_ID + ";" + page );
  23.                                 pMenu.SetTitle( m_Name );
  24.                                 pMenu.SetBack( true );
  25.                                 pMenu.Display( pPlayer, -1 );
  26.                         }

  27.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  28.                         {
  29.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  30.                                 if ( pTerror is null ) return;
  31.                                 string szName = pTerror.GetPlayerName();

  32.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  33.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  34.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  35.                                 CBaseEntity@ pSelf = pBasePlayer.opCast();

  36.                                 if ( pSelf.entindex() == pBaseEntity.entindex() )
  37.                                 {
  38.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot kick yourself!" );
  39.                                         return;
  40.                                 }
  41.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Kicked " + szName );
  42.                                 AdminSystem.Kick( pTerror, "Kicked by server admin" );
  43.                         }

  44.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  45.                         {
  46.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  47.                                 string arg1 = pArgs.Arg( 1 );        // Page
  48.                                 uint page = parseUInt( arg1 );
  49.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  50.                                 switch( iValue )
  51.                                 {
  52.                                         case 1:
  53.                                         case 2:
  54.                                         case 3:
  55.                                         case 4:
  56.                                         case 5:
  57.                                         case 6:
  58.                                         case 7:
  59.                                         {
  60.                                                 ExecuteArgument( pPlayer, result );
  61.                                                 OnPageChanged( pPlayer, page );
  62.                                         }
  63.                                         break;
  64.                                         case 8:
  65.                                         {
  66.                                                 if ( page > 1 )
  67.                                                         OnPageChanged( pPlayer, page - 7 );
  68.                                                 else
  69.                                                         GoBack( pPlayer );
  70.                                         }
  71.                                         break;
  72.                                         case 9:
  73.                                         {
  74.                                                 OnPageChanged( pPlayer, page + 7 );
  75.                                         }
  76.                                         break;
  77.                                 }
  78.                         }
  79.                 }

  80.                 void Register()
  81.                 {
  82.                         AdminMenu_RegisterItem( CMenuItem_Kick() );
  83.                 }
  84.         }
  85. }
复制代码


map.as
  1. namespace AdminMenu
  2. {
  3.         namespace Map
  4.         {
  5.                 // This choose map structure was inspired by the SourceMod one
  6.                 class CMenuItem : CAdminMenuItemBase
  7.                 {
  8.                         private array<string> s_maplist;
  9.                         private string s_map;
  10.                         string GetMapOfChoice() { return s_map; }

  11.                         CMenuItem()
  12.                         {
  13.                                 m_ID = "as_map";
  14.                                 m_Name = "Choose Map";
  15.                                 m_Group = GROUP_SERVER_CMD;
  16.                                 m_Level = LEVEL_ADMIN;
  17.                                 PopulateMapList();
  18.                         }

  19.                         void PopulateMapList()
  20.                         {
  21.                                 // Will grab all available maps from the server maps folder.
  22.                                 // This includes addons (custom content) as well.
  23.                                 Globals.GetMaps( s_maplist );
  24.                                 s_map = "";
  25.                         }

  26.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  27.                         {
  28.                                 OnPageChanged( pPlayer, 0 );
  29.                         }

  30.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  31.                         {
  32.                                 Menu pMenu;
  33.                                 FillMaps( pMenu, page );
  34.                                 pMenu.SetID( m_ID + ";" + page );
  35.                                 pMenu.SetTitle( "Please select a map" );
  36.                                 pMenu.Display( pPlayer, -1 );
  37.                         }

  38.                         void FillMaps( Menu &out pMenu, uint page )
  39.                         {
  40.                                 PopulateMapList();
  41.                                 int li = 0;
  42.                                 for ( uint i = page; i < s_maplist.length(); i++ )
  43.                                 {
  44.                                         if ( page >= s_maplist.length() ) break;
  45.                                         string map = s_maplist[i];
  46.                                         if ( li > 6 ) break;
  47.                                         if ( li == 5 ) map = map + "\n";
  48.                                         if ( !pMenu.AddItem( map ) ) break;
  49.                                         li++;
  50.                                 }
  51.                                 // Index 8 is always "Back"
  52.                                 // Index 9 is always "Next"
  53.                                 pMenu.SetBack( true );
  54.                                 if ( li > 6 )
  55.                                         pMenu.SetNext( true );
  56.                         }

  57.                         string GetMapFromResult( uint result )
  58.                         {
  59.                                 for ( uint i = 0; i < s_maplist.length(); i++ )
  60.                                 {
  61.                                         string map = s_maplist[i];
  62.                                         if ( result == i ) return map;
  63.                                 }
  64.                                 return "";
  65.                         }

  66.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  67.                         {
  68.                                 string map = GetMapFromResult( result );
  69.                                 if ( Utils.StrEql( map, "" ) ) return;
  70.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  71.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Changing map to {green}" + map + "{white}..." );
  72.                                 s_map = map;
  73.                                 Schedule::Task( 3.0, AdminMenuItemMap_ChangeLevel );
  74.                         }

  75.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  76.                         {
  77.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  78.                                 string arg1 = pArgs.Arg( 1 );        // Page
  79.                                 uint page = parseUInt( arg1 );
  80.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  81.                                 switch( iValue )
  82.                                 {
  83.                                         case 1:
  84.                                         case 2:
  85.                                         case 3:
  86.                                         case 4:
  87.                                         case 5:
  88.                                         case 6:
  89.                                         case 7:
  90.                                         {
  91.                                                 ExecuteArgument( pPlayer, result );
  92.                                         }
  93.                                         break;
  94.                                         case 8:
  95.                                         {
  96.                                                 if ( page > 0 )
  97.                                                         OnPageChanged( pPlayer, page - 7 );
  98.                                                 else
  99.                                                         GoBack( pPlayer );
  100.                                         }
  101.                                         break;
  102.                                         case 9:
  103.                                         {
  104.                                                 OnPageChanged( pPlayer, page + 7 );
  105.                                         }
  106.                                         break;
  107.                                 }
  108.                         }
  109.                 }
  110.                 CMenuItem @pMapItem = CMenuItem();

  111.                 void Register()
  112.                 {
  113.                         AdminMenu_RegisterItem( pMapItem );
  114.                 }

  115.                 void AdminMenuItemMap_ChangeLevel()
  116.                 {
  117.                         Engine.RunConsoleCommand( "admin map "" + pMapItem.GetMapOfChoice() + """ );
  118.                 }
  119.         }
  120. }
复制代码


mute.as
  1. namespace AdminMenu
  2. {
  3.         namespace Mute
  4.         {
  5.                 class CMenuItem : CAdminMenuItemTargetBase
  6.                 {
  7.                         private array<string> s_reasons;

  8.                         CMenuItem()
  9.                         {
  10.                                 m_ID = "as_mute";
  11.                                 m_Name = "Mute player";
  12.                                 m_Group = GROUP_PLAYER_CMD;
  13.                                 m_Level = LEVEL_MODERATOR;
  14.                                 PopulateBanReasons();
  15.                         }

  16.                         void PopulateBanReasons()
  17.                         {
  18.                                 FileSystem::CreateFolder( "adminbase" );
  19.                                 JsonValues@ temp = FileSystem::ReadFile( "adminbase/commreasons" );
  20.                                 if ( temp is null )
  21.                                 {
  22.                                         s_reasons.insertLast( "No Reason" );
  23.                                         return;
  24.                                 }
  25.                                 int y = 0;
  26.                                 while( true )
  27.                                 {
  28.                                         string find = "reason" + y;
  29.                                         if ( FileSystem::Exists( temp, find        ) != 0 ) break;
  30.                                         y++;
  31.                                         s_reasons.insertLast( FileSystem::GrabString( temp, find ) );
  32.                                 }
  33.                         }

  34.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  35.                         {
  36.                                 OnPageChanged( pPlayer, 1 );
  37.                         }

  38.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  39.                         {
  40.                                 Menu pMenu;
  41.                                 FillPlayers( pMenu, page );
  42.                                 pMenu.SetID( m_ID + ";" + page );
  43.                                 pMenu.SetTitle( m_Name );
  44.                                 pMenu.SetBack( true );
  45.                                 pMenu.Display( pPlayer, -1 );
  46.                         }

  47.                         bool FillReasons( Menu &out pMenu, uint page )
  48.                         {
  49.                                 int li = 0;
  50.                                 for ( uint i = page; i < s_reasons.length(); i++ )
  51.                                 {
  52.                                         string reason = s_reasons[i];
  53.                                         if ( li > 6 ) break;
  54.                                         if ( li == 5 ) reason = reason + "\n";
  55.                                         if ( !pMenu.AddItem( reason ) ) break;
  56.                                         li++;
  57.                                 }
  58.                                 if ( li == 0 ) return false;
  59.                                 // Index 8 is always "Back"
  60.                                 // Index 9 is always "Next"
  61.                                 pMenu.SetBack( true );
  62.                                 if ( li > 6 )
  63.                                         pMenu.SetNext( true );
  64.                                 return true;
  65.                         }

  66.                         void ShowTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
  67.                         {
  68.                                 Menu pMenu;
  69.                                 pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
  70.                                 pMenu.SetTitle( "Mute time:" );
  71.                                 pMenu.AddItem( "Permanent" );
  72.                                 pMenu.AddItem( "10 Minutes" );
  73.                                 pMenu.AddItem( "30 Minutes" );
  74.                                 pMenu.AddItem( "1 Hour" );
  75.                                 pMenu.AddItem( "4 Hours" );
  76.                                 pMenu.AddItem( "1 Day" );
  77.                                 pMenu.AddItem( "1 Week" );
  78.                                 pMenu.SetBack( true );
  79.                                 pMenu.Display( pPlayer, -1 );
  80.                         }

  81.                         string GetBanReasonFromResult( uint result )
  82.                         {
  83.                                 uint li = 0;
  84.                                 for ( uint i = 0; i < s_reasons.length(); i++ )
  85.                                 {
  86.                                         string reason = s_reasons[i];
  87.                                         if ( result == li ) return reason;
  88.                                         li++;
  89.                                 }
  90.                                 return "";
  91.                         }

  92.                         string BanTime( int iLength )
  93.                         {
  94.                                 string ret( "for {gold}" );
  95.                                 switch( iLength )
  96.                                 {
  97.                                         case 0: ret = "Permanently"; break;
  98.                                         case 10: ret += "10 Minutes"; break;
  99.                                         case 30: ret += "30 Minutes"; break;
  100.                                         case 60: ret += "1 Hour"; break;
  101.                                         case 240: ret += "4 Hours"; break;
  102.                                         case 1440: ret += "1 Day"; break;
  103.                                         case 10080: ret += "1 Week"; break;
  104.                                 }
  105.                                 return ret;
  106.                         }

  107.                         void DoModuleExec( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
  108.                         {
  109.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  110.                                 if ( pTerror is null ) return;
  111.                                 string reason = GetBanReasonFromResult( result_reason );
  112.                                 if ( Utils.StrEql( reason, "" ) ) return;

  113.                                 string szName = pTerror.GetPlayerName();

  114.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  115.                                 if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
  116.                                 {
  117.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently mute {limegreen}" + szName );
  118.                                         OnPageChanged( pPlayer, 1 );
  119.                                         return;
  120.                                 }

  121.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Muted {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );

  122.                                 AdminSystem.Mute( pTerror, iLength, true, reason );
  123.                                 OnPageChanged( pPlayer, 1 );
  124.                         }

  125.                         void ShowReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
  126.                         {
  127.                                 Menu pMenu;
  128.                                 if ( !FillReasons( pMenu, page ) )
  129.                                 {
  130.                                         OnPageChanged( pPlayer, 1 );
  131.                                         return;
  132.                                 }
  133.                                 pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
  134.                                 pMenu.SetTitle( "Mute reason:" );
  135.                                 pMenu.SetBack( true );
  136.                                 pMenu.Display( pPlayer, -1 );
  137.                         }

  138.                         bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  139.                         {
  140.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  141.                                 if ( pTerror is null ) return false;
  142.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  143.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  144.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  145.                                 CBaseEntity@ pSelf = pBasePlayer.opCast();
  146.                                 if ( pSelf.entindex() == pBaseEntity.entindex() )
  147.                                 {
  148.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot mute yourself!" );
  149.                                         return false;
  150.                                 }
  151.                                 ShowReasonsMenu( pPlayer, result, 0 );
  152.                                 return true;
  153.                         }

  154.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  155.                         {
  156.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  157.                                 string arg1 = pArgs.Arg( 1 );        // Page
  158.                                 string arg2 = pArgs.Arg( 2 );        // Value
  159.                                 string arg3 = pArgs.Arg( 3 );        // Target
  160.                                 string arg4 = pArgs.Arg( 4 );        // Reason
  161.                                 uint page = parseUInt( arg1 );
  162.                                 uint target = parseUInt( arg3 );
  163.                                 uint result_reason = parseUInt( arg4 );
  164.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  165.                                 if ( Utils.StrEql( arg2, "time" ) )
  166.                                 {
  167.                                         switch( iValue )
  168.                                         {
  169.                                                 case 1:
  170.                                                 {
  171.                                                         DoModuleExec( pPlayer, target, 0, result_reason );
  172.                                                 }
  173.                                                 break;
  174.                                                 case 2:
  175.                                                 {
  176.                                                         DoModuleExec( pPlayer, target, 10, result_reason );
  177.                                                 }
  178.                                                 break;
  179.                                                 case 3:
  180.                                                 {
  181.                                                         DoModuleExec( pPlayer, target, 30, result_reason );
  182.                                                 }
  183.                                                 break;
  184.                                                 case 4:
  185.                                                 {
  186.                                                         DoModuleExec( pPlayer, target, 60, result_reason );
  187.                                                 }
  188.                                                 break;
  189.                                                 case 5:
  190.                                                 {
  191.                                                         DoModuleExec( pPlayer, target, 240, result_reason );
  192.                                                 }
  193.                                                 break;
  194.                                                 case 6:
  195.                                                 {
  196.                                                         DoModuleExec( pPlayer, target, 1440, result_reason );
  197.                                                 }
  198.                                                 break;
  199.                                                 case 7:
  200.                                                 {
  201.                                                         DoModuleExec( pPlayer, target, 10080, result_reason );
  202.                                                 }
  203.                                                 break;
  204.                                                 case 8:
  205.                                                         ShowReasonsMenu( pPlayer, target, 0 );
  206.                                                 break;
  207.                                         }
  208.                                         return;
  209.                                 }
  210.                                 else if ( Utils.StrEql( arg2, "reason" ) )
  211.                                 {
  212.                                         switch( iValue )
  213.                                         {
  214.                                                 case 1:
  215.                                                 case 2:
  216.                                                 case 3:
  217.                                                 case 4:
  218.                                                 case 5:
  219.                                                 case 6:
  220.                                                 case 7:
  221.                                                 {
  222.                                                         ShowTimeMenu( pPlayer, target, result );
  223.                                                 }
  224.                                                 break;
  225.                                                 case 8:
  226.                                                 {
  227.                                                         if ( page > 0 )
  228.                                                                 ShowReasonsMenu( pPlayer, target, page - 7 );
  229.                                                         else
  230.                                                                 OnPageChanged( pPlayer, 1 );
  231.                                                 }
  232.                                                 break;
  233.                                                 case 9:
  234.                                                 {
  235.                                                         ShowReasonsMenu( pPlayer, target, page + 7 );
  236.                                                 }
  237.                                                 break;
  238.                                         }
  239.                                         return;
  240.                                 }
  241.                                 switch( iValue )
  242.                                 {
  243.                                         case 1:
  244.                                         case 2:
  245.                                         case 3:
  246.                                         case 4:
  247.                                         case 5:
  248.                                         case 6:
  249.                                         case 7:
  250.                                         {
  251.                                                 if ( !ExecuteArgument( pPlayer, result ) )
  252.                                                         OnPageChanged( pPlayer, page );
  253.                                         }
  254.                                         break;
  255.                                         case 8:
  256.                                         {
  257.                                                 if ( page > 1 )
  258.                                                         OnPageChanged( pPlayer, page - 7 );
  259.                                                 else
  260.                                                         GoBack( pPlayer );
  261.                                         }
  262.                                         break;
  263.                                         case 9:
  264.                                         {
  265.                                                 OnPageChanged( pPlayer, page + 7 );
  266.                                         }
  267.                                         break;
  268.                                 }
  269.                         }
  270.                 }

  271.                 void Register()
  272.                 {
  273.                         AdminMenu_RegisterItem( CMenuItem() );
  274.                 }
  275.         }
  276. }
复制代码


reloadadmins.as
  1. namespace AdminMenu
  2. {
  3.         namespace ReloadAdmins
  4.         {
  5.                 class CMenuItem : CAdminMenuItemBase
  6.                 {
  7.                         CMenuItem()
  8.                         {
  9.                                 m_ID = "as_reloadadmins";
  10.                                 m_Name = "Reload admins";
  11.                                 m_Group = GROUP_SERVER_CMD;
  12.                                 m_Level = LEVEL_SUPERADMIN;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  17.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Reloaded Admins" );
  18.                                 Engine.RunConsoleCommand( "admin_rebuild" );
  19.                         }

  20.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  21.                         {
  22.                         }
  23.                 }

  24.                 void Register()
  25.                 {
  26.                         AdminMenu_RegisterItem( CMenuItem() );
  27.                 }
  28.         }
  29. }
复制代码


silence.as
  1. namespace AdminMenu
  2. {
  3.         namespace Silence
  4.         {
  5.                 class CMenuItem : CAdminMenuItemTargetBase
  6.                 {
  7.                         private array<string> s_reasons;

  8.                         CMenuItem()
  9.                         {
  10.                                 m_ID = "as_silence";
  11.                                 m_Name = "Silence player";
  12.                                 m_Group = GROUP_PLAYER_CMD;
  13.                                 m_Level = LEVEL_MODERATOR;
  14.                                 PopulateBanReasons();
  15.                         }

  16.                         void PopulateBanReasons()
  17.                         {
  18.                                 FileSystem::CreateFolder( "adminbase" );
  19.                                 JsonValues@ temp = FileSystem::ReadFile( "adminbase/commreasons" );
  20.                                 if ( temp is null )
  21.                                 {
  22.                                         s_reasons.insertLast( "No Reason" );
  23.                                         return;
  24.                                 }
  25.                                 int y = 0;
  26.                                 while( true )
  27.                                 {
  28.                                         string find = "reason" + y;
  29.                                         if ( FileSystem::Exists( temp, find        ) != 0 ) break;
  30.                                         y++;
  31.                                         s_reasons.insertLast( FileSystem::GrabString( temp, find ) );
  32.                                 }
  33.                         }

  34.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  35.                         {
  36.                                 OnPageChanged( pPlayer, 1 );
  37.                         }

  38.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  39.                         {
  40.                                 Menu pMenu;
  41.                                 FillPlayers( pMenu, page );
  42.                                 pMenu.SetID( m_ID + ";" + page );
  43.                                 pMenu.SetTitle( m_Name );
  44.                                 pMenu.SetBack( true );
  45.                                 pMenu.Display( pPlayer, -1 );
  46.                         }

  47.                         bool FillReasons( Menu &out pMenu, uint page )
  48.                         {
  49.                                 int li = 0;
  50.                                 for ( uint i = page; i < s_reasons.length(); i++ )
  51.                                 {
  52.                                         string reason = s_reasons[i];
  53.                                         if ( li > 6 ) break;
  54.                                         if ( li == 5 ) reason = reason + "\n";
  55.                                         if ( !pMenu.AddItem( reason ) ) break;
  56.                                         li++;
  57.                                 }
  58.                                 if ( li == 0 ) return false;
  59.                                 // Index 8 is always "Back"
  60.                                 // Index 9 is always "Next"
  61.                                 pMenu.SetBack( true );
  62.                                 if ( li > 6 )
  63.                                         pMenu.SetNext( true );
  64.                                 return true;
  65.                         }

  66.                         void ShowTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
  67.                         {
  68.                                 Menu pMenu;
  69.                                 pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
  70.                                 pMenu.SetTitle( "Silence time:" );
  71.                                 pMenu.AddItem( "Permanent" );
  72.                                 pMenu.AddItem( "10 Minutes" );
  73.                                 pMenu.AddItem( "30 Minutes" );
  74.                                 pMenu.AddItem( "1 Hour" );
  75.                                 pMenu.AddItem( "4 Hours" );
  76.                                 pMenu.AddItem( "1 Day" );
  77.                                 pMenu.AddItem( "1 Week" );
  78.                                 pMenu.SetBack( true );
  79.                                 pMenu.Display( pPlayer, -1 );
  80.                         }

  81.                         string GetBanReasonFromResult( uint result )
  82.                         {
  83.                                 uint li = 0;
  84.                                 for ( uint i = 0; i < s_reasons.length(); i++ )
  85.                                 {
  86.                                         string reason = s_reasons[i];
  87.                                         if ( result == li ) return reason;
  88.                                         li++;
  89.                                 }
  90.                                 return "";
  91.                         }

  92.                         string BanTime( int iLength )
  93.                         {
  94.                                 string ret( "for {gold}" );
  95.                                 switch( iLength )
  96.                                 {
  97.                                         case 0: ret = "Permanently"; break;
  98.                                         case 10: ret += "10 Minutes"; break;
  99.                                         case 30: ret += "30 Minutes"; break;
  100.                                         case 60: ret += "1 Hour"; break;
  101.                                         case 240: ret += "4 Hours"; break;
  102.                                         case 1440: ret += "1 Day"; break;
  103.                                         case 10080: ret += "1 Week"; break;
  104.                                 }
  105.                                 return ret;
  106.                         }

  107.                         void DoModuleExec( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
  108.                         {
  109.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  110.                                 if ( pTerror is null ) return;
  111.                                 string reason = GetBanReasonFromResult( result_reason );
  112.                                 if ( Utils.StrEql( reason, "" ) ) return;

  113.                                 string szName = pTerror.GetPlayerName();

  114.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  115.                                 if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
  116.                                 {
  117.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently silenced {limegreen}" + szName );
  118.                                         OnPageChanged( pPlayer, 1 );
  119.                                         return;
  120.                                 }

  121.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Silence {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );

  122.                                 AdminSystem.Gag( pTerror, iLength, true, reason );
  123.                                 AdminSystem.Mute( pTerror, iLength, true, reason );
  124.                                 OnPageChanged( pPlayer, 1 );
  125.                         }

  126.                         void ShowReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
  127.                         {
  128.                                 Menu pMenu;
  129.                                 if ( !FillReasons( pMenu, page ) )
  130.                                 {
  131.                                         OnPageChanged( pPlayer, 1 );
  132.                                         return;
  133.                                 }
  134.                                 pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
  135.                                 pMenu.SetTitle( "Silence reason:" );
  136.                                 pMenu.SetBack( true );
  137.                                 pMenu.Display( pPlayer, -1 );
  138.                         }

  139.                         bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  140.                         {
  141.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  142.                                 if ( pTerror is null ) return false;
  143.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  144.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  145.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  146.                                 CBaseEntity@ pSelf = pBasePlayer.opCast();
  147.                                 if ( pSelf.entindex() == pBaseEntity.entindex() )
  148.                                 {
  149.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot silence yourself!" );
  150.                                         return false;
  151.                                 }
  152.                                 ShowReasonsMenu( pPlayer, result, 0 );
  153.                                 return true;
  154.                         }

  155.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  156.                         {
  157.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  158.                                 string arg1 = pArgs.Arg( 1 );        // Page
  159.                                 string arg2 = pArgs.Arg( 2 );        // Value
  160.                                 string arg3 = pArgs.Arg( 3 );        // Target
  161.                                 string arg4 = pArgs.Arg( 4 );        // Reason
  162.                                 uint page = parseUInt( arg1 );
  163.                                 uint target = parseUInt( arg3 );
  164.                                 uint result_reason = parseUInt( arg4 );
  165.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  166.                                 if ( Utils.StrEql( arg2, "time" ) )
  167.                                 {
  168.                                         switch( iValue )
  169.                                         {
  170.                                                 case 1:
  171.                                                 {
  172.                                                         DoModuleExec( pPlayer, target, 0, result_reason );
  173.                                                 }
  174.                                                 break;
  175.                                                 case 2:
  176.                                                 {
  177.                                                         DoModuleExec( pPlayer, target, 10, result_reason );
  178.                                                 }
  179.                                                 break;
  180.                                                 case 3:
  181.                                                 {
  182.                                                         DoModuleExec( pPlayer, target, 30, result_reason );
  183.                                                 }
  184.                                                 break;
  185.                                                 case 4:
  186.                                                 {
  187.                                                         DoModuleExec( pPlayer, target, 60, result_reason );
  188.                                                 }
  189.                                                 break;
  190.                                                 case 5:
  191.                                                 {
  192.                                                         DoModuleExec( pPlayer, target, 240, result_reason );
  193.                                                 }
  194.                                                 break;
  195.                                                 case 6:
  196.                                                 {
  197.                                                         DoModuleExec( pPlayer, target, 1440, result_reason );
  198.                                                 }
  199.                                                 break;
  200.                                                 case 7:
  201.                                                 {
  202.                                                         DoModuleExec( pPlayer, target, 10080, result_reason );
  203.                                                 }
  204.                                                 break;
  205.                                                 case 8:
  206.                                                         ShowReasonsMenu( pPlayer, target, 0 );
  207.                                                 break;
  208.                                         }
  209.                                         return;
  210.                                 }
  211.                                 else if ( Utils.StrEql( arg2, "reason" ) )
  212.                                 {
  213.                                         switch( iValue )
  214.                                         {
  215.                                                 case 1:
  216.                                                 case 2:
  217.                                                 case 3:
  218.                                                 case 4:
  219.                                                 case 5:
  220.                                                 case 6:
  221.                                                 case 7:
  222.                                                 {
  223.                                                         ShowTimeMenu( pPlayer, target, result );
  224.                                                 }
  225.                                                 break;
  226.                                                 case 8:
  227.                                                 {
  228.                                                         if ( page > 0 )
  229.                                                                 ShowReasonsMenu( pPlayer, target, page - 7 );
  230.                                                         else
  231.                                                                 OnPageChanged( pPlayer, 1 );
  232.                                                 }
  233.                                                 break;
  234.                                                 case 9:
  235.                                                 {
  236.                                                         ShowReasonsMenu( pPlayer, target, page + 7 );
  237.                                                 }
  238.                                                 break;
  239.                                         }
  240.                                         return;
  241.                                 }
  242.                                 switch( iValue )
  243.                                 {
  244.                                         case 1:
  245.                                         case 2:
  246.                                         case 3:
  247.                                         case 4:
  248.                                         case 5:
  249.                                         case 6:
  250.                                         case 7:
  251.                                         {
  252.                                                 if ( !ExecuteArgument( pPlayer, result ) )
  253.                                                         OnPageChanged( pPlayer, page );
  254.                                         }
  255.                                         break;
  256.                                         case 8:
  257.                                         {
  258.                                                 if ( page > 1 )
  259.                                                         OnPageChanged( pPlayer, page - 7 );
  260.                                                 else
  261.                                                         GoBack( pPlayer );
  262.                                         }
  263.                                         break;
  264.                                         case 9:
  265.                                         {
  266.                                                 OnPageChanged( pPlayer, page + 7 );
  267.                                         }
  268.                                         break;
  269.                                 }
  270.                         }
  271.                 }

  272.                 void Register()
  273.                 {
  274.                         AdminMenu_RegisterItem( CMenuItem() );
  275.                 }
  276.         }
  277. }
复制代码


slap.as
  1. namespace AdminMenu
  2. {
  3.         namespace Slap
  4.         {
  5.                 class CMenuItem_Slap : CAdminMenuItemTargetBase
  6.                 {
  7.                         CMenuItem_Slap()
  8.                         {
  9.                                 m_ID = "as_slap";
  10.                                 m_Name = "Slap player";
  11.                                 m_Group = GROUP_PLAYER_CMD;
  12.                                 m_Level = LEVEL_MODERATOR;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 OnPageChanged( pPlayer, 1 );
  17.                         }

  18.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  19.                         {
  20.                                 Menu pMenu;
  21.                                 FillPlayers( pMenu, page );
  22.                                 pMenu.SetID( m_ID + ";" + page );
  23.                                 pMenu.SetTitle( m_Name );
  24.                                 pMenu.SetBack( true );
  25.                                 pMenu.Display( pPlayer, -1 );
  26.                         }

  27.                         void ShowSlapMenu( CTerrorPlayer@ pPlayer, uint result )
  28.                         {
  29.                                 Menu pMenu;
  30.                                 pMenu.SetID( m_ID + ";" + 1 + ";slap;" + result );
  31.                                 pMenu.SetTitle( "Slap damage:" );
  32.                                 pMenu.AddItem( "0" );
  33.                                 pMenu.AddItem( "1" );
  34.                                 pMenu.AddItem( "5" );
  35.                                 pMenu.AddItem( "10" );
  36.                                 pMenu.AddItem( "20" );
  37.                                 pMenu.AddItem( "50" );
  38.                                 pMenu.AddItem( "99" );
  39.                                 pMenu.SetBack( true );
  40.                                 pMenu.Display( pPlayer, -1 );
  41.                         }
  42.                         
  43.                         void PerformSlap( CTerrorPlayer@ pPlayer, uint result, int &in iValue )
  44.                         {
  45.                                 switch( iValue )
  46.                                 {
  47.                                         case 1:
  48.                                         {
  49.                                                 DoSlapDamage( pPlayer, result, 0 );
  50.                                                 ShowSlapMenu( pPlayer, result );
  51.                                         }
  52.                                         break;
  53.                                         case 2:
  54.                                         {
  55.                                                 DoSlapDamage( pPlayer, result, 1 );
  56.                                                 ShowSlapMenu( pPlayer, result );
  57.                                         }
  58.                                         break;
  59.                                         case 3:
  60.                                         {
  61.                                                 DoSlapDamage( pPlayer, result, 5 );
  62.                                                 ShowSlapMenu( pPlayer, result );
  63.                                         }
  64.                                         break;
  65.                                         case 4:
  66.                                         {
  67.                                                 DoSlapDamage( pPlayer, result, 10 );
  68.                                                 ShowSlapMenu( pPlayer, result );
  69.                                         }
  70.                                         break;
  71.                                         case 5:
  72.                                         {
  73.                                                 DoSlapDamage( pPlayer, result, 20 );
  74.                                                 ShowSlapMenu( pPlayer, result );
  75.                                         }
  76.                                         break;
  77.                                         case 6:
  78.                                         {
  79.                                                 DoSlapDamage( pPlayer, result, 50 );
  80.                                                 ShowSlapMenu( pPlayer, result );
  81.                                         }
  82.                                         break;
  83.                                         case 7:
  84.                                         {
  85.                                                 DoSlapDamage( pPlayer, result, 99 );
  86.                                                 ShowSlapMenu( pPlayer, result );
  87.                                         }
  88.                                         break;
  89.                                         case 8:
  90.                                                 OnPageChanged( pPlayer, 1 );
  91.                                         break;
  92.                                 }
  93.                         }

  94.                         void DoSlapDamage( CTerrorPlayer@ pPlayer, uint result, int damage )
  95.                         {
  96.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  97.                                 if ( pTerror is null ) return;
  98.                                 string szName = pTerror.GetPlayerName();
  99.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  100.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Slapped " + szName );

  101.                                 // Slap em!
  102.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  103.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  104.                                 Vector velocity = pBaseEntity.GetAbsVelocity();
  105.                                 velocity.x += Math::RandomInt( 50, 180 ) * ((Math::RandomInt( 0, 2 ) == 1) ?  -1 : 1);
  106.                                 velocity.y += Math::RandomInt( 50, 180 ) * ((Math::RandomInt( 0, 2 ) == 1) ?  -1 : 1);
  107.                                 velocity.z += Math::RandomInt( 100, 200 );
  108.                                 pBaseEntity.ApplyVelocity( velocity );

  109.                                 // Take damage
  110.                                 CTakeDamageInfo info = CTakeDamageInfo( pBaseEntity, pBaseEntity, damage, DMG_CRUSH );
  111.                                 pBaseEntity.TakeDamage( info );

  112.                                 pTerror.PlayWwiseSound( "SFX_ImpactBreak_Flesh", "", -1 );
  113.                         }

  114.                         bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  115.                         {
  116.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  117.                                 if ( pTerror is null ) return false;
  118.                                 ShowSlapMenu( pPlayer, result );
  119.                                 return true;
  120.                         }

  121.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  122.                         {
  123.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  124.                                 string arg1 = pArgs.Arg( 1 );        // Page
  125.                                 string arg2 = pArgs.Arg( 2 );        // Value
  126.                                 if ( Utils.StrEql( arg2, "slap" ) )
  127.                                 {
  128.                                         string arg3 = pArgs.Arg( 3 );        // Target
  129.                                         uint target = parseUInt( arg3 );
  130.                                         PerformSlap( pPlayer, target, iValue );
  131.                                         return;
  132.                                 }
  133.                                 uint page = parseUInt( arg1 );
  134.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  135.                                 switch( iValue )
  136.                                 {
  137.                                         case 1:
  138.                                         case 2:
  139.                                         case 3:
  140.                                         case 4:
  141.                                         case 5:
  142.                                         case 6:
  143.                                         case 7:
  144.                                         {
  145.                                                 if ( !ExecuteArgument( pPlayer, result ) )
  146.                                                         OnPageChanged( pPlayer, page );
  147.                                         }
  148.                                         break;
  149.                                         case 8:
  150.                                         {
  151.                                                 if ( page > 1 )
  152.                                                         OnPageChanged( pPlayer, page - 7 );
  153.                                                 else
  154.                                                         GoBack( pPlayer );
  155.                                         }
  156.                                         break;
  157.                                         case 9:
  158.                                         {
  159.                                                 OnPageChanged( pPlayer, page + 7 );
  160.                                         }
  161.                                         break;
  162.                                 }
  163.                         }
  164.                 }

  165.                 void Register()
  166.                 {
  167.                         AdminMenu_RegisterItem( CMenuItem_Slap() );
  168.                 }
  169.         }
  170. }
复制代码


slay.as
  1. namespace AdminMenu
  2. {
  3.         namespace Slay
  4.         {
  5.                 class CMenuItem_Slay : CAdminMenuItemTargetBase
  6.                 {
  7.                         CMenuItem_Slay()
  8.                         {
  9.                                 m_ID = "as_slay";
  10.                                 m_Name = "Slay player";
  11.                                 m_Group = GROUP_PLAYER_CMD;
  12.                                 m_Level = LEVEL_MODERATOR;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 OnPageChanged( pPlayer, 1 );
  17.                         }

  18.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  19.                         {
  20.                                 Menu pMenu;
  21.                                 FillPlayers( pMenu, page );
  22.                                 pMenu.SetID( m_ID + ";" + page );
  23.                                 pMenu.SetTitle( m_Name );
  24.                                 pMenu.SetBack( true );
  25.                                 pMenu.Display( pPlayer, -1 );
  26.                         }

  27.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  28.                         {
  29.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  30.                                 if ( pTerror is null ) return;
  31.                                 string szName = pTerror.GetPlayerName();

  32.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  33.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
  34.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();

  35.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Slayed " + szName );
  36.                                 Engine.RunConsoleCommand( "admin slay !" + pBaseEntity.entindex() );
  37.                         }

  38.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  39.                         {
  40.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  41.                                 string arg1 = pArgs.Arg( 1 );        // Page
  42.                                 uint page = parseUInt( arg1 );
  43.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  44.                                 switch( iValue )
  45.                                 {
  46.                                         case 1:
  47.                                         case 2:
  48.                                         case 3:
  49.                                         case 4:
  50.                                         case 5:
  51.                                         case 6:
  52.                                         case 7:
  53.                                         {
  54.                                                 ExecuteArgument( pPlayer, result );
  55.                                                 OnPageChanged( pPlayer, page );
  56.                                         }
  57.                                         break;
  58.                                         case 8:
  59.                                         {
  60.                                                 if ( page > 1 )
  61.                                                         OnPageChanged( pPlayer, page - 7 );
  62.                                                 else
  63.                                                         GoBack( pPlayer );
  64.                                         }
  65.                                         break;
  66.                                         case 9:
  67.                                         {
  68.                                                 OnPageChanged( pPlayer, page + 7 );
  69.                                         }
  70.                                         break;
  71.                                 }
  72.                         }
  73.                 }

  74.                 void Register()
  75.                 {
  76.                         AdminMenu_RegisterItem( CMenuItem_Slay() );
  77.                 }
  78.         }
  79. }
复制代码


teleport.as
  1. namespace AdminMenu
  2. {
  3.         namespace Teleport
  4.         {
  5.                 class CMenuItem_Teleport : CAdminMenuItemTargetBase
  6.                 {
  7.                         CMenuItem_Teleport()
  8.                         {
  9.                                 m_ID = "as_tele";
  10.                                 m_Name = "Teleport player";
  11.                                 m_Group = GROUP_PLAYER_CMD;
  12.                                 m_Level = LEVEL_MODERATOR;
  13.                         }

  14.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  15.                         {
  16.                                 OnPageChanged( pPlayer, 1 );
  17.                         }

  18.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  19.                         {
  20.                                 Menu pMenu;
  21.                                 FillPlayers( pMenu, page );
  22.                                 pMenu.SetID( m_ID + ";" + page );
  23.                                 pMenu.SetTitle( m_Name );
  24.                                 pMenu.SetBack( true );
  25.                                 pMenu.Display( pPlayer, -1 );
  26.                         }

  27.                         void ShowTeleportToMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
  28.                         {
  29.                                 Menu pMenu;
  30.                                 if ( !FillPlayers( pMenu, page ) )
  31.                                 {
  32.                                         OnPageChanged( pPlayer, 1 );
  33.                                         return;
  34.                                 }
  35.                                 pMenu.SetID( m_ID + ";" + page + ";tele;" + result );
  36.                                 pMenu.SetTitle( "Teleport destination:" );
  37.                                 pMenu.SetBack( true );
  38.                                 pMenu.Display( pPlayer, -1 );
  39.                         }

  40.                         bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  41.                         {
  42.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  43.                                 if ( pTerror is null ) return false;
  44.                                 ShowTeleportToMenu( pPlayer, result, 1 );
  45.                                 return true;
  46.                         }

  47.                         void DoTeleport( CTerrorPlayer@ pPlayer, uint result, uint result_dest )
  48.                         {
  49.                                 CTerrorPlayer @pTerror = GetPlayerFromResult( result );
  50.                                 if ( pTerror is null ) return;
  51.                                 CTerrorPlayer @pTerrorDest = GetPlayerFromResult( result_dest );
  52.                                 if ( pTerrorDest is null ) return;

  53.                                 string szName = pTerror.GetPlayerName();
  54.                                 string szNameDest = pTerrorDest.GetPlayerName();

  55.                                 CBasePlayer@ pBasePlayer = pPlayer.opCast();
  56.                                 Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Teleported {limegreen}" + szName + "{white} to {cyan}" + szNameDest );

  57.                                 CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
  58.                                 CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();

  59.                                 CBasePlayer@ pTerrorBasePlayerDest = pTerrorDest.opCast();
  60.                                 CBaseEntity@ pBaseEntityDest = pTerrorBasePlayerDest.opCast();

  61.                                 // Teleport to this new origin
  62.                                 pBaseEntity.SetAbsOrigin( pBaseEntityDest.GetAbsOrigin() );
  63.                         }

  64.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  65.                         {
  66.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  67.                                 string arg1 = pArgs.Arg( 1 );        // Page
  68.                                 string arg2 = pArgs.Arg( 2 );        // Value
  69.                                 uint page = parseUInt( arg1 );
  70.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  71.                                 if ( Utils.StrEql( arg2, "tele" ) )
  72.                                 {
  73.                                         string arg3 = pArgs.Arg( 3 );        // Target
  74.                                         uint target = parseUInt( arg3 );
  75.                                         DoTeleport( pPlayer, target, result );
  76.                                         OnPageChanged( pPlayer, 1 );
  77.                                         return;
  78.                                 }
  79.                                 switch( iValue )
  80.                                 {
  81.                                         case 1:
  82.                                         case 2:
  83.                                         case 3:
  84.                                         case 4:
  85.                                         case 5:
  86.                                         case 6:
  87.                                         case 7:
  88.                                         {
  89.                                                 if ( !ExecuteArgument( pPlayer, result ) )
  90.                                                         OnPageChanged( pPlayer, page );
  91.                                         }
  92.                                         break;
  93.                                         case 8:
  94.                                         {
  95.                                                 if ( page > 1 )
  96.                                                         OnPageChanged( pPlayer, page - 7 );
  97.                                                 else
  98.                                                         GoBack( pPlayer );
  99.                                         }
  100.                                         break;
  101.                                         case 9:
  102.                                         {
  103.                                                 OnPageChanged( pPlayer, page + 7 );
  104.                                         }
  105.                                         break;
  106.                                 }
  107.                         }
  108.                 }

  109.                 void Register()
  110.                 {
  111.                         AdminMenu_RegisterItem( CMenuItem_Teleport() );
  112.                 }
  113.         }
  114. }
复制代码


vote_base.as
  1. namespace AdminMenu
  2. {
  3.         namespace Vote
  4.         {
  5.                 mixin class IBaseVoteMenu
  6.                 {
  7.                         void SetVoteTime( float flVal, string szMenuID, string szID, string szTitle, array<string> &in aItems, CallbackFunc @func )
  8.                         {
  9.                                 Menu pMenu;
  10.                                 pMenu.SetID( szMenuID + ";0;" + szID );
  11.                                 pMenu.SetTitle( szTitle );
  12.                                 if ( aItems.length() == 1 )
  13.                                 {
  14.                                         pMenu.AddItem( "Yes" );
  15.                                         pMenu.AddItem( "No" );
  16.                                 }
  17.                                 else
  18.                                 {
  19.                                         for ( uint i = 0; i < aItems.length(); i++ )
  20.                                         {
  21.                                                 if ( !pMenu.AddItem( aItems[i] ) ) break;
  22.                                         }
  23.                                 }
  24.                                 pMenu.Display( null, int(flVal) );
  25.                                 Schedule::Task( flVal, func );
  26.                         }
  27.                         void SetVoteTime( float flVal, string szMenuID, string szID, string szTitle, CallbackFunc @func )
  28.                         {
  29.                                 Menu pMenu;
  30.                                 pMenu.SetID( szMenuID + ";0;" + szID );
  31.                                 pMenu.SetTitle( szTitle );
  32.                                 pMenu.AddItem( "Yes" );
  33.                                 pMenu.AddItem( "No" );
  34.                                 pMenu.Display( null, int(flVal) );
  35.                                 Schedule::Task( flVal, func );
  36.                         }
  37.                 }
  38.         }
  39. }
复制代码


vote_difficulty.as
  1. // Make sure the base interface is included!
  2. #include "vote_base.as"

  3. namespace AdminMenu
  4. {
  5.         namespace Vote
  6.         {
  7.                 class CMenuItemDiff : CAdminMenuItemBase, IBaseVoteMenu
  8.                 {
  9.                         private array<int> s_votes;
  10.                         private uint s_DifficultyChoice = 0;
  11.                         private uint s_GetBestChoice = 0;
  12.                         private bool s_VoteOngoing = false;
  13.                         CMenuItemDiff()
  14.                         {
  15.                                 m_ID = "as_vote_diff";
  16.                                 m_Name = "Vote Difficulty";
  17.                                 m_Group = GROUP_VOTE_CMD;
  18.                                 m_Level = LEVEL_ADMIN;
  19.                                 Clear();
  20.                         }

  21.                         void Clear()
  22.                         {
  23.                                 // If vote is ongoing, then stop!
  24.                                 if ( s_VoteOngoing ) return;
  25.                                 s_votes.resize(0);
  26.                                 s_DifficultyChoice = 0;
  27.                                 s_GetBestChoice = 0;
  28.                         }

  29.                         void GoBack( CTerrorPlayer @pPlayer ) override
  30.                         {
  31.                                 s_VoteOngoing = false;
  32.                                 Clear();
  33.                                 AdminMenu_BackToGroup( pPlayer, m_Group );
  34.                         }

  35.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  36.                         {
  37.                                 // If vote is ongoing, then stop!
  38.                                 if ( s_VoteOngoing )
  39.                                 {
  40.                                         CBasePlayer@ pBasePlayer = pPlayer.opCast();
  41.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
  42.                                         return;
  43.                                 }
  44.                                 Clear();
  45.                                 OnPageChanged( pPlayer, 0 );
  46.                         }

  47.                         int GetVoteAmount()
  48.                         {
  49.                                 int y = 0;
  50.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  51.                                         y += s_votes[i];
  52.                                 return y;
  53.                         }

  54.                         int GetYesVotes() { return s_votes[0]; }
  55.                         int GetNoVotes() { return s_votes[1]; }
  56.                         float GetNoVotePercentage()
  57.                         {
  58.                                 int votes = GetNoVotes() - GetYesVotes();
  59.                                 float percentage = float(votes) / float(GetVoteAmount());
  60.                                 return (percentage * 100);
  61.                         }

  62.                         void GetBestChoice()
  63.                         {
  64.                                 s_VoteOngoing = false;
  65.                                 int votes = 0;
  66.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  67.                                 {
  68.                                         if ( votes > s_votes[i] ) continue;
  69.                                         votes = s_votes[i];
  70.                                         s_GetBestChoice = i;
  71.                                 }
  72.                         }

  73.                         float GetVotePercentage()
  74.                         {
  75.                                 int votes = s_votes[s_GetBestChoice];
  76.                                 float percentage = float(votes) / float(GetVoteAmount());
  77.                                 return (percentage * 100);
  78.                         }

  79.                         void BeginMapVote()
  80.                         {
  81.                                 s_VoteOngoing = true;
  82.                                 SetVoteTime( 15, m_ID, "vote", "Change difficulty to " + GetDiffName( s_DifficultyChoice ), AdminMenuItemVoteDiff_OnVoteEnd );
  83.                         }

  84.                         void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
  85.                         {
  86.                                 result = Math::clamp( result, 0, 1 );
  87.                                 s_votes[result]++;
  88.                         }

  89.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  90.                         {
  91.                                 Menu pMenu;
  92.                                 pMenu.SetID( m_ID + ";" + page );
  93.                                 pMenu.SetTitle( "Please select difficulty" );
  94.                                 pMenu.AddItem( GetDiffName( 0 ) );
  95.                                 pMenu.AddItem( GetDiffName( 1 ) );
  96.                                 pMenu.AddItem( GetDiffName( 2 ) );
  97.                                 pMenu.AddItem( GetDiffName( 3 ) );
  98.                                 pMenu.AddItem( GetDiffName( 4 ) );
  99.                                 pMenu.SetBack( true );
  100.                                 pMenu.Display( pPlayer, -1 );
  101.                         }

  102.                         bool IsSameDiff( CTerrorPlayer@ pPlayer, uint result )
  103.                         {
  104.                                 CASConVarRef@ cvar_difficulty = ConVar::Find( "difficulty" );
  105.                                 if ( cvar_difficulty is null ) return false;
  106.                                 if ( cvar_difficulty.GetInt() == int(result) )
  107.                                 {
  108.                                         CBasePlayer@ pBasePlayer = pPlayer.opCast();
  109.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} The game is already on this difficulty." );
  110.                                         return true;
  111.                                 }
  112.                                 return false;
  113.                         }

  114.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  115.                         {
  116.                                 if ( IsSameDiff( pPlayer, result ) )
  117.                                 {
  118.                                         OnPageChanged( pPlayer, 0 );
  119.                                         return;
  120.                                 }
  121.                                 s_DifficultyChoice = result;
  122.                                 s_votes.insertLast( 0 );
  123.                                 s_votes.insertLast( 0 );
  124.                                 BeginMapVote();
  125.                         }

  126.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  127.                         {
  128.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  129.                                 string arg1 = pArgs.Arg( 1 );        // Page
  130.                                 string arg2 = pArgs.Arg( 2 );        // ID
  131.                                 uint page = parseUInt( arg1 );
  132.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  133.                                 if ( Utils.StrEql( arg2, "vote" ) )
  134.                                 {
  135.                                         switch( iValue )
  136.                                         {
  137.                                                 case 1:
  138.                                                 case 2:
  139.                                                 case 3:
  140.                                                 case 4:
  141.                                                 case 5:
  142.                                                 case 6:
  143.                                                 case 7:
  144.                                                 {
  145.                                                         DoModuleExec( pPlayer, result );
  146.                                                 }
  147.                                                 break;
  148.                                         }
  149.                                         return;
  150.                                 }
  151.                                 switch( iValue )
  152.                                 {
  153.                                         case 1:
  154.                                         case 2:
  155.                                         case 3:
  156.                                         case 4:
  157.                                         case 5:
  158.                                         case 6:
  159.                                         case 7:
  160.                                         {
  161.                                                 ExecuteArgument( pPlayer, result );
  162.                                         }
  163.                                         break;
  164.                                         case 8:
  165.                                         {
  166.                                                 if ( page > 0 )
  167.                                                         OnPageChanged( pPlayer, page - 7 );
  168.                                                 else
  169.                                                         GoBack( pPlayer );
  170.                                         }
  171.                                         break;
  172.                                         case 9:
  173.                                         {
  174.                                                 OnPageChanged( pPlayer, page + 7 );
  175.                                         }
  176.                                         break;
  177.                                 }
  178.                         }

  179.                         string GetDiffName( uint id )
  180.                         {
  181.                                 switch( id )
  182.                                 {
  183.                                         case 0: return "Easy";
  184.                                         case 1: return "Normal";
  185.                                         case 2: return "Hard";
  186.                                         case 3: return "Extreme";
  187.                                         case 4: return "Nightmare";
  188.                                 }
  189.                                 return "Error";
  190.                         }

  191.                         int GetChoosenDiff()
  192.                         {
  193.                                 return s_DifficultyChoice;
  194.                         }

  195.                         string GetChoosenName()
  196.                         {
  197.                                 return GetDiffName( s_DifficultyChoice );
  198.                         }
  199.                 }
  200.                 CMenuItemDiff @pMenuItem = CMenuItemDiff();

  201.                 void RegisterVoteDiff()
  202.                 {
  203.                         AdminMenu_RegisterItem( pMenuItem );
  204.                 }

  205.                 void AdminMenuItemVoteDiff_OnVoteEnd()
  206.                 {
  207.                         pMenuItem.GetBestChoice();
  208.                         if ( pMenuItem.GetVoteAmount() <= 0 )
  209.                         {
  210.                                 Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Difficulty will not change." );
  211.                                 return;
  212.                         }
  213.                         if ( pMenuItem.GetNoVotes() > pMenuItem.GetYesVotes() )
  214.                         {
  215.                                 Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Difficulty voting has finished. The difficulty will not change as {red}No{white} votes exceeds {green}Yes{white} votes by {community}" + pMenuItem.GetNoVotePercentage() + "{white}% of {community}" + pMenuItem.GetVoteAmount() + "{white} votes" );
  216.                                 return;
  217.                         }
  218.                         Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Difficulty voting has finished. The difficulty will be changed to {green}" + pMenuItem.GetChoosenName() + "{white} on next round. (Received {community}" + pMenuItem.GetVotePercentage() + "{white}% of {community}" + pMenuItem.GetVoteAmount() + "{white} votes)" );
  219.                         Engine.RunConsoleCommand( "admin difficulty "" + pMenuItem.GetChoosenDiff() + """ );
  220.                 }
  221.         }
  222. }
复制代码




vote_map.as


  1. // Make sure the base interface is included!
  2. #include "vote_base.as"

  3. namespace AdminMenu
  4. {
  5.         namespace Vote
  6.         {
  7.                 class CMenuItem : CAdminMenuItemBase, IBaseVoteMenu
  8.                 {
  9.                         private array<string> s_arraylist;
  10.                         private array<string> s_maplist;
  11.                         private array<int> s_votes;
  12.                         private int s_GetBestChoice = 0;
  13.                         private bool s_VoteOngoing = false;
  14.                         CMenuItem()
  15.                         {
  16.                                 m_ID = "as_vote_map";
  17.                                 m_Name = "Vote Map";
  18.                                 m_Group = GROUP_VOTE_CMD;
  19.                                 m_Level = LEVEL_ADMIN;
  20.                                 Clear();
  21.                         }

  22.                         void Clear()
  23.                         {
  24.                                 // If vote is ongoing, then stop!
  25.                                 if ( s_VoteOngoing ) return;
  26.                                 s_arraylist.resize(0);
  27.                                 s_maplist.resize(0);
  28.                                 s_votes.resize(0);
  29.                                 s_GetBestChoice = 0;
  30.                         }

  31.                         void GoBack( CTerrorPlayer @pPlayer ) override
  32.                         {
  33.                                 s_VoteOngoing = false;
  34.                                 Clear();
  35.                                 AdminMenu_BackToGroup( pPlayer, m_Group );
  36.                         }

  37.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  38.                         {
  39.                                 // If vote is ongoing, then stop!
  40.                                 if ( s_VoteOngoing )
  41.                                 {
  42.                                         CBasePlayer@ pBasePlayer = pPlayer.opCast();
  43.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
  44.                                         return;
  45.                                 }
  46.                                 Clear();
  47.                                 OnPageChanged( pPlayer, 0 );
  48.                         }

  49.                         bool HasMapVotes() { return (s_maplist.length() > 0) ? true : false; }
  50.                         bool IsSingleMapVote() { return (s_maplist.length() == 1) ? true : false; }
  51.                         int GetVoteAmount()
  52.                         {
  53.                                 int y = 0;
  54.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  55.                                         y += s_votes[i];
  56.                                 return y;
  57.                         }
  58.                         int GetYesVotes() { return s_votes[0]; }
  59.                         int GetNoVotes() { return s_votes[1]; }

  60.                         void GetBestChoice()
  61.                         {
  62.                                 s_VoteOngoing = false;
  63.                                 int votes = 0;
  64.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  65.                                 {
  66.                                         if ( votes > s_votes[i] ) continue;
  67.                                         votes = s_votes[i];
  68.                                         s_GetBestChoice = i;
  69.                                 }
  70.                         }

  71.                         float GetNoVotePercentage()
  72.                         {
  73.                                 int votes = GetNoVotes() - GetYesVotes();
  74.                                 float percentage = float(votes) / float(GetVoteAmount());
  75.                                 return (percentage * 100);
  76.                         }

  77.                         float GetVotePercentage()
  78.                         {
  79.                                 int votes = s_votes[s_GetBestChoice];
  80.                                 float percentage = float(votes) / float(GetVoteAmount());
  81.                                 return (percentage * 100);
  82.                         }

  83.                         void BeginMapVote()
  84.                         {
  85.                                 s_VoteOngoing = true;
  86.                                 string szTitle = "Map Vote";
  87.                                 if ( IsSingleMapVote() )
  88.                                 {
  89.                                         szTitle = "Change Map To " + s_maplist[ 0 ];
  90.                                         s_votes.insertLast( 0 );
  91.                                 }
  92.                                 SetVoteTime( 15, m_ID, "vote", szTitle, s_maplist, AdminMenuItemVoteMap_OnVoteEnd );
  93.                         }

  94.                         void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
  95.                         {
  96.                                 if ( IsSingleMapVote() )
  97.                                         result = Math::clamp( result, 0, 1 );
  98.                                 s_votes[result]++;
  99.                         }

  100.                         void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
  101.                         {
  102.                                 Menu pMenu;
  103.                                 if ( !FillMaps( pMenu, page ) )
  104.                                 {
  105.                                         BeginMapVote();
  106.                                         return;
  107.                                 }
  108.                                 pMenu.SetID( m_ID + ";" + page );
  109.                                 pMenu.SetTitle( "Please select a map" );
  110.                                 pMenu.Display( pPlayer, -1 );
  111.                         }

  112.                         void PopulateMapList()
  113.                         {
  114.                                 // Will grab all available maps from the server maps folder.
  115.                                 // This includes addons (custom content) as well.
  116.                                 Globals.GetMaps( s_arraylist );
  117.                                 // Remove if it already exist in the list
  118.                                 for ( uint i = 0; i < s_maplist.length(); i++ )
  119.                                 {
  120.                                         string map = s_maplist[i];
  121.                                         RemoveMapFromList( map );
  122.                                 }
  123.                         }

  124.                         void RemoveMapFromList( const string &in szMap )
  125.                         {
  126.                                 for ( uint n = 0; n < s_arraylist.length(); n++ )
  127.                                 {
  128.                                         string map = s_arraylist[n];
  129.                                         if ( Utils.StrEql( map, szMap ) )
  130.                                         {
  131.                                                 s_arraylist.removeAt( n );
  132.                                                 break;
  133.                                         }
  134.                                 }
  135.                         }

  136.                         bool FillMaps( Menu &out pMenu, uint page )
  137.                         {
  138.                                 // If we reach 7 in length, return false
  139.                                 if ( s_maplist.length() == 7 ) return false;
  140.                                 PopulateMapList();
  141.                                 if ( s_arraylist.length() == 0 ) return false;
  142.                                 int li = 0;
  143.                                 
  144.                                 if ( page == 0 && HasMapVotes() )
  145.                                 {
  146.                                         pMenu.AddItem( "Start Vote" );
  147.                                         li++;
  148.                                 }
  149.                                 
  150.                                 for ( uint i = page; i < s_arraylist.length(); i++ )
  151.                                 {
  152.                                         if ( page >= s_arraylist.length() ) break;
  153.                                         string map = s_arraylist[i];
  154.                                         if ( li > 6 ) break;
  155.                                         if ( li == 5 ) map = map + "\n";
  156.                                         if ( !pMenu.AddItem( map ) ) break;
  157.                                         li++;
  158.                                 }
  159.                                 // Index 8 is always "Back"
  160.                                 // Index 9 is always "Next"
  161.                                 pMenu.SetBack( true );
  162.                                 if ( li > 6 )
  163.                                         pMenu.SetNext( true );
  164.                                 return true;
  165.                         }

  166.                         string GetMapFromResult( uint result )
  167.                         {
  168.                                 if ( HasMapVotes() )
  169.                                         result--;
  170.                                 for ( uint i = 0; i < s_arraylist.length(); i++ )
  171.                                 {
  172.                                         string map = s_arraylist[i];
  173.                                         if ( result == i ) return map;
  174.                                 }
  175.                                 return "";
  176.                         }

  177.                         void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
  178.                         {
  179.                                 if ( HasMapVotes() && result == 0 )
  180.                                 {
  181.                                         BeginMapVote();
  182.                                         return;
  183.                                 }
  184.                                 string map = GetMapFromResult( result );
  185.                                 if ( Utils.StrEql( map, "" ) ) return;
  186.                                 s_maplist.insertLast( map );
  187.                                 s_votes.insertLast( 0 );
  188.                                 OnPageChanged( pPlayer, 0 );
  189.                         }

  190.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  191.                         {
  192.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  193.                                 string arg1 = pArgs.Arg( 1 );        // Page
  194.                                 string arg2 = pArgs.Arg( 2 );        // ID
  195.                                 uint page = parseUInt( arg1 );
  196.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  197.                                 if ( Utils.StrEql( arg2, "vote" ) )
  198.                                 {
  199.                                         switch( iValue )
  200.                                         {
  201.                                                 case 1:
  202.                                                 case 2:
  203.                                                 case 3:
  204.                                                 case 4:
  205.                                                 case 5:
  206.                                                 case 6:
  207.                                                 case 7:
  208.                                                 {
  209.                                                         DoModuleExec( pPlayer, result );
  210.                                                 }
  211.                                                 break;
  212.                                         }
  213.                                         return;
  214.                                 }
  215.                                 switch( iValue )
  216.                                 {
  217.                                         case 1:
  218.                                         case 2:
  219.                                         case 3:
  220.                                         case 4:
  221.                                         case 5:
  222.                                         case 6:
  223.                                         case 7:
  224.                                         {
  225.                                                 ExecuteArgument( pPlayer, result );
  226.                                         }
  227.                                         break;
  228.                                         case 8:
  229.                                         {
  230.                                                 if ( page > 0 )
  231.                                                         OnPageChanged( pPlayer, page - 7 );
  232.                                                 else
  233.                                                         GoBack( pPlayer );
  234.                                         }
  235.                                         break;
  236.                                         case 9:
  237.                                         {
  238.                                                 OnPageChanged( pPlayer, page + 7 );
  239.                                         }
  240.                                         break;
  241.                                 }
  242.                         }

  243.                         string GetMapOfChoice()
  244.                         {
  245.                                 if ( IsSingleMapVote() )
  246.                                         return s_maplist[ 0 ];
  247.                                 return s_maplist[ s_GetBestChoice ];
  248.                         }
  249.                 }
  250.                 CMenuItem @pMapItem = CMenuItem();

  251.                 void RegisterVoteMap()
  252.                 {
  253.                         AdminMenu_RegisterItem( pMapItem );
  254.                 }

  255.                 void AdminMenuItemVoteMap_OnVoteEnd()
  256.                 {
  257.                         pMapItem.GetBestChoice();
  258.                         if ( pMapItem.GetVoteAmount() <= 0 )
  259.                         {
  260.                                 Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Map will not change." );
  261.                                 return;
  262.                         }
  263.                         if ( pMapItem.IsSingleMapVote() )
  264.                         {
  265.                                 if ( pMapItem.GetNoVotes() > pMapItem.GetYesVotes() )
  266.                                 {
  267.                                         Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Voting has finished. The map will not change as {red}No{white} votes exceeds {green}Yes{white} votes by {community}" + pMapItem.GetNoVotePercentage() + "{white}% of {community}" + pMapItem.GetVoteAmount() + "{white} votes" );
  268.                                         return;
  269.                                 }
  270.                         }
  271.                         Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Voting has finished. The next map will be {green}" + pMapItem.GetMapOfChoice() + "{white}. (Received {community}" + pMapItem.GetVotePercentage() + "{white}% of {community}" + pMapItem.GetVoteAmount() + "{white} votes)" );
  272.                         Schedule::Task( 3.0, AdminMenuItemVoteMap_ChangeLevel );
  273.                 }

  274.                 void AdminMenuItemVoteMap_ChangeLevel()
  275.                 {
  276.                         Engine.RunConsoleCommand( "admin map "" + pMapItem.GetMapOfChoice() + """ );
  277.                 }
  278.         }
  279. }
复制代码


vote_restart.as


  1. // Make sure the base interface is included!
  2. #include "vote_base.as"

  3. namespace AdminMenu
  4. {
  5.         namespace Vote
  6.         {
  7.                 class CMenuItemRestart : CAdminMenuItemBase, IBaseVoteMenu
  8.                 {
  9.                         private array<int> s_votes;
  10.                         private uint s_VoteChoice = 0;
  11.                         private bool s_VoteOngoing = false;
  12.                         CMenuItemRestart()
  13.                         {
  14.                                 m_ID = "as_vote_restart";
  15.                                 m_Name = "Vote Restart";
  16.                                 m_Group = GROUP_VOTE_CMD;
  17.                                 m_Level = LEVEL_ADMIN;
  18.                                 Clear();
  19.                         }

  20.                         void Clear()
  21.                         {
  22.                                 // If vote is ongoing, then stop!
  23.                                 if ( s_VoteOngoing ) return;
  24.                                 s_votes.resize(0);
  25.                                 s_VoteChoice = 0;
  26.                         }

  27.                         void GoBack( CTerrorPlayer @pPlayer ) override
  28.                         {
  29.                                 s_VoteOngoing = false;
  30.                                 Clear();
  31.                                 AdminMenu_BackToGroup( pPlayer, m_Group );
  32.                         }

  33.                         void OnItemOpen( CTerrorPlayer @pPlayer ) override
  34.                         {
  35.                                 // If vote is ongoing, then stop!
  36.                                 if ( s_VoteOngoing )
  37.                                 {
  38.                                         CBasePlayer@ pBasePlayer = pPlayer.opCast();
  39.                                         Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
  40.                                         return;
  41.                                 }
  42.                                 Clear();
  43.                                 BeginVote();
  44.                         }

  45.                         int GetVoteAmount()
  46.                         {
  47.                                 int y = 0;
  48.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  49.                                         y += s_votes[i];
  50.                                 return y;
  51.                         }

  52.                         int GetYesVotes() { return s_votes[0]; }
  53.                         int GetNoVotes() { return s_votes[1]; }
  54.                         float GetNoVotePercentage()
  55.                         {
  56.                                 int votes = GetNoVotes() - GetYesVotes();
  57.                                 float percentage = float(votes) / float(GetVoteAmount());
  58.                                 return (percentage * 100);
  59.                         }

  60.                         void GetBestChoice()
  61.                         {
  62.                                 s_VoteOngoing = false;
  63.                                 int votes = 0;
  64.                                 for ( uint i = 0; i < s_votes.length(); i++ )
  65.                                 {
  66.                                         if ( votes > s_votes[i] ) continue;
  67.                                         votes = s_votes[i];
  68.                                         s_VoteChoice = i;
  69.                                 }
  70.                         }

  71.                         float GetVotePercentage()
  72.                         {
  73.                                 int votes = s_votes[s_VoteChoice];
  74.                                 float percentage = float(votes) / float(GetVoteAmount());
  75.                                 return (percentage * 100);
  76.                         }

  77.                         void BeginVote()
  78.                         {
  79.                                 s_VoteOngoing = true;
  80.                                 s_votes.insertLast( 0 );
  81.                                 s_votes.insertLast( 0 );
  82.                                 SetVoteTime( 15, m_ID, "vote", "Restart the round", AdminMenuItemVoteRestart_OnVoteEnd );
  83.                         }

  84.                         void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
  85.                         {
  86.                                 result = Math::clamp( result, 0, 1 );
  87.                                 s_votes[result]++;
  88.                         }

  89.                         void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
  90.                         {
  91.                                 string arg0 = pArgs.Arg( 0 );        // MainID
  92.                                 string arg1 = pArgs.Arg( 1 );        // Page
  93.                                 string arg2 = pArgs.Arg( 2 );        // ID
  94.                                 uint page = parseUInt( arg1 );
  95.                                 uint result = page + iValue - 1; // Reduce 1 for the result
  96.                                 if ( Utils.StrEql( arg2, "vote" ) )
  97.                                 {
  98.                                         switch( iValue )
  99.                                         {
  100.                                                 case 1:
  101.                                                 case 2:
  102.                                                 case 3:
  103.                                                 case 4:
  104.                                                 case 5:
  105.                                                 case 6:
  106.                                                 case 7:
  107.                                                 {
  108.                                                         DoModuleExec( pPlayer, result );
  109.                                                 }
  110.                                                 break;
  111.                                         }
  112.                                         return;
  113.                                 }
  114.                         }
  115.                 }
  116.                 CMenuItemRestart @pMenuItemRestart = CMenuItemRestart();

  117.                 void RegisterVoteRestart()
  118.                 {
  119.                         AdminMenu_RegisterItem( pMenuItemRestart );
  120.                 }

  121.                 void AdminMenuItemVoteRestart_OnVoteEnd()
  122.                 {
  123.                         pMenuItemRestart.GetBestChoice();
  124.                         if ( pMenuItemRestart.GetVoteAmount() <= 0 )
  125.                         {
  126.                                 Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Round will not be restarted." );
  127.                                 return;
  128.                         }
  129.                         if ( pMenuItemRestart.GetNoVotes() > pMenuItemRestart.GetYesVotes() )
  130.                         {
  131.                                 Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Voting has finished. The round will not restart as {red}No{white} votes exceeds {green}Yes{white} votes by {community}" + pMenuItemRestart.GetNoVotePercentage() + "{white}% of {community}" + pMenuItemRestart.GetVoteAmount() + "{white} votes" );
  132.                                 return;
  133.                         }
  134.                         Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Voting has finished. The round will be {green}restarted{white}. (Received {community}" + pMenuItemRestart.GetVotePercentage() + "{white}% of {community}" + pMenuItemRestart.GetVoteAmount() + "{white} votes)" );
  135.                         ThePresident.ForceWinState( STATE_FAIL );
  136.                         // Increase max rounds by 1
  137.                         // That is if it's not set to 0
  138.                         CASConVarRef@ cvar_mp_roundlimit = ConVar::Find( "mp_roundlimit" );
  139.                         if ( cvar_mp_roundlimit is null ) return;
  140.                         int rounds = cvar_mp_roundlimit.GetInt();
  141.                         if ( rounds <= 0 ) return;
  142.                         rounds++;
  143.                         cvar_mp_roundlimit.SetValue( formatInt( rounds ) );
  144.                 }
  145.         }
  146. }
复制代码