Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

2 страниц V   1 2

Auto Mix MiniSystem 1.1

, go mix, ya sozdal
Статус пользователя proff_q
сообщение 21.1.2015, 20:15
Сообщение #1
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Описание:
Небольшая amxx система для проведения соревновательных матчей, в частности, подходит больше для миксов.

Принцип работы:
При запуске сервера/смены карты запускается Разминочный раунд. При достижении необходимого количества игроков на сервере, следует проверка на готовность каждого игрока. После того, как игроки подтвердили свою готовность начинается Первая половина матча. При достижении пятнадцати сыгранных раундов происходит автоматическая Смена команд, а так же опять ожидается готовность игроков. После очередного подтверждения начинается Вторая половина матча. Далее при достижении шестнадцати выигранных раунда, команда определяется победителем. Если же команды сыграли со счетом ровным, 15-15, то оглашается дружеская Ничья.

Так же при старте матча в массив записывается никнейм игрока. Если он покинет игру, на его место сможет зайти игрок с таким же никнеймом, как у предыдущего. Иначе, игроков не пустит на сервер по причине не участия в матче.

Команды:
!r - выставить статус Готов.
!n - выставить статус Не Готов. (Работает только на Разминке)
!s - запросить статус матча. Состояния матча(Разминка, Первая половина, Смена команд, Вторая половина).
!b - проголосовать за остановку матча. Функция сработает при достижении полного количества голосов(pl).

Используемые модули:
hamsandwich

Настройка:
#define pl 10 - количество игроков, необходимое для начала матча.

Примечание:
В ходе тестирования ошибок и багов обнаружено не было. При обнаружении любых ошибок, багов пишите здесь или по контактам. Пожелания и предложения так же приветствуются.
Временно не поддерживается HLTV, будет исправлено в следующей версии.

В планах:
Сделать ожидание игрока при его дисконнекте. Если время отсутствия превысит двух минут, то в течении следующей минуты на его место сможет зайти другой, случайный игрок. Иначе матч остановится.

Автор: proff_q
Версия: 1.1

Скачать:
Версия 1.0:Прикрепленный файл  mix.sma ( 12,61 килобайт ) Кол-во скачиваний: 224
Версия 1.1: Прикрепленный файл  mix.sma ( 13,26 килобайт ) Кол-во скачиваний: 474
Пост: Auto Mix MiniSystem v 1.1 (Пост #869818)

===============================

Скрипт на C# работающий по RCON протоколу, не тестировалось!
Для правильной работы скрипта должны быть выставлены следующие настройки:
Квары на сервере
Код
logaddress_add ip port // айпи адрес и порт сервера обработки логов. Внимание, адрес сервера пишется без ":"
log on
sv_logbans 1
sv_logecho 1
sv_logfile 1

В скрипте
Код
int listening_port = 33333; // порт сервера обработки логов
string hl_ip = "127.0.0.1"; // айпи адрес сервера кс
int hl_port = 27015; // порт сервера кс
string hl_password = "ololo"; // rcon пароль на сервере кс

Код:
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
 
class main_class
{
    int listening_port = 33333;
    string hl_ip = "127.0.0.1";
    int hl_port = 27015;
    string hl_password = "ololo";
 
    /**** CONSTANTES ****/
    const int warmup = 0;
    const int first_half = 1;
    const int change_team = 2;
    const int second_half = 3;
 
    const int ct = 2;
    const int tt = 1;
 
    const bool not_ready = false;
    const bool ready = true;
 
    const int pl = 10;
 
    readonly string[] warmups_cvars = { "mp_startmoney \"16000.0\"", "mp_freezetime \"0.0\"", "mp_buytime \"1.75\"", "mp_friendlyfire \"0.0\"", "mp_roundtime \"1.0\"", "mp_forcecamera \"2.0\"", "mp_forcechasecam \"2.0\"", "sv_restart \"3.0\"", "say \"** Warmup after restart!\"", "say \"** The game hasn't started! Warmup!\""};
    readonly string[] halfs_cvars =  { "mp_startmoney \"800.0\"", "mp_c4timer \"35.0\"", "mp_freezetime \"13.0\"", "mp_buytime \"0.25\"", "mp_friendlyfire \"1.0\"", "mp_roundtime \"1.75\"", "mp_forcecamera \"2.0\"", "mp_forcechasecam \"2.0\"", "sv_restart \"3.0\"", "say \"** The game will start after restart!\"", "say \"** Live! Live! Live! Good luck and Have fun!\""};
 
    string[] players_name = new string[1024];
    bool[] players_status = new bool[1024];
    int[] players_userid = new int[1024];
    string[] players_team = new string[1024];
    int[] score = new int[3];
    int game_status = 0;
    int connected_players = 0;
    int ready_players = 0;
 
    public static void Main() {
        byte[] data = new byte[1024];
 
        main_class main = new main_class();
        IPEndPoint ip_port = new IPEndPoint(IPAddress.Any, main.listening_port);
        UdpClient new_socket = new UdpClient(ip_port);
 
        Console.WriteLine("Waiting for a client...");
 
        IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
 
        while (true) {
            data = new_socket.Receive(ref sender);
            string msg = Encoding.ASCII.GetString(data, 0, data.Length);
 
            msg = main.log_type(msg); // gogogo
            //data = Encoding.ASCII.GetBytes(main.parse_info(msg));
 
            Console.WriteLine(msg);
 
            new_socket.Send(data, data.Length, sender);
        }
    }
 
    public string log_type(string text) {
        string name = "", message = "";
        int userid = 0;
 
        main_class main = new main_class();
 
        if(text.Contains("CTs_Win") || text.Contains("Bomb_Defused") || text.Contains("Target_Saved")) {
            if (game_status == first_half || game_status == second_half) { score[ct]++; check_score(); } return message;
        }
        else if(text.Contains("Terrorists_Win") || text.Contains("Target_Bombed")) {
            if(game_status == first_half || game_status == second_half) { score[tt]++; check_score(); } return message;
        }
 
        if(text.Contains("Rcon") || text.Contains("Server") || text.Contains("World") || text.Contains("Team")) return message;
 
        name = text.Substring(text.IndexOf("\"") + 1, text.IndexOf("<") - text.IndexOf("\"") - 1);
        userid = Convert.ToInt32(text.Substring(text.IndexOf("<") + 1, text.IndexOf(">") - text.IndexOf("<") - 1));
         
        if(text.Contains("entered")) {
            connected_players++;
 
         players_name[userid] = name;
         players_status[userid] = not_ready;
 
            check_player(userid, name);
            check_status();
        }
        else if(text.Contains("joined team")) {
            if (text[text.IndexOf("joined team") + 13] == 'C') players_team[userid] = "CT";
          else players_team[userid] = "TERRORIST";
 
            Console.WriteLine("team azaza");
        }
        else if(text.Contains("disconnected") || text.Contains("was kicked")) {
            players_name[userid] = "";
         players_status[userid] = not_ready;
 
            check_status();
        }
        else if(text.Contains("changed name")) {
            players_name[userid] = name;
        }
        else if(text.Contains("say")) {
            if(text[text.IndexOf("say") + 5] == '!') {
                switch (text[text.IndexOf("say") + 6]) {
               case 'r': {
                  if(!players_status[userid]) {
                     ready_players++;
                     players_status[userid] = ready;
                  }
                         
                  message = String.Format("say \"** Player {0} ready to play!\"", players_name[userid]);
                        main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
 
                        check_status();
 
                  break;
               }
 
               case 'n': {
                  switch(game_status) {
                     case warmup: {
                        if(players_status[userid]) {
                           ready_players--;
                           players_status[userid] = not_ready;
                        }
 
                                message = String.Format("say \"** Player {0} unready to play!\"", players_name[userid]);
                                main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
 
                                check_status();
 
                        break;
                     }
 
                     case change_team: goto case warmup;
                  }
 
                  break;
               }
 
               case 's': {  
                  switch(game_status) {
                            case warmup: { message = String.Format("** Game status: Warmup."); break; }
                            case change_team: { message = String.Format("** Game status: Team changing. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
                            case first_half: { message = String.Format("** Game status: First half. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
                            case second_half: { message = String.Format("** Game status: Second half. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
                  }
 
                        main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
    
                  break;
               }
            }
         }
        }
 
        return message;
    }
 
    public static void check_player(int userid, string name) {
        main_class main = new main_class();
        string message = "";
 
        if(main.connected_players > pl) {
            message = String.Format("kick #{0}  \"Server is full, you can't spectating.\"", userid);
            main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);  
 
          return;
       }
    
       switch(main.game_status) {
          case first_half: {
                if(!main.players_name.Contains(name)) {
                    message = String.Format("kick #%d  \"You aren't playing in this match.\"", userid);
                    main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);  
 
                return;
             }
    
             main.players_status[userid] = ready;
             main.ready_players++;
       
                message = String.Format("say \"Player {0} returned.\"", main.players_name[userid]);
                main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
 
                break;
          }
 
            case second_half: goto case first_half;
            case change_team: goto case first_half;
       
          case warmup: {
             main.players_status[userid] = not_ready;
 
                message = String.Format("say \"Type !r for ready and match will start.\"");
                main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
 
                break;
          }
       }
    }
 
    public static void check_status() {
        main_class main = new main_class();
        string message = "";
    
       switch(main.game_status) {
          case warmup: {
             if(main.connected_players == pl && main.ready_players == pl) {}/*start_match();*/
             else if(main.connected_players == pl && main.ready_players != pl) {
                message = "say \"** Waiting for ready:";
       
                for(int i = 0; i < main.players_status.Length; i++) {
                        if(!main.players_status[main.players_userid[i]]) {
                            message = String.Format("{0} {1}", message, main.players_name[main.players_userid[i]]);
                        }
                    }
 
                    message = String.Format("{0}\"", message);
                    main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
             }
             else if(main.connected_players < pl) {
                    message = String.Format("say \"** Not enough players to start a game.\"");
                    main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
             }  
 
                break;
          }
 
            case change_team: goto case warmup;
       }
    }
 
    public static void check_score() {
        main_class main = new main_class();
 
        if(main.score[ct] + main.score[tt] == 15) {
            int a = main.score[tt];
            main.score[tt] = main.score[ct];
            main.score[ct] = a;
 
            start_warmup(false);
            main.ready_players = 0;
        }
        else if (main.score[ct] == 16) end_match(ct);
        else if (main.score[tt] == 16) end_match(tt);
        else if (main.score[tt] == 15 && main.score[ct] == 15) end_match(0);
    }
 
    // stocks
    public static void start_warmup(bool num) {
        main_class main = new main_class();
 
       if(num) main.game_status = warmup;
        else {
            if(main.game_status == first_half) main.game_status = change_team;
         else main.game_status = warmup;
      }
        
        for(int i = 0; i < main.warmups_cvars.Length; i++) {
            main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, main.warmups_cvars[i]);
        }
    }
 
    public static void start_match() {
        main_class main = new main_class();
 
        if(main.game_status == warmup) main.game_status = first_half;
        else if(main.game_status == change_team)  main.game_status = second_half;
 
        for (int i = 0; i < main.halfs_cvars.Length; i++) {
            main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, main.halfs_cvars[i]);
        }
    }
 
    public static void end_match(int team) {
        main_class main = new main_class();
        string message = "";
 
       switch(team) {
            case tt: { message = String.Format("say \"** Terrorists win!\""); break; }
            case ct: { message = String.Format("say \"** Counter-Terrorists win!\""); break; }
            case 0: { message = String.Format("say \"** Draw!\""); break; }
       }
 
        for (int i = 0; i < 3; i++) {
            main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
        }
 
        Array.Clear(main.players_status, 0, main.players_status.Length);
       main.ready_players = 0;
    
       start_warmup(true);
    }
 
    /* Credits to Waqas-Badar, <noindex><a rel="nofollow" href="https://c-s.net.ua/url?u=http%3A%2F%2Fwww.codeproject.com%2F" target="_blank">http://www.codeproject.com/</a></noindex> */
 
    public byte[] prepareCommand(string command) {
        byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
        byte[] bufferSend = new byte[bufferTemp.Length + 4];
 
        //intial 5 characters as per standard
        bufferSend[0] = byte.Parse("255");
        bufferSend[1] = byte.Parse("255");
        bufferSend[2] = byte.Parse("255");
        bufferSend[3] = byte.Parse("255");
 
        //copying bytes from challenge rcon to send buffer
        int j = 4;
 
        for(int i = 0; i < bufferTemp.Length; i++) {
            bufferSend[j++] = bufferTemp[i];
        }
 
        return bufferSend;
    }
 
    public string sendRCON(string serverIp, int serverPort, string rconPassword, string rconCommand)
    {
        main_class main = new main_class();
        UdpClient client = new UdpClient();
        client.Connect(serverIp, serverPort);
 
        //sending challenge command to counter strike server
        string getChallenge = "challenge rcon\n";
        byte[] bufferSend = this.prepareCommand(getChallenge);
 
        //send challenge command and get response
        IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, main.listening_port);
        client.Send(bufferSend, bufferSend.Length);
        byte[] bufferRec = client.Receive(ref RemoteIpEndPoint);
 
        //retrive number from challenge response
        string challenge_rcon = Encoding.ASCII.GetString(bufferRec);
        challenge_rcon = string.Join(null, Regex.Split(challenge_rcon, "[^\\d]"));
 
        //preparing rcon command to send
        string command = "rcon " + challenge_rcon + " \"" + rconPassword + "\" " + rconCommand + "\n";
        bufferSend = this.prepareCommand(command);
 
        client.Send(bufferSend, bufferSend.Length);
        bufferRec = client.Receive(ref RemoteIpEndPoint);
 
        return Encoding.UTF8.GetString(bufferRec);
    }
 
    /* Credits to Waqas-Badar, <noindex><a rel="nofollow" href="https://c-s.net.ua/url?u=http%3A%2F%2Fwww.codeproject.com%2F" target="_blank">http://www.codeproject.com/</a></noindex> */
}


Отредактировал: proff_q, - 11.12.2015, 10:15
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 15 раз
   Цитировать сообщение
Статус пользователя Nebo
сообщение 21.1.2015, 20:27
Сообщение #2


Стаж: 11 лет
Город: Казань

Сообщений: 3181
Благодарностей: 1015
Полезность: 701

А можно реализовать без amxx, как там на ФК
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Kasper55
сообщение 21.1.2015, 20:44
Сообщение #3
Стаж: 13 лет

Сообщений: 1145
Благодарности: выкл.

Цитата(Nebo @ 21.1.2015, 21:27) *
А можно реализовать без amxx, как там на ФК

нет:)

можно конечно а смысл , если есть фк?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Nebo
сообщение 21.1.2015, 20:46
Сообщение #4


Стаж: 11 лет
Город: Казань

Сообщений: 3181
Благодарностей: 1015
Полезность: 701

Kasper55, смысл есть всегда.
Тогда и от этого плагина нет смысла, ведь есть ФК :)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя X*CaHeK*X
сообщение 21.1.2015, 21:04
Сообщение #5
Стаж: 14 лет

Сообщений: 705
Благодарностей: 225
Полезность: 561

proff_q спасибо за плагин, давно хотелось сделать подобный сервер для игроков сервера. Сделаю 2 микс-сервера: один, на 10. Второй на 1х1 - для выяснения "кто круче".
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 21.1.2015, 21:08
Сообщение #6
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Nebo, Можно конечно, но не в моих это силах. Плагин можно поставить на голый amxx, не думаю, что пустой amxmodx кардинально изменит нагрузку на сервер, ежели без него. Хотя в таких делах я не сильно просвещен. Благо современные ресурсы позволяют, можно миксы и с amxx играть.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя tenb63rus
сообщение 22.1.2015, 1:16
Сообщение #7


Стаж: 10 лет

Сообщений: 817
Благодарностей: 476
Полезность: 850

Knife раунд есть?)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Kasper55
сообщение 22.1.2015, 8:26
Сообщение #8
Стаж: 13 лет

Сообщений: 1145
Благодарности: выкл.

Цитата(Nebo @ 21.1.2015, 21:27) *
А можно реализовать без amxx, как там на ФК


и еще на фк написано не на amxx как бы
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 22.1.2015, 12:40
Сообщение #9
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Цитата(tenb63rus @ 22.1.2015, 2:16) *
Knife раунд есть?)

Думал сделать, но потом вырезал за не надобностью.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя FlaZeR
сообщение 22.1.2015, 12:45
Сообщение #10
Стаж: 9 лет

Сообщений: 354
Благодарностей: 145
Полезность: 81

Цитата(Kasper55 @ 22.1.2015, 9:26) *
и еще на фк написано не на amxx как бы

да ? И на чём же ?
Свою систему они там написали ?:)
meta list в консоль, далее всё понятно будет.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя shaid
сообщение 22.1.2015, 14:05
Сообщение #11


Стаж: 12 лет

Сообщений: 1012
Благодарностей: 432
Полезность: 835

Цитата(FlaZeR @ 22.1.2015, 12:45) *
да ? И на чём же ?
Свою систему они там написали ?:)
meta list в консоль, далее всё понятно будет.

амхх они поставили недавно. сама система проведения миксов работает на рконе, ей не нужен ни метамод, ни аддоны.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 22.1.2015, 15:18
Сообщение #12
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

shaid, Интересно, тогда как происходит авторизация игроков и проверка игроков на готовность?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 22.1.2015, 15:39
Сообщение #13


Стаж: 10 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

proff_q, ну можно это все так организовать. Демон слушает логи сервер, парсит их, ищет команды, и при надобности отправляет rcon команды.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 22.1.2015, 15:53
Сообщение #14
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Bloo, Тогда получается через веб-скрипт. На стороне этого скрипта все просчеты и идут. Думаю не сложно запилить тем, кто соображает в веб.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Bloo
сообщение 22.1.2015, 16:02
Сообщение #15


Стаж: 10 лет

Сообщений: 15547
Благодарностей: 6971
Полезность: 1206

proff_q, да, все в веб делается, демона можно за основу взять HLX CE.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя shaid
сообщение 23.1.2015, 9:49
Сообщение #16


Стаж: 12 лет

Сообщений: 1012
Благодарностей: 432
Полезность: 835

Цитата(proff_q @ 22.1.2015, 16:18) *
shaid, Интересно, тогда как происходит авторизация игроков и проверка игроков на готовность?

logaddress_add как бы есть для удалённого чтения консоли
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя jasminem
сообщение 3.5.2015, 12:31
Сообщение #17


Стаж: 10 лет

Сообщений: 47
Благодарностей: 72
Полезность: 513

Поставил вчера данный плагин на beta 6153, поигрались с ребятками. Выявленные баги:

♦ Если игроков на сервере больше, чем заявлено кваром pl, то матч может не состояться (слотов больше, чем pl).
Пример: поставили pl=2, начали тестировать плагин с другом. В это время на сервер пришел игрок из поиска, все прописывали !r, матч не начинался.

♦ Под конец первой половины игры 5х5 (10 слотов) ливнул один игрок, по достижении 15 раундов все были переброшены за команду ct.
Поржали, перезапустили карту ;)

♦ Играли 5х5, команда сливалась, денег 0$, решил сделать реконнект для получения 800$. В итоге за своих теров зайти нельзя, автоматически кидает за кт. Получаем матч 6х4, переброс к сопернику и невозможность вернуться назад ;)
К слову, игрок из команды соперника тоже попробовал сделать реконнект и отныне он тоже был переброшен в команду соперника. Поржали, продолжили играть измененными составами ;)

amxx plugins

] rcon amxx plugins
Currently loaded plugins:
name version author file status
[ 1] Admin Base 1.8.2 AMXX Dev Team admin.amxx running
[ 2] Automix 5x5 1.0 proff_q mix5x5.amxx running
[ 3] Admin Commands 1.8.2 AMXX Dev Team admincmd.amxx running
[ 4] Slots Reservation 1.8.2 AMXX Dev Team adminslots.amxx running
[ 5] Menus Front-End 1.8.2 AMXX Dev Team menufront.amxx running
[ 6] Commands Menu 1.8.2 AMXX Dev Team cmdmenu.amxx running
[ 7] Players Menu 1.8.2 AMXX Dev Team plmenu.amxx running
[ 8] Maps Menu 1.8.2 AMXX Dev Team mapsmenu.amxx running
[ 9] Plugin Menu 1.8.2 AMXX Dev Team pluginmenu.amxx running
[ 10] Admin Chat 1.8.2 AMXX Dev Team adminchat.amxx running
[ 11] Anti Flood 1.8.2 AMXX Dev Team antiflood.amxx running
[ 12] Scrolling Message 1.8.2 AMXX Dev Team scrollmsg.amxx running
[ 13] Info. Messages 1.8.2 AMXX Dev Team imessage.amxx running
[ 14] Admin Votes 1.8.2 AMXX Dev Team adminvote.amxx running

[ 15] Pause Plugins 1.8.2 AMXX Dev Team pausecfg.amxx running
[ 16] Stats Configuration 1.8.2 AMXX Dev Team statscfg.amxx running
[ 17] Restrict Weapons 1.8.2 AMXX Dev Team restmenu.amxx running
17 plugins, 17 running


meta list
] rcon meta list
Currently loaded plugins:
description stat pend file vers src load unlod
[ 1] AMX Mod X RUN - amxmodx_mm.dll v1.8.2 ini Start ANY
[ 2] dproto_EF RUN - dproto.dll v0.9.548 ini Start Never
[ 3] VoiceTranscoder RUN - vtc.dll v80 ini ANY ANY
[ 4] WHBlocker RUN - whblocker.dll v1.5.370 ini Chlvl ANY
[ 5] LocalizeBug Fix RUN - localizebugfix.d v2.3 ini Start Never
[ 6] Fun RUN - fun_amxx.dll v1.8.2 pl1 ANY ANY
[ 7] FakeMeta RUN - fakemeta_amxx.dl v1.8.2 pl1 ANY ANY
[ 8] CStrike RUN - cstrike_amxx.dll v1.8.2 pl1 ANY ANY
[ 9] CSX RUN - csx_amxx.dll v1.8.2 pl1 ANY ANY
[10] Orpheu RUN - orpheu_amxx.dll v2.3 pl1 ANY ANY
[11] Ham Sandwich RUN - hamsandwich_amxx v1.8.2 pl1 ANY ANY
11 plugins, 11 running
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 9.12.2015, 21:46
Сообщение #18
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

Теоретический UPDATE:
- Исправлена проблема, когда игроков на сервере больше, чем pl. Теперь "зрителей" попросту не пустит на сервер. Пусть на HLTV сидят.
- Исправлена проблема с автоматической сменой команд.
- Исправлена проблема с реконнектом.
- Добавлена поддержка HLTV.

Все это в теории и без тестирования.

Скачать:Прикрепленный файл  mix.sma ( 13,2 килобайт ) Кол-во скачиваний: 92

==============================

Еще одна вещица, да здравствует быдлокод. Программа на C# которая проводит микс через rcon protocol. Описывать лень, ибо она в супер альфа версии и возможно продолжения не будет, но для ознакомления выкладываю. Работает только для одного сервера. Настройки в самой программе. Код супер плохой, ибо целью было изучить основы C#.

Внимание! Возможно данный код не работает вовсе. Не тестировалось в полной мере!
Код:
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

class main_class
{
int listening_port = 33333;
string hl_ip = "127.0.0.1";
int hl_port = 27015;
string hl_password = "ololo";

/**** CONSTANTES ****/
const int warmup = 0;
const int first_half = 1;
const int change_team = 2;
const int second_half = 3;

const int ct = 2;
const int tt = 1;

const bool not_ready = false;
const bool ready = true;

const int pl = 10;

readonly string[] warmups_cvars = { "mp_startmoney \"16000.0\"", "mp_freezetime \"0.0\"", "mp_buytime \"1.75\"", "mp_friendlyfire \"0.0\"", "mp_roundtime \"1.0\"", "mp_forcecamera \"2.0\"", "mp_forcechasecam \"2.0\"", "sv_restart \"3.0\"", "say \"** Warmup after restart!\"", "say \"** The game hasn't started! Warmup!\""};
readonly string[] halfs_cvars = { "mp_startmoney \"800.0\"", "mp_c4timer \"35.0\"", "mp_freezetime \"13.0\"", "mp_buytime \"0.25\"", "mp_friendlyfire \"1.0\"", "mp_roundtime \"1.75\"", "mp_forcecamera \"2.0\"", "mp_forcechasecam \"2.0\"", "sv_restart \"3.0\"", "say \"** The game will start after restart!\"", "say \"** Live! Live! Live! Good luck and Have fun!\""};

string[] players_name = new string[1024];
bool[] players_status = new bool[1024];
int[] players_userid = new int[1024];
string[] players_team = new string[1024];
int[] score = new int[3];
int game_status = 0;
int connected_players = 0;
int ready_players = 0;

public static void Main() {
byte[] data = new byte[1024];

main_class main = new main_class();
IPEndPoint ip_port = new IPEndPoint(IPAddress.Any, main.listening_port);
UdpClient new_socket = new UdpClient(ip_port);

Console.WriteLine("Waiting for a client...");

IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);

while (true) {
data = new_socket.Receive(ref sender);
string msg = Encoding.ASCII.GetString(data, 0, data.Length);

msg = main.log_type(msg); // gogogo
//data = Encoding.ASCII.GetBytes(main.parse_info(msg));

Console.WriteLine(msg);

new_socket.Send(data, data.Length, sender);
}
}

public string log_type(string text) {
string name = "", message = "";
int userid = 0;

main_class main = new main_class();

if(text.Contains("CTs_Win") || text.Contains("Bomb_Defused") || text.Contains("Target_Saved")) {
if (game_status == first_half || game_status == second_half) { score[ct]++; check_score(); } return message;
}
else if(text.Contains("Terrorists_Win") || text.Contains("Target_Bombed")) {
if(game_status == first_half || game_status == second_half) { score[tt]++; check_score(); } return message;
}

if(text.Contains("Rcon") || text.Contains("Server") || text.Contains("World") || text.Contains("Team")) return message;

name = text.Substring(text.IndexOf("\"") + 1, text.IndexOf("<") - text.IndexOf("\"") - 1);
userid = Convert.ToInt32(text.Substring(text.IndexOf("<") + 1, text.IndexOf(">") - text.IndexOf("<") - 1));

if(text.Contains("entered")) {
connected_players++;

players_name[userid] = name;
players_status[userid] = not_ready;

check_player(userid, name);
check_status();
}
else if(text.Contains("joined team")) {
if (text[text.IndexOf("joined team") + 13] == 'C') players_team[userid] = "CT";
else players_team[userid] = "TERRORIST";

Console.WriteLine("team azaza");
}
else if(text.Contains("disconnected") || text.Contains("was kicked")) {
players_name[userid] = "";
players_status[userid] = not_ready;

check_status();
}
else if(text.Contains("changed name")) {
players_name[userid] = name;
}
else if(text.Contains("say")) {
if(text[text.IndexOf("say") + 5] == '!') {
switch (text[text.IndexOf("say") + 6]) {
case 'r': {
if(!players_status[userid]) {
ready_players++;
players_status[userid] = ready;
}

message = String.Format("say \"** Player {0} ready to play!\"", players_name[userid]);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

check_status();

break;
}

case 'n': {
switch(game_status) {
case warmup: {
if(players_status[userid]) {
ready_players--;
players_status[userid] = not_ready;
}

message = String.Format("say \"** Player {0} unready to play!\"", players_name[userid]);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

check_status();

break;
}

case change_team: goto case warmup;
}

break;
}

case 's': {
switch(game_status) {
case warmup: { message = String.Format("** Game status: Warmup."); break; }
case change_team: { message = String.Format("** Game status: Team changing. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
case first_half: { message = String.Format("** Game status: First half. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
case second_half: { message = String.Format("** Game status: Second half. Counter-Terrorists {0} - {1} Terrorists.", score[ct], score[tt]); break; }
}

main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

break;
}
}
}
}

return message;
}

public static void check_player(int userid, string name) {
main_class main = new main_class();
string message = "";

if(main.connected_players > pl) {
message = String.Format("kick #{0} \"Server is full, you can't spectating.\"", userid);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

return;
}

switch(main.game_status) {
case first_half: {
if(!main.players_name.Contains(name)) {
message = String.Format("kick #%d \"You aren't playing in this match.\"", userid);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

return;
}

main.players_status[userid] = ready;
main.ready_players++;

message = String.Format("say \"Player {0} returned.\"", main.players_name[userid]);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

break;
}

case second_half: goto case first_half;
case change_team: goto case first_half;

case warmup: {
main.players_status[userid] = not_ready;

message = String.Format("say \"Type !r for ready and match will start.\"");
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);

break;
}
}
}

public static void check_status() {
main_class main = new main_class();
string message = "";

switch(main.game_status) {
case warmup: {
if(main.connected_players == pl && main.ready_players == pl) {}/*start_match();*/
else if(main.connected_players == pl && main.ready_players != pl) {
message = "say \"** Waiting for ready:";

for(int i = 0; i < main.players_status.Length; i++) {
if(!main.players_status[main.players_userid[i]]) {
message = String.Format("{0} {1}", message, main.players_name[main.players_userid[i]]);
}
}

message = String.Format("{0}\"", message);
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
}
else if(main.connected_players < pl) {
message = String.Format("say \"** Not enough players to start a game.\"");
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
}

break;
}

case change_team: goto case warmup;
}
}

public static void check_score() {
main_class main = new main_class();

if(main.score[ct] + main.score[tt] == 15) {
int a = main.score[tt];
main.score[tt] = main.score[ct];
main.score[ct] = a;

start_warmup(false);
main.ready_players = 0;
}
else if (main.score[ct] == 16) end_match(ct);
else if (main.score[tt] == 16) end_match(tt);
else if (main.score[tt] == 15 && main.score[ct] == 15) end_match(0);
}

// stocks
public static void start_warmup(bool num) {
main_class main = new main_class();

if(num) main.game_status = warmup;
else {
if(main.game_status == first_half) main.game_status = change_team;
else main.game_status = warmup;
}

for(int i = 0; i < main.warmups_cvars.Length; i++) {
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, main.warmups_cvars[i]);
}
}

public static void start_match() {
main_class main = new main_class();

if(main.game_status == warmup) main.game_status = first_half;
else if(main.game_status == change_team) main.game_status = second_half;

for (int i = 0; i < main.halfs_cvars.Length; i++) {
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, main.halfs_cvars[i]);
}
}

public static void end_match(int team) {
main_class main = new main_class();
string message = "";

switch(team) {
case tt: { message = String.Format("say \"** Terrorists win!\""); break; }
case ct: { message = String.Format("say \"** Counter-Terrorists win!\""); break; }
case 0: { message = String.Format("say \"** Draw!\""); break; }
}

for (int i = 0; i < 3; i++) {
main.sendRCON(main.hl_ip, main.hl_port, main.hl_password, message);
}

Array.Clear(main.players_status, 0, main.players_status.Length);
main.ready_players = 0;

start_warmup(true);
}

/* Credits to Waqas-Badar, http://www.codeproject.com/ */

public byte[] prepareCommand(string command) {
byte[] bufferTemp = Encoding.ASCII.GetBytes(command);
byte[] bufferSend = new byte[bufferTemp.Length + 4];

//intial 5 characters as per standard
bufferSend[0] = byte.Parse("255");
bufferSend[1] = byte.Parse("255");
bufferSend[2] = byte.Parse("255");
bufferSend[3] = byte.Parse("255");

//copying bytes from challenge rcon to send buffer
int j = 4;

for(int i = 0; i < bufferTemp.Length; i++) {
bufferSend[j++] = bufferTemp[i];
}

return bufferSend;
}

public string sendRCON(string serverIp, int serverPort, string rconPassword, string rconCommand)
{
main_class main = new main_class();
UdpClient client = new UdpClient();
client.Connect(serverIp, serverPort);

//sending challenge command to counter strike server
string getChallenge = "challenge rcon\n";
byte[] bufferSend = this.prepareCommand(getChallenge);

//send challenge command and get response
IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, main.listening_port);
client.Send(bufferSend, bufferSend.Length);
byte[] bufferRec = client.Receive(ref RemoteIpEndPoint);

//retrive number from challenge response
string challenge_rcon = Encoding.ASCII.GetString(bufferRec);
challenge_rcon = string.Join(null, Regex.Split(challenge_rcon, "[^\\d]"));

//preparing rcon command to send
string command = "rcon " + challenge_rcon + " \"" + rconPassword + "\" " + rconCommand + "\n";
bufferSend = this.prepareCommand(command);

client.Send(bufferSend, bufferSend.Length);
bufferRec = client.Receive(ref RemoteIpEndPoint);

return Encoding.UTF8.GetString(bufferRec);
}

/* Credits to Waqas-Badar, http://www.codeproject.com/ */
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя shram47
сообщение 11.12.2015, 7:41
Сообщение #19


Стаж: 8 лет 4 месяца
Город: Москва

Сообщений: 222
Благодарностей: 68
Полезность: 173

Компилируя выдаёт пару ошибочек.
Из-за этого пока и тестировать не сильно охота.
лог
Код:
Welcome to the AMX Mod X 1.8.1-300 Compiler.
Copyright © 1997-2006 ITB CompuPhase, AMX Mod X Team

Warning: Function "client_putinserver" should return a value on line 61
Warning: Function "client_disconnect" should return a value on line 81
Header size: 1276 bytes
Code size: 13176 bytes
Data size: 14028 bytes
Stack/heap size: 16384 bytes; max. usage is unknown, due to recursion
Total requirements: 44864 bytes

2 Warnings.
Done.
оффтоп
почему пишет 1.8.1-300 компилер, если он был 1.8.2? xD Дайте в лс компилятор 1.8.2


Отредактировал: shram47, - 11.12.2015, 7:43


Enough to hope for someone's help, I will do it myself and I will not ask anyone. I cope with children and can cope with amxx :thank_you:
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя proff_q
сообщение 11.12.2015, 10:13
Сообщение #20
Стаж: 12 лет

Сообщений: 357
Благодарностей: 263
Полезность: 804

shram47, Исправлено
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
2 страниц V   1 2
 
Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: