dobrograd-13-06-2022/garrysmod/addons/feature-cars/lua/car-dealer/sv_hooks.lua

144 lines
3.6 KiB
Lua
Raw Normal View History

2023-11-16 15:01:19 +05:00
hook.Add('PlayerInitialSpawn', 'car-dealer', function(ply)
timer.Simple(15, function()
if not IsValid(ply) then return end
carDealer.sync(ply)
for _, ent in ipairs(ents.FindByClass('gmod_sent_vehicle_fphysics_base')) do
if ent:CPPIGetOwner() == ply then
simfphys.SetOwner(ply, ent)
carDealer.setCurVeh(ply, ent)
break
end
end
end)
timer.Remove('storeVehicle_' .. ply:SteamID())
end)
hook.Add('PlayerDisconnected', 'car-dealer', function(ply)
local veh = carDealer.getCurVeh(ply)
if not IsValid(veh) then return end
if not veh.deposit then
timer.Create('storeVehicle_' .. ply:SteamID(), 10 * 60, 1, function()
carDealer.storeVeh(veh)
end)
ply:SetDBVar('nextCar', os.time() + 10 * 60 + 30)
else
carDealer.storeVeh(veh)
end
end)
hook.Add('EntityRemoved', 'car-dealer', function(ent)
if ent:GetClass() ~= 'gmod_sent_vehicle_fphysics_base' then return end
if ent.deposit then
carDealer.returnDeposit(ent)
else
carDealer.saveVeh(ent)
end
local ply = carDealer.getOwner(ent)
if not IsValid(ply) then return end
ply:SetNetVar('cd.vehicle')
ply:SetLocalVar('cd.vehID')
ply:SetLocalVar('cd.vehName')
carDealer.sync(ply)
carDealer.clearMarkers(ply)
end)
local idleTime = 20
local function someoneInside(veh)
for _, v in ipairs(veh:GetChildren()) do
if v:GetClass() ~= 'prop_vehicle_prisoner_pod' then continue end
local dr = v:GetDriver()
if IsValid(dr) and not dr:IsAFK() then return true end
end
return false
end
timer.Create('octocars.removeIdle', 60, 0, function()
local ct = CurTime()
local vehs = ents.FindByClass('gmod_sent_vehicle_fphysics_base')
for _, veh in ipairs(vehs) do
if veh.doNotEvacuate and not veh.idleScore then continue end
if someoneInside(veh) then continue end
local pos = veh:GetPos()
if veh.idleLastPos then
local moved = false
if veh.idleLastPos:DistToSqr(pos) < 10 then
veh.idleScore = (veh.idleScore or 0) + 1
else
if veh.doNotEvacuate then
veh.idleScore = nil
continue
end
veh.idleScore = math.max((veh.idleScore or 0) - 3, 0)
moved = true
end
local ply = carDealer.getOwner(veh) or veh:CPPIGetOwner()
if veh.idleScore >= idleTime then
if ct < (veh.despawnAfter or 0) then return end
carDealer.storeVeh(veh)
if IsValid(ply) then
ply:Notify(L.car_evacuated)
end
continue
elseif veh.idleScore == idleTime - 5 and IsValid(ply) and not moved then
ply:Notify(L.car_evacuate)
end
end
veh.idleLastPos = pos
end
end)
hook.Add('OnPlayerChangedTeam', 'car-dealer.refresh', function(ply, old, new)
local block = false
local cp = GAMEMODE.CivilProtection
if cp then block = cp[new] end
if RPExtraTeams[new].hobo then
block = true
end
ply:SetLocalVar('cd.noPrivate', block)
carDealer.sync(ply)
if new == TEAM_ADMIN then return end
local curVeh = carDealer.getCurVeh(ply)
if IsValid(curVeh) then
if not carDealer.canUse(ply, curVeh.cdClass) then
timer.Create('storeVehicle_' .. ply:SteamID(), 5 * 60, 1, function()
carDealer.storeVeh(curVeh)
carDealer.notify(ply, 'warning', L.car_in_garage_unaivaible)
end)
return
end
if cp and cp[old] ~= cp[new] and new ~= TEAM_ADMIN and old ~= TEAM_ADMIN then
carDealer.storeVeh(curVeh)
carDealer.notify(ply, 'warning', cp[old] and L.your_service_car_evacuated or L.your_car_evacuated)
elseif RPExtraTeams[new].hobo then
carDealer.storeVeh(curVeh)
carDealer.notify(ply, 'warning', L.your_car_evacuated)
end
end
end)
hook.Add('playerSellVehicle', 'car-dealer', function()
return false, 'Автомобиль можно продать только у дилера'
end)