mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
257 lines
5.9 KiB
Lua
257 lines
5.9 KiB
Lua
|
|
--[[
|
||
|
|
| 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()
|
||
|
|
|
||
|
|
DEFINE_BASECLASS "weapon_tttbase"
|
||
|
|
|
||
|
|
SWEP.HoldType = "normal"
|
||
|
|
|
||
|
|
if CLIENT then
|
||
|
|
SWEP.PrintName = "binoc_name"
|
||
|
|
SWEP.Slot = 7
|
||
|
|
|
||
|
|
SWEP.ViewModelFOV = 10
|
||
|
|
SWEP.ViewModelFlip = false
|
||
|
|
SWEP.DrawCrosshair = false
|
||
|
|
|
||
|
|
SWEP.EquipMenuData = {
|
||
|
|
type = "item_weapon",
|
||
|
|
desc = "binoc_desc"
|
||
|
|
};
|
||
|
|
|
||
|
|
SWEP.Icon = "vgui/ttt/icon_binoc"
|
||
|
|
end
|
||
|
|
|
||
|
|
SWEP.Base = "weapon_tttbase"
|
||
|
|
|
||
|
|
SWEP.ViewModel = "models/weapons/v_crowbar.mdl"
|
||
|
|
SWEP.WorldModel = "models/props/cs_office/paper_towels.mdl"
|
||
|
|
|
||
|
|
SWEP.Primary.ClipSize = -1
|
||
|
|
SWEP.Primary.DefaultClip = -1
|
||
|
|
SWEP.Primary.Automatic = false
|
||
|
|
SWEP.Primary.Ammo = "none"
|
||
|
|
SWEP.Primary.Delay = 1.0
|
||
|
|
|
||
|
|
SWEP.Secondary.ClipSize = -1
|
||
|
|
SWEP.Secondary.DefaultClip = -1
|
||
|
|
SWEP.Secondary.Automatic = true
|
||
|
|
SWEP.Secondary.Ammo = "none"
|
||
|
|
SWEP.Secondary.Delay = 0.2
|
||
|
|
|
||
|
|
SWEP.Kind = WEAPON_EQUIP2
|
||
|
|
SWEP.CanBuy = {ROLE_DETECTIVE} -- only detectives can buy
|
||
|
|
SWEP.WeaponID = AMMO_BINOCULARS
|
||
|
|
|
||
|
|
SWEP.AllowDrop = true
|
||
|
|
|
||
|
|
SWEP.ZoomLevels = {
|
||
|
|
0,
|
||
|
|
30,
|
||
|
|
20,
|
||
|
|
10
|
||
|
|
};
|
||
|
|
|
||
|
|
SWEP.ProcessingDelay = 5
|
||
|
|
|
||
|
|
function SWEP:SetupDataTables()
|
||
|
|
self:DTVar("Bool", 0, "processing")
|
||
|
|
self:DTVar("Float", 0, "start_time")
|
||
|
|
self:DTVar("Int", 1, "zoom")
|
||
|
|
|
||
|
|
return self.BaseClass.SetupDataTables(self)
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function SWEP:PrimaryAttack()
|
||
|
|
self:SetNextPrimaryFire( CurTime() + 0.1 )
|
||
|
|
|
||
|
|
if self:IsTargetingCorpse() and not self.dt.processing then
|
||
|
|
self:SetNextPrimaryFire( CurTime() + self.Primary.Delay )
|
||
|
|
|
||
|
|
if SERVER then
|
||
|
|
self.dt.processing = true
|
||
|
|
self.dt.start_time = CurTime()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
local click = Sound("weapons/sniper/sniper_zoomin.wav")
|
||
|
|
function SWEP:SecondaryAttack()
|
||
|
|
self:SetNextSecondaryFire( CurTime() + self.Secondary.Delay )
|
||
|
|
|
||
|
|
if CLIENT and IsFirstTimePredicted() then
|
||
|
|
LocalPlayer():EmitSound(click)
|
||
|
|
end
|
||
|
|
|
||
|
|
self:CycleZoom()
|
||
|
|
|
||
|
|
self.dt.processing = false
|
||
|
|
self.dt.start_time = 0
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:SetZoom(level)
|
||
|
|
if SERVER then
|
||
|
|
self.dt.zoom = level
|
||
|
|
self:GetOwner():SetFOV(self.ZoomLevels[level], 0.3)
|
||
|
|
|
||
|
|
self:GetOwner():DrawViewModel(false)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:CycleZoom()
|
||
|
|
self.dt.zoom = self.dt.zoom + 1
|
||
|
|
if not self.ZoomLevels[self.dt.zoom] then
|
||
|
|
self.dt.zoom = 1
|
||
|
|
end
|
||
|
|
|
||
|
|
self:SetZoom(self.dt.zoom)
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:PreDrop()
|
||
|
|
self:SetZoom(1)
|
||
|
|
self.dt.processing = false
|
||
|
|
return self.BaseClass.PreDrop(self)
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:Holster()
|
||
|
|
self:SetZoom(1)
|
||
|
|
self.dt.processing = false
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:Deploy()
|
||
|
|
if SERVER and IsValid(self:GetOwner()) then
|
||
|
|
self:GetOwner():DrawViewModel(false)
|
||
|
|
end
|
||
|
|
return true
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function SWEP:Reload()
|
||
|
|
return false
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:IsTargetingCorpse()
|
||
|
|
local tr = self:GetOwner():GetEyeTrace(MASK_SHOT)
|
||
|
|
local ent = tr.Entity
|
||
|
|
|
||
|
|
return (IsValid(ent) and ent:GetClass() == "prop_ragdoll" and
|
||
|
|
CORPSE.GetPlayerNick(ent, false) != false)
|
||
|
|
end
|
||
|
|
|
||
|
|
local confirm = Sound("npc/turret_floor/click1.wav")
|
||
|
|
function SWEP:IdentifyCorpse()
|
||
|
|
if SERVER then
|
||
|
|
local tr = self:GetOwner():GetEyeTrace(MASK_SHOT)
|
||
|
|
CORPSE.ShowSearch(self:GetOwner(), tr.Entity, false, true)
|
||
|
|
elseif IsFirstTimePredicted() then
|
||
|
|
LocalPlayer():EmitSound(confirm)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:Think()
|
||
|
|
BaseClass.Think(self)
|
||
|
|
if self.dt.processing then
|
||
|
|
if self:IsTargetingCorpse() then
|
||
|
|
if CurTime() > (self.dt.start_time + self.ProcessingDelay) then
|
||
|
|
self:IdentifyCorpse()
|
||
|
|
|
||
|
|
self.dt.processing = false
|
||
|
|
self.dt.start_time = 0
|
||
|
|
end
|
||
|
|
else
|
||
|
|
self.dt.processing = false
|
||
|
|
self.dt.start_time = 0
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function SWEP:OnRemove()
|
||
|
|
if CLIENT and IsValid(self:GetOwner()) and self:GetOwner() == LocalPlayer() and self:GetOwner():Alive() then
|
||
|
|
RunConsoleCommand("lastinv")
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if CLIENT then
|
||
|
|
function SWEP:Initialize()
|
||
|
|
self:AddHUDHelp("binoc_help_pri", "binoc_help_sec", true)
|
||
|
|
|
||
|
|
return self.BaseClass.Initialize(self)
|
||
|
|
end
|
||
|
|
|
||
|
|
local T = LANG.GetTranslation
|
||
|
|
function SWEP:DrawHUD()
|
||
|
|
self:DrawHelp()
|
||
|
|
|
||
|
|
local length = 40
|
||
|
|
local gap = 10
|
||
|
|
|
||
|
|
local corpse = self:IsTargetingCorpse()
|
||
|
|
|
||
|
|
if corpse then
|
||
|
|
surface.SetDrawColor(0, 255, 0, 255)
|
||
|
|
gap = 4
|
||
|
|
length = 40
|
||
|
|
else
|
||
|
|
surface.SetDrawColor(0, 255, 0, 200)
|
||
|
|
end
|
||
|
|
|
||
|
|
local x = ScrW() / 2.0
|
||
|
|
local y = ScrH() / 2.0
|
||
|
|
|
||
|
|
surface.DrawLine( x - length, y, x - gap, y )
|
||
|
|
surface.DrawLine( x + length, y, x + gap, y )
|
||
|
|
surface.DrawLine( x, y - length, x, y - gap )
|
||
|
|
surface.DrawLine( x, y + length, x, y + gap )
|
||
|
|
|
||
|
|
|
||
|
|
surface.SetFont("DefaultFixedDropShadow")
|
||
|
|
surface.SetTextColor(0, 255, 0, 200)
|
||
|
|
surface.SetTextPos( x + length, y - length )
|
||
|
|
surface.DrawText(T("binoc_zoom_level") .. " " .. self.dt.zoom)
|
||
|
|
|
||
|
|
if corpse then
|
||
|
|
surface.SetTextPos( x + length, y - length + 15)
|
||
|
|
surface.DrawText(T("binoc_body"))
|
||
|
|
end
|
||
|
|
|
||
|
|
if self.dt.processing then
|
||
|
|
y = y + (y / 2)
|
||
|
|
|
||
|
|
local w, h = 200, 20
|
||
|
|
|
||
|
|
surface.SetDrawColor(0, 255, 0, 255)
|
||
|
|
surface.DrawOutlinedRect(x - w/2, y - h, w, h)
|
||
|
|
|
||
|
|
surface.SetDrawColor(0, 255, 0, 180)
|
||
|
|
local pct = math.Clamp((CurTime() - self.dt.start_time) / self.ProcessingDelay, 0, 1)
|
||
|
|
surface.DrawRect(x - w/2, y - h, w * pct, h)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
function SWEP:DrawWorldModel()
|
||
|
|
if not IsValid(self:GetOwner()) then
|
||
|
|
self:DrawModel()
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
function SWEP:AdjustMouseSensitivity()
|
||
|
|
if self.dt.zoom > 0 then
|
||
|
|
return 1 / self.dt.zoom
|
||
|
|
end
|
||
|
|
return -1
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|