Русское сообщество по скриптингу

Time User Bonus

Новые плагины для AMX Mod X, которые были добавлены в базу плагинов нашего форума. Плагины еще не утвеждены администратором/модератором.

Модератор: Leonidddd

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

Данный раздел форума служит для добавления новых плагинов в базу нашего форума. После того, как администратор/модератор утвердит плагин, он будет перемещен в раздел "Утвежденные плагины".

Правила при добавлении новых плагинов:

1. При вставке кода плагина необходимо использовать тег [pawn], в противном случае, если тег [pawn] не отображает ваш код, можно использовать тег [code].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. Обязательно выкладывайте исходник sma плагина. Запрещено выкладывать amxx файл.
4. Обязательно указывайте настоящих авторов плагина, если вы использовали чьи-то наработки или функции, указывайте их авторов в сообщении.
5. Необходимо заполнять детальную информацию о плагине (версию, настройки, используемые модули, список изменений и другую).

Time User Bonus

Сообщение Dmitry Beast » 31 май 2016, 19:17

Плагин выдаёт бонус деньгами за проведенное время на сервере.

Код: Выделить всё
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>
 
#define PLUGIN "Time User Bonus"
#define VERSION "1.0"
#define AUTHOR "BeasT"
 
public plugin_init
() 
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHam(Ham_Spawn,"player","user_get_time", 1)
}

public user_get_time(id)
{
    new user_time = get_user_time(id)
    
    if
(user_time >= 3600 && user_time < 7200)
    {
        if (is_user_alive(id))
        {
        ChatColor(id, "^4*^1 За !g1ч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g100$!team]")
        cs_set_user_money(id, min(cs_get_user_money(id) + 100, 16000))
        }
    }
    else
    if
(user_time >= 7200 && user_time < 10800)
    {
        if (is_user_alive(id))
        {
        ChatColor(id, "^4*^1 За !g2ч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g200$!team]")
        cs_set_user_money(id, min(cs_get_user_money(id) + 200, 16000))
        }
    }
    else
    if
(user_time >= 10800 && user_time < 14400)
    {
        if (is_user_alive(id))
        {
        ChatColor(id, "^4*^1 За !g3ч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g300$!team]")
        cs_set_user_money(id, min(cs_get_user_money(id) + 300, 16000))
        }
    }
    else
    if
(user_time >= 14400 && user_time < 18000)
    {
        if (is_user_alive(id))
        {
        ChatColor(id, "^4*^1 За !g4ч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g400$!team]")
        cs_set_user_money(id, min(cs_get_user_money(id) + 400, 16000))
        }
    }
    else
    if
(user_time >= 18000 && user_time < 21600)
    {
        if (is_user_alive(id))
        {
        ChatColor(id, "^4*^1 За !g5ч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g500$!team]")
        cs_set_user_money(id, min(cs_get_user_money(id) + 500, 16000))
        }
    }
    
    return PLUGIN_CONTINUE
}

stock ChatColor(const id, const input[], any:...)
{
   new count = 1, players[32]
   static msg[191]
   vformat(msg, 190, input, 3)
   
   replace_all
(msg, 190, "!g", "^4")
   replace_all(msg, 190, "!y", "^1")
   replace_all(msg, 190, "!team", "^3")
   replace_all(msg, 190, "!team2", "^0")
   
   if 
(id) players[0] = id; else get_players(players, count, "ch")
   {
      for (new i = 0; i < count; i++)
      {
         if (is_user_connected(players[i]))
         {
            message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
            write_byte(players[i]);
            write_string(msg);
            message_end();
         }
      }
   }


Может кому надо, просто оставлю это здесь.
P.S. если код плохой или можно упростить, пишите адекватно и, КАК сделать лучше, если можно.

Тема перемещена в раздел "Добавленные новые плагины" // Subb98
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Time User Bonus

Сообщение Subb98 » 01 июн 2016, 02:21

Хотя бы вот так:

Код: Выделить всё
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>

new const PLUGIN[] = "Time User Bonus"
new const VERSION[] = "1.0"
new const AUTHOR[] = "BeasT"

const MAX_MONEY = 16000

new g_pSayText

public plugin_init
() 
{
    register_plugin(PLUGIN, VERSION, AUTHOR)
    RegisterHam(Ham_Spawn,"player","user_get_time", 1)
    g_pSayText = get_user_msgid("SayText")
}

public user_get_time(id)
{
    if(!is_user_alive(id))
    {
        return HAM_IGNORED
    
}
    switch(get_user_time(id))
    {
        case 3600..7199:
        {
            PrintMsg(id, "^4* ^1За ^41ч. ^1игры на сервере ^3Вы ^1награждаетесь ^3[^4100$^3]")
            cs_set_user_money(id, min(cs_get_user_money(id) + 100, MAX_MONEY))
        }
        case 7200..10799:
        {
            PrintMsg(id, "^4* ^1За ^42ч. ^1игры на сервере ^3Вы ^1награждаетесь ^3[^4200$^3]")
            cs_set_user_money(id, min(cs_get_user_money(id) + 200, MAX_MONEY))
        }
        case 10800..14399:
        {
            PrintMsg(id, "^4* ^1За ^43ч. ^1игры на сервере ^3Вы ^1награждаетесь ^3[^4300$^3]")
            cs_set_user_money(id, min(cs_get_user_money(id) + 300, MAX_MONEY))
        }
        case 14400..17999:
        {
            PrintMsg(id, "^4* ^1За ^44ч. ^1игры на сервере ^3Вы ^1награждаетесь ^3[^4400$^4]")
            cs_set_user_money(id, min(cs_get_user_money(id) + 400, MAX_MONEY))
        }
        case 18000..21600:
        {
            PrintMsg(id, "^4* ^1За ^45ч. ^1игры на сервере ^3Вы ^1награждаетесь ^3[^4500$^4]")
            cs_set_user_money(id, min(cs_get_user_money(id) + 500, MAX_MONEY))
        }
    }
    return HAM_HANDLED
}

PrintMsg(const id, const szMessage[])
{
    new szMsg[191];
    vformat(szMsg, charsmax(szMsg), szMessage, 2);
    message_begin(MSG_ONE_UNRELIABLE, g_pSayText, _, id);
    write_byte(id);
    write_string(szMsg);
    message_end();
}
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Time User Bonus

Сообщение RevCrew » 01 июн 2016, 09:17

Subb98, а ты точно уверен что лучше так? ведь switch это ифы, и у тебя будет код просто огромнейший при компиляции, кстате плагин компилится 3-5 сек :-D

Добавлено спустя 52 секунды:
размер скомпилированного плагина 29 kb, в том время как размер исх 2 lb :-)
Аватара пользователя
RevCrew
Скриптер
 
Сообщения: 1648
Зарегистрирован: 15 июл 2013, 20:45
Благодарил (а): 273 раз.
Поблагодарили: 357 раз.
Языки программирования: Unkown

Re: Time User Bonus

Сообщение артист666 » 01 июн 2016, 10:20

Аптимизировано :-D

Код: Выделить всё
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>

public plugin_init()
{
    
register_plugin("Time User Bonus""1.0""BeasT")
    
    
RegisterHam(Ham_Spawn"player""user_get_time"1)
}
public 
user_get_time(id)
{
    if(!
is_user_alive(id)) return
    
    static 
user_timeuser_time get_user_time(id)
    
    if(
user_time 3600) return
    
    static 
hourhour user_time 3600
    
static manymany hour 100
    
    ChatColor
(id"^4*^1 За !g%iч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g%i$!team]"hourmany)
    
cs_set_user_money(idmin(cs_get_user_money(id) + many16000))
}
stock ChatColor(const id, const input[], any:...)
{
    new 
count 1players[32]
    static 
msg[191]
    
vformat(msg190input3)
    
    
replace_all(msg190"!g""^4")
    
replace_all(msg190"!y""^1")
    
replace_all(msg190"!team""^3")
    
replace_all(msg190"!team2""^0")
    
    if (
idplayers[0] = id; else get_players(playerscount"ch")
    {
        for (new 
0counti++)
        {
            if (
is_user_connected(players[i]))
            {
                
message_begin(MSG_ONE_UNRELIABLEget_user_msgid("SayText"), _players[i])
                
write_byte(players[i]);
                
write_string(msg);
                
message_end();
            }
        }
    }
}  
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2706
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 639 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Time User Bonus

Сообщение Dmitry Beast » 01 июн 2016, 12:51

Вообщем как-то неправильно что-ли работает гет_юзер_тайм, сейчас объясню.
Играем на одной карте больше часа, всё ок, бонусы выдаются.
Карта меняется, но уже бонусы не выдаются, хотя время продолжает идти уже за час..

Добавлено спустя 47 секунд:
Помню в статсшелл было реализовано через нваулт, может какраз по-этому?

Добавлено спустя 2 минуты 43 секунды:
артист666 писал(а):Аптимизировано :-D

Код: Выделить всё
#include <amxmodx>
#include <cstrike>
#include <hamsandwich>

public plugin_init()
{
    register_plugin("Time User Bonus", "1.0", "BeasT")
    
    RegisterHam
(Ham_Spawn, "player", "user_get_time", 1)
}
public user_get_time(id)
{
    if(!is_user_alive(id)) return
    
    static user_time
; user_time = get_user_time(id)
    
    if
(user_time < 3600) return
    
    static hour
; hour = user_time / 3600
    static many
; many = hour * 100
    
    ChatColor
(id, "^4*^1 За !g%iч. ^1игры на сервере^3 Вы^1 награждаетесь^3 [!g%i$!team]", hour, many)
    cs_set_user_money(id, min(cs_get_user_money(id) + many, 16000))
}
stock ChatColor(const id, const input[], any:...)
{
    new count = 1, players[32]
    static msg[191]
    vformat(msg, 190, input, 3)
    
    replace_all
(msg, 190, "!g", "^4")
    replace_all(msg, 190, "!y", "^1")
    replace_all(msg, 190, "!team", "^3")
    replace_all(msg, 190, "!team2", "^0")
    
    if 
(id) players[0] = id; else get_players(players, count, "ch")
    {
        for (new i = 0; i < count; i++)
        {
            if (is_user_connected(players[i]))
            {
                message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("SayText"), _, players[i])
                write_byte(players[i]);
                write_string(msg);
                message_end();
            }
        }
    }
}

Неплохо ;) :thumbs_up
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Time User Bonus

Сообщение zhorzh78 » 01 июн 2016, 13:35

get_user_time
время с начала коннекта.. естественно, сбросится после дисконнекта игрока
Аватара пользователя
zhorzh78
 
Сообщения: 91
Зарегистрирован: 26 фев 2014, 10:07
Благодарил (а): 1 раз.
Поблагодарили: 23 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX)

Re: Time User Bonus

Сообщение Dmitry Beast » 01 июн 2016, 14:06

zhorzh78 писал(а):get_user_time
время с начала коннекта.. естественно, сбросится после дисконнекта игрока

Внимательно, пожалуйста прочитай..
Аватара пользователя
Dmitry Beast
 
Сообщения: 1560
Зарегистрирован: 24 дек 2010, 10:35
Откуда: Египет
Благодарил (а): 440 раз.
Поблагодарили: 207 раз.
Опыт программирования: Больше трех лет
Языки программирования: All Languages

Re: Time User Bonus

Сообщение Subb98 » 01 июн 2016, 16:41

RevCrew писал(а):Subb98, а ты точно уверен что лучше так? ведь switch это ифы, и у тебя будет код просто огромнейший при компиляции, кстате плагин компилится 3-5 сек :-D

Уверен, конечно же. :-) По крайней мере, это оптимальней, чем if / else if ..., должны же знать, но артист666 уже вариант лучше предложил. :-)

Добавлено спустя 21 минуту 23 секунды:
П.с.: изменил множества вариантов в case'ах, скорость компиляции, действительно, существенно снижается, а вот размер остаётся прежним.
«Очень хорошо. Лучше вы, чем я» © Donald J. Trump
Аватара пользователя
Subb98
Модератор
 
Сообщения: 5485
Зарегистрирован: 24 мар 2011, 19:42
Откуда: г. Пермь
Благодарил (а): 1329 раз.
Поблагодарили: 2343 раз.
Опыт программирования: Больше трех лет
Языки программирования: PHP

Re: Time User Bonus

Сообщение zhorzh78 » 01 июн 2016, 16:50

Dmitry Beast писал(а):
zhorzh78 писал(а):get_user_time
время с начала коннекта.. естественно, сбросится после дисконнекта игрока

Внимательно, пожалуйста прочитай..

Карта меняется, но уже бонусы не выдаются, хотя время продолжает идти уже за час..

Что прочесть? Что после карты не выдается? А при смене карты дисконнекта игрока нет? Сервер особенный какой-то? И не будет идти время "за час"! Сбросится таймер при заходе игрока..
Аватара пользователя
zhorzh78
 
Сообщения: 91
Зарегистрирован: 26 фев 2014, 10:07
Благодарил (а): 1 раз.
Поблагодарили: 23 раз.
Опыт программирования: Больше трех лет
Языки программирования: Pawn (AMXX)

Re: Time User Bonus

Сообщение Polarhigh » 01 июн 2016, 16:51

Subb98, для каждого значения диапазона генерируется своя инструкция как для ифа (или что-то в этом роде), в общем диапазоны в кейсах сравнимы с лапшой из ифов
if(a == 1)
elseif(a == 2)
elseif(a == 3)
...

Вы должны зарегистрироваться, чтобы видеть ссылки.
Важно!
Стоить отметить, что в официальной документации к языку написано: ‘In pawn, switch is a structured “if”‘, а это значит, что конструкция switch — это набор структурированных if’ов, отсюда следует, что switch не может работать быстрее if. Однако, тесты показали следующее:
Следующая конструкция:
Код: Выделить всё
switch (var)
{
        case 40, 80, 150, 160, 230, 420: return 1;
}

быстрее, чем
Код: Выделить всё
if ( var == 40 || var == 80 || var == 150 || var == 160 || var == 230 || var == 420 ) return 1;

Следующая конструкция:
Код: Выделить всё
switch(var)
{
        case 40..80,150..160,230..420: return 1;
}

медленнее чем
Код: Выделить всё
if ( var >= 40 && var <= 80 || var >= 150 && var <= 160 || var >= 230 && var <= 420 ) return 1;

Следующая конструкция:
Код: Выделить всё
switch (var)
{
        case 40: return 1;
}

одинакова как и
Код: Выделить всё
if ( var == 40 ) return 1;
Следующая конструкция:
switch (var)
{
        case 40..50: return 1;
}

быстрее чем
Код: Выделить всё
if ( var >= 40 && var <= 50 ) return 1;

Как видим — switch/case медленнее(значительно) if только на больших промежутках значений.
Аватара пользователя
Polarhigh
 
Сообщения: 1006
Зарегистрирован: 04 май 2010, 17:41
Благодарил (а): 131 раз.
Поблагодарили: 388 раз.
Опыт программирования: Больше трех лет

След.

Вернуться в Добавленные новые плагины

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3