官方源代码API:点击查看
源码框架:
adminmenu.as
- //------------------------------------------------------------------------------------------------------------------------//
- #include "admin/core.as"
- #include "admin/base.as"
- //------------------------------------------------------------------------------------------------------------------------//
- void OnPluginInit()
- {
- PluginData::SetVersion( "1.1" );
- PluginData::SetAuthor( "JonnyBoy0719" );
- PluginData::SetName( "Admin Menu" );
- ConCommand::Create( "as_admin", ShowAdminMenu, "Show the admin menu", LEVEL_MODERATOR );
- Events::Player::PlayerSay.Hook( @OnPlayerSay );
- Events::Player::OnMenuExecuted.Hook( @OnMenuExecuted );
- // Register base commands
- AdminMenu::RegisterBaseCommands();
- }
- //------------------------------------------------------------------------------------------------------------------------//
- void OnPluginUnload()
- {
- ConCommand::Remove( "as_admin" );
- }
- //------------------------------------------------------------------------------------------------------------------------//
- void ShowAdminMenu( CTerrorPlayer@ pPlayer, CASCommand@ pArgs )
- {
- GoBackToAdminBase( pPlayer );
- }
- //------------------------------------------------------------------------------------------------------------------------//
- HookReturnCode OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue )
- {
- g_AdminMenu.OnMenuExecuted( pPlayer, szID, iValue );
- return HOOK_HANDLED;
- }
- //------------------------------------------------------------------------------------------------------------------------//
- void AdminMenu_RegisterItem( IAdminMenuItemBase @module )
- {
- if ( module is null ) return;
- g_AdminMenu.RegisterItem( module );
- }
- void AdminMenu_RemoveItem( string module_id )
- {
- g_AdminMenu.RemoveItem( module_id );
- }
- void AdminMenu_BackToGroup( CTerrorPlayer@ pPlayer, int group )
- {
- g_AdminMenu.BackToGroup( pPlayer, group );
- }
- //------------------------------------------------------------------------------------------------------------------------//
- void GoBackToAdminBase( CTerrorPlayer@ pPlayer )
- {
- g_AdminMenu.OpenMenu( pPlayer );
- }
- //------------------------------------------------------------------------------------------------------------------------//
- void ThePresident_OnMapStart()
- {
- g_AdminMenu.OnMapStart();
- }
- //------------------------------------------------------------------------------------------------------------------------//
- HookReturnCode OnPlayerSay( CTerrorPlayer@ pPlayer, CASCommand@ pArgs )
- {
- string arg1 = pArgs.Arg( 1 );
- if ( Utils.StrEql( arg1, "!admin" ) )
- {
- GoBackToAdminBase( pPlayer );
- return HOOK_HANDLED;
- }
- return HOOK_CONTINUE;
- }
复制代码
core.as
- //------------------------------------------------------------------------------------------------------------------------//
- // Interface
- #include "shared/interface.as"
- //------------------------------------------------------------------------------------------------------------------------//
- // Core class
- class CAdminMenu
- {
- //------------------------------------------------------------------------------------------------------------------------//
- IAdminMenuItemBase @GetItemFromResult( CTerrorPlayer@ pPlayer, int groupid, uint result )
- {
- uint li = 0;
- for ( uint i = 0; i < items.length(); i++ )
- {
- IAdminMenuItemBase @pItem = items[i];
- if ( pItem is null ) continue;
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue; // Make sure we have the right access
- if ( pItem.GetGroupID() != groupid ) continue;
- if ( result == li ) return pItem;
- li++;
- }
- return null;
- }
- IAdminMenuItemBase @GetItemFromResult( CTerrorPlayer@ pPlayer, string ItemName )
- {
- for ( uint i = 0; i < items.length(); i++ )
- {
- IAdminMenuItemBase @pItem = items[i];
- if ( pItem is null ) continue;
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue; // Make sure we have the right access
- if ( Utils.StrEql( ItemName, pItem.GetID() ) ) return pItem;
- }
- return null;
- }
- string GetGroupName( int groupid )
- {
- switch( groupid )
- {
- case GROUP_PLAYER_CMD: return "Player Commands:";
- case GROUP_SERVER_CMD: return "Server Commands:";
- case GROUP_VOTE_CMD: return "Vote Commands:";
- }
- return "Unknown Group";
- }
- void AdminGroupCommands( CTerrorPlayer@ pPlayer, int groupid, uint page )
- {
- Menu pMenu;
- pMenu.SetID( "admenu_grp;" + page + ";" + groupid );
- pMenu.SetTitle( GetGroupName( groupid ) );
- int li = 0;
- for ( uint i = page; i < items.length(); i++ )
- {
- IAdminMenuItemBase @pItem = items[i];
- if ( pItem is null ) continue;
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, pItem.GetAccessLevel() ) ) continue; // Make sure we have the right access
- if ( pItem.GetGroupID() != groupid ) continue;
- if ( li <= 6 )
- {
- string szName = pItem.GetName();
- if ( !pMenu.AddItem( szName ) ) break;
- }
- li++;
- }
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 7 )
- pMenu.SetNext( true );
- pMenu.Display( pPlayer, -1 );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue )
- {
- // Sounds
- switch( iValue )
- {
- case 8:
- pPlayer.PlayWwiseSound( "GUI_WindowClose", "", -1 );
- break;
- default:
- pPlayer.PlayWwiseSound( "GUI_MainMenuSelect", "", -1 );
- break;
- }
- CASCommand @pArgs = StringToArgSplit( szID, ";" );
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- // Show the groups
- if ( Utils.StrEql( szID, "adminmenu_base" ) )
- {
- switch( iValue )
- {
- // Player Commands
- case 1: AdminGroupCommands( pPlayer, GROUP_PLAYER_CMD, 0 ); break;
- // Server Commands
- case 2: AdminGroupCommands( pPlayer, GROUP_SERVER_CMD, 0 ); break;
- // Vote Commands
- case 3: AdminGroupCommands( pPlayer, GROUP_VOTE_CMD, 0 ); break;
- }
- }
- // When using the groups
- else if ( Utils.StrEql( arg0, "admenu_grp" ) )
- {
- uint page = parseUInt( arg1 );
- uint groupid = parseUInt( arg2 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- IAdminMenuItemBase @pItem = GetItemFromResult( pPlayer, groupid, result );
- if ( pItem is null ) break;
- pItem.OnItemOpen( pPlayer );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- AdminGroupCommands( pPlayer, groupid, page - 7 );
- else
- OpenMenu( pPlayer );
- }
- break;
- case 9:
- {
- AdminGroupCommands( pPlayer, groupid, page + 7 );
- }
- break;
- }
- }
- // We are now using the menu argument
- else
- {
- IAdminMenuItemBase @pItem = GetItemFromResult( pPlayer, arg0 );
- if ( pItem is null ) return;
- pItem.OnMenuExecuted( pPlayer, pArgs, iValue );
- }
- }
- void OpenMenu( CTerrorPlayer@ pPlayer )
- {
- if ( pPlayer is null ) return;
- if ( !AdminSystem.AdminExist( pPlayer ) )
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white}: You need to be an admin to access this command." );
- return;
- }
- Menu pMenu;
- pMenu.SetID( "adminmenu_base" );
- pMenu.SetTitle( "Admin Menu:" );
- pMenu.AddItem( "Player Commands" );
- pMenu.AddItem( "Server Commands" );
- pMenu.AddItem( "Vote Commands" );
- pMenu.Display( pPlayer, -1 );
- }
- void BackToGroup( CTerrorPlayer@ pPlayer, int group )
- {
- AdminGroupCommands( pPlayer, group, 0 );
- }
- void RegisterItem( IAdminMenuItemBase @module )
- {
- items.insertLast( module );
- }
- void OnMapStart()
- {
- for ( uint i = 0; i < items.length(); i++ )
- {
- IAdminMenuItemBase @pItem = items[i];
- if ( pItem is null ) continue;
- pItem.OnMapStart();
- }
- }
- void RemoveItem( string module_id )
- {
- int index = -1;
- for ( uint i = 0; i < items.length(); i++ )
- {
- IAdminMenuItemBase @pItem = items[i];
- if ( pItem is null ) continue;
- if ( !Utils.StrEql( module_id, pItem.GetID() ) ) continue;
- index = i;
- break;
- }
- if ( index < 0 ) return;
- items.removeAt( index );
- Log.PrintToServerConsole( LOGTYPE_INFO, "Removed Module ID [{gold}" + module_id + "{default}]");
- }
- //------------------------------------------------------------------------------------------------------------------------//
- // Private accessors
- private array<IAdminMenuItemBase@> items;
- }
- CAdminMenu @g_AdminMenu = CAdminMenu();
复制代码
base.as
- //------------------------------------------------------------------------------------------------------------------------//
- // Player Commands
- #include "menu/slay.as"
- #include "menu/slap.as"
- #include "menu/kick.as"
- #include "menu/ban.as"
- #include "menu/burn.as"
- #include "menu/teleport.as"
- #include "menu/mute.as"
- #include "menu/gag.as"
- #include "menu/silence.as"
- // Server Commands
- #include "menu/map.as"
- #include "menu/reloadadmins.as"
- // Vote Commands
- #include "menu/vote_map.as"
- #include "menu/vote_difficulty.as"
- #include "menu/vote_restart.as"
- //------------------------------------------------------------------------------------------------------------------------//
- namespace AdminMenu
- {
- void RegisterBaseCommands()
- {
- // Player Commands
- Slay::Register();
- Slap::Register();
- Kick::Register();
- Ban::Register();
- Burn::Register();
- Teleport::Register();
- Mute::Register();
- Gag::Register();
- Silence::Register();
- // Server Commands
- Map::Register();
- ReloadAdmins::Register();
- // Vote Commands
- Vote::RegisterVoteMap();
- Vote::RegisterVoteDiff();
- Vote::RegisterVoteRestart();
- }
- }
复制代码
interface.as
- //------------------------------------------------------------------------------------------------------------------------//
- // Interface Class
- class IAdminMenu
- {
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, const string &in szID, int &in iValue ) {}
- void OpenMenu( CTerrorPlayer@ pPlayer ) {}
- void OnMapStart() {}
- void BackToGroup( CTerrorPlayer@ pPlayer, int group ) {}
- void RegisterItem( CAdminMenuItemBase @module ) {}
- void RemoveItem( string module_id ) {}
- }
- shared class IAdminMenuItemBase
- {
- protected string m_ID;
- protected string m_Name;
- protected int m_Group;
- protected AdminAccessLevel_t m_Level;
- string GetID() { return m_ID; }
- string GetName() { return m_Name; }
- int GetGroupID() { return m_Group; }
- AdminAccessLevel_t GetAccessLevel() { return m_Level; }
- void OnItemOpen( CTerrorPlayer @pPlayer ) { }
- void OnMapStart() { }
- void GoBack( CTerrorPlayer @pPlayer ) { }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) {}
- }
- //------------------------------------------------------------------------------------------------------------------------//
- // Base Class
- class CAdminMenuItemBase : IAdminMenuItemBase
- {
- void GoBack( CTerrorPlayer @pPlayer ) { AdminMenu_BackToGroup( pPlayer, m_Group ); }
- }
- class CAdminMenuItemTargetBase : CAdminMenuItemBase
- {
- bool FillPlayers( Menu &out pMenu, uint page )
- {
- int li = 0;
- for ( uint i = page; i <= uint(Globals.GetMaxClients()); i++ )
- {
- CTerrorPlayer @pTerror = ToTerrorPlayer( i );
- if ( pTerror is null ) continue;
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- if ( !pTerrorBasePlayer.IsConnected() ) continue; // Don't list those who haven't even connected yet
- if ( pTerror.IsMarkedForKick() ) continue; // Don't list those who has been marked for being kicked, used by the built in "kick" and "ban".
- if ( li <= 6 )
- {
- string szName = pTerror.GetPlayerName();
- if ( !pMenu.AddItem( szName ) ) break;
- }
- li++;
- }
- if ( li == 0 ) return false;
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 7 )
- pMenu.SetNext( true );
- return true;
- }
- CTerrorPlayer @GetPlayerFromResult( uint result )
- {
- uint li = 1;
- for ( uint i = 1; i <= uint(Globals.GetMaxClients()); i++ )
- {
- CTerrorPlayer @pTerror = ToTerrorPlayer( i );
- if ( pTerror is null ) continue;
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- if ( !pTerrorBasePlayer.IsConnected() ) continue; // Don't list those who haven't even connected yet
- if ( pTerror.IsMarkedForKick() ) continue; // Don't list those who has been marked for being kicked, used by the built in "kick" and "ban".
- if ( result == li ) return pTerror;
- li++;
- }
- return null;
- }
- }
- //------------------------------------------------------------------------------------------------------------------------//
- // Static values
- const int GROUP_PLAYER_CMD = 0;
- const int GROUP_SERVER_CMD = 1;
- const int GROUP_VOTE_CMD = 2;
复制代码
ban.as
- namespace AdminMenu
- {
- namespace Ban
- {
- class CMenuItem_Ban : CAdminMenuItemTargetBase
- {
- private array<string> s_banreasons;
- CMenuItem_Ban()
- {
- m_ID = "as_ban";
- m_Name = "Ban player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- PopulateBanReasons();
- }
- void PopulateBanReasons()
- {
- FileSystem::CreateFolder( "adminbase" );
- JsonValues@ temp = FileSystem::ReadFile( "adminbase/banreasons" );
- if ( temp is null )
- {
- s_banreasons.insertLast( "No Reason" );
- return;
- }
- int y = 0;
- while( true )
- {
- string find = "reason" + y;
- if ( FileSystem::Exists( temp, find ) != 0 ) break;
- y++;
- s_banreasons.insertLast( FileSystem::GrabString( temp, find ) );
- }
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool FillReasons( Menu &out pMenu, uint page )
- {
- int li = 0;
- for ( uint i = page; i < s_banreasons.length(); i++ )
- {
- string reason = s_banreasons[i];
- if ( li > 6 ) break;
- if ( li == 5 ) reason = reason + "\n";
- if ( !pMenu.AddItem( reason ) ) break;
- li++;
- }
- if ( li == 0 ) return false;
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 6 )
- pMenu.SetNext( true );
- return true;
- }
- void ShowBanTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
- {
- Menu pMenu;
- pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
- pMenu.SetTitle( "Ban time:" );
- pMenu.AddItem( "Permanent" );
- pMenu.AddItem( "10 Minutes" );
- pMenu.AddItem( "30 Minutes" );
- pMenu.AddItem( "1 Hour" );
- pMenu.AddItem( "4 Hours" );
- pMenu.AddItem( "1 Day" );
- pMenu.AddItem( "1 Week" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- string GetBanReasonFromResult( uint result )
- {
- uint li = 0;
- for ( uint i = 0; i < s_banreasons.length(); i++ )
- {
- string reason = s_banreasons[i];
- if ( result == li ) return reason;
- li++;
- }
- return "";
- }
- string BanTime( int iLength )
- {
- string ret( "for {gold}" );
- switch( iLength )
- {
- case 0: ret = "Permanently"; break;
- case 10: ret += "10 Minutes"; break;
- case 30: ret += "30 Minutes"; break;
- case 60: ret += "1 Hour"; break;
- case 240: ret += "4 Hours"; break;
- case 1440: ret += "1 Day"; break;
- case 10080: ret += "1 Week"; break;
- }
- return ret;
- }
- void DoBan( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string reason = GetBanReasonFromResult( result_reason );
- if ( Utils.StrEql( reason, "" ) ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently ban {limegreen}" + szName );
- OnPageChanged( pPlayer, 1 );
- return;
- }
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Banned {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );
- AdminSystem.Ban( pTerror, iLength, reason );
- OnPageChanged( pPlayer, 1 );
- }
- void ShowBanReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
- {
- Menu pMenu;
- if ( !FillReasons( pMenu, page ) )
- {
- OnPageChanged( pPlayer, 1 );
- return;
- }
- pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
- pMenu.SetTitle( "Ban reason:" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return false;
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- CBaseEntity@ pSelf = pBasePlayer.opCast();
- if ( pSelf.entindex() == pBaseEntity.entindex() )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot ban yourself!" );
- return false;
- }
- ShowBanReasonsMenu( pPlayer, result, 0 );
- return true;
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- string arg3 = pArgs.Arg( 3 ); // Target
- string arg4 = pArgs.Arg( 4 ); // Reason
- uint page = parseUInt( arg1 );
- uint target = parseUInt( arg3 );
- uint result_reason = parseUInt( arg4 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "time" ) )
- {
- switch( iValue )
- {
- case 1:
- {
- DoBan( pPlayer, target, 0, result_reason );
- }
- break;
- case 2:
- {
- DoBan( pPlayer, target, 10, result_reason );
- }
- break;
- case 3:
- {
- DoBan( pPlayer, target, 30, result_reason );
- }
- break;
- case 4:
- {
- DoBan( pPlayer, target, 60, result_reason );
- }
- break;
- case 5:
- {
- DoBan( pPlayer, target, 240, result_reason );
- }
- break;
- case 6:
- {
- DoBan( pPlayer, target, 1440, result_reason );
- }
- break;
- case 7:
- {
- DoBan( pPlayer, target, 10080, result_reason );
- }
- break;
- case 8:
- ShowBanReasonsMenu( pPlayer, target, 0 );
- break;
- }
- return;
- }
- else if ( Utils.StrEql( arg2, "reason" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ShowBanTimeMenu( pPlayer, target, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- ShowBanReasonsMenu( pPlayer, target, page - 7 );
- else
- OnPageChanged( pPlayer, 1 );
- }
- break;
- case 9:
- {
- ShowBanReasonsMenu( pPlayer, target, page + 7 );
- }
- break;
- }
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- if ( !ExecuteArgument( pPlayer, result ) )
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Ban() );
- }
- }
- }
复制代码
burn.as
- namespace AdminMenu
- {
- namespace Burn
- {
- class CMenuItem_Burn : CAdminMenuItemTargetBase
- {
- CMenuItem_Burn()
- {
- m_ID = "as_burn";
- m_Name = "Burn player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} " + szName + " has been set on fire" );
- // Take damage
- CTakeDamageInfo info = CTakeDamageInfo( pBaseEntity, pBaseEntity, 8, DMG_BURN );
- pBaseEntity.TakeDamage( info );
- pBaseEntity.Ignite( 3.5f );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Burn() );
- }
- }
- }
复制代码
kick.as
- namespace AdminMenu
- {
- namespace Kick
- {
- class CMenuItem_Kick : CAdminMenuItemTargetBase
- {
- CMenuItem_Kick()
- {
- m_ID = "as_kick";
- m_Name = "Kick player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- CBaseEntity@ pSelf = pBasePlayer.opCast();
- if ( pSelf.entindex() == pBaseEntity.entindex() )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot kick yourself!" );
- return;
- }
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Kicked " + szName );
- AdminSystem.Kick( pTerror, "Kicked by server admin" );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Kick() );
- }
- }
- }
复制代码
map.as
- namespace AdminMenu
- {
- namespace Map
- {
- // This choose map structure was inspired by the SourceMod one
- class CMenuItem : CAdminMenuItemBase
- {
- private array<string> s_maplist;
- private string s_map;
- string GetMapOfChoice() { return s_map; }
- CMenuItem()
- {
- m_ID = "as_map";
- m_Name = "Choose Map";
- m_Group = GROUP_SERVER_CMD;
- m_Level = LEVEL_ADMIN;
- PopulateMapList();
- }
- void PopulateMapList()
- {
- // Will grab all available maps from the server maps folder.
- // This includes addons (custom content) as well.
- Globals.GetMaps( s_maplist );
- s_map = "";
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 0 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillMaps( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( "Please select a map" );
- pMenu.Display( pPlayer, -1 );
- }
- void FillMaps( Menu &out pMenu, uint page )
- {
- PopulateMapList();
- int li = 0;
- for ( uint i = page; i < s_maplist.length(); i++ )
- {
- if ( page >= s_maplist.length() ) break;
- string map = s_maplist[i];
- if ( li > 6 ) break;
- if ( li == 5 ) map = map + "\n";
- if ( !pMenu.AddItem( map ) ) break;
- li++;
- }
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 6 )
- pMenu.SetNext( true );
- }
- string GetMapFromResult( uint result )
- {
- for ( uint i = 0; i < s_maplist.length(); i++ )
- {
- string map = s_maplist[i];
- if ( result == i ) return map;
- }
- return "";
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- string map = GetMapFromResult( result );
- if ( Utils.StrEql( map, "" ) ) return;
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Changing map to {green}" + map + "{white}..." );
- s_map = map;
- Schedule::Task( 3.0, AdminMenuItemMap_ChangeLevel );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- CMenuItem @pMapItem = CMenuItem();
- void Register()
- {
- AdminMenu_RegisterItem( pMapItem );
- }
- void AdminMenuItemMap_ChangeLevel()
- {
- Engine.RunConsoleCommand( "admin map "" + pMapItem.GetMapOfChoice() + """ );
- }
- }
- }
复制代码
mute.as
- namespace AdminMenu
- {
- namespace Mute
- {
- class CMenuItem : CAdminMenuItemTargetBase
- {
- private array<string> s_reasons;
- CMenuItem()
- {
- m_ID = "as_mute";
- m_Name = "Mute player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- PopulateBanReasons();
- }
- void PopulateBanReasons()
- {
- FileSystem::CreateFolder( "adminbase" );
- JsonValues@ temp = FileSystem::ReadFile( "adminbase/commreasons" );
- if ( temp is null )
- {
- s_reasons.insertLast( "No Reason" );
- return;
- }
- int y = 0;
- while( true )
- {
- string find = "reason" + y;
- if ( FileSystem::Exists( temp, find ) != 0 ) break;
- y++;
- s_reasons.insertLast( FileSystem::GrabString( temp, find ) );
- }
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool FillReasons( Menu &out pMenu, uint page )
- {
- int li = 0;
- for ( uint i = page; i < s_reasons.length(); i++ )
- {
- string reason = s_reasons[i];
- if ( li > 6 ) break;
- if ( li == 5 ) reason = reason + "\n";
- if ( !pMenu.AddItem( reason ) ) break;
- li++;
- }
- if ( li == 0 ) return false;
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 6 )
- pMenu.SetNext( true );
- return true;
- }
- void ShowTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
- {
- Menu pMenu;
- pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
- pMenu.SetTitle( "Mute time:" );
- pMenu.AddItem( "Permanent" );
- pMenu.AddItem( "10 Minutes" );
- pMenu.AddItem( "30 Minutes" );
- pMenu.AddItem( "1 Hour" );
- pMenu.AddItem( "4 Hours" );
- pMenu.AddItem( "1 Day" );
- pMenu.AddItem( "1 Week" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- string GetBanReasonFromResult( uint result )
- {
- uint li = 0;
- for ( uint i = 0; i < s_reasons.length(); i++ )
- {
- string reason = s_reasons[i];
- if ( result == li ) return reason;
- li++;
- }
- return "";
- }
- string BanTime( int iLength )
- {
- string ret( "for {gold}" );
- switch( iLength )
- {
- case 0: ret = "Permanently"; break;
- case 10: ret += "10 Minutes"; break;
- case 30: ret += "30 Minutes"; break;
- case 60: ret += "1 Hour"; break;
- case 240: ret += "4 Hours"; break;
- case 1440: ret += "1 Day"; break;
- case 10080: ret += "1 Week"; break;
- }
- return ret;
- }
- void DoModuleExec( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string reason = GetBanReasonFromResult( result_reason );
- if ( Utils.StrEql( reason, "" ) ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently mute {limegreen}" + szName );
- OnPageChanged( pPlayer, 1 );
- return;
- }
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Muted {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );
- AdminSystem.Mute( pTerror, iLength, true, reason );
- OnPageChanged( pPlayer, 1 );
- }
- void ShowReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
- {
- Menu pMenu;
- if ( !FillReasons( pMenu, page ) )
- {
- OnPageChanged( pPlayer, 1 );
- return;
- }
- pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
- pMenu.SetTitle( "Mute reason:" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return false;
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- CBaseEntity@ pSelf = pBasePlayer.opCast();
- if ( pSelf.entindex() == pBaseEntity.entindex() )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot mute yourself!" );
- return false;
- }
- ShowReasonsMenu( pPlayer, result, 0 );
- return true;
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- string arg3 = pArgs.Arg( 3 ); // Target
- string arg4 = pArgs.Arg( 4 ); // Reason
- uint page = parseUInt( arg1 );
- uint target = parseUInt( arg3 );
- uint result_reason = parseUInt( arg4 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "time" ) )
- {
- switch( iValue )
- {
- case 1:
- {
- DoModuleExec( pPlayer, target, 0, result_reason );
- }
- break;
- case 2:
- {
- DoModuleExec( pPlayer, target, 10, result_reason );
- }
- break;
- case 3:
- {
- DoModuleExec( pPlayer, target, 30, result_reason );
- }
- break;
- case 4:
- {
- DoModuleExec( pPlayer, target, 60, result_reason );
- }
- break;
- case 5:
- {
- DoModuleExec( pPlayer, target, 240, result_reason );
- }
- break;
- case 6:
- {
- DoModuleExec( pPlayer, target, 1440, result_reason );
- }
- break;
- case 7:
- {
- DoModuleExec( pPlayer, target, 10080, result_reason );
- }
- break;
- case 8:
- ShowReasonsMenu( pPlayer, target, 0 );
- break;
- }
- return;
- }
- else if ( Utils.StrEql( arg2, "reason" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ShowTimeMenu( pPlayer, target, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- ShowReasonsMenu( pPlayer, target, page - 7 );
- else
- OnPageChanged( pPlayer, 1 );
- }
- break;
- case 9:
- {
- ShowReasonsMenu( pPlayer, target, page + 7 );
- }
- break;
- }
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- if ( !ExecuteArgument( pPlayer, result ) )
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem() );
- }
- }
- }
复制代码
reloadadmins.as
- namespace AdminMenu
- {
- namespace ReloadAdmins
- {
- class CMenuItem : CAdminMenuItemBase
- {
- CMenuItem()
- {
- m_ID = "as_reloadadmins";
- m_Name = "Reload admins";
- m_Group = GROUP_SERVER_CMD;
- m_Level = LEVEL_SUPERADMIN;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Reloaded Admins" );
- Engine.RunConsoleCommand( "admin_rebuild" );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem() );
- }
- }
- }
复制代码
silence.as
- namespace AdminMenu
- {
- namespace Silence
- {
- class CMenuItem : CAdminMenuItemTargetBase
- {
- private array<string> s_reasons;
- CMenuItem()
- {
- m_ID = "as_silence";
- m_Name = "Silence player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- PopulateBanReasons();
- }
- void PopulateBanReasons()
- {
- FileSystem::CreateFolder( "adminbase" );
- JsonValues@ temp = FileSystem::ReadFile( "adminbase/commreasons" );
- if ( temp is null )
- {
- s_reasons.insertLast( "No Reason" );
- return;
- }
- int y = 0;
- while( true )
- {
- string find = "reason" + y;
- if ( FileSystem::Exists( temp, find ) != 0 ) break;
- y++;
- s_reasons.insertLast( FileSystem::GrabString( temp, find ) );
- }
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool FillReasons( Menu &out pMenu, uint page )
- {
- int li = 0;
- for ( uint i = page; i < s_reasons.length(); i++ )
- {
- string reason = s_reasons[i];
- if ( li > 6 ) break;
- if ( li == 5 ) reason = reason + "\n";
- if ( !pMenu.AddItem( reason ) ) break;
- li++;
- }
- if ( li == 0 ) return false;
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 6 )
- pMenu.SetNext( true );
- return true;
- }
- void ShowTimeMenu( CTerrorPlayer@ pPlayer, uint target, uint result )
- {
- Menu pMenu;
- pMenu.SetID( m_ID + ";1;time;" + target + ";" + result );
- pMenu.SetTitle( "Silence time:" );
- pMenu.AddItem( "Permanent" );
- pMenu.AddItem( "10 Minutes" );
- pMenu.AddItem( "30 Minutes" );
- pMenu.AddItem( "1 Hour" );
- pMenu.AddItem( "4 Hours" );
- pMenu.AddItem( "1 Day" );
- pMenu.AddItem( "1 Week" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- string GetBanReasonFromResult( uint result )
- {
- uint li = 0;
- for ( uint i = 0; i < s_reasons.length(); i++ )
- {
- string reason = s_reasons[i];
- if ( result == li ) return reason;
- li++;
- }
- return "";
- }
- string BanTime( int iLength )
- {
- string ret( "for {gold}" );
- switch( iLength )
- {
- case 0: ret = "Permanently"; break;
- case 10: ret += "10 Minutes"; break;
- case 30: ret += "30 Minutes"; break;
- case 60: ret += "1 Hour"; break;
- case 240: ret += "4 Hours"; break;
- case 1440: ret += "1 Day"; break;
- case 10080: ret += "1 Week"; break;
- }
- return ret;
- }
- void DoModuleExec( CTerrorPlayer@ pPlayer, uint result, int iLength, uint result_reason )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string reason = GetBanReasonFromResult( result_reason );
- if ( Utils.StrEql( reason, "" ) ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- if ( !AdminSystem.PlayerHasAccessLevel( pPlayer, LEVEL_ADMIN ) && iLength <= 0 )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You don't have enough permission to permanently silenced {limegreen}" + szName );
- OnPageChanged( pPlayer, 1 );
- return;
- }
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Silence {limegreen}" + szName + " {white}" + BanTime( iLength ) + "{white}\nReason: {cyan}" + reason );
- AdminSystem.Gag( pTerror, iLength, true, reason );
- AdminSystem.Mute( pTerror, iLength, true, reason );
- OnPageChanged( pPlayer, 1 );
- }
- void ShowReasonsMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
- {
- Menu pMenu;
- if ( !FillReasons( pMenu, page ) )
- {
- OnPageChanged( pPlayer, 1 );
- return;
- }
- pMenu.SetID( m_ID + ";" + page + ";reason;" + result );
- pMenu.SetTitle( "Silence reason:" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return false;
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- CBaseEntity@ pSelf = pBasePlayer.opCast();
- if ( pSelf.entindex() == pBaseEntity.entindex() )
- {
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{red} You cannot silence yourself!" );
- return false;
- }
- ShowReasonsMenu( pPlayer, result, 0 );
- return true;
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- string arg3 = pArgs.Arg( 3 ); // Target
- string arg4 = pArgs.Arg( 4 ); // Reason
- uint page = parseUInt( arg1 );
- uint target = parseUInt( arg3 );
- uint result_reason = parseUInt( arg4 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "time" ) )
- {
- switch( iValue )
- {
- case 1:
- {
- DoModuleExec( pPlayer, target, 0, result_reason );
- }
- break;
- case 2:
- {
- DoModuleExec( pPlayer, target, 10, result_reason );
- }
- break;
- case 3:
- {
- DoModuleExec( pPlayer, target, 30, result_reason );
- }
- break;
- case 4:
- {
- DoModuleExec( pPlayer, target, 60, result_reason );
- }
- break;
- case 5:
- {
- DoModuleExec( pPlayer, target, 240, result_reason );
- }
- break;
- case 6:
- {
- DoModuleExec( pPlayer, target, 1440, result_reason );
- }
- break;
- case 7:
- {
- DoModuleExec( pPlayer, target, 10080, result_reason );
- }
- break;
- case 8:
- ShowReasonsMenu( pPlayer, target, 0 );
- break;
- }
- return;
- }
- else if ( Utils.StrEql( arg2, "reason" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ShowTimeMenu( pPlayer, target, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- ShowReasonsMenu( pPlayer, target, page - 7 );
- else
- OnPageChanged( pPlayer, 1 );
- }
- break;
- case 9:
- {
- ShowReasonsMenu( pPlayer, target, page + 7 );
- }
- break;
- }
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- if ( !ExecuteArgument( pPlayer, result ) )
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem() );
- }
- }
- }
复制代码
slap.as
- namespace AdminMenu
- {
- namespace Slap
- {
- class CMenuItem_Slap : CAdminMenuItemTargetBase
- {
- CMenuItem_Slap()
- {
- m_ID = "as_slap";
- m_Name = "Slap player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- void ShowSlapMenu( CTerrorPlayer@ pPlayer, uint result )
- {
- Menu pMenu;
- pMenu.SetID( m_ID + ";" + 1 + ";slap;" + result );
- pMenu.SetTitle( "Slap damage:" );
- pMenu.AddItem( "0" );
- pMenu.AddItem( "1" );
- pMenu.AddItem( "5" );
- pMenu.AddItem( "10" );
- pMenu.AddItem( "20" );
- pMenu.AddItem( "50" );
- pMenu.AddItem( "99" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
-
- void PerformSlap( CTerrorPlayer@ pPlayer, uint result, int &in iValue )
- {
- switch( iValue )
- {
- case 1:
- {
- DoSlapDamage( pPlayer, result, 0 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 2:
- {
- DoSlapDamage( pPlayer, result, 1 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 3:
- {
- DoSlapDamage( pPlayer, result, 5 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 4:
- {
- DoSlapDamage( pPlayer, result, 10 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 5:
- {
- DoSlapDamage( pPlayer, result, 20 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 6:
- {
- DoSlapDamage( pPlayer, result, 50 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 7:
- {
- DoSlapDamage( pPlayer, result, 99 );
- ShowSlapMenu( pPlayer, result );
- }
- break;
- case 8:
- OnPageChanged( pPlayer, 1 );
- break;
- }
- }
- void DoSlapDamage( CTerrorPlayer@ pPlayer, uint result, int damage )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Slapped " + szName );
- // Slap em!
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- Vector velocity = pBaseEntity.GetAbsVelocity();
- velocity.x += Math::RandomInt( 50, 180 ) * ((Math::RandomInt( 0, 2 ) == 1) ? -1 : 1);
- velocity.y += Math::RandomInt( 50, 180 ) * ((Math::RandomInt( 0, 2 ) == 1) ? -1 : 1);
- velocity.z += Math::RandomInt( 100, 200 );
- pBaseEntity.ApplyVelocity( velocity );
- // Take damage
- CTakeDamageInfo info = CTakeDamageInfo( pBaseEntity, pBaseEntity, damage, DMG_CRUSH );
- pBaseEntity.TakeDamage( info );
- pTerror.PlayWwiseSound( "SFX_ImpactBreak_Flesh", "", -1 );
- }
- bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return false;
- ShowSlapMenu( pPlayer, result );
- return true;
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- if ( Utils.StrEql( arg2, "slap" ) )
- {
- string arg3 = pArgs.Arg( 3 ); // Target
- uint target = parseUInt( arg3 );
- PerformSlap( pPlayer, target, iValue );
- return;
- }
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- if ( !ExecuteArgument( pPlayer, result ) )
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Slap() );
- }
- }
- }
复制代码
slay.as
- namespace AdminMenu
- {
- namespace Slay
- {
- class CMenuItem_Slay : CAdminMenuItemTargetBase
- {
- CMenuItem_Slay()
- {
- m_ID = "as_slay";
- m_Name = "Slay player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- string szName = pTerror.GetPlayerName();
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Slayed " + szName );
- Engine.RunConsoleCommand( "admin slay !" + pBaseEntity.entindex() );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Slay() );
- }
- }
- }
复制代码
teleport.as
- namespace AdminMenu
- {
- namespace Teleport
- {
- class CMenuItem_Teleport : CAdminMenuItemTargetBase
- {
- CMenuItem_Teleport()
- {
- m_ID = "as_tele";
- m_Name = "Teleport player";
- m_Group = GROUP_PLAYER_CMD;
- m_Level = LEVEL_MODERATOR;
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- OnPageChanged( pPlayer, 1 );
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- FillPlayers( pMenu, page );
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( m_Name );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- void ShowTeleportToMenu( CTerrorPlayer@ pPlayer, uint result, uint page )
- {
- Menu pMenu;
- if ( !FillPlayers( pMenu, page ) )
- {
- OnPageChanged( pPlayer, 1 );
- return;
- }
- pMenu.SetID( m_ID + ";" + page + ";tele;" + result );
- pMenu.SetTitle( "Teleport destination:" );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return false;
- ShowTeleportToMenu( pPlayer, result, 1 );
- return true;
- }
- void DoTeleport( CTerrorPlayer@ pPlayer, uint result, uint result_dest )
- {
- CTerrorPlayer @pTerror = GetPlayerFromResult( result );
- if ( pTerror is null ) return;
- CTerrorPlayer @pTerrorDest = GetPlayerFromResult( result_dest );
- if ( pTerrorDest is null ) return;
- string szName = pTerror.GetPlayerName();
- string szNameDest = pTerrorDest.GetPlayerName();
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} Teleported {limegreen}" + szName + "{white} to {cyan}" + szNameDest );
- CBasePlayer@ pTerrorBasePlayer = pTerror.opCast();
- CBaseEntity@ pBaseEntity = pTerrorBasePlayer.opCast();
- CBasePlayer@ pTerrorBasePlayerDest = pTerrorDest.opCast();
- CBaseEntity@ pBaseEntityDest = pTerrorBasePlayerDest.opCast();
- // Teleport to this new origin
- pBaseEntity.SetAbsOrigin( pBaseEntityDest.GetAbsOrigin() );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // Value
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "tele" ) )
- {
- string arg3 = pArgs.Arg( 3 ); // Target
- uint target = parseUInt( arg3 );
- DoTeleport( pPlayer, target, result );
- OnPageChanged( pPlayer, 1 );
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- if ( !ExecuteArgument( pPlayer, result ) )
- OnPageChanged( pPlayer, page );
- }
- break;
- case 8:
- {
- if ( page > 1 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- }
- void Register()
- {
- AdminMenu_RegisterItem( CMenuItem_Teleport() );
- }
- }
- }
复制代码
vote_base.as
- namespace AdminMenu
- {
- namespace Vote
- {
- mixin class IBaseVoteMenu
- {
- void SetVoteTime( float flVal, string szMenuID, string szID, string szTitle, array<string> &in aItems, CallbackFunc @func )
- {
- Menu pMenu;
- pMenu.SetID( szMenuID + ";0;" + szID );
- pMenu.SetTitle( szTitle );
- if ( aItems.length() == 1 )
- {
- pMenu.AddItem( "Yes" );
- pMenu.AddItem( "No" );
- }
- else
- {
- for ( uint i = 0; i < aItems.length(); i++ )
- {
- if ( !pMenu.AddItem( aItems[i] ) ) break;
- }
- }
- pMenu.Display( null, int(flVal) );
- Schedule::Task( flVal, func );
- }
- void SetVoteTime( float flVal, string szMenuID, string szID, string szTitle, CallbackFunc @func )
- {
- Menu pMenu;
- pMenu.SetID( szMenuID + ";0;" + szID );
- pMenu.SetTitle( szTitle );
- pMenu.AddItem( "Yes" );
- pMenu.AddItem( "No" );
- pMenu.Display( null, int(flVal) );
- Schedule::Task( flVal, func );
- }
- }
- }
- }
复制代码
vote_difficulty.as
- // Make sure the base interface is included!
- #include "vote_base.as"
- namespace AdminMenu
- {
- namespace Vote
- {
- class CMenuItemDiff : CAdminMenuItemBase, IBaseVoteMenu
- {
- private array<int> s_votes;
- private uint s_DifficultyChoice = 0;
- private uint s_GetBestChoice = 0;
- private bool s_VoteOngoing = false;
- CMenuItemDiff()
- {
- m_ID = "as_vote_diff";
- m_Name = "Vote Difficulty";
- m_Group = GROUP_VOTE_CMD;
- m_Level = LEVEL_ADMIN;
- Clear();
- }
- void Clear()
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing ) return;
- s_votes.resize(0);
- s_DifficultyChoice = 0;
- s_GetBestChoice = 0;
- }
- void GoBack( CTerrorPlayer @pPlayer ) override
- {
- s_VoteOngoing = false;
- Clear();
- AdminMenu_BackToGroup( pPlayer, m_Group );
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing )
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
- return;
- }
- Clear();
- OnPageChanged( pPlayer, 0 );
- }
- int GetVoteAmount()
- {
- int y = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- y += s_votes[i];
- return y;
- }
- int GetYesVotes() { return s_votes[0]; }
- int GetNoVotes() { return s_votes[1]; }
- float GetNoVotePercentage()
- {
- int votes = GetNoVotes() - GetYesVotes();
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- void GetBestChoice()
- {
- s_VoteOngoing = false;
- int votes = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- {
- if ( votes > s_votes[i] ) continue;
- votes = s_votes[i];
- s_GetBestChoice = i;
- }
- }
- float GetVotePercentage()
- {
- int votes = s_votes[s_GetBestChoice];
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- void BeginMapVote()
- {
- s_VoteOngoing = true;
- SetVoteTime( 15, m_ID, "vote", "Change difficulty to " + GetDiffName( s_DifficultyChoice ), AdminMenuItemVoteDiff_OnVoteEnd );
- }
- void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
- {
- result = Math::clamp( result, 0, 1 );
- s_votes[result]++;
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( "Please select difficulty" );
- pMenu.AddItem( GetDiffName( 0 ) );
- pMenu.AddItem( GetDiffName( 1 ) );
- pMenu.AddItem( GetDiffName( 2 ) );
- pMenu.AddItem( GetDiffName( 3 ) );
- pMenu.AddItem( GetDiffName( 4 ) );
- pMenu.SetBack( true );
- pMenu.Display( pPlayer, -1 );
- }
- bool IsSameDiff( CTerrorPlayer@ pPlayer, uint result )
- {
- CASConVarRef@ cvar_difficulty = ConVar::Find( "difficulty" );
- if ( cvar_difficulty is null ) return false;
- if ( cvar_difficulty.GetInt() == int(result) )
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} The game is already on this difficulty." );
- return true;
- }
- return false;
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- if ( IsSameDiff( pPlayer, result ) )
- {
- OnPageChanged( pPlayer, 0 );
- return;
- }
- s_DifficultyChoice = result;
- s_votes.insertLast( 0 );
- s_votes.insertLast( 0 );
- BeginMapVote();
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // ID
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "vote" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- DoModuleExec( pPlayer, result );
- }
- break;
- }
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- string GetDiffName( uint id )
- {
- switch( id )
- {
- case 0: return "Easy";
- case 1: return "Normal";
- case 2: return "Hard";
- case 3: return "Extreme";
- case 4: return "Nightmare";
- }
- return "Error";
- }
- int GetChoosenDiff()
- {
- return s_DifficultyChoice;
- }
- string GetChoosenName()
- {
- return GetDiffName( s_DifficultyChoice );
- }
- }
- CMenuItemDiff @pMenuItem = CMenuItemDiff();
- void RegisterVoteDiff()
- {
- AdminMenu_RegisterItem( pMenuItem );
- }
- void AdminMenuItemVoteDiff_OnVoteEnd()
- {
- pMenuItem.GetBestChoice();
- if ( pMenuItem.GetVoteAmount() <= 0 )
- {
- Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Difficulty will not change." );
- return;
- }
- if ( pMenuItem.GetNoVotes() > pMenuItem.GetYesVotes() )
- {
- 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" );
- return;
- }
- 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)" );
- Engine.RunConsoleCommand( "admin difficulty "" + pMenuItem.GetChoosenDiff() + """ );
- }
- }
- }
复制代码
vote_map.as
- // Make sure the base interface is included!
- #include "vote_base.as"
- namespace AdminMenu
- {
- namespace Vote
- {
- class CMenuItem : CAdminMenuItemBase, IBaseVoteMenu
- {
- private array<string> s_arraylist;
- private array<string> s_maplist;
- private array<int> s_votes;
- private int s_GetBestChoice = 0;
- private bool s_VoteOngoing = false;
- CMenuItem()
- {
- m_ID = "as_vote_map";
- m_Name = "Vote Map";
- m_Group = GROUP_VOTE_CMD;
- m_Level = LEVEL_ADMIN;
- Clear();
- }
- void Clear()
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing ) return;
- s_arraylist.resize(0);
- s_maplist.resize(0);
- s_votes.resize(0);
- s_GetBestChoice = 0;
- }
- void GoBack( CTerrorPlayer @pPlayer ) override
- {
- s_VoteOngoing = false;
- Clear();
- AdminMenu_BackToGroup( pPlayer, m_Group );
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing )
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
- return;
- }
- Clear();
- OnPageChanged( pPlayer, 0 );
- }
- bool HasMapVotes() { return (s_maplist.length() > 0) ? true : false; }
- bool IsSingleMapVote() { return (s_maplist.length() == 1) ? true : false; }
- int GetVoteAmount()
- {
- int y = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- y += s_votes[i];
- return y;
- }
- int GetYesVotes() { return s_votes[0]; }
- int GetNoVotes() { return s_votes[1]; }
- void GetBestChoice()
- {
- s_VoteOngoing = false;
- int votes = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- {
- if ( votes > s_votes[i] ) continue;
- votes = s_votes[i];
- s_GetBestChoice = i;
- }
- }
- float GetNoVotePercentage()
- {
- int votes = GetNoVotes() - GetYesVotes();
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- float GetVotePercentage()
- {
- int votes = s_votes[s_GetBestChoice];
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- void BeginMapVote()
- {
- s_VoteOngoing = true;
- string szTitle = "Map Vote";
- if ( IsSingleMapVote() )
- {
- szTitle = "Change Map To " + s_maplist[ 0 ];
- s_votes.insertLast( 0 );
- }
- SetVoteTime( 15, m_ID, "vote", szTitle, s_maplist, AdminMenuItemVoteMap_OnVoteEnd );
- }
- void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
- {
- if ( IsSingleMapVote() )
- result = Math::clamp( result, 0, 1 );
- s_votes[result]++;
- }
- void OnPageChanged( CTerrorPlayer @pPlayer, uint page )
- {
- Menu pMenu;
- if ( !FillMaps( pMenu, page ) )
- {
- BeginMapVote();
- return;
- }
- pMenu.SetID( m_ID + ";" + page );
- pMenu.SetTitle( "Please select a map" );
- pMenu.Display( pPlayer, -1 );
- }
- void PopulateMapList()
- {
- // Will grab all available maps from the server maps folder.
- // This includes addons (custom content) as well.
- Globals.GetMaps( s_arraylist );
- // Remove if it already exist in the list
- for ( uint i = 0; i < s_maplist.length(); i++ )
- {
- string map = s_maplist[i];
- RemoveMapFromList( map );
- }
- }
- void RemoveMapFromList( const string &in szMap )
- {
- for ( uint n = 0; n < s_arraylist.length(); n++ )
- {
- string map = s_arraylist[n];
- if ( Utils.StrEql( map, szMap ) )
- {
- s_arraylist.removeAt( n );
- break;
- }
- }
- }
- bool FillMaps( Menu &out pMenu, uint page )
- {
- // If we reach 7 in length, return false
- if ( s_maplist.length() == 7 ) return false;
- PopulateMapList();
- if ( s_arraylist.length() == 0 ) return false;
- int li = 0;
-
- if ( page == 0 && HasMapVotes() )
- {
- pMenu.AddItem( "Start Vote" );
- li++;
- }
-
- for ( uint i = page; i < s_arraylist.length(); i++ )
- {
- if ( page >= s_arraylist.length() ) break;
- string map = s_arraylist[i];
- if ( li > 6 ) break;
- if ( li == 5 ) map = map + "\n";
- if ( !pMenu.AddItem( map ) ) break;
- li++;
- }
- // Index 8 is always "Back"
- // Index 9 is always "Next"
- pMenu.SetBack( true );
- if ( li > 6 )
- pMenu.SetNext( true );
- return true;
- }
- string GetMapFromResult( uint result )
- {
- if ( HasMapVotes() )
- result--;
- for ( uint i = 0; i < s_arraylist.length(); i++ )
- {
- string map = s_arraylist[i];
- if ( result == i ) return map;
- }
- return "";
- }
- void ExecuteArgument( CTerrorPlayer@ pPlayer, uint result )
- {
- if ( HasMapVotes() && result == 0 )
- {
- BeginMapVote();
- return;
- }
- string map = GetMapFromResult( result );
- if ( Utils.StrEql( map, "" ) ) return;
- s_maplist.insertLast( map );
- s_votes.insertLast( 0 );
- OnPageChanged( pPlayer, 0 );
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // ID
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "vote" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- DoModuleExec( pPlayer, result );
- }
- break;
- }
- return;
- }
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- ExecuteArgument( pPlayer, result );
- }
- break;
- case 8:
- {
- if ( page > 0 )
- OnPageChanged( pPlayer, page - 7 );
- else
- GoBack( pPlayer );
- }
- break;
- case 9:
- {
- OnPageChanged( pPlayer, page + 7 );
- }
- break;
- }
- }
- string GetMapOfChoice()
- {
- if ( IsSingleMapVote() )
- return s_maplist[ 0 ];
- return s_maplist[ s_GetBestChoice ];
- }
- }
- CMenuItem @pMapItem = CMenuItem();
- void RegisterVoteMap()
- {
- AdminMenu_RegisterItem( pMapItem );
- }
- void AdminMenuItemVoteMap_OnVoteEnd()
- {
- pMapItem.GetBestChoice();
- if ( pMapItem.GetVoteAmount() <= 0 )
- {
- Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Map will not change." );
- return;
- }
- if ( pMapItem.IsSingleMapVote() )
- {
- if ( pMapItem.GetNoVotes() > pMapItem.GetYesVotes() )
- {
- 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" );
- return;
- }
- }
- 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)" );
- Schedule::Task( 3.0, AdminMenuItemVoteMap_ChangeLevel );
- }
- void AdminMenuItemVoteMap_ChangeLevel()
- {
- Engine.RunConsoleCommand( "admin map "" + pMapItem.GetMapOfChoice() + """ );
- }
- }
- }
复制代码
vote_restart.as
- // Make sure the base interface is included!
- #include "vote_base.as"
- namespace AdminMenu
- {
- namespace Vote
- {
- class CMenuItemRestart : CAdminMenuItemBase, IBaseVoteMenu
- {
- private array<int> s_votes;
- private uint s_VoteChoice = 0;
- private bool s_VoteOngoing = false;
- CMenuItemRestart()
- {
- m_ID = "as_vote_restart";
- m_Name = "Vote Restart";
- m_Group = GROUP_VOTE_CMD;
- m_Level = LEVEL_ADMIN;
- Clear();
- }
- void Clear()
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing ) return;
- s_votes.resize(0);
- s_VoteChoice = 0;
- }
- void GoBack( CTerrorPlayer @pPlayer ) override
- {
- s_VoteOngoing = false;
- Clear();
- AdminMenu_BackToGroup( pPlayer, m_Group );
- }
- void OnItemOpen( CTerrorPlayer @pPlayer ) override
- {
- // If vote is ongoing, then stop!
- if ( s_VoteOngoing )
- {
- CBasePlayer@ pBasePlayer = pPlayer.opCast();
- Chat.PrintToChat( pBasePlayer, "{gold}[{green}AS{gold}]{white} A vote is already ongoing..." );
- return;
- }
- Clear();
- BeginVote();
- }
- int GetVoteAmount()
- {
- int y = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- y += s_votes[i];
- return y;
- }
- int GetYesVotes() { return s_votes[0]; }
- int GetNoVotes() { return s_votes[1]; }
- float GetNoVotePercentage()
- {
- int votes = GetNoVotes() - GetYesVotes();
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- void GetBestChoice()
- {
- s_VoteOngoing = false;
- int votes = 0;
- for ( uint i = 0; i < s_votes.length(); i++ )
- {
- if ( votes > s_votes[i] ) continue;
- votes = s_votes[i];
- s_VoteChoice = i;
- }
- }
- float GetVotePercentage()
- {
- int votes = s_votes[s_VoteChoice];
- float percentage = float(votes) / float(GetVoteAmount());
- return (percentage * 100);
- }
- void BeginVote()
- {
- s_VoteOngoing = true;
- s_votes.insertLast( 0 );
- s_votes.insertLast( 0 );
- SetVoteTime( 15, m_ID, "vote", "Restart the round", AdminMenuItemVoteRestart_OnVoteEnd );
- }
- void DoModuleExec( CTerrorPlayer@ pPlayer, uint result )
- {
- result = Math::clamp( result, 0, 1 );
- s_votes[result]++;
- }
- void OnMenuExecuted( CTerrorPlayer@ pPlayer, CASCommand @pArgs, int &in iValue ) override
- {
- string arg0 = pArgs.Arg( 0 ); // MainID
- string arg1 = pArgs.Arg( 1 ); // Page
- string arg2 = pArgs.Arg( 2 ); // ID
- uint page = parseUInt( arg1 );
- uint result = page + iValue - 1; // Reduce 1 for the result
- if ( Utils.StrEql( arg2, "vote" ) )
- {
- switch( iValue )
- {
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- {
- DoModuleExec( pPlayer, result );
- }
- break;
- }
- return;
- }
- }
- }
- CMenuItemRestart @pMenuItemRestart = CMenuItemRestart();
- void RegisterVoteRestart()
- {
- AdminMenu_RegisterItem( pMenuItemRestart );
- }
- void AdminMenuItemVoteRestart_OnVoteEnd()
- {
- pMenuItemRestart.GetBestChoice();
- if ( pMenuItemRestart.GetVoteAmount() <= 0 )
- {
- Chat.PrintToChat( all, "{gold}[{green}AS{gold}]{white} Nobody voted. Round will not be restarted." );
- return;
- }
- if ( pMenuItemRestart.GetNoVotes() > pMenuItemRestart.GetYesVotes() )
- {
- 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" );
- return;
- }
- 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)" );
- ThePresident.ForceWinState( STATE_FAIL );
- // Increase max rounds by 1
- // That is if it's not set to 0
- CASConVarRef@ cvar_mp_roundlimit = ConVar::Find( "mp_roundlimit" );
- if ( cvar_mp_roundlimit is null ) return;
- int rounds = cvar_mp_roundlimit.GetInt();
- if ( rounds <= 0 ) return;
- rounds++;
- cvar_mp_roundlimit.SetValue( formatInt( rounds ) );
- }
- }
- }
复制代码
|