ENTITY:ResolveCustomFlyCollision
Son Eklenenler
Bu yakın zamanda versiyonunda (2026.04.08) eklendi. Dev Şubesi - Evet, şimdi.
Açıklama
Uçan varlıklar için VPfizik olmayan bir çarpışma olayı sırasında çağrıldı.
Bu, mermilerin kendi yöntemleriyle yüzeylerden sıçramasını sağlamak için en iyi şekilde kullanılır. Entity:GetMoveType İkisi de olmalı. MOVETYPE_FLY ya da Hareket türü_Uçak ağırlığı, ve Entity:GetMoveCollide Öyle olmalı. MOVECOLLIDE_FLY_CUSTOM.
Bu sadece...
anim tür varlıkları.Argümanlar
Geri dönüşler
Örnek
Herhangi bir hız kaybı olmadan yüzeylerden doğrudan yansıyan roket modeli. sent_ball.
AddCSLuaFile()
ENT.Base = "base_anim"
ENT.Type = "anim"
ENT.PrintName = "Bouncy Rocket"
ENT.Category = "Other"
ENT.Editable = true
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
ENT.PhysicsSolidMask = MASK_SOLID + CONTENTS_HITBOX - Vfizik ile çarpışır.
function ENT:Initialize()
self:SetModel( "models/weapons/w_missile_closed.mdl" )
self:SetMoveType( MOVETYPE_FLY )
self:SetMoveCollide( MOVECOLLIDE_FLY_CUSTOM )
self:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
self:SetSolid( SOLID_BBOX ) -- diğer varlıklar ile çarpışmayı açar.
self:SetCollisionBounds( Vector( -1, -1, -1 ), Vector( 1, 1, 1 ) )
self:SetVelocity( self:GetForward() * 650 )
end
if ( CLIENT ) then return end
function ENT:ResolveCustomFlyCollision( traceResult, vel )
vel = self:GetVelocity() -- değiştirilmemiş hız kullanılarak
local speed = vel:Length()
local tempdir = traceResult.HitNormal
tempdir:Mul( 2 * vel:Dot( tempdir ) )
local dir = vel
dir:Sub( tempdir )
dir:Normalize()
local reflectionangle = dir:Angle()
local newvel = dir
newvel:Mul( speed )
self:SetLocalVelocity( newvel )
self:SetAngles( reflectionangle )
end
Örnek
Motorun çapraz ok çubuğunun küçültülmüş bir versiyonu ve davranışını çok yakından taklit ediyor. Uçuyor, yansıtıyor yapışıp duruyor acı veriyor.
AddCSLuaFile()
ENT.Base = "base_anim"
ENT.Type = "anim"
ENT.PrintName = "Simple Crossbow Bolt"
ENT.Category = "Other"
ENT.Spawnable = true
ENT.AdminOnly = true
ENT.RenderGroup = RENDERGROUP_OPAQUE
ENT.PhysicsSolidMask = bit.band( bit.bor( MASK_SOLID, CONTENTS_HITBOX ), bit.bnot( CONTENTS_GRATE ) )
function ENT:Initialize()
self:SetModel( "models/crossbow_bolt.mdl" )
self:SetSolid( SOLID_BBOX )
self:AddSolidFlags( FSOLID_NOT_STANDABLE )
self:SetCollisionGroup( COLLISION_GROUP_PROJECTILE )
self:SetCollisionBounds( Vector( -1, -1, -1 ), Vector( 1, 1, 1 ) )
self:SetMoveType( MOVETYPE_FLYGRAVITY )
self:SetMoveCollide( MOVECOLLIDE_FLY_CUSTOM )
self:SetGravity( 0.05 )
self:SetSkin( 1 )
end
if ( CLIENT ) then return end
local BOLT_AIR_VELOCITY = 3500
function ENT:SpawnFunction( pPlayer, trace_t, classname )
if ( not trace_t.Hit ) then return end
local aimdirection = trace_t.Normal
local angles = aimdirection:Angle()
local origin
local velocity
local simplecrossbowbolt = ents.Create( classname )
simplecrossbowbolt:SetAngles( angles )
origin = aimdirection
origin:Mul( 32 )
origin:Add( trace_t.StartPos )
simplecrossbowbolt:SetPos( origin )
velocity = origin
velocity:Sub( trace_t.StartPos )
velocity:Div( 32 )
velocity:Mul( BOLT_AIR_VELOCITY )
simplecrossbowbolt:SetVelocity( velocity )
simplecrossbowbolt:SetOwner( pPlayer )
simplecrossbowbolt:Spawn()
return simplecrossbowbolt
end
function ENT:ResolveCustomFlyCollision( trace_t, velocity )
if ( trace_t.HitSky ) then return self:Remove() end
local pOther = trace_t.Entity
self:EmitSound( "Weapon_Crossbow.BoltHitWorld" )
local direction = self:GetVelocity()
local speed = direction:Length()
direction:Normalize()
direction:Negate()
local hitDot = trace_t.HitNormal:Dot( direction )
direction:Negate()
if ( ( hitDot < 0.5 ) and ( speed > 100 ) ) then -- Geriye dönün.
local vecReflection = Vector( 0, 0, 0 )
vecReflection:Set( trace_t.HitNormal )
vecReflection:Mul( 2 * hitDot )
vecReflection:Add( direction )
self:SetAngles( vecReflection:Angle() )
velocity = vecReflection
velocity:Mul( speed * 0.75 )
self:SetLocalVelocity( velocity )
self:SetGravity( 1 )
else - Sıkıştır...
self:SetMoveType( MOVETYPE_NONE )
self:SetCollisionGroup( COLLISION_GROUP_DEBRIS )
self:SetSkin( 0 )
- Çubuğu biraz geriye çek ki temiz görünsün.
local compensatedpos = Vector( 0, 0, 0 )
compensatedpos:Set( trace_t.Normal )
compensatedpos:Mul( -6 )
compensatedpos:Add( trace_t.HitPos )
self:SetPos( compensatedpos )
- Yapıştır.
self:SetParent( pOther )
-- Etki etkisi bırakın.
local data = EffectData()
data:SetOrigin( trace_t.HitPos )
data:SetStart( trace_t.StartPos )
data:SetSurfaceProp( trace_t.SurfaceProps )
data:SetDamageType( DMG_BULLET )
data:SetHitBox( trace_t.HitBox )
data:SetEntIndex( pOther:EntIndex() )
util.Effect( "Impact", data )
- Bazı hasarlara neden olur.
local info = DamageInfo()
info:SetAttacker( self:GetOwner() )
info:SetInflictor( self )
info:SetDamage( 100 )
info:SetDamageType( DMG_BULLET )
info:SetDamagePosition( trace_t.HitPos )
local force = compensatedpos
force:Set( trace_t.Normal )
force:Mul( 75 * 4 * 0.7 )
info:SetDamageForce( force )
pOther:TakeDamageInfo( info )
-- Programın kaldırılması
self.Think = self.Remove
self:NextThink( CurTime() + 10 )
end
- Ateş kıvılcımları.
local data = EffectData()
data:SetOrigin( trace_t.HitPos )
data:SetMagnitude( 2 )
data:SetScale( 1 )
local normal = trace_t.Normal
normal:Negate()
data:SetNormal( normal )
util.Effect( "ElectricSpark", data )
end
Tüm sunucular · GmodTR Launcher · Rehber · GMod Wiki · GmodTR nedir? · Sunucu ekle · Discord