ENTITY:ResolveCustomFlyCollision

  boolean ENTITY:ResolveCustomFlyCollision( table traceResult, vector vel )

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

1. Tablo ile TraceResult yapısı traceResult
TraceResult yapısı Çarpışmanın gerçekleştiği yer.
2. vektör
Hesaplanan hız sıçrama, esneklik, zemin kayma vb. gibi hesaplamalardan sonra...

Geri dönüşler

1. Boolean
Geri dön. true Default eylemini önlemek için.

Ö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