add sborka
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
local PLUGIN = PLUGIN
|
||||
|
||||
-- Клиентская часть HUD
|
||||
net.Receive("ParachuteState", function()
|
||||
local state = net.ReadBool()
|
||||
LocalPlayer().Parachuting = state
|
||||
|
||||
if state then
|
||||
-- Запуск звука полёта
|
||||
if LoopingSound then
|
||||
LoopingSound:Stop()
|
||||
end
|
||||
|
||||
LoopingSound = CreateSound(LocalPlayer(), "v92/bf2/vehicles/air/parachute/parachute_ride_loop.wav")
|
||||
LoopingSound:PlayEx(ix.config.Get("parachuteVolume", 0.7), 100)
|
||||
else
|
||||
-- Остановка звука
|
||||
if LoopingSound then
|
||||
LoopingSound:Stop()
|
||||
end
|
||||
end
|
||||
end)
|
||||
|
||||
function PLUGIN:HUDPaint()
|
||||
local client = LocalPlayer()
|
||||
if not client:Alive() or not IsValid(client) then return end
|
||||
if not IsValid(client:GetActiveWeapon()) then return end
|
||||
if client:GetActiveWeapon():GetClass() ~= "parachute_swep" then return end
|
||||
|
||||
local reload_time = ix.config.Get("parachuteReloadTime", 20)
|
||||
local width = ScrW() * 0.15
|
||||
local height = ScrH() * 0.03
|
||||
local progression = (reload_time - math.abs(math.min(CurTime() - client:GetNW2Int("r_parachute"), 0))) / reload_time
|
||||
|
||||
-- Фон прогресс-бара
|
||||
draw.RoundedBox(1, (ScrW() / 2) - (width / 2), ScrH() / 1.08, width, height, Color(59, 59, 59, 255))
|
||||
surface.SetDrawColor(89, 89, 89, 128)
|
||||
surface.DrawOutlinedRect((ScrW() / 2) - (width / 2) + 1, (ScrH() / 1.08) + 2, width - 2, height - 2, 1)
|
||||
|
||||
-- Полоса прогресса
|
||||
draw.RoundedBox(1, (ScrW() / 2) - (width / 2) + 3, ScrH() / 1.08 + 3, progression * (width - 6), height - 6, Color(176, 151, 28, 255))
|
||||
|
||||
-- Текст подсказки
|
||||
if progression >= 1 then
|
||||
draw.SimpleText("ЛКМ - Раскрыть парашют", "DermaDefault", ScrW() / 2, ScrH() / 1.08 - 20, Color(255, 255, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
else
|
||||
draw.SimpleText("Перезарядка...", "DermaDefault", ScrW() / 2, ScrH() / 1.08 - 20, Color(255, 100, 100, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
end
|
||||
|
||||
-- Если парашют активен
|
||||
if client.Parachuting then
|
||||
draw.SimpleText("Ctrl + Shift - Отцепить парашют", "DermaDefault", ScrW() / 2, ScrH() / 1.08 - 40, Color(255, 200, 100, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
draw.SimpleText("E - Замедлить спуск", "DermaDefault", ScrW() / 2, ScrH() / 1.08 - 60, Color(150, 200, 255, 255), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
|
||||
end
|
||||
end
|
||||
|
||||
-- Остановка звука при выходе
|
||||
function PLUGIN:ShutDown()
|
||||
if LoopingSound then
|
||||
LoopingSound:Stop()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
|
||||
AddCSLuaFile( )
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Ditched BF2 ZParachute"
|
||||
ENT.Author = "Magenta/V92"
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminOnly = true
|
||||
|
||||
function ENT:Initialize( )
|
||||
|
||||
self:SetModel( Model( "models/jessev92/codmw2/parachute_ground_skins.mdl" ) )
|
||||
self:SetMoveType( MOVETYPE_FLYGRAVITY )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:SetSkin( 1 )
|
||||
self:DrawShadow( true )
|
||||
self:SetCollisionBounds( Vector( -1 , -1 , -1 ) , Vector( 1 , 1 , 1 ) )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
self:SetNetworkedString( "Owner" , "World" )
|
||||
self:EmitSound( "VNT_ParachuteZ_DetachClip" )
|
||||
self.RemoveMe = CurTime( ) + 10
|
||||
|
||||
end
|
||||
|
||||
function ENT:Think( )
|
||||
|
||||
if not SERVER then return false end
|
||||
|
||||
if self.RemoveMe < CurTime( ) then
|
||||
|
||||
if SERVER then
|
||||
|
||||
SafeRemoveEntity( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,65 @@
|
||||
|
||||
AddCSLuaFile( )
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Active BF2 ZParachute"
|
||||
ENT.Author = "Magenta/V92"
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminOnly = true
|
||||
|
||||
function ENT:Initialize( )
|
||||
|
||||
self:SetModel( Model( "models/jessev92/bf2/parachute.mdl" ) )
|
||||
self:SetMoveType( MOVETYPE_NONE )
|
||||
self:SetSolid( SOLID_BBOX )
|
||||
self:DrawShadow( true )
|
||||
self:SetCollisionBounds( Vector( -1 , -1 , -1 ) , Vector( 1 , 1 , 1 ) )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
self:SetNetworkedString( "Owner" , "World" )
|
||||
self:EmitSound( "VNT_ParachuteZ_BF2_Deploy" )
|
||||
|
||||
end
|
||||
|
||||
function ENT:Think( )
|
||||
|
||||
local owner = self:GetOwner( )
|
||||
|
||||
if owner:IsValid( ) then
|
||||
|
||||
if CLIENT then
|
||||
|
||||
self:SetRenderOrigin( owner:GetPos( ) + owner:GetUp( ) * 5 + owner:GetForward( ) * -2 )
|
||||
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
|
||||
self:SetAngles( self:GetOwner( ):GetAngles( ) )
|
||||
self:SetPos( self:GetOwner( ):GetPos( ) + self:GetOwner( ):GetUp( ) * 2 + self:GetOwner( ):GetForward( ) * -4 )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
if owner.Parachuting == false then
|
||||
|
||||
if SERVER and IsValid( self ) then
|
||||
|
||||
SafeRemoveEntity( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function ENT:OnRemove( )
|
||||
|
||||
if SERVER and IsValid( self ) then
|
||||
|
||||
SafeRemoveEntity( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,40 @@
|
||||
|
||||
AddCSLuaFile( )
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Landed BF2 ZParachute"
|
||||
ENT.Author = "Magenta/V92"
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminOnly = true
|
||||
|
||||
function ENT:Initialize( )
|
||||
|
||||
self:SetModel( Model( "models/jessev92/codmw2/parachute_ground_skins.mdl" ) )
|
||||
self:SetMoveType( MOVETYPE_FLYGRAVITY )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:SetSkin( 1 )
|
||||
self:DrawShadow( true )
|
||||
self:SetCollisionBounds( Vector( -1 , -1 , -1 ) , Vector( 1 , 1 , 1 ) )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_WORLD )
|
||||
self:SetNetworkedString( "Owner" , "World" )
|
||||
self:EmitSound( "VNT_ParachuteZ_DetachClip" )
|
||||
self.RemoveMe = CurTime( ) + 10
|
||||
|
||||
end
|
||||
|
||||
function ENT:Think( )
|
||||
|
||||
if not SERVER then return false end
|
||||
|
||||
if self.RemoveMe < CurTime( ) then
|
||||
|
||||
if SERVER then
|
||||
|
||||
SafeRemoveEntity( self )
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,52 @@
|
||||
AddCSLuaFile()
|
||||
|
||||
--SWEP.Base = "weapon_rp_base"
|
||||
|
||||
if CLIENT then
|
||||
SWEP.PrintName = "Парашют"
|
||||
SWEP.DrawAmmo = false
|
||||
end
|
||||
|
||||
SWEP.ViewModel = Model('models/weapons/v_hands.mdl')
|
||||
SWEP.ViewModelFOV = 62
|
||||
SWEP.Category = "Other"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = false
|
||||
SWEP.HoldType = "normal"
|
||||
SWEP.ViewModel = "models/weapons/c_arms.mdl"
|
||||
SWEP.WorldModel = ""
|
||||
|
||||
function SWEP:Initialize()
|
||||
if not SERVER then return end
|
||||
self.preventWalkPress = 0
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack()
|
||||
if not IsValid(self.Owner) then return end
|
||||
|
||||
local ply = self.Owner
|
||||
local reloadTime = ix and ix.config.Get("parachuteReloadTime", 20) or 20
|
||||
local minVel = ix and ix.config.Get("parachuteMinVelocity", -600) or -600
|
||||
|
||||
if ply:Alive() and ((ply:GetNW2Int("r_parachute") or 0) <= CurTime()) and ply:IsValid() and not (ply:GetMoveType() == MOVETYPE_NOCLIP or ply:InVehicle() or ply:OnGround() or ply:GetVelocity().z > minVel) then
|
||||
ply:SetNW2Int("r_parachute", CurTime() + reloadTime)
|
||||
self.preventWalkPress = CurTime() + reloadTime
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:CanSecondaryAttack()
|
||||
return false
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
|
||||
end
|
||||
|
||||
function SWEP:Reload()
|
||||
return false
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
205
garrysmod/gamemodes/militaryrp/plugins/parachute/sh_plugin.lua
Normal file
205
garrysmod/gamemodes/militaryrp/plugins/parachute/sh_plugin.lua
Normal file
@@ -0,0 +1,205 @@
|
||||
PLUGIN.name = "Parachute System"
|
||||
PLUGIN.author = "V92 (Портирован для Helix)"
|
||||
PLUGIN.description = "Система парашютов в стиле Battlefield 2 для безопасного приземления"
|
||||
|
||||
-- Конфигурация
|
||||
ix.config.Add("parachuteMode", 0, "Режим доступа к парашюту: -1=Отключен, 0=Все, 1=Админы, 2=Супер-админы", nil, {
|
||||
data = {min = -1, max = 2},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteVolume", 0.7, "Громкость звука полёта на парашюте", nil, {
|
||||
data = {min = 0.2, max = 1.0, decimals = 1},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteSpeedBack", 300, "Скорость при движении назад", nil, {
|
||||
data = {min = 200, max = 500},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteSpeedNormal", 375, "Скорость без управления", nil, {
|
||||
data = {min = 250, max = 600},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteSpeedForward", 450, "Скорость при движении вперёд", nil, {
|
||||
data = {min = 300, max = 700},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteReloadTime", 20, "Время перезарядки парашюта (секунды)", nil, {
|
||||
data = {min = 5, max = 60},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
ix.config.Add("parachuteMinVelocity", -600, "Минимальная скорость падения для активации", nil, {
|
||||
data = {min = -1000, max = -100},
|
||||
category = "Parachute System"
|
||||
})
|
||||
|
||||
-- Регистрация звуков
|
||||
sound.Add({
|
||||
["name"] = "VNT_ParachuteZ_DetachClip",
|
||||
["channel"] = CHAN_BODY,
|
||||
["volume"] = 1.0,
|
||||
["level"] = 50,
|
||||
["pitch"] = {90, 110},
|
||||
["sound"] = {"npc/combine_soldier/zipline_clip1.wav", "npc/combine_soldier/zipline_clip2.wav"}
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
["name"] = "VNT_ParachuteZ_BF2_Deploy",
|
||||
["channel"] = CHAN_BODY,
|
||||
["volume"] = 1.0,
|
||||
["level"] = 75,
|
||||
["pitch"] = {105, 110},
|
||||
["sound"] = {"v92/bf2/vehicles/air/parachute/parachute_deploy.wav"}
|
||||
})
|
||||
|
||||
sound.Add({
|
||||
["name"] = "VNT_ParachuteZ_BF2_Idle",
|
||||
["channel"] = CHAN_STATIC,
|
||||
["volume"] = 1.0,
|
||||
["level"] = 75,
|
||||
["pitch"] = {100},
|
||||
["sound"] = {"v92/bf2/vehicles/air/parachute/parachute_ride_loop.wav"}
|
||||
})
|
||||
|
||||
if SERVER then
|
||||
-- Загрузка workshop контента
|
||||
--resource.AddWorkshop("105699464")
|
||||
|
||||
-- Координаты смещения для сущностей парашюта
|
||||
local ActiveParachute = {10, 0, 100}
|
||||
local LandedParachute = {-100, 50, 10}
|
||||
local DitchedParachute = {10, 0, 0}
|
||||
|
||||
function PLUGIN:KeyPress(ply, key)
|
||||
if not ply:Alive() or not IsValid(ply) then return end
|
||||
if not IsValid(ply:GetActiveWeapon()) then return end
|
||||
if ply:GetActiveWeapon():GetClass() ~= "parachute_swep" then return end
|
||||
|
||||
local reloadTime = ix.config.Get("parachuteReloadTime", 20)
|
||||
local minVel = ix.config.Get("parachuteMinVelocity", -600)
|
||||
|
||||
if ((ply:GetNW2Int("r_parachute") or 0) <= CurTime()) and
|
||||
(key == IN_ATTACK and ply:IsValid()) and
|
||||
not (ply:GetMoveType() == MOVETYPE_NOCLIP or ply:InVehicle() or ply:OnGround() or ply.Parachuting == true or ply:GetVelocity().z > minVel) then
|
||||
|
||||
ply.EndParaTime = nil
|
||||
ply.Parachuting = true
|
||||
net.Start("ParachuteState")
|
||||
net.WriteBool(ply.Parachuting)
|
||||
net.Send(ply)
|
||||
|
||||
ply.FlarePara = 1
|
||||
ply:ViewPunch(Angle(35, 0, 0))
|
||||
|
||||
local Para = ents.Create("v92_zchute_bf2_active")
|
||||
Para:SetOwner(ply)
|
||||
Para:SetPos(ply:GetPos() + ply:GetForward() * ActiveParachute[1] + ply:GetRight() * ActiveParachute[2] + ply:GetUp() * ActiveParachute[3])
|
||||
Para:SetAngles(ply:GetAngles())
|
||||
Para:Spawn()
|
||||
Para:Activate()
|
||||
end
|
||||
end
|
||||
|
||||
function PLUGIN:Think()
|
||||
local mode = ix.config.Get("parachuteMode", 0)
|
||||
|
||||
-- Если отключено
|
||||
if mode == -1 then return end
|
||||
|
||||
local speedBack = ix.config.Get("parachuteSpeedBack", 300)
|
||||
local speedNormal = ix.config.Get("parachuteSpeedNormal", 375)
|
||||
local speedForward = ix.config.Get("parachuteSpeedForward", 450)
|
||||
|
||||
for k, v in pairs(player.GetAll()) do
|
||||
-- Проверка прав доступа
|
||||
if (mode == 1 and not v:IsAdmin()) or (mode == 2 and not v:IsSuperAdmin()) then
|
||||
if v.Parachuting then
|
||||
v.Parachuting = false
|
||||
end
|
||||
return
|
||||
end
|
||||
|
||||
if v.Parachuting == true then
|
||||
-- Приземление
|
||||
if (v.EndParaTime and CurTime() >= v.EndParaTime and v:OnGround() == true) or
|
||||
v:WaterLevel() > 0 or
|
||||
v:GetMoveType() == MOVETYPE_LADDER then
|
||||
|
||||
v.EndParaTime = nil
|
||||
v.Parachuting = false
|
||||
net.Start("ParachuteState")
|
||||
net.WriteBool(v.Parachuting)
|
||||
net.Send(v)
|
||||
|
||||
v.FlarePara = 1
|
||||
v:ViewPunch(Angle(-16, 0, 0))
|
||||
|
||||
local ParaLand = ents.Create("v92_zchute_bf2_land")
|
||||
ParaLand:SetOwner(v)
|
||||
ParaLand:SetPos(v:GetPos() + v:GetForward() * LandedParachute[1] + v:GetRight() * LandedParachute[2] + v:GetUp() * LandedParachute[3])
|
||||
ParaLand:SetAngles(v:GetAngles() + Angle(0, 270, 0))
|
||||
ParaLand:Spawn()
|
||||
ParaLand:Activate()
|
||||
end
|
||||
|
||||
-- Управление скоростью спуска
|
||||
if v:KeyDown(IN_USE) and v.FlarePara > 0.4 then
|
||||
v.FlarePara = v.FlarePara - 0.005
|
||||
if v.FlarePara < 0.4 then
|
||||
v.FlarePara = 0.4
|
||||
end
|
||||
end
|
||||
|
||||
-- Управление направлением
|
||||
if v:KeyDown(IN_FORWARD) then
|
||||
v:SetLocalVelocity(v:GetForward() * speedForward * v.FlarePara * 1.1 - v:GetUp() * 320 * v.FlarePara)
|
||||
elseif v:KeyDown(IN_BACK) then
|
||||
v:SetLocalVelocity(v:GetForward() * speedBack * v.FlarePara * 1.1 - v:GetUp() * 320 * v.FlarePara)
|
||||
else
|
||||
v:SetLocalVelocity(v:GetForward() * speedNormal * v.FlarePara * 1.1 - v:GetUp() * 320 * v.FlarePara)
|
||||
end
|
||||
|
||||
-- Отцепление парашюта (Ctrl + Shift)
|
||||
if (v:KeyDown(IN_DUCK) and v:KeyDown(IN_WALK) and v.Parachuting == true) or not (v:Alive() or IsValid(v)) then
|
||||
v.Parachuting = false
|
||||
net.Start("ParachuteState")
|
||||
net.WriteBool(v.Parachuting)
|
||||
net.Send(v)
|
||||
|
||||
v.FlarePara = 1
|
||||
v:ViewPunch(Angle(-15, 0, 0))
|
||||
|
||||
local ParaDitch = ents.Create("v92_zchute_bf2_abandon")
|
||||
ParaDitch:SetOwner(v)
|
||||
ParaDitch:SetPos(v:GetPos() + v:GetForward() * DitchedParachute[1] + v:GetRight() * DitchedParachute[2] + v:GetUp() * DitchedParachute[3])
|
||||
ParaDitch:SetAngles(v:GetAngles())
|
||||
ParaDitch:Spawn()
|
||||
ParaDitch:Activate()
|
||||
end
|
||||
|
||||
-- Касание земли
|
||||
if v:OnGround() and v.Parachuting == true and not v.EndParaTime then
|
||||
v.EndParaTime = CurTime() + 0.25
|
||||
net.Start("ParachuteState")
|
||||
net.WriteBool(false)
|
||||
net.Send(v)
|
||||
v:ViewPunch(Angle(7, 0, 0))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
util.AddNetworkString("ParachuteState")
|
||||
end
|
||||
|
||||
function PLUGIN:Initialize()
|
||||
print("[Parachute System] Система парашютов загружена!")
|
||||
print("[Parachute System] Используйте ЛКМ для раскрытия, Ctrl+Shift для отцепления")
|
||||
end
|
||||
|
||||
ix.util.Include("cl_plugin.lua")
|
||||
Reference in New Issue
Block a user