xeniux

Untitled

Jul 6th, 2025
41
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.72 KB | None | 0 0
  1. -- donation_interactive.lua
  2. -- Простой интерактив донатов для OGSR/X-Ray
  3. -- Прописать в gamedata\scripts\donation_interactive.lua
  4.  
  5. local io, os, math = io, os, math
  6. local actor, level, alife = actor, level, alife
  7. local vector = vector
  8. local timer, interval = 0, 5
  9. local last_line = ""
  10.  
  11. -- Путь к файлам (в корне папки bin_x64)
  12. local DONATE_PATH = "donations.txt"
  13. local LOG_PATH = "donations_effects.log"
  14.  
  15. -- Список действий: при сумме ≥ sum вызываем fn
  16. local actions = {
  17. { sum=20, fn="spawn_dogs" },
  18. { sum=45, fn="heal_full" },
  19. { sum=80, fn="give_money" },
  20. { sum=124, fn="moon_gravity" },
  21. { sum=150, fn="spawn_burers" },
  22. { sum=230, fn="uranium_pants" },
  23. { sum=300, fn="spawn_controllers" },
  24. { sum=420, fn="steal_all_money" },
  25. { sum=570, fn="steal_all_weapons" },
  26. { sum=750, fn="spawn_fear_hour" },
  27. { sum=1500,fn="steal_everything" },
  28. }
  29.  
  30. -- Запись в лог
  31. local function write_log(msg)
  32. local f = io.open(LOG_PATH, "a+")
  33. if f then
  34. f:write(os.date("%H:%M:%S ") .. msg .. "\n")
  35. f:close()
  36. end
  37. end
  38.  
  39. -- Чтение последней строки из donations.txt
  40. local function read_last_line()
  41. local f = io.open(DONATE_PATH, "r")
  42. if not f then
  43. write_log("ERROR: donations.txt not found")
  44. return nil
  45. end
  46. local last
  47. for line in f:lines() do last = line end
  48. f:close()
  49. return last
  50. end
  51.  
  52. -- Позиция в радиусе 10 м от игрока
  53. local function get_spawn_pos()
  54. local p = actor:position()
  55. local a = math.random() * 2 * math.pi
  56. return {
  57. x = p.x + math.cos(a)*10,
  58. y = p.y,
  59. z = p.z + math.sin(a)*10
  60. }
  61. end
  62.  
  63. -- Удобный spawn
  64. local function spawn(section, count)
  65. local pos = get_spawn_pos()
  66. local lv, gv = actor:level_vertex_id(), actor:game_vertex_id()
  67. for i=1,(count or 1) do
  68. alife():create(section, pos, lv, gv)
  69. end
  70. end
  71.  
  72. -- === эффекты ===
  73. function spawn_dogs() spawn("monster_dog",2); write_log("spawn_dogs") end
  74. function spawn_burers() spawn("monster_burer",2); write_log("spawn_burers") end
  75. function spawn_controllers() spawn("monster_controller",1); write_log("spawn_controllers") end
  76. function spawn_fear_hour()
  77. local types = {"monster_snork","monster_bloodsucker","monster_controller","monster_burer"}
  78. for i=1,10 do
  79. spawn(types[math.random(#types)],1)
  80. end
  81. write_log("spawn_fear_hour")
  82. end
  83.  
  84. function heal_full() actor:object():set_health(1.0); write_log("heal_full") end
  85. function give_money() actor:object():set_money(math.random(100,5000)); write_log("give_money") end
  86. function steal_all_money() actor:object():set_money(1); write_log("steal_all_money") end
  87. function steal_all_weapons() actor:drop_all_weapons(); write_log("steal_all_weapons") end
  88. function steal_everything() actor:inventory():clear_except_story(); write_log("steal_everything") end
  89.  
  90. function moon_gravity()
  91. level:set_gravity(0.15)
  92. _G._moon_timer = 60
  93. write_log("moon_gravity")
  94. end
  95.  
  96. function uranium_pants()
  97. _G._uranium_time = 120
  98. write_log("uranium_pants")
  99. end
  100.  
  101. -- === основной Update ===
  102. donation_interactive = {}
  103.  
  104. function donation_interactive.Update(dt)
  105. -- пишем тик
  106. write_log("[DONATION] tick")
  107.  
  108. -- таймеры возврата эффектов
  109. if _G._moon_timer then
  110. _G._moon_timer = _G._moon_timer - dt
  111. if _G._moon_timer <= 0 then
  112. level:set_gravity(1.0)
  113. _G._moon_timer = nil
  114. end
  115. end
  116. if _G._uranium_time then
  117. _G._uranium_time = _G._uranium_time - dt
  118. if _G._uranium_time <= 0 then _G._uranium_time = nil end
  119. end
  120.  
  121. -- проверяем файл раз в interval секунд
  122. timer = timer + dt
  123. if timer < interval then return end
  124. timer = 0
  125.  
  126. local line = read_last_line()
  127. if not line or line == last_line then return end
  128. last_line = line
  129.  
  130. local amt = tonumber(line:match("(%d+%.?%d*)"))
  131. if not amt then
  132. write_log("Invalid line: " .. line)
  133. return
  134. end
  135.  
  136. for _,act in ipairs(actions) do
  137. if amt >= act.sum then
  138. local fn = _G[act.fn]
  139. if fn then
  140. local ok, err = pcall(fn)
  141. if not ok then write_log("Error " .. act.fn .. ": " .. err) end
  142. else
  143. write_log("Missing func: " .. act.fn)
  144. end
  145. break
  146. end
  147. end
  148. end
  149.  
  150. -- === подписка на кадры ===
  151. if core and core.register_callback then
  152. core.register_callback("pureFrame", donation_interactive.Update)
  153. else
  154. write_log("WARN: core.register_callback not found, интерактив не запустится")
  155. end
  156.  
  157. return donation_interactive
  158.  
Advertisement
Add Comment
Please, Sign In to add comment