add sborka

This commit is contained in:
2026-03-31 10:27:04 +03:00
commit f5e5f56c84
2345 changed files with 382127 additions and 0 deletions

View File

@@ -0,0 +1,553 @@
-- Цветовая схема (в стиле остальных интерфейсов)
local PLUGIN = PLUGIN
local COLOR_BG_DARK = Color(3, 5, 4)
local COLOR_BG_MEDIUM = Color(8, 12, 10)
local COLOR_BG_LIGHT = Color(12, 18, 14)
local COLOR_PRIMARY = Color(27, 94, 32)
local COLOR_PRIMARY_HOVER = Color(33, 110, 38)
local COLOR_ACCENT = Color(56, 102, 35)
local COLOR_ACCENT_HOVER = Color(66, 120, 45)
local COLOR_BORDER = Color(46, 125, 50, 80)
local COLOR_TEXT_PRIMARY = Color(165, 214, 167)
local COLOR_TEXT_SECONDARY = Color(129, 199, 132)
local COLOR_TEXT_DIM = Color(100, 150, 105)
-- Хук для камеры во время анимации
function PLUGIN:CalcView(ply, pos, angles, fov)
local str = ply:GetNW2String('TauntAnim')
if str != "" then
if GetConVar("rp_taunt_firstperson"):GetBool() then
local eye_id = ply:LookupAttachment('eyes')
local att = eye_id > 0 and ply:GetAttachment(eye_id) or nil
if not att then return end
local ang1 = angles
if GetConVar("rp_taunt_realistic_firstperson"):GetBool() then
ang1 = att.Ang
end
local view = {
origin = att.Pos,
angles = ang1,
fov = fov,
drawviewer = true
}
return view
else
local view = {
origin = pos - (angles:Forward() * 100),
angles = angles,
fov = fov,
drawviewer = true
}
return view
end
end
end
function PLUGIN:ShouldDrawLocalPlayer(ply)
local str = ply:GetNW2String('TauntAnim')
if str != "" and not GetConVar("rp_taunt_firstperson"):GetBool() then
return true
end
end
-- Подсказка на экране
function PLUGIN:HUDPaint()
local ply = LocalPlayer()
local str = ply:GetNW2String('TauntAnim')
if str != "" then
draw.SimpleTextOutlined("Нажмите SHIFT, чтобы убрать анимацию.", "Trebuchet18", ScrW()/2, ScrH()-250, color_white, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER, 1, color_black)
end
end
-- Таблица анимаций (импортируем из существующего аддона)
local AnimationCategories = {
{
name = "ЖЕСТЫ",
anims = {
{id = 1, name = "Помахать руками"},
{id = 2, name = "Помахать рукой"},
{id = 3, name = "Показать пальцем вперед"},
{id = 4, name = "Показать пальцем назад"},
{id = 5, name = "Поправить галстук"},
}
},
{
name = "СПОРТ",
anims = {
{id = 6, name = "Приседания"},
{id = 7, name = "Отжимания"},
{id = 8, name = "Подъем корпуса"},
{id = 9, name = "Берпи"},
}
},
{
name = "ПОЗЫ",
anims = {
{id = 10, name = "Стоять злобно"},
{id = 11, name = "Стоять напуганно"},
{id = 12, name = "Стоять, сложив руки"},
{id = 13, name = "Стоять, руки на поясе"},
{id = 14, name = "Стоять, держась за пояс"},
{id = 15, name = "Сидеть, рука на колене"},
{id = 16, name = "Сидеть в позе лотоса"},
{id = 17, name = "Сидеть в сонном состоянии"},
{id = 18, name = "Лежать в плохом состоянии"},
}
},
{
name = "ТАНЦЫ",
anims = {
{id = 19, name = "Танец 1"},
{id = 20, name = "Танец 2"},
{id = 21, name = "Танец 3"},
{id = 22, name = "Танец 4"},
{id = 33, name = "Танец в присядь"},
}
},
{
name = "ДЕЙСТВИЯ",
anims = {
{id = 23, name = "Согласие"},
{id = 24, name = "Несогласие"},
{id = 25, name = "Позвать с собой"},
{id = 26, name = "Поклониться"},
{id = 27, name = "Отдать честь"},
{id = 28, name = "Пить кофе"},
{id = 29, name = "Смотреть на объект"},
{id = 30, name = "Записывать в блокнот"},
{id = 31, name = "Спать"},
{id = 32, name = "Воинское приветствие"},
}
}
}
local animMenu = nil
local animMenuOpen = false
-- Функция создания меню анимаций
local function CreateAnimationMenu()
if IsValid(animMenu) then
animMenu:Remove()
end
-- Невидимая панель на весь экран для перехвата ввода
local basePanel = vgui.Create("DPanel")
basePanel:SetSize(ScrW(), ScrH())
basePanel:SetPos(0, 0)
basePanel:MakePopup()
basePanel.Paint = function() end -- Полностью прозрачная
-- Меню в правом верхнем углу
local menuWidth = 320
local menuHeight = 500
local padding = 20
local menu = vgui.Create("DPanel", basePanel)
menu:SetSize(menuWidth, menuHeight)
menu:SetPos(ScrW() - menuWidth - padding, padding)
menu.Paint = function(s, w, h)
-- Основной фон
draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
-- Заголовок
draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawLine(0, 45, w, 45)
-- Текст заголовка
draw.SimpleText("АНИМАЦИИ", "DermaLarge", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Декоративная линия
surface.SetDrawColor(COLOR_ACCENT)
surface.DrawRect(10, 43, w-20, 2)
-- Внешняя граница
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
-- Подсказка внизу
draw.SimpleText("C - Закрыть | SHIFT - Остановить анимацию", "DermaDefault", w/2, h-15, COLOR_TEXT_DIM, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
-- Кнопка закрытия
local closeBtn = vgui.Create("DButton", menu)
closeBtn:SetPos(menuWidth - 35, 8)
closeBtn:SetSize(28, 28)
closeBtn:SetText("")
closeBtn.Paint = function(s, w, h)
local col = s:IsHovered() and COLOR_ACCENT_HOVER or COLOR_ACCENT
draw.RoundedBox(4, 0, 0, w, h, col)
draw.SimpleText("×", "DermaLarge", w/2, h/2-2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
closeBtn.DoClick = function()
basePanel:Remove()
animMenuOpen = false
end
-- Скролл панель для категорий
local scroll = vgui.Create("DScrollPanel", menu)
scroll:SetPos(10, 55)
scroll:SetSize(menuWidth - 20, menuHeight - 90)
local sbar = scroll:GetVBar()
sbar:SetWide(6)
sbar.Paint = function(s, w, h)
draw.RoundedBox(3, 0, 0, w, h, COLOR_BG_MEDIUM)
end
sbar.btnGrip.Paint = function(s, w, h)
draw.RoundedBox(3, 0, 0, w, h, COLOR_ACCENT)
end
sbar.btnUp.Paint = function() end
sbar.btnDown.Paint = function() end
-- Создаем категории с анимациями
for _, category in ipairs(AnimationCategories) do
-- Заголовок категории
local catHeader = vgui.Create("DPanel", scroll)
catHeader:Dock(TOP)
catHeader:DockMargin(0, 5, 0, 3)
catHeader:SetTall(28)
catHeader.Paint = function(s, w, h)
draw.RoundedBox(4, 0, 0, w, h, COLOR_PRIMARY)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
draw.SimpleText(category.name, "DermaDefaultBold", 10, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
-- Анимации в категории
for _, anim in ipairs(category.anims) do
local animBtn = vgui.Create("DButton", scroll)
animBtn:Dock(TOP)
animBtn:DockMargin(3, 2, 3, 0)
animBtn:SetTall(32)
animBtn:SetText("")
animBtn.Paint = function(s, w, h)
local col = COLOR_BG_MEDIUM
if s:IsHovered() then
col = COLOR_PRIMARY_HOVER
-- Акцентная линия слева
surface.SetDrawColor(COLOR_ACCENT)
surface.DrawRect(0, 0, 3, h)
end
draw.RoundedBox(4, 0, 0, w, h, col)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
-- Иконка
draw.SimpleText("", "DermaDefault", 12, h/2, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Название анимации
draw.SimpleText(anim.name, "DermaDefault", 28, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
end
animBtn.DoClick = function()
RunConsoleCommand("rp_set_taunt", tostring(anim.id))
surface.PlaySound("buttons/button15.wav")
basePanel:Remove()
animMenuOpen = false
end
end
end
-- Обработка закрытия по нажатию вне меню
basePanel.OnMousePressed = function(s, keyCode)
if keyCode == MOUSE_LEFT then
-- Проверяем, кликнули ли вне меню
local mx, my = input.GetCursorPos()
local x, y = menu:GetPos()
local w, h = menu:GetSize()
if mx < x or mx > x + w or my < y or my > y + h then
basePanel:Remove()
animMenuOpen = false
end
end
end
-- Меню рации в левом верхнем углу
local radioWidth = 320
local radioHeight = 200
local radioMenu = vgui.Create("DPanel", basePanel)
radioMenu:SetSize(radioWidth, radioHeight)
radioMenu:SetPos(padding, padding)
radioMenu.Paint = function(s, w, h)
-- Основной фон
draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
-- Заголовок
draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawLine(0, 45, w, 45)
-- Текст заголовка
draw.SimpleText("ЧАСТОТА РАЦИИ", "DermaLarge", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Декоративная линия
surface.SetDrawColor(COLOR_ACCENT)
surface.DrawRect(10, 43, w-20, 2)
-- Внешняя граница
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
-- Получаем плагин рации
local radioPlugin = ix.plugin.list["radio"]
if not radioPlugin then
radioMenu:SetVisible(false)
else
local currentFreq = radioPlugin:GetFrequency(LocalPlayer())
-- Текущая частота
local freqLabel = vgui.Create("DLabel", radioMenu)
freqLabel:SetPos(20, 60)
freqLabel:SetSize(radioWidth - 40, 25)
freqLabel:SetText("Текущая частота: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", currentFreq))
freqLabel:SetFont("DermaDefault")
freqLabel:SetTextColor(COLOR_TEXT_PRIMARY)
-- Слайдер частоты
local freqSlider = vgui.Create("DNumSlider", radioMenu)
freqSlider:SetPos(10, 90)
freqSlider:SetSize(radioWidth - 20, 40)
freqSlider:SetText("")
freqSlider:SetMin(radioPlugin.minFrequency)
freqSlider:SetMax(radioPlugin.maxFrequency)
freqSlider:SetDecimals(radioPlugin.frequencyPrecision)
freqSlider:SetValue(currentFreq)
freqSlider.Label:SetTextColor(COLOR_TEXT_SECONDARY)
freqSlider.Label:SetFont("DermaDefault")
freqSlider.TextArea:SetTextColor(COLOR_TEXT_PRIMARY)
freqSlider.TextArea:SetFont("DermaDefault")
freqSlider.TextArea:SetEditable(true)
freqSlider.TextArea:SetNumeric(true)
freqSlider.TextArea.Paint = function(panel, w, h)
draw.RoundedBox(4, 0, 0, w, h, COLOR_BG_MEDIUM)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
panel:DrawTextEntryText(COLOR_TEXT_PRIMARY, COLOR_ACCENT, COLOR_TEXT_PRIMARY)
end
-- Обработчик ввода вручную
freqSlider.TextArea.OnEnter = function(panel)
local val = tonumber(panel:GetValue())
if val then
val = math.Clamp(val, radioPlugin.minFrequency, radioPlugin.maxFrequency)
freqSlider:SetValue(val)
end
end
freqSlider.Slider.Paint = function(panel, w, h)
draw.RoundedBox(4, 0, h/2-2, w, 4, COLOR_BG_MEDIUM)
local progress = (freqSlider:GetValue() - freqSlider:GetMin()) / (freqSlider:GetMax() - freqSlider:GetMin())
draw.RoundedBox(4, 0, h/2-2, w * progress, 4, COLOR_ACCENT)
end
freqSlider.Slider.Knob.Paint = function(s, w, h)
draw.RoundedBox(w/2, 0, 0, w, h, COLOR_PRIMARY)
if s:IsHovered() then
draw.RoundedBox(w/2, 2, 2, w-4, h-4, COLOR_ACCENT_HOVER)
end
end
freqSlider.OnValueChanged = function(_, value)
local format = "%0." .. radioPlugin.frequencyPrecision .. "f"
freqLabel:SetText("Текущая частота: " .. string.format(format, value))
end
-- Кнопка применения
local btnWidth = (radioWidth - 50) / 2
local applyBtn = vgui.Create("DButton", radioMenu)
applyBtn:SetPos(20, 150)
applyBtn:SetSize(btnWidth, 35)
applyBtn:SetText("")
applyBtn.Paint = function(s, w, h)
local col = s:IsHovered() and COLOR_PRIMARY_HOVER or COLOR_PRIMARY
draw.RoundedBox(6, 0, 0, w, h, col)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 2)
draw.SimpleText("ПРИМЕНИТЬ", "DermaDefaultBold", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
applyBtn.DoClick = function()
net.Start("ixRadioSetFrequency")
net.WriteFloat(freqSlider:GetValue())
net.SendToServer()
LocalPlayer():Notify("Частота рации изменена на: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", freqSlider:GetValue()))
end
-- Кнопка ручного ввода
local manualBtn = vgui.Create("DButton", radioMenu)
manualBtn:SetPos(30 + btnWidth, 150)
manualBtn:SetSize(btnWidth, 35)
manualBtn:SetText("")
manualBtn.Paint = function(s, w, h)
local col = s:IsHovered() and COLOR_ACCENT_HOVER or COLOR_ACCENT
draw.RoundedBox(6, 0, 0, w, h, col)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 2)
draw.SimpleText("ВВЕСТИ", "DermaDefaultBold", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
manualBtn.DoClick = function()
Derma_StringRequest(
"Ввод частоты",
"Введите частоту рации (от " .. radioPlugin.minFrequency .. " до " .. radioPlugin.maxFrequency .. "):",
tostring(currentFreq),
function(text)
local freq = tonumber(text)
if freq then
freq = math.Clamp(freq, radioPlugin.minFrequency, radioPlugin.maxFrequency)
net.Start("ixRadioSetFrequency")
net.WriteFloat(freq)
net.SendToServer()
freqSlider:SetValue(freq)
LocalPlayer():Notify("Частота рации изменена на: " .. string.format("%0." .. radioPlugin.frequencyPrecision .. "f", freq))
else
LocalPlayer():Notify("Неверный формат частоты!")
end
end,
function() end
)
end
end
-- Кнопки включения/выключения рации (справа от меню рации)
if radioPlugin then
local controlsWidth = 150
local controlsHeight = 200
local controlsPanel = vgui.Create("DPanel", basePanel)
controlsPanel:SetSize(controlsWidth, controlsHeight)
controlsPanel:SetPos(padding + radioWidth + 10, padding)
controlsPanel.Paint = function(s, w, h)
-- Основной фон
draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK)
-- Заголовок
draw.RoundedBoxEx(8, 0, 0, w, 45, COLOR_BG_MEDIUM, true, true, false, false)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawLine(0, 45, w, 45)
-- Текст заголовка
draw.SimpleText("РАЦИЯ", "DermaDefault", w/2, 22, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Декоративная линия
surface.SetDrawColor(COLOR_ACCENT)
surface.DrawRect(10, 43, w-20, 2)
-- Внешняя граница
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 1)
end
-- Кнопка включения прослушивания
local listenBtn = vgui.Create("DButton", controlsPanel)
listenBtn:SetPos(10, 60)
listenBtn:SetSize(controlsWidth - 20, 40)
listenBtn:SetText("")
listenBtn.Paint = function(s, w, h)
local isListening = radioPlugin:IsListening(LocalPlayer())
local col = isListening and COLOR_ACCENT or COLOR_BG_MEDIUM
if s:IsHovered() then
col = isListening and COLOR_ACCENT_HOVER or COLOR_PRIMARY_HOVER
end
draw.RoundedBox(6, 0, 0, w, h, col)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 2)
local status = isListening and "ВКЛ" or "ВЫКЛ"
draw.SimpleText("Прослушивание", "DermaDefault", w/2, h/2 - 7, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
draw.SimpleText(status, "DermaDefaultBold", w/2, h/2 + 7, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
listenBtn.DoClick = function()
net.Start("ixRadioToggleListen")
net.SendToServer()
timer.Simple(0.1, function()
local status = radioPlugin:IsListening(LocalPlayer()) and "включено" or "выключено"
LocalPlayer():Notify("Прослушивание рации " .. status)
end)
end
-- Кнопка включения передачи
local transmitBtn = vgui.Create("DButton", controlsPanel)
transmitBtn:SetPos(10, 110)
transmitBtn:SetSize(controlsWidth - 20, 40)
transmitBtn:SetText("")
transmitBtn.Paint = function(s, w, h)
local isTransmitting = radioPlugin:IsTransmitting(LocalPlayer())
local col = isTransmitting and COLOR_ACCENT or COLOR_BG_MEDIUM
if s:IsHovered() then
col = isTransmitting and COLOR_ACCENT_HOVER or COLOR_PRIMARY_HOVER
end
draw.RoundedBox(6, 0, 0, w, h, col)
surface.SetDrawColor(COLOR_BORDER)
surface.DrawOutlinedRect(0, 0, w, h, 2)
local status = isTransmitting and "ВКЛ" or "ВЫКЛ"
draw.SimpleText("Передача", "DermaDefault", w/2, h/2 - 7, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
draw.SimpleText(status, "DermaDefaultBold", w/2, h/2 + 7, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
end
transmitBtn.DoClick = function()
net.Start("ixRadioToggleTransmit")
net.SendToServer()
timer.Simple(0.1, function()
local status = radioPlugin:IsTransmitting(LocalPlayer()) and "включена" or "выключена"
LocalPlayer():Notify("Передача рации " .. status)
end)
end
end
animMenu = basePanel
animMenuOpen = true
end
-- Блокировка стандартного Context Menu и открытие нашего
hook.Add("OnContextMenuOpen", "AnimationMenuOverride", function()
-- Проверка на Alt+C для администраторов (открывает стандартное меню)
if input.IsKeyDown(KEY_LALT) or input.IsKeyDown(KEY_RALT) then
local client = LocalPlayer()
if IsValid(client) and client:GetCharacter() then
-- Проверка на права администратора
if client:IsAdmin() or client:IsSuperAdmin() then
return -- Пропускаем и открываем стандартное меню
end
end
end
if not animMenuOpen then
CreateAnimationMenu()
end
return false -- Блокируем стандартное меню
end)
-- Закрытие меню при закрытии Context Menu
hook.Add("OnContextMenuClose", "AnimationMenuClose", function()
if animMenuOpen and IsValid(animMenu) then
animMenu:Remove()
animMenuOpen = false
end
end)
-- Подсказка на HUD
--hook.Add("HUDPaint", "AnimationMenuHint", function()
-- if not animMenuOpen then
-- draw.SimpleTextOutlined("C - Открыть меню (анимации + рация)", "DermaDefault", ScrW() - 10, ScrH() - 30, COLOR_TEXT_DIM, TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER, 1, Color(0, 0, 0, 200))
-- end
--end)

View File

@@ -0,0 +1,192 @@
local PLUGIN = PLUGIN
PLUGIN.name = "Animation Context Menu"
PLUGIN.author = "RefoselTeamWork"
PLUGIN.description = "Замена стандартного Context Menu на меню выбора анимаций"
PLUGIN.AnimationTable = {
[1] = {name = "Помахать руками", anim = "rp_wave", loop = false},
[2] = {name = "Помахать рукой", anim = "gesture_wave_original", loop = false},
[3] = {name = "Показать пальцем вперед", anim = "rp_point", loop = false},
[4] = {name = "Показать пальцем назад", anim = "rp_point_back", loop = false},
[5] = {name = "Поправить галстук", anim = "menu_gman", loop = false},
[6] = {name = "Приседания", anim = "rp_sport1_loop", loop = true},
[7] = {name = "Отжимания", anim = "rp_sport2_loop", loop = true},
[8] = {name = "Подъем корпуса", anim = "rp_sport3_loop", loop = true},
[9] = {name = "Берпи", anim = "rp_sport4_loop", loop = true},
[10] = {name = "Стоять злобно", anim = "rp_angry_loop", loop = true},
[11] = {name = "Стоять напуганно", anim = "idle_all_scared", loop = true},
[12] = {name = "Стоять, сложив руки", anim = "pose_standing_01", loop = true},
[13] = {name = "Стоять, руки на поясе", anim = "pose_standing_02", loop = true},
[14] = {name = "Стоять, держась за пояс", anim = "rp_cop_idle", loop = true},
[15] = {name = "Сидеть, рука на колене", anim = "pose_ducking_01", loop = true},
[16] = {name = "Сидеть в позе лотоса", anim = "pose_ducking_02", loop = true},
[17] = {name = "Сидеть в сонном состоянии", anim = "rp_sit_loop", loop = true},
[18] = {name = "Лежать в плохом состоянии", anim = "rp_injured_loop", loop = true},
[19] = {name = "Танец 1", anim = "rp_dance1_loop", loop = true},
[20] = {name = "Танец 2", anim = "rp_dance2_loop", loop = true},
[21] = {name = "Танец 3", anim = "rp_dance3_loop", loop = true},
[23] = {name = "Согласие", anim = "gesture_agree_original", loop = false},
[24] = {name = "Несогласие", anim = "gesture_disagree_original", loop = false},
[25] = {name = "Позвать с собой", anim = "gesture_becon_original", loop = false},
[26] = {name = "Поклониться", anim = "gesture_bow_original", loop = false},
[27] = {name = "Отдать честь", anim = "gesture_salute_original", loop = false},
[28] = {name = "Пить кофе", anim = "rp_drinking", loop = true, prop = {model = "models/props_junk/garbage_coffeemug001a.mdl", spawnfunc = function(mod, ent)
local att = ent:LookupAttachment("anim_attachment_RH")
local lvec = Vector(1,0,1)
timer.Create("WhileThatPropExist"..ent:EntIndex(), 0, 0, function()
if IsValid(mod) then
local tab = ent:GetAttachment(att)
if (tab) then
mod:SetPos(tab.Pos+tab.Ang:Up()*lvec.z+tab.Ang:Right()*lvec.y+tab.Ang:Forward()*lvec.x)
mod:SetAngles(tab.Ang)
end
if !IsValid(ent) or !ent:Alive() then
timer.Remove("WhileThatPropExist"..ent:EntIndex())
mod:Remove()
end
else
timer.Remove("WhileThatPropExist"..ent:EntIndex())
end
end)
end}},
[29] = {name = "Смотреть на объект", anim = "rp_medic_idle", loop = true},
[30] = {name = "Записывать в блокнот", anim = "rp_writing", loop = true, prop = {model = "models/props_lab/clipboard.mdl", spawnfunc = function(mod, ent)
local att = ent:LookupAttachment("anim_attachment_RH")
local lvec = Vector(2,-2,2)
timer.Create("WhileThatPropExist"..ent:EntIndex(), 0, 0, function()
if IsValid(mod) then
local tab = ent:GetAttachment(att)
if (tab) then
mod:SetPos(tab.Pos+tab.Ang:Up()*lvec.z+tab.Ang:Right()*lvec.y+tab.Ang:Forward()*lvec.x)
mod:SetAngles(tab.Ang+Angle(140,0,-100))
end
if !IsValid(ent) or !ent:Alive() then
timer.Remove("WhileThatPropExist"..ent:EntIndex())
mod:Remove()
end
else
timer.Remove("WhileThatPropExist"..ent:EntIndex())
end
end)
end}},
[31] = {name = "Спать", anim = "rp_sleep", loop = true},
[32] = {name = "Воинское приветствие", anim = "rp_salute1", loop = true, loop_stop = true},
[33] = {name = "Танец в присядь", anim = "rp_dance_squat", loop = true},
}
if SERVER then
concommand.Add("rp_set_taunt", function(ply, cmd, args)
local arg = tonumber(args[1])
if arg and arg > 0 and arg <= #PLUGIN.AnimationTable then
local tab = PLUGIN.AnimationTable[arg]
PLUGIN:SetTAnimation(ply, tab.anim, not tab.loop, arg)
end
end)
function PLUGIN:SetTAnimation(ply, anim, autostop, id)
ply:SetNW2String('TauntAnim', anim)
ply:SetNW2Float('TauntID', id)
ply:SetNW2Float('TAnimDelay', select(2, ply:LookupSequence(anim)))
ply:SetNW2Float('TAnimStartTime', CurTime())
ply:SetCycle(0)
local wep = ply:GetActiveWeapon()
if IsValid(wep) and anim != "" then
ply.TauntPreviousWeapon = wep:GetClass()
ply:SetActiveWeapon(nil)
elseif anim == "" and isstring(ply.TauntPreviousWeapon) then
ply:SelectWeapon(ply.TauntPreviousWeapon)
ply.TauntPreviousWeapon = nil
end
if autostop then
local delay = select(2, ply:LookupSequence(anim))
timer.Create("TauntAGRP"..ply:EntIndex(), delay, 1, function()
if not IsValid(ply) then return end
local anim2 = ply:GetNW2String('TauntAnim')
if anim == anim2 then
PLUGIN:SetTAnimation(ply, "")
end
end)
end
end
function PLUGIN:PlayerSwitchWeapon(ply, oldWeapon, newWeapon)
local str = ply:GetNW2String('TauntAnim')
if str != "" then
return true
end
end
function PLUGIN:Think()
for _, ply in ipairs(player.GetAll()) do
local str = ply:GetNW2String('TauntAnim')
if str != "" and (ply:InVehicle() or not ply:Alive() or ply:WaterLevel() >= 2) then
PLUGIN:SetTAnimation(ply, "")
end
end
end
else
CreateConVar("rp_taunt_firstperson", 0, FCVAR_ARCHIVE, "", 0, 1)
CreateConVar("rp_taunt_realistic_firstperson", 0, FCVAR_ARCHIVE, "", 0, 1)
end
function PLUGIN:SetupMove(ply, mvd, cmd)
local str = ply:GetNW2String('TauntAnim')
if str != "" then
mvd:SetMaxSpeed(1)
mvd:SetMaxClientSpeed(1)
if SERVER and ply:KeyDown(IN_SPEED) then
PLUGIN:SetTAnimation(ply, "")
end
end
end
function PLUGIN:CalcMainActivity(ply, vel)
local str = ply:GetNW2String('TauntAnim')
local num = ply:GetNW2Float('TAnimDelay')
local id = ply:GetNW2Float('TauntID')
local st = ply:GetNW2Float('TAnimStartTime')
if str != "" and ply:Alive() then
local ls = PLUGIN.AnimationTable[id] and PLUGIN.AnimationTable[id].loop_stop
if ply:GetCycle() >= 1 then
if not ls then
ply:SetCycle(0)
if SERVER then
ply:SetNW2Float('TAnimStartTime', CurTime())
end
end
else
ply:SetCycle((CurTime()-st)/num)
local tab = PLUGIN.AnimationTable[id] and PLUGIN.AnimationTable[id].prop
if CLIENT and istable(tab) and (not IsValid(ply.TauntProp) or ply.TauntProp:GetModel() != tab.model) then
if IsValid(ply.TauntProp) then
ply.TauntProp:Remove()
end
ply.TauntProp = ClientsideModel(tab.model)
tab.spawnfunc(ply.TauntProp, ply)
elseif CLIENT and not istable(tab) and IsValid(ply.TauntProp) then
ply.TauntProp:Remove()
end
end
return -1, ply:LookupSequence(str)
else
if SERVER then
ply:SetNW2Float('TauntID', 0)
elseif CLIENT and IsValid(ply.TauntProp) then
ply.TauntProp:Remove()
end
end
end
ix.util.Include("cl_plugin.lua")