Files
Dota-Zombie-Invasion/scripts/vscripts/chat_wheel_grant.lua
T
achmad 72b73c4dd6 feat: replace CreateHTTPRequest with CreateHTTPRequestScriptVM
Allows the game client to make HTTP API calls from a listen server
(local lobby) instead of requiring a Steam dedicated server.
CreateHTTPRequestScriptVM has the exact same API signature but works
in both dedicated server and listen server contexts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-05-29 17:36:08 +07:00

112 lines
7.5 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
local ____lualib = require("lualib_bundle")
local __TS__ObjectEntries = ____lualib.__TS__ObjectEntries
local ____exports = {}
local ____player_info = require("player_info")
local PlayerInfo = ____player_info.PlayerInfo
local ____server_config = require("server_config")
local SERVER_CONFIG = ____server_config.SERVER_CONFIG
local ____api_helper = require("api_helper")
local setApiHeaders = ____api_helper.setApiHeaders
--- Ключ — sound_id (без префикса chat_wheel_sound_)
____exports.CHAT_WHEEL_SOUND_GRANT_META = {
agent_gabena = {name = "Агент Габена", sound = "agent_gabena", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
cat_shnapy = {name = "Шни шна...", sound = "cat_shnapy", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/cat_shnapy.webm"},
get_out = {name = "GET OUT", sound = "get_out", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
ura_pobeda = {name = "Ура победа", sound = "ura_pobeda", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
byd_dobr_idi = {name = "Будь добр, иди..", sound = "byd_dobr_idi", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
jump = {name = "Прыгай дура!", sound = "jump", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/jump.webm"},
oi_tak_nravitsa = {name = "Ой, так нравится", sound = "oi_tak_nravitsa", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/oi_tak_nravitsa.webm"},
ne_ponimaiu_karina_strimersha_slozhno_slozhno = {name = "Ничего не понимаю (Карина, «сложно-сложно»)", sound = "ne_ponimaiu_karina_strimersha_slozhno_slozhno", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/ne_ponimaiu_karina_strimersha_slozhno_slozhno.webm"},
kitty_flex = {name = "Китти флекс", sound = "kitty_flex", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/kitty_flex.webm"},
eblo_razraba = {name = "Ебло разработчика", sound = "eblo_razraba", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/eblo_razraba.webm"},
kuda = {name = "Куда", sound = "kuda", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
bruh = {name = "Bruh", sound = "bruh", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
shizofreniya = {name = "Шизофрения", sound = "shizofreniya", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
vot_eto_povorot = {name = "Вот это поворот", sound = "vot_eto_povorot", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
fbi_open_up = {name = "FBI open up", sound = "fbi_open_up", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
nepravilno_poprobuy_esche_raz = {name = "Неправильно, попробуй ещё раз", sound = "nepravilno_poprobuy_esche_raz", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
dobro_pozhalovat_na_server_shizofreniya = {name = "Добро пожаловать на сервер шизофрении", sound = "dobro_pozhalovat_na_server_shizofreniya", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
nya = {name = "Ня", sound = "nya", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
na_nas_napali = {name = "На нас напали", sound = "na_nas_napali", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
murlok = {name = "Мурлок", sound = "murlok", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
kak_zhit_to_a = {name = "Как жить-то а", sound = "kak_zhit_to_a", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex"},
zaika = {name = "Зайка", sound = "zaika", icon = "s2r://panorama/images/chat_wheel/chat_wheel_icon_png.vtex", video = "file://{images}/custom_game/zaika.webm"}
}
--- Webm для чата, если в sounds_wheel нет поля video (бэкенд/API отрезал или старые записи).
-- Ключ — имя звукового события (поле sound в колесе / invasion_sounds).
function ____exports.getChatWheelVideoPathForSound(self, sound)
if not sound or sound == "" then
return nil
end
for ____, ____value in ipairs(__TS__ObjectEntries(____exports.CHAT_WHEEL_SOUND_GRANT_META)) do
local id = ____value[1]
local meta = ____value[2]
local key = meta.sound and meta.sound ~= "" and meta.sound or id
if key == sound or id == sound then
local v = meta.video or meta.video_path
if v and #v > 0 then
return v
end
end
end
return nil
end
local function saveSoundsWheelToServer(self, playerId, soundsWheel)
local steamId = PlayerResource:GetSteamAccountID(playerId)
if not steamId then
return
end
local request = CreateHTTPRequestScriptVM(
"PUT",
((SERVER_CONFIG.API_URL .. "/player/") .. tostring(steamId)) .. "/sounds_wheel"
)
setApiHeaders(nil, request)
request:SetHTTPRequestRawPostBody(
"application/json",
json.encode({sounds_wheel = soundsWheel})
)
request:Send(function(result)
if result.StatusCode >= 200 and result.StatusCode < 300 then
print("[CHAT_WHEEL_GRANT] sounds_wheel сохранён для игрока " .. tostring(playerId))
else
print("[CHAT_WHEEL_GRANT] Ошибка сохранения sounds_wheel: StatusCode=" .. tostring(result.StatusCode))
end
end)
end
--- Выдать звук чат-колеса (Battle Pass / акция); валюту не списывает.
function ____exports.grantChatWheelSoundFromBattlePass(self, playerId, soundId)
local meta = ____exports.CHAT_WHEEL_SOUND_GRANT_META[soundId]
if not meta then
print(("[CHAT_WHEEL_GRANT] Нет метаданных для sound_id=" .. soundId) .. ", используем fallback")
end
local playerInfoData = PlayerInfo:GetPlayerInfo(playerId)
if not playerInfoData then
playerInfoData = {}
end
local soundsWheel = playerInfoData.sounds_wheel or ({})
if soundsWheel[soundId] then
print((("[CHAT_WHEEL_GRANT] Звук " .. soundId) .. " уже есть у игрока ") .. tostring(playerId))
return
end
if not playerInfoData.sounds_wheel then
playerInfoData.sounds_wheel = {}
end
local soundToSave = meta and meta.sound and meta.sound ~= "" and meta.sound or soundId
local webm = meta and meta.video or meta and meta.video_path
playerInfoData.sounds_wheel[soundId] = {
name = meta and meta.name or soundId,
type = "sound",
sellPrice = 0,
sound = soundToSave,
icon = meta and meta.icon,
video = webm,
video_path = webm
}
PlayerInfo:UpdatePlayerInfo(playerId, playerInfoData)
saveSoundsWheelToServer(nil, playerId, playerInfoData.sounds_wheel)
local storeModule = require("store_manager")
storeModule.StoreManager:getInstance():registerChatWheelSoundFromBattlePass(playerId, soundId)
print((("[CHAT_WHEEL_GRANT] Выдан звук " .. soundId) .. " игроку ") .. tostring(playerId))
end
return ____exports