Jump to content

Search the Community

Showing results for tags 'bf4'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • General
    • News
    • General Discussion
    • Tech Talk
    • Archives
  • Procon 1.0 Frostbite
    • General
    • Knowledge Base
    • Plugins
    • Localization
    • Deutscher Support (German Support)
  • Games
    • General
    • Battlefield 2
    • Battlefield Bad Company 2
    • Battlefield 3
    • Battlefield 4
    • Battlefield Hardline
    • Battlefield 1
    • Battlefield V
  • EZRCON
    • EZRCON Store
    • General

Product Groups

  • Hosting Services
  • One Time Donations

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Website URL


IGN

Found 62 results

  1. View File Advanced In-Game Admin and Ban Enforcer - AdKats ADKATS 7.6.0.4 RELEASED! Admin Toolset with a plethora of features, over 100 available in-game commands, and many customization options. AdKats focuses on making in-game admins more efficient and accurate at their jobs, with flexibility for almost any setup. Includes a cross-server ban enforcer with advanced enforcement features, global admin management, cross-server player messaging, and the BFAdminCP 2.0+ for web-based control has been released. Designed for groups with high-traffic servers and many admins, but will function just as well for small servers. REQUIREMENTS: This plugin requires a MySQL database, and XpKiller's Stat logger plugin to operate. If you do not have an existing database and/or a Procon layer we suggest using Branzone's hosting services. Our group has been with them for years across BF3, BF4, and Hardline; the most performant and reliable host we've found. Web/Database Hosting: Branzone Web Hosting (Used for MySQL Databases) Procon Layer Hosting: Branzone Procon Layers FEATURES Extensive In-Game Commands. Commands for player killing, kicking, punishing, banning, unbanning, moving, joining, whitelisting, messaging, etc, etc... ~100 available in-game commands. Commands can be accessed from in-game, Procon's chat window, database, and from other plugins. Customizable User Roles. Custom user roles can be created for admins and players, with each role given access to only the commands you want them to use. Default guest role is given to all players and can be edited to your desired specs. Roles and powers are automatically synced between servers so you only need to change user information once. Soldiers assigned to users will also keep their powers even if they change their in-game names. Setting sync between servers. All changes to plugin settings are stored in the database and can be automatically synced between your Procon layers. Setting up new layers or switching layers is a breeze as the settings for existing servers are automatically imported on startup. Infraction Tracking System. Punish/forgive players for breaking rules on your servers. Everything is tracked so the more infractions they commit, the worse their punishment automatically gets. Created so all players can be treated equally based on their history, regardless of who is issuing punishments against them. Heavily customizable. Player Reputation System. Based on issued commands from and against players they can form a numeric reputation on the server. Documentation below. A local leaderboard for reputation is provided in the BFAdminCP. Quick Player Report and Admin Call Handling, with Email Support.Notification system and quick handling features for all admin calls and player reports. Reports can be referenced by number for instant action. Automatic PBSS are triggered on reported players. Orchestration and Server List Management. Server reserved slots, spectator slots, autobalance whitelising through MULTIBalancer, ping kick whitelists, and several others can be automatically handled through the AdKats user list, role groups, and orchestration commands. AdKats Ban Enforcer. AdKats can enforce bans across all of your servers and can enforce on all identity metrics at the same time. System will automatically import bans from your servers, consolidating them in one place, and can import existing bans from the BF3 Ban Manager plugin's tables. Full documentation below. Automated Challenge System with Rewards. The challenge system in AdKats is designed to be a multi-server stats-driven way to give players new goals with rewards. You can set up almost any combination of damage types or weapons to be used by players, in multiple tiers. BF3/BF4 "Hacker-Checker" with Whitelist. Battlelog stats can be polled for players in the server, issuing automatic bans for damage mods, aimbots, magic bullet, and several others. The LIVE system can detect damage mods and magic bullet from a single round of play. DPS checks are enabled by default, with others available after a few clicks. Surrender Vote System. When enabled, if players are stuck in their base with no options, they can vote to end the round with the current winning team as winner. Auto-Surrender/Auto-Nuke System. This uses ticket loss rates to detect where teams are on the map, specifically with how many flags are captured. If a team is being base-camped, it can either automatically end the round with current winner, or nuke the team who is causing the base-camp. Optimal values for Metro 2014 and Operation Locker are available, for both surrender and nuke options. Automatic Updates. AdKats automatically updates itself when stable releases are made, only requiring a Procon instance reboot to run updated versions. This can be disabled if desired, but is required if running TEST versions. Ping Enforcer. Automated kick system based on ping, with moving average calculation, modifiers based on time of day and server population, customizable messages, logged kicks, and manual ping options. AFK Manager. Automated kick system based on player AFK time, with manual kick command. Customizable durations, and option to ignore chat messages counting toward active time. Internal SpamBot with Whitelist. SpamBot with options for simultaneous say, yell, and tell. Customizable intervals between each type of message, and ability to whitelist players/admins from seeing spambot messages. Commander Manager. Commanders can cause team imbalance when servers are in low population. This manager can forbid commanders before a certain player count is active. Cross-Server Player Messaging. Private conversations between players can operate not only within the same server, but will work between any online server in the database, and even between any AdKats supported game. Admin Assistants. When fully used this can turn your regular playerbase into a human autoadmin. Trusted players fill the gaps normal autoadmins don't see by utilizing the report system and keeping your server under control even when normal admins are offline. Email Notification System. Email addresses can be added to every user, and once enabled they will receive emails for player reports and admin calls. Fuzzy Player Name Completion. Fully completes partial or misspelled player names. I've been consistently able to find almost any player only a few characters from their name. Can also fetch players who have left the server, are in another server of yours on the same database, or have been in your servers at any point in time. Player Muting. Players can be muted if necessary, giving warnings and kicks if they talk. Automatic mute in specific cases like lanuage can be orchestrated by other plugins like Insane limits. Player Joining. Player's squads can be joined via command, and locked squads can be unlocked for admin entry. Player Locking. Players can be locked from admin commands for a specific timeout, the main purpose is if a certain admin is handling them (checking stats for cheat detection, records, etc.) they shouldn't be interrupted by another admin acting on the player. Player Assist. Player's want to play with their friends, but you don't want to imbalance the teams_ The assist command lets any player join the weak team to help them out and squad up with friends without hurting server balance. Yell/Say Pre-Recording. Use numbers to reference predefined messages. Avoid typing long reasons or messages. e.g. /kill player 3 Server Rule Management. Server rules can be listed, requests for rules logged, rules targeted at other players, and rules can be distributed between servers automatically. External Controller API. AdKats can be controlled from outside the game through systems like the BFAdminCP and through other plugins like Insane Limits. For example, you can issue AdKats punish commands from Insane Limits or ProconRulz and have them logged against the player's profile like any other admin command. Internal Implementation of TeamSwap. Queued move system for servers that are consistently full, players can be queued to move to full teams once a slot opens. Metabans Support. When using ban enforcer all bans can be submitted to metabans and removed if the player is unbanned. Editable In-Game Commands. Command text, logging options, chat access types, and enable options can be edited to suit your needs. Full Logging. All admin activity is tracked via the database per your custom settings for every command, so holding your admins accountable for their actions is quick and painless. If you are using the BFAdminCP nobody but your highest admins will need manual Procon access. Setting Lock. The settings page in AdKats can be locked with a password. This means even admins with access to plugin settings can be blocked from changes using the password. Performance. All actions, messaging, database communications, and command parsing take place on their own threads, minimizing performance impacts. New Extension! Click below to enforce loadouts on-spawn! AdKats Release Notes: https://github.com/AdKats/AdKats/blob/master/CHANGELOG.md#7604-12-jan-2020 I hope you enjoy the plugin. While using this plugin, two players, ColColonCleaner, and PhirePhrey will be added to your server's reserved slot list. If you have any questions, please comment here. Submitter ColColonCleaner Submitted 12/24/19 Category Plugins  
  2. Battlefield Admin Control Panel - BFACP View File Running on PHP Version 7 This does not work with any version of the BFACP do not try to run this application on that version. Use the latest stable PHP 5.6. Overview The Battlefield Admin Control Panel (BFACP) is a web based admin tool designed to work exclusively with AdKats (v6+) and XpKillers Chat, GUID, Stats and Mapstats Logger (v1.0.0.3). The software is built with the Laravel PHP framework to speed up development time and make my job a lot easier. FAQ Requirements MySQL Database (5.6+) AdKats v6+ XpKillers Chat, GUID, Stats and Mapstats Logger v1.0.0.2+ PHP 5.5+ PHP Mcrypt PHP PDO Features User, Role, and Permission system. Live Scoreboard with chat. Ban Management for AdKats. Detailed player information with graph charts. Server statistics page for each server showing population history, uptime history with data from UptimeRobot, and Mapstats. Metabans support. Report notifications with ability to change alert sounds. Chatlog searching where you can search by multiple players and/or keywords and ability to only show from a certain date/time range. Message of the Day Quick DB Stats overview and more! Download the latest version. Once downloaded unzip it to a temporary folder on your computer. Next open the .env.php file located in the root folder in your favorite text editor. Scroll down to the database settings section and fill in your database connection information. /** * Database Settings */ 'DB_HOST' => 'localhost', 'DB_USER' => 'root', 'DB_PASS' => '', 'DB_NAME' => 'mydatabase', Next we need to create a encryption key. This is IMPORTANT! The default key provided is just a placeholder string and is insecure. I have provided a page where you can get a random 32 character string. I do NOT save these and they are random on each refresh. You can access this page here, scroll down to the CodeIgniter Encryption Keys. Once you have your key open up the file .env.php in the root folder and scroll down till you see the APP_KEY field. Replace the YourSecretKey!!! with the key that was generated. By default it will look like this. /** * Set your app key here */ 'APP_KEY' => 'YourSecretKey!!!' Once completed upload the entire application to your webserver. Once uploaded you will need to modify some file and folder permissions. Change the files and folders permissions under app/storage recursively to 0777. This application was designed to run on a subdomain and not from a folder from the TLD. Make sure to create a subdomain and if possible have domain point to the public folder that's located under the root folder. Now load up application in your web browser and it will begin the process of creating the tables. This process will take a few seconds to run on first load. When it completed you should see the dashboard. Default login Username: admin Password: password You can change the default username and password by clicking on Site Management > Users > Admin Installing from the command line This method is only for those who have shell access to their web server or VPS. This will download and extract the files to your current directory. Make sure it's an empty directory. If you have git installed you can just run the following command to install it. You must have composer and php command line installed. Composer Method (preferred) composer create-project --prefer-dist --no-scripts --keep-vcs adkgamers/bfadmincp . Git Method git clone https://github.com/Prophet731/BFAdminCP.git . composer install --no-scripts This will clone and install the dependencies need for the BFACP to work. This will checkout the master branch which is the stable version. If you would like to run the develop version you will need to run git checkout develop before you issue the composer command. To update it all you will need to do is run git pull and it will pull the latest version on the current branch (master or develop). To make this an automated process you can create a cron job for it. * * * * * cd /path/to/bfacp; git pull >/dev/null 2>&1 Submitter Prophet731 Submitted 12/25/19 Category Plugin Enhancements
  3. My last thread had some errors so i will post fixed version with every script working + some extra ones I made or rewrote for bf4/updated it. The thread I rewrote for bf4 is: old anticheat script for bf3 1. Set tickets on round end (Do not add the tickrate), I am not sure if it will work without thread sleep since I have spotted issues with tickrate & tickets change on end OnRoundOver Code int tickets = 100; int health = 100; int delay = 100; int bleed = 100; plugin.ServerCommand("vars.soldierHealth", health.ToString()); plugin.ServerCommand("vars.vehicleSpawnDelay", delay.ToString()); plugin.ServerCommand("vars.ticketBleedRate", bleed.ToString()); plugin.PRoConChat("^bRestarted values"); plugin.ConsoleWrite("^bRestarted values"); Thread scriptdelay = new Thread(new ThreadStart(delegate { Thread.Sleep(5 * 1000); if (server.NextGamemode == "ConquestLarge0") { //CQL tickets = 125; plugin.ServerCommand("vars.serverName"); plugin.ServerCommand("vars.gameModeCounter", tickets.ToString()); plugin.PRoConChat("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickets: " + (tickets * 8).ToString ("F0") + " [^4" + tickets + "^0%]"); plugin.ConsoleWrite("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickets: " + (tickets * 8).ToString ("F0") + " [^4" + tickets + "^0%]"); } if (server.NextGamemode == "RushLarge0") { //RUSH if (server.PlayerCount <= 29) { tickets = 150; } if ((server.PlayerCount >= 30) && (server.PlayerCount <= 44)) { tickets = 200; } if (server.PlayerCount >= 45) { tickets = 250; } plugin.ServerCommand("vars.serverName"); plugin.ServerCommand("vars.gameModeCounter", tickets.ToString()); plugin.PRoConChat("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickets: [^4" + tickets + "^0%]"); plugin.ConsoleWrite("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickets: [^4" + tickets + "^0%]"); } if (server.NextGamemode == "ConquestSMall0") { //CQS tickets = 150; plugin.ServerCommand("vars.serverName"); plugin.ServerCommand("vars.gameModeCounter", tickets.ToString()); } })); scriptdelay.Name = "ScriptDelay"; scriptdelay.Start(); return false; 2. Map command (vips) Examples -> !map siege cql = next map is Siege of Shanghai with Conquest Large and 1 round. -> !map siege cql 2 = next map is Siege of Shanghai with Conquest Large and 2 rounds. OnAnyChat Code //OnAnyChat //first check: code int level = 2; try { level = Convert.ToInt32(plugin.getPluginVarValue("debug_level")); } catch (Exception e) { } Match m = Regex.Match(player.LastChat, @"^\s*!map\s+([^\s]+)\s+([^\s]+)$", RegexOptions.IgnoreCase); Match m2 = Regex.Match(player.LastChat, @"^\s*!map\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)$", RegexOptions.IgnoreCase); if (plugin.GetReservedSlotsList().Contains(player.Name)) return false; List<String> mapFileNames = server.MapFileNameRotation; List<String> modeNames = server.GamemodeRotation; List<int> rounds = server.LevelRoundsRotation; Converter<String, int> MapCodeToIndex = delegate (String mc) { int i = 0; foreach (String mapFileName in mapFileNames) { if (Regex.Match(mapFileName, mc, RegexOptions.IgnoreCase).Success) { return i; } i = i + 1; } return i; }; if (!m.Success) return false; //if(!m2.Success) will fail for "m" match so leave it if (m.Success) { int r = 1; String name = m.Groups[1].Value; String mode = m.Groups[2].Value; Dictionary<string, string> dict = new Dictionary<string, string>(); dict.Add("locker", "MP_Prison"); dict.Add("zavod", "MP_Abandoned"); dict.Add("lancang", "MP_Damage"); dict.Add("flood", "MP_Flooded"); dict.Add("golmud", "MP_Journey"); dict.Add("paracel", "MP_Naval"); dict.Add("hainan", "MP_Resort"); dict.Add("rogue", "MP_TheDish"); dict.Add("dawn", "MP_Tremors"); dict.Add("silk", "XP1_001"); dict.Add("altai", "XP1_002"); dict.Add("gulin", "XP1_003"); dict.Add("dragon pass", "XP1_004"); dict.Add("caspian", "XP0_Caspian"); dict.Add("firestorm", "XP0_Firestorm"); dict.Add("metro", "XP0_Metro"); dict.Add("oman", "XP0_Oman"); dict.Add("islands", "XP2_001"); dict.Add("nansha", "XP2_002"); dict.Add("wavebr", "XP2_003"); dict.Add("mortar", "XP2_004"); dict.Add("pearl", "XP3_MarketPl"); dict.Add("propaganda", "XP3_Prpganda"); dict.Add("lumpini", "XP3_UrbanGdn"); dict.Add("sunken", "XP3_WtrFront"); dict.Add("whiteout", "XP4_Arctic"); dict.Add("hammerhead", "XP4_SubBase"); dict.Add("hangar", "XP4_Titan"); dict.Add("giants", "XP4_WalkerFactory"); dict.Add("night", "XP5_Night_01"); dict.Add("outbreak", "XP6_CMP"); dict.Add("valley", "XP7_Valley"); string mapcorrect = dict[name]; Dictionary<string, string> mapss = new Dictionary<string, string>(); mapss.Add("locker", "locker"); mapss.Add("zavod", "zavod"); mapss.Add("lancang", "lancang"); mapss.Add("flood", "flood"); mapss.Add("golmud", "golmud"); mapss.Add("paracel", "paracel"); mapss.Add("hainan", "hainan"); mapss.Add("rogue", "rogue"); mapss.Add("dawn", "dawn"); mapss.Add("silk", "silk"); mapss.Add("altai", "altai"); mapss.Add("gulin", "gulin"); mapss.Add("dragon pass", "dragon pass"); mapss.Add("caspian", "caspian"); mapss.Add("firestorm", "firestorm"); mapss.Add("metro", "metro"); mapss.Add("oman", "oman"); mapss.Add("islands", "islands"); mapss.Add("nansha", "nansha"); mapss.Add("wavebr", "wavebr"); mapss.Add("mortar", "mortar"); mapss.Add("pearl", "pearl"); mapss.Add("propaganda", "propaganda"); mapss.Add("lumpini", "lumpini"); mapss.Add("sunken", "sunken"); mapss.Add("whiteout", "whiteout"); mapss.Add("hammerhead", "hammerhead"); mapss.Add("hangar", "hangar"); mapss.Add("giants", "giants"); mapss.Add("night", "night"); mapss.Add("outbreak", "outbreak"); mapss.Add("valley", "valley"); string mapcheck = mapss[name]; Dictionary<string, string> modes = new Dictionary<string, string>(); modes.Add("cql", "ConquestLarge0"); modes.Add("cqs", "ConquestSmall0"); modes.Add("domination", "Domination0"); modes.Add("defuse", "Elimination0"); modes.Add("obli", "Obliteration"); modes.Add("rush", "RushLarge0"); modes.Add("tdm", "TeamDeathMatch0"); modes.Add("sqdm", "SquadDeathMatch0"); modes.Add("airsup", "AirSuperiority0"); modes.Add("ctf", "CaptureTheflag0"); modes.Add("cas", "CarrierAssaultSmall0"); modes.Add("cal", "CarrierAssaultLarge0"); modes.Add("sqobli", "SquadObliteration0"); modes.Add("gunmaster", "GunMaster0"); modes.Add("guntroll", "GunMaster1"); string modecorrect = modes[mode]; Dictionary<string, string> modes2 = new Dictionary<string, string>(); modes2.Add("cql", "cql"); modes2.Add("cqs", "cqs"); modes2.Add("domination", "domination"); modes2.Add("defuse", "defuse"); modes2.Add("obli", "obli"); modes2.Add("rush", "rush"); modes2.Add("tdm", "tdm"); modes2.Add("sqdm", "sqdm"); modes2.Add("airsup", "airsup"); modes2.Add("ctf", "ctf"); modes2.Add("cas", "cas"); modes2.Add("cal", "cal"); modes2.Add("sqobli", "sqobli"); modes2.Add("gunmaster", "gunmaster"); modes2.Add("guntroll", "guntroll"); string modecheck1 = modes2[mode]; if (server.MapFileNameRotation.Contains(mapcorrect)) { int mapIndex = MapCodeToIndex(mapcorrect); if (mapIndex < modeNames.Count && modeNames[mapIndex] == modecorrect) { if (level >= 2) plugin.ConsoleWrite("^b[MAP]^n special case, setting next to existing map entry #" + mapIndex + ", " + plugin.FriendlyMapName(mapcorrect)); plugin.SendGlobalMessage("Next map: " + plugin.FriendlyMapName(mapcorrect) + " " + plugin.FriendlyModeName(modecorrect) + " Rounds: " + r.ToString()); // Set it as the next map plugin.ServerCommand("mapList.setNextMapIndex", mapIndex.ToString()); return false; } } int lastMap = server.MapFileNameRotation.Count; plugin.ConsoleWrite("^b[MAP]^n setnext: temp map inserted at index #" + lastMap); plugin.SendGlobalMessage("Next map: " + plugin.FriendlyMapName(mapcorrect) + " " + plugin.FriendlyModeName(modecorrect) + " Rounds: " + r.ToString()); plugin.ServerCommand("mapList.add", mapcorrect, modecorrect, r.ToString()); plugin.ServerCommand("mapList.setNextMapIndex", lastMap.ToString()); // Refresh map list plugin.ServerCommand("mapList.list"); } if (m2.Success) { int r = 1; String name = m2.Groups[1].Value; String mode = m2.Groups[2].Value; r = Convert.ToInt32(m2.Groups[3].Value); Dictionary<string, string> dict = new Dictionary<string, string>(); dict.Add("locker", "MP_Prison"); dict.Add("zavod", "MP_Abandoned"); dict.Add("lancang", "MP_Damage"); dict.Add("flood", "MP_Flooded"); dict.Add("golmud", "MP_Journey"); dict.Add("paracel", "MP_Naval"); dict.Add("hainan", "MP_Resort"); dict.Add("rogue", "MP_TheDish"); dict.Add("dawn", "MP_Tremors"); dict.Add("silk", "XP1_001"); dict.Add("altai", "XP1_002"); dict.Add("gulin", "XP1_003"); dict.Add("dragon pass", "XP1_004"); dict.Add("caspian", "XP0_Caspian"); dict.Add("firestorm", "XP0_Firestorm"); dict.Add("metro", "XP0_Metro"); dict.Add("oman", "XP0_Oman"); dict.Add("islands", "XP2_001"); dict.Add("nansha", "XP2_002"); dict.Add("wavebr", "XP2_003"); dict.Add("mortar", "XP2_004"); dict.Add("pearl", "XP3_MarketPl"); dict.Add("propaganda", "XP3_Prpganda"); dict.Add("lumpini", "XP3_UrbanGdn"); dict.Add("sunken", "XP3_WtrFront"); dict.Add("whiteout", "XP4_Arctic"); dict.Add("hammerhead", "XP4_SubBase"); dict.Add("hangar", "XP4_Titan"); dict.Add("giants", "XP4_WalkerFactory"); dict.Add("night", "XP5_Night_01"); dict.Add("outbreak", "XP6_CMP"); dict.Add("valley", "XP7_Valley"); string mapcorrect = dict[name]; Dictionary<string, string> mapss = new Dictionary<string, string>(); mapss.Add("locker", "locker"); mapss.Add("zavod", "zavod"); mapss.Add("lancang", "lancang"); mapss.Add("flood", "flood"); mapss.Add("golmud", "golmud"); mapss.Add("paracel", "paracel"); mapss.Add("hainan", "hainan"); mapss.Add("rogue", "rogue"); mapss.Add("dawn", "dawn"); mapss.Add("silk", "silk"); mapss.Add("altai", "altai"); mapss.Add("gulin", "gulin"); mapss.Add("dragon pass", "dragon pass"); mapss.Add("caspian", "caspian"); mapss.Add("firestorm", "firestorm"); mapss.Add("metro", "metro"); mapss.Add("oman", "oman"); mapss.Add("islands", "islands"); mapss.Add("nansha", "nansha"); mapss.Add("wavebr", "wavebr"); mapss.Add("mortar", "mortar"); mapss.Add("pearl", "pearl"); mapss.Add("propaganda", "propaganda"); mapss.Add("lumpini", "lumpini"); mapss.Add("sunken", "sunken"); mapss.Add("whiteout", "whiteout"); mapss.Add("hammerhead", "hammerhead"); mapss.Add("hangar", "hangar"); mapss.Add("giants", "giants"); mapss.Add("night", "night"); mapss.Add("outbreak", "outbreak"); mapss.Add("valley", "valley"); string mapcheck = mapss[name]; Dictionary<string, string> modes = new Dictionary<string, string>(); modes.Add("cql", "ConquestLarge0"); modes.Add("cqs", "ConquestSmall0"); modes.Add("domination", "Domination0"); modes.Add("defuse", "Elimination0"); modes.Add("obli", "Obliteration"); modes.Add("rush", "RushLarge0"); modes.Add("tdm", "TeamDeathMatch0"); modes.Add("sqdm", "SquadDeathMatch0"); modes.Add("airsup", "AirSuperiority0"); modes.Add("ctf", "CaptureTheflag0"); modes.Add("cas", "CarrierAssaultSmall0"); modes.Add("cal", "CarrierAssaultLarge0"); modes.Add("sqobli", "SquadObliteration0"); modes.Add("gunmaster", "GunMaster0"); modes.Add("guntroll", "GunMaster1"); string modecorrect = modes[mode]; Dictionary<string, string> modes2 = new Dictionary<string, string>(); modes2.Add("cql", "cql"); modes2.Add("cqs", "cqs"); modes2.Add("domination", "domination"); modes2.Add("defuse", "defuse"); modes2.Add("obli", "obli"); modes2.Add("rush", "rush"); modes2.Add("tdm", "tdm"); modes2.Add("sqdm", "sqdm"); modes2.Add("airsup", "airsup"); modes2.Add("ctf", "ctf"); modes2.Add("cas", "cas"); modes2.Add("cal", "cal"); modes2.Add("sqobli", "sqobli"); modes2.Add("gunmaster", "gunmaster"); modes2.Add("guntroll", "guntroll"); string modecheck1 = modes2[mode]; if (server.MapFileNameRotation.Contains(mapcorrect)) { int mapIndex = MapCodeToIndex(mapcorrect); if (mapIndex < modeNames.Count && modeNames[mapIndex] == modecorrect) { if (level >= 2) plugin.ConsoleWrite("^b[MAP]^n special case, setting next to existing map entry #" + mapIndex + ", " + plugin.FriendlyMapName(mapcorrect)); plugin.SendGlobalMessage("Next map: " + plugin.FriendlyMapName(mapcorrect) + " " + plugin.FriendlyModeName(modecorrect) + " Rounds: " + r.ToString()); // Set it as the next map plugin.ServerCommand("mapList.setNextMapIndex", mapIndex.ToString()); return false; } } int lastMap = server.MapFileNameRotation.Count; plugin.ConsoleWrite("^b[MAP]^n setnext: temp map inserted at index #" + lastMap); plugin.SendGlobalMessage("Next map: " + plugin.FriendlyMapName(mapcorrect) + " " + plugin.FriendlyModeName(modecorrect) + " Rounds: " + r.ToString()); plugin.ServerCommand("mapList.add", mapcorrect, modecorrect, r.ToString()); plugin.ServerCommand("mapList.setNextMapIndex", lastMap.ToString()); // Refresh map list plugin.ServerCommand("mapList.list"); } 2.5 - Addon for indexes check OnRoundStart Code /*way that is broken in limits Broken code var index_delete = new List<int> { 2, 3, 4, 5, 6, 7, 8, 9, 10 }; foreach (int element in index_delete) { plugin.ServerCommand ("mapList.remove", element.ToString()); } Broken code int indexNum = server.MapFileNameRotation.Count; for(int i=<your default index number>;i<indexNum;i++) { plugin.ServerCommand("mapList.remove", i.ToString()); } Below Working code with pretty bad quality, it works for il though... */ int a = 11; int b = 12; int c = 13; int d = 14; int e = 15; int f = 16; int g = 17; plugin.ServerCommand("mapList.remove", a.ToString()); plugin.ServerCommand("mapList.remove", b.ToString()); plugin.ServerCommand("mapList.remove", c.ToString()); plugin.ServerCommand("mapList.remove", d.ToString()); plugin.ServerCommand("mapList.remove", e.ToString()); plugin.ServerCommand("mapList.remove", f.ToString()); plugin.ServerCommand("mapList.remove", g.ToString()); 3. Check player command Example -> !check Bartis OnAnyChat Code Match m = Regex.Match(player.LastChat, @"^\s*[/[email protected]]check\s+([^\s]+)", RegexOptions.IgnoreCase); if (!m.Success) return false; List<String> vips = plugin.GetReservedSlotsList(); if (!vips.Contains(player.Name)) { plugin.SendPlayerMessage(player.Name, "You Can't use this command."); return false; } if (m.Success) { // Match target player name String name = m.Groups[1].Value; List<PlayerInfoInterface> all = new List<PlayerInfoInterface>(); all.AddRange(team1.players); all.AddRange(team2.players); all.AddRange(team3.players); all.AddRange(team4.players); PlayerInfoInterface target = null; int count = 0; foreach (PlayerInfoInterface p in all) { if (Regex.Match(p.Name, name, RegexOptions.IgnoreCase).Success) { target = p; ++count; } } if (count == 0 || target == null) { plugin.SendPlayerMessage(player.Name, "No player name matches '" + name + "'"); return false; } else if (count > 1) { plugin.SendPlayerMessage(player.Name, "Too many names match '" + name + "', try again"); return false; } double headshots = target.HeadshotsRound; double killsNOW = target.KillsRound; double result = Math.Round((headshots / killsNOW), 2); plugin.SendPlayerMessage(player.Name, target.Name + " stats:"); plugin.SendPlayerMessage(player.Name, target.Name + " K/D: " + "[" + target.Kdr + "]" + " | " + "REAL K/D: " + "[" + (target.Kills / target.Deaths).ToString("F2") + "]"); plugin.SendPlayerMessage(player.Name, target.Name + " Wins: " + (((target.Wins) / (target.Wins + target.Losses)) * 100).ToString("F2") + "%" + " |" + " Skill: " + target.Skill + " | " + "KPM: " + target.Kpm.ToString("F2")); plugin.SendPlayerMessage(player.Name, target.Name + " HS on Round: " + result * 100 + "%."); plugin.SendPlayerMessage(player.Name, target.Name + " KPM on Round: " + Math.Round((target.KpmRound), 2)); plugin.SendPlayerMessage(player.Name, target.Name + " Country: " + target.CountryName + "."); } 4. Tickrate change for next map (will fail if admin changed map after) OnServerInterval Time for interval in s - add as less as possible double RemainTicketsPercent = 100; int tickrate = 60; string[] maps = { "MP_Prison" }; // add more since it's an array if you want. Usefull for water maps if (server.RemainTicketsPercent(1) == 5 || server.RemainTicketsPercent(2) == 5) { bool ifMap = Array.Exists(maps, element => element == server.NextMapFileName); if (ifMap) { tickrate = 60; plugin.ServerCommand("vars.OutHighFrequency", tickrate.ToString()); plugin.PRoConChat("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); plugin.ConsoleWrite("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); } else { tickrate = 40; plugin.ServerCommand("vars.OutHighFrequency", tickrate.ToString()); plugin.PRoConChat("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); plugin.ConsoleWrite("^bNext map: [^2" + plugin.FriendlyMapName(server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName(server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); } } return false; 5. Reports webhook Example -> !report Bartis teamkills OnAnyChat First expression (Regex.Match(player.LastChat, @"[/[email protected]]report" ,RegexOptions.IgnoreCase).Success) Second Check Code string webhookUrl = ""; //EDIT string serverName = server.Name; string webhookString = null; // Don't edit String playerName = null; String playerMessage = null; String reportReason = null; Match regexResult = null; Match regexMatch = Regex.Match(player.LastChat, @"^\s*[/[email protected]]report\s+([^\s]+)\s+([^.*]+)", RegexOptions.IgnoreCase); if (regexMatch.Success) { regexResult = regexMatch; } else { playerMessage = "Error! Correct command: !report <part of playername> <reason>"; plugin.SendPlayerMessage(player.Name, playerMessage); return false; } String name = regexResult.Groups[1].Value; List<PlayerInfoInterface> all = new List<PlayerInfoInterface>(); all.AddRange(team1.players); all.AddRange(team2.players); if (team3.players.Count > 0) all.AddRange(team3.players); if (team4.players.Count > 0) all.AddRange(team4.players); PlayerInfoInterface target = null; int count = 0; foreach (PlayerInfoInterface p in all) { if (Regex.Match(p.Name, name, RegexOptions.IgnoreCase).Success) { target = p; ++count; playerName = p.Name; } } String BL = "https://battlelog.battlefield.com/bf4/user/" + playerName; if (count == 0) { playerMessage = "No such player name matches (" + name + ")"; plugin.SendPlayerMessage(player.Name, playerMessage); return false; } else if (count > 1) { playerMessage = "Multiple players match the target name (" + name + "), try again!"; plugin.SendPlayerMessage(player.Name, playerMessage); return false; } else if (count == 1) { reportReason = regexResult.Groups[2].Value; double headshots = target.HeadshotsRound; double killsNOW = target.KillsRound; double result = Math.Round((headshots / killsNOW), 2); double KPM = Math.Round((target.KpmRound), 2); double HS = result * 100; double KD = Math.Round(target.KdrRound, 2); double Kills = target.KillsRound; double Deaths = target.DeathsRound; try { WebRequest request = WebRequest.Create(webhookUrl); request.Method = "POST"; request.ContentType = "application/json"; webhookString = "{\"content\": \"**```py\\n'Player Report'\\[email protected]" + serverName + "\\nReported_from: " + "'" + player.Name + "'" + "\\nReported_player: " + "'" + playerName + "'" + "\\nReason: " + "'" + reportReason + "'" + "\\nStats: " + "KILLS: " + Kills + " DEATHS: " + Deaths + " HS: " + HS + "%" + " KD: " + KD + " KPM: " + KPM + "\\n```**" + "BL: " + BL + "\"}"; byte[] byteArray = Encoding.UTF8.GetBytes(webhookString); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); plugin.ConsoleWrite("Received a report from " + player.Name); playerMessage = "Thanks, we have received your report!"; plugin.SendPlayerMessage(player.Name, playerMessage); plugin.SendPlayerYell(player.Name, playerMessage, 10); } catch (Exception e) { plugin.ConsoleWrite("Error: " + e); playerMessage = "Plugin error! Please try again later."; plugin.SendPlayerMessage(player.Name, playerMessage); plugin.SendPlayerYell(player.Name, playerMessage, 10); } } return false; 6. Custom factions OnRoundOver Code String msg = ""; int Team1 = 0; int Team2 = 0; int i = 0; Dictionary<int,String> Teams = new Dictionary<int,String>(); Teams.Add(0, "US"); Teams.Add(1, "RU"); Teams.Add(2, "CN"); if (server.NextGamemode == "ConquestLarge0" && server.NextGamemode != "RushLarge0") {// CQL switch (server.NextMapFileName) { case "MP_Tremors": Team1 = 0; Team2 = 2; break; case "MP_Siege": Team1 = 0; Team2 = 2; break; case "MP_Damage": Team1 = 1; Team2 = 2; break; case "MP_Journey": Team1 = 1; Team2 = 2; break; case "MP_TheDish": Team1 = 1; Team2 = 2; break; case "MP_Prison": Team1 = 0; Team2 = 1; break; case "MP_Flooded": Team1 = 0; Team2 = 0; break; case "MP_Abandoned": Team1 = 0; Team2 = 2; break; case "MP_Naval": Team1 = 0; Team2 = 2; break; case "MP_Resort": Team1 = 0; Team2 = 2; break; } } if (server.NextGamemode == "RushLarge0") { //RUSH switch (server.NextMapFileName) { case "MP_Tremors": Team1 = 0; Team2 = 2; break; case "MP_Siege": Team1 = 1; Team2 = 2; break; case "MP_Damage": Team1 = 1; Team2 = 2; break; case "MP_Journey": Team1 = 1; Team2 = 2; break; case "MP_TheDish": Team1 = 1; Team2 = 2; break; case "MP_Prison": Team1 = 0; Team2 = 1; break; case "MP_Flooded": Team1 = 0; Team2 = 2; break; case "MP_Abandoned": Team1 = 1; Team2 = 2; break; case "MP_Naval": Team1 = 0; Team2 = 2; break; case "MP_Resort": Team1 = 0; Team2 = 2; break; } } //Special DLC Cases if(server.NextMapFileName.StartsWith("XP1_")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP2_")) { Team1 = 0; Team2 = 1; } if(server.NextMapFileName.StartsWith("XP3_")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP4_")) { Team1 = 0; Team2 = 1; } if(server.NextMapFileName.StartsWith("XP5_Night_01")) { Team1 = 1; Team2 = 0; } if(server.NextMapFileName.StartsWith("XP6_CMP")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP7_Valley")) { Team1 = 0; Team2 = 2; } plugin.ServerCommand("vars.teamFactionOverride", "1", Convert.ToString(Team1)); plugin.ServerCommand("vars.teamFactionOverride", "2", Convert.ToString(Team2)); msg = "Setting factions to " + Teams[Team1] + " vs " + Teams[Team2] + " on next round..."; plugin.SendGlobalMessage(msg); plugin.ConsoleWrite("^b^1ADMIN FACTIONS >^0^n " + msg); plugin.PRoConChat("^b^1ADMIN FACTIONS >^0^n " + msg); plugin.PRoConEvent(msg, "Insane Limits"); return false; 7. Fetch BL example Your choice how you want, it's an example how you can fetch it without json objects. I may be wrong, but this is impossible in limits (for json). I made simple array method with regex as alternative try { string guid = ""; // Your server guid WebClient client = new WebClient(); string json = client.DownloadString("https://keeper.battlelog.com/snapshot/" + guid); string[] args = json.Split(','); string snapshot = args[1]; string maxPlayers = args[6]; if (snapshot.Contains("SUCCESS")) { int players = int.Parse(Regex.Match(maxPlayers, @"\d+", RegexOptions.RightToLeft).Value); // Most of values you want are numbers and they are on right // Do something, it's maxPlayers value from keeper. Remember ToString() method if you want to display it } else { plugin.ConsoleWrite("Error while trying to fetch BL"); } } catch (Exception e) { plugin.ConsoleWrite("Plugin Error: " + e); } 8. Make every player sure how to properly report someone Examples -> cheat -> CHEATER -> ChEaTEr... etc OnAnyChat First Code //first List<String> hackusations = new List<String>(); // Matching hack, hacker, hacking, hacks, wallhack etc hackusations.Add(@"\b(wall)?hack(er|ing|ed|s)?\b"); // Matching cheat, cheater, cheating, cheats etc hackusations.Add(@"\bcheat(er|ing|ed|s)?\b"); // Matching exploit, exploiter, exploiting, exploits etc hackusations.Add(@"\bexploit(er|ing|ed|s)?\b"); // Matching glitch, glitcher, glitching etc hackusations.Add(@"\bglitch(er|ing|ed)?\b"); string[] chat_words = Regex.Split(player.LastChat, @"[\s!\?\.]+"); chat_words = Array.ConvertAll(chat_words, d => d.ToLower()); foreach(string chat_word in chat_words) foreach(string word in hackusations) if (Regex.Match(chat_word, "^"+word+"$", RegexOptions.IgnoreCase).Success) return true; return false; Second Code string playerMessage = "Please use !report to call admins or report cheaters"; plugin.SendPlayerMessage(player.Name, player.Name + " " + playerMessage); 9. Anticheat DPS/HS/KPM (very high values) YOU HAVE TO enable slow fetch in insane limits options to make it working This is rewritten script for bf4+ I have added discord webhook option OnJoin Expression (!player.StatsError) Code // Revision : 5 // action taken on damage modifiers Action<String> DamageModifierPlayer = delegate (String who) { // set action here default is 1 hour ban String message = "you have been banned for having suscpicious stats"; plugin.EABanPlayerWithMessage(EABanType.EA_GUID, EABanDuration.Temporary, who, 60, message); }; // action taken for blackpoint violaters Action<String> BlackPointPlayer = delegate (String who) { // set action here default is 1 hour ban String message = "you have been banned for having suscpicious stats"; plugin.EABanPlayerWithMessage(EABanType.EA_GUID, EABanDuration.Temporary, who, 60, message); }; // how many black points are required for the action to be taken int TakeAction = 20; // recommended is 20 and above Minimum is 20 // how many black points are required for notification to trigger int NotifyMe = 5; // recommended above 5 and below TakeAction value // here you can setup a notification Action<String> NotifyMeAbout = delegate (String who) { // set notification here, such as email,sound notification, taskbar notification, logging etc .. // this is triggered for all players who have Black points above the NotifyMe value plugin.Log("Cheat-Log.log", plugin.R("[%date% %time%] [%server_host%] [server.Name] [player.EAGuid] " + who)); // this will log player name only with his EA GUID, still require testing }; // options END string webhookUrl = ""; // Add your webhook if (limit.Activations(player.Name) != 1) return false; if ((player.Time / 60) / 60 < 15) return false; Dictionary<String, double> avg_HK = new Dictionary<String, double>(); // PDW avg_HK["MX4"] = 16.55; avg_HK["PP-2000"] = 14.14; avg_HK["UMP45"] = 19.81; avg_HK["CBJ-MS"] = 19.9; avg_HK["PDR"] = 18.29; avg_HK["Scorpion"] = 14.32; avg_HK["JS2"] = 13.03; avg_HK["P90"] = 14.74; avg_HK["UMP9"] = 13.43; avg_HK["ASVal"] = 15.99; avg_HK["MP7"] = 16.36; avg_HK["SR2"] = 17.58; avg_HK["ASVal"] = 16.83; avg_HK["MPX"] = 18.67; avg_HK["Groza-4"] = 13.45; // Carabines avg_HK["AK5C"] = 16.59; avg_HK["ACR"] = 14.33; avg_HK["SG553LB"] = 18.41; avg_HK["AKU-12"] = 15.58; avg_HK["A91"] = 14.58; avg_HK["ACE 52"] = 20.82; avg_HK["G36C"] = 17.84; avg_HK["M4A1"] = 18.22; avg_HK["ACE 21"] = 16.28; avg_HK["Type-95B-1"] = 19.43; avg_HK["MTAR21"] = 18.67; avg_HK["Groza-1"] = 20.28; // Assault avg_HK["AK12"] = 19.52; avg_HK["SCAR-H"] = 19.77; avg_HK["M416"] = 18.86; avg_HK["SAR-21"] = 16.63; avg_HK["AEK-971"] = 16.86; avg_HK["FAMAS"] = 17.21; avg_HK["Steyr AUG"] = 18.92; avg_HK["M16A4"] = 17.31; avg_HK["CZ805"] = 13.49; avg_HK["QBZ-95"] = 21.17; avg_HK["ACE 23"] = 16.85; avg_HK["F2000"] = 15.29; avg_HK["L85A2"] = 16.17; avg_HK["AR160"] = 18.21; avg_HK["Bulldog"] = 20.08; avg_HK["AN94"] = 16.34; //Support avg_HK["Ultimax"] = 19.36; avg_HK["Type88"] = 18.04; avg_HK["LSAT"] = 16.42; avg_HK["Pecheneg"] = 21.17; avg_HK["QBB95"] = 16.38; avg_HK["M240"] = 20.81; avg_HK["M249"] = 18.16; avg_HK["MG4"] = 16.44; avg_HK["RPK-12"] = 19.25; avg_HK["M60E4"] = 22.58; avg_HK["RPK"] = 20.15; avg_HK["AWS"] = 15.45; avg_HK["L86A2"] = 17.59; // Recon avg_HK["CS-LR4"] = 50.26; avg_HK["M40A5"] = 55.92; avg_HK["Scoutelite"] = 50.62; avg_HK["SV98"] = 52.13; avg_HK["JNG90"] = 52.81; avg_HK["SRS .338"] = 51.38; avg_HK["Model98B"] = 58.18; avg_HK["M200"] = 57.62; avg_HK["FY-JS"] = 53.46; avg_HK["Gol"] = 57.59; avg_HK["L96A1"] = 59.02; avg_HK["SR338"] = 32.06; avg_HK["CS5"] = 51.34; // Pistols avg_HK["P226"] = 19.05; avg_HK["M1911"] = 25.02; avg_HK["M9"] = 20.56; avg_HK["M93R"] = 18.5; avg_HK["Taurus .44"] = 38.66; avg_HK["QSZ92"] = 17.13; avg_HK["MP443"] = 18.58; avg_HK["Glock18"] = 18.57; avg_HK["FN57"] = 18.42; avg_HK["CZ75"] = 22.81; avg_HK["HK45C"] = 27.67; avg_HK["MP412Rex"] = 33.89; avg_HK["SW40"] = 30.94; avg_HK["Unica6"] = 28.56; avg_HK["SaddleGun"] = 30.58; // Dmrs avg_HK["RFB"] = 32.98; avg_HK["MK11"] = 32.36; avg_HK["SKS"] = 29.36; avg_HK["SVD-12"] = 52.13; avg_HK["QBU88"] = 31.26; avg_HK["M39EBR"] = 32.09; avg_HK["GalilACE53"] = 30.41; avg_HK["SCAR-HSV"] = 32.03; Dictionary<String, double> norm_DPS = new Dictionary<String, double>(); // PDW norm_DPS["MX4"] = 22.5; norm_DPS["PP-2000"] = 22.5; norm_DPS["UMP45"] = 30; norm_DPS["CBJ-MS"] = 22.5; norm_DPS["PDR"] = 24; norm_DPS["Scorpion"] = 22.5; norm_DPS["JS2"] = 22.5; norm_DPS["P90"] = 21; norm_DPS["UMP9"] = 22.5; norm_DPS["ASVal"] = 27; norm_DPS["MP7"] = 20; norm_DPS["SR2"] = 23.5; norm_DPS["ASVal"] = 27; norm_DPS["MPX"] = 24.5; norm_DPS["Groza-4"] = 27; // Carabines norm_DPS["AK5C"] = 24; norm_DPS["ACR"] = 24; norm_DPS["SG553LB"] = 24; norm_DPS["AKU-12"] = 24; norm_DPS["A91"] = 24; norm_DPS["ACE 52"] = 33; norm_DPS["G36C"] = 24; norm_DPS["M4A1"] = 24; norm_DPS["ACE 21"] = 24; norm_DPS["Type-95B-1"] = 24; norm_DPS["MTAR21"] = 24; norm_DPS["Groza-1"] = 30; // Assault norm_DPS["AK12"] = 24.5; norm_DPS["SCAR-H"] = 33; norm_DPS["M416"] = 24.5; norm_DPS["SAR-21"] = 24.5; norm_DPS["AEK-971"] = 24.5; norm_DPS["FAMAS"] = 24.5; norm_DPS["Steyr AUG"] = 24.5; norm_DPS["M16A4"] = 24.5; norm_DPS["CZ805"] = 24.5; norm_DPS["QBZ-95"] = 24.5; norm_DPS["ACE 23"] = 24.5; norm_DPS["F2000"] = 24.5; norm_DPS["L85A2"] = 24.5; norm_DPS["AR160"] = 24.5; norm_DPS["Bulldog"] = 33; norm_DPS["AN94"] = 24.5; //Support norm_DPS["Ultimax"] = 24.5; norm_DPS["Type88"] = 24.5; norm_DPS["LSAT"] = 24.5; norm_DPS["Pecheneg"] = 33; norm_DPS["QBB95"] = 24.5; norm_DPS["M240"] = 33; norm_DPS["M249"] = 24.5; norm_DPS["MG4"] = 24.5; norm_DPS["RPK-12"] = 24.5; norm_DPS["M60E4"] = 33; norm_DPS["RPK"] = 30; norm_DPS["AWS"] = 24.5; norm_DPS["L86A2"] = 24.5; // Recon norm_DPS["CS-LR4"] = 100; norm_DPS["M40A5"] = 100; norm_DPS["Scoutelite"] = 100; norm_DPS["SV98"] = 100; norm_DPS["JNG90"] = 100; norm_DPS["SRS .338"] = 100; norm_DPS["Model98B"] = 100; norm_DPS["M200"] = 100; norm_DPS["FY-JS"] = 100; norm_DPS["Gol"] = 100; norm_DPS["L96A1"] = 100; norm_DPS["SR338"] = 50; norm_DPS["CS5"] = 100; // Pistols norm_DPS["P226"] = 27; norm_DPS["M1911"] = 36.6; norm_DPS["M9"] = 27; norm_DPS["M93R"] = 22; norm_DPS["Taurus .44"] = 56; norm_DPS["QSZ92"] = 22; norm_DPS["MP443"] = 27; norm_DPS["Glock18"] = 22; norm_DPS["FN57"] = 22; norm_DPS["CZ75"] = 30; norm_DPS["HK45C"] = 36.6; norm_DPS["MP412Rex"] = 56; norm_DPS["SW40"] = 56; norm_DPS["Unica6"] = 56; norm_DPS["SaddleGun"] = 56; // Dmrs norm_DPS["RFB"] = 45; norm_DPS["MK11"] = 45; norm_DPS["SKS"] = 43; norm_DPS["SVD-12"] = 45; norm_DPS["QBU88"] = 43; norm_DPS["M39EBR"] = 45; norm_DPS["GalilACE53"] = 45; norm_DPS["SCAR-HSV"] = 45; List<String> cheatometer = new List<String>(); List<String> discordWeb = new List<String>(); String stuff = ""; BattlelogWeaponStatsInterface Get = null; String DPSCOLOR = "^2"; String HSKCOLOR = "^2"; String KPMCOLOR = "^2"; String ACCCOLOR = "^2"; String BPCOLOR = "^2"; String BlackPointsCounter = player.Name + "_Weapon_BlackPoints"; String cheatedCounter = player.Name + "_Weapon_cheated"; String DPSmodifier = null; int BlackPoints = 0; int cheated = 0; if (TakeAction < 20) TakeAction = 20; if (NotifyMe >= TakeAction) NotifyMe = TakeAction - 1; foreach (String Gun in avg_HK.Keys) { Get = player.GetBattlelog(Gun); if (Get.Kills < 80) continue; Match m = Regex.Match(Gun, @"/([^/]+)$"); String wn = Gun; if (m.Success) wn = m.Groups[1].Value; DPSCOLOR = "^2"; HSKCOLOR = "^2"; KPMCOLOR = "^2"; ACCCOLOR = "^2"; double HSmodifier = 1; if (avg_HK[Gun] > 25) HSmodifier = 1.2; double ShotsHit = Math.Round((Get.ShotsFired * (Get.Accuracy / 100)), 0); double DPS = Math.Round(((Get.Kills / ShotsHit) * 100), 2); double HeadshotsRatio = Math.Round(((Get.Headshots / Get.Kills) * 100), 2); double HSmodified = Math.Round(HeadshotsRatio * HSmodifier, 2); double MaxDPS = Math.Round((norm_DPS[Gun] * (1 + (HSmodified / 100))), 0); double KPM = Math.Round(Get.Kills / (Get.TimeEquipped / 60), 1); double Accuracy = Math.Round(Get.Accuracy, 0); if (DPS > (MaxDPS * 1.3) && DPS <= (MaxDPS * 1.4)) { DPSCOLOR = "^3"; server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (DPS > (MaxDPS * 1.4) && DPS <= (MaxDPS * 1.8)) { DPSCOLOR = "^7"; server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (DPS > (MaxDPS * 1.8)) { DPSCOLOR = "^8"; server.Data.setInt(cheatedCounter, 1); } if (avg_HK[Gun] <= 25) { if (DPS <= (MaxDPS * 1.3) && HeadshotsRatio < 40 && ((KPM <= 3.5 && player.Rank <= 120) || (KPM <= 4 && player.Rank > 120)) && Accuracy <= 35) continue; if (HeadshotsRatio >= 40 && HeadshotsRatio <= 45) { HSKCOLOR = "^3"; server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (HeadshotsRatio > 45 && HeadshotsRatio <= 55) { HSKCOLOR = "^7"; server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (HeadshotsRatio > 55) { HSKCOLOR = "^8"; server.Data.setInt(BlackPointsCounter, BlackPoints + 5); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 35 && Accuracy <= 40) { ACCCOLOR = "^3"; server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 40 && Accuracy <= 50) { ACCCOLOR = "^7"; server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 50) { ACCCOLOR = "^8"; server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } } if (avg_HK[Gun] > 25) { if (DPS <= (MaxDPS * 1.3) && HeadshotsRatio < 90 && ((KPM <= 3.5 && player.Rank <= 120) || (KPM <= 4 && player.Rank > 120)) && Accuracy <= 50) continue; if (HeadshotsRatio >= 90 && HeadshotsRatio <= 93) { HSKCOLOR = "^3"; server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (HeadshotsRatio > 93 && HeadshotsRatio <= 96) { HSKCOLOR = "^7"; server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (HeadshotsRatio > 96) { HSKCOLOR = "^8"; server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 50 && Accuracy <= 60) { ACCCOLOR = "^3"; server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 60 && Accuracy <= 70) { ACCCOLOR = "^7"; server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (Accuracy > 70) { ACCCOLOR = "^8"; server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } } if (KPM > 5.0 && KPM <= 6.0) { KPMCOLOR = "^3"; if (player.Rank <= 120) server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (player.Rank > 120 && KPM > 4) server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (KPM > 6.0 && KPM <= 8.0) { KPMCOLOR = "^7"; if (player.Rank <= 120) server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (player.Rank > 120) server.Data.setInt(BlackPointsCounter, BlackPoints + 1); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } if (KPM > 8.0) { KPMCOLOR = "^8"; if (player.Rank <= 120) server.Data.setInt(BlackPointsCounter, BlackPoints + 3); if (player.Rank > 120) server.Data.setInt(BlackPointsCounter, BlackPoints + 2); if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); } cheatometer.Add("^b[" + wn + "] " + DPSCOLOR + "DPS : " + DPS + "/" + norm_DPS[Gun] + "-" + MaxDPS + " ^0|" + HSKCOLOR + " Headshot/Kill : " + HeadshotsRatio + "% ^0|" + KPMCOLOR + " Kills/minute : " + KPM + " ^0|" + ACCCOLOR + " Accuracy : " + Accuracy + "% ^0| Kills : " + Get.Kills + "^0^n"); discordWeb.Add("[" + wn + "] " + "DPS : " + DPS + "/" + norm_DPS[Gun] + "-" + MaxDPS + " |" + " Headshot/Kill : " + HeadshotsRatio + "% |" + " Kills/minute : " + KPM + "^0^n"); } if (cheatometer.Count == 0) return false; if (discordWeb.Count == 0) return false; if (server.Data.issetInt(BlackPointsCounter)) BlackPoints = server.Data.getInt(BlackPointsCounter); if (server.Data.issetInt(cheatedCounter)) cheated = server.Data.getInt(cheatedCounter); plugin.PRoConChat("--------------------------------------------------" + player.Name + "--------------------------------------------------"); plugin.PRoConChat("^b^2Green = normal/fine ^0| ^3Yellow = above normal ^0| ^7Pink = highly suspicious ^0 | ^8Red = 99% cheat^n^0"); foreach (String metered in cheatometer) { plugin.PRoConChat(metered); } foreach (String boi in discordWeb) { stuff = (boi); } if (cheated == 1) { DamageModifierPlayer(player.Name); DPSmodifier = " ^8^b, player is damage modifier and is banned^0^n"; } if (BlackPoints >= 1) { // add any action for notifying. plugin.ConsoleWrite("^3^b[Evaluating]^0^n " + player.Name + " has " + BlackPoints + " Black Points"); if (BlackPoints > 5 && BlackPoints <= 10) BPCOLOR = "^3"; if (BlackPoints > 10 && BlackPoints <= 15) BPCOLOR = "^7"; if (BlackPoints > 10) { try { WebRequest request = WebRequest.Create(webhookUrl); request.Method = "POST"; request.ContentType = "application/json"; String BL = "https://battlelog.battlefield.com/bf4/user/" + player.Name; string webhookString = "{\"content\": \"**```py\\n'HS/DMG Detection'\\n" + "\\nSuspicious Player: " + "'" + player.Name + "'" + "\nPoints: " + BlackPoints + "\n" + stuff + "\\n```**" + "BL: " + BL + "\"}"; byte[] byteArray = Encoding.UTF8.GetBytes(webhookString); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); } catch (Exception e) { plugin.PRoConChat("Error with posting: " + e.ToString()); plugin.ConsoleWrite("Error with posting: " + e.ToString()); } } if (BlackPoints > 15) BPCOLOR = "^8"; if (BlackPoints >= TakeAction && cheated == 0) { BlackPointPlayer(player.Name); } if (BlackPoints <= 15 && cheated >= 0) plugin.PRoConChat(player.Name + " has " + BPCOLOR + BlackPoints + "^0^n black points" + DPSmodifier); if (BlackPoints > 15 && BlackPoints < TakeAction && cheated == 1) plugin.PRoConChat(player.Name + " has " + BPCOLOR + BlackPoints + "^0^n black points" + DPSmodifier); if (BlackPoints > 15 && BlackPoints < TakeAction && cheated == 0) plugin.PRoConChat(player.Name + " has " + BPCOLOR + BlackPoints + "^0^n black points, please investigate the player."); if (BlackPoints >= TakeAction && cheated == 1) plugin.PRoConChat(player.Name + " has " + BPCOLOR + BlackPoints + "^0^n black points" + DPSmodifier); if (BlackPoints >= TakeAction && cheated == 0) plugin.PRoConChat(player.Name + " has " + BPCOLOR + BlackPoints + " black points and is banned"); plugin.SendTaskbarNotification("warning", "cheatmeter"); } if (BlackPoints >= NotifyMe) { NotifyMeAbout(player.Name); plugin.Log("cheat-log.log", "--------------------------------------------------" + player.Name + "--------------------------------------------------"); foreach (String metered in cheatometer) { plugin.Log("cheat-log.log", metered); } } return false; 10. Very Basic HS live bans It may get some false bans so I would recommend using adakts for that, however this is a simple example OnKill Code int minKills = 15; double playerKdr = Math.Round(player.KillsRound / player.DeathsRound, 2); double playerKpm = Math.Round(player.KillsRound / (player.TimeRound / 60), 2); string playerName = player.Name; string discordPlayerName = playerName.Replace("_", "\\_"); double headshots = player.HeadshotsRound; double killsNOW = player.KillsRound; double result = Math.Round((headshots / killsNOW), 2); result = result * 100; string webhookUrl = ""; // Your webhook if ((killer.KillsRound >= minKills) && (killer.KpmRound > 2.0) && (result >= 70)) { using (WebClient webClient = new WebClient()) { try { string battlelogLink = "https://battlelog.battlefield.com/bf4/user/" + player.Name; WebRequest request = WebRequest.Create(webhookUrl); request.Method = "POST"; request.ContentType = "application/json"; string webhookString = "{\"username\": \"BF4 Report\", \"content\": \"**```diff\\n | New Report | ```**\\n**Report for server:** " + server.Name + "\\n**Reported from:** Stats checker" + "\\n**Reported player:** " + discordPlayerName + "\\n**Reason:** Cheating " + player.Kills +"/"+player.Deaths + " HS [" + result + "%]" + "\\n**Info: **" + plugin.FriendlyMapName(server.MapFileName) + "\\n**Battlelog:** " + battlelogLink + "\"}"; byte[] byteArray = Encoding.UTF8.GetBytes(webhookString); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); } catch (Exception ee) { plugin.ConsoleWrite("Error: " + ee.ToString()); } } plugin.PBBanPlayerWithMessage(PBBanDuration.Permanent, player.Name, 0, "You are banned for HS automatic ban "+ "[" + result + "%]"); plugin.ConsoleWrite("^b^1Auto HS >^0^n " + player.Name + "banned for HS automatic"); plugin.PRoConChat("^b^1Auto HS >^0^n " + player.Name + "banned for HS automatic"); } And again for any questions or errors please write them here or find me on discord Bartis#1313
  4. Originally Posted by bambam*: Donations: none needed - ProconRulz is 100% free software. Please acknowledge any support by clicking the Rate this thread link just above this post, and sharing the rulz you come up with. Thank You. MAJOR UPDATE TO V44. BF4 SUPPORT, PLUS SUPPORT FOR EXTERNAL PROCONRULZ SCRIPT FILES Summary ProconRulz is a general-purpose Procon plugin that allows admin actions to be taken based on events and triggers. The most common usage is for weapon limits, e.g. "On Kill;Weapon SMAW;Kill" (which will limit the SMAW rockets by killing any player that kills with that weapon). Or you can limit players NOT using certain weapons, e.g. for a pistols-only server "On Kill;Not Damage Handgun;Kill" (which will kill any player that kills with anything NOT a pistol). Rulz for many example requirements are given at the end of this thread If you are new to ProconRulz, and look at the documentation, the fact that ProconRulz is now capable of enabling you to write sets of rulz that behave as killstreak announcers or in-game admin or rude-word-responders will appear scary at first, so don't forget ProconRulz was designed from the beginning to allow simple rulz to implement weapon limits, so it's easy to start with a single rule e.g. limiting nades with On Kill;Weapon M67;PlayerCount 3;Say Too many nade kills for %p%;Kill. ONLINE DOCUMENTATION HERE How to enter your rulz click here to expand this section: See below in this thread for sample rulz and an explanation of BF3/BF4 limitations so you don't ask the same "how do I block mortars" question as everyone else... ProconRulz has a very flexible range of conditions and actions that can be applied, so as your rulz get fancy you are in effect creating a custom plugin. But everyone begins thinking they "just" want a simple weapon limit. NEWS 25-Dec-2013: version 44j1 uploaded. Rulz .txt files now reloaded on plugin enable (useful for layer-server users). NEWS 17-Dec-2013: version 44h6 uploaded. New On RoundOver trigger that fired on end-of-round (useful for BF4). !knife rulz added. NEWS 9-Dec-2013: version 44g3 uploaded. BUGFIX version for new "On Init" trigger with BF3/4. Users who downloaded 44g.2 should replace with this version if they want to use the new On Init trigger (also used in snipersquad rulz set). NEWS 6-Dec-2013: version 44g2 uploaded. Sniper Squad limiter rulz added. Added Linux support for %ini_..% vars file. New 'On Init' trigger that can be used for simple startup values for rules. NEWS 2-Dec-2013: version 44f1 uploaded. Support for Linux external .txt rulz files. Updated sniper limit with additional !setsniper command (e.g. !setsniper bam) for admin to guarantee sniper slot to a player. NEWS 26-Nov-2013: version 44e2 uploaded. Support for BF4 with four weeks of testing (thanks D1bble, Tarreltje). Now rulz can be held in an external file and loaded by the plugin making it easier to share rulz sets e.g. for weapon limits, teamkill limits, announcers, etc. Older news click to expand: ProconRulz has been extensively used on BFBC2 servers (for BFBC2 see this thread*). That thread now has hundreds of entries so for BF3 I've started this new one. ProconRulz has relatively comprehensive documentation on its 'Details' tab, so please refer to that. For info, if you haven't downloaded the plugin yet, you can check out an cached version of the details info online here. Of course for the most up-to-date version of the documentation, check the plugin 'Details'. ProconRulz allows rulz of the format "Trigger;Conditions...;Actions..." with a wide choice of triggers, conditions and actions. The most trivial forms of weapon limits can be implemented with a single rule, e.g. to kill players using the M320 underslung rifle nade, use the single rule given as an example at the top of this post. However, with a bit of thought, it is possible to provide rulz with a more complex behaviour, e.g. warn on the first kill, kill on the third, kick on the fifth. ProconRulz installs with half-a-dozen default simple rulz that provide a template for your rulz if that helps. Currently included rulz sets Sniper Limit (proconrulz_sniperlimit.txt) - limits the number of snipers on each team to a maximum set at the top of the rulz. A sniper slot is reserved when the player kills with a sniper rifle. The sniper slot is released when the round ends, the player leaves, or the player kills with some other weapon and an announcement is issued to team. All players have the !snipers command which tells them the current snipers on their team. Also included is proconrulz_sniperdmrlimit.txt which is the same but limits both sniper rifles and DMR's. CREDIT tarreltje and see thread here* Sniper Squad Limit (proconrulz_snipersquad.txt) - only permits sniper kills if you are in a particular squad (default Echo). Also supports a !snipers command that tells users what's going on. (As above, also with proconrulz_sniperdmrsquad.txt for snipers andDMR's). CREDIT staazvaind. Announcer (proconrulz_announcer.txt) - gives a few kill messages (Fred knifed Barney) for you to modify. Multi-kills (proconrulz_multikill.txt) - keeps track of short-term multi-kill streaks and makes Quake-like announcements. Credit Bl1ndy and Panther. Rules (proconrulz_rules.txt) - simple rulz that display messages when any player types !rules - for you to modify for your server. Punish (proconrulz_punish.txt) Support of !punish / !p and !forgive / !f for teamkills. CREDIT ty_ger07 and russel5 Killstreak (proconrulz_killstreak.txt) Announces kill streaks at 5/10/15 kills etc, and when ended. Credit ty_ger07 Best 3 Players (proconrulz_best3players.txt) Particularly for TDM announces current highest kill player & each time that changes. CREDIT tarreltje. ************************************************** ************************************************ Plus, you can still edit additional rulz directly into the Plugin settings with these as examples for ideas below ************************************************** ************************************************ BF3 Map names and modes In case you need them in Map or MapMode conditions, BF3/BF4 names and modes are collected into this post*. ProconRulz doesn't really care what keys you use - it's up to you to check your conditions match whatever your server is sending. This is collected documentation for BF3 that you can find on the internet. Some current limitations of BF3/BF4 to be aware of click to expand: Some sample rulz KEEP the default logging On Kill rule at the end of all your rulz. This has a 'Log' action which is very helpful when your rulz don't pick up the condition you expected... (e.g. Log %pt% %k% %p% killed %v% with %w% (%wk%), damage %d%). You don't need to understand this now, just leave it in. Example 1. Limit a single weapon (usage suicidal, kick on 4th kill, ban on 6th kill): Click to expand: Example 2. Limit a weapon category via Damage condition (usage suicidal, kick on 4th kill, ban on 6th kill): Click to expand: Example 3. For a sniper/pistol server (usage of other weapons is suicidal, kick on 4th kill, ban on 6th kill): Click to expand: Example 4. Make teamkills suicidal Click to expand: Example 5. Stop use of rockets on map Operation Metro: Click to expand: Example 6. If you want to reduce the frequency of a weapon use e.g. limit players to max 2 nade kills per minute: Click to expand: Example 7. Kill Streak Announcer by ty_ger07. Please see this dedicated thread* Example 8. Basic Cheater Detector Click to expand: Example 9. Limit vehicle use when teams are small Click to expand: Example 10. Easy in-game admin Click to expand: Example 11. No MAV's on Metro Click to expand: Example 12. Unreal Tournament Multi Kills Announcer by Bl1ndy Please see this dedicated thread* Example 13. Sniper Limit V2!!! (credit tarreltje) Please see this dedicated thread* Click to expand for a bit of explanation of how these rulz work in BF3: Example 14. Multi-language 'join' welcome messages (credit Angry_AGAIN) Click to expand: Example 15. Knife/Defib/Repair Tool Kill YELL Announcer This plugin will put a Yell message on the screen each knife or other melee weaon kill Click to expand: Example 16. End of Round Stats Announcer by tarreltje These rules give the 'most kills', 'most knife kills', 'most headshots' playernames and kill counts during and near the end of the round. As with all ProconRulz rulz you can tweak the rulz for different stats or timings as you want. Please see this dedicated thread* Example 17. Country filter by L2Devlier Here's an interesting concept, illustrating the global villiage we live (game) in. It's possible you live in a small country, adjacent to a large country (e.g. China), and you're trying to build a local community, but end up with the server being dominated by large numbers of gamers texting in the foreign language from the large-country-next-door, what can you do. L2Devlier came up with this solution in in a long PM to me emphasized this is not about being racist, just trying to compensate for limitations in the EA queueing system if you're trying to build a local community. For other-country-applicability you'll need to read the rulz, understand what they do, and tweak the country-codes as appropriate. Click to expand the rulz: Example 18. BEST 3 PLAYERS Announcer by tarreltje Every 100 tickets, these rulz announce the top 3 players based on kills, e.g.: BEST 3 PLAYERS : 1st Tarreltje 1000 kills 2nd Gaga 580 kills 3rd Noob 30 kills Please see this dedicated thread* Example 19. SERVER STATS by tarreltje On the first kill of each round, server will announce the player names with the highest kill counts, e.g. DUTCH COWBOYS SERVER STATS 1st RINUSS 1000 kills 2nd BAMBAM 500 kills 3th GAGA 200 kills Most Knives: RINUSS 3000 knives Please see this dedicated thread* Example 20. !punish and other TeamKill protection rulz by ty_ger The !punish, !forgive commands you've probably seen on a variety of servers, plus optional rulz so you can automatically punish teamkillers if you prefer that for your server. Please see this dedicated thread* Example 21. !votekick - ingame command for players to vote to kick another player Click to expand: Example 22. Adaptive SPAMBOT by tarreltje Easy to modify, these rulz 'chat' different messages according to the map 'Mode' that is currently running, i.e. you can have message for TeamDeathMatch, and different messages for Conquest. The same rulz could be tweaked if you want messages based on Map, rather than MapMode (i.e. some messages for Caspian, different messages for Seine Crossing...) Please see this dedicated thread* Example 23. Simple Aimbot headshot detector credit russel5 These rulz count headshots and if it's more than 60% after 30 kills (these params in line 5) and it's not a sniper rifle, player is banned. click here for rulz: Versions summary: v44 (Nov 26 2013): Support for BF4, plus the support for separate rulz .txt files (incl Linux from 44f.1 credit FritzE).On RoundOver trigger. v43 (Aug 21 2012): Arithmetic in Set/If statements, permanent 'ini' vars, rounding, new date/time and teamsize variables, logging options. New player %score% variable, '+' as 1st character on line allows multi-line rulz. v41 (Jun 29 2012): More flexible support for in-game admin commands e.g. !kick v40 (May 15 2012): Quoted strings can be used in rulz e.g. Set %server_message% "Get ready for next round" v39 (Apr 12 2012): Yell added (with BF3 R20). Yell/Say can now be to all, Player, Squad, Team (e.g. SquadYell). Player/Victim country codes available (e.g. %pcountry% see online docs). Tickets remaining now in %team_score%. v38 (Jan 18 2012): any order now permitted for intermixing actions and conditions. server, team, squad, player variables now more easily mixable, Exec can now run PunkBuster commands in addition to the v37 PBBan & PBTempBan, TargetPlayer condition enhanced for ease of use in rulz. v37: PunkBuster Kicks/bans, new rulz processing flow, rulz variables v34: Players 'protected' from kicks, kills, bans by ProconRulz now Admins, Admins+Reserved_Slots, Neither, plus Player and Clan whitelist. v33: BF3 compatibility v1..32 (see ProconRulz BFBC2 thread) Downloads: 15,811 + count on this version: Please note: There is an unsupported version below ProconRulz_NL.zip which allows new lines in messages. Example new line: Code: On Say;Text /show;PlayerYell \nHello %p%\nThis is your first visit, please type !rules It should look like this on the player screen: [ADMIN] Hello DarthVader This is your first visit, please type !rules Attached Files: ProconRulz_44j1.zip ProconRulz_NL.zip proconrulz_documentation.pdf
  5. B7ackhawk

    Adkats

    Hello after i update the procon i got this problem !wnuke give this !tbanday not work i give to all admin full in role setting
  6. Added ability to disable the new API check for player country info Updated GeoIP database file Removed usage sending stats Added EZRCON ad banner If you are upgrading then you may need to add these two lines to your existing installation in the file procon.cfg. To enable these options just change False to True. procon.private.options.UseGeoIpFileOnly False procon.private.options.BlockRssFeedNews False
  7. got a bit borred here and made this litle snipit for proconrulz. not willing to fill procon with admin ,but giving trusted players some admin privileges ? ,this snipit can help u out. only a procon admin can add special admins. use: /set admin <playername> (or part of it) /remove admin <playername> ,This wil revoke extended commands /read admin <playername> this checks if a player has access enjoy and abuse it for own fun For more information, see the BF4 server documentation how i set this stuff up. # Extended admin commands: R1 08-10-2020 initial stuff # Reading who has admin stuff On Say;Text !read admin,/read admin targetplayer;If %ini_extended_admin[%t%]% = 0; playerSay player %t% has NO extended admin status:( :(;end targetplayer;If %ini_extended_admin[%t%]% != 0;playerSay player %t% has extended admin status :);end If %ini_extended_admin[%p%]% = 0; playerSay player %p% has NO extended admin status:(;end If %ini_extended_admin[%p%]% != 0;playerSay player %p% has extended admin status :);end # what am i ? ,admin or lamer On say;text !whatami;If %ini_extended_admin[%p%]% = 0;playersay player %p% is not in the extended admin list :(;end On say;text !whatami;If %ini_extended_admin[%p%]% != 0;playerSay player %p% is in the extended admin list :);end # granting a player extended admin command (procon admins only can do this) On Say;admin;Text !set admin,/set admin targetplayer;If %ini_extended_admin[%t%]% = 0;Set %ini_extended_admin[%t%]% granted;PlayerSay %t% has granted extended admin permissions;end targetplayer;If %ini_extended_admin[%t%]% != 0;PlayerSay %t% already has granted extended admin permissions;end playersay VOID, we need a name, or is already admin, check with !read admin <name>;end # removing extended admin status (procon admins only can do this) On Say;admin;Text !remove admin,/remove admin targetplayer;If %ini_extended_admin[%t%]% = 0;playersay %t% was already removed from the extended admin commands;end targetplayer;not If %ini_extended_admin[%t%]% = %p%;If %ini_extended_admin[%t%]% != 0;playersay Admin %t% cant remove him self from the list;end targetplayer;If %ini_extended_admin[%t%]% = %p%;If %ini_extended_admin[%t%]% != 0;Set %ini_extended_admin[%t%]% 0;playersay %t% has no longer access to extended commands;end playersay VOID, we need a name, or is already removed as admin, check with !read admin <name>;end # this will kill a player on say;text !lamer;If %ini_extended_admin[%p%]% != 0;targetplayer;exec Admin.Killplayer %t%;say Killing %t% for %targettext% # This wil roundban a player for 2 rounds on say;If %ini_extended_admin[%p%]% != 0;text /rban,!rban ;targetplayer;playersay initiating roundban;say %t% got ROUNDBAN for %targettext%;exec banlist.add name %t% rounds 2 "%targettext%";exec banlist.save;exec banlist.list; two demo commands are added. !lamer ,that wil kill a player. !rban ,this will roundban a player for 2 active rounds. enjoy.
  8. our litle group has a BF3 and a BF4 server. Dont ask me how i messed up, but i let the bfadmincp i had linked to the wrong website bf4admincp, and not bf3admincp, wel, with the comming of the bf4 server i wanted to correct that. for the BF3 server is was easy, cleaning the cache, copying the env.php to its proper location, and done, well, admins needed to login again, but hey. however, for the BF4 server this was a bit harder to do, 1st of all i had to make 3 links in mysql (hosted local on a own server here), ip adres from the procon layer (i dont want unwanted SQL hammering), one to localhost, and one the the real IP adres) but for some reason, i dont get the chatlogs to work, bfadmincp is also hosted localy. on bf3 it simply works as it should be, but not on the bf4 server. any sugestion, i gues i messed up with the mysql setup,
  9. I'm having issues with permanent bans disappearing from the ban list. They are not being manually removed and it is not happening on a consistent basis, some bans stick and some don't. It happens for bans input by some admins but not others. It appears as though all of the admins that this happens to are using the latest version and they all have the same admin powers. Anyone had this happen?
  10. so, i am seting up a database for testing before we move it. After a while i noticed the message below, tought, write permission ? ,but chatlogger and other stuff is working. in short, it refuses to write the tbl_server data becouse it is mowning about some weardness,, now i am not a guru in this,,,but any sugestion what is going on here. [15:44:19 31] [Statslogger]Error: Error in Startstreaming: [15:44:19 31] Message: Cannot add or update a child row: a foreign key constraint fails (`ukfbf4server`.`tbl_server_player`, CONSTRAINT `fk_tbl_server_player_tbl_server` FOREIGN KEY (`ServerID`) REFERENCES `tbl_server` (`ServerID`) ON DELETE CASCADE ON UPDATE NO ACTION) [15:44:19 31] Native: -2147467259 [15:44:19 31] Source: MySql.Data [15:44:19 31] StackTrace: at MySql.Data.MySqlClient.MySqlStream.ReadPacket() at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) at MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) at MySql.Data.MySqlClient.MySqlDataReader.NextResult() at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() at PRoConEvents.CChatGUIDStatsLogger.StartStreaming() [15:44:19 86] [Statslogger]Error: Error in Startstreaming OuterException: System.NullReferenceException: Object reference not set to an instance of an object. at PRoConEvents.CChatGUIDStatsLogger.DisplayMySqlErrorCollection(MySqlException myException) at PRoConEvents.CChatGUIDStatsLogger.StartStreaming() [15:44:20 74] UltimateMapManager: INFO -> Level loaded. [15:44:29 06] [Statslogger]Error: getUpdateServerID1: System.InvalidOperationException: Nested transactions are not supported. at MySql.Data.MySqlClient.ExceptionInterceptor.Throw(Exception exception) at MySql.Data.MySqlClient.MySqlConnection.Throw(Exception ex) at MySql.Data.MySqlClient.MySqlConnection.BeginTransaction(IsolationLevel iso) at MySql.Data.MySqlClient.MySqlConnection.BeginTransaction() at PRoConEvents.CChatGUIDStatsLogger.getUpdateServerID(CServerInfo csiServerInfo) Thnxs.
  11. View File On-Spawn Loadout Enforcer for Infantry/Vehicles - AdKatsLRT Overview All infantry and vehicle loadouts/equipment in Battlefield 4 can be denied on-spawn using this plugin, with customizable messages for each item. Vehicle loadouts and equipment can be enforced on spawn for everyone, or on kill with specific vehicles. Settings allow for enforcement of problem players only, or all players, with per-item gradation of that severity. Basic Enforce every infantry item (any primary, secondary, attachments for either, gadgets, knifes, and grenades) in the game on-spawn. Enforce every vehicle item (primaries, secondaries, countermeasures, optics, and gunner options) in the game, on-spawn. Map/Mode specific enforcement options for mixed-mode servers are available. Any update made to the game's weapons are automatically imported and made available, so if DICE changes or adds weapons, they are immediately enforceable. Players notified and thanked when they fix their loadouts after being killed. Customizable kill messages for each denied item, with combined messages and details if more than one is spawned in the same loadout. Statistics on enforcement, including percent of players enforced, percent killed for enforcement, percent who fixed their loadouts after kill, and percent who quit the server without fixing their loadouts after kill. With AdKats Two levels of enforcement, allowing multiple levels of severity for each item. In-game commands to call more strict loadout enforcement on specific players. Using the reputation system, reputable players are optionally not forced to change their loadouts, as we know they are not going to use them. Admins are optionally whitelisted from spawn enforcement, but still fall under trigger enforcement if marked or punished. Other plugins can call loadout checks and enforcement, so it can enhance your current autoadmin. Development by Daniel J. Gradinjan (ColColonCleaner) If you find any bugs, please inform me about them on the MyRCON forums and they will be fixed ASAP. Procon, and optionally AdKats. Basic functions only require Procon, however, for advanced functions, it requires AdKats 6.9.0.0 or later to be installed and running. Separated Layer IPs. This is a battlelog intensive plugin, do not run it on more than one battlefield server from the same Procon layer IP address. If you have multiple servers to enforce, you must run the plugin from different Procon layer IP addresses. If you do not heed this warning, your layers run the risk of being temporarily IP banned from battlelog. Optionally Install AdKats. AdKatsLRT can run independently from the AdKats base plugin, but certain advanced functions cannot be used as a result. To install the latest version of AdKats, view the AdKats Install Instructions. After install make sure you are running version 6.9.0.0 or later. Download and install AdKatsLRT. The plugin is installed like any other procon plugin. Enable AdKatsLRT. AdKatsLRT will start and fetch required information, then wait for the first player list response from either AdKats or the server. Once that comes through, it will complete startup and loadout enforcement will be online. Enjoy your new admin tool! If you have any problems installing AdKatsLRT please let me know on the MyRCON forums and I'll respond promptly. All instances of AdKatsLRT are tracked once installed. Item Library Every infantry/Vehicle item in the game (about 3500 items), can be enforced here. The settings are split into several sections; Weapons, Weapon Accessories, Gadgets, and Vehicle Weapons/Unlocks, in that order. Loadout Processing Deciding Enforcement Type The gist of it for infantry: Deny on trigger denies that weapon/accessory for problem players and players you've manually marked, deny on spawn denies that weapon for everyone except admins and reputable players. The gist of it for vehicles: By default, enforcement is on kill with specific vehicles. This is important because not everyone uses vehicles, so only those players using restricted vehicles should have their loadouts enforced for those vehicles. Optionally you can enforce on spawn for vehicle loadouts, regardless, which is not advised but is available as an option. Details for infantry: Loadouts have several reasons for being checked; A player spawns, gets reported, gets punished, gets marked, or has more than X (configurable) infraction points. Any of these instances will call a loadout check, and the reason for checking them changes the way the enforcement works. When running loadout enforcement for a specific player, the reason, and action if invalid, is first decided. The following are results for specific reasons, in order of priority: If a player was marked they are set under trigger enforcement and will be slain for invalid loadout of any kind. If a player is punished they are set under trigger enforcement and will be slain for invalid loadout of any kind. If a player was reported and their reputation is non-positive they are set under trigger enforcement and will be slain for invalid loadout of any kind. If they are slain due to a report that report is automatically accepted. If a player has more than X (configurable) infraction points they are set under trigger enforcement and will be slain for invalid loadout of any kind. If none of the above checks are hit, are not reputable, and are not an admin, they are set under spawn enforcement. Secondary checks are customizable. Informing and Acting If a player is about to be slain for loadout enforcement, regardless of enforcement type, they are shown two messages. The first is a generic message containing all denied weapons they have in their loadout "playername please remove [denied weapons] from your loadout". This messages is sent using private SAY. After that, the specific messages written by the admin for each denied item is displayed. These customizable messages are found in setting sections 8A and 8B, once denied items are selected. These messages are sent using private TELL. Immediately after informing the player of denied items in their loadout, they are admin killed. If they are under manual trigger enforcement, admins are notified of their demise, all other messages are private. Thank you messages are given to players who fix their loadouts. If a player is under trigger enforcement, admins are notified that they fixed their loadout. Debug Messages Setting your debug level to at least 2 will display statistics in the console when stats change. The stats available are percent under loadout enforcement (should be nearly 100%), percent killed for loadout enforcement, percent who fixed their loadouts after kill, and percent who quit the server without fixing after being killed. Certain commands in AdKats are modified by this plugin. The changes to those commands are listed below. Command Default Text Changes Punish Player punish Punish works as normal, but also initiates trigger level enforcement on the target player for the duration the plugin is online. Mark Player mark Instead of marking a player for leave notification only, it also initiates trigger level enforcement on the target player for the duration the plugin is online. Report Player report Reports initiate trigger level enforcement on targeted players with non-positive reputation. If the reported player has invalid items in their loadout, the report is automatically accepted, and admins notified of such. Call Admin admin Same changes as Report Player. 0. Instance Settings: 'Integrate with AdKats' - Whether to integrate functions with AdKats. When enabled this unlocks more setting options. 'Spawn Enforce Admins' - Viewable when integrating with AdKats. Adds admins to spawn enforcement. 'Spawn Enforce Reputable Players' - Viewable when integrating with AdKats. Adds reputable players (> 15 rep) to spawn enforcement. 'Trigger Enforce Minimum Infraction Points' - Viewable when integrating with AdKats. Sets the minimum infraction point count to automatically add problem players to trigger level enforcement. 1. Display Settings: 'Display Preset Settings' - When enabled, the 'Preset Settings' section will be displayed. 'Display Map/Mode Settings' - When enabled, the 'Map/Mode Settings' section will be displayed. 'Display Weapon Settings' - When enabled, the 'Weapons' section will be displayed. 'Display Weapon Accessory Settings' - When enabled, the 'Weapon Accessories' section will be displayed. 'Display Gadget Settings' - When enabled, the 'Gadgets' section will be displayed. 'Display Vehicle Settings' - When enabled, the 'Vehicle Weapons/Unlocks' section will be displayed. 2. Preset Settings: 'Coming Soon' - This setting block will soon contain settings for presets, like 'No Frag Rounds', or 'No Explosives'. 3. Map/Mode Settings: 'Enforce on Specific Maps/Modes Only' - When enabled, the Map/Mode selection settings are displayed. Loadout enforcement will only be enabled on the selected maps. '*MapModeIdentifier Enforce?' - When enabled, the selected Map/Mode will be included in loadout enforcement. 4. Weapons: '*WeaponIdentifier Allow on trigger?' - Viewable when integrating with AdKats. Whether this item should be allowed/denied when a player is under trigger level enforcement. '*WeaponIdentifier Allow on spawn?' - Appears when a weapon is denied under trigger enforcement, or not using AdKats integration. Whether this item should be allowed/denied when a player is under spawn level enforcement. 5. Weapon Accessories: '*AccessoryIdentifier Allow on trigger?' - Viewable when integrating with AdKats. Whether this item should be allowed/denied when a player is under trigger level enforcement. '*AccessoryIdentifier Allow on spawn?' - Appears when a weapon is denied under trigger enforcement, or not using AdKats integration. Whether this item should be allowed/denied when a player is under spawn level enforcement. 6. Gadgets: '*GadgetIdentifier Allow on trigger?' - Viewable when integrating with AdKats. Whether this item should be allowed/denied when a player is under trigger level enforcement. '*GadgetIdentifier Allow on spawn?' - Appears when a weapon is denied under trigger enforcement, or not using AdKats integration. Whether this item should be allowed/denied when a player is under spawn level enforcement. 7. Vehicle Weapons/Unlocks: 'Spawn Enforce all Vehicles' - When enabled, if any player spawns with a vehicle loadout that is invalid it will slay them. When disabled, it will wait for them to use the vehicle before slaying them. '*VehicleIdentifier Allow on kill?' - Whether this item should be allowed/denied when a player kills with the specified vehicle. '*VehicleIdentifier Allow on spawn?' - Appears when the 'Spawn Enforce all Vehicles' setting is enabled. Whether this item should be allowed/denied when a player spawns, regardless of where they are. 8A. Denied Item Kill Messages: '*ItemIdentifier Kill Message' - The specific message sent to players when they are slain for having this item in their loadout. 8B. Denied Item Accessory Kill Messages: '*AccessoryIdentifier Kill Message' - The specific message sent to players when they are slain for having this accessory in their current loadout. 8C. Denied Vehicle Item Kill Messages: '*VehicleItemIdentifier Kill Message' - The specific message sent to players when they are slain for having this item in their vehicle loadout. D99. Debug Settings: 'Debug level' - Indicates how much debug-output is printed to the plugin-console. 0 turns off debug messages (just shows important warnings/exceptions/success), 1 includes kill notifications, 2 includes stats, 3 includes queue information, 4 includes each player's full loadout, and 5 is overly detailed. Submitter ColColonCleaner Submitted 12/24/19 Category Plugins
  12. Originally Posted by ty_ger07*: The full featured stats webpage! BF4 Stats Web Page Overview web_stats_index.jpg web_stats_demo.jpg web_stats_banner.jpg Features: - Easy setup. - Individual server or combined server stats. - Country stats. - Map stats. - Player stats. - Weapon stats. - Dog tag stats. - Game server stats. - Live scoreboard. - Top players list / leaderboard. - Player name search. - Top players of the Week. - Suspicious players search. - Server chat log. - Stats signature images. - Gametracker-style server banners. - Battlelog theme. Demo https://egc-la.evga.com/battlefield/index.php Prerequisites This webpage code requires the use of a stats database which is created by XpKiller's BF4 Chat, GUID, Stats and Mapstats Logger Plugin* version 1.0.0.2 or newer. If you need help with XpKiller's stats logging plugin, you must seek assistance in XpKiller's thread. For best compatibility with this code, use the following settings in XpKiller's PRoCon logging plugin: "Enable Statslogging_" : Yes "Enable Weaponstats_" : Yes "Enable Livescoreboard in DB_" : Yes "tableSuffix" : None (empty) "MapStats ON_" : Yes "Session ON_" : Yes "Save Sessiondata to DB_" : Yes "Log playerdata only (no playerstats)_" : No This webpage code also requires that you have access to a web server running a modern version of PHP and that you have permission to modify files on the web server. Additional Info GitHub: http://tyger07.github.io/BF4-Server-Stats Installation Steps: Download the following file: https://github.com/tyger07/BF4-Serve...zipball/master Extract the files. You may change the appearance of the page by modifying the stats.css file in the common folder. Fill in the required parameters before using this code. You must place the necessary data between the the following single quotation marks (''). Note: You may not include single quotation marks (') in the following fields. For instance, you may not call your clan 'Ty_ger07's Clan' as it will create a PHP compilation error. For example, this would not work: You must use a PHP delimiter if you wish to use single quotes within the following fields.For example, this would work: You must fill in the following information in the config.php file found in the config folder 1) Input your stats database host, stats database user name, stats database password, and stats database name. Code: // DATABASE INFORMATION DEFINE('HOST', ''); // database host address DEFINE('PORT', '3306'); // database port - default is 3306 DEFINE('NAME', ''); // database name DEFINE('USER', ''); // database user name - sometimes the same as the database name DEFINE('PASS', ''); // database passwordFor example: Note: Some web server providers (such as GoDaddy) use the same value for database name and database user name. 2) Input your clan name as you would like it to appear in the stats pages. Code: // CLAN NAME $clan_name = ''; // your gaming clan or organization nameFor example: 3) Input your desired banner image URL if you want one other than the default to be displayed. Code: // PAGE BANNER $banner_image = './images/bf4-logo.png'; // your desired page banner 4) Enter the URL which you would like users to redirect to if they click your banner image. Code: // BANNER LINK $banner_url = 'http://tyger07.github.io/BF4-Server-Stats/'; // where clicking the banner will take youEnjoy! (if you want to donate, ask me how) Changelog: Refer to: https://github.com/tyger07/BF4-Serve...commits/master
  13. I'm trying to make a rulz file that skips the round over screen after 25 seconds. Skipping the roundover screen seems to be easy (On RoundOver; Exec maplist.nextlevel) or something like that, but delaying the skip to skip after 25 seconds of waiting? I can't seem to figure that out. If it's possible with insane limits i'd be down to get the plugin too.
  14. Hi all where we can to download the plugin for BF4 servers?
  15. B7ackhawk

    procon crash

    Hello . i had this problem today i cant kill or move any one . some plgun work and some not
  16. So I've been creating another Ultimate map manager type plugin specifically suited for our server's needs and i've been hitting a roadblock where whenever I add a new maplist or map, the variables just disappear. Does anyone have any idea as to why plugin variables might disappear?
  17. I am facing a problem on my server BF4. KD limit does not work in the Insane Limits plugin, the rest of the limits work properly. In previous versions, for example 1.5.3.2 and earlier, everything works fine. Please check this information and correct it if possible.
  18. Hello Im quite new to using Procon for BF4 and coding pluggins is not really my forte. I want to make a 2 KDR limit with Insane Limit for one of my servers, but the code i have used until now have not been successful. C ode i was trying to use for reference: https://sourceb.in/52b7f153e1 If anyone could help me out with this matter would be greatly appreciated :))
  19. Custom settings on round over This allows you to use custom tickrate/tickets per game mode or per map, the code has all in one to see examples first check - Code evaluation - OnRoundOver int tickets = 100; int health = 100; int delay = 100; int bleed = 100; int tickrate = 40; plugin.ServerCommand ("vars.soldierHealth", health.ToString ()); plugin.ServerCommand ("vars.vehicleSpawnDelay", delay.ToString ()); plugin.ServerCommand ("vars.ticketBleedRate", bleed.ToString ()); plugin.PRoConChat ("^bRestarted values"); plugin.ConsoleWrite ("^bRestarted values"); Thread scriptdelay = new Thread (new ThreadStart (delegate { Thread.Sleep (3 * 1000); if (server.NextMapFileName == "MP_Prison") { //tickrate per map tickrate = 60; plugin.ServerCommand ("vars.OutHighFrequency", tickrate.ToString ()); plugin.PRoConChat ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); plugin.ConsoleWrite ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); } else { tickrate = 40; plugin.ServerCommand ("vars.OutHighFrequency", tickrate.ToString ()); plugin.PRoConChat ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); plugin.ConsoleWrite ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickrate: [^4" + tickrate + "Hz]"); } Thread.Sleep (5 * 1000); if (server.NextGamemode == "ConquestLarge0") { //CQL tickets = 125; plugin.ServerCommand ("vars.serverName"); plugin.ServerCommand ("vars.gameModeCounter", tickets.ToString ()); plugin.PRoConChat ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickets: " + (tickets * 8).ToString ("F0") + " [^4" + tickets + "^0%]"); plugin.ConsoleWrite ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickets: " + (tickets * 8).ToString ("F0") + " [^4" + tickets + "^0%]"); } if (server.NextGamemode == "RushLarge0") { //RUSH if (server.PlayerCount <= 29) { tickets = 150; } if ((server.PlayerCount >= 30) && (server.PlayerCount <= 44)) { tickets = 215; } if (server.PlayerCount >= 45) { tickets = 300; } plugin.ServerCommand ("vars.serverName"); plugin.ServerCommand ("vars.gameModeCounter", tickets.ToString ()); plugin.PRoConChat ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickets: [^4" + tickets + "^0%]"); plugin.ConsoleWrite ("^bNext map: [^2" + plugin.FriendlyMapName (server.NextMapFileName) + "^0<> ^3" + plugin.FriendlyModeName (server.NextGamemode) + "^0] | Tickets: [^4" + tickets + "^0%]"); } if (server.NextGamemode == "ConquestSmall0") { //CQS tickets = 150; plugin.ServerCommand ("vars.serverName"); plugin.ServerCommand ("vars.gameModeCounter", tickets.ToString ()); } })); scriptdelay.Name = "ScriptDelay"; scriptdelay.Start (); return false; Another script: Custom map by command Usage is simple, use simple regex I have put in the code so: !map dawn cql = accept (next map is Dawnbreaker with Conquest Large 1 round) Special case: !map dawn cql 2 = accept (next map is Dawnbreaker with Conquest Large 2 rounds) You may find it useful on servers without votemap, votemap can trigger the change ! So be aware of it and if you use votemap then write the command after the vote is done REMEMBER !!! Use code below map stuff for const index number to don't make your index from 10 to 20 for example... First code: map command first check - Code evaluation - OnAnyChat //OnAnyChat //first check: code int level = 2; try { level = Convert.ToInt32 (plugin.getPluginVarValue ("debug_level")); } catch (Exception e) { } Match m = Regex.Match (player.LastChat, @"^\s*!map\s+([^\s]+)\s+([^\s]+)$", RegexOptions.IgnoreCase); Match m2 = Regex.Match (player.LastChat, @"^\s*!map\s+([^\s]+)\s+([^\s]+)\s+([^\s]+)$", RegexOptions.IgnoreCase); List<String> vips = plugin.GetReservedSlotsList (); if (!vips.Contains (player.Name)) { plugin.SendPlayerMessage (player.Name, "You Can't use this command."); return false; } List<String> mapFileNames = server.MapFileNameRotation; List<String> modeNames = server.GamemodeRotation; List<int> rounds = server.LevelRoundsRotation; Converter<String, int> MapCodeToIndex = delegate (String mc) { int i = 0; foreach (String mapFileName in mapFileNames) { if (Regex.Match (mapFileName, mc, RegexOptions.IgnoreCase).Success) { return i; } i = i + 1; } return i; }; if(!m.Success) return false; //if(!m2.Success) will fail for "m" match so leave it if (m.Success) { int r = 1; String name = m.Groups[1].Value; String mode = m.Groups[2].Value; Dictionary<string, string> dict = new Dictionary<string, string> (); dict.Add ("locker", "MP_Prison"); dict.Add ("zavod", "MP_Abandoned"); dict.Add ("lancang", "MP_Damage"); dict.Add ("flood", "MP_Flooded"); dict.Add ("golmud", "MP_Journey"); dict.Add ("paracel", "MP_Naval"); dict.Add ("hainan", "MP_Resort"); dict.Add ("rogue", "MP_TheDish"); dict.Add ("dawn", "MP_Tremors"); dict.Add ("silk", "XP1_001"); dict.Add ("altai", "XP1_002"); dict.Add ("gulin", "XP1_003"); dict.Add ("dragon pass", "XP1_004"); dict.Add ("caspian", "XP0_Caspian"); dict.Add ("firestorm", "XP0_Firestorm"); dict.Add ("metro", "XP0_Metro"); dict.Add ("oman", "XP0_Oman"); dict.Add ("islands", "XP2_001"); dict.Add ("nansha", "XP2_002"); dict.Add ("wavebr", "XP2_003"); dict.Add ("mortar", "XP2_004"); dict.Add ("pearl", "XP3_MarketPl"); dict.Add ("propaganda", "XP3_Prpganda"); dict.Add ("lumpini", "XP3_UrbanGdn"); dict.Add ("sunken", "XP3_WtrFront"); dict.Add ("whiteout", "XP4_Arctic"); dict.Add ("hammerhead", "XP4_SubBase"); dict.Add ("hangar", "XP4_Titan"); dict.Add ("giants", "XP4_WalkerFactory"); dict.Add ("night", "XP5_Night_01"); dict.Add ("outbreak", "XP6_CMP"); dict.Add ("valley", "XP7_Valley"); string mapcorrect = dict[name]; Dictionary<string, string> mapss = new Dictionary<string, string> (); mapss.Add ("locker", "locker"); mapss.Add ("zavod", "zavod"); mapss.Add ("lancang", "lancang"); mapss.Add ("flood", "flood"); mapss.Add ("golmud", "golmud"); mapss.Add ("paracel", "paracel"); mapss.Add ("hainan", "hainan"); mapss.Add ("rogue", "rogue"); mapss.Add ("dawn", "dawn"); mapss.Add ("silk", "silk"); mapss.Add ("altai", "altai"); mapss.Add ("gulin", "gulin"); mapss.Add ("dragon pass", "dragon pass"); mapss.Add ("caspian", "caspian"); mapss.Add ("firestorm", "firestorm"); mapss.Add ("metro", "metro"); mapss.Add ("oman", "oman"); mapss.Add ("islands", "islands"); mapss.Add ("nansha", "nansha"); mapss.Add ("wavebr", "wavebr"); mapss.Add ("mortar", "mortar"); mapss.Add ("pearl", "pearl"); mapss.Add ("propaganda", "propaganda"); mapss.Add ("lumpini", "lumpini"); mapss.Add ("sunken", "sunken"); mapss.Add ("whiteout", "whiteout"); mapss.Add ("hammerhead", "hammerhead"); mapss.Add ("hangar", "hangar"); mapss.Add ("giants", "giants"); mapss.Add ("night", "night"); mapss.Add ("outbreak", "outbreak"); mapss.Add ("valley", "valley"); string mapcheck = mapss[name]; Dictionary<string, string> modes = new Dictionary<string, string> (); modes.Add ("cql", "ConquestLarge0"); modes.Add ("cqs", "ConquestSmall0"); modes.Add ("domination", "Domination0"); modes.Add ("defuse", "Elimination0"); modes.Add ("obli", "Obliteration"); modes.Add ("rush", "RushLarge0"); modes.Add ("tdm", "TeamDeathMatch0"); modes.Add ("sqdm", "SquadDeathMatch0"); modes.Add ("airsup", "AirSuperiority0"); modes.Add ("ctf", "CaptureTheflag0"); modes.Add ("cas", "CarrierAssaultSmall0"); modes.Add ("cal", "CarrierAssaultLarge0"); modes.Add ("sqobli", "SquadObliteration0"); modes.Add ("gunmaster", "GunMaster0"); modes.Add ("guntroll", "GunMaster1"); string modecorrect = modes[mode]; Dictionary<string, string> modes2 = new Dictionary<string, string> (); modes2.Add ("cql", "cql"); modes2.Add ("cqs", "cqs"); modes2.Add ("domination", "domination"); modes2.Add ("defuse", "defuse"); modes2.Add ("obli", "obli"); modes2.Add ("rush", "rush"); modes2.Add ("tdm", "tdm"); modes2.Add ("sqdm", "sqdm"); modes2.Add ("airsup", "airsup"); modes2.Add ("ctf", "ctf"); modes2.Add ("cas", "cas"); modes2.Add ("cal", "cal"); modes2.Add ("sqobli", "sqobli"); modes2.Add ("gunmaster", "gunmaster"); modes2.Add ("guntroll", "guntroll"); string modecheck1 = modes2[mode]; if (server.MapFileNameRotation.Contains (mapcorrect)) { int mapIndex = MapCodeToIndex (mapcorrect); if (mapIndex < modeNames.Count && modeNames[mapIndex] == modecorrect) { if (level >= 2) plugin.ConsoleWrite ("^b[MAP]^n special case, setting next to existing map entry #" + mapIndex + ", " + plugin.FriendlyMapName (mapcorrect)); plugin.SendGlobalMessage ("Next map: " + plugin.FriendlyMapName (mapcorrect) + " " + plugin.FriendlyModeName (modecorrect) + " Rounds: " + r.ToString ()); // Set it as the next map plugin.ServerCommand ("mapList.setNextMapIndex", mapIndex.ToString ()); return false; } } int lastMap = server.MapFileNameRotation.Count; plugin.ConsoleWrite ("^b[MAP]^n setnext: temp map inserted at index #" + lastMap); plugin.SendGlobalMessage ("Next map: " + plugin.FriendlyMapName (mapcorrect) + " " + plugin.FriendlyModeName (modecorrect) + " Rounds: " + r.ToString ()); plugin.ServerCommand ("mapList.add", mapcorrect, modecorrect, r.ToString ()); plugin.ServerCommand ("mapList.setNextMapIndex", lastMap.ToString ()); // Refresh map list plugin.ServerCommand ("mapList.list"); } if (m2.Success) { int r = 1; String name = m2.Groups[1].Value; String mode = m2.Groups[2].Value; r = Convert.ToInt32 (m2.Groups[3].Value); Dictionary<string, string> dict = new Dictionary<string, string> (); dict.Add ("locker", "MP_Prison"); dict.Add ("zavod", "MP_Abandoned"); dict.Add ("lancang", "MP_Damage"); dict.Add ("flood", "MP_Flooded"); dict.Add ("golmud", "MP_Journey"); dict.Add ("paracel", "MP_Naval"); dict.Add ("hainan", "MP_Resort"); dict.Add ("rogue", "MP_TheDish"); dict.Add ("dawn", "MP_Tremors"); dict.Add ("silk", "XP1_001"); dict.Add ("altai", "XP1_002"); dict.Add ("gulin", "XP1_003"); dict.Add ("dragon pass", "XP1_004"); dict.Add ("caspian", "XP0_Caspian"); dict.Add ("firestorm", "XP0_Firestorm"); dict.Add ("metro", "XP0_Metro"); dict.Add ("oman", "XP0_Oman"); dict.Add ("islands", "XP2_001"); dict.Add ("nansha", "XP2_002"); dict.Add ("wavebr", "XP2_003"); dict.Add ("mortar", "XP2_004"); dict.Add ("pearl", "XP3_MarketPl"); dict.Add ("propaganda", "XP3_Prpganda"); dict.Add ("lumpini", "XP3_UrbanGdn"); dict.Add ("sunken", "XP3_WtrFront"); dict.Add ("whiteout", "XP4_Arctic"); dict.Add ("hammerhead", "XP4_SubBase"); dict.Add ("hangar", "XP4_Titan"); dict.Add ("giants", "XP4_WalkerFactory"); dict.Add ("night", "XP5_Night_01"); dict.Add ("outbreak", "XP6_CMP"); dict.Add ("valley", "XP7_Valley"); string mapcorrect = dict[name]; Dictionary<string, string> mapss = new Dictionary<string, string> (); mapss.Add ("locker", "locker"); mapss.Add ("zavod", "zavod"); mapss.Add ("lancang", "lancang"); mapss.Add ("flood", "flood"); mapss.Add ("golmud", "golmud"); mapss.Add ("paracel", "paracel"); mapss.Add ("hainan", "hainan"); mapss.Add ("rogue", "rogue"); mapss.Add ("dawn", "dawn"); mapss.Add ("silk", "silk"); mapss.Add ("altai", "altai"); mapss.Add ("gulin", "gulin"); mapss.Add ("dragon pass", "dragon pass"); mapss.Add ("caspian", "caspian"); mapss.Add ("firestorm", "firestorm"); mapss.Add ("metro", "metro"); mapss.Add ("oman", "oman"); mapss.Add ("islands", "islands"); mapss.Add ("nansha", "nansha"); mapss.Add ("wavebr", "wavebr"); mapss.Add ("mortar", "mortar"); mapss.Add ("pearl", "pearl"); mapss.Add ("propaganda", "propaganda"); mapss.Add ("lumpini", "lumpini"); mapss.Add ("sunken", "sunken"); mapss.Add ("whiteout", "whiteout"); mapss.Add ("hammerhead", "hammerhead"); mapss.Add ("hangar", "hangar"); mapss.Add ("giants", "giants"); mapss.Add ("night", "night"); mapss.Add ("outbreak", "outbreak"); mapss.Add ("valley", "valley"); string mapcheck = mapss[name]; Dictionary<string, string> modes = new Dictionary<string, string> (); modes.Add ("cql", "ConquestLarge0"); modes.Add ("cqs", "ConquestSmall0"); modes.Add ("domination", "Domination0"); modes.Add ("defuse", "Elimination0"); modes.Add ("obli", "Obliteration"); modes.Add ("rush", "RushLarge0"); modes.Add ("tdm", "TeamDeathMatch0"); modes.Add ("sqdm", "SquadDeathMatch0"); modes.Add ("airsup", "AirSuperiority0"); modes.Add ("ctf", "CaptureTheflag0"); modes.Add ("cas", "CarrierAssaultSmall0"); modes.Add ("cal", "CarrierAssaultLarge0"); modes.Add ("sqobli", "SquadObliteration0"); modes.Add ("gunmaster", "GunMaster0"); modes.Add ("guntroll", "GunMaster1"); string modecorrect = modes[mode]; Dictionary<string, string> modes2 = new Dictionary<string, string> (); modes2.Add ("cql", "cql"); modes2.Add ("cqs", "cqs"); modes2.Add ("domination", "domination"); modes2.Add ("defuse", "defuse"); modes2.Add ("obli", "obli"); modes2.Add ("rush", "rush"); modes2.Add ("tdm", "tdm"); modes2.Add ("sqdm", "sqdm"); modes2.Add ("airsup", "airsup"); modes2.Add ("ctf", "ctf"); modes2.Add ("cas", "cas"); modes2.Add ("cal", "cal"); modes2.Add ("sqobli", "sqobli"); modes2.Add ("gunmaster", "gunmaster"); modes2.Add ("guntroll", "guntroll"); string modecheck1 = modes2[mode]; if (server.MapFileNameRotation.Contains (mapcorrect)) { int mapIndex = MapCodeToIndex (mapcorrect); if (mapIndex < modeNames.Count && modeNames[mapIndex] == modecorrect) { if (level >= 2) plugin.ConsoleWrite ("^b[MAP]^n special case, setting next to existing map entry #" + mapIndex + ", " + plugin.FriendlyMapName (mapcorrect)); plugin.SendGlobalMessage ("Next map: " + plugin.FriendlyMapName (mapcorrect) + " " + plugin.FriendlyModeName (modecorrect) + " Rounds: " + r.ToString ()); // Set it as the next map plugin.ServerCommand ("mapList.setNextMapIndex", mapIndex.ToString ()); return false; } } int lastMap = server.MapFileNameRotation.Count; plugin.ConsoleWrite ("^b[MAP]^n setnext: temp map inserted at index #" + lastMap); plugin.SendGlobalMessage ("Next map: " + plugin.FriendlyMapName (mapcorrect) + " " + plugin.FriendlyModeName (modecorrect) + " Rounds: " + r.ToString ()); plugin.ServerCommand ("mapList.add", mapcorrect, modecorrect, r.ToString ()); plugin.ServerCommand ("mapList.setNextMapIndex", lastMap.ToString ()); // Refresh map list plugin.ServerCommand ("mapList.list"); } Index check for map command: First check - code evaluation - OnRoundStart (no idea why those 2 starting methods don't work... in normal C# it work well) /*way that is broken in limits Broken code var index_delete = new List<int> { 2, 3, 4, 5, 6, 7, 8, 9, 10 }; foreach (int element in index_delete) { plugin.ServerCommand ("mapList.remove", element.ToString ()); } Broken code int indexNum = server.MapFileNameRotation.Count; for(int i=<your default index number>;i<indexNum;i++) { plugin.ServerCommand ("mapList.remove", i.ToString ()); } Below Working code with pretty bad quality, it works for il though... */ int a = 11; int b = 12; int c = 13; int d = 14; int e = 15; int f = 16; int g = 17; plugin.ServerCommand ("mapList.remove", a.ToString ()); plugin.ServerCommand ("mapList.remove", b.ToString ()); plugin.ServerCommand ("mapList.remove", c.ToString ()); plugin.ServerCommand ("mapList.remove", d.ToString ()); plugin.ServerCommand ("mapList.remove", e.ToString ()); plugin.ServerCommand ("mapList.remove", f.ToString ()); plugin.ServerCommand ("mapList.remove", g.ToString ()); Check player stats by command (regex also) usage: !check Bartis Evaluation - OnAnyChat First check - code Match m = Regex.Match (player.LastChat, @"^\s*[/[email protected]]check\s+([^\s]+)", RegexOptions.IgnoreCase); if (!m.Success) return false; List<String> vips = plugin.GetReservedSlotsList (); if (!vips.Contains (player.Name)) { plugin.SendPlayerMessage (player.Name, "You Can't use this command."); return false; } if (m.Success) { // Match target player name String name = m.Groups[1].Value; List<PlayerInfoInterface> all = new List<PlayerInfoInterface> (); all.AddRange (team1.players); all.AddRange (team2.players); all.AddRange (team3.players); all.AddRange (team4.players); PlayerInfoInterface target = null; int count = 0; foreach (PlayerInfoInterface p in all) { if (Regex.Match (p.Name, name, RegexOptions.IgnoreCase).Success) { target = p; ++count; } } if (count == 0 || target == null) { plugin.SendPlayerMessage (player.Name, "No player name matches '" + name + "'"); return false; } else if (count > 1) { plugin.SendPlayerMessage (player.Name, "Too many names match '" + name + "', try again"); return false; } double headshots = target.HeadshotsRound; double killsNOW = target.KillsRound; double result = Math.Round ((headshots / killsNOW), 2); plugin.SendPlayerMessage (player.Name, target.Name + " stats:"); plugin.SendPlayerMessage (player.Name, target.Name + " K/D: " + "[" + target.Kdr + "]" + " | " + "REAL K/D: " + "[" + (target.Kills / target.Deaths).ToString ("F2") + "]"); plugin.SendPlayerMessage (player.Name, target.Name + " Wins: " + (((target.Wins) / (target.Wins + target.Losses)) * 100).ToString ("F2") + "%" + " |" + " Skill: " + target.Skill + " | " + "KPM: " + target.Kpm.ToString ("F2")); plugin.SendPlayerMessage (player.Name, target.Name + " HS on Round: " + result*100 + "%."); plugin.SendPlayerMessage (player.Name, target.Name + " KPM on Round: " + Math.Round ((target.KpmRound),2)); plugin.SendPlayerMessage (player.Name, target.Name + " Country: " + target.CountryName + "."); } Send reports through discord webhook using WebClient C# Paste your channel discord webhook string to get it working on discord! Also script working with regex Usage: !report Bartis killing team Evaluation - OnAnyChat first check - Expression (Regex.Match(player.LastChat, @"[/[email protected]]report" ,RegexOptions.IgnoreCase).Success) Second Check - Code string webhookUrl = ""; String serverName = server.Name; string webhookString = null; // Don't edit String playerName = null; String playerMessage = null; String reportReason = null; Match regexResult = null; Match regexMatch = Regex.Match (player.LastChat, @"^\s*[/[email protected]]report\s+([^\s]+)\s+([^.*]+)", RegexOptions.IgnoreCase); if (regexMatch.Success) { regexResult = regexMatch; } else { playerMessage = "Error! Correct command: !report <part of playername> <reason>"; plugin.SendPlayerMessage (player.Name, playerMessage); return false; } double counter = limit.Activations(player.Name, TimeSpan.FromSeconds(60)); if(counter >1) { playerMessage = "Too many reports! Try again in 1min"; return false; } String name = regexResult.Groups[1].Value; List<PlayerInfoInterface> all = new List<PlayerInfoInterface> (); all.AddRange (team1.players); all.AddRange (team2.players); if (team3.players.Count > 0) all.AddRange (team3.players); if (team4.players.Count > 0) all.AddRange (team4.players); PlayerInfoInterface target = null; int count = 0; foreach (PlayerInfoInterface p in all) { if (Regex.Match (p.Name, name, RegexOptions.IgnoreCase).Success) { target = p; ++count; playerName = p.Name; } } String BL = "https://battlelog.battlefield.com/bf4/user/" + playerName; if (count == 0) { playerMessage = "No such player name matches (" + name + ")"; plugin.SendPlayerMessage (player.Name, playerMessage); return false; } else if (count > 1) { playerMessage = "Multiple players match the target name (" + name + "), try again!"; plugin.SendPlayerMessage (player.Name, playerMessage); return false; } else if (count == 1) { reportReason = regexResult.Groups[2].Value; double headshots = target.HeadshotsRound; double killsNOW = target.KillsRound; double result = Math.Round ((headshots / killsNOW), 2); double KPM = Math.Round ((target.KpmRound), 2); double HS = result * 100; double KD = Math.Round (target.KdrRound, 2); double Kills = target.KillsRound; double Deaths = target.DeathsRound; try { WebRequest request = WebRequest.Create (webhookUrl); request.Method = "POST"; request.ContentType = "application/json"; webhookString = "{\"content\": \"**```py\\n'Player Report'\\[email protected]" + serverName + "\\nReported_from: " + "'" + player.Name + "'" + "\\nReported_player: " + "'" + playerName + "'" + "\\nReason: " + "'" + reportReason + "'" + "\\nStats: " + "KILLS: " + Kills + " DEATHS: " + Deaths + " HS: " + HS + "%" + " KD: " + KD + " KPM: " + KPM + "\\n```**"+"BL: "+BL + "\"}"; byte[] byteArray = Encoding.UTF8.GetBytes (webhookString); request.ContentLength = byteArray.Length; Stream dataStream = request.GetRequestStream (); dataStream.Write (byteArray, 0, byteArray.Length); dataStream.Close (); plugin.ConsoleWrite ("Received a report from " + player.Name); playerMessage = "Thanks, we have received your report!"; plugin.SendPlayerMessage (player.Name, playerMessage); plugin.SendPlayerYell (player.Name, playerMessage, 10); } catch (Exception e) { plugin.ConsoleWrite ("Error: " + e); playerMessage = "Plugin error! Please try again later."; plugin.SendPlayerMessage (player.Name, playerMessage); plugin.SendPlayerYell (player.Name, playerMessage, 10); } } return false; Last script: Custom factions per map Evaluation - OnAnyChat first check - Code String msg = ""; int Team1 = 0; int Team2 = 0; int i = 0; Dictionary<int,String> Teams = new Dictionary<int,String>(); Teams.Add(0, "US"); Teams.Add(1, "RU"); Teams.Add(2, "CN"); if (server.NextGamemode == "ConquestLarge0" && server.NextGamemode != "RushLarge0") {// CQL switch (server.NextMapFileName) { case "MP_Tremors": Team1 = 0; Team2 = 2; break; case "MP_Siege": Team1 = 0; Team2 = 2; break; case "MP_Damage": Team1 = 1; Team2 = 2; break; case "MP_Journey": Team1 = 1; Team2 = 2; break; case "MP_TheDish": Team1 = 1; Team2 = 2; break; case "MP_Prison": Team1 = 0; Team2 = 1; break; case "MP_Flooded": Team1 = 0; Team2 = 0; break; case "MP_Abandoned": Team1 = 0; Team2 = 2; break; case "MP_Naval": Team1 = 0; Team2 = 2; break; case "MP_Resort": Team1 = 0; Team2 = 2; break; } } if (server.NextGamemode == "RushLarge0") { //RUSH switch (server.NextMapFileName) { case "MP_Tremors": Team1 = 0; Team2 = 2; break; case "MP_Siege": Team1 = 1; Team2 = 2; break; case "MP_Damage": Team1 = 1; Team2 = 2; break; case "MP_Journey": Team1 = 1; Team2 = 2; break; case "MP_TheDish": Team1 = 1; Team2 = 2; break; case "MP_Prison": Team1 = 0; Team2 = 1; break; case "MP_Flooded": Team1 = 0; Team2 = 2; break; case "MP_Abandoned": Team1 = 1; Team2 = 2; break; case "MP_Naval": Team1 = 0; Team2 = 2; break; case "MP_Resort": Team1 = 0; Team2 = 2; break; } } //Special DLC Cases if(server.NextMapFileName.StartsWith("XP1_")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP2_")) { Team1 = 0; Team2 = 1; } if(server.NextMapFileName.StartsWith("XP3_")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP4_")) { Team1 = 0; Team2 = 1; } if(server.NextMapFileName.StartsWith("XP5_Night_01")) { Team1 = 1; Team2 = 0; } if(server.NextMapFileName.StartsWith("XP6_CMP")) { Team1 = 0; Team2 = 2; } if(server.NextMapFileName.StartsWith("XP7_Valley")) { Team1 = 0; Team2 = 2; } plugin.ServerCommand("vars.teamFactionOverride", "1", Convert.ToString(Team1)); plugin.ServerCommand("vars.teamFactionOverride", "2", Convert.ToString(Team2)); msg = "Setting factions to " + Teams[Team1] + " vs " + Teams[Team2] + " on next round..."; plugin.SendGlobalMessage(msg, 12); plugin.ConsoleWrite("^b^1ADMIN FACTIONS >^0^n " + msg); plugin.PRoConChat("^b^1ADMIN FACTIONS >^0^n " + msg); plugin.PRoConEvent(msg, "Insane Limits"); return false; Consider switching to C# switch cases, I made "if" because the dlcs map factions are the same on each DLC and I was also too lazy Use any script you would like to... For bugs add me on discord (Bartis#1313) or write them here
  20. I'm simply wondering if there are any procon test layers I can access to run prototypes of my plugins. Currently, I have to do it on the server I run and that takes a while and requires that the server be empty so I don't obliterate the rules or enforcement systems.
  21. The in-built HTTP server provides super-simple JSON responses right now. There is one for /players which executes the rcon admin.listplayers command. I'd love to see one such as /pbplayers which executes the punkbuster pb_sv_plist command, which provides a different sort of player listing. Maybe down the road, a simple command editor which allows someone to map an HTTP request (such as /players) to a specific rcon/punkbuster command easily, without having to rely on a revision to procon.
  22. xxxxpsyxxxx

    Maps

    Why some maps that add the list to be voted on, bug the vote, the list does not appear when there is any xp5, xp6 or xp7 map
  23. PMKevinRudd

    BF4DB

    Version 2.0.15

    562 downloads

    Installation There are a few steps to complete before this plugin will be operational. You must first have created an account with us and then claim a server. Once you have a server claimed you will be given an API key. Once you have placed the plugin in your Procon layer, the last step is to set up the plugin with the API key and change any settings you might need. Each of these steps will be outlined below. Claiming Server To claim a server please log in and click Server Tools under the user menu. On the Server Tools page, you can claim new servers and manage existing ones. You will then see a box that contains a unique code each time this page is visited and an input for your server Battlelog GUID. You must have admin access to your servers to claim them. The next step is to use whatever tool you use to manage your server to include the unique code in your server name. This is just temporary and can be changed once you have claimed the server. You do not need to change the entire server name to just the unique code, it only has to be in it somewhere. Once the name has been changed with the correct code, then place your server Battlelog GUID in the field and press Claim. If everything was correct you will have successfully claimed a server. Repeat this process for any or all servers you need to set up the plugin for! Get API Key Once you have a server claimed you will be given an API key to be used with our plugin. To get this key visit your Server page under Settings and click on the API Key button next to the server. A box will pop-up with your API key. This key will never expire and can always be accessed here as long as you have the server claimed. This key will only work for the server it was claimed with. Copy the API key for the next step. BF4DB reserves the right to revoke any API key generated for any server at any time. If a server is deemed to be a "hacked" server or is openly harboring hackers (abusing the whitelist function), then it's API key will be revoked and account owners will be unable to claim additional servers in the future. Setup Plugin You must already have a Procon layer setup and running either hosted remotely or locally. Download the plugin using the links below. It will come in a .zip file and contain two files within. Unzip this and place both the included files in the Plugins\BF4 folder on your Procon layer filesystem. Please refer to the Procon manual or your layer provided for file access. After the files are in place restart your layer. Configuration You will then need to open Procon to enable and configure the plugin. Before enabling please input the given API key and change any settings you may want. When the correct API key for that server is included you may then enable the plugin. Settings API Key: You must claim the server on BF4DB.com to receive an API key for this server. Enable Auto Bans: When set to Yes, any players banned on BF4DB will be removed from your server. Defaults to Yes. Enable Announcements: When set to Yes, player status during verification will be announced in chat. Defaults to Yes. Player Whitelist: Place any player names(one per line) to be excluded from BF4DB checks and server removal. Debug Level: Mainly for BF4DB developers. If you encounter an issue please set to one of the following levels before submitting a bug report. 0: Disabled. Not debugging in the console will occur. 1: Only player information will be logged. 2: Player and server information will be logged. 3: Player, server, and PunkBuster information will be logged. Development For any support or bug reports please visit our forums or use #plugin-support in our discord server. Please include as much information or debugging as you can. Notes If your procon layer host does not allow uploads of .dll files: Rename BF4DB_API.dll to BF4DB_API.cs, then open BF4DB.cs and edit lines 103 and 105 from BF4DB_API.dll to BF4DB_API.cs, save, then proceed to upload the plugin. If you're not sure which line to edit (if your editor doesn't show line numbers), simply search (Ctrl+F) for .dll and change it to .cs. After you upload the plugin, you will need to reboot your Procon layer. License BF4DB Server Protection by skulls is licensed under a Creative Commons Attribution-NoDerivatives 4.0 International License. Permissions beyond the scope of this license may be available at https://bf4db.com/tos.
  24. View File Procon Client Download for Procon 1.X for BFC2, BF3, BF4, MoH & BFH Attached to this post, you can find the latest downloads of Procon 1.X and everything attached to it. To download the latest version available, simply click the big LATEST VERSION link. In order to be able to run Procon You can find the changelogs for all patches in this thread: TBD If you're interested in some of the older versions of Procon 1.X, please follow this link: TBD Starting with version 1.4.1.4, we will not include the media files (maps, kill icons, etc.) for Battlefield: Bad Company 2 and Medal of Honor with the regular Procon download anymore. This measure allows us to drastically reduce the size of each Procon download and thus saves us and your bandwidth and resources during updates. For version 1.4.1.4, we have however included the media files once more (renamed as "AlphaPack") to allow a smooth transition for BFBC2 and MoH users. Version 1.4.1.5 and upward will no longer contain these files, however, they will be available as a separate download: procon_mediapack_bfbc2_moh.zip The source code of Procon 1.X can be found at our GitHub-repository: https://github.com/AdKats/Procon-1 Note: Starting from version 1.5.3.0 you will need to have .NET 4.7 installed. Old Versions can be downloaded from here. Submitter Prophet731 Submitted 12/24/19 Category Procon  
  25. Hi guys, i just want to talk about the fact that BF4DB Admins etc. have well knows cheaters on their friendlist and lot cheaters have also "trusted" status on the BF4DB website. I mean just WTF, theyre talking about fairplay, good service and cheat protection and ..... I know that also the EA support has sympathizer for cheaters in. I confrontated EA Special Advisor (they guys above normal support staff) and they just gave me the answer that they doesnt tolerate this and if a support staff is cached as cheater or doesnt take action against those he get fired. But i really think that this couldnt be the reality when you look onto battlelog for BF3 & BF4 and compare the banhistory with PBBans, GGCStream and BF4DB. There is also something i recognized. BF4DB has "trusted" and not listed cheaters who are banned from PBBans & GGCStream. I just wonder about that not more people recognize such things. I cannot be the onyl one (or am i just the only one care about xD ??? ) Another example is EAC- Easy Anti Cheat i reported a CSGO Match in 2017. There were 4 vs 4 Cheaters i. It was played via Challengeme protected by EAC. I reported it to EAC Support. All i recieved was a insulting message how dumb i am etc. from an admin. I tried it 3 times or so to get another guy from EAC but also in Steam Forums i got insulted by a Mod/Admin. And the cheaters never got banned. I mean you could say i false detected this guys a scheaters ...... but nope, i checked their profiles a few months ago and they got all banned within 1 year by VAC after i faced them. So there MUST BE cheater sympathizer in all of those. And i think this is a warning. A warning for the companies to check the peaople they hire for their support/service. A warning sign for Steam and the developers to hire community moderators/aadmins for their stuff. and a warning sign that something is going really wrong when cheating is tolerated more and more by the players, the developers and the communities. Also that the most SERVER HOSTERS do not care about anti cheat protection via PBBans, GGCStream not only in the past also now (so you could not say meeeeh this are old services and old games) it was a problem in the past and it is a problem now and in the future. I also recognized that integrated anti cheats (cryprotect for crysis and crysis 3 as example) or FairFight for BF4 and so on are NOT ACTIVATED as standard from the Server hosters. I mean for what do we/you pay money when they do not give a good service and configure and setup things well ? The essential question is how could such behaviour be tolerated ? Why is there no way to do smth. against this abuse ? Why is ther eno person you can talk about to solve this ? Just thinking im just thinking now its ur turn to talk about .....
×
×
  • Create New...

Important Information

Please review our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.