dobrograd-13-06-2022/garrysmod/addons/feature-wire/lua/entities/gmod_wire_speedometer.lua
Jonny_Bro (Nikita) e4d5311906 first commit
2023-11-16 15:01:19 +05:00

104 lines
3 KiB
Lua

AddCSLuaFile()
DEFINE_BASECLASS( "base_wire_entity" )
ENT.PrintName = "Wire Speedometer"
ENT.WireDebugName = "Speedo"
function ENT:GetXYZMode()
return self:GetNWBool( 0 )
end
function ENT:GetAngVel()
return self:GetNWBool( 1 )
end
function ENT:SetModes( XYZMode, AngVel )
self:SetNWBool( 0, XYZMode )
self:SetNWBool( 1, AngVel )
end
if CLIENT then
function ENT:Think()
BaseClass.Think(self)
local txt
if (self:GetXYZMode()) then
local vel = self:WorldToLocal(self:GetVelocity()+self:GetPos())
txt = "Velocity = " .. math.Round((-vel.y or 0)*1000)/1000 .. "," .. math.Round((vel.x or 0)*1000)/1000 .. "," .. math.Round((vel.z or 0)*1000)/1000
else
local vel = self:GetVelocity():Length()
txt = "Speed = " .. math.Round((vel or 0)*1000)/1000
end
--sadly self:GetPhysicsObject():GetAngleVelocity() does work client side, so read out is unlikely
/*if (self:GetAngVel()) then
local ang = self:GetPhysicsObject():GetAngleVelocity()
txt = txt .. "\nAngVel = P " .. math.Round((ang.y or 0)*1000)/1000 .. ", Y " .. math.Round((ang.z or 0)*1000) /1000 .. ", R " .. math.Round((ang.x or 0)*1000)/1000
end*/
self:SetOverlayText( txt )
self:NextThink(CurTime()+0.04)
return true
end
return -- No more client
end
local MODEL = Model("models/jaanus/wiretool/wiretool_speed.mdl")
function ENT:Initialize()
self:SetModel( MODEL )
self:PhysicsInit( SOLID_VPHYSICS )
self:SetMoveType( MOVETYPE_VPHYSICS )
self:SetSolid( SOLID_VPHYSICS )
self.Outputs = Wire_CreateOutputs(self, { "Out", "MPH", "KPH" })
end
function ENT:Setup( xyz_mode, AngVel )
self.z_only = xyz_mode --was renamed but kept for dupesaves
self.XYZMode = xyz_mode
self.AngVel = AngVel
self:SetModes( xyz_mode,AngVel )
local outs = {}
if (xyz_mode) then
outs = { "X", "Y", "Z" }
else
outs = { "Out", "MPH", "KPH", }
end
if (AngVel) then
table.Add(outs, {"AngVel_P", "AngVel_Y", "AngVel_R" } )
end
Wire_AdjustOutputs(self, outs)
end
function ENT:Think()
BaseClass.Think(self)
if (self.XYZMode) then
local vel = self:WorldToLocal(self:GetVelocity()+self:GetPos())
if (COLOSSAL_SANDBOX) then vel = vel * 6.25 end
Wire_TriggerOutput(self, "X", -vel.y)
Wire_TriggerOutput(self, "Y", vel.x)
Wire_TriggerOutput(self, "Z", vel.z)
else
local vel = self:GetVelocity():Length()
if (COLOSSAL_SANDBOX) then vel = vel * 6.25 end
Wire_TriggerOutput(self, "Out", vel) // vel = Source Units / sec, Source Units = Inch * 0.75 , more info here: http://developer.valvesoftware.com/wiki/Dimensions#Map_Grid_Units:_quick_reference
Wire_TriggerOutput(self, "MPH", vel * 3600 / 63360 * 0.75)
Wire_TriggerOutput(self, "KPH", vel * 3600 * 0.0000254 * 0.75)
end
if (self.AngVel) then
local ang = self:GetPhysicsObject():GetAngleVelocity()
Wire_TriggerOutput(self, "AngVel_P", ang.y)
Wire_TriggerOutput(self, "AngVel_Y", ang.z)
Wire_TriggerOutput(self, "AngVel_R", ang.x)
end
self:NextThink(CurTime()+0.04)
return true
end
duplicator.RegisterEntityClass("gmod_wire_speedometer", WireLib.MakeWireEnt, "Data", "z_only", "AngVel")