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

Игровой автомат

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

Модератор: Leonidddd

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

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

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

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

Игровой автомат

Сообщение артист666 » 22 янв 2025, 20:27

Вы должны зарегистрироваться, чтобы видеть ссылки.

Автор: Artist666
Версия: 1.0
Описание: Плагин добавляет на сервер игровой автомат.
Команда установки по взгляду игрока ppfire в консоль.
Использовать автомат на E английскую.
Весь код расписан, так что можно переделать его под себя, хоть из файла по координатам.

авт.jpg


Untitled.sma


slot_machine.rar


slot_mashine.rar


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

#define m_linux_player        5
#if cellbits == 32
#define m_iAccount        115
#else
#define m_iAccount        140
#endif

new rand[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180, 195, 210, 225, 240} // Положения контроллеров, когда картинка ровно по центру
new const models[] = "models/slot_machine.mdl"
new const s_spin1[] = "slot_mashine/start.wav"
new const s_spin2[] = "slot_mashine/spin.wav"
new const s_spin3[] = "slot_mashine/lunge.wav"
new const s_spin4[] = "slot_mashine/lose.wav"
new const s_spin5[] = "slot_mashine/win.wav"
new g_msg_money

public plugin_init
()
{
    register_plugin("Slot mashine", "1.0", "artist666")
    
    register_clcmd
("ppfire", "functions") // Установить автомат по взгляду
    
    RegisterHam
(Ham_Use, "info_target", "use_slotmachine", 1)
    RegisterHam(Ham_ObjectCaps, "info_target", "caps_slotmachine")
    RegisterHam(Ham_Think, "info_target", "think_slotmachine", 1)
    g_msg_money = get_user_msgid("Money")
}
public plugin_precache()
{
    precache_model(models)
    precache_sound(s_spin1)
    precache_sound(s_spin2)
    precache_sound(s_spin3)
    precache_sound(s_spin4)
    precache_sound(s_spin5)
}
public functions(id)
{
    static Float:start[3]; pev(id, pev_origin, start)
    static Float:end[3]; pev(id, pev_view_ofs, end)
    static Float:angle[3]; pev(id, pev_v_angle, angle)
    static Float:langle[3]; angle_vector(angle, ANGLEVECTOR_RIGHT, langle)
    angle_vector(angle, ANGLEVECTOR_FORWARD, angle)
    
    for
(new i = 0; i < 3; i++) end[i] = angle[i] * 2048.0 + (start[i] += end[i])
    
    engfunc
(EngFunc_TraceLine, start, end, DONT_IGNORE_MONSTERS, id, 0)
    get_tr2(0, TR_vecEndPos, end)

    if(get_distance_f(start, end) < 30.0) return PLUGIN_HANDLED

    mashine_spawn
(end)
    return PLUGIN_HANDLED
}
public mashine_spawn(Float:origin[3]) // Установка аппарата
{
    static ent; ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
    
    if
(!pev_valid(ent)) return
    
    dllfunc
(DLLFunc_Spawn, ent)
    set_pev(ent, pev_classname, "slot_machine")
    engfunc(EngFunc_SetModel, ent, models)
    engfunc(EngFunc_SetSize, ent, Float:{-11.86, -13.91, 0.0}, Float:{10.9, 13.91, 69.73})
    set_pev(ent, pev_movetype, MOVETYPE_TOSS)
    set_pev(ent, pev_solid, SOLID_BBOX)
    engfunc(EngFunc_SetOrigin, ent, origin)
    random_roll(ent) // Установить случайное положение барабанам
}
public use_slotmachine(ent, id, activator, type, Float:value) // Использование аппарата, анимация рычага и прочее
{
    static classname[33]; pev(ent, pev_classname, classname, charsmax(classname))
    if(!equal(classname, "slot_machine")) return
    if
(pev(ent, pev_iuser4) != 0) return // Аппарат занят
    
    static money
; money = get_pdata_int(id, m_iAccount, m_linux_player)
    if(money < 5) return // Нет денег

    fm_set_user_money(id, money - 50, 1)
    entity_anim(ent, 1)
    set_pev(ent, pev_iuser4, 5) // Запуск
    engfunc(EngFunc_EmitSound, ent, CHAN_BODY, s_spin1, 1.0, ATTN_NORM, 0, PITCH_NORM) // Звук рычага
    set_pev(ent, pev_button, id)
    set_pev(ent, pev_nextthink, get_gametime() + 0.5)
}
public caps_slotmachine(ent) // Блокировка
{
    static classname[33]; pev(ent, pev_classname, classname, charsmax(classname))
    if(!equal(classname, "slot_machine")) return HAM_IGNORED
    SetHamReturnInteger
(0x00000008)
    return HAM_SUPERCEDE
}
public think_slotmachine(ent) // Анимация вращения барабанов
{
    static classname[33]; pev(ent, pev_classname, classname, charsmax(classname))
    if(!equal(classname, "slot_machine")) return
    
    static winnum
, status; status = pev(ent, pev_iuser4)
    static Float:delay; pev(ent, pev_dmgtime, delay)
    
    if
(status == 5) // Начало вращения
    {
        set_pev(ent, pev_animtime, 0.0) // Без этого контроллеры крутятся неправильно(вернее отображается не то, что на самом деле)
        random_roll(ent)  // Установить случайное положение барабанам
        set_pev(ent, pev_dmgtime, random_float(0.5, 1.5)) // Сколько секунд будет вращаться 1й барабан(+2 секунды до выигрыша)
        set_pev(ent, pev_nextthink, get_gametime() + 0.016) // 60 Герц
        engfunc(EngFunc_EmitSound, ent, CHAN_BODY, s_spin2, 1.0, ATTN_NORM, 0, PITCH_NORM) // Звук вращения
        set_pev(ent, pev_iuser4, 1) // Статус вращения
        return
    
}
    else if(status == 4) // Рассчёт выигрыша
    {
        if(delay <= 0.0) // Закончилась задержка для звука
        {
            set_pev(ent, pev_iuser4, 0) // Аппарат свободен
            count(ent)
            return
        
}
    }
    else // Вращение барабанов
    {
        for(new i = status - 1; i < 3; i++) // Цикл по барабанам
        {
            winnum = pev(ent, pev_iuser1 + i) // Получить положение контроллера
            
            if
(delay <= 0.0 && !pev(ent, pev_weapons)) // Если время для вращения  закончилось
            {
                if(winnum % 15) // Если не кратно 15
                {
                    winnum-- // Убавить на 1
                    set_pev(ent, pev_weapons, 1) // Костыль, чтобы докрутка правильно работала, ограничить итерации одним барабаном
                }
                else // Барабан остановился ровно
                {
                    delay = (status == 3) ? 0.3 : 1.0    // Установить задержку для следующего барабана
                    set_pev(ent, pev_weapons, 0)        // Костыль
                    set_pev(ent, pev_iuser4, status + 1)    // Переход к следующему состоянию
                    engfunc(EngFunc_EmitSound, ent, CHAN_ITEM, s_spin3, 1.0, ATTN_NORM, 0, PITCH_NORM)
                }
            }
            else winnum -= 2 // 2 - на сколько положений крутить контроллеры(скорость вращения)

            if(winnum < 0) winnum += 256 // Убрать отрицательное значение

            set_pev(ent, pev_iuser1 + i, winnum)        // Записать положение контроллера(pev_controller некорректно работает)
            set_pev(ent, pev_controller_0 + i, winnum)    // Установить положение контроллера
        }
        set_pev(ent, pev_weapons, 0) // Костыль, чтобы докрутка правильно работала, ограничить итерации одним барабаном
    }
    set_pev(ent, pev_dmgtime, delay - 0.016) // 1/60 секунды
    set_pev(ent, pev_nextthink, get_gametime() + 0.016) // 60 Герц
}
public count(ent) // Подсчет выигрыша
{
    static win_money; win_money = 0
    static mas
[3]; for(new i = 0; i < 3; i++) mas[i] = pev(ent, pev_iuser1 + i) // Получить Значения контроллеров
    
    for
(new i = 0; i < 3; i++) mas[i] = win_count_type(mas[i]) // Получить тип выпавших картинок

    if(mas[0] == mas[1] && mas[1] == mas[2]) // Все 3 одинаковы
    {
        win_money = get_win_money(mas[0])
        win_money *= 10
    
}
    else if(mas[0] == mas[1])  // 2 первых
    {
        win_money = get_win_money(mas[0])
        if(mas[2] == 6) win_money *= 7 // Последняя 7ка в круге
    }
    else if(mas[1] == mas[2]) // 2 последних
    {
        win_money = get_win_money(mas[1])
        if(mas[0] == 6) win_money *= 7 // Первая 7ка в круге
    }
    else if(mas[0] == mas[2] && mas[1] == 6) // 2 крайние и средняя 7ка в круге
    {
        win_money = get_win_money(mas[0]) // Получить
        win_money *= 7 // Умножение
    }

    static id; id = pev(ent, pev_button) // Получить ид игромана
    set_pev(ent, pev_button, 0) // Сбросить ид у автомата
    
    if
(!is_user_alive(id)) return

    if
(win_money == 0) // Проигрыш
    {
        set_dhudmessage(255, 0, 0, -1.0, 0.4, 1, 0.0, 1.0, 0.0, 0.0)
        show_dhudmessage(id, "You lose! D")
        engfunc(EngFunc_EmitSound, ent, CHAN_BODY, s_spin4, 1.0, ATTN_NORM, 0, PITCH_NORM)
        return
    
}
    set_dhudmessage(0, 255, 0, -1.0, 0.4, 2, 0.05, 1.0, 0.0, 2.0)
    show_dhudmessage(id, "You win! +%i$", win_money)
    win_money += get_pdata_int(id, m_iAccount, m_linux_player)
    fm_set_user_money(id, min(win_money, 16000), 1)
    engfunc(EngFunc_EmitSound, ent, CHAN_BODY, s_spin5, 1.0, ATTN_NORM, 0, PITCH_NORM)
}
stock random_roll(ent) // Установить случайное положение барабанам
{
    static winnum
    
    for
(new i = 0; i < 3; i++)
    {
        winnum = rand[random_num(0, charsmax(rand))]
        set_pev(ent, pev_iuser1 + i, winnum)
        set_pev(ent, pev_controller_0 + i, winnum)
    }
}
stock win_count_type(c) // Определяет что выпало на барабане по положению контроллера
{
    if(== 15 || c == 60 || c == 90 || c == 135 || c == 150 || c == 180 || c == 240) return 1 // арбуз
    else if(== 30 || c == 120 || c == 210) return 2        // 1бар
    else if(== 75 || c == 225) return 3            // 2бар
    else if(== 0 || c == 255) return 4            // 3бар
    else if(== 45 || c == 105) return 5            // 7ка
    else if(== 165 || c == 195) return 6            // 7ка в круге
    return -1
}
stock get_win_money(type) // Определяеет наградуб смотря что выпало
{
    if(type == 1) return 50    // арбуз
    else if(type == 2) return 150    // 1бар
    else if(type == 3) return 250    // 2бар
    else if(type == 4) return 350    // 3бар
    else if(type == 5) return 550    // 7ка
    else if(type == 6) return 777    // 7ка в круге
    return 0
}
stock entity_anim(ent, sequence, Float:framerate = 1.0)
{
    set_pev(ent, pev_animtime, get_gametime())
    set_pev(ent, pev_framerate, framerate)
    set_pev(ent, pev_frame, 0.0)
    set_pev(ent, pev_sequence, sequence)
}
stock fm_set_user_money(id, value, flash = 0)
{
    set_pdata_int(id, m_iAccount, value, m_linux_player)
    
    message_begin
(MSG_ONE, g_msg_money, _, id)
    write_long(value)
    write_byte(flash)
    message_end()
}
 
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось артист666 24 янв 2025, 11:25, всего редактировалось 1 раз.
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2710
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 641 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn

Re: Игровой автомат

Сообщение MayroN » 24 янв 2025, 00:52

Смотрите,какую птицу к нам занесло
Я думал ты уже не заправляешь делами

Что хотел пожелать,если будешь делать обновления в будущем
Есть рука с деньгами ( как отдаёт ) - можно перед рычагом показывать,что ложит деньги в автомат
+ субмодель потом сменить с деньгами уже,если выиграл ты
Вы должны зарегистрироваться, чтобы видеть ссылки.

И кстате,в Архиве нет звуков ( только модель )
Потом поправишь

Вот пока автомат с деньгами )
Вы должны зарегистрироваться, чтобы видеть ссылки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
МультиМод CS
Аватара пользователя
MayroN
 
Сообщения: 675
Зарегистрирован: 10 окт 2010, 18:23
Откуда: Украина, г. Белая Церковь
Благодарил (а): 151 раз.
Поблагодарили: 87 раз.
Опыт программирования: Около года
Языки программирования: На которых говорю...

Re: Игровой автомат

Сообщение артист666 » 24 янв 2025, 11:36

Да просто на работе неделю ничего не делал, в фар край играл.
Захотелось подумать. Я его 10 лет назад писал. Забросил, ну вот руки дошли.

Вряд ли плагин нуждается в доработке. Если будут ошибки - исправлю, так - то вроде всё продумал.
На счёт рук - плохая идея. Игроки могут стоять боком, раком, сзади. :-)
Автомат юзабелен со всех сторон.
И выигрыш зачисляется игроку даже если он убежал на пол карты от автомата.
Звуки закинул.
Если вы хотите чему-то научиться, пробуйте, задавайте вопросы.
Иначе компенсируйте потраченное время на ваши "проблемы".
Аватара пользователя
артист666
 
Сообщения: 2710
Зарегистрирован: 09 апр 2013, 17:46
Благодарил (а): 284 раз.
Поблагодарили: 641 раз.
Опыт программирования: Больше трех лет
Языки программирования: С, C++
Delphi
HTML, CSS, Java Script
Pawn


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

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

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