Автор: Artist666
Версия: 1.0
Описание: Плагин добавляет на сервер игровой автомат.
Команда установки по взгляду игрока ppfire в консоль.
Использовать автомат на E английскую.
Весь код расписан, так что можно переделать его под себя, хоть из файла по координатам.
- Код: Выделить всё
#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(c == 15 || c == 60 || c == 90 || c == 135 || c == 150 || c == 180 || c == 240) return 1 // арбуз
else if(c == 30 || c == 120 || c == 210) return 2 // 1бар
else if(c == 75 || c == 225) return 3 // 2бар
else if(c == 0 || c == 255) return 4 // 3бар
else if(c == 45 || c == 105) return 5 // 7ка
else if(c == 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()
}