CGamer
20.02.2010, 15:11
Ich versuche mit Lua die größe eines Models/Entities rauszufinden. Die wiki.garrysmod.com ist ja noch ziemlich lückenhaft was das angeht :/
Im Adv. Stacker gibts eine funktion die das macht. Nur habe ich absolut keine Ahnung was die genutzen Funktionen(...AABB, ...OBB) machen.
function TOOL:CalcOffset( ent )
-- makes ghosts' DoRagdollBone() 5-7 times faster
if CLIENT && mem[ent] && mem[ent].frame == FrameNumber() then return mem[ent].transl, mem[ent].rot end
local usephysics = self:GetClientBool( USEPHYSICS )
local worldspace = self:GetClientBool( WORLDSPACE )
local dir = self:GetClientNumber( DIRECTION )
local offset = self:GetClientVector( OFFSET )
local offset_td = self:GetClientBool( OFFTIMESDIM )
local rot = self:GetClientAngle( ROTATION )
local roto = self:GetClientVector( ROTORIGIN )
local ang, mins, maxs, rotoffset
if worldspace then
ang = Angle(0,0,0)
mins, maxs = ent:WorldSpaceAABB()
rotoffset = vector_origin
--[[
roto = ent:LocalToWorld( roto ) - ent:GetPos()
rotoffset = roto - VecRotate( roto, rot )
rot = ent:LocalToWorldAngles( ang - rot )
--]]
else
ang = ent:GetAngles()
assert( !(usephysics && CLIENT) )
if usephysics && IsValid( ent:GetPhysicsObject() ) then
for _, obj in PhysObjects(ent) do
local omins, omaxs = obj:GetAABB()
if !mins then
mins = obj:LocalToWorldVector(omins)
maxs = obj:LocalToWorldVector(omaxs)
else
mins = VecMin( mins, obj:LocalToWorldVector(omins) )
maxs = VecMax( maxs, obj:LocalToWorldVector(omaxs) )
end
end
else
mins, maxs = ent:OBBMins(), ent:OBBMaxs()
end
--offset = ent:LocalToWorld( offset ) - ent:GetPos()
rotoffset = roto - VecRotate( roto, rot )
rotoffset = ent:LocalToWorld( rotoffset ) - ent:GetPos()
rot = ent:LocalToWorldAngles( rot ) - ent:GetAngles()
end
local dimensions = maxs - mins
if offset_td then
offset.x = offset.x * dimensions.x
offset.y = offset.y * dimensions.y
offset.z = offset.z * dimensions.z
end
local transl = dir == 0 and vector_origin or (-1)^(dir-1) * ang[ dirs[dir] ](ang) * dimensions[ dims[dir] ] -- ÿ ìàíüÿã, çíàþ.
offset = ang:Forward()*offset.x - ang:Right()*offset.y + ang:Up()*offset.z
transl = transl + offset + rotoffset
if CLIENT then mem[ent] = { frame = FrameNumber(), transl = transl, rot = rot } end
return transl, rot
end
Kennt jemand eine Lösung/Möglichkeit (die GM:Think "fähig"(Custom AI) ist)?
Edit: nvm. 2 Stunden nach dem ich den Beitrag hier geschrieben hatte, sind die Befehle nicht mehr nicht dokumentiert.
Im Adv. Stacker gibts eine funktion die das macht. Nur habe ich absolut keine Ahnung was die genutzen Funktionen(...AABB, ...OBB) machen.
function TOOL:CalcOffset( ent )
-- makes ghosts' DoRagdollBone() 5-7 times faster
if CLIENT && mem[ent] && mem[ent].frame == FrameNumber() then return mem[ent].transl, mem[ent].rot end
local usephysics = self:GetClientBool( USEPHYSICS )
local worldspace = self:GetClientBool( WORLDSPACE )
local dir = self:GetClientNumber( DIRECTION )
local offset = self:GetClientVector( OFFSET )
local offset_td = self:GetClientBool( OFFTIMESDIM )
local rot = self:GetClientAngle( ROTATION )
local roto = self:GetClientVector( ROTORIGIN )
local ang, mins, maxs, rotoffset
if worldspace then
ang = Angle(0,0,0)
mins, maxs = ent:WorldSpaceAABB()
rotoffset = vector_origin
--[[
roto = ent:LocalToWorld( roto ) - ent:GetPos()
rotoffset = roto - VecRotate( roto, rot )
rot = ent:LocalToWorldAngles( ang - rot )
--]]
else
ang = ent:GetAngles()
assert( !(usephysics && CLIENT) )
if usephysics && IsValid( ent:GetPhysicsObject() ) then
for _, obj in PhysObjects(ent) do
local omins, omaxs = obj:GetAABB()
if !mins then
mins = obj:LocalToWorldVector(omins)
maxs = obj:LocalToWorldVector(omaxs)
else
mins = VecMin( mins, obj:LocalToWorldVector(omins) )
maxs = VecMax( maxs, obj:LocalToWorldVector(omaxs) )
end
end
else
mins, maxs = ent:OBBMins(), ent:OBBMaxs()
end
--offset = ent:LocalToWorld( offset ) - ent:GetPos()
rotoffset = roto - VecRotate( roto, rot )
rotoffset = ent:LocalToWorld( rotoffset ) - ent:GetPos()
rot = ent:LocalToWorldAngles( rot ) - ent:GetAngles()
end
local dimensions = maxs - mins
if offset_td then
offset.x = offset.x * dimensions.x
offset.y = offset.y * dimensions.y
offset.z = offset.z * dimensions.z
end
local transl = dir == 0 and vector_origin or (-1)^(dir-1) * ang[ dirs[dir] ](ang) * dimensions[ dims[dir] ] -- ÿ ìàíüÿã, çíàþ.
offset = ang:Forward()*offset.x - ang:Right()*offset.y + ang:Up()*offset.z
transl = transl + offset + rotoffset
if CLIENT then mem[ent] = { frame = FrameNumber(), transl = transl, rot = rot } end
return transl, rot
end
Kennt jemand eine Lösung/Möglichkeit (die GM:Think "fähig"(Custom AI) ist)?
Edit: nvm. 2 Stunden nach dem ich den Beitrag hier geschrieben hatte, sind die Befehle nicht mehr nicht dokumentiert.