mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-19 06:33:47 +03:00
Upload
This commit is contained in:
245
gamemodes/darkrp/entities/entities/ix_combinelock.lua
Normal file
245
gamemodes/darkrp/entities/entities/ix_combinelock.lua
Normal file
@@ -0,0 +1,245 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self)) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
self:Toggle(client)
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_blue = Color(52, 73, 94, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_blue
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
295
gamemodes/darkrp/entities/entities/ix_combinelock_cmru.lua
Normal file
295
gamemodes/darkrp/entities/entities/ix_combinelock_cmru.lua
Normal file
@@ -0,0 +1,295 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock (CMRU)"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock_cmru")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.accessLevel = 1
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local items = character:GetInventory():GetItems()
|
||||
local cmruCards = {}
|
||||
|
||||
for _, item in pairs(items) do
|
||||
if (item.uniqueID == "cmru_card" and item:GetData("cardID")) then
|
||||
cmruCards[#cmruCards + 1] = item
|
||||
end
|
||||
end
|
||||
|
||||
local canOpen = false
|
||||
for _, card in pairs(cmruCards) do
|
||||
-- access level 5 should open all doors. access level 3 should open only 3, 2, and 1 doors, etc
|
||||
if (items[card:GetData("cardID")] and (card:GetData("accessLevel", 1) >= self.accessLevel)) then
|
||||
canOpen = true
|
||||
end
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self) and !canOpen) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if (client:KeyDown(IN_SPEED) and (client:Team() == FACTION_ADMIN or client:Team() == FACTION_SERVERADMIN or client:IsCombine() or client:GetCharacter():HasFlags("M"))) then
|
||||
net.Start("changeLockAccessCmru")
|
||||
net.WriteEntity(self)
|
||||
net.Send(client)
|
||||
else
|
||||
self:Toggle(client)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnOptionSelected(client, option, data)
|
||||
if (option == "Set Level 1 Access") then
|
||||
self.accessLevel = 1
|
||||
|
||||
client:Notify("Bu kilide Düzey 1 Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Level 2 Access") then
|
||||
self.accessLevel = 2
|
||||
|
||||
client:Notify("Bu kilide Düzey 2 Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Level 3 Access") then
|
||||
self.accessLevel = 3
|
||||
|
||||
client:Notify("Bu kilide Düzey 3 Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Level 4 Access") then
|
||||
self.accessLevel = 4
|
||||
|
||||
client:Notify("Bu kilide Düzey 4 Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Level 5 Access") then
|
||||
self.accessLevel = 5
|
||||
|
||||
client:Notify("Bu kilide Düzey 5 Erişimi'ni ayarladınız.")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_magenta = Color(214, 55, 229, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_magenta
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
295
gamemodes/darkrp/entities/entities/ix_combinelock_con.lua
Normal file
295
gamemodes/darkrp/entities/entities/ix_combinelock_con.lua
Normal file
@@ -0,0 +1,295 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock (Conscript)"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock_con")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.accessLevel = 1
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local items = character:GetInventory():GetItems()
|
||||
local conCards = {}
|
||||
|
||||
for _, item in pairs(items) do
|
||||
if (item.uniqueID == "con_card" and item:GetData("cardID")) then
|
||||
conCards[#conCards + 1] = item
|
||||
end
|
||||
end
|
||||
|
||||
local canOpen = false
|
||||
for _, card in pairs(conCards) do
|
||||
-- access level 5 should open all doors. access level 3 should open only 3, 2, and 1 doors, etc
|
||||
if (items[card:GetData("cardID")] and (card:GetData("accessLevel", 1) >= self.accessLevel)) then
|
||||
canOpen = true
|
||||
end
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self) and !canOpen) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if (client:KeyDown(IN_SPEED) and (client:Team() == FACTION_ADMIN or client:Team() == FACTION_SERVERADMIN or client:IsCombine() or client:GetCharacter():HasFlags("M"))) then
|
||||
net.Start("changeLockAccessCon")
|
||||
net.WriteEntity(self)
|
||||
net.Send(client)
|
||||
else
|
||||
self:Toggle(client)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnOptionSelected(client, option, data)
|
||||
if (option == "Set Level 1 Access") then
|
||||
self.accessLevel = 1
|
||||
|
||||
client:Notify("You have set Level 1 Access to this lock.")
|
||||
elseif (option == "Set Level 2 Access") then
|
||||
self.accessLevel = 2
|
||||
|
||||
client:Notify("You have set Level 2 Access to this lock.")
|
||||
elseif (option == "Set Level 3 Access") then
|
||||
self.accessLevel = 3
|
||||
|
||||
client:Notify("You have set Level 3 Access to this lock.")
|
||||
elseif (option == "Set Level 4 Access") then
|
||||
self.accessLevel = 4
|
||||
|
||||
client:Notify("You have set Level 4 Access to this lock.")
|
||||
elseif (option == "Set Level 5 Access") then
|
||||
self.accessLevel = 5
|
||||
|
||||
client:Notify("You have set Level 5 Access to this lock.")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_orange = Color(255, 180, 0, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_orange
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
284
gamemodes/darkrp/entities/entities/ix_combinelock_cwu.lua
Normal file
284
gamemodes/darkrp/entities/entities/ix_combinelock_cwu.lua
Normal file
@@ -0,0 +1,284 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock (CWU)"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock_cwu")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.accessLevel = "Member Access"
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local items = character:GetInventory():GetItems()
|
||||
local cwuCards = {}
|
||||
|
||||
for _, item in pairs(items) do
|
||||
if (item.uniqueID == "cwu_card" and item:GetData("cardID")) then
|
||||
cwuCards[#cwuCards + 1] = item
|
||||
end
|
||||
end
|
||||
|
||||
local canOpen = false
|
||||
for _, cards in pairs(cwuCards) do
|
||||
local accessLevel = cards:GetData("accessLevel", "Member Access")
|
||||
|
||||
if (items[cards:GetData("cardID")] and (accessLevel == "Management Access" or (accessLevel == "Member Access" and self.accessLevel == "Member Access"))) then
|
||||
canOpen = true
|
||||
end
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self) and !canOpen) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if (client:KeyDown(IN_SPEED) and (client:Team() == FACTION_ADMIN or client:Team() == FACTION_SERVERADMIN or client:IsCombine() or client:GetCharacter():HasFlags("M"))) then
|
||||
net.Start("changeLockAccess")
|
||||
net.WriteEntity(self)
|
||||
net.Send(client)
|
||||
else
|
||||
self:Toggle(client)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnOptionSelected(client, option, data)
|
||||
if (option == "Set Member Access") then
|
||||
self.accessLevel = "Member Access"
|
||||
|
||||
client:Notify("Bu kilide Üye Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Management Access") then
|
||||
self.accessLevel = "Management Access"
|
||||
|
||||
client:Notify("Yönetim Erişimi'ni bu kilide ayarladınız.")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_blue = Color(37, 64, 213, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_blue
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
284
gamemodes/darkrp/entities/entities/ix_combinelock_dob.lua
Normal file
284
gamemodes/darkrp/entities/entities/ix_combinelock_dob.lua
Normal file
@@ -0,0 +1,284 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock (DOB)"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock_dob")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.accessLevel = "Member Access"
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local items = character:GetInventory():GetItems()
|
||||
local dobCards = {}
|
||||
|
||||
for _, item in pairs(items) do
|
||||
if (item.uniqueID == "dob_card" and item:GetData("cardID")) then
|
||||
dobCards[#dobCards + 1] = item
|
||||
end
|
||||
end
|
||||
|
||||
local canOpen = false
|
||||
for _, cards in pairs(dobCards) do
|
||||
local accessLevel = cards:GetData("accessLevel", "Member Access")
|
||||
|
||||
if (items[cards:GetData("cardID")] and (accessLevel == "Management Access" or (accessLevel == "Member Access" and self.accessLevel == "Member Access"))) then
|
||||
canOpen = true
|
||||
end
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self) and !canOpen) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if (client:KeyDown(IN_SPEED) and (client:Team() == FACTION_ADMIN or client:Team() == FACTION_SERVERADMIN or client:IsCombine() or client:GetCharacter():HasFlags("M"))) then
|
||||
net.Start("changeLockAccess")
|
||||
net.WriteEntity(self)
|
||||
net.Send(client)
|
||||
else
|
||||
self:Toggle(client)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnOptionSelected(client, option, data)
|
||||
if (option == "Set Member Access") then
|
||||
self.accessLevel = "Member Access"
|
||||
|
||||
client:Notify("Bu kilide Üye Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Management Access") then
|
||||
self.accessLevel = "Management Access"
|
||||
|
||||
client:Notify("Yönetim Erişimi'ni bu kilide ayarladınız.")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_orange = Color(235, 125, 52, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_orange
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
284
gamemodes/darkrp/entities/entities/ix_combinelock_moe.lua
Normal file
284
gamemodes/darkrp/entities/entities/ix_combinelock_moe.lua
Normal file
@@ -0,0 +1,284 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Combine Lock (MOE)"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.PhysgunDisable = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "Locked")
|
||||
self:NetworkVar("Bool", 1, "DisplayError")
|
||||
self:NetworkVar("Bool", 2, "Disabled")
|
||||
|
||||
if (SERVER) then
|
||||
self:NetworkVarNotify("Locked", self.OnLockChanged)
|
||||
end
|
||||
end
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:GetLockPosition(door, normal)
|
||||
local index = door:LookupBone("handle")
|
||||
local position = door:GetPos()
|
||||
normal = normal or door:GetForward():Angle()
|
||||
|
||||
if (index and index >= 1) then
|
||||
position = door:GetBonePosition(index)
|
||||
end
|
||||
|
||||
position = position + normal:Forward() * 7.2 + normal:Up() * 10 + normal:Right() * 2
|
||||
|
||||
normal:RotateAroundAxis(normal:Up(), 90)
|
||||
normal:RotateAroundAxis(normal:Forward(), 180)
|
||||
normal:RotateAroundAxis(normal:Right(), 180)
|
||||
|
||||
return position, normal
|
||||
end
|
||||
|
||||
function ENT:SetDoor(door, position, angles)
|
||||
if (!IsValid(door) or !door:IsDoor()) then
|
||||
return
|
||||
end
|
||||
|
||||
local doorPartner = door:GetDoorPartner()
|
||||
|
||||
self.door = door
|
||||
self.door:DeleteOnRemove(self)
|
||||
door.ixLock = self
|
||||
|
||||
if (IsValid(doorPartner)) then
|
||||
self.doorPartner = doorPartner
|
||||
self.doorPartner:DeleteOnRemove(self)
|
||||
doorPartner.ixLock = self
|
||||
end
|
||||
|
||||
self:SetPos(position)
|
||||
self:SetAngles(angles)
|
||||
self:SetParent(door)
|
||||
end
|
||||
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local door = trace.Entity
|
||||
|
||||
if (!IsValid(door) or !door:IsDoor() or IsValid(door.ixLock)) then
|
||||
return client:NotifyLocalized("dNotValid")
|
||||
end
|
||||
|
||||
local normal = client:GetEyeTrace().HitNormal:Angle()
|
||||
local position, angles = self:GetLockPosition(door, normal)
|
||||
|
||||
local entity = ents.Create("ix_combinelock_moe")
|
||||
entity:SetPos(trace.HitPos)
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
entity:SetDoor(door, position, angles)
|
||||
|
||||
ix.saveEnts:SaveEntity(entity)
|
||||
Schema:SaveCombineLocks()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props_combine/wn_combine_lock.mdl")
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_WEAPON)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:SetHealth(300)
|
||||
|
||||
self.accessLevel = "Member Access"
|
||||
self.nextUseTime = 0
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (IsValid(self)) then
|
||||
self:SetParent(nil)
|
||||
end
|
||||
|
||||
if (IsValid(self.door)) then
|
||||
self.door:Fire("unlock")
|
||||
self.door.ixLock = nil
|
||||
end
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
self.doorPartner.ixLock = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown) then
|
||||
Schema:SaveCombineLocks()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnLockChanged(name, bWasLocked, bLocked)
|
||||
if (!IsValid(self.door) or self:GetDisabled()) then
|
||||
return
|
||||
end
|
||||
|
||||
ix.saveEnts:SaveEntity(self)
|
||||
if (bLocked) then
|
||||
self:EmitSound("buttons/combine_button2.wav")
|
||||
self.door:Fire("lock")
|
||||
self.door:Fire("close")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("lock")
|
||||
self.doorPartner:Fire("close")
|
||||
end
|
||||
else
|
||||
self:EmitSound("buttons/combine_button7.wav")
|
||||
self.door:Fire("unlock")
|
||||
|
||||
if (IsValid(self.doorPartner)) then
|
||||
self.doorPartner:Fire("unlock")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DisplayError()
|
||||
self:EmitSound("buttons/combine_button_locked.wav")
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:DisplayDamage()
|
||||
self:SetDisplayError(true)
|
||||
|
||||
timer.Simple(1.2, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetDisplayError(false)
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Toggle(client)
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
if (self.nextUseTime > CurTime()) then
|
||||
return
|
||||
end
|
||||
|
||||
local character = client:GetCharacter()
|
||||
local items = character:GetInventory():GetItems()
|
||||
local moeCards = {}
|
||||
|
||||
for _, item in pairs(items) do
|
||||
if (item.uniqueID == "moe_card" and item:GetData("cardID")) then
|
||||
moeCards[#moeCards + 1] = item
|
||||
end
|
||||
end
|
||||
|
||||
local canOpen = false
|
||||
for _, cards in pairs(moeCards) do
|
||||
local accessLevel = cards:GetData("accessLevel", "Member Access")
|
||||
|
||||
if (items[cards:GetData("cardID")] and (accessLevel == "Management Access" or (accessLevel == "Member Access" and self.accessLevel == "Member Access"))) then
|
||||
canOpen = true
|
||||
end
|
||||
end
|
||||
|
||||
if (!Schema:CanPlayerOpenCombineLock(client, self) and !canOpen) then
|
||||
self:DisplayError()
|
||||
self.nextUseTime = CurTime() + 2
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
self:SetLocked(!self:GetLocked())
|
||||
|
||||
self.nextUseTime = CurTime() + 2
|
||||
end
|
||||
|
||||
function ENT:Use(client)
|
||||
if (client:KeyDown(IN_SPEED) and (client:Team() == FACTION_ADMIN or client:Team() == FACTION_SERVERADMIN or client:IsCombine() or client:GetCharacter():HasFlags("M"))) then
|
||||
net.Start("changeLockAccess")
|
||||
net.WriteEntity(self)
|
||||
net.Send(client)
|
||||
else
|
||||
self:Toggle(client)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnOptionSelected(client, option, data)
|
||||
if (option == "Set Member Access") then
|
||||
self.accessLevel = "Member Access"
|
||||
|
||||
client:Notify("Bu kilide Üye Erişimi'ni ayarladınız.")
|
||||
elseif (option == "Set Management Access") then
|
||||
self.accessLevel = "Management Access"
|
||||
|
||||
client:Notify("Yönetim Erişimi'ni bu kilide ayarladınız.")
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage(dmgInfo)
|
||||
self:SetHealth(self:Health() - dmgInfo:GetDamage())
|
||||
self:EmitSound("physics/metal/metal_sheet_impact_hard"..math.random(6, 8)..".wav")
|
||||
self:DisplayDamage()
|
||||
|
||||
if (self:Health() <= 0) then
|
||||
local pos = self:GetPos()
|
||||
local curTime = CurTime()
|
||||
|
||||
if (!self.nextSpark or self.nextSpark <= curTime) then
|
||||
local effect = EffectData()
|
||||
effect:SetStart(pos)
|
||||
effect:SetOrigin(pos)
|
||||
effect:SetScale(2)
|
||||
util.Effect("cball_explode", effect)
|
||||
|
||||
self.nextSpark = curTime + 0.1
|
||||
end
|
||||
|
||||
local attacker = dmgInfo:GetAttacker()
|
||||
|
||||
self:EmitSound("npc/manhack/gib.wav")
|
||||
ix.combineNotify:AddImportantNotification("WRN:// Bio-Restrictor failure", nil, attacker:IsPlayer() and attacker, self:GetPos())
|
||||
ix.item.Spawn("trash_biolock", Vector(self:GetPos().x, self:GetPos().y, self:GetPos().z))
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
else
|
||||
local glowMaterial = ix.util.GetMaterial("sprites/glow04_noz")
|
||||
local color_green = Color(0, 255, 0, 255)
|
||||
local color_magenta = Color(214, 55, 229, 255)
|
||||
local color_red = Color(255, 50, 50, 255)
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetDisabled()) then return end
|
||||
|
||||
local color = color_green
|
||||
|
||||
if (self:GetDisplayError()) then
|
||||
color = color_red
|
||||
elseif (self:GetLocked()) then
|
||||
color = color_magenta
|
||||
end
|
||||
|
||||
local position = self:GetPos() + self:GetUp() * -8.7 + self:GetForward() * -3.85 + self:GetRight() * -6
|
||||
|
||||
render.SetMaterial(glowMaterial)
|
||||
render.DrawSprite(position, 10, 10, color)
|
||||
end
|
||||
end
|
||||
445
gamemodes/darkrp/entities/entities/ix_forcefield.lua
Normal file
445
gamemodes/darkrp/entities/entities/ix_forcefield.lua
Normal file
@@ -0,0 +1,445 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Forcefield"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.RenderGroup = RENDERGROUP_BOTH
|
||||
ENT.PhysgunDisabled = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Int", 0, "Mode")
|
||||
self:NetworkVar("Entity", 0, "Dummy")
|
||||
self:NetworkVar("Bool", 0, "Malfunctioning")
|
||||
end
|
||||
|
||||
local MODE_OFFLINE = 1
|
||||
local MODE_ALLOW_ALL = 2
|
||||
local MODE_ALLOW_COMBINE = 3
|
||||
local MODE_ALLOW_COMBINE_INF = 4
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local angles = (client:GetPos() - trace.HitPos):Angle()
|
||||
angles.p = 0
|
||||
angles.r = 0
|
||||
angles:RotateAroundAxis(angles:Up(), 270)
|
||||
|
||||
local entity = ents.Create("ix_forcefield")
|
||||
entity:SetPos(trace.HitPos + Vector(0, 0, 40))
|
||||
entity:SetAngles(angles:SnapTo("y", 90))
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
|
||||
Schema:SaveForceFields()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props/forcefield_left.mdl")
|
||||
self:SetSkin(3)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
|
||||
local data = {}
|
||||
data.start = self:GetPos() + self:GetRight() * -16
|
||||
data.endpos = self:GetPos() + self:GetRight() * -480
|
||||
data.filter = self
|
||||
local trace = util.TraceLine(data)
|
||||
|
||||
local angles = self:GetAngles()
|
||||
angles:RotateAroundAxis(angles:Up(), 90)
|
||||
|
||||
self.dummy = ents.Create("prop_physics")
|
||||
self.dummy:SetModel("models/willardnetworks/props/forcefield_right.mdl")
|
||||
self.dummy:SetSkin(3)
|
||||
self.dummy:SetPos(trace.HitPos)
|
||||
self.dummy:SetAngles(self:GetAngles())
|
||||
self.dummy:Spawn()
|
||||
self.dummy.PhysgunDisabled = true
|
||||
self.dummy:SetCollisionGroup(COLLISION_GROUP_WORLD)
|
||||
self:DeleteOnRemove(self.dummy)
|
||||
|
||||
local verts = {
|
||||
{pos = Vector(0, 0, -25)},
|
||||
{pos = Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) + Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) + Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) - Vector(0, 0, 25)},
|
||||
{pos = Vector(0, 0, -25)}
|
||||
}
|
||||
|
||||
self:PhysicsFromMesh(verts)
|
||||
|
||||
local physObj = self:GetPhysicsObject()
|
||||
|
||||
if (IsValid(physObj)) then
|
||||
physObj:EnableMotion(false)
|
||||
physObj:Sleep()
|
||||
end
|
||||
|
||||
self:AddSolidFlags(FSOLID_CUSTOMBOXTEST)
|
||||
self:SetCustomCollisionCheck(true)
|
||||
self:SetDummy(self.dummy)
|
||||
|
||||
physObj = self.dummy:GetPhysicsObject()
|
||||
|
||||
if (IsValid(physObj)) then
|
||||
physObj:EnableMotion(false)
|
||||
physObj:Sleep()
|
||||
end
|
||||
|
||||
self:SetMoveType(MOVETYPE_NOCLIP)
|
||||
self:SetMoveType(MOVETYPE_PUSH)
|
||||
self:MakePhysicsObjectAShadow()
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
end
|
||||
|
||||
function ENT:StartTouch(entity)
|
||||
if (!self.buzzer) then
|
||||
self.buzzer = CreateSound(entity, "ambient/machines/combine_shield_touch_loop1.wav")
|
||||
self.buzzer:Play()
|
||||
self.buzzer:ChangeVolume(0.8, 0)
|
||||
self.buzzer:SetSoundLevel(60)
|
||||
else
|
||||
self.buzzer:ChangeVolume(0.8, 0.5)
|
||||
self.buzzer:Play()
|
||||
end
|
||||
|
||||
self.entities = (self.entities or 0) + 1
|
||||
end
|
||||
|
||||
function ENT:EndTouch(entity)
|
||||
self.entities = math.max((self.entities or 0) - 1, 0)
|
||||
|
||||
if (self.buzzer and self.entities == 0) then
|
||||
self.buzzer:FadeOut(0.5)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (self.buzzer) then
|
||||
self.buzzer:Stop()
|
||||
self.buzzer = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown and !self.ixIsSafe) then
|
||||
Schema:SaveForceFields()
|
||||
end
|
||||
end
|
||||
|
||||
ENT.MODES = {
|
||||
{
|
||||
function(entity)
|
||||
return false
|
||||
end,
|
||||
"field disengaged.",
|
||||
"disengaged",
|
||||
3
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
if (!entity:IsPlayer()) then return true end
|
||||
|
||||
local character = entity:GetCharacter()
|
||||
if (!character or !character:GetInventory()) then
|
||||
return true
|
||||
end
|
||||
|
||||
if (!character:GetInventory():HasItem("id_card", {active = true})) then
|
||||
if character:GetInventory():HasItem("fake_id_card") then
|
||||
return false
|
||||
end
|
||||
if character:IsVortigaunt() and
|
||||
character:GetCollarItemID() and
|
||||
ix.item.instances[character:GetCollarItemID()] and
|
||||
-ix.config.Get("blacklistSCAmount", 40) <= ix.item.instances[character:GetCollarItemID()]:GetData("sterilizedCredits", 0) then
|
||||
return false
|
||||
end
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end,
|
||||
"allow only registered individuals with active ID Card.",
|
||||
"engaged",
|
||||
0
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
return true
|
||||
end,
|
||||
"disallow non-functionary units.",
|
||||
"restricted",
|
||||
1
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
return true
|
||||
end,
|
||||
"disallow non-functionary units (infestation control specific)",
|
||||
"restricted",
|
||||
2
|
||||
}
|
||||
}
|
||||
|
||||
function ENT:Use(activator)
|
||||
if ((self.nextUse or 0) < CurTime()) then
|
||||
self.nextUse = CurTime() + 1.5
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
local bForced = CAMI.PlayerHasAccess(activator, "Helix - Basic Admin Commands", nil) and activator:GetMoveType() == MOVETYPE_NOCLIP
|
||||
|
||||
if (activator:HasActiveCombineSuit() or ix.faction.Get(activator:Team()).allowForcefieldControl or bForced) then
|
||||
self:SetMode(self:GetMode() + 1)
|
||||
local action = "modified"
|
||||
|
||||
if (self:GetMode() > #self.MODES) then
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[1][4])
|
||||
self.dummy:SetSkin(self.MODES[1][4])
|
||||
self:EmitSound("npc/turret_floor/die.wav")
|
||||
else
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[self:GetMode()][4])
|
||||
self.dummy:SetSkin(self.MODES[self:GetMode()][4])
|
||||
end
|
||||
|
||||
self:EmitSound("buttons/combine_button5.wav", 140, 100 + (self:GetMode() - 1) * 15)
|
||||
activator:ChatPrint("Changed barrier mode to: " .. self.MODES[self:GetMode()][2])
|
||||
|
||||
Schema:SaveForceFields()
|
||||
if (bForced) then return end
|
||||
|
||||
ix.combineNotify:AddNotification("NTC:// Containment Field " .. self.MODES[self:GetMode()][3] .. " by " .. activator:GetCombineTag(), nil, activator)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Malfunction()
|
||||
local bMalfunctioning = self:GetMalfunctioning()
|
||||
if (!bMalfunctioning) then return end
|
||||
|
||||
timer.Simple(math.random(0.2, 1), function()
|
||||
if (!self:IsValid()) then return end
|
||||
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[1][4])
|
||||
self.dummy:SetSkin(self.MODES[1][4])
|
||||
self:EmitSound("buttons/combine_button5.wav", 65, 100 + (self:GetMode() - 1) * 15)
|
||||
self:EmitSound("npc/turret_floor/die.wav", 55)
|
||||
|
||||
local target = math.random(2) == 1 and self or self:GetDummy()
|
||||
local vPoint = target:GetPos() + Vector(0, 0, math.random(-10, 100)) + target:GetRight() * (target == self and -10 or 10)
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(vPoint)
|
||||
util.Effect("ManhackSparks", effectdata)
|
||||
|
||||
if (math.random(2) == 1) then
|
||||
target = math.random(2) == 1 and self or self:GetDummy()
|
||||
vPoint = target:GetPos() + Vector(0, 0, math.random(-10, 100)) + target:GetRight() * (target == self and -10 or 10)
|
||||
effectdata = EffectData()
|
||||
effectdata:SetOrigin(vPoint)
|
||||
util.Effect("ManhackSparks", effectdata)
|
||||
end
|
||||
|
||||
self:EmitSound("ambient/energy/zap" .. math.random(1, 9) .. ".wav", 65)
|
||||
|
||||
timer.Simple(math.random(1, 5), function()
|
||||
if (!self:IsValid()) then return end
|
||||
|
||||
self:SetMode(math.random(2, 4))
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[self:GetMode()][4])
|
||||
self.dummy:SetSkin(self.MODES[self:GetMode()][4])
|
||||
|
||||
self:EmitSound("buttons/combine_button5.wav", 65, 100 + (self:GetMode() - 1) * 15)
|
||||
|
||||
self:Malfunction()
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("ShouldCollide", "ix_forcefields", function(a, b)
|
||||
local entity
|
||||
local forcefield
|
||||
|
||||
if (a:GetClass() == "ix_forcefield") then
|
||||
entity = b
|
||||
forcefield = a
|
||||
elseif (b:GetClass() == "ix_forcefield") then
|
||||
entity = a
|
||||
forcefield = b
|
||||
end
|
||||
|
||||
if (IsValid(forcefield)) then
|
||||
if (IsValid(entity)) then
|
||||
if (entity:IsPlayer() and (entity:HasActiveCombineSuit() or ix.faction.Get(entity:Team()).allowForcefieldPassage) or entity:GetClass() == "ix_scanner") then
|
||||
return false
|
||||
end
|
||||
|
||||
if (entity:IsPlayer() and forcefield:GetMode() == MODE_ALLOW_COMBINE_INF and ix.faction.Get(entity:Team()).allowForcefieldInfestationPassage) then
|
||||
return false
|
||||
end
|
||||
|
||||
local mode = forcefield:GetMode() or MODE_OFFLINE
|
||||
|
||||
return istable(forcefield.MODES[mode]) and forcefield.MODES[mode][1](entity)
|
||||
else
|
||||
return forcefield:GetMode() != 5
|
||||
end
|
||||
end
|
||||
end)
|
||||
else
|
||||
SHIELD_MATERIALS = {
|
||||
nil,
|
||||
ix.util.GetMaterial("models/effects/shield_blue"),
|
||||
ix.util.GetMaterial("models/effects/shield_red"),
|
||||
ix.util.GetMaterial("models/effects/shield_yellow")
|
||||
}
|
||||
|
||||
function ENT:Initialize()
|
||||
local data = {}
|
||||
data.start = self:GetPos() + self:GetRight()*-16
|
||||
data.endpos = self:GetPos() + self:GetRight()*-480
|
||||
data.filter = self
|
||||
local trace = util.TraceLine(data)
|
||||
|
||||
self:SetCustomCollisionCheck(true)
|
||||
self:PhysicsInitConvex({
|
||||
vector_origin,
|
||||
Vector(0, 0, 150),
|
||||
trace.HitPos + Vector(0, 0, 150),
|
||||
trace.HitPos
|
||||
})
|
||||
|
||||
self.distance = self:GetPos():Distance(trace.HitPos)
|
||||
end
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetMode() == MODE_OFFLINE) then
|
||||
return
|
||||
end
|
||||
|
||||
local pos = self:GetPos()
|
||||
local angles = self:GetAngles()
|
||||
local matrix = Matrix()
|
||||
matrix:Translate(pos + self:GetUp() * -40)
|
||||
matrix:Rotate(angles)
|
||||
|
||||
render.SetMaterial(SHIELD_MATERIALS[self:GetMode()])
|
||||
|
||||
local dummy = self:GetDummy()
|
||||
|
||||
if (IsValid(dummy)) then
|
||||
local dummyPos = dummy:GetPos()
|
||||
local vertex = self:WorldToLocal(dummyPos)
|
||||
self:SetRenderBounds(vector_origin, vertex + self:GetUp() * 150)
|
||||
|
||||
cam.PushModelMatrix(matrix)
|
||||
self:DrawShield(vertex)
|
||||
cam.PopModelMatrix()
|
||||
|
||||
matrix:Translate(vertex)
|
||||
matrix:Rotate(Angle(0, 180, 0))
|
||||
|
||||
cam.PushModelMatrix(matrix)
|
||||
self:DrawShield(vertex)
|
||||
cam.PopModelMatrix()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DrawShield(vertex)
|
||||
mesh.Begin(MATERIAL_QUADS, 1)
|
||||
mesh.Position(vector_origin)
|
||||
mesh.TexCoord(0, 0, 0)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(self:GetUp() * 190)
|
||||
mesh.TexCoord(0, 0, 3)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(vertex + self:GetUp() * 190)
|
||||
mesh.TexCoord(0, 3, 3)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(vertex)
|
||||
mesh.TexCoord(0, 3, 0)
|
||||
mesh.AdvanceVertex()
|
||||
mesh.End()
|
||||
end
|
||||
end
|
||||
|
||||
properties.Add("ixForcefieldStartMalfunction", {
|
||||
MenuLabel = "Start Malfunctioning",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/lightning_add.png",
|
||||
|
||||
Filter = function(self, entity, client)
|
||||
if (entity:GetClass() == "ix_forcefield" and !entity:GetMalfunctioning() and CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands", nil)) then return true end
|
||||
end,
|
||||
|
||||
Action = function(self, entity)
|
||||
self:MsgStart()
|
||||
net.WriteEntity(entity)
|
||||
self:MsgEnd()
|
||||
end,
|
||||
|
||||
Receive = function(self, length, client)
|
||||
local entity = net.ReadEntity()
|
||||
|
||||
if (!IsValid(entity)) then return end
|
||||
if (!self:Filter(entity, client)) then return end
|
||||
|
||||
entity:SetMalfunctioning(true)
|
||||
entity:Malfunction()
|
||||
end
|
||||
})
|
||||
|
||||
properties.Add("ixForcefieldStopMalfunction", {
|
||||
MenuLabel = "Stop Malfunctioning",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/lightning_delete.png",
|
||||
|
||||
Filter = function(self, entity, client)
|
||||
if (entity:GetClass() == "ix_forcefield" and entity:GetMalfunctioning() and CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands", nil)) then return true end
|
||||
end,
|
||||
|
||||
Action = function(self, entity)
|
||||
self:MsgStart()
|
||||
net.WriteEntity(entity)
|
||||
self:MsgEnd()
|
||||
end,
|
||||
|
||||
Receive = function(self, length, client)
|
||||
local entity = net.ReadEntity()
|
||||
|
||||
if (!IsValid(entity)) then return end
|
||||
if (!self:Filter(entity, client)) then return end
|
||||
|
||||
entity:SetMalfunctioning(false)
|
||||
end
|
||||
})
|
||||
437
gamemodes/darkrp/entities/entities/ix_rebelfield.lua
Normal file
437
gamemodes/darkrp/entities/entities/ix_rebelfield.lua
Normal file
@@ -0,0 +1,437 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Hacked Forcefield"
|
||||
ENT.Category = "HL2 RP"
|
||||
ENT.Spawnable = true
|
||||
ENT.AdminOnly = true
|
||||
ENT.RenderGroup = RENDERGROUP_BOTH
|
||||
ENT.PhysgunDisabled = true
|
||||
ENT.bNoPersist = true
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Int", 0, "Mode")
|
||||
self:NetworkVar("Entity", 0, "Dummy")
|
||||
self:NetworkVar("Bool", 0, "Malfunctioning")
|
||||
end
|
||||
|
||||
local MODE_OFFLINE = 1
|
||||
local MODE_ALLOW_ALL = 2
|
||||
local MODE_ALLOW_COMBINE = 3
|
||||
local MODE_ALLOW_COMBINE_INF = 4
|
||||
|
||||
if (SERVER) then
|
||||
function ENT:SpawnFunction(client, trace)
|
||||
local angles = (client:GetPos() - trace.HitPos):Angle()
|
||||
angles.p = 0
|
||||
angles.r = 0
|
||||
angles:RotateAroundAxis(angles:Up(), 270)
|
||||
|
||||
local entity = ents.Create("ix_rebelfield")
|
||||
entity:SetPos(trace.HitPos + Vector(0, 0, 40))
|
||||
entity:SetAngles(angles:SnapTo("y", 90))
|
||||
entity:Spawn()
|
||||
entity:Activate()
|
||||
|
||||
Schema:SaveRebelForceFields()
|
||||
return entity
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/willardnetworks/props/forcefield_left.mdl")
|
||||
self:SetSkin(3)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
|
||||
local data = {}
|
||||
data.start = self:GetPos() + self:GetRight() * -16
|
||||
data.endpos = self:GetPos() + self:GetRight() * -480
|
||||
data.filter = self
|
||||
local trace = util.TraceLine(data)
|
||||
|
||||
local angles = self:GetAngles()
|
||||
angles:RotateAroundAxis(angles:Up(), 90)
|
||||
|
||||
self.dummy = ents.Create("prop_physics")
|
||||
self.dummy:SetModel("models/willardnetworks/props/forcefield_right.mdl")
|
||||
self.dummy:SetSkin(3)
|
||||
self.dummy:SetPos(trace.HitPos)
|
||||
self.dummy:SetAngles(self:GetAngles())
|
||||
self.dummy:Spawn()
|
||||
self.dummy.PhysgunDisabled = true
|
||||
self.dummy:SetCollisionGroup(COLLISION_GROUP_WORLD)
|
||||
self:DeleteOnRemove(self.dummy)
|
||||
|
||||
local verts = {
|
||||
{pos = Vector(0, 0, -25)},
|
||||
{pos = Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) + Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) + Vector(0, 0, 150)},
|
||||
{pos = self:WorldToLocal(self.dummy:GetPos()) - Vector(0, 0, 25)},
|
||||
{pos = Vector(0, 0, -25)}
|
||||
}
|
||||
|
||||
self:PhysicsFromMesh(verts)
|
||||
|
||||
local physObj = self:GetPhysicsObject()
|
||||
|
||||
if (IsValid(physObj)) then
|
||||
physObj:EnableMotion(false)
|
||||
physObj:Sleep()
|
||||
end
|
||||
|
||||
self:AddSolidFlags(FSOLID_CUSTOMBOXTEST)
|
||||
self:SetCustomCollisionCheck(true)
|
||||
self:SetDummy(self.dummy)
|
||||
|
||||
physObj = self.dummy:GetPhysicsObject()
|
||||
|
||||
if (IsValid(physObj)) then
|
||||
physObj:EnableMotion(false)
|
||||
physObj:Sleep()
|
||||
end
|
||||
|
||||
self:SetMoveType(MOVETYPE_NOCLIP)
|
||||
self:SetMoveType(MOVETYPE_PUSH)
|
||||
self:MakePhysicsObjectAShadow()
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
end
|
||||
|
||||
function ENT:StartTouch(entity)
|
||||
if (!self.buzzer) then
|
||||
self.buzzer = CreateSound(entity, "ambient/machines/combine_shield_touch_loop1.wav")
|
||||
self.buzzer:Play()
|
||||
self.buzzer:ChangeVolume(0.8, 0)
|
||||
self.buzzer:SetSoundLevel(60)
|
||||
else
|
||||
self.buzzer:ChangeVolume(0.8, 0.5)
|
||||
self.buzzer:Play()
|
||||
end
|
||||
|
||||
self.entities = (self.entities or 0) + 1
|
||||
end
|
||||
|
||||
function ENT:EndTouch(entity)
|
||||
self.entities = math.max((self.entities or 0) - 1, 0)
|
||||
|
||||
if (self.buzzer and self.entities == 0) then
|
||||
self.buzzer:FadeOut(0.5)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (self.buzzer) then
|
||||
self.buzzer:Stop()
|
||||
self.buzzer = nil
|
||||
end
|
||||
|
||||
if (!ix.shuttingDown and !self.ixIsSafe) then
|
||||
Schema:SaveRebelForceFields()
|
||||
end
|
||||
end
|
||||
|
||||
ENT.MODES = {
|
||||
{
|
||||
function(entity)
|
||||
return false
|
||||
end,
|
||||
"field disengaged.",
|
||||
"disengaged",
|
||||
3
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
if (!entity:IsPlayer()) then return true end
|
||||
|
||||
local character = entity:GetCharacter()
|
||||
if (!character or !character:GetInventory()) then
|
||||
return true
|
||||
end
|
||||
|
||||
if (!character:GetInventory():HasItem("id_card", {active = true})) then
|
||||
if character:IsVortigaunt() and
|
||||
character:GetCollarItemID() and
|
||||
ix.item.instances[character:GetCollarItemID()] and
|
||||
-ix.config.Get("blacklistSCAmount", 40) <= ix.item.instances[character:GetCollarItemID()]:GetData("sterilizedCredits", 0) then
|
||||
return false
|
||||
end
|
||||
return false
|
||||
else
|
||||
return false
|
||||
end
|
||||
end,
|
||||
"allow all individuals",
|
||||
"engaged",
|
||||
0
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
return true
|
||||
end,
|
||||
"disallow combine forces.",
|
||||
"restricted",
|
||||
1
|
||||
},
|
||||
{
|
||||
function(entity)
|
||||
return true
|
||||
end,
|
||||
"disallow non-functionary units (Unused Variant... ignore and change!!!)",
|
||||
"restricted",
|
||||
2
|
||||
}
|
||||
}
|
||||
|
||||
function ENT:Use(activator)
|
||||
if ((self.nextUse or 0) < CurTime()) then
|
||||
self.nextUse = CurTime() + 1.5
|
||||
else
|
||||
return
|
||||
end
|
||||
|
||||
local bForced = CAMI.PlayerHasAccess(activator, "Helix - Basic Admin Commands", nil) and activator:GetMoveType() == MOVETYPE_NOCLIP
|
||||
|
||||
if (activator:GetCharacter():HasFlags("F") or bForced) then
|
||||
self:SetMode(self:GetMode() + 1)
|
||||
local action = "modified"
|
||||
|
||||
if (self:GetMode() > #self.MODES) then
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[1][4])
|
||||
self.dummy:SetSkin(self.MODES[1][4])
|
||||
self:EmitSound("npc/turret_floor/die.wav")
|
||||
else
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[self:GetMode()][4])
|
||||
self.dummy:SetSkin(self.MODES[self:GetMode()][4])
|
||||
end
|
||||
|
||||
self:EmitSound("buttons/combine_button5.wav", 140, 100 + (self:GetMode() - 1) * 15)
|
||||
activator:ChatPrint("Changed barrier mode to: " .. self.MODES[self:GetMode()][2])
|
||||
|
||||
Schema:SaveRebelForceFields()
|
||||
if (bForced) then return end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Malfunction()
|
||||
local bMalfunctioning = self:GetMalfunctioning()
|
||||
if (!bMalfunctioning) then return end
|
||||
|
||||
timer.Simple(math.random(0.2, 1), function()
|
||||
if (!self:IsValid()) then return end
|
||||
|
||||
self:SetMode(MODE_OFFLINE)
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[1][4])
|
||||
self.dummy:SetSkin(self.MODES[1][4])
|
||||
self:EmitSound("buttons/combine_button5.wav", 65, 100 + (self:GetMode() - 1) * 15)
|
||||
self:EmitSound("npc/turret_floor/die.wav", 55)
|
||||
|
||||
local target = math.random(2) == 1 and self or self:GetDummy()
|
||||
local vPoint = target:GetPos() + Vector(0, 0, math.random(-10, 100)) + target:GetRight() * (target == self and -10 or 10)
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(vPoint)
|
||||
util.Effect("ManhackSparks", effectdata)
|
||||
|
||||
if (math.random(2) == 1) then
|
||||
target = math.random(2) == 1 and self or self:GetDummy()
|
||||
vPoint = target:GetPos() + Vector(0, 0, math.random(-10, 100)) + target:GetRight() * (target == self and -10 or 10)
|
||||
effectdata = EffectData()
|
||||
effectdata:SetOrigin(vPoint)
|
||||
util.Effect("ManhackSparks", effectdata)
|
||||
end
|
||||
|
||||
self:EmitSound("ambient/energy/zap" .. math.random(1, 9) .. ".wav", 65)
|
||||
|
||||
timer.Simple(math.random(1, 5), function()
|
||||
if (!self:IsValid()) then return end
|
||||
|
||||
self:SetMode(math.random(2, 4))
|
||||
self:CollisionRulesChanged()
|
||||
|
||||
self:SetSkin(self.MODES[self:GetMode()][4])
|
||||
self.dummy:SetSkin(self.MODES[self:GetMode()][4])
|
||||
|
||||
self:EmitSound("buttons/combine_button5.wav", 65, 100 + (self:GetMode() - 1) * 15)
|
||||
|
||||
self:Malfunction()
|
||||
end)
|
||||
end)
|
||||
end
|
||||
|
||||
hook.Add("ShouldCollide", "ix_rebelfields", function(a, b)
|
||||
local entity
|
||||
local forcefield
|
||||
|
||||
if (a:GetClass() == "ix_rebelfield") then
|
||||
entity = b
|
||||
forcefield = a
|
||||
elseif (b:GetClass() == "ix_rebelfield") then
|
||||
entity = a
|
||||
forcefield = b
|
||||
end
|
||||
|
||||
if (IsValid(forcefield)) then
|
||||
if (IsValid(entity)) then
|
||||
if (entity:IsPlayer() and ix.faction.Get(entity:Team()).allowRebelForcefieldPassage) then
|
||||
return false
|
||||
end
|
||||
|
||||
local mode = forcefield:GetMode() or MODE_OFFLINE
|
||||
|
||||
return istable(forcefield.MODES[mode]) and forcefield.MODES[mode][1](entity)
|
||||
else
|
||||
return forcefield:GetMode() != 5
|
||||
end
|
||||
end
|
||||
end)
|
||||
else
|
||||
SHIELD_MATERIALS = {
|
||||
nil,
|
||||
ix.util.GetMaterial("models/effects/shield_blue"),
|
||||
ix.util.GetMaterial("models/effects/shield_red"),
|
||||
ix.util.GetMaterial("models/effects/shield_yellow")
|
||||
}
|
||||
|
||||
function ENT:Initialize()
|
||||
local data = {}
|
||||
data.start = self:GetPos() + self:GetRight()*-16
|
||||
data.endpos = self:GetPos() + self:GetRight()*-480
|
||||
data.filter = self
|
||||
local trace = util.TraceLine(data)
|
||||
|
||||
self:SetCustomCollisionCheck(true)
|
||||
self:PhysicsInitConvex({
|
||||
vector_origin,
|
||||
Vector(0, 0, 150),
|
||||
trace.HitPos + Vector(0, 0, 150),
|
||||
trace.HitPos
|
||||
})
|
||||
|
||||
self.distance = self:GetPos():Distance(trace.HitPos)
|
||||
end
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
|
||||
if (self:GetMode() == MODE_OFFLINE) then
|
||||
return
|
||||
end
|
||||
|
||||
local pos = self:GetPos()
|
||||
local angles = self:GetAngles()
|
||||
local matrix = Matrix()
|
||||
matrix:Translate(pos + self:GetUp() * -40)
|
||||
matrix:Rotate(angles)
|
||||
|
||||
render.SetMaterial(SHIELD_MATERIALS[self:GetMode()])
|
||||
|
||||
local dummy = self:GetDummy()
|
||||
|
||||
if (IsValid(dummy)) then
|
||||
local dummyPos = dummy:GetPos()
|
||||
local vertex = self:WorldToLocal(dummyPos)
|
||||
self:SetRenderBounds(vector_origin, vertex + self:GetUp() * 150)
|
||||
|
||||
cam.PushModelMatrix(matrix)
|
||||
self:DrawShield(vertex)
|
||||
cam.PopModelMatrix()
|
||||
|
||||
matrix:Translate(vertex)
|
||||
matrix:Rotate(Angle(0, 180, 0))
|
||||
|
||||
cam.PushModelMatrix(matrix)
|
||||
self:DrawShield(vertex)
|
||||
cam.PopModelMatrix()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:DrawShield(vertex)
|
||||
mesh.Begin(MATERIAL_QUADS, 1)
|
||||
mesh.Position(vector_origin)
|
||||
mesh.TexCoord(0, 0, 0)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(self:GetUp() * 190)
|
||||
mesh.TexCoord(0, 0, 3)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(vertex + self:GetUp() * 190)
|
||||
mesh.TexCoord(0, 3, 3)
|
||||
mesh.AdvanceVertex()
|
||||
|
||||
mesh.Position(vertex)
|
||||
mesh.TexCoord(0, 3, 0)
|
||||
mesh.AdvanceVertex()
|
||||
mesh.End()
|
||||
end
|
||||
end
|
||||
|
||||
properties.Add("ixRebelfieldStartMalfunction", {
|
||||
MenuLabel = "Start Malfunctioning",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/lightning_add.png",
|
||||
|
||||
Filter = function(self, entity, client)
|
||||
if (entity:GetClass() == "ix_rebelfield" and !entity:GetMalfunctioning() and CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands", nil)) then return true end
|
||||
end,
|
||||
|
||||
Action = function(self, entity)
|
||||
self:MsgStart()
|
||||
net.WriteEntity(entity)
|
||||
self:MsgEnd()
|
||||
end,
|
||||
|
||||
Receive = function(self, length, client)
|
||||
local entity = net.ReadEntity()
|
||||
|
||||
if (!IsValid(entity)) then return end
|
||||
if (!self:Filter(entity, client)) then return end
|
||||
|
||||
entity:SetMalfunctioning(true)
|
||||
entity:Malfunction()
|
||||
end
|
||||
})
|
||||
|
||||
properties.Add("ixRebelfieldStopMalfunction", {
|
||||
MenuLabel = "Stop Malfunctioning",
|
||||
Order = 500,
|
||||
MenuIcon = "icon16/lightning_delete.png",
|
||||
|
||||
Filter = function(self, entity, client)
|
||||
if (entity:GetClass() == "ix_rebelfield" and entity:GetMalfunctioning() and CAMI.PlayerHasAccess(client, "Helix - Basic Admin Commands", nil)) then return true end
|
||||
end,
|
||||
|
||||
Action = function(self, entity)
|
||||
self:MsgStart()
|
||||
net.WriteEntity(entity)
|
||||
self:MsgEnd()
|
||||
end,
|
||||
|
||||
Receive = function(self, length, client)
|
||||
local entity = net.ReadEntity()
|
||||
|
||||
if (!IsValid(entity)) then return end
|
||||
if (!self:Filter(entity, client)) then return end
|
||||
|
||||
entity:SetMalfunctioning(false)
|
||||
end
|
||||
})
|
||||
Reference in New Issue
Block a user