Вопрос по Pawn

Сообщения
63
Реакции
1
Всем кто помог спасибо, долго мучался, сорян, что столько сообщений, мне важно это понять, по этому я очень хочу выучить все это, так что сорян, тем кому принес неудобство, всем спасибо, я думаю в дальнейшем у меня получится самому разобраться, напоследок хотел бы спросить, тут все четко, кроме варнингов в турбулентности xD, нету ошибок, например на уровне алгоритма, которые не может вычислить программа?
C++:
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <cstrike>
#include <hamsandwich>
#include <colorchat>


#define GOLD ADMIN_LEVEL_B // флаг доступа для привилегии Gold n
#define PLATINUM ADMIN_PASSWORD // Флаг доступа для привилегии платинум k
#define LORD ADMIN_VOTE // флаг доступа для привилегии лорд j
#define RoundOpen 2  // каждые сколько раундом можно покупать бесшумный шаг, -1, если 2, значит 3 раунда, т.к счет идет с 0, [0],[1],[2]
#define MoneyShopG 1500 // сколько будет стоить для голд
#define MoneyShopP 1200 // сколько будет стоить для платинум
#define MoneyShopL 850 // сколько будет стоить для лорд


new RoundNum[33], NickName[32];

public plugin_init()
{
    register_plugin("TIXII BEX", "3.0", "TTox421");

    register_event("TextMsg",   "Event_RoundRestart",   "a",    "2&#Game_C",    "2&#Game_w");
    register_event("HLTV",      "Event_RoundStart",     "a",    "1=0",          "2=0");

    RegisterHam(Ham_Spawn, "player", "reset_foot", 1)

    register_clcmd("tixiibeg","foot_steps");

}

public Event_RoundRestart(id)
    RoundNum[id] = 0;

public Event_RoundStart(id)
    RoundNum[id]++;

public reset_foot(id)
    set_user_footsteps(id, 0);

public foot_steps(id)
{
    if(get_user_flags(id) & LORD)
    {
        if(RoundOpen < RoundNum[id])
        {
             if(cs_get_user_money(id) > MoneyShopL)
            {   
                 set_user_footsteps(id, 1);
                cs_set_user_money(id, cs_get_user_money(id) - MoneyShopL);
                RoundNum[id] = 0;
                get_user_name(id, NickName, 31);
                client_print_color(0, NORMAL, "[^4Lord^1] игрок^3 %s !y,взял бесшумный бег", NickName);
                return PLUGIN_HANDLED_MAIN;
            }
            else
            {
                client_print_color(id, Red, "Недостаточно средств");
                return PLUGIN_HANDLED_MAIN;
            }
        }
    }
    if(get_user_flags(id) & PLATINUM)
    {
        if(RoundOpen < RoundNum[id])
        {
             if(cs_get_user_money(id) > MoneyShopP)
            {   
                 set_user_footsteps(id, 1);
                cs_set_user_money(id, cs_get_user_money(id) - MoneyShopP);
                RoundNum[id] = 0;
                get_user_name(id, NickName, 31);
                client_print_color(0, NORMAL, "[^4Platinum ViP^1] игрок^3 %s ^1,взял бесшумный бег", NickName);
                return PLUGIN_HANDLED_MAIN;
            }
            else
            {
                client_print_color(id, Red, "Недостаточно средств");
                return PLUGIN_HANDLED_MAIN;
            }
        }
    }
    if(get_user_flags(id) & GOLD)
    {
        if(RoundOpen < RoundNum[id])
        {
             if(cs_get_user_money(id) > MoneyShopG)
            {   
                 set_user_footsteps(id, 1);
                cs_set_user_money(id, cs_get_user_money(id) - MoneyShopG);
                RoundNum[id] = 0;
                get_user_name(id, NickName, 31);
                client_print_color(0, NORMAL, "[^4Gold ViP^1] игрок^3 %s ^1,взял бесшумный бег", NickName);
                return PLUGIN_HANDLED_MAIN;
            }
            else
            {
                client_print_color(id, Red, "Недостаточно средств");
                return PLUGIN_HANDLED_MAIN;
            }
        }
    }
    else
    {
        client_print_color(id, NORMAL, "Недостаточно прав, для использования данной команды");
        return PLUGIN_HANDLED_MAIN;
    }

    return PLUGIN_HANDLED_MAIN;
}
 

Ayk

Сообщения
763
Реакции
476
Помог
19 раз(а)
напоследок хотел бы спросить, тут все четко, кроме варнингов в турбулентности xD, нету ошибок, например на уровне алгоритма, которые не может вычислить программа?
И какой ответ ты ожидаешь?
Программирование/скриптинг это:
1. Пишешь
2. Компилишь
3. Тестишь
4. Исправляешь
5. Повторяешь 1-4 до победного
 
Сообщения
63
Реакции
1
Ayk, Дак я так и делаю, я щас сидел, 20 раз переписывал код, я не знал как сразу всем элементам массива присваивать каждый раунд +1, без RoundNum[id], потому что на евент round_start, почему то не работает (id), тупо не прибавляет +1, потом я просто использовал хук возрождения который обнуляет бесшумный шаг
17 Апр 2020
Jumper, 1 9 0
17 Апр 2020
Ayk, Когда я спросил по поводу ошибок алгоритма, я имел ввиду если как то можно сокращать код, что бы результат был тот же, но более меньше затрат.
 
Сообщения
285
Реакции
251
Помог
7 раз(а)
TTox421, тогда половину магии можно заменить в коде.
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
TTox421,
Код:
if(get_user_flags(id) & LORD)
else if(get_user_flags(id) & PLATINUM)
else if(get_user_flags(id) & GOLD)
else
И можно return'ы в ифах поубирать.
 
Сообщения
225
Реакции
90
Помог
1 раз(а)
TTox421,
C++:
get_user_name(id, NickName, charsmax(NickName));
Вообще для ыканомеи букаф можно повторяющиеся строки покупки в функцию вынести.
 
Сообщения
285
Реакции
251
Помог
7 раз(а)
C++:
#include <amxmodx>
#include <fun>
#include <cstrike>
#include <hamsandwich>


#define GOLD ADMIN_LEVEL_B // флаг доступа дл¤ привилегии Gold n
#define PLATINUM ADMIN_PASSWORD // ‘лаг доступа дл¤ привилегии платинум k
#define LORD ADMIN_VOTE // флаг доступа дл¤ привилегии лорд j
#define RoundOpen 2  // каждые сколько раундом можно покупать бесшумный шаг, -1, если 2, значит 3 раунда, т.к счет идет с 0, [0],[1],[2]
#define MoneyShopG 1500 // сколько будет стоить дл¤ голд
#define MoneyShopP 1200 // сколько будет стоить дл¤ платинум
#define MoneyShopL 850 // сколько будет стоить дл¤ лорд


new RoundNum[MAX_PLAYERS+1], NickName[MAX_NAME_LENGTH];

public plugin_init() {
    register_plugin("TIXII BEX", "3.0", "TTox421");

    register_event("TextMsg",   "Event_RoundRestart",   "a",    "2&#Game_C",    "2&#Game_w");
    register_event("HLTV",      "Event_RoundStart",     "a",    "1=0",          "2=0");

    RegisterHam(Ham_Spawn, "player", "reset_foot", 1)

    register_clcmd("tixiibeg","foot_steps");
}

public Event_RoundRestart(id) {
    arrayset(RoundNum, 0, sizeof(RoundNum));
}

public Event_RoundStart(id) {
    RoundNum[id]++;
}

public reset_foot(id) {
    set_user_footsteps(id, 0);
}

public client_disconnected(id){
    RoundNum[id] = 0;
    set_user_footsteps(id, 0);
}

public foot_steps(id) {
    if(get_user_flags(id) & LORD) {
        BuyFootSteps(id, MoneyShopL, "Lord")
    }
    else if(get_user_flags(id) & PLATINUM) {
        BuyFootSteps(id, MoneyShopP, "Platinum ViP")
    }
    else if(get_user_flags(id) & GOLD) {
        BuyFootSteps(id, MoneyShopG, "Gold ViP")
    }
    else {
        client_print_color(id, print_team_red, "^3Недостаточно прав, для использования данной команды!");
        return PLUGIN_HANDLED;
    }

    return PLUGIN_CONTINUE;
}

BuyFootSteps(id, money, prefix[]) {
    if(RoundOpen < RoundNum[id]) {
        if(cs_get_user_money(id) > money) {
            set_user_footsteps(id, 1);
            cs_set_user_money(id, cs_get_user_money(id) - money);
            RoundNum[id] = 0;
            client_print_color(0, id, "[^4%s^1] игрок^3 %n ^1, взял бесшумный бег", prefix, id);
        }
        else {
            client_print_color(id, print_team_red, "^3Недостаточно средств!");
            return PLUGIN_HANDLED;
        }
    }
}
 
Сообщения
63
Реакции
1
Jumper, Спасибо за такую оптимизацию, я только не понимаю, как программа узнает сколько это
MAX_PLAYERS, или это изначально где то вбито типо?
Тоже самое с MAX_NAME_LENGTH
А так же когда я пробовал так сделать, почему то у меня в Функцию которая у вас называется Event_RoundStart не хотело идти значение (id), и выдавало 1 раунд всем вместе, а когда я тестил через функцию обнуление
reset_round(id){
RoundNum[id] = 0
}
Оно либо забирало все раунды у всех, либо обнуляла только на 1 раунд, а на след раунд опять 4 раунд например
 
Сообщения
443
Реакции
319
Помог
13 раз(а)
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
MAX_PLAYERS, или это изначально где то вбито типо?
в инклудах amx, в частности посмотри amxconst.inc, там есть немного констант уже, MAX_PLAYERS равен 32, как и MAX_NAME_LENGTH

Код:
/**
* Internal AMXX buffer size for string retrieval.
*
* @note This is the buffer size AMX Mod X uses internally to retrieve strings
*       from plugins. Most natives that take strings as arguments will
*       implicitly truncate them to this maximum length. This has been raised
*       to the current value with AMXX 1.8.3. Previously the limit was 3072.
* @note This is here mainly for documentation purposes. By default plugins
*       don't have enough memory available to allocate an array of this size.
*       You probably should not use this to actually declare a buffer unless
*       you *absolutely* have to. Look at #pragma dynamic to increase a plugins
*       available memory.
*/
#define MAX_STRING_LENGTH 16384

/**
* Defines and constants related to the maximum number of clients.
*
* @note  MAX_PLAYERS is not the same as MaxClients. MAX_PLAYERS is a hardcoded
*        value as an upper limit, used mainly to declare arrays big enough for
*        all possible server situations. MaxClients changes based on the
*        server the plugin is deployed on..
*/
#define MAX_PLAYERS 32 /* Maximum number of players AMX Mod X supports */

/**
* Maximum number of players the server supports
*/
public stock const MaxClients;

/**
* Pass this into certain functions to act as a C++ NULL
*/
public stock const NULL_STRING[1];

/**
* Pass this into certain functions to act as a C++ NULL
*/
public stock const Float:NULL_VECTOR[3];

/**
* The maximum buffer size required to store a client's name.
*/
#define MAX_NAME_LENGTH 32

/**
* The maximum buffer size required to store a client's IP address without a port.
*/
#define MAX_IP_LENGTH 16

/**
* The maximum buffer size required to store a client's IP address with a port.
*/
#define MAX_IP_WITH_PORT_LENGTH 22

/**
* The maximum buffer size required to store a client's AuthID.
*/
#define MAX_AUTHID_LENGTH 64

/**
* The maximum buffer size required to store a resource path.
*/
#define MAX_RESOURCE_PATH_LENGTH 64

/**
* The maximum buffer size that can be displayed in a MOTD.
*/
#define MAX_MOTD_LENGTH 1536

/**
* The maximum size accepted by the user info buffer.
*/
#define MAX_USER_INFO_LENGTH 256

/**
* The maximum buffer size that can be displayed in a menu.
*/
#define MAX_MENU_LENGTH 512

/**
* π
*/
#define M_PI 3.1415926535
 
Сообщения
63
Реакции
1
Shel, Спасибо
18 Апр 2020
Shel, У меня так же записано, но все равно когда я ввожу так

Event_RoundStart(id)
RoundNum[id]++

потом создаю функцию которая выводит в чат

public round(id)
client_print_color(id,Red,"Сейчас %i раунд", RoundNum[id])
И пишет каждый раз раунд 0, я столько раз пробовал разные варианты и получалось только если хук спавна игрока регистрировать
18 Апр 2020
Javekson, Спасибо
18 Апр 2020
C#:
/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <colorchat>

#define PLUGIN "TestNaWarning"
#define VERSION "1.0"
#define AUTHOR "TTox421"
 
new RoundNum[33];

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)

    register_event("TextMsg",   "Event_RoundRestart",   "a",    "2&#Game_C",    "2&#Game_w");
    register_event("HLTV",      "Event_RoundStart",     "a",    "1=0",          "2=0");
    register_clcmd("obnulenie","testcmd");
    register_clcmd("roundme","round");
}

public Event_RoundRestart(id)
        RoundNum[id] = 0;


public Event_RoundStart(id)
    RoundNum[id]++;

public testcmd(id){
    RoundNum[id] = 0;
    client_print_color(id,Red,"Сейчас %i раунд", RoundNum[id]);
}

public round(id)
    client_print_color(id,Red,"Сейчас %i раунд", RoundNum[id])
18 Апр 2020
Наверное из за этого?
 
Сообщения
1,017
Реакции
819
Помог
10 раз(а)
TTox421, я в этих эвентах не шарю, обычно заменяю их на ReAPI =D но, если я правильно понимаю его, то в public Event_RoundRestart(id) тебе всегда будет передаваться 0, поэтому аргумент id можно убрать вообще, и для получение игроков делать цикл,
get_players, думаю так )
18 Апр 2020
TTox421, хотя проще можно, но лучше проверь, ссылка event HLTV посмотри внимательно, в нем 2 аргумента, ClientID и Flags, первый это скорее всего наш ID игрока который нужен нам, поэтому регистрацию эвента меняем

register_event("HLTV", "Event_RoundStart", "a", "1>0");

a - глобальное событие, 1>0 значит первый агрумент ClientID должен быть больше 0, ибо 0 айди это айди самого сервере, если память не изменяет, а не игрока, а нам нужны только игроки, поэтому ставим ClientID > 0, что за второй аргумент Flags - хз )

затем в паблик функии

public Event_RoundStart( )
{
получаем первый аргумент, то есть айди игрока

new id = read_data(1)

затем плюсуем ему раунд

RoundNum[id]++;
}
18 Апр 2020
TTox421, итого event HLTV у тебя сработает столько раз, сколько игроков присутствует на сервере, то есть на каждого id игрока
 
Последнее редактирование:
Сообщения
63
Реакции
1
Javekson, Ага понял твою логику, кстати спасибо что объяснил как работает 1=0 и 2=0, а то я читал что они передаю инфу аргументам, но никак не мог понять каким именно аргументам.
Можешь скинуть где можно по подробнее почитать про ReApi
18 Апр 2020
Javekson, Кстати я прочел более 3 статей про read_data(1,2,3,4,5....) и нихера не понял, типо они записывают какое то игровое событие, но как понять какое именно?
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
@TTox421, я в этих эвентах не шарю, обычно заменяю их на ReAPI =D но, если я правильно понимаю его, то в public Event_RoundRestart(id) тебе всегда будет передаваться 0, поэтому аргумент id можно убрать вообще, и для получение игроков делать цикл,
get_players, думаю так )
Все верно

@TTox421, хотя проще можно, но лучше проверь, ссылка event HLTV посмотри внимательно, в нем 2 аргумента, ClientID и Flags, первый это скорее всего наш ID игрока который нужен нам, поэтому регистрацию эвента меняем
В данном случае они будут 0 и 0. Мы ведь сами указали в фильтре ивента

@TTox421, итого event HLTV у тебя сработает столько раз, сколько игроков присутствует на сервере, то есть на каждого id игрока
Вот тут ошибся. Самый первый твой вариант с циклом был верный
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу