Files
mmkrp_2026/gamemodes/darkrp/gamemode/modules/events/sv_events.lua
2026-03-15 14:54:49 +03:00

225 lines
6.5 KiB
Lua

resource.AddFile("sound/earthquake.mp3")
util.PrecacheSound("earthquake.mp3")
--[[---------------------------------------------------------
Variables
---------------------------------------------------------]]
local timeLeft = 10
local stormOn = false
--[[---------------------------------------------------------
Meteor storm
---------------------------------------------------------]]
local function StormStart()
local phrase = DarkRP.getPhrase("meteor_approaching")
for _, v in ipairs(player.GetAll()) do
if v:Alive() then
v:PrintMessage(HUD_PRINTCENTER, phrase)
v:PrintMessage(HUD_PRINTTALK, phrase)
end
end
end
local function StormEnd()
local phrase = DarkRP.getPhrase("meteor_passing")
for _, v in ipairs(player.GetAll()) do
if v:Alive() then
v:PrintMessage(HUD_PRINTCENTER, phrase)
v:PrintMessage(HUD_PRINTTALK, phrase)
end
end
end
local function ControlStorm()
timeLeft = timeLeft - 1
if timeLeft < 1 then
if stormOn then
timeLeft = math.random(300, 500)
stormOn = false
timer.Stop("start")
StormEnd()
else
timeLeft = math.random(60, 90)
stormOn = true
timer.Start("start")
StormStart()
end
end
end
local function AttackEnt(ent)
local meteor = ents.Create("meteor")
meteor.nodupe = true
meteor:Spawn()
meteor:SetMeteorTarget(ent)
end
local function StartShower()
timer.Adjust("start", math.random(0.1, 1), 0, StartShower)
for _, v in ipairs(player.GetAll()) do
if math.random(0, 2) == 0 and v:Alive() then
AttackEnt(v)
end
end
end
local function StartStorm(ply)
timer.Start("stormControl")
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("meteor_enabled"))
end
DarkRP.definePrivilegedChatCommand("enablestorm", "DarkRP_AdminCommands", StartStorm)
local function StopStorm(ply)
timer.Stop("stormControl")
stormOn = false
timer.Stop("start")
StormEnd()
DarkRP.notify(ply, 0, 4, DarkRP.getPhrase("meteor_disabled"))
end
DarkRP.definePrivilegedChatCommand("disablestorm", "DarkRP_AdminCommands", StopStorm)
timer.Create("start", 1, 0, StartShower)
timer.Create("stormControl", 1, 0, ControlStorm)
timer.Stop("start")
timer.Stop("stormControl")
--[[---------------------------------------------------------
Earthquake
---------------------------------------------------------]]
local lastmagnitudes = {} -- The magnitudes of the last tremors
local tremor
local function createTremor()
tremor = ents.Create("env_physexplosion")
tremor:SetPos(Vector(0, 0, 0))
tremor:SetKeyValue("radius", 9999999999)
tremor:SetKeyValue("spawnflags", 7)
tremor.nodupe = true
tremor:Spawn()
end
hook.Add("PostCleanupMap", "DarkRP_events", createTremor)
hook.Add("InitPostEntity", "DarkRP_SetupTremor", function()
createTremor()
end)
local function TremorReport()
local mag = table.remove(lastmagnitudes, 1)
if mag then
if mag < 6.5 then
DarkRP.notifyAll(0, 3, DarkRP.getPhrase("earthtremor_report", tostring(mag)))
return
end
DarkRP.notifyAll(0, 3, DarkRP.getPhrase("earthquake_report", tostring(mag)))
end
end
local function EarthQuakeTest()
if not GAMEMODE.Config.earthquakes then return end
if GAMEMODE.Config.quakechance and math.random(0, GAMEMODE.Config.quakechance) < 1 then
local en = ents.FindByClass("prop_physics")
local plys = player.GetAll()
local force = math.random(10, 1000)
tremor:SetKeyValue("magnitude", force / 6)
for _, v in ipairs(plys) do
v:EmitSound("earthquake.mp3", force / 6, 100)
end
tremor:Fire("explode","",0.5)
util.ScreenShake(Vector(0, 0, 0), force, math.random(25, 50), math.random(5, 12), 9999999999)
table.insert(lastmagnitudes, math.floor((force / 10) + .5) / 10)
timer.Simple(10, function() TremorReport() end)
for _, e in ipairs(en) do
local rand = math.random(650, 1000)
if rand < force and rand % 2 == 0 then
e:Fire("enablemotion", "", 0)
constraint.RemoveAll(e)
end
if e:IsOnGround() then
e:TakeDamage((force / 100) + 15, game.GetWorld())
end
end
end
end
timer.Create("EarthquakeTest", 1, 0, EarthQuakeTest)
--[[---------------------------------------------------------
Flammable
---------------------------------------------------------]]
-- Class names as index
local flammablePropsKV = {
drug = true,
drug_lab = true,
food = true,
gunlab = true,
letter = true,
microwave = true,
money_printer = true,
spawned_shipment = true,
spawned_weapon = true,
spawned_money = true
}
local flammableProps = {} -- Numbers as index
for k in pairs(flammablePropsKV) do table.insert(flammableProps, k) end
local function IsFlammable(ent)
return flammablePropsKV[ent:GetClass()] ~= nil
end
-- FireSpread from SeriousRP
local function FireSpread(ent, chanceDiv)
if not ent:IsOnFire() then return end
if ent:isMoneyBag() then
ent:Remove()
end
local rand = math.random(0, 300 / chanceDiv)
if rand > 1 then return end
local en = ents.FindInSphere(ent:GetPos(), math.random(20, 90))
for _, v in ipairs(en) do
if not IsFlammable(v) or v == ent then continue end
if not v.burned then
v:Ignite(math.random(5,180), 0)
v.burned = true
break -- Don't ignite all entities in sphere at once, just one at a time
end
local color = v:GetColor()
if (color.r - 51) >= 0 then color.r = color.r - 51 end
if (color.g - 51) >= 0 then color.g = color.g - 51 end
if (color.b - 51) >= 0 then color.b = color.b - 51 end
v:SetColor(color)
if (color.r + color.g + color.b) < 103 and math.random(1, 100) < 35 then
v:Fire("enablemotion", "", 0)
constraint.RemoveAll(v)
end
end
end
local function FlammablePropThink()
local class = flammableProps[math.random(#flammableProps)]
local entities = ents.FindByClass(class)
local ent = entities[math.random(#entities)]
if class ~= "letter" then return end
if not ent then return end
-- The amount of classes and the amount of entities in a class
-- affect the chance of fire spreading. This should be minimized.
FireSpread(ent, #entities * #flammableProps)
end
timer.Create("FlammableProps", 0.1, 0, FlammablePropThink)