• Объявления

RusWolf_ru

Плагин Insane Limits

3 сообщения в этой теме

с помощью плагина Insane Limits (этот по круче, можно для определенных игроков, задать разные сообщения, для випов например, если зарезал ты, будет написано к примеру "BadBoy распотрошил Freelancer", а если не указанный в списке игрок то просто "BadBoy ЗАРЕЗАЛ Freelancer)
создай лимит и добавь эти скрипты

 
Код: EXPRESSION
(Regex.Match(kill.Weapon, "(Melee|Knife)").Success)
 
Код:CODE
Dictionary<String, String> pkmData = new Dictionary<String, String>();
// Пример для определенных игроков.: pkmData.Add("ВАШНИК", "%k_fn%: ВЫПУСТИЛ ПОТРОХА %v_n%");
pkmData.Add("-XL-Timm", "%k_fn%: из России с любовью %v_n% Спасибо за Жетон =)");
pkmData.Add("IamDontNoob", "%k_fn%: из России с любовью %v_n% Спасибо за Жетон =)");

// ---------------------------------------------------------------------------------------------------------------------------- //
String[] pkmMsgs = { "", "" };
String pkmOut = "";
// ---------------------------------------------------------------------------------------------------------------------------- //



// Check if the killer has a personalized knife messages
if (pkmData.TryGetValue(killer.Name.Trim(), out pkmOut))
{
   // Killer has a personalized kill message
    pkmMsgs[1] = plugin.R(pkmOut);
    for (int i = 0; i < pkmMsgs.Length; i++)
    {
        plugin.SendGlobalYell(pkmMsgs[i], 10);
    }
}
else
{
    // СТАНДАРТНОЕ СООБЩЕНИЕ для всех игроков
    pkmMsgs[0] = plugin.R("%k_fn%: ЗАРЕЗАЛ %v_n%!");
    plugin.SendGlobalYell(pkmMsgs[0], 10);
}

return false;

Анонс убийств с ножа в центре экрана

Спасибо XL

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

VOTENUKE (сброс бомбы на противника) даст возможность активировать игрокам голосование против команды, которая зажала их на базе.
Для этого, игроки, который оказались зажатыми на базе, должны ввести в чат !votenuke, на сервере в 64 человека, нужно 8-9 голосов !votenuke, и команду противника убьёт два раза, с периодичностью в 10-15 секунд, что даст возможность зажатой команде, прорваться со своей базы до точек.
Для этого можно использовать плагин Insane Limits, и следующий скрипт:


Для этого потребуется создать два новых лимита, назовите первый к примеру Votenuke и установите limit_evaluation на OnAnyChat, первый скрипт Expression

 
Код: EXPRESSION
(Regex.Match(server.Gamemode, @"(Conquest|Rush|Domination)").Success)

второй скрипт Code

 
Код:CODE
/* VERSION 0.9/R8-yes-cancel */
double percent = 25; // CUSTOMIZE: of losing team that has to vote
double timeout = 6.0; // CUSTOMIZE: минут, до истечения голосования
int minPlayers = 16; // CUSTOMIZE: минимальное кол-во игроков для начала голосования
double minTicketPercent = 10; // CUSTOMIZE: минимальный процент тикетов до конца раунда
double minTicketGap = 20; // CUSTOMIZE: минимальная разница в тикетах между проигрывающей и выигрывающей командой
int maxAttempts = 3; // CUSTOMIZE: максимальное кол-во предупреждений

String kCamp = "votenuke";
String kOncePrefix = "votenuke_once_";
String kVoteTime = "votenuke_time";
String kAttemptsPrefix = "votenuke_attempts_";


int level = 2;

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

String msg = "empty";

Action<String> ChatPlayer = delegate(String name) {
    // closure bound to String msg
    plugin.ServerCommand("admin.say", msg, "player", name);
    plugin.PRoConChat("ADMIN to " + name + " > *** " + msg);
};


/* Parse the command */

Match campMatch = Regex.Match(player.LastChat, @"^\s*!vote\s*nuke", RegexOptions.IgnoreCase);
Match yesMatch = Regex.Match(player.LastChat, @"^\s*!yes", RegexOptions.IgnoreCase);
Match cancelMatch = Regex.Match(player.LastChat, @"^\s*!cancelvote", RegexOptions.IgnoreCase);

/* Check for admin cancel */

double t1 = server.RemainTickets(1);
double t2 = server.RemainTickets(2);
int losing = (t1 < t2) ? 1 : 2;
List<PlayerInfoInterface> losers = (losing == 1) ? team1.players : team2.players;
String keyAttempts = kAttemptsPrefix + losing;
int attempts = 0;

if (cancelMatch.Success) {
    bool canKill = false;
    bool canKick = false;
    bool canBan = false;
    bool canMove = false;
    bool canChangeLevel = false;
    if (plugin.CheckAccount(player.Name, out canKill, out canKick, out canBan, out canMove, out canChangeLevel)) {
        if (canKick) {
            plugin.SendGlobalMessage("votenuke has been cancelled!");
            foreach (PlayerInfoInterface can in losers) {
                // Erase the vote
                if (can.RoundData.issetBool(kCamp)) can.RoundData.unsetBool(kCamp);
            }
            server.RoundData.unsetObject(kVoteTime);

            /* Losing team only gets to try this vote maxAttempts */
            attempts = 0;
            if (server.RoundData.issetInt(keyAttempts)) attempts = server.RoundData.getInt(keyAttempts);
            server.RoundData.setInt(keyAttempts, attempts + 1);
        } else {
            ChatPlayer("You are not authorized to use this command");
        }
    } else {
        ChatPlayer("Nice try, but only admins can use that command");
    }
    return false;
}

/* Bail out if not a proper vote */

if (!campMatch.Success && !yesMatch.Success) return false;

/* Bail out if this player already voted */

if (player.RoundData.issetBool(kCamp)) {
    msg = "You already voted on this votenuke attempt!";
    ChatPlayer(player.Name);
    return false;
}

/* Bail out if round about to end */

if (server.RemainTicketsPercent(1) < minTicketPercent || server.RemainTicketsPercent(2) < minTicketPercent) {
    msg = "Round too close to ending to hold a nuke vote!";
    if (!yesMatch.Success) ChatPlayer(player.Name);
    return false;
}

/* Bail out if ticket ratio isn't large enough */

if (Math.Abs(t1 - t2) < minTicketGap) {
    msg = "Ticket counts too close to hold a nuke vote!";
    if (!yesMatch.Success) ChatPlayer(player.Name);
    return false;
}

/* Bail out if voter is not on the losing team */


if (player.TeamId != losing) {
    msg = "You are not on the losing team!";
    if (!yesMatch.Success) ChatPlayer(player.Name);
    return false;
}

/* Bail out if this team already completed a vote camp this round */

String key = kOncePrefix + losing;
if (server.RoundData.issetBool(key)) {
    msg = "Your team already completed a nuke vote this round!";
    if (!yesMatch.Success) ChatPlayer(player.Name);
    return false;
}

/* Bail out if maxAttempts made */

if (server.RoundData.issetInt(keyAttempts)) {
    attempts = server.RoundData.getInt(keyAttempts);
    if (attempts >= maxAttempts) {
        msg = "Your team already made " + maxAttempts + " attempts at nuking this round!";
        if (!yesMatch.Success) ChatPlayer(player.Name);
        return false;
    }
}

/* Bail out if not enough players to enable vote */

if (server.PlayerCount < minPlayers) {
    msg = "Not enough players to hold a nuke vote!";
    if (!yesMatch.Success) ChatPlayer(player.Name);
    return false;
}

if (level >= 2) plugin.ConsoleWrite("^b[VoteNuke]^n " + player.FullName + " voted to nuke baserapers");

msg = "You voted to nuke the other team camping your base";
if (!yesMatch.Success) ChatPlayer(player.Name);

/* Tally the votes */

int votes = 0;

/* Start timer if a valid command */

if (!server.RoundData.issetObject(kVoteTime)) {
    if (yesMatch.Success) {
        return false;
    }
    server.RoundData.setObject(kVoteTime, DateTime.Now);
    if (level >= 2) plugin.ConsoleWrite("^b[VoteNuke]^n vote timer started");
}
DateTime started = (DateTime)server.RoundData.getObject(kVoteTime);
TimeSpan since = DateTime.Now.Subtract(started);

/* Count the vote in the voter's dictionary */
/* Votes are kept with the voter */
/* If the voter leaves, his votes are not counted */

if (!player.RoundData.issetBool(kCamp)) player.RoundData.setBool(kCamp, true);

/* Bail out if too much time has past */

if (since.TotalMinutes > timeout) {
    msg = "The voting time has expired, the nuke vote is cancelled!";
    plugin.SendGlobalMessage(msg);
    plugin.SendGlobalYell(msg, 10);
    if (level >= 2) plugin.ConsoleWrite("^b[VoteCamp]^n vote timeout expired");
    foreach (PlayerInfoInterface can in losers) {
        // Erase the vote
        if (can.RoundData.issetBool(kCamp)) can.RoundData.unsetBool(kCamp);
    }
    server.RoundData.unsetObject(kVoteTime);

    /* Losing team only gets to try this vote maxAttempts */
    attempts = 0;
    if (server.RoundData.issetInt(keyAttempts)) attempts = server.RoundData.getInt(keyAttempts);
    server.RoundData.setInt(keyAttempts, attempts + 1);
 
    return false;
}

/* Otherwise tally */

foreach(PlayerInfoInterface p in losers) {
    if (p.RoundData.issetBool(kCamp)) votes++;
}
if (level >= 3) plugin.ConsoleWrite("^b[VoteNuke]^n loser votes = " + votes + " of " + losers.Count);

int needed = Convert.ToInt32(Math.Ceiling((double) losers.Count * (percent/100.0)));
int remain = needed - votes;

if (level >= 3) plugin.ConsoleWrite("^b[VoteNuke]^n needed = " + needed);

String campers = (losing == 1) ? "RU" : "US"; // BF3
String voters = (losing == 1) ? "US" : "RU"; // BF3
if (server.GameVersion == "BF4") {
    String[] factionNames = new String[]{"US", "RU", "CN"};
    int f1 = (team1.Faction < 0 || team1.Faction > 2) ? 0 : team1.Faction;
    int f2 = (team2.Faction < 0 || team2.Faction > 2) ? 1 : team2.Faction;
    campers = (losing == 1) ? factionNames[f2] : factionNames[f1];
    voters = (losing == 1) ? factionNames[f1] : factionNames[f2];
}

if (remain > 0) {
    msg = remain + " " + voters + " votes needed to punish " + campers + " team! " + Convert.ToInt32(Math.Ceiling(timeout - since.TotalMinutes)) + " mins left to vote!";
    plugin.SendGlobalMessage(msg);
    plugin.SendGlobalYell(msg, 8);
    if (level >= 2) plugin.ConsoleWrite("^b[VoteNote]^n " + msg);
    return false;
}

/* Punish the campers */

msg = "Vote succeeded: " + campers + " team is being nuked for camping your deployment! Break out now!";
plugin.SendGlobalMessage(msg);
plugin.SendGlobalYell(msg, 15);
if (level >= 2) plugin.ConsoleWrite("^b[VoteNuke]^n " + msg);

List<PlayerInfoInterface> bad = (losing == 1) ? team2.players : team1.players;
foreach (PlayerInfoInterface nuke in bad) {
    nuke.RoundData.setBool("NUKE TWICE", true);
    plugin.KillPlayer(nuke.Name, 1);
    if (level >= 3) plugin.ConsoleWrite("^b[VoteCamp]^n killing " + nuke.FullName);
}

/* Losing team only gets to do this once */

server.RoundData.setBool(key, true);

return false;


Теперь, создайте второй лимит, и назовите его Secon Nuke
Установите limit_evaluation на OnSpawn, а limit_first_check_code на Code и ввидите этот скрипт:

 
Код:CODE
int level = 2;

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

if (player.RoundData.issetBool("NUKE TWICE")) {
    player.RoundData.unsetBool("NUKE TWICE");
    plugin.SendPlayerMessage(player.Name, "You will be ADMIN KILLED one more time, then you can spawn again!");
    plugin.KillPlayer(player.Name, 5);
    if (level >= 3) plugin.ConsoleWrite("^b[VoteCamp]^n SECOND killing of " + player.FullName);
}
return false;

 


Таким образом, при успешном, начатом голосовании !votenuke, команду базрейперов убьёт два раза.

Спасибо XL

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Запрет гранат


Для запрета гранат на своём сервере, используйте следующий скрипт:
- установите limit_evaluation на OnKill
*ЗАПРЕТ ТОЛЬКО ВЗРЫВЧАТЫХ ГРАНАТ

Expression

Regex.Match(kill.Weapon, @"(U_M67|M67|U_Grenade_RGO|U_V40)", RegexOptions.IgnoreCase).Success

 

Code

String kCounter = killer.Name + "_TreatAsOne_Count";
TimeSpan time = TimeSpan.FromSeconds(5); // Activations within 5 seconds count as 1

int warnings = 0;
if (server.RoundData.issetInt(kCounter)) warnings = server.RoundData.getInt(kCounter);


String msg = "none";
if (warnings == 0) {
        msg = plugin.R("[АВТО-АДМИН] %k_n% не используй %w_n% Следующий раз КИК!"); // Первое предупреждающее сообщение
        plugin.SendGlobalMessage(msg);
        plugin.PRoConChat("ADMIN > " + msg);
        plugin.PRoConEvent(msg, "Insane Limits");
        plugin.KillPlayer(killer.Name, 2);
        server.RoundData.setInt(kCounter, warnings+1);
        return false;
}

if (limit.Activations(killer.Name, time) > 1) return false;

if (warnings >= 1) {
        msg = plugin.R("[АВТО-АДМИН] %k_n% исключен за использование %w_n%");
        plugin.SendGlobalMessage(msg);
        plugin.PRoConChat("ADMIN > " + msg);
        plugin.PRoConEvent(msg, "Insane Limits");
        plugin.KickPlayerWithMessage(killer.Name, msg);
}
server.RoundData.setInt(kCounter, warnings+1);
return false;

 


С этим скриптом, игрока использующего запрещенное оружие, первый раз убьет, второй раз кикнет.

Если вы хотите запретить все гранаты, включая флешки и зажигательную, используйте этот Expression код

Regex.Match(kill.Weapon, @"(U_M67|M67|U_Grenade_RGO|U_Flashbang|U_M34|U_V40)", RegexOptions.IgnoreCase).Success


Кому-то, может показаться малым, просто кик с сервера.
Этот код, будет сначала предупреждать игрока, затем забанит на 20 минут, если он зайдет и снова начнет использовать запрещенное оружие его опять предупредит, а затем забанит уже на неделю

//plugin.PRoConChat("plugin: " + player.Name +" - " + plugin.Data.issetBool(player.Name));
    //plugin.SendGlobalMessage("plugin: " + player.Name +" - "+ plugin.Data.issetBool(player.Name));
  

    TimeSpan time = TimeSpan.FromSeconds(2);

    double count = limit.Activations(player.Name);
  

    if (limit.Activations(killer.Name, time) > 1)
    {
        //TODO: send to player
        plugin.SendGlobalMessage(plugin.R("%p_n% совершил мультиккилл с %w_n%."));
        return false;
    }
  
    if (count%2 == 1)
    {
        //plugin.SendPlayerMessage(player.Name, plugin.R ("%p_n%, это %w_n% оружие запрещено, след. раз бан!"));

        plugin.KillPlayer(player.Name);
        plugin.SendGlobalMessage(plugin.R("%p_n%, это %w_n% оружие запрещено, след. раз бан!"));
        plugin.PRoConChat(plugin.R("%p_n%, это %w_n% оружие запрещено, след. раз бан!"));
    }
    else if (count%2 == 0)
    {
        if (plugin.Data.issetBool(player.Name))
        {
            plugin.SendGlobalMessage(plugin.R("%p_n% Вы забанены на неделю, за использование %w_n%"));
            plugin.PRoConChat(plugin.R("%p_n% Вы забанены на неделю, за использование %w_n%"));
            plugin.PBBanPlayerWithMessage(PBBanDuration.Temporary, player.Name, 10080, plugin.R("%p_n% Вы забанены на неделю, за использование %w_n%"));
            plugin.Data.unsetBool(player.Name);

            //plugin.Data.setDouble("count", 0);

          
        }
        else
        {
            plugin.SendGlobalMessage(plugin.R("%p_n% Вы забанены на 20 минут, за использование %w_n%"));
            plugin.PRoConChat(plugin.R("%p_n% Вы забанены на 20 минут, за использование %w_n%"));
            plugin.PBBanPlayerWithMessage(PBBanDuration.Temporary, player.Name, 20, plugin.R("%p_n% Вы забанены на 20 минут, за использование %w_n%"));
          
            //plugin.Data.setDouble("count", 0);
            if (!plugin.Data.issetBool(player.Name))
            {
                plugin.Data.setBool(player.Name, true);
            }
        }
    }

Спасибо XL

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу