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
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
self:
SetMoveType( MOVETYPE_NONE )
self:
SetCollisionGroup( COLLISION_GROUP_DEBRIS )
self:
SetSkin(
0 )
local compensatedpos
= Vector(
0,
0,
0 )
compensatedpos:
Set( trace_t.Normal )
compensatedpos:
Mul(
-6 )
compensatedpos:
Add( trace_t.HitPos )
self:
SetPos( compensatedpos )
self:
SetParent( pOther )
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 )
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 )
self.Think
= self.Remove
self:
NextThink(
CurTime()
+ 10 )
end
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