Initial commit
This commit is contained in:
13
gamemodes/darkrp/gamemode/modules/events/sh_events.lua
Normal file
13
gamemodes/darkrp/gamemode/modules/events/sh_events.lua
Normal file
@@ -0,0 +1,13 @@
|
||||
DarkRP.declareChatCommand{
|
||||
command = "enablestorm",
|
||||
description = "Enable meteor storms.",
|
||||
delay = 1.5,
|
||||
condition = hasCommandsPriv
|
||||
}
|
||||
|
||||
DarkRP.declareChatCommand{
|
||||
command = "disablestorm",
|
||||
description = "Disable meteor storms.",
|
||||
delay = 1.5,
|
||||
condition = hasCommandsPriv
|
||||
}
|
||||
224
gamemodes/darkrp/gamemode/modules/events/sv_events.lua
Normal file
224
gamemodes/darkrp/gamemode/modules/events/sv_events.lua
Normal file
@@ -0,0 +1,224 @@
|
||||
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)
|
||||
Reference in New Issue
Block a user