xeniux

Untitled

Jul 5th, 2025
55
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.45 KB | None | 0 0
  1. -- donation_interactive.lua
  2. -- Читает файл донатов и вызывает игровые эффекты.
  3.  
  4. local VFS = getFS()
  5. local DONATE_PATH = "donations.txt" -- файл от RutonyChat
  6. local LOG_PATH = "donations_effects.log" -- лог эффектов
  7. local last_line, timer, interval = nil, 0, 5 -- интервал 5 сек
  8.  
  9. -- Список действий: по сумме >= sum — вызвать fn
  10. local actions = {
  11. { sum=20, fn="spawn_dogs" },
  12. { sum=70, fn="spawn_snorks" },
  13. { sum=75, fn="spawn_boars" },
  14. { sum=95, fn="spawn_pseudodogs" },
  15. { sum=130, fn="spawn_psydogs" },
  16. { sum=150, fn="spawn_burers" },
  17. { sum=200, fn="spawn_bloodsuckers" },
  18. { sum=300, fn="spawn_controllers" },
  19. { sum=400, fn="spawn_pseudogigants" },
  20. { sum=750, fn="spawn_fear_hour" },
  21. { sum=65, fn="spawn_zombies" },
  22. { sum=120, fn="spawn_bandit_squad" },
  23. { sum=250, fn="spawn_monolith_squad" },
  24. { sum=110, fn="spawn_loner_squad" },
  25. { sum=235, fn="spawn_anomaly_burner" },
  26. { sum=140, fn="spawn_anomaly_electra" },
  27. { sum=225, fn="spawn_anomaly_mines" },
  28. { sum=21, fn="eat_can" },
  29. { sum=45, fn="heal_full" },
  30. { sum=57, fn="mega_heal" },
  31. { sum=55, fn="drunk_vodka" },
  32. { sum=80, fn="give_money" },
  33. { sum=90, fn="repair_gear" },
  34. { sum=64, fn="give_medkit_pack" },
  35. { sum=40, fn="give_ammo_slots" },
  36. { sum=85, fn="temp_infinite_ammo" },
  37. { sum=47, fn="give_random_artifact" },
  38. { sum=190, fn="kill_nearby" },
  39. { sum=205, fn="swap_primary_weapon" },
  40. { sum=210, fn="swap_armor" },
  41. { sum=255, fn="temp_teleports" },
  42. { sum=124, fn="moon_gravity" },
  43. { sum=145, fn="drunk_cam_effect" },
  44. { sum=101, fn="bag_on_head" },
  45. { sum=60, fn="teleport_random" },
  46. { sum=166, fn="butt_kickers" },
  47. { sum=77, fn="drop_grenade_under" },
  48. { sum=115, fn="shovel_head_hit" },
  49. { sum=125, fn="disable_wasd" },
  50. { sum=230, fn="uranium_pants" },
  51. { sum=330, fn="break_random_inventory" },
  52. { sum=420, fn="steal_all_money" },
  53. { sum=570, fn="steal_all_weapons" },
  54. { sum=550, fn="steal_armor" },
  55. { sum=247, fn="spawn_predator_anomaly" },
  56. { sum=135, fn="pistol_only" },
  57. { sum=335, fn="ban_firearms" },
  58. { sum=1500, fn="steal_everything" },
  59. }
  60.  
  61. -- Запись в лог (VFS)
  62. local function write_log(msg)
  63. local f = VFS:w_open(LOG_PATH)
  64. if not f then return end
  65. f:open_chunk(0)
  66. f:w_stringZ(os.date("%H:%M:%S").." "..msg.."\n")
  67. f:close_chunk()
  68. VFS:w_close(f)
  69. end
  70.  
  71. -- Чтение последней строки из donations.txt
  72. local function read_last_line()
  73. local f = VFS:r_open(DONATE_PATH)
  74. if not f then write_log("ERROR: donations.txt not found"); return nil end
  75. f:open_chunk(0)
  76. local text = f:r_stringZ()
  77. f:close_chunk()
  78. VFS:r_close(f)
  79. if not text or text == "" then return nil end
  80. local last
  81. for line in string.gmatch(text, "[^\r\n]+") do last = line end
  82. return last
  83. end
  84.  
  85. -- Получаем точку на 10м от игрока в случайном направлении
  86. local function get_spawn_pos()
  87. local pos = actor:position()
  88. local angle = math.random() * 2 * math.pi
  89. pos.x = pos.x + math.cos(angle) * 10
  90. pos.z = pos.z + math.sin(angle) * 10
  91. return pos
  92. end
  93.  
  94. -- Удобная обёртка для alife():create
  95. local function spawn(section, count)
  96. local pos = get_spawn_pos()
  97. local lv, gv = actor:level_vertex_id(), actor:game_vertex_id()
  98. for i=1,(count or 1) do
  99. alife():create(section, pos, lv, gv)
  100. end
  101. end
  102.  
  103. --[[
  104. Определяем все функции-эффекты:
  105. spawn_dogs, spawn_snorks, ..., steal_everything
  106. Ниже — примеры нескольких, остальные аналогично.
  107. ]]
  108. function spawn_dogs() spawn("monster_dog", 2); write_log("spawn_dogs") end
  109. function spawn_snorks() spawn("monster_snork", 2); write_log("spawn_snorks") end
  110. function spawn_boars() spawn("monster_boar", 3); write_log("spawn_boars") end
  111. function spawn_pseudodogs() spawn("monster_pseudodog", 3); write_log("spawn_pseudodogs") end
  112. function spawn_psydogs() spawn("monster_pseudodog", 2); write_log("spawn_psydogs") end
  113. function spawn_burers() spawn("monster_burer", 2); write_log("spawn_burers") end
  114. function spawn_bloodsuckers() spawn("monster_bloodsucker",2); write_log("spawn_bloodsuckers") end
  115. function spawn_controllers() spawn("monster_controller", 1); write_log("spawn_controllers") end
  116. function spawn_pseudogigants() spawn("monster_giant", 2); write_log("spawn_pseudogigants") end
  117. function spawn_fear_hour()
  118. for i=1,10 do local m={"monster_snork","monster_bloodsucker","monster_controller","monster_burer"}
  119. spawn(m[math.random(#m)],1)
  120. end
  121. write_log("spawn_fear_hour")
  122. end
  123.  
  124. function spawn_zombies() spawn("stalker_zombied", 4); write_log("spawn_zombies") end
  125. function spawn_bandit_squad() spawn("stalker_bandit", 4); write_log("spawn_bandit_squad") end
  126. function spawn_monolith_squad() spawn("stalker_monolith", 4); write_log("spawn_monolith_squad") end
  127. function spawn_loner_squad() spawn("stalker_loner", 4); write_log("spawn_loner_squad") end
  128.  
  129. function spawn_anomaly_burner() spawn("anomaly_thermic", 1); write_log("spawn_anomaly_burner") end
  130. function spawn_anomaly_electra() spawn("anomaly_electra", 1); write_log("spawn_anomaly_electra") end
  131. function spawn_anomaly_mines() spawn("anomaly_mine", 1); write_log("spawn_anomaly_mines") end
  132.  
  133. function eat_can() db.actor:object():conditions():set_satiety(1); write_log("eat_can") end
  134. function heal_full() db.actor:object():set_health(1.0); write_log("heal_full") end
  135. function mega_heal() db.actor:object():set_wound_heal(true); write_log("mega_heal") end
  136. function drunk_vodka() db.actor:object():conditions():set_radiation(1); write_log("drunk_vodka") end
  137. function give_money() db.actor:object():set_money(math.random(1,50000)); write_log("give_money") end
  138. function repair_gear()
  139. for _,itm in ipairs(db.actor:inventory():get_all()) do itm:set_condition(1.0) end
  140. write_log("repair_gear")
  141. end
  142.  
  143. function give_medkit_pack() spawn("first_aid_kit",5); write_log("give_medkit_pack") end
  144. function give_ammo_slots()
  145. local w = actor:get_wpn_slot(0) if w then w:add_ammo(30) end
  146. write_log("give_ammo_slots")
  147. end
  148. function temp_infinite_ammo()
  149. db.actor:object():conditions():set_infinite_ammo(true,60); write_log("temp_infinite_ammo")
  150. end
  151. function give_random_artifact() spawn("artifact_random",1); write_log("give_random_artifact") end
  152. function kill_nearby()
  153. for _,o in ipairs(level:get_objects_in_radius(150,{"npc","ai"})) do
  154. o:object():hit(actor, o:position(), 9999, "explosion_hit")
  155. end
  156. write_log("kill_nearby")
  157. end
  158.  
  159. function swap_primary_weapon()
  160. actor:inventory():drop_active_weapon()
  161. spawn("wpn_ak74",1); write_log("swap_primary_weapon")
  162. end
  163. function swap_armor()
  164. actor:drop_armor()
  165. spawn("outfit_cschelic",1); write_log("swap_armor")
  166. end
  167.  
  168. function temp_teleports()
  169. for i=1,3 do actor:teleport(get_spawn_pos()) end
  170. write_log("temp_teleports")
  171. end
  172. function moon_gravity()
  173. level:set_gravity(0.15); _G._moon_timer=60; write_log("moon_gravity") end
  174. function drunk_cam_effect()
  175. _G._drunk_time=180; write_log("drunk_cam_effect") end
  176. function bag_on_head()
  177. spawn("misc\\bag",1); write_log("bag_on_head") end
  178. function teleport_random()
  179. actor:teleport(level:get_random_point()); write_log("teleport_random") end
  180. function butt_kickers()
  181. actor:apply_force(actor:position(), vector(0,1,0)*500); write_log("butt_kickers") end
  182. function drop_grenade_under()
  183. spawn("wpn_rgd5",1); write_log("drop_grenade_under") end
  184. function shovel_head_hit()
  185. db.actor:object():set_health(0.01); write_log("shovel_head_hit") end
  186. function disable_wasd()
  187. level:disable_input({"move_forward","move_back","move_left","move_right"},60)
  188. write_log("disable_wasd")
  189. end
  190. function uranium_pants()
  191. _G._uranium_time=120; write_log("uranium_pants") end
  192. function break_random_inventory()
  193. for _,itm in ipairs(db.actor:inventory():get_all()) do
  194. itm:set_condition(math.random())
  195. end
  196. write_log("break_random_inventory")
  197. end
  198. function steal_all_money() db.actor:object():set_money(1); write_log("steal_all_money") end
  199. function steal_all_weapons() actor:drop_all_weapons(); write_log("steal_all_weapons") end
  200. function steal_armor() actor:drop_armor(); write_log("steal_armor") end
  201. function spawn_predator_anomaly() spawn("anomaly_gravi",1); write_log("spawn_predator_anomaly") end
  202. function pistol_only()
  203. actor:drop_all_weapons_except("wpn_pistol"); write_log("pistol_only") end
  204. function ban_firearms()
  205. level:disable_input({"fire"},60); write_log("ban_firearms") end
  206. function steal_everything()
  207. actor:inventory():clear_except_story(); write_log("steal_everything") end
  208.  
  209. -- Update dt: проверка файла и таймеры
  210. function Update(dt)
  211. -- таймеры временных эффектов
  212. if _G._moon_timer then _G._moon_timer=_G._moon_timer-dt
  213. if _G._moon_timer<=0 then level:set_gravity(1.0); _G._moon_timer=nil end
  214. end
  215. if _G._drunk_time then _G._drunk_time=_G._drunk_time-dt
  216. if _G._drunk_time<=0 then _G._drunk_time=nil end
  217. end
  218. if _G._uranium_time then _G._uranium_time=_G._uranium_time-dt
  219. if _G._uranium_time<=0 then _G._uranium_time=nil end
  220. end
  221.  
  222. -- проверка лог-файла каждые interval
  223. timer = timer + dt
  224. if timer < interval then return end
  225. timer = 0
  226.  
  227. local line = read_last_line()
  228. if not line or line == last_line then return end
  229. last_line = line
  230.  
  231. local amt = tonumber(string.match(line, "(%d+%.?%d*)"))
  232. if not amt then write_log("Invalid line: "..line); return end
  233.  
  234. for _,act in ipairs(actions) do
  235. if amt >= act.sum then
  236. local fn = _G[act.fn]
  237. if fn then
  238. local ok,err = pcall(fn)
  239. if not ok then write_log("Error "..act.fn..": "..err) end
  240. else
  241. write_log("Missing func: "..act.fn)
  242. end
  243. break
  244. end
  245. end
  246. end
  247.  
Add Comment
Please, Sign In to add comment