225 lines
6.5 KiB
Lua
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)
|