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

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

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

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

Сформулировать условие для поднятия дропнутого оружия

Статус пользователя filip
сообщение 21.10.2014, 21:40
Сообщение #1


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Ребят, помогите разобраться и поправить ошибки. Есть нестандартное оружие. Стоит IPB Presents.
Чего хочу?
1. Дропнутое оружие могут поднимать випы (ADMIN_LEVEL_H) свободно.
2. Дропнутое оружие могут поднимать обычные игроки, но с ограничениями:
- игрок авторизован на сервере Код:
ipb_data[id][active]

- игрок имеет 50 постов на форуме Код:
(ipb_data[id][posts] < 50)

- игрок последний раз посещал форум в течение 24 часов Код:
(ipb_data[id][last_visit] + 86400 > get_systime())


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

Что я там не так сделал?
И как добиться того, что бы при касании оружия сообщение выводилось только один раз.
Буду благодарен за подсказки.

Код:

RegisterHam(Ham_Touch, "armoury_entity", "fwdTouch") //регистрируем соприкосновение с оружием (в руках)
RegisterHam(Ham_Touch, "weaponbox", "fwdTouch") //регистрируем соприкосновение с оружием, лежащим на земле (дропнули или убили игрока и оно выпало)

public fwdTouch(ent, id) {
//проверка жив ли игрок
if(!is_user_alive(id))
return HAM_IGNORED;
if(!(get_user_flags(id) & ADMIN_LEVEL_H)){
new modelname[32]; //переменная для имени модели
entity_get_string(ent, EV_SZ_model, modelname, 31); // получаем название модели

if((equali(modelname, "models/zm/w_trg42g.mdl")) && !(ipb_data[id][active])) //условие на проверку: если модель такая-то и игрок не зареган на форуме
return HAM_SUPERCEDE;
//Выводим сообщение о блокировке
//PrintChatColor(id, _, "!yВы не авторизованы на сервере, !gоружие не доступно)");

else if((equali(modelname, "models/zm/w_trg42g.mdl")) && (ipb_data[id][posts] < 50) && (ipb_data[id][active])) //условие на проверку: если модель такая-то и игрок не имеет 50 постов на форуме
return HAM_SUPERCEDE;
//Выводим сообщение о блокировке
//PrintChatColor(id, _, "!yНужно 50 сообщений на форуме, !gоружие не доступно)");

else if(equali(modelname, "models/zm/w_trg42g.mdl") && (ipb_data[id][active]) && (ipb_data[id][last_visit] + 86400 > get_systime())) //условие на проверку: если модель такая-то и игрок сутки не заходил на форум
return HAM_SUPERCEDE;
//Выводим сообщение о блоикровке
//PrintChatColor(id, _, "!yВы не были на форуме 24 часа, !gоружие недоступно)");
}
return HAM_HANDLED;
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Fintok
сообщение 21.10.2014, 23:14
Сообщение #2


Стаж: 16 лет

Сообщений: 756
Благодарностей: 294
Полезность: 638

filip,если я правильно понял, то вот так должно быть
Код:
RegisterHam(Ham_Touch, "armoury_entity", "fwdTouch")
RegisterHam(Ham_Touch, "weaponbox", "fwdTouch")

public fwdTouch(ent, id)
{
if(!pev_valid(ent) || !is_user_alive(id) || get_user_flags(id) & ADMIN_LEVEL_H)
return HAM_IGNORED;

new modelname[32];
entity_get_string(ent, EV_SZ_model, modelname, 31);

if(equal(modelname, "models/zm/w_trg42g.mdl"))
{
if(!ipb_data[id][active]))
{
PrintChatColor(id, _, "!yВы не авторизованы на сервере, !gоружие не доступно");
return HAM_SUPERCEDE;
}
else if(ipb_data[id][posts] < 50)
{
PrintChatColor(id, _, "!yНужно 50 сообщений на форуме, !gоружие не доступно");
return HAM_SUPERCEDE;
}
else if(ipb_data[id][last_visit] + 86400 > get_systime())
{
PrintChatColor(id, _, "!yВы не были на форуме 24 часа, !gоружие недоступно");
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED;
}

Мб что то не так написал, пишу с планшета
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Safety1st
сообщение 22.10.2014, 1:43
Сообщение #3
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Добавил 'блокировку' месседжей. Однократно - не самая лучшая идея, главное - чтобы спама не было.
Инклуд 'WPMG Print Chat Color' в официальном топике уже отсутствует; скинь в ЛС на всякий случай. Сделал с другим и вообще советую везде его использовать, линк указан в sma. print_team_red означает, что после тэгов ^3 или !t (тим-цвет) всегда будет использоваться красный цвет.

Код
Код
/**
*    Created by Safety1st
*
*    Credits:
*    - Fintok for prototype
*/

#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>

/*------------------ EDIT ME ------------------*/
#define SUPER_VIP_FLAG        ADMIN_LEVEL_H    // flag 't' by default
const MIN_MESSAGES            = 50
const MAX_LAST_VISIT        = 86400     // 1 day

const BLOCK_MSG_DELAY        = 1 // delay to prevent multiple messages when touching
#define MAX_CLIENTS            32
/*------ NOTHING TO EDIT BELOW THIS POINT ------*/

#if defined USE_COLOR_CHAT
    #if AMXX_VERSION_NUM < 183     // AMXX 1.8.3 since hg185 has its own colorchat support
        #include <colorchat>    // use modified by Lev ONLY http://aghl.ru/forum/viewtopic.php?p=21539#p21539
        #define print_team_default  DontChange
        #define print_team_grey     Grey
        #define print_team_red      Red
        #define print_team_blue     Blue
    #endif
#endif

new giLastBlockMsg[MAX_CLIENTS + 1]

// dummy variables to check compilation
enum _:dummy { active, posts, last_visit }
new ipb_data[MAX_CLIENTS + 1][dummy]

public plugin_init() {
    // ...

    RegisterHam( Ham_Touch, "armoury_entity", "Ham_Touch_Pre" )
    RegisterHam( Ham_Touch, "weaponbox", "Ham_Touch_Pre" )
}

public Ham_Touch_Pre( ent, id ) {
    enum _:Types {
        BLOCK_NONE,
        BLOCK_NOAUTH,
        BLOCK_MINMSG,
        BLOCK_LASTVISIT
    }

    static szBlockMsg[Types][] = {
        "",     // placeholder
        "^1Вы не авторизованы на сервере, ^4оружие недоступно",
        "^1Нужно 50 сообщений на форуме, ^4оружие недоступно",
        "^1Вы не были на форуме 24 часа, ^4оружие недоступно"
    }

    static szModel[32], szTargetModel[] = "models/zm/w_trg42g.mdl"

    if( !is_valid_ent(ent) || !is_user_alive(id) || get_user_flags(id) & SUPER_VIP_FLAG )
        return HAM_IGNORED

    entity_get_string( ent, EV_SZ_model, szModel, charsmax(szModel) )

    if( strcmp( szModel, szTargetModel ) )
        // other model
        return HAM_IGNORED

    new iBlock = BLOCK_NONE
    new iTime = get_systime()

    if( !ipb_data[id][active] )
        iBlock = BLOCK_NOAUTH
    else if( ipb_data[id][posts] < MIN_MESSAGES )
        iBlock = BLOCK_MINMSG
    else if( iTime - ipb_data[id][last_visit] > MAX_LAST_VISIT )
        iBlock = BLOCK_LASTVISIT

    if( iBlock != BLOCK_NONE ) {
        if( iTime - giLastBlockMsg[id] >= BLOCK_MSG_DELAY ) {
            client_print_color( id, print_team_red, szBlockMsg[iBlock] )
            giLastBlockMsg[id] = iTime
        }
        return HAM_SUPERCEDE
    }

    return HAM_IGNORED
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 22.10.2014, 8:14
Сообщение #4


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Fintok, спасибо, все оказалось проще)
Safety1st BooM.gif я явно переоценил свои силы, когда подумал, что мне под силу реализовать задуманное) Спасибо, буду разбираться дальше, теперь в твоем коде).
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя filip
сообщение 22.10.2014, 16:10
Сообщение #5


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Вышел из положения) Safety1st, ваш код так и не получилось интегрировать в плагин, я в очень многом не разобрался и в результате погряз в ошибках при компилляции(

Fintok, еще раз спасибо за правки, я в ваш алгоритм добавил 'блокировку' месседжей by Safety1st. Попутно еще выпилил проверку на последний визит на форум, проверки на количество постов достаточно. Проверил - работает!!!! yahoo.gif

Вот что вышло, возможно кому-то пригодится. Спасибо огромное, ребят. Я хоть и не сам сделал, но то чувство, которое испытываешь, когда что-то непонятное для тебя заработало просто офигенно) Это как в детстве собрать старый разобранный мопед и завести его)
Код:

const BLOCK_MSG_DELAY = 1 // delay to prevent multiple messages when touching

new giLastBlockMsg[33]
new giLastBlockMsg[33]


public fwdTouch(ent, id)
{
enum _:Types {
BLOCK_NONE,
BLOCK_NOAUTH,
BLOCK_MINMSG,
BLOCK_LASTVISIT
}

static szBlockMsg[Types][] = {
"", // placeholder
"^1Вы не авторизованы на сервере, ^4оружие недоступно",
"^1Нужно 50 сообщений на форуме, ^4оружие недоступно",
"^1Вы не были на форуме 24 часа, ^4оружие недоступно"
}

if(!pev_valid(ent) || !is_user_alive(id) || get_user_flags(id) & ADMIN_LEVEL_H)
return HAM_IGNORED;

new modelname[32];
entity_get_string(ent, EV_SZ_model, modelname, 31);

if(equal(modelname, "models/zm/w_trg42g.mdl"))
{
new iBlock = BLOCK_NONE
new iTime = get_systime()

if(!(ipb_data[id][active]))
{
iBlock = BLOCK_NOAUTH
}
else if(ipb_data[id][posts] < 50)
{
iBlock = BLOCK_MINMSG
}
if( iBlock != BLOCK_NONE ) {
if( iTime - giLastBlockMsg[id] >= BLOCK_MSG_DELAY ) {
PrintChatColor(id, _, szBlockMsg[iBlock]);
giLastBlockMsg[id] = iTime
}
return HAM_SUPERCEDE
}
}
return HAM_IGNORED;
}

Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 2 раз
   + Цитировать сообщение
Safety1st
сообщение 22.10.2014, 16:55
Сообщение #6
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(filip @ 22.10.2014, 18:10) *
Попутно еще выпилил проверку на последний визит на форум

Тогда можно удалить строки BLOCK_LASTVISIT и "^1Вы не были на форуме 24 часа, ^4оружие недоступно" и лишние запятые smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 22.10.2014, 18:03
Сообщение #7


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

мда....
алгоритм оставляет желать лучшего

не проще один раз проверить при коннекте игрока к серверу? либо при старте раунды и т.п. , что бы уменьшить кол-во проверок...
и потом использовать эти данные...


Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 22.10.2014, 18:14
Сообщение #8
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Ну так-то да. Для начала пойдёт smile.gif
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 23.10.2014, 15:15
Сообщение #9


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Цитата(Legenda @ 22.10.2014, 19:03) *
мда....
алгоритм оставляет желать лучшего

не проще один раз проверить при коннекте игрока к серверу? либо при старте раунды и т.п. , что бы уменьшить кол-во проверок...
и потом использовать эти данные...

idea_1.gif
Код:
const BLOCK_MSG_DELAY        = 1 // delay to prevent multiple messages when touching

new giLastBlockMsg[33]
new giLastBlockMsg[33]
new bool gBLOCK_NOAUTH[33] = true
new bool gBLOCK_MINMSG[33] = true



client_putinserver(id) //проверяем при коннекте
{
new modelname[32];
entity_get_string(ent, EV_SZ_model, modelname, 31);

if(equal(modelname, "models/zm/w_trg42g.mdl")){
if(!(ipb_data[id][active]))
gBLOCK_NOAUTH[id] = false

else if(ipb_data[id][posts] < 50)
gBLOCK_MINMSG[id] = false
}
}
public fwdTouch(ent, id)
{
enum _:Types {
BLOCK_NONE,
BLOCK_NOAUTH,
BLOCK_MINMSG
}

static szBlockMsg[Types][] = {
"", // placeholder
"^1Вы не авторизованы на сервере, ^4оружие недоступно",
"^1Нужно 50 сообщений на форуме, ^4оружие недоступно"
}

if(!pev_valid(ent) || !is_user_alive(id) || get_user_flags(id) & ADMIN_LEVEL_H)
return HAM_IGNORED;


new iBlock = BLOCK_NONE
new iTime = get_systime()

if (!gBLOCK_NOAUTH[id])
{
iBlock = BLOCK_NOAUTH
}
else if(!gBLOCK_MINMSG[id])
{
iBlock = BLOCK_MINMSG
}
if( iBlock != BLOCK_NONE ) {
if( iTime - giLastBlockMsg[id] >= BLOCK_MSG_DELAY ) {
PrintChatColor(id, _, szBlockMsg[iBlock]);
giLastBlockMsg[id] = iTime
}
return HAM_SUPERCEDE
}
}
return HAM_IGNORED;
}


а что подразумевается под проверками? конструкции, содержащие условие if? тогда их стало больше)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 23.10.2014, 15:29
Сообщение #10


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

любой плагин можно оптимизировать
твой плагин - можно очень сильно оптимизировать, плагин будет работать быстрее и создавать меньшую нагрузку на процессор и память

Цитата
а что подразумевается под проверками? конструкции, содержащие условие if? тогда их стало больше)

под проверками понимать кол-во происходящих циклов проверок за один раунд при прочих равных

Код:
client_putinserver(id) //проверяем при коннекте
{
new modelname[32];
entity_get_string(ent, EV_SZ_model, modelname, 31);

if(equal(modelname, "models/zm/w_trg42g.mdl")){

так делать нельзя, не понятно что такое ent



Код:

enum _:Types {
BLOCK_NONE,
BLOCK_NOAUTH,
BLOCK_MINMSG
}

static szBlockMsg[Types][] = {
"", // placeholder
"^1Вы не авторизованы на сервере, ^4оружие недоступно",
"^1Нужно 50 сообщений на форуме, ^4оружие недоступно"
}

можно вынести вне функции

get_user_flags(id) & ADMIN_LEVEL_H

можно вынести в клиент_путинсервер


Код:

new bool gBLOCK_NOAUTH[33] = true
new bool gBLOCK_MINMSG[33] = true


new iBlock = BLOCK_NONE


if (!gBLOCK_NOAUTH[id])
{
iBlock = BLOCK_NOAUTH
}
else if(!gBLOCK_MINMSG[id])
{
iBlock = BLOCK_MINMSG
}
if( iBlock != BLOCK_NONE )

извращение, стоит поучится работать с массивами

для начала стоит продумать алгоритм работы плагина, потом подумать как и где хранить различные данные необходимые для работы
для пример можно создать массив, которые будет содержать id игрока и его статус 1/2/3/4
статус например может быть 1..3
где 1 - игрока авторизован и имеет доступ
2 - игрок не авторизован
3 - игрок не имеет 50 сообщений
тогда от извращения можно избавится и уменьшить кол-во проверок

и т.д.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Safety1st
сообщение 23.10.2014, 17:21
Сообщение #11
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Другими словами, проверки, относящиеся к игроку, можно сделать однократными, выполнять в client_putinserver() и присваивать статус игроку, а в функции проверки на touch уже только на него 'смотреть'. Статус хранится в отдельном массиве giBlockType[33]. Проверку флагов я бы оставил, где она сейчас)

И ещё момент:
Код
new bool bla[33] = true
->
Код
new bool:bla[33]
Это на будущее, как тэги переменным назначаются. ' = true' норм для инициализации одной переменной, с массивами надо иначе и крайне редко приходится.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 25.10.2014, 10:55
Сообщение #12


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

Вроде бы заработало). Теперь мой мопед жрет в 2 раза меньше бензина?
Код:
forward ipb_core(id, MemberID, const Name[], Posts, Topics, const Status[], LastVisit)

enum ipb_profile {
active,
member_id,
name[64],
posts,
topics,
status[64],
last_visit
}
new ipb_data[33][ipb_profile]

/*НАЧАЛО массив для предотвращения спама в чат*/
enum _:Types {
BLOCK_NONE,
BLOCK_NOAUTH,
BLOCK_MINMSG
}
static szBlockMsg[Types][] = {
"", // placeholder
"^1Вы не авторизованы на сервере, ^4оружие недоступно",
"^1Нужно 50 сообщений на форуме, ^4оружие недоступно"
}
/*КОНЕЦ массив для предотвращения спама в чат*/

new giLastBlockMsg[33]
new giBlockType[33] = BLOCK_NONE

public plugin_init() {
register_plugin("test", "0.1", "AUTHOR")
RegisterHam( Ham_Touch, "armoury_entity", "fwdTouch" )
RegisterHam( Ham_Touch, "weaponbox", "fwdTouch" )
}

public ipb_core(id, MemberID, const Name[], Posts, Topics, const Status[], LastVisit)
{
if(is_user_connected(id) && MemberID != 0)
{
ipb_data[id][active] = true
ipb_data[id][member_id] = MemberID
ipb_data[id][posts] = Posts
ipb_data[id][topics] = Topics
copy(ipb_data[id][status], 63, Status)
ipb_data[id][last_visit] = LastVisit
copy(ipb_data[id][name], 63, Name)
}
}

public client_putinserver(id){

set_task(0.3, "CheckUser", id);
}

public CheckUser(id){
if(!ipb_data[id][active]){
giBlockType[id] = BLOCK_NOAUTH
}
else if(ipb_data[id][posts] < 50){
giBlockType[id] = BLOCK_MINMSG
}
return PLUGIN_HANDLED
}

public fwdTouch(ent, id){

if(!pev_valid(ent) || !is_user_alive(id) || (get_user_flags(id) & ADMIN_LEVEL_H))
return HAM_IGNORED

new modelname[32]
entity_get_string(ent, EV_SZ_model, modelname, 31)
if(equal(modelname, "models/zm/w_trg42g.mdl"))
{
if( giBlockType[id] != BLOCK_NONE ) {
if( get_systime() - giLastBlockMsg[id] >= 1) {
PrintChatColor(id, _, szBlockMsg[giBlockType[id]])
giLastBlockMsg[id] = get_systime()
}
return HAM_SUPERCEDE
}
}
return HAM_IGNORED
}

И если проверку на флаг юзера вынести в путинсервер, то випам оружие недоступно.

Отредактировал: filip, - 25.10.2014, 10:55
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 25.10.2014, 11:11
Сообщение #13
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

В основном всё верно. Пару нюансов я тебе вечером подправлю)
Когда срабатывает форвард ipb_core ?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 25.10.2014, 11:24
Сообщение #14


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

вот с форвардом я не разобрался, он создается в основном плагине
Код:
public plugin_init()
{
register_plugin("IPB_System_Core", "0.1", "Stolen");

forward_ipb = CreateMultiForward("ipb_core", ET_CONTINUE, FP_CELL, FP_CELL, FP_STRING, FP_CELL, FP_CELL, FP_STRING, FP_CELL);
}


Там же приведен пример плагина подарков, я просто взял тот код и вставил его в свой плагин (часть его приведена в посте выше).
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 25.10.2014, 14:45
Сообщение #15


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

Код
public client_putinserver(id){

   set_task(0.3, "CheckUser", id);
}
public CheckUser(id){

так делать нельзя


public client_putinserver(id) - это id игрока
set_task(0.3, "CheckUser", id); - это id таймера
public CheckUser(id){ - это id таймера

id игрока и id таймера совпадают, это не правильно
хотя и работает
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя filip
сообщение 25.10.2014, 16:13
Сообщение #16


Стаж: 13 лет

Сообщений: 418
Благодарностей: 332
Полезность: 779

А как тогда поступить?
Код:
public client_putinserver(id){

set_task(0.3, "CheckUser", TaskId);
}

public CheckUser(TaskId){

Это не поможет, даже мне понятно
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Legenda
сообщение 25.10.2014, 16:24
Сообщение #17


Иконка группы

Стаж: 16 лет

Сообщений: 3619
Благодарностей: 1706
Полезность: 1010

Меценат Меценат

для начало стоит прочитать описание функции
http://amxxmodx.ru/core/amxmodxinc/70-set_...moe-vremya.html
обратить внимание на

Цитата
id = 0 - Уникальный идентификатор к задаче. ( если у вас одновременно запущенно их 10, что бы с каждым можно было работать отдельно и ни чего не спуталось)
parameter[]="" - Массив с данными, который передается функции.
len = 0 - Максимальная длина передаваемого массива

можно поискать другие плагины с set_task и посмотреть как правильно делать)
так то надо в parameter передавать pid игрока, а в id - номер задачи
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 25.10.2014, 16:40
Сообщение #18
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Ну нет, присваивать задаче id, совпадающий с индексом игрока - нормальная практика.
По остальному позже напишу)
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Safety1st
сообщение 25.10.2014, 21:07
Сообщение #19
Стаж: 14 лет
Город: Moscow

Сообщений: 7228
Благодарностей: 8071
Полезность: 196

Цитата(filip @ 25.10.2014, 12:55) *
Вроде бы заработало). Теперь мой мопед жрет в 2 раза меньше бензина?

Ещё меньше, чем в 2 раза good.gif

Цитата(filip @ 25.10.2014, 12:55) *
И если проверку на флаг юзера вынести в путинсервер, то випам оружие недоступно.

Вот-вот, не всегда проверкой в putinserver можно обойтись.

Цитата(filip @ 25.10.2014, 12:55) *
Код
new giBlockType[33] = BLOCK_NONE

Выше писал, что массивам стартовые значения по-иному назначаются. Но тебе всё равно назначать что-то не требуется.

Цитата(filip @ 25.10.2014, 12:55) *
Код
set_task(0.3, "CheckUser", id)
Таски при проверках используют, когда либо не знают как, либо нет возможности определить точный момент, когда уже можно выполнять свою функцию. В данном случае всё известно: код должен выполниться не ранее выполнения форварда ipb_core (ведь мы как раз его данные обрабатываем). Форвард вызывается из основного плагина 'IPB_System_Core', там всё норм: вызывается для всех игроков и позже, чем client_putinserver (потому нет необходимости самому предварительно сбрасывать значения массива для новых игроков в твоём плагине, ну, конечно, кроме типа блока) и для отключившегося игрока не вызовется. В IPB-плагинах несколько ошибок/недоработок, видимо, поэтому наличие аккаунта ты не по тому полю смотрел: в active ставится id (индекс) игрока, на которого данные пришли (хотя тот вариант тоже рабочий, но, строго говоря, это случайность/совпадение). Собственно, и текст 'Вы не авторизованы на сервере' не очень правильный; 'Вы не зарегистрированы на Форуме' будет вернее.

Получается вот так, если не нужно хранить массив с данными:
Код
#include <amxmodx>
#include <engine>
#include <hamsandwich>

/*НАЧАЛО массив для предотвращения спама в чат*/
enum _:Types {
    BLOCK_NONE,
    BLOCK_NOAUTH,
    BLOCK_MINMSG
}
static gszBlockMsg[Types][] = {
    "",     // placeholder
    "^1Вы не зарегистрированы на Форуме, ^4оружие недоступно",
    "^1Нужно 50 сообщений на Форуме, ^4оружие недоступно"
}
/*КОНЕЦ массив для предотвращения спама в чат*/

new giLastBlockMsg[33]
new giBlockType[33]

public plugin_init() {
    register_plugin( "test", "0.1", "AUTHOR" )

    RegisterHam( Ham_Touch, "armoury_entity", "fwdTouch" )
    RegisterHam( Ham_Touch, "weaponbox", "fwdTouch" )
}

public ipb_core( id, MemberID, const Name[], Posts, Topics, const Status[], LastVisit ) {
    if( MemberID ) {
        // есть аккаунт на форуме
        if( Posts < 50 )
            giBlockType[id] = BLOCK_MINMSG
        else
            giBlockType[id] = BLOCK_NONE
    }
}

public client_putinserver(id) {
    giBlockType[id] = BLOCK_NOAUTH
}

public fwdTouch( ent, id ) {
    if( !is_valid_ent(ent) || !is_user_alive(id) || get_user_flags(id) & ADMIN_LEVEL_H )
        return HAM_IGNORED

    static szModel[32], szTargetModel[] = "models/zm/w_trg42g.mdl"
    entity_get_string( ent, EV_SZ_model, szModel, charsmax(szModel) )
    if( !strcmp( szModel, szTargetModel ) && giBlockType[id] != BLOCK_NONE ) {
        if( get_systime() >= giLastBlockMsg[id] ) {
            PrintChatColor( id, _, gszBlockMsg[ giBlockType[id] ] )
            giLastBlockMsg[id] = get_systime() + 1
        }
        return HAM_SUPERCEDE
    }

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