Jump to content

Insane Limits - Examples


Recommended Posts

Originally Posted by Mootart*:

 

This limit detects when a player has no Battlelog account. Each time the player spawns, it warns him that he will be kicked. It tells him how much time he has left. After five minutes expires, the player is kicked.

 

Set limit to evaluate OnSpawn, and action to None

 

Set first_check to this Expression

 

Code:

player.Battlelog404 == true
Set second_check to this Code

 

Code:

int minutes = 5;
      TimeSpan remain = TimeSpan.FromMinutes(5).Subtract(DateTime.Now.Subtract(player.JoinTime));
      
      if ( remain.TotalSeconds > 0 )
          plugin.SendSquadMessage(player.TeamId, player.SquadId, plugin.R("player.Name looks like you don't have a Battlelog account. You have " + plugin.FriendlySpan(remain) + " before being kicked"));
      else
      {
          plugin.SendGlobalMessage(plugin.R("player.Name was kicked for not having a Battlelog account"));
          plugin.KickPlayerWithMessage(player.Name, plugin.R("player.Name, you were kicked for not having a Battelog account"));
      }
      return false;
i use this Limit Copy and paste but after doing it got this error...

 

[21:18:13 11] [insane Limits] Compiling Limit #18 - Kick Players Without Battlelog - OnSpawn

[21:18:13 12] [insane Limits] ERROR: 1 error compiling Expression

 

 

Micovery could you help me please?

 

EDIT: also got this error after this setting this limit too..

 

[21:20:30 75] [insane Limits] Thread(settings): WARNING: Battlefield 3 does not support individual player messages

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by Mootart*:

 

This limit will activate for players who get more than 90% headshots after 30 kills (with a specific weapon). This works across rounds. (Total stats are not reset at the end of the round).

 

Set limit to evaluate OnKill, set action to Kick,

 

Set first_check to this Code:

 

Code:

double kills = player[kill.Weapon].KillsTotal;
         double headshots = player[kill.Weapon].HeadshotsTotal;
         double headshots_percent = Math.Round((headshots / kills)*100.0, 2);
         
         if (headshots_percent > 90 && kills > 30)
         {
             plugin.ConsoleWrite(plugin.R("%p_n% has " + headshots_percent + " headshots percent with "+ kill.Weapon + " after " + kills + " kills"));
             return true;
         }
         
         return false;
Set these action specific parameters:

Code:

kick_message = %p_n%, you were kicked for suspicious headshots percentage with %w_n%
This feature (per-weapon stats) is not extensively tested. You should adjust the conditions to test, and see if it works as you expect it. If you are going to test it on a populated server, make sure it's on virtual so you can adjust the values until you feel comfortable that it will not kick everyone.

 

Just want to ask and i think i post it earlier before...

 

Im using this script but everytime the round is finish the procon layer will be disconnected. and reconnect again.

i tried to disable it and procon layer works smooth.

 

is it normal for the procon to be reset on this limit? if not can you help me please. getting furstrated already

 

thanks for your time micovery and PapaCharlie9

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

This example keeps count of all of the killers and all of the victims of every player during a round. By itself, it doesn't do anything else. However, it is required for other examples, like the In-Game Top Killers & Victims Command* or the In-Game Player Versus Player Command*. It can be used for other limits as well, such as announcing when a victim has been killed more than 10 times by a single player, or to play sub-games like Regicide, where a player from each team is designated "The King" during the round, and whoever kills the king the most, wins.

 

Create a new limit to evaluate OnKill and set action to None

 

Set first_check to this Expression:

 

Code:

( !killer.Name.Equals(victim.Name) )
This insures that Suicides are ignored by the tracker.

 

Set second_check to this Code:

 

Code:

/* OnKill: track killers and victims */

// Keep TOP stats

String prefix = "TOP_";
String kKillers = prefix + "killers";  // Killers of a player
String kVictims = prefix + "victims";  // Victims of a player

// Track killer and victim counts
DataDictionaryInterface dk = killer.RoundData;
DataDictionaryInterface dv = victim.RoundData;

int level = 3;

try {
    level = Convert.ToInt32(plugin.getPluginVarValue("debug_level"));
} catch (Exception e) {}

// Setup up killer's data, if not already done
if (!dk.issetObject(kKillers)) { // Killers of killer
    dk.setObject(kKillers, new Dictionary<String, int>());
    if (level >= 5) plugin.ConsoleWrite(kKillers+plugin.R(" created for player.FullName"));
}
if (!dk.issetObject(kVictims)) { // Victims of killer
    dk.setObject(kVictims, new Dictionary<String, int>());
    if (level >= 5) plugin.ConsoleWrite(kVictims+plugin.R(" created for player.FullName"));
}

// Setup up victim's data, if not already done
if (!dv.issetObject(kKillers)) { // Killers of victim
    dv.setObject(kKillers, new Dictionary<String, int>());
    if (level >= 5) plugin.ConsoleWrite(kKillers+plugin.R(" created for player.FullName"));
}
if (!dv.issetObject(kVictims)) { // Victims of victim
    dv.setObject(kVictims, new Dictionary<String, int>());
    if (level >= 5) plugin.ConsoleWrite(kVictims+plugin.R(" created for player.FullName"));
}

Dictionary<String, int> vOfK = (Dictionary<String, int>)dk.getObject(kVictims); // victims of this killer
Dictionary<String, int> kOfV = (Dictionary<String, int>)dv.getObject(kKillers); // killers of this victim

/* Count killer's victim and victim's killer */

if (!vOfK.ContainsKey(victim.FullName)) {
    vOfK[victim.FullName] = 1;
} else {
    vOfK[victim.FullName] += 1;
}

if (!kOfV.ContainsKey(killer.FullName)) {
    kOfV[killer.FullName] = 1;
} else {
    kOfV[killer.FullName] += 1;
}

/* Debugging and logging */

if (level >= 4) {
    Dictionary<String, int> vKK = (Dictionary<String, int>)dv.getObject(kVictims); // victim killed killer
    int paybacks = 0;

    if (vKK.ContainsKey(killer.FullName)) {
        paybacks = vKK[killer.FullName];
    }

    if (level >= 5) {
        plugin.ConsoleWrite(plugin.R(@"^b[TOP] OnKill^n: %k_fn% killer of %v_fn% ") + vOfK[victim.FullName] + " times.");
        plugin.ConsoleWrite(plugin.R(@"^b[TOP] OnKill^n: %k_fn% victim of %v_fn% ") + paybacks + " times.");
        return false;
    }
    // Otherwise, show gaps of 10 or more
    if (vOfK[victim.FullName] > paybacks && (vOfK[victim.FullName] - paybacks) >= 10) {
        plugin.ConsoleWrite(plugin.R(@"^b[TOP] OnKill^n: %k_fn% vs %v_fn% kills: ") + vOfK[victim.FullName] + "-" + paybacks);
    }
}

return false;
At debug level 3 or lower, there is no logging output.

 

At level 4, the log will be updated every time the difference between the number of times killer has killed victim and the number of times victim has killed killer is 10 or more, with a line like this:

 

[TOP] OnKill: micovery vs [LGN]PapaCharlieNiner kills: 11-1

 

At level 5, the log will be updated with every new entry that will be tracked as well as with current counts for the killer and victim, like this:

 

[TOP] OnKill: micovery killer of [LGN]PapaCharlieNiner 11 times.

[TOP] OnKill: micovery victim of [LGN]PapaCharlieNiner 1 times.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

This example requires the Killers & Victims Tracker* example.

 

This example provides an in-game command that displays your top 3 killers or your top 3 victims in chat.

 

$top killers

 

Shows your top 3 killers to all players.

 

=top killers

 

Shows your top 3 killers to your squad only.

 

$top victims

 

Shows your top 3 victims to all players.

 

=top victims

 

Shows your top 3 victims to your squad only.

 


 

Create a new limit to evaluate OnAnyChat and set action to None

 

Set first_check to this Expression:

 

Code:

( Regex.Match(player.LastChat, @"^\s*[\$=]top\s+[kv]", RegexOptions.IgnoreCase).Success || Regex.Match(player.LastChat, @"^\s*[\$=](_:ks|kills|killers|vi|vics|victims)", RegexOptions.IgnoreCase).Success )
Set second_check to this Code:

 

Code:

/* Top killers/victims of this player */

String prefix = "TOP_";
String kKillers = prefix + "killers";  // Killers of this player
String kVictims = prefix + "victims";  // Victims of this player
int level = 3;

try {
    level = Convert.ToInt32(plugin.getPluginVarValue("debug_level"));
} catch (Exception e) {}

if (level >= 4) {
    plugin.ConsoleWrite("^b[TOP] OnAnyChat^n k/v: Orig cmd: " + player.LastChat);
}

/* Parse the command */

Match topK = Regex.Match(player.LastChat, @"^\s*([\$=])top\s+(ks|kills|killers)", RegexOptions.IgnoreCase);
Match topV = Regex.Match(player.LastChat, @"^\s*([\$=])top\s+(vs|vics|victims)", RegexOptions.IgnoreCase);
Match shortK = Regex.Match(player.LastChat, @"^\s*([\$=])(ks|kills|killers)", RegexOptions.IgnoreCase);
Match shortV = Regex.Match(player.LastChat, @"^\s*([\$=])(vi|vics|victims)", RegexOptions.IgnoreCase);

if (false == topK.Success && false == topV.Success && false == shortK.Success && false == shortV.Success) {
    if (level >= 2) {
        plugin.ConsoleWarn(@"^b[TOP] OnAnyChat^n k/v: parse failed: " + player.LastChat);
    }
    return false;
}

Match chat = topK; // default guess
bool isKillers = true; // default guess
if (topV.Success) {
    chat = topV;
    isKillers = false;
} else if (shortK.Success) {
    chat = shortK;
} else if (shortV.Success) {
    chat = shortV;
    isKillers = false;
}

bool privScope = Regex.Match(chat.Groups[1].Value, @"[=]").Success;

if (level >= 4) {
    plugin.ConsoleWrite("^b[TOP] OnAnyChat^n k/v: Parsed cmd: " + ((privScope) _ "private " : "public ") + ((isKillers) _ "killers" : "victims"));
}


/* Show requested data */

DataDictionaryInterface d = player.RoundData;
String message = "_";

// Lookup round data
Dictionary<String, int> by = null;

if (isKillers) {
    if (d.issetObject(kKillers)) {    
        by = (Dictionary<String, int>)d.getObject(kKillers);
    } else {
        plugin.ConsoleWarn("^b[TOP] OnAnyChat^n killers no: " + kKillers + " " + player.FullName);
        return false;
    }
    message = "Top killers: ";
} else { // victims
    if (d.issetObject(kVictims)) {
        by = (Dictionary<String, int>)d.getObject(kVictims);
    } else {
        plugin.ConsoleWarn("^b[TOP] OnAnyChat^n victims no: " + kVictims + " " + player.FullName);
        return false;
    }
    message = "Top victims: ";
}

// Sort data
int first = 0;
int second = 0;
int third = 0;
String name1 = "-no one-";
String name2 = "-no one-";
String name3 = "-no one-";

foreach (KeyValuePair<String, int> pair in by) {
    if (pair.Value > third || pair.Value == second) {
        third = pair.Value;
        name3 = pair.Key;
    }
    if (pair.Value > second || pair.Value == first) {
        third = second;
        name3 = name2;
        second = pair.Value;
        name2 = pair.Key;
    }
    if (pair.Value > first) {
        second = first;
        name2 = name1;
        first = pair.Value;
        name1 = pair.Key;
    }
}

/* --- NON-CODERS: SAFE TO MODIFY BELOW THIS LINE --- */

// Example output: Top killers: [LGN]PapaCharlie9(17), micovery(12), droopie(5)

message = message + name1 + "(" + first + "), " + name2 + "(" + second + "), " + name3 + "(" + third + ")";
if (level >= 2) {
    plugin.ConsoleWrite("^b[TOP] OnAnyChat^n " + ((privScope)_"^8private^0 ":"^8public^0 ") + "Results:");
    plugin.ConsoleWrite(message);
}
if (privScope)
    plugin.SendSquadMessage(player.TeamId, player.SquadId, message);
else
    plugin.SendGlobalMessage(message);

return false;
For $top killers, the line sent to chat looks like this:

 

Top killers: micovery(11), HexaCanon(8), droopie(5)

 

For $top victims, the line sent to chat looks like this:

 

Top victims: [ONE]Camper(1), [AFK]Player(1), -no one-(0)

 

At debug level 2 or higher, the same message is logged.

 

At debug level 4 or higher, debugging info about the parse of the command is logged.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Updated to V0.8/R2 -- fixes "No overload for method 'GetPlayer' takes '1' arguments" compilation error. See below for V0.7 version.

 

This example requires the Killers & Victims Tracker* example.

 

This example provides an in-game command that displays the player vs. players Kills-Deaths standing.

 

$versus player

 

Shows the Kills-Deaths standing between you and the specified player to all players in chat.

 

=versus player

 

Shows the Kills-Deaths standing between you and the specified player to your squad only in chat.

 

$versus player1 player2

 

Shows the Kills-Deaths standing between player1 and player2 to all players in chat.

 

=versus player1 player2

 

Shows the Kills-Deaths standing between player1 and player2 to your squad only in chat.

 

The line sent to chat looks like this:

 

$versus Papa mico

[LGN]PapaCharlie9 vs micovery (K-D): 1-11

 


 

Create a new limit to evaluate OnAnyChat and set action to None

 

Set first_check to this Expression:

 

Code:

( Regex.Match(player.LastChat, @"^\s*[\$=](_:versus|vs)", RegexOptions.IgnoreCase).Success )
Set second_check to this Code:

 

Code:

/* Version V08/R2 */
/* versus: Show standings */

String prefix = "TOP_";
String kKillers = prefix + "killers";  // Killers of a player
String kVictims = prefix + "victims";  // Victims of a player
int level = 3;

try {
    level = Convert.ToInt32(plugin.getPluginVarValue("debug_level"));
} catch (Exception e) {}

if (level >= 4) {
    plugin.ConsoleWrite("^b[TOP] OnAnyChat^n: Orig cmd versus: " + player.LastChat);
}

/* Parse the command */

String villainName = player.Name; // versus who_
String heroName = player.Name; // hero versus_
bool twoNames = false; // false: player vs villain, true: hero vs villain

Match chat = Regex.Match(player.LastChat, @"^\s*([\$=])(_:versus|vs)\s+([^ ]+)\s*$", RegexOptions.IgnoreCase); // just one name
if (false == chat.Success) {
    chat = Regex.Match(player.LastChat, @"^\s*([\$=])(_:versus|vs)\s+([^ ]+)\s+([^ ]+)", RegexOptions.IgnoreCase); // two names
    if (false == chat.Success) {
        if (level >= 2) {
            plugin.ConsoleWarn(@"^b[TOP] OnAnyChat^n versus: parse failed: " + player.LastChat);
        }
        return false;
    }
    heroName = chat.Groups[2].Value;
    villainName = chat.Groups[3].Value;
    twoNames = true; 
} else {
    villainName = chat.Groups[2].Value; // just one name
}

bool privScope = Regex.Match(chat.Groups[1].Value, @"[=]").Success;

if (level >= 4) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n parse: " + ((privScope)_"^8private^0 ":"^8public^0 ") + heroName + " vs " + villainName);
}

/* Show requested data */

int killsVs = 0;
int deathsVs = 0;

// Need to look up player to get full name
PlayerInfoInterface hero = (twoNames) _ plugin.GetPlayer(heroName, true) : player; // first player
PlayerInfoInterface villain = plugin.GetPlayer(villainName, true); // second player
if (villain == null) {
    plugin.ConsoleWarn("^b[TOP] OnAnyChat^n: unknown player vs: " + villainName);
    return false;
} else if (hero == null) {
    plugin.ConsoleWarn("^b[TOP] OnAnyChat^n: unknown player vs: " + heroName);
    return false;
}

if (level >= 4) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n vs: " + hero.FullName + " vs " + villain.FullName);
}

// Get victim and killer data
Dictionary<String, int> myVictims;
if (hero.RoundData.issetObject(kVictims)) {
    myVictims = (Dictionary<String, int>)hero.RoundData.getObject(kVictims);
} else {
    plugin.ConsoleError("^b[TOP] OnAnyChat^n vs No: " + kVictims + " " + hero.FullName);
    return false;
}
Dictionary<String, int> myKillers;
if (hero.RoundData.issetObject(kKillers)) {
    myKillers = (Dictionary<String, int>)hero.RoundData.getObject(kKillers);
} else {
    plugin.ConsoleError("^b[TOP] OnAnyChat^n vs No: " + kKillers + " " + hero.FullName);
    return false;
}

// Hero's kills/deaths vs. villain
if (myVictims.ContainsKey(villain.FullName)) {
    killsVs = myVictims[villain.FullName];
}
if (myKillers.ContainsKey(villain.FullName)) {
    deathsVs = myKillers[villain.FullName];
}

/* --- NON-CODERS: SAFE TO MODIFY BELOW THIS LINE --- */

// Example output: [LGN]PapaCharlie9 vs micovery (K-D): 0-3

String message = hero.FullName + " vs " + villain.FullName + " (K-D): " + killsVs + "-" + deathsVs;
if (level >= 3) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n " + ((privScope)_"^8private^0 ":"^8public^0 ") + "Standings: ");
    plugin.ConsoleWrite(message);
}
if (privScope)
    plugin.SendSquadMessage(player.TeamId, player.SquadId, message);
else
    plugin.SendGlobalMessage(message);


return false;
At debug level 3 or higher the chat line is logged.

 

At debug level 4 or higher, debugging info about the parse of the command is logged.

 


For the 0.0.0.7 compatible version, click below to expand the section.

Click_Here_For_0_7:

 

 

This example requires the Killers & Victims Tracker* example.

 

This example provides an in-game command that displays the player vs. players Kills-Deaths standing.

 

$versus player

 

Shows the Kills-Deaths standing between you and the specified player to all players in chat.

 

=versus player

 

Shows the Kills-Deaths standing between you and the specified player to your squad only in chat.

 

$versus player1 player2

 

Shows the Kills-Deaths standing between player1 and player2 to all players in chat.

 

=versus player1 player2

 

Shows the Kills-Deaths standing between player1 and player2 to your squad only in chat.

 

The line sent to chat looks like this:

 

$versus Papa mico

[LGN]PapaCharlie9 vs micovery (K-D): 1-11

 


 

Create a new limit to evaluate OnAnyChat and set action to None

 

Set first_check to this Expression:

 

Code:

( Regex.Match(player.LastChat, @"^\s*[\$=](_:versus|vs)", RegexOptions.IgnoreCase).Success )
Set second_check to this Code:

 

Code:

/* versus: Show standings */

String prefix = "TOP_";
String kKillers = prefix + "killers";  // Killers of a player
String kVictims = prefix + "victims";  // Victims of a player
int level = 3;

try {
    level = Convert.ToInt32(plugin.getPluginVarValue("debug_level"));
} catch (Exception e) {}

if (level >= 4) {
    plugin.ConsoleWrite("^b[TOP] OnAnyChat^n: Orig cmd versus: " + player.LastChat);
}

/* Parse the command */

String villainName = player.Name; // versus who_
String heroName = player.Name; // hero versus_
bool twoNames = false; // false: player vs villain, true: hero vs villain

Match chat = Regex.Match(player.LastChat, @"^\s*([\$=])(_:versus|vs)\s+([^ ]+)\s*$", RegexOptions.IgnoreCase); // just one name
if (false == chat.Success) {
    chat = Regex.Match(player.LastChat, @"^\s*([\$=])(_:versus|vs)\s+([^ ]+)\s+([^ ]+)", RegexOptions.IgnoreCase); // two names
    if (false == chat.Success) {
        if (level >= 2) {
            plugin.ConsoleWarn(@"^b[TOP] OnAnyChat^n versus: parse failed: " + player.LastChat);
        }
        return false;
    }
    heroName = chat.Groups[2].Value;
    villainName = chat.Groups[3].Value;
    twoNames = true; 
} else {
    villainName = chat.Groups[2].Value; // just one name
}

bool privScope = Regex.Match(chat.Groups[1].Value, @"[=]").Success;

if (level >= 4) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n parse: " + ((privScope)_"^8private^0 ":"^8public^0 ") + heroName + " vs " + villainName);
}

/* Show requested data */

int killsVs = 0;
int deathsVs = 0;

// Need to look up player to get full name
PlayerInfoInterface hero = (twoNames) _ plugin.GetPlayer(heroName) : player; // first player
PlayerInfoInterface villain = plugin.GetPlayer(villainName); // second player
if (villain == null) {
    plugin.ConsoleWarn("^b[TOP] OnAnyChat^n: unknown player vs: " + villainName);
    return false;
} else if (hero == null) {
    plugin.ConsoleWarn("^b[TOP] OnAnyChat^n: unknown player vs: " + heroName);
    return false;
}

if (level >= 4) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n vs: " + hero.FullName + " vs " + villain.FullName);
}

// Get victim and killer data
Dictionary<String, int> myVictims;
if (hero.RoundData.issetObject(kVictims)) {
    myVictims = (Dictionary<String, int>)hero.RoundData.getObject(kVictims);
} else {
    plugin.ConsoleError("^b[TOP] OnAnyChat^n vs No: " + kVictims + " " + hero.FullName);
    return false;
}
Dictionary<String, int> myKillers;
if (hero.RoundData.issetObject(kKillers)) {
    myKillers = (Dictionary<String, int>)hero.RoundData.getObject(kKillers);
} else {
    plugin.ConsoleError("^b[TOP] OnAnyChat^n vs No: " + kKillers + " " + hero.FullName);
    return false;
}

// Hero's kills/deaths vs. villain
if (myVictims.ContainsKey(villain.FullName)) {
    killsVs = myVictims[villain.FullName];
}
if (myKillers.ContainsKey(villain.FullName)) {
    deathsVs = myKillers[villain.FullName];
}

/* --- NON-CODERS: SAFE TO MODIFY BELOW THIS LINE --- */

// Example output: [LGN]PapaCharlie9 vs micovery (K-D): 0-3

String message = hero.FullName + " vs " + villain.FullName + " (K-D): " + killsVs + "-" + deathsVs;
if (level >= 3) {
    plugin.ConsoleWrite(@"^b[TOP] OnAnyChat^n " + ((privScope)_"^8private^0 ":"^8public^0 ") + "Standings: ");
    plugin.ConsoleWrite(message);
}
if (privScope)
    plugin.SendSquadMessage(player.TeamId, player.SquadId, message);
else
    plugin.SendGlobalMessage(message);


return false;
At debug level 3 or higher the chat line is logged.

 

At debug level 4 or higher, debugging info about the parse of the command is logged.

 

 

 

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by droopie*:

 

Bah, it's my mistake, the limit object is only available in the second_check.

 

Set the first_check to this Expression:

 

Code:

true
And set second_check to this Code:

Code:

double minutes = 15;
   
     DateTime now = DateTime.now;
    
     if (limit.Data.issetObject("last_message_time") == false)
         limit.Data.setObject("last_message_time", now);
     
     DateTime lastMessageTime =  (DateTime) limit.Data.getObject("last_message_time");
     
     double minutes_since_last = now.Substract(lastMessageTime).TotalMinutes;

     if (minutes_since_last == 0 || minutes_since_last >= minutes)
     {
         limit.Data.setObject("last_message_time", now);
         plugin.SendGlobalMessage("Message1");
     }

     return false;
By the way, my original description is wrong ... the first message will be sent after 15 minutes. I have changed the code so it matches if the time difference is 0 ... ( the first time), it also sends the message.
as posted in myrcon.net/...insane-limits-examples#entry18648 im just going to wait for the next release for an auto messages to the server, not just per person. i entered the code above but cant add more messages. for some reason it sends all the messages at once. im just looking for a spam bot to the whole server but for it to send the same message up to 5 times at once so it fills up the chatbox. these are general announcement messages to all in the server so not specific to individual users.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

im just looking for a spam bot to the whole server but for it to send the same message up to 5 times at once so it fills up the chatbox. these are general announcement messages to all in the server so not specific to individual users.

As I discovered while experimenting with formatting my clan tag leaderboard based on average scores/kills (coming soon!), the chat window and the admin.say command support embedded newlines and tabs, which can be created in Code or Expressions with strings containing \n and \t control codes. The \n does a new line and \t does a tab to a tab column.

 

What this means is that you could fill up the entire chat box by sending a single message!

 

Format the message like this:

 

"This is the first line that will appear.\nThe second line will appear indented.\nThis is the third line that will appear.\nThis is the fourth line that will appear.\nThis is the fifth line that will appear."

 

It will display something like this:

 

Code:

[ADMIN] This is the first line that will appear.
        This second line will appear indented.
        This is the third line that will appear.
        This is the fourth line that will appear.
        This is the fifth line that will appear.
The second and subsequent lines are automatically indented to line up under the beginning of the first line, without needing a tab.

 

You'll have to adjust the text of each line so that it doesn't wrap, or else it will look like this:

 

Code:

This is the second line that will appear indented
and if it is too long it will wrap.
        This is the third line that will appear.
        This is the fourth line that will appear and you can't
see the first line because of wrapping.
        This is the fifth line to appear.
If that happens, reword the text so that each line that wraps is shorter.

 

Note: make sure the "quoted string" does not have @ in front of it. For example, @"abc\n123" will display as abc\n123, but "abc\n123" will be two lines "abc" and "123".

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by WaxMyCarrot*:

 

Format the message like this:

 

"This is the first line that will appear.\nThe second line will appear indented.\nThis is the third line that will appear.\nThis is the fourth line that will appear.\nThis is the fifth line that will appear."

Was there supposed to be a t/ in that example?
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by droopie*:

 

As I discovered while experimented with formatting my clan tag leaderboard based on average scores/kills (coming soon!), I discovered that the chat window and the admin.say command support \n and \t control codes. The \n does a new line and \t does a tab to a tab column.

 

What this means is that you could fill up the entire chat box by sending a single message!

 

Format the message like this:

 

"This is the first line that will appear.\nThe second line will appear indented.\nThis is the third line that will appear.\nThis is the fourth line that will appear.\nThis is the fifth line that will appear."

 

It will display something like this:

 

Code:

[ADMIN] This is the first line that will appear.
        This second line will appear indented.
        This is the third line that will appear.
        This is the fourth line that will appear.
        This is the fifth line that will appear.
The second and subsequent lines are automatically indented to line up under the beginning of the first line, without needing a tab.

 

You'll have to adjust the text of each line so that it doesn't wrap, or else it will look like this:

 

Code:

This is the second line that will appear indented
and if it is too long it will wrap.
        This is the third line that will appear.
        This is the fourth line that will appear and you can't
see the first line because of wrapping.
        This is the fifth line to appear.
If that happens, reword the text so that each line that wraps is shorter.
what example or plugin do i type it in? ive tried it on the default spambot but it just shows the \n as text. ive also tried it on that code posted earlier but it doesnt even display text with \n
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by WaxMyCarrot*:

 

Is there any way to write a limit that will keep track of the number of players on our server at the start of each map and then again at the end of each map and write that to a log or txt file on the server?

 

What I would like to do is see if I can determine if any certain maps I have a large number of people leave so as to remove it from our rotation.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Was there supposed to be a t/ in that example?

No, I didn't include \t because it is not needed for droopie's usage. It does work though and produces tabular output.

 

what example or plugin do i type it in? ive tried it on the default spambot but it just shows the \n as text. ive also tried it on that code posted earlier but it doesnt even display text with \n

Ah, good point. This will only work if the message string is in a Code or Expression statement. It probably won't work as an Action text (not 100% sure about that, depends on how the text is interpreted in Insane Limiter).

 

Also, even in a Code or Expression, if the example uses @ before the string, for example, @"xxx\nyyy", you will not get a new line, you will get xxx\nyyy instead. That's what @ means, it means ignore backslash control characters and treat them as literals.

 

So, you need an example that is Code or Expressions and that doesn't use @"...". How about Rules on Request*? That's easy to test, all you need to do is get on a server you control and that's running Insane Limits and type !rules. Try this version of second_check as an experiment (see the example at the link for the rest of the requirements):

 

Code:

// Try putting all 4 rules in a single text message string
String Rules = "----- SERVER RULES -----\nNo Cheating, Glitching, Statspadding!\nNo Baserape or spawncamping\nNo mainbase camping";
// Try not to add more than 4 lines because it won't fit in the chat box.

if (limit.Activations(player.Name) <= 2) {
        // Just send one message
        plugin.SendSquadMessage(player.TeamId, player.SquadId, Rules);
}

return false;
I've updated my original point to include these details (Code/Expression and not @"...").
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

Is there any way to write a limit that will keep track of the number of players on our server at the start of each map and then again at the end of each map and write that to a log or txt file on the server?

 

What I would like to do is see if I can determine if any certain maps I have a large number of people leave so as to remove it from our rotation.

I've been thinking of doing something like that for the same reason. Metro seems to kill our server, but I want proof it's not just a coincidence, since it tends to come up in our rotation late at night.

 

Ideally we'd get a graph that shows when each round starts/stops and for which map and the number of players per unit of time.

 

Failing that, some sort of calculation of rate of player leaves/joins over the time of the round might work. Or maybe just total leaves/joins/max/min for the round written to the log? Every specified interval of minutes? Something like this in the log every 5 minutes:

 

[20:05] Leave/Join Stats Metro: -6 net change (+5/-11). Round (max/min) 31/24

[20:10] Leave/Join Stats Metro: -3 net change (+1/-4). Round (max/min) 31/21

[20:15] Leave/Join Stats Metro: -2 net change (+0/-2). Round (max/min) 31/19

 

Maybe have the CSV data written to a file, for plotting later in Excel? micovery, can a limit write a file?

 

I think we want both leaves and joins, so we know what maps cause turnover but not necessarily kill the server -- like all the jet jockeys leave when Bazaar comes up but then all the CQ IO grunts come on, with zero net change in max players.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by WaxMyCarrot*:

 

This limit will say server rules to the player on request when the player type !rules

 

Set limit to evaluate OnAnyChat and set action to None

 

Set first_check to Expression

Code:

player.LastChat.StartsWith("!rules")
Set second_check to Code

Code:

// Edit rules here
List<String> Rules = new List<String>();
Rules.Add("----- SERVER RULES -----");
Rules.Add("No Cheating, Glitching, Statspadding!");
Rules.Add("No Baserape or spawncamping");
Rules.Add("No mainbase camping");
// Try not to add more Rules.Add because it won't fit in the chat box.


if(limit.Activations(player.Name) <= 2)
    foreach(string Rule in Rules)
        plugin.SendSquadMessage(player.TeamId, player.SquadId, Rule);

return false;
Few questions... I would like to have a chat detection rule similar to this one.. but setup keywords to display specific messages.

 

Like for example if some types "hacker" in chat then a message would instantly reply "If you feel there is a hacker type @votekick Hackersname in chat" .. or if they type "is there an admin" reply "Visit our forums at www.YourHostForums.com" or "Contact our admins at [email protected]"

 

Pretty much I would like to be able to setup custom keywords that reply with specific messages without having to type !keyword or @keyword.. just have the limit detect those words anywhere in normal chat with OnChat command.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by micovery*:

 

Maybe have the CSV data written to a file, for plotting later in Excel? micovery, can a limit write a file?

Yes

 

Code:

plugin.Log( "path/to/the/file.csv", "some text");
It automatically adds new-line character at the end.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by NeIXeR*:

 

Hello, i need help...

 

Code:

if(limit.Activations() == 1)
{
    if(Regex.Match(server.NextMapFileName == MP_Subway), RegexOptions.IgnoreCase).Success)
    {
        plugin.ServerCommand("vars.gameModeCounter", "286");
    }
    else if(server.NextMapFileName != MP_Subway)
    {
        plugin.ServerCommand("vars.gameModeCounter", "150");
        plugin.ConsoleWrite("Siguiente mapa"+server.NextGamemode+". Tickets configurados");
    }
return false;
[Insane Limits] ERROR: 1 error compiling Expression

 

When close "}" more errors

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by QUACK-Major-Pain*:

 

This limit will keep switching server between hard-core, and soft-core mode, depending on the number of players in the server. When the mode is switched, the limit sends a global message notifying players of the change.

 

Set limit to evaluate OnInterval, set action to None

 

Set first_check to this Code:

 

Code:

double switch_value = 16;

bool_ hardcore = null;
if (server.Data.issetBool("hardcore"))
    hardcore = server.Data.getBool("hardcore");
        
if (server.PlayerCount < switch_value &&  ( hardcore == true || hardcore == null) ) 
{
    plugin.SendGlobalMessage("Switching server to soft-core mode");
    plugin.ConsoleWrite("Switching server to soft-core mode");
    server.Data.setBool("hardcore", false);
    
    plugin.ServerCommand("vars.friendlyFire", "false");
    plugin.ServerCommand("vars.killCam", "true");
    plugin.ServerCommand("vars.nameTag", "true");
    plugin.ServerCommand("vars.regenerateHealth", "true");
    plugin.ServerCommand("vars.hud", "true");
    plugin.ServerCommand("vars.onlySquadLeaderSpawn", "false");
    plugin.ServerCommand("vars.3dSpotting", "true");
    plugin.ServerCommand("vars.3pCam", "true");
    plugin.ServerCommand("vars.idleTimeout", "0");
    plugin.ServerCommand("vars.soldierHealth" "100");
        
}
else if ( server.PlayerCount > switch_value && (hardcore == false || hardcore == null))
{
    plugin.SendGlobalMessage("Switching server to hard-core mode");
    plugin.ConsoleWrite("Switching server to hard-core mode");
    
    server.Data.setBool("hardcore", true);

    plugin.ServerCommand("vars.friendlyFire", "true");
    plugin.ServerCommand("vars.killCam", "false");
    plugin.ServerCommand("vars.nameTag", "false");
    plugin.ServerCommand("vars.regenerateHealth", "false");
    plugin.ServerCommand("vars.hud", "false");
    plugin.ServerCommand("vars.onlySquadLeaderSpawn", "true");
    plugin.ServerCommand("vars.3dSpotting", "false");
    plugin.ServerCommand("vars.3pCam", "false");
    plugin.ServerCommand("vars.idleTimeout", "1800");
    plugin.ServerCommand("vars.soldierHealth" "60"); 
}
Note that this limit stores a flag "hardcore" in the server object. Depending on the value of the flag, it decides whether or not mode needs to be switched again. This is needed so that it would not keep spamming the switch message, as well well as not sending server commands unnecessarily if the mode is already the same.

 

This flag is only cleared if the plugin is enabled/disabled. The limit is not in any way aware of what the current mode is. It assumes that whatever mode it set last time ... is the one currently active. Because of this, if you manually change the mode, the limit will not know of the mode change.

Figured out why it's not returning to soft core.

 

Code:

[20:02:38 35] [Insane Limits] Compiling Limit #8 - Adjust Between Quick Match & Hard Core - OnInterval
[20:02:38 41] [Insane Limits] ERROR: 6 errors compiling Code
[20:02:38 41] [Insane Limits] ERROR: (CS1026, line: 40, column: 59):  ) expected
[20:02:38 42] [Insane Limits] ERROR: (CS1002, line: 40, column: 64):  ; expected
[20:02:38 42] [Insane Limits] ERROR: (CS1525, line: 40, column: 64):  Invalid expression term ')'
[20:02:38 43] [Insane Limits] ERROR: (CS1026, line: 57, column: 59):  ) expected
[20:02:38 43] [Insane Limits] ERROR: (CS1002, line: 57, column: 63):  ; expected
[20:02:38 43] [Insane Limits] ERROR: (CS1525, line: 57, column: 63):  Invalid expression term ')'
Missing "," in lines:

 

plugin.ServerCommand("vars.soldierHealth", "100");

plugin.ServerCommand("vars.soldierHealth", "60");

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by micovery*:

 

Figured out why it's not returning to soft core.

 

Code:

[20:02:38 35] [Insane Limits] Compiling Limit #8 - Adjust Between Quick Match & Hard Core - OnInterval
[20:02:38 41] [Insane Limits] ERROR: 6 errors compiling Code
[20:02:38 41] [Insane Limits] ERROR: (CS1026, line: 40, column: 59):  ) expected
[20:02:38 42] [Insane Limits] ERROR: (CS1002, line: 40, column: 64):  ; expected
[20:02:38 42] [Insane Limits] ERROR: (CS1525, line: 40, column: 64):  Invalid expression term ')'
[20:02:38 43] [Insane Limits] ERROR: (CS1026, line: 57, column: 59):  ) expected
[20:02:38 43] [Insane Limits] ERROR: (CS1002, line: 57, column: 63):  ; expected
[20:02:38 43] [Insane Limits] ERROR: (CS1525, line: 57, column: 63):  Invalid expression term ')'
These errors you are getting are from directly copy+paste from the example?

 

Run this command:

 

Code:

!dump limit 8
Then open the file "LimitEvaluator8.cs" which is created in ProCon's directory. You will be able to see exactly which lines the errors are referring to.

 

 

Hello, i need help...

Code:
if(limit.Activations() == 1)
{
    if([b]server.NextMapFileName.Equals("MP_Subway")[/b])
    {
        plugin.ServerCommand("vars.gameModeCounter", "286");
    }
    else 
    {
        plugin.ServerCommand("vars.gameModeCounter", "150");
        plugin.ConsoleWrite("Siguiente mapa"+server.NextGamemode+". Tickets configurados");
    }
}
return false;
By just looking at the code, I can see two problems. (I have not tried compiling it to see if it works)

 

  • The string comparisons are incorrect ... this is how you do some simple string comparisons:

     

    Code:

    if (server.NextMapFileName.Equals("MP_Subway"))
    Code:
    if ( Regex.Match(server.NextMapFileName, @"MP_Subway", RegexOptions.IgnoreCase).Success )
    Code:
        if ( server.NextMapFileName == "MP_Subway" )
  • Missing curly brace at the end
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by QUACK-Major-Pain*:

 

You posted before I could do the edit.

 

Error in the example.

 

Missing "," in lines:

 

plugin.ServerCommand("vars.soldierHealth", "100");

plugin.ServerCommand("vars.soldierHealth", "60");

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by micovery*:

 

You posted before I could do the edit.

 

Error in the example.

 

Missing "," in lines:

 

plugin.ServerCommand("vars.soldierHealth", "100");

plugin.ServerCommand("vars.soldierHealth", "60");

Thanks! ... I did not try re-compiling the example after I updated it the first time. I just re-updated it now to fix missing commas in those two lines. Hopefully it should work fine this time.
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by PapaCharlie9*:

 

I think we want both leaves and joins ...

Oops, I forgot that there is no OnLeave in 0.7. I think it's planned for 0.8, though.

 

In the mean time, I'll work on a simple example that just keeps track of the current number of players and calculates the net change OnInterval. Also min and max for round.

 

Few questions... I would like to have a chat detection rule similar to this one.. but setup keywords to display specific messages.

 

Like for example if some types "hacker" in chat then a message would instantly reply "If you feel there is a hacker type @votekick Hackersname in chat" .. or if they type "is there an admin" reply "Visit our forums at www.YourHostForums.com" or "Contact our admins at [email protected]"

 

Pretty much I would like to be able to setup custom keywords that reply with specific messages without having to type !keyword or @keyword.. just have the limit detect those words anywhere in normal chat with OnChat command.

That's easy, but be careful. This could end up being abused by a player wanting to spam the chat box to be annoying. Or, it might just annoy a player who is trying to type about "this hacker guy I saw yesterday" to a buddy in chat.

 

This is a variation on the Bad Words punisher. You can change the list of patterns to match and the message to send by changing or adding more Add() lines to the "phrase book":

 

Set limit to evaluate OnAnyChat, and action to None,

 

Set first_check to this Code:

 

Code:

Dictionary<String, String> book = new Dictionary<String, String>();

// The key is a Regex pattern to search for in chat, the value is the message to send

book.Add(@"hack", "player.Name, if you feel there is a hacker type @votekick Hackersname in chat.");
book.Add(@"admin", "player.Name, you can email our admins at [email protected]");
	
foreach(KeyValuePair<String,String> phrase in book) {
    if (Regex.Match(player.LastChat, phrase.Key, RegexOptions.IgnoreCase).Success) {
        plugin.SendSquadMessage(player.TeamId, player.SquadId, plugin.R(phrase.Value));
    }
}

return false;
Since the message (phrase.Value) is run through plugin.R, you can use replacements to personalize the message. To minimize annoyance risk, the message is only sent to the player's squad.

 

This compiles okay, but I haven't tested it. Note that it is very aggressive at matching as written, so the first pattern will match "hack" and "hacker", but it will also match "shack" and "pathacknowledge", etc.

 

AGAIN, CAUTION! THIS CAN BE EASILY ABUSED AND PISS OFF YOUR PLAYERS!

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by WaxMyCarrot*:

 

That's easy, but be careful. This could end up being abused by a player wanting to spam the chat box to be annoying. Or, it might just annoy a player who is trying to type about "this hacker guy I saw yesterday" to a buddy in chat.

 

This is a variation on the Bad Words punisher. You can change the list of patterns to match and the message to send by changing or adding more Add() lines to the "phrase book":

 

Set limit to evaluate OnAnyChat, and action to None,

 

Set first_check to this Code:

 

Code:

Dictionary<String, String> book = new Dictionary<String, String>();

// The key is a Regex pattern to search for in chat, the value is the message to send

book.Add(@"hack", "player.Name, if you feel there is a hacker type @votekick Hackersname in chat.");
book.Add(@"admin", "player.Name, you can email our admins at [email protected]");
	
foreach(KeyValuePair<String,String> phrase in book) {
    if (Regex.Match(player.LastChat, phrase.Key, RegexOptions.IgnoreCase).Success) {
        plugin.SendSquadMessage(player.TeamId, player.SquadId, plugin.R(phrase.Value));
    }
}

return false;
Since the message (phrase.Value) is run through plugin.R, you can use replacements to personalize the message. To minimize annoyance risk, the message is only sent to the player's squad.

 

This compiles okay, but I haven't tested it. Note that it is very aggressive at matching as written, so the first pattern will match "hack" and "hacker", but it will also match "shack" and "pathacknowledge", etc.

 

AGAIN, CAUTION! THIS CAN BE EASILY ABUSED AND PISS OFF YOUR PLAYERS!

Will the /n and /t work in the messages for this?
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by micovery*:

 

Could there be an example of killing players if they kill another player with any vehicle if the player count on the server is below 8?

This is not possible at the moment. The server does not report the vehicle kills as it used to do in BFBC2. All vehicles kills are simply reported as "Death", so there is no way to tell if weapon was a vehicle or not.

 

Will the /n and /t work in the messages for this?

It's a back-slash "\" not a forward-slash "/" ... it should work on custom code ... like this:

 

Code:

plugin.SendGlobalMessage("Line1\nLine2\nLine3");
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by Mootart*:

 

This limit will activate for players who get more than 90% headshots after 30 kills (with a specific weapon). This works across rounds. (Total stats are not reset at the end of the round).

 

Set limit to evaluate OnKill, set action to Kick,

 

Set first_check to this Code:

 

Code:

double kills = player[kill.Weapon].KillsTotal;
         double headshots = player[kill.Weapon].HeadshotsTotal;
         double headshots_percent = Math.Round((headshots / kills)*100.0, 2);
         
         if (headshots_percent > 90 && kills > 30)
         {
             plugin.ConsoleWrite(plugin.R("%p_n% has " + headshots_percent + " headshots percent with "+ kill.Weapon + " after " + kills + " kills"));
             return true;
         }
         
         return false;
Set these action specific parameters:

Code:

kick_message = %p_n%, you were kicked for suspicious headshots percentage with %w_n%
This feature (per-weapon stats) is not extensively tested. You should adjust the conditions to test, and see if it works as you expect it. If you are going to test it on a populated server, make sure it's on virtual so you can adjust the values until you feel comfortable that it will not kick everyone.

 

Just want to ask and i think i post it earlier before...

 

Im using this script but everytime the round is finish the procon layer will be disconnected. and reconnect again.

i tried to disable it and procon layer works smooth.

 

is it normal for the procon to be reset on this limit? if not can you help me please. getting furstrated already

 

thanks for your time micovery and PapaCharlie9

 

 

EDIT i need to repost this its not being answer. sorry.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by Mootart*:

 

This limit detects when a player has no Battlelog account. Each time the player spawns, it warns him that he will be kicked. It tells him how much time he has left. After five minutes expires, the player is kicked.

 

Set limit to evaluate OnSpawn, and action to None

 

Set first_check to this Expression

 

Code:

player.Battlelog404 == true
Set second_check to this Code

 

Code:

int minutes = 5;
      TimeSpan remain = TimeSpan.FromMinutes(5).Subtract(DateTime.Now.Subtract(player.JoinTime));
      
      if ( remain.TotalSeconds > 0 )
          plugin.SendSquadMessage(player.TeamId, player.SquadId, plugin.R("player.Name looks like you don't have a Battlelog account. You have " + plugin.FriendlySpan(remain) + " before being kicked"));
      else
      {
          plugin.SendGlobalMessage(plugin.R("player.Name was kicked for not having a Battlelog account"));
          plugin.KickPlayerWithMessage(player.Name, plugin.R("player.Name, you were kicked for not having a Battelog account"));
      }
      return false;
i use this Limit Copy and paste but after doing it got this error...

 

[21:18:13 11] [insane Limits] Compiling Limit #18 - Kick Players Without Battlelog - OnSpawn

[21:18:13 12] [insane Limits] ERROR: 1 error compiling Expression

 

 

Micovery could you help me please?

 

EDIT: also got this error after this setting this limit too..

 

[21:20:30 75] [insane Limits] Thread(settings): WARNING: Battlefield 3 does not support individual player messages

 

 

same as this.. thank for the help in advance.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by HopHead*:

 

I am trying to set my server name based on what Limits are enabled. Is there a way to check the state of a given limit?

 

So I could do something like OnInterval check if limit#1 is enabled.

I would do this in the Limit itself but i don't want to change the server name OnKill.

* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by NeIXeR*:

 

Code:

if(limit.Activations() == 1)
{
    if([b]server.NextMapFileName.Equals("MP_Subway")[/b])
    {
        plugin.ServerCommand("vars.gameModeCounter", "286");
    }
    else 
    {
        plugin.ServerCommand("vars.gameModeCounter", "150");
        plugin.ConsoleWrite("Siguiente mapa"+server.NextGamemode+". Tickets configurados");
    }
}
return false;
By just looking at the code, I can see two problems. (I have not tried compiling it to see if it works)

 

  • The string comparisons are incorrect ... this is how you do some simple string comparisons:

     

    Code:

    if (server.NextMapFileName.Equals("MP_Subway"))
    Code:
    if ( Regex.Match(server.NextMapFileName, @"MP_Subway", RegexOptions.IgnoreCase).Success )
    Code:
        if ( server.NextMapFileName == "MP_Subway" )
  • Missing curly brace at the end
Works perfect thanks!
* Restored post. It could be that the author is no longer active.
Link to comment

Originally Posted by micovery*:

 

Is this (limit #47) working?

Which part are you referring to? ... The announcement or the !adminlist command?

 

I have not tested it ... but it seems that if you are admin, and joining, you won't see the announcement because you'd be in the loading screen when the announcement is sent, which is ok.

* Restored post. It could be that the author is no longer active.
Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.




  • Our picks

    • Game Server Hosting:

      We're happy to announce that EZRCON will branch out into the game server provider scene. This is a big step for us so please having patience if something doesn't go right in this area. Now, what makes us different compared to other providers? Well, we're going with the idea of having a scaleable server hosting and providing more control in how you set up your server. For example, in Minecraft, you have the ability to control how many CPU cores you wish your server to have access to, how much RAM you want to use, how much disk space you want to use. This type of control can't be offered in a single service package so you're able to configure a custom package the way you want it.

      You can see all the available games here. Currently, we have the following games available.

      Valheim (From $1.50 USD)


      Rust (From $3.20 USD)


      Minecraft (Basic) (From $4.00 USD)


      Call of Duty 4X (From $7.00 USD)


      OpenTTD (From $4.00 USD)


      Squad (From $9.00 USD)


      Insurgency: Sandstorm (From $6.40 USD)


      Changes to US-East:

      Starting in January 2022, we will be moving to a different provider that has better support, better infrastructure, and better connectivity. We've noticed that the connection/routes to this location are not ideal and it's been hard getting support to correct this. Our contract for our two servers ends in March/April respectively. If you currently have servers in this location you will be migrated over to the new provider. We'll have more details when the time comes closer to January. The new location for this change will be based out of Atlanta, GA. If you have any questions/concerns please open a ticket and we'll do our best to answer them.
      • 5 replies
    • Hello All,

      I wanted to give an update to how EZRCON is doing. As of today we have 56 active customers using the services offered. I'm glad its doing so well and it hasn't been 1 year yet. To those that have services with EZRCON, I hope the service is doing well and if not please let us know so that we can improve it where possible. We've done quite a few changes behind the scenes to improve the performance hopefully. 

      We'll be launching a new location for hosting procon layers in either Los Angeles, USA or Chicago, IL. Still being decided on where the placement should be but these two locations are not set in stone yet. We would like to get feedback on where we should have a new location for hosting the Procon Layers, which you can do by replying to this topic. A poll will be created where people can vote on which location they would like to see.

      We're also looking for some suggestions on what else you would like to see for hosting provider options. So please let us know your thoughts on this matter.
      • 4 replies
    • 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



       
      • 2 replies
    • I wanted I let you know that I am starting to build out the foundation for the hosting services that I talked about here. The pricing model I was originally going for wasn't going to be suitable for how I want to build it. So instead I decided to offer each service as it's own product instead of a package deal. In the future, hopefully, I will be able to do this and offer discounts to those that choose it.

      Here is how the pricing is laid out for each service as well as information about each. This is as of 7/12/2020.

      Single MySQL database (up to 30 GB) is $10 USD per month.



      If you go over the 30 GB usage for the database then each additional gigabyte is charged at $0.10 USD each billing cycle. If you're under 30GB you don't need to worry about this.


      Databases are replicated across 3 zones (regions) for redundancy. One (1) on the east coast of the USA, One (1) in Frankfurt, and One (1) in Singapore. Depending on the demand, this would grow to more regions.


      Databases will also be backed up daily and retained for 7 days.




      Procon Layer will be $2 USD per month.


      Each layer will only allow one (1) game server connection. The reason behind this is for performance.


      Each layer will also come with all available plugins installed by default. This is to help facilitate faster deployments and get you up and running quickly.


      Each layer will automatically restart if Procon crashes. 


      Each layer will also automatically restart daily at midnight to make sure it stays in tip-top shape.


      Custom plugins can be installed by submitting a support ticket.




      Battlefield Admin Control Panel (BFACP) will be $5 USD per month


      As I am still working on building version 3 of the software, I will be installing the last version I did. Once I complete version 3 it will automatically be upgraded for you.





      All these services will be managed by me so you don't have to worry about the technical side of things to get up and going.

      If you would like to see how much it would cost for the services, I made a calculator that you can use. It can be found here https://ezrcon.com/calculator.html

       
      • 11 replies
    • I have pushed out a new minor release which updates the geodata pull (flags in the playerlisting). This should be way more accurate now. As always, please let me know if any problems show up.

       
      • 9 replies
×
×
  • 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.