Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- donation_interactive.lua
- -- Простой интерактив донатов для OGSR/X-Ray
- -- Прописать в gamedata\scripts\donation_interactive.lua
- local io, os, math = io, os, math
- local actor, level, alife = actor, level, alife
- local vector = vector
- local timer, interval = 0, 5
- local last_line = ""
- -- Путь к файлам (в корне папки bin_x64)
- local DONATE_PATH = "donations.txt"
- local LOG_PATH = "donations_effects.log"
- -- Список действий: при сумме ≥ sum вызываем fn
- local actions = {
- { sum=20, fn="spawn_dogs" },
- { sum=45, fn="heal_full" },
- { sum=80, fn="give_money" },
- { sum=124, fn="moon_gravity" },
- { sum=150, fn="spawn_burers" },
- { sum=230, fn="uranium_pants" },
- { sum=300, fn="spawn_controllers" },
- { sum=420, fn="steal_all_money" },
- { sum=570, fn="steal_all_weapons" },
- { sum=750, fn="spawn_fear_hour" },
- { sum=1500,fn="steal_everything" },
- }
- -- Запись в лог
- local function write_log(msg)
- local f = io.open(LOG_PATH, "a+")
- if f then
- f:write(os.date("%H:%M:%S ") .. msg .. "\n")
- f:close()
- end
- end
- -- Чтение последней строки из donations.txt
- local function read_last_line()
- local f = io.open(DONATE_PATH, "r")
- if not f then
- write_log("ERROR: donations.txt not found")
- return nil
- end
- local last
- for line in f:lines() do last = line end
- f:close()
- return last
- end
- -- Позиция в радиусе 10 м от игрока
- local function get_spawn_pos()
- local p = actor:position()
- local a = math.random() * 2 * math.pi
- return {
- x = p.x + math.cos(a)*10,
- y = p.y,
- z = p.z + math.sin(a)*10
- }
- end
- -- Удобный spawn
- local function spawn(section, count)
- local pos = get_spawn_pos()
- local lv, gv = actor:level_vertex_id(), actor:game_vertex_id()
- for i=1,(count or 1) do
- alife():create(section, pos, lv, gv)
- end
- end
- -- === эффекты ===
- function spawn_dogs() spawn("monster_dog",2); write_log("spawn_dogs") end
- function spawn_burers() spawn("monster_burer",2); write_log("spawn_burers") end
- function spawn_controllers() spawn("monster_controller",1); write_log("spawn_controllers") end
- function spawn_fear_hour()
- local types = {"monster_snork","monster_bloodsucker","monster_controller","monster_burer"}
- for i=1,10 do
- spawn(types[math.random(#types)],1)
- end
- write_log("spawn_fear_hour")
- end
- function heal_full() actor:object():set_health(1.0); write_log("heal_full") end
- function give_money() actor:object():set_money(math.random(100,5000)); write_log("give_money") end
- function steal_all_money() actor:object():set_money(1); write_log("steal_all_money") end
- function steal_all_weapons() actor:drop_all_weapons(); write_log("steal_all_weapons") end
- function steal_everything() actor:inventory():clear_except_story(); write_log("steal_everything") end
- function moon_gravity()
- level:set_gravity(0.15)
- _G._moon_timer = 60
- write_log("moon_gravity")
- end
- function uranium_pants()
- _G._uranium_time = 120
- write_log("uranium_pants")
- end
- -- === основной Update ===
- donation_interactive = {}
- function donation_interactive.Update(dt)
- -- пишем тик
- write_log("[DONATION] tick")
- -- таймеры возврата эффектов
- if _G._moon_timer then
- _G._moon_timer = _G._moon_timer - dt
- if _G._moon_timer <= 0 then
- level:set_gravity(1.0)
- _G._moon_timer = nil
- end
- end
- if _G._uranium_time then
- _G._uranium_time = _G._uranium_time - dt
- if _G._uranium_time <= 0 then _G._uranium_time = nil end
- end
- -- проверяем файл раз в interval секунд
- timer = timer + dt
- if timer < interval then return end
- timer = 0
- local line = read_last_line()
- if not line or line == last_line then return end
- last_line = line
- local amt = tonumber(line:match("(%d+%.?%d*)"))
- if not amt then
- write_log("Invalid line: " .. line)
- return
- end
- for _,act in ipairs(actions) do
- if amt >= act.sum then
- local fn = _G[act.fn]
- if fn then
- local ok, err = pcall(fn)
- if not ok then write_log("Error " .. act.fn .. ": " .. err) end
- else
- write_log("Missing func: " .. act.fn)
- end
- break
- end
- end
- end
- -- === подписка на кадры ===
- if core and core.register_callback then
- core.register_callback("pureFrame", donation_interactive.Update)
- else
- write_log("WARN: core.register_callback not found, интерактив не запустится")
- end
- return donation_interactive
Advertisement
Add Comment
Please, Sign In to add comment