mirror of
https://github.com/lifestorm/wnsrc.git
synced 2025-12-17 13:53:45 +03:00
Upload
This commit is contained in:
@@ -0,0 +1,330 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
include( 'shared.lua' )
|
||||
include( 'outputs.lua' )
|
||||
|
||||
|
||||
FRAG_GRENADE_BLIP_FREQUENCY_HL2R = 1.0
|
||||
FRAG_GRENADE_BLIP_FAST_FREQUENCY_HL2R = 0.3
|
||||
|
||||
FRAG_GRENADE_GRACE_TIME_AFTER_PICKUP_HL2R = 1.5
|
||||
FRAG_GRENADE_WARN_TIME_HL2R = 1.5
|
||||
|
||||
GRENADE_COEFFICIENT_OF_RESTITUTION_HL2R = 0.2;
|
||||
|
||||
local sk_plr_dmg_fraggrenade = 125;
|
||||
local sk_npc_dmg_fraggrenade = 75;
|
||||
local sk_fraggrenade_radius = 250;
|
||||
|
||||
GRENADE_MODEL_HL2R = "models/weapons/tfa_hl2r/w_grenade_thrown.mdl"
|
||||
|
||||
GLOW_CREATED_HL2R = FALSE;
|
||||
|
||||
function ENT:GetShakeAmplitude() return 25.0; end
|
||||
function ENT:GetShakeRadius() return 750.0; end
|
||||
|
||||
// Damage accessors.
|
||||
function ENT:GetDamage()
|
||||
return self.m_flDamage;
|
||||
end
|
||||
function ENT:GetDamageRadius()
|
||||
return self.m_DmgRadius;
|
||||
end
|
||||
|
||||
function ENT:SetDamage(flDamage)
|
||||
self.m_flDamage = flDamage;
|
||||
end
|
||||
|
||||
function ENT:SetDamageRadius(flDamageRadius)
|
||||
self.m_DmgRadius = flDamageRadius;
|
||||
end
|
||||
|
||||
// Bounce sound accessors.
|
||||
function ENT:SetBounceSound( pszBounceSound )
|
||||
self.m_iszBounceSound = tostring( pszBounceSound );
|
||||
end
|
||||
|
||||
function ENT:BlipSound()
|
||||
local efdata = EffectData()
|
||||
efdata:SetEntity(self)
|
||||
efdata:SetFlags(1) -- regular beep
|
||||
util.Effect("tfa_hl2r_frag_beeplight", efdata)
|
||||
|
||||
self.Entity:EmitSound( self.Sound.Blip );
|
||||
end
|
||||
|
||||
// UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution.
|
||||
function ENT:Explode( pTrace, bitsDamageType )
|
||||
|
||||
if !( CLIENT ) then
|
||||
|
||||
self.Entity:SetModel( "" );//invisible
|
||||
self.Entity:SetColor( color_transparent );
|
||||
self.Entity:SetSolid( SOLID_NONE );
|
||||
|
||||
self.m_takedamage = DAMAGE_NO;
|
||||
|
||||
local vecAbsOrigin = self.Entity:GetPos();
|
||||
local contents = util.PointContents ( vecAbsOrigin );
|
||||
|
||||
if ( pTrace.Fraction != 1.0 ) then
|
||||
local vecNormal = pTrace.HitNormal;
|
||||
local pdata = pTrace.MatType;
|
||||
|
||||
util.BlastDamage( self.Entity, // don't apply cl_interp delay
|
||||
self:GetOwner(),
|
||||
self.Entity:GetPos(),
|
||||
self.m_DmgRadius,
|
||||
self.m_flDamage );
|
||||
else
|
||||
util.BlastDamage( self.Entity, // don't apply cl_interp delay
|
||||
self:GetOwner(),
|
||||
self.Entity:GetPos(),
|
||||
self.m_DmgRadius,
|
||||
self.m_flDamage );
|
||||
end
|
||||
|
||||
self:DoExplodeEffect();
|
||||
|
||||
self:OnExplode( pTrace );
|
||||
|
||||
self.Entity:EmitSound( self.Sound.Explode );
|
||||
|
||||
self.Touch = function( ... ) return end;
|
||||
self.Entity:SetSolid( SOLID_NONE );
|
||||
|
||||
self.Entity:SetVelocity( self:GetPos() );
|
||||
|
||||
// Because the grenade is zipped out of the world instantly, the EXPLOSION sound that it makes for
|
||||
// the AI is also immediately destroyed. For this reason, we now make the grenade entity inert and
|
||||
// throw it away in 1/10th of a second instead of right away. Removing the grenade instantly causes
|
||||
// intermittent bugs with env_microphones who are listening for explosions. They will 'randomly' not
|
||||
// hear explosion sounds when the grenade is removed and the SoundEnt thinks (and removes the sound)
|
||||
// before the env_microphone thinks and hears the sound.
|
||||
SafeRemoveEntityDelayed( self.Entity, 0.1 );
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function ENT:Detonate()
|
||||
|
||||
local tr;
|
||||
local vecSpot;// trace starts here!
|
||||
|
||||
self.Think = function( ... ) return end;
|
||||
|
||||
if self:WaterLevel() < 3 then
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2r_explosion_grenade_noaftersmoke" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
end
|
||||
|
||||
vecSpot = self.Entity:GetPos() + Vector ( 0 , 0 , 8 );
|
||||
tr = {};
|
||||
tr.start = vecSpot;
|
||||
tr.endpos = vecSpot + Vector ( 0, 0, -32 );
|
||||
tr.mask = MASK_SHOT_HULL;
|
||||
tr.filter = self.Entity;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine ( tr);
|
||||
|
||||
if( tr.StartSolid ) then
|
||||
// Since we blindly moved the explosion origin vertically, we may have inadvertently moved the explosion into a solid,
|
||||
// in which case nothing is going to be harmed by the grenade's explosion because all subsequent traces will startsolid.
|
||||
// If this is the case, we do the downward trace again from the actual origin of the grenade. (sjb) 3/8/2007 (for ep2_outland_09)
|
||||
tr = {};
|
||||
tr.start = self.Entity:GetPos();
|
||||
tr.endpos = self.Entity:GetPos() + Vector( 0, 0, -32);
|
||||
tr.mask = MASK_SHOT_HULL;
|
||||
tr.filter = self.Entity;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine( tr );
|
||||
end
|
||||
|
||||
tr = self:Explode( tr, DMG_BLAST );
|
||||
|
||||
if ( self:GetShakeAmplitude() ) then
|
||||
util.ScreenShake( self.Entity:GetPos(), self:GetShakeAmplitude(), 150.0, 1.0, self:GetShakeRadius() );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Initialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Initialize()
|
||||
|
||||
self.m_hThrower = NULL;
|
||||
self.m_hOriginalThrower = NULL;
|
||||
self.m_bIsLive = false;
|
||||
self.m_DmgRadius = 100;
|
||||
self.m_flDetonateTime = CurTime() + GRENADE_TIMER_HL2R;
|
||||
self.m_flWarnAITime = CurTime() + GRENADE_TIMER_HL2R - FRAG_GRENADE_WARN_TIME_HL2R;
|
||||
self.m_bHasWarnedAI = false;
|
||||
|
||||
self:Precache( );
|
||||
|
||||
self.Entity:SetModel( GRENADE_MODEL_HL2R );
|
||||
|
||||
if( self:GetOwner() && self:GetOwner():IsPlayer() ) then
|
||||
self.m_flDamage = sk_plr_dmg_fraggrenade;
|
||||
self.m_DmgRadius = sk_fraggrenade_radius;
|
||||
else
|
||||
self.m_flDamage = sk_npc_dmg_fraggrenade;
|
||||
self.m_DmgRadius = sk_fraggrenade_radius;
|
||||
end
|
||||
|
||||
self.m_takedamage = DAMAGE_YES;
|
||||
self.m_iHealth = 1;
|
||||
|
||||
self.Entity:SetCollisionBounds( -Vector(4,4,4), Vector(4,4,4) );
|
||||
self:CreateVPhysics();
|
||||
|
||||
self:BlipSound();
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FREQUENCY_HL2R;
|
||||
|
||||
self.m_combineSpawned = false;
|
||||
self.m_punted = false;
|
||||
|
||||
self:CreateEffects();
|
||||
|
||||
self:OnInitialize();
|
||||
self.BaseClass:Initialize();
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:OnRestore()
|
||||
|
||||
// If we were primed and ready to detonate, put FX on us.
|
||||
if (self.m_flDetonateTime > 0) then
|
||||
self:CreateEffects();
|
||||
end
|
||||
|
||||
self.BaseClass:OnRestore();
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:CreateEffects()
|
||||
|
||||
local nAttachment = self:LookupAttachment( "fuse" );
|
||||
|
||||
// Start up the eye trail
|
||||
self.m_pGlowTrail = util.SpriteTrail( self.Entity, nAttachment, self.Trail.Color, true, self.Trail.StartWidth, self.Trail.EndWidth, self.Trail.LifeTime, 1 / ( self.Trail.StartWidth + self.Trail.EndWidth ) * 0.5, self.Trail.Material );
|
||||
|
||||
end
|
||||
|
||||
function ENT:CreateVPhysics()
|
||||
|
||||
// Create the object in the physics system
|
||||
self.Entity:PhysicsInit( SOLID_VPHYSICS, 0, false );
|
||||
|
||||
local Phys = self:GetPhysicsObject()
|
||||
if ( Phys ) then
|
||||
|
||||
Phys:SetMaterial( "grenade" )
|
||||
|
||||
end
|
||||
return true;
|
||||
|
||||
end
|
||||
|
||||
function ENT:Precache()
|
||||
|
||||
util.PrecacheModel( GRENADE_MODEL_HL2R );
|
||||
|
||||
util.PrecacheSound( self.Sound.Blip );
|
||||
|
||||
util.PrecacheModel( "sprites/redglow1.vmt" );
|
||||
util.PrecacheModel( self.Trail.Material );
|
||||
|
||||
util.PrecacheSound( self.Sound.Explode );
|
||||
|
||||
end
|
||||
|
||||
function ENT:SetTimer( detonateDelay, warnDelay )
|
||||
|
||||
self.m_flDetonateTime = CurTime() + detonateDelay;
|
||||
self.m_flWarnAITime = CurTime() + warnDelay;
|
||||
self.Entity:NextThink( CurTime() );
|
||||
|
||||
self:CreateEffects();
|
||||
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
|
||||
self:OnThink()
|
||||
|
||||
if( CurTime() > self.m_flDetonateTime ) then
|
||||
self:Detonate();
|
||||
return;
|
||||
end
|
||||
|
||||
if( !self.m_bHasWarnedAI && CurTime() >= self.m_flWarnAITime ) then
|
||||
self.m_bHasWarnedAI = true;
|
||||
end
|
||||
|
||||
if( CurTime() > self.m_flNextBlipTime ) then
|
||||
self:BlipSound();
|
||||
|
||||
if( self.m_bHasWarnedAI ) then
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FAST_FREQUENCY_HL2R;
|
||||
else
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FREQUENCY_HL2R;
|
||||
end
|
||||
end
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.1 );
|
||||
|
||||
end
|
||||
|
||||
function ENT:SetVelocity( velocity, angVelocity )
|
||||
|
||||
local pPhysicsObject = self:GetPhysicsObject();
|
||||
if ( pPhysicsObject ) then
|
||||
pPhysicsObject:AddVelocity( velocity );
|
||||
pPhysicsObject:AddAngleVelocity( angVelocity );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnTakeDamage
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnTakeDamage( dmginfo )
|
||||
|
||||
// Manually apply vphysics because BaseCombatCharacter takedamage doesn't call back to CBaseEntity OnTakeDamage
|
||||
self.Entity:TakePhysicsDamage( dmginfo );
|
||||
|
||||
// Grenades only suffer blast damage and burn damage.
|
||||
if( !(dmginfo:GetDamageType() == bit.bor( DMG_BLAST, DMG_BURN) ) ) then
|
||||
return 0;
|
||||
end
|
||||
|
||||
return self.BaseClass:OnTakeDamage( dmginfo );
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,84 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Sound = {}
|
||||
ENT.Sound.Blip = "TFA_HL2R_Grenade.Beep"
|
||||
ENT.Sound.Explode = "BaseGrenade.Explode"
|
||||
|
||||
ENT.Trail = {}
|
||||
ENT.Trail.Color = Color( 255, 0, 0, 255 )
|
||||
ENT.Trail.Material = "sprites/bluelaser1.vmt"
|
||||
ENT.Trail.StartWidth = 8.0
|
||||
ENT.Trail.EndWidth = 1.0
|
||||
ENT.Trail.LifeTime = 0.5
|
||||
|
||||
// Nice helper function, this does all the work.
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: DoExplodeEffect
|
||||
---------------------------------------------------------*/
|
||||
function ENT:DoExplodeEffect()
|
||||
|
||||
local info = EffectData();
|
||||
info:SetEntity( self.Entity );
|
||||
info:SetOrigin( self.Entity:GetPos() );
|
||||
|
||||
if self:WaterLevel() >= 3 then
|
||||
util.Effect("WaterSurfaceExplosion", info)
|
||||
end
|
||||
|
||||
--util.Effect( "Explosion", info );
|
||||
self:EmitSound("BaseExplosionEffect.Sound")
|
||||
util.Effect("tfa_hl2r_fx_explosion_dlight", info)
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnExplode
|
||||
Desc: The grenade has just exploded.
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnExplode( pTrace )
|
||||
|
||||
local Pos1 = pTrace.HitPos + pTrace.HitNormal
|
||||
local Pos2 = pTrace.HitPos - pTrace.HitNormal
|
||||
|
||||
util.Decal( "Scorch", Pos1, Pos2 );
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnInitialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnInitialize()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: StartTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:StartTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: EndTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:EndTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Touch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Touch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnThink
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnThink()
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.PrintName = ""
|
||||
ENT.Author = ""
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
@@ -0,0 +1,176 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
include( 'shared.lua' )
|
||||
include( 'outputs.lua' )
|
||||
|
||||
|
||||
MAX_AR2_NO_COLLIDE_TIME = 0.2
|
||||
|
||||
AR2_GRENADE_MAX_DANGER_RADIUS = 300
|
||||
|
||||
// Moved to HL2_SharedGameRules because these are referenced by shared AmmoDef functions
|
||||
local sk_plr_dmg_smg1_grenade = 100;
|
||||
local sk_npc_dmg_smg1_grenade = 50;
|
||||
local sk_max_smg1_grenade = 3;
|
||||
|
||||
local sk_smg1_grenade_radius = 250;
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Initialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Initialize()
|
||||
|
||||
self:Precache( );
|
||||
self.Entity:SetModel( "models/Items/AR2_Grenade.mdl");
|
||||
self.Entity:PhysicsInit( SOLID_VPHYSICS );
|
||||
self.Entity:SetMoveCollide( MOVECOLLIDE_FLY_BOUNCE );
|
||||
|
||||
// Hits everything but debris
|
||||
self.Entity:SetCollisionGroup( COLLISION_GROUP_PROJECTILE );
|
||||
self.Entity:GetPhysicsObject():SetBuoyancyRatio( 0 )
|
||||
|
||||
self.Entity:SetCollisionBounds(Vector(-3, -3, -3), Vector(3, 3, 3));
|
||||
// self.Entity:SetCollisionBounds(Vector(0, 0, 0), Vector(0, 0, 0));
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.1 );
|
||||
|
||||
if( self:GetOwner() && self:GetOwner():IsPlayer() ) then
|
||||
self.m_flDamage = sk_plr_dmg_smg1_grenade;
|
||||
else
|
||||
self.m_flDamage = sk_npc_dmg_smg1_grenade;
|
||||
end
|
||||
|
||||
self.m_DmgRadius = sk_smg1_grenade_radius;
|
||||
self.m_takedamage = DAMAGE_YES;
|
||||
self.m_bIsLive = true;
|
||||
self.m_iHealth = 1;
|
||||
|
||||
self.Entity:SetGravity( 400 / 600 ); // use a lower gravity for grenades to make them easier to see
|
||||
self.Entity:SetFriction( 0.8 );
|
||||
self.Entity:SetSequence( 0 );
|
||||
|
||||
self.m_fDangerRadius = 100;
|
||||
|
||||
self.m_fSpawnTime = CurTime();
|
||||
|
||||
ParticleEffectAttach("rocket_smoke_trail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
|
||||
self:OnInitialize();
|
||||
|
||||
end
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: The grenade has a slight delay before it goes live. That way the
|
||||
// person firing it can bounce it off a nearby wall. However if it
|
||||
// hits another character it blows up immediately
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:Think()
|
||||
|
||||
self:OnThink()
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.05 );
|
||||
|
||||
if (!self.m_bIsLive) then
|
||||
// Go live after a short delay
|
||||
if (self.m_fSpawnTime + MAX_AR2_NO_COLLIDE_TIME < CurTime()) then
|
||||
self.m_bIsLive = true;
|
||||
end
|
||||
end
|
||||
|
||||
// If I just went solid and my velocity is zero, it means I'm resting on
|
||||
// the floor already when I went solid so blow up
|
||||
if (self.m_bIsLive) then
|
||||
if (self.Entity:GetVelocity():Length() == 0.0 ||
|
||||
self.Entity:GetGroundEntity() != NULL ) then
|
||||
// self:Detonate();
|
||||
end
|
||||
end
|
||||
|
||||
// The old way of making danger sounds would scare the crap out of EVERYONE between you and where the grenade
|
||||
// was going to hit. The radius of the danger sound now 'blossoms' over the grenade's lifetime, making it seem
|
||||
// dangerous to a larger area downrange than it does from where it was fired.
|
||||
if( self.m_fDangerRadius <= AR2_GRENADE_MAX_DANGER_RADIUS ) then
|
||||
self.m_fDangerRadius = self.m_fDangerRadius + ( AR2_GRENADE_MAX_DANGER_RADIUS * 0.05 );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: PhysicsCollide
|
||||
---------------------------------------------------------*/
|
||||
function ENT:PhysicsCollide( data, physobj )
|
||||
|
||||
self:Touch( data.HitEntity )
|
||||
self.PhysicsCollide = function( ... ) return end
|
||||
|
||||
end
|
||||
|
||||
function ENT:Detonate()
|
||||
|
||||
if (!self.m_bIsLive) then
|
||||
return;
|
||||
end
|
||||
self.m_bIsLive = false;
|
||||
self.m_takedamage = DAMAGE_NO;
|
||||
|
||||
if(self.m_hSmokeTrail) then
|
||||
self.m_hSmokeTrail:Remove();
|
||||
self.m_hSmokeTrail = NULL;
|
||||
end
|
||||
|
||||
self:DoExplodeEffect()
|
||||
|
||||
local vecForward = self.Entity:GetVelocity();
|
||||
vecForward = VectorNormalize(vecForward);
|
||||
local tr;
|
||||
tr = {};
|
||||
tr.start = self.Entity:GetPos();
|
||||
tr.endpos = self.Entity:GetPos() + 60*vecForward;
|
||||
tr.mask = MASK_SHOT;
|
||||
tr.filter = self;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine ( tr);
|
||||
|
||||
|
||||
self:OnExplode( tr );
|
||||
|
||||
if self:WaterLevel() < 3 then
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2r_explosion_grenade_noaftersmoke" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
end
|
||||
|
||||
self:EmitSound( self.Sound.Explode );
|
||||
self:EmitSound( self.Sound.ExplodeR );
|
||||
|
||||
util.ScreenShake( self.Entity:GetPos(), 25.0, 150.0, 1.0, 750, SHAKE_START );
|
||||
|
||||
util.BlastDamage ( self.Entity, self:GetOwner(), self.Entity:GetPos(), self.m_DmgRadius, self.m_flDamage );
|
||||
|
||||
self.Entity:Remove();
|
||||
|
||||
end
|
||||
|
||||
function ENT:Precache()
|
||||
|
||||
util.PrecacheModel("models/Items/AR2_Grenade.mdl");
|
||||
|
||||
end
|
||||
@@ -0,0 +1,101 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
ENT.Sound = {}
|
||||
ENT.Sound.Explode = "BaseGrenade.Explode"
|
||||
ENT.Sound.ExplodeR = "TFA_HL2R_BaseGrenade.Explode"
|
||||
|
||||
// Nice helper function, this does all the work.
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: DoExplodeEffect
|
||||
---------------------------------------------------------*/
|
||||
function ENT:DoExplodeEffect()
|
||||
|
||||
local info = EffectData();
|
||||
info:SetEntity( self.Entity );
|
||||
info:SetOrigin( self.Entity:GetPos() );
|
||||
|
||||
if self:WaterLevel() >= 3 then
|
||||
util.Effect("WaterSurfaceExplosion", info)
|
||||
end
|
||||
|
||||
--util.Effect( "Explosion", info );
|
||||
|
||||
util.Effect("tfa_hl2r_fx_explosion_dlight", info)
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnExplode
|
||||
Desc: The grenade has just exploded.
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnExplode( pTrace )
|
||||
|
||||
if ((pTrace.Entity != game.GetWorld()) || (pTrace.HitBox != 0)) then
|
||||
// non-world needs smaller decals
|
||||
if( pTrace.Entity && !pTrace.Entity:IsNPC() ) then
|
||||
util.Decal( "SmallScorch", pTrace.HitPos + pTrace.HitNormal, pTrace.HitPos - pTrace.HitNormal );
|
||||
end
|
||||
else
|
||||
util.Decal( "Scorch", pTrace.HitPos + pTrace.HitNormal, pTrace.HitPos - pTrace.HitNormal );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnInitialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnInitialize()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: StartTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:StartTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: EndTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:EndTouch( entity )
|
||||
end
|
||||
|
||||
function ENT:Touch( pOther )
|
||||
|
||||
assert( pOther );
|
||||
if ( pOther:GetSolid() == SOLID_NONE ) then
|
||||
return;
|
||||
end
|
||||
|
||||
// If I'm live go ahead and blow up
|
||||
if (self.m_bIsLive) then
|
||||
self:Detonate();
|
||||
else
|
||||
// If I'm not live, only blow up if I'm hitting an chacter that
|
||||
// is not the owner of the weapon
|
||||
local pBCC = pOther;
|
||||
if (pBCC && self.Entity:GetOwner() != pBCC) then
|
||||
self.m_bIsLive = true;
|
||||
self:Detonate();
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnThink
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnThink()
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.PrintName = ""
|
||||
ENT.Author = ""
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
@@ -0,0 +1,66 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
if SERVER then AddCSLuaFile("shared.lua") end
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "HL2 MMod RPG Laser Spot"
|
||||
ENT.Author = "Upset"
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "DrawLaser")
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
|
||||
function ENT:Initialize()
|
||||
self:DrawShadow(false)
|
||||
end
|
||||
|
||||
function ENT:Suspend(flSuspendTime)
|
||||
self:SetDrawLaser(false)
|
||||
timer.Simple(flSuspendTime, function()
|
||||
if self and IsValid(self) then
|
||||
self:Revive()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Revive()
|
||||
self:SetDrawLaser(true)
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
|
||||
|
||||
local laser = Material("sprites/redglow1")
|
||||
|
||||
function ENT:DrawTranslucent()
|
||||
if !self:GetDrawLaser() then return end
|
||||
local owner = self:GetOwner()
|
||||
if !owner or !IsValid(owner) or !owner:Alive() then return end
|
||||
local tr = owner:GetEyeTrace()
|
||||
local pos = tr.HitPos
|
||||
local norm = tr.HitNormal
|
||||
local scale = 16.0 + math.Rand(-4.0, 4.0)
|
||||
|
||||
render.SetMaterial(laser)
|
||||
render.DrawSprite(pos + norm * 3 - EyeVector() * 4, 1 * scale, 1 * scale, Color(255,255,255,255))
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local owner = self:GetOwner()
|
||||
if IsValid(owner) then
|
||||
self:SetRenderBoundsWS(LocalPlayer():EyePos(), owner:GetEyeTrace().HitPos)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:Draw()
|
||||
if CurTime() > self:GetNWFloat("HideTime", CurTime() + 1) then
|
||||
self:DrawModel()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:IsTranslucent()
|
||||
return true
|
||||
end
|
||||
@@ -0,0 +1,142 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
ENT.Damage = 100
|
||||
ENT.Prime = 0.03
|
||||
ENT.Delay = 30
|
||||
ENT.HideDelay = 0.0
|
||||
function ENT:Initialize()
|
||||
local mdl = self:GetModel()
|
||||
|
||||
if not mdl or mdl == "" or mdl == "models/error.mdl" then
|
||||
self:SetModel("models/weapons/tfa_hl2r/w_missile_launch.mdl")
|
||||
end
|
||||
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
--self:PhysicsInitSphere((self:OBBMaxs() - self:OBBMins()):Length() / 4, "metal")
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
local phys = self:GetPhysicsObject()
|
||||
|
||||
if (phys:IsValid()) then
|
||||
phys:Wake()
|
||||
end
|
||||
|
||||
self:SetFriction(self.Delay)
|
||||
self.killtime = CurTime() + self.Delay
|
||||
self:DrawShadow(true)
|
||||
self.StartTime = CurTime()
|
||||
self:EmitSound( "TFA_HL2R_RPG.Loop" )
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self.HasIdle = true
|
||||
timer.Simple(0.1, function()
|
||||
if IsValid(self) then
|
||||
self:SetOwner()
|
||||
end
|
||||
end)
|
||||
self:SetNWFloat("HideTime",CurTime() + self.HideDelay )
|
||||
self.HP = math.random(30, 60)
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if self.killtime < CurTime() then
|
||||
return false
|
||||
end
|
||||
|
||||
self:NextThink(CurTime())
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local effectdata, shake
|
||||
|
||||
function ENT:Explode()
|
||||
if not IsValid(self.Owner) then
|
||||
self:Remove()
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
effectdata = EffectData()
|
||||
effectdata:SetOrigin(self:GetPos())
|
||||
effectdata:SetScale(5)
|
||||
effectdata:SetMagnitude(5)
|
||||
util.Effect("HelicopterMegaBomb", effectdata)
|
||||
util.Effect("Explosion", effectdata)
|
||||
self.Damage = self.mydamage or self.Damage
|
||||
util.BlastDamage(self, self.Owner, self:GetPos(), 512, self.Damage )
|
||||
shake = ents.Create("env_shake")
|
||||
shake:SetOwner(self.Owner)
|
||||
shake:SetPos(self:GetPos())
|
||||
shake:SetKeyValue("amplitude", tostring(self.Damage * 20)) -- Power of the shake
|
||||
shake:SetKeyValue("radius", tostring( 768 ) ) -- Radius of the shake
|
||||
shake:SetKeyValue("duration", tostring( self.Damage / 200 )) -- Time of shake
|
||||
shake:SetKeyValue("frequency", "255") -- How har should the screenshake be
|
||||
shake:SetKeyValue("spawnflags", "4") -- Spawnflags(In Air)
|
||||
shake:Spawn()
|
||||
shake:Activate()
|
||||
shake:Fire("StartShake", "", 0)
|
||||
self:EmitSound("TFA_INS2_RPG7.2")
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, phys)
|
||||
if data.Speed > 60 and CurTime() > self.StartTime + self.Prime then
|
||||
timer.Simple(0,function()
|
||||
if IsValid(self) then
|
||||
self:Explode()
|
||||
end
|
||||
end)
|
||||
else
|
||||
self.Prime = math.huge
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_HL2R_RPG.Loop")
|
||||
self.HasIdle = false
|
||||
self:SetNWFloat("HideTime", -1 )
|
||||
end
|
||||
end
|
||||
--[[elseif self:GetOwner() ~= self then
|
||||
self.Prime = math.huge
|
||||
self:StopSound("TFA_INS2_RPG7.Loop")
|
||||
self:SetOwner(self)
|
||||
end
|
||||
]]--
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_HL2R_RPG.Loop")
|
||||
self.HasIdle = false
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Use(activator, caller)
|
||||
if activator:IsPlayer() and self.WeaponClass and activator:GetWeapon(self.WeaponClass) then
|
||||
activator:GiveAmmo(1, activator:GetWeapon(self.WeaponClass):GetPrimaryAmmoType(), false)
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage( dmg )
|
||||
if dmg:GetInflictor() == self or dmg:GetAttacker() == self then return end
|
||||
if self.Exploded then return end
|
||||
if self.HP > 0 and self.HP - dmg:GetDamage() <= 0 then
|
||||
self.Exploded = true
|
||||
self:Explode()
|
||||
end
|
||||
self.HP = self.HP - dmg:GetDamage()
|
||||
dmg:SetAttacker(self)
|
||||
dmg:SetInflictor(self)
|
||||
self:TakePhysicsDamage( dmg )
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Contact Explosive"
|
||||
ENT.Author = ""
|
||||
ENT.Contact = ""
|
||||
ENT.Purpose = ""
|
||||
ENT.Instructions = ""
|
||||
ENT.DoNotDuplicate = true
|
||||
ENT.DisableDuplicator = true
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
@@ -0,0 +1,176 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
ENT.Model = Model("models/weapons/tfa_hl2r/w_missile.mdl")
|
||||
ENT.ModelLaunch = Model("models/weapons/tfa_hl2r/w_missile_launch.mdl")
|
||||
ENT.Sprite = "sprites/animglow01.vmt"
|
||||
ENT.FlySound = "Missile.Ignite"
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetMoveType(MOVETYPE_FLYGRAVITY)
|
||||
self:SetMoveCollide(MOVECOLLIDE_FLY_BOUNCE)
|
||||
self:SetSolid(SOLID_BBOX)
|
||||
self:SetModel(self.ModelLaunch)
|
||||
self:SetCollisionBounds(Vector(), Vector())
|
||||
|
||||
local angAngs = self:GetAngles()
|
||||
angAngs.x = angAngs.x - 30
|
||||
local vecFwd = angAngs:Forward()
|
||||
|
||||
self:SetLocalVelocity(vecFwd * 250)
|
||||
local svgravity = cvars.Number("sv_gravity", 800)
|
||||
if svgravity != 0 then
|
||||
local gravityMul = 400 / svgravity
|
||||
self:SetGravity(gravityMul)
|
||||
end
|
||||
|
||||
self:NextThink(CurTime() + .4)
|
||||
|
||||
self.radius = 300
|
||||
end
|
||||
|
||||
function ENT:Touch(pOther)
|
||||
if !pOther:IsSolid() or pOther:GetClass() == "hornet" then
|
||||
return
|
||||
end
|
||||
self:Explode(pOther)
|
||||
end
|
||||
|
||||
function ENT:Explode(ent)
|
||||
if self.didHit then return end
|
||||
local vecDir = self:GetForward()
|
||||
local tr = util.TraceLine({
|
||||
start = self:GetPos(),
|
||||
endpos = self:GetPos() + vecDir * 16,
|
||||
mask = MASK_SHOT,
|
||||
filter = self
|
||||
})
|
||||
|
||||
self:SetSolid(SOLID_NONE)
|
||||
if tr.Fraction == 1.0 || !tr.HitSky then
|
||||
local pos, norm = tr.HitPos, tr.HitNormal
|
||||
local explosion = EffectData()
|
||||
explosion:SetOrigin(pos)
|
||||
explosion:SetNormal(norm)
|
||||
if self:WaterLevel() >= 3 then
|
||||
util.Effect("WaterSurfaceExplosion", explosion)
|
||||
else
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2r_explosion_rpg" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
end
|
||||
util.Decal("Scorch", pos - vecDir + norm, pos + vecDir)
|
||||
|
||||
local dlighteff = EffectData()
|
||||
dlighteff:SetEntity(self)
|
||||
dlighteff:SetOrigin(self:GetPos())
|
||||
util.Effect("hl2r_fx_explosion_dlight", dlighteff)
|
||||
self:EmitSound("TFA_HL2R_RPG.Explode")
|
||||
self:EmitSound("BaseExplosionEffect.Sound")
|
||||
|
||||
local owner = IsValid(self.Owner) and self.Owner or self
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetInflictor(self)
|
||||
dmg:SetAttacker(owner)
|
||||
dmg:SetDamage(self.dmg)
|
||||
dmg:SetDamageType(bit.bor(DMG_BLAST, DMG_AIRBOAT))
|
||||
util.BlastDamageInfo(dmg, tr.HitPos, self.radius)
|
||||
end
|
||||
|
||||
self.didHit = true
|
||||
--self:RemoveEffects(EF_BRIGHTLIGHT)
|
||||
self:StopSound(self.FlySound)
|
||||
self:SetLocalVelocity(Vector())
|
||||
self:SetMoveType(MOVETYPE_NONE)
|
||||
self:AddEffects(EF_NODRAW)
|
||||
if self.glow and IsValid(self.glow) then self.glow:Remove() end
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if self.didHit then return end
|
||||
if !self.m_flIgniteTime then
|
||||
self:SetMoveType(MOVETYPE_FLY)
|
||||
self:SetModel(self.Model)
|
||||
ParticleEffectAttach("hl2r_weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--self:AddEffects(EF_BRIGHTLIGHT)
|
||||
self:EmitSound(self.FlySound)
|
||||
|
||||
-- self.glow = ents.Create("env_sprite")
|
||||
-- local glow = self.glow
|
||||
-- glow:SetKeyValue("rendercolor", "255 192 64")
|
||||
-- glow:SetKeyValue("GlowProxySize", "2")
|
||||
-- glow:SetKeyValue("HDRColorScale", "1")
|
||||
-- glow:SetKeyValue("renderfx", "15")
|
||||
-- glow:SetKeyValue("rendermode", "3")
|
||||
-- glow:SetKeyValue("renderamt", "255")
|
||||
-- glow:SetKeyValue("model", self.Sprite)
|
||||
-- glow:SetKeyValue("scale", ".08")
|
||||
-- glow:Spawn()
|
||||
-- glow:SetParent(self)
|
||||
-- glow:SetPos(self:GetPos())
|
||||
--ParticleEffectAttach("rocket_smoke_trail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--ParticleEffectAttach("weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
ParticleEffectAttach("hl2r_weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--util.SpriteTrail( self.Entity, 0, Color( 165, 165, 165 ), false, 8, 16, 0.5, 1 / ( 165 ), "trails/smoke.vmt" )
|
||||
|
||||
self.m_flIgniteTime = CurTime()
|
||||
self.vecTarget = self:GetForward()
|
||||
|
||||
self:NextThink(CurTime() + 0.1)
|
||||
end
|
||||
if self.bGuiding then
|
||||
local spot = IsValid(self.pLauncher) and !self.pLauncher:GetSprinting() and self.pLauncher:GetSpotEntity() or NULL
|
||||
local vecDir = Vector()
|
||||
|
||||
if IsValid(spot) and spot:GetOwner() == self:GetOwner() and spot:GetDrawLaser() then
|
||||
local tr = util.TraceLine({
|
||||
start = self:GetPos(),
|
||||
endpos = spot:GetPos(),
|
||||
filter = {self, self.Owner, spot}
|
||||
})
|
||||
if tr.Fraction >= 0.90 then
|
||||
vecDir = spot:GetPos() - self:GetPos()
|
||||
vecDir = vecDir:GetNormalized()
|
||||
self.vecTarget = vecDir
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:SetAngles(self.vecTarget:Angle())
|
||||
|
||||
local flSpeed = self:GetVelocity():Length()
|
||||
self:SetLocalVelocity(self:GetVelocity() * 0.2 + self.vecTarget * (flSpeed * 0.8 + 400))
|
||||
if self:WaterLevel() == 3 then
|
||||
if self:GetVelocity():Length() > 300 then
|
||||
self:SetLocalVelocity(self:GetVelocity():GetNormalized() * 300)
|
||||
end
|
||||
else
|
||||
if self:GetVelocity():Length() > 2000 then
|
||||
self:SetLocalVelocity(self:GetVelocity():GetNormalized() * 2000)
|
||||
end
|
||||
end
|
||||
|
||||
self:NextThink(CurTime() + .1)
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self:StopSound(self.FlySound)
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "HL2 MMod RPG Rocket"
|
||||
ENT.Author = "Upset"
|
||||
@@ -0,0 +1,152 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
-- Most code from mad cow, some from me
|
||||
-- .phy of the crossbow_bolt made by Silver Spirit
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
|
||||
|
||||
ENT.PrintName = "CrossbowBolt"
|
||||
ENT.Author = "Worshipper/Zerf"
|
||||
|
||||
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
|
||||
|
||||
ENT.Damage = 100
|
||||
ENT.LifeTime = 4
|
||||
ENT.Model = "models/crossbow_bolt.mdl"
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsUpdate()
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
function ENT:Initialize()
|
||||
self:SetModel(self.Model)
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:DrawShadow(false)
|
||||
|
||||
-- Wake the physics object up. It's time to have fun!
|
||||
local phys = self:GetPhysicsObject()
|
||||
if IsValid(phys) then
|
||||
phys:EnableGravity(false)
|
||||
phys:EnableDrag(true)
|
||||
phys:SetMass(2)
|
||||
phys:Wake()
|
||||
phys:AddGameFlag(FVPHYSICS_NO_IMPACT_DMG)
|
||||
phys:AddGameFlag(FVPHYSICS_NO_NPC_IMPACT_DMG)
|
||||
phys:AddGameFlag(FVPHYSICS_PENETRATING)
|
||||
end
|
||||
|
||||
-- local trail = util.SpriteTrail(self, 0, Color(255, 255, 255, 30), true, 2, 0, 3, 1 / (5.38) * 0.5, "trails/smoke.vmt")
|
||||
self.Moving = true
|
||||
end
|
||||
--[[
|
||||
function ENT:PhysicsUpdate(phys)
|
||||
local vel = Vector(0, 0, ((-9.81 * phys:GetMass()) * 0.65))
|
||||
phys:ApplyForceCenter(vel)
|
||||
end
|
||||
--]]
|
||||
function ENT:Impact(ent, normal, pos)
|
||||
if not IsValid(self) then return end
|
||||
|
||||
local info
|
||||
|
||||
local tr = {}
|
||||
tr.start = self:GetPos()
|
||||
tr.filter = {self, self.Owner}
|
||||
tr.endpos = pos
|
||||
tr = util.TraceLine(tr)
|
||||
|
||||
if tr.HitSky then self:Remove() return end
|
||||
|
||||
if not ent:IsPlayer() and not ent:IsNPC() then
|
||||
local effectdata = EffectData()
|
||||
effectdata:SetOrigin(pos - normal * 10)
|
||||
effectdata:SetEntity(self)
|
||||
effectdata:SetStart(pos)
|
||||
effectdata:SetNormal(normal)
|
||||
util.Effect("Impact", effectdata)
|
||||
end
|
||||
|
||||
if IsValid(ent) then
|
||||
local d = DamageInfo()
|
||||
d:SetDamage( 100 )
|
||||
d:SetAttacker( self.Owner )
|
||||
d:SetDamageType( DMG_NEVERGIB )
|
||||
--ent:TakeDamage(100, self.Owner)
|
||||
ent:TakeDamageInfo(d)
|
||||
|
||||
self:EmitSound("Weapon_Crossbow.BoltHitBody")
|
||||
self:Remove()
|
||||
return
|
||||
end
|
||||
|
||||
self:EmitSound("Weapon_Crossbow.BoltHitWorld")
|
||||
|
||||
-- We've hit a prop, so let's weld to it. Also embed this in the object for looks
|
||||
|
||||
self:SetPos(pos - normal * 10)
|
||||
-- self:SetAngles(normal:Angle())
|
||||
|
||||
if not IsValid(ent) then
|
||||
self:GetPhysicsObject():EnableMotion(false)
|
||||
end
|
||||
|
||||
timer.Simple(self.LifeTime, function()
|
||||
if IsValid(self) then self:Remove() end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, phys, dmg)
|
||||
if self.Moving then
|
||||
self.Moving = false
|
||||
phys:Sleep()
|
||||
self:Impact(data.HitEntity, data.HitNormal, data.HitPos)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local phys = self:GetPhysicsObject()
|
||||
local ang = self:GetForward() * 100000
|
||||
local up = self:GetUp() * -800
|
||||
|
||||
local force = ang + up
|
||||
|
||||
phys:ApplyForceCenter(force)
|
||||
|
||||
if (self.HitWeld) then
|
||||
self.HitWeld = false
|
||||
constraint.Weld(self.HitEnt, self, 0, 0, 0, true)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if CLIENT then
|
||||
function ENT:Initialize()
|
||||
self:DrawShadow(false)
|
||||
end
|
||||
|
||||
function ENT:IsTranslucent()
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,328 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
include( 'shared.lua' )
|
||||
include( 'outputs.lua' )
|
||||
|
||||
|
||||
FRAG_GRENADE_BLIP_FREQUENCY = 1.0
|
||||
FRAG_GRENADE_BLIP_FAST_FREQUENCY = 0.3
|
||||
|
||||
FRAG_GRENADE_GRACE_TIME_AFTER_PICKUP = 1.5
|
||||
FRAG_GRENADE_WARN_TIME = 1.5
|
||||
|
||||
GRENADE_COEFFICIENT_OF_RESTITUTION = 0.2;
|
||||
|
||||
local sk_plr_dmg_fraggrenade = 125;
|
||||
local sk_npc_dmg_fraggrenade = 75;
|
||||
local sk_fraggrenade_radius = 250;
|
||||
|
||||
GRENADE_MODEL = "models/items/grenadeammo.mdl"
|
||||
|
||||
GLOW_CREATED = FALSE;
|
||||
|
||||
function ENT:GetShakeAmplitude() return 25.0; end
|
||||
function ENT:GetShakeRadius() return 750.0; end
|
||||
|
||||
// Damage accessors.
|
||||
function ENT:GetDamage()
|
||||
return self.m_flDamage;
|
||||
end
|
||||
function ENT:GetDamageRadius()
|
||||
return self.m_DmgRadius;
|
||||
end
|
||||
|
||||
function ENT:SetDamage(flDamage)
|
||||
self.m_flDamage = flDamage;
|
||||
end
|
||||
|
||||
function ENT:SetDamageRadius(flDamageRadius)
|
||||
self.m_DmgRadius = flDamageRadius;
|
||||
end
|
||||
|
||||
// Bounce sound accessors.
|
||||
function ENT:SetBounceSound( pszBounceSound )
|
||||
self.m_iszBounceSound = tostring( pszBounceSound );
|
||||
end
|
||||
|
||||
function ENT:BlipSound()
|
||||
local efdata = EffectData()
|
||||
efdata:SetEntity(self)
|
||||
efdata:SetFlags(1) -- regular beep
|
||||
util.Effect("mmod_frag_beeplight", efdata)
|
||||
|
||||
self.Entity:EmitSound( self.Sound.Blip );
|
||||
end
|
||||
|
||||
// UNDONE: temporary scorching for PreAlpha - find a less sleazy permenant solution.
|
||||
function ENT:Explode( pTrace, bitsDamageType )
|
||||
|
||||
if !( CLIENT ) then
|
||||
|
||||
self.Entity:SetModel( "" );//invisible
|
||||
self.Entity:SetColor( color_transparent );
|
||||
self.Entity:SetSolid( SOLID_NONE );
|
||||
|
||||
self.m_takedamage = DAMAGE_NO;
|
||||
|
||||
local vecAbsOrigin = self.Entity:GetPos();
|
||||
local contents = util.PointContents ( vecAbsOrigin );
|
||||
|
||||
if ( pTrace.Fraction != 1.0 ) then
|
||||
local vecNormal = pTrace.HitNormal;
|
||||
local pdata = pTrace.MatType;
|
||||
|
||||
util.BlastDamage( self.Entity, // don't apply cl_interp delay
|
||||
self:GetOwner(),
|
||||
self.Entity:GetPos(),
|
||||
self.m_DmgRadius,
|
||||
self.m_flDamage );
|
||||
else
|
||||
util.BlastDamage( self.Entity, // don't apply cl_interp delay
|
||||
self:GetOwner(),
|
||||
self.Entity:GetPos(),
|
||||
self.m_DmgRadius,
|
||||
self.m_flDamage );
|
||||
end
|
||||
|
||||
self:DoExplodeEffect();
|
||||
|
||||
self:OnExplode( pTrace );
|
||||
|
||||
self.Entity:EmitSound( self.Sound.Explode );
|
||||
|
||||
self.Touch = function( ... ) return end;
|
||||
self.Entity:SetSolid( SOLID_NONE );
|
||||
|
||||
self.Entity:SetVelocity( self:GetPos() );
|
||||
|
||||
// Because the grenade is zipped out of the world instantly, the EXPLOSION sound that it makes for
|
||||
// the AI is also immediately destroyed. For this reason, we now make the grenade entity inert and
|
||||
// throw it away in 1/10th of a second instead of right away. Removing the grenade instantly causes
|
||||
// intermittent bugs with env_microphones who are listening for explosions. They will 'randomly' not
|
||||
// hear explosion sounds when the grenade is removed and the SoundEnt thinks (and removes the sound)
|
||||
// before the env_microphone thinks and hears the sound.
|
||||
SafeRemoveEntityDelayed( self.Entity, 0.1 );
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
function ENT:Detonate()
|
||||
|
||||
local tr;
|
||||
local vecSpot;// trace starts here!
|
||||
|
||||
self.Think = function( ... ) return end;
|
||||
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2mmod_explosion_grenade_noaftersmoke" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
|
||||
vecSpot = self.Entity:GetPos() + Vector ( 0 , 0 , 8 );
|
||||
tr = {};
|
||||
tr.start = vecSpot;
|
||||
tr.endpos = vecSpot + Vector ( 0, 0, -32 );
|
||||
tr.mask = MASK_SHOT_HULL;
|
||||
tr.filter = self.Entity;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine ( tr);
|
||||
|
||||
if( tr.StartSolid ) then
|
||||
// Since we blindly moved the explosion origin vertically, we may have inadvertently moved the explosion into a solid,
|
||||
// in which case nothing is going to be harmed by the grenade's explosion because all subsequent traces will startsolid.
|
||||
// If this is the case, we do the downward trace again from the actual origin of the grenade. (sjb) 3/8/2007 (for ep2_outland_09)
|
||||
tr = {};
|
||||
tr.start = self.Entity:GetPos();
|
||||
tr.endpos = self.Entity:GetPos() + Vector( 0, 0, -32);
|
||||
tr.mask = MASK_SHOT_HULL;
|
||||
tr.filter = self.Entity;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine( tr );
|
||||
end
|
||||
|
||||
tr = self:Explode( tr, DMG_BLAST );
|
||||
|
||||
if ( self:GetShakeAmplitude() ) then
|
||||
util.ScreenShake( self.Entity:GetPos(), self:GetShakeAmplitude(), 150.0, 1.0, self:GetShakeRadius() );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Initialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Initialize()
|
||||
|
||||
self.m_hThrower = NULL;
|
||||
self.m_hOriginalThrower = NULL;
|
||||
self.m_bIsLive = false;
|
||||
self.m_DmgRadius = 100;
|
||||
self.m_flDetonateTime = CurTime() + GRENADE_TIMER;
|
||||
self.m_flWarnAITime = CurTime() + GRENADE_TIMER - FRAG_GRENADE_WARN_TIME;
|
||||
self.m_bHasWarnedAI = false;
|
||||
|
||||
self:Precache( );
|
||||
|
||||
self.Entity:SetModel( GRENADE_MODEL );
|
||||
|
||||
if( self:GetOwner() && self:GetOwner():IsPlayer() ) then
|
||||
self.m_flDamage = sk_plr_dmg_fraggrenade;
|
||||
self.m_DmgRadius = sk_fraggrenade_radius;
|
||||
else
|
||||
self.m_flDamage = sk_npc_dmg_fraggrenade;
|
||||
self.m_DmgRadius = sk_fraggrenade_radius;
|
||||
end
|
||||
|
||||
self.m_takedamage = DAMAGE_YES;
|
||||
self.m_iHealth = 1;
|
||||
|
||||
self.Entity:SetCollisionBounds( -Vector(4,4,4), Vector(4,4,4) );
|
||||
self:CreateVPhysics();
|
||||
|
||||
self:BlipSound();
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FREQUENCY;
|
||||
|
||||
self.m_combineSpawned = false;
|
||||
self.m_punted = false;
|
||||
|
||||
self:CreateEffects();
|
||||
|
||||
self:OnInitialize();
|
||||
self.BaseClass:Initialize();
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:OnRestore()
|
||||
|
||||
// If we were primed and ready to detonate, put FX on us.
|
||||
if (self.m_flDetonateTime > 0) then
|
||||
self:CreateEffects();
|
||||
end
|
||||
|
||||
self.BaseClass:OnRestore();
|
||||
|
||||
end
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose:
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:CreateEffects()
|
||||
|
||||
local nAttachment = self:LookupAttachment( "fuse" );
|
||||
|
||||
// Start up the eye trail
|
||||
self.m_pGlowTrail = util.SpriteTrail( self.Entity, nAttachment, self.Trail.Color, true, self.Trail.StartWidth, self.Trail.EndWidth, self.Trail.LifeTime, 1 / ( self.Trail.StartWidth + self.Trail.EndWidth ) * 0.5, self.Trail.Material );
|
||||
|
||||
end
|
||||
|
||||
function ENT:CreateVPhysics()
|
||||
|
||||
// Create the object in the physics system
|
||||
self.Entity:PhysicsInit( SOLID_VPHYSICS, 0, false );
|
||||
|
||||
local Phys = self:GetPhysicsObject()
|
||||
if ( Phys ) then
|
||||
|
||||
Phys:SetMaterial( "grenade" )
|
||||
|
||||
end
|
||||
return true;
|
||||
|
||||
end
|
||||
|
||||
function ENT:Precache()
|
||||
|
||||
util.PrecacheModel( GRENADE_MODEL );
|
||||
|
||||
util.PrecacheSound( self.Sound.Blip );
|
||||
|
||||
util.PrecacheModel( "sprites/redglow1.vmt" );
|
||||
util.PrecacheModel( self.Trail.Material );
|
||||
|
||||
util.PrecacheSound( self.Sound.Explode );
|
||||
|
||||
end
|
||||
|
||||
function ENT:SetTimer( detonateDelay, warnDelay )
|
||||
|
||||
self.m_flDetonateTime = CurTime() + detonateDelay;
|
||||
self.m_flWarnAITime = CurTime() + warnDelay;
|
||||
self.Entity:NextThink( CurTime() );
|
||||
|
||||
self:CreateEffects();
|
||||
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
|
||||
self:OnThink()
|
||||
|
||||
if( CurTime() > self.m_flDetonateTime ) then
|
||||
self:Detonate();
|
||||
return;
|
||||
end
|
||||
|
||||
if( !self.m_bHasWarnedAI && CurTime() >= self.m_flWarnAITime ) then
|
||||
self.m_bHasWarnedAI = true;
|
||||
end
|
||||
|
||||
if( CurTime() > self.m_flNextBlipTime ) then
|
||||
self:BlipSound();
|
||||
|
||||
if( self.m_bHasWarnedAI ) then
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FAST_FREQUENCY;
|
||||
else
|
||||
self.m_flNextBlipTime = CurTime() + FRAG_GRENADE_BLIP_FREQUENCY;
|
||||
end
|
||||
end
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.1 );
|
||||
|
||||
end
|
||||
|
||||
function ENT:SetVelocity( velocity, angVelocity )
|
||||
|
||||
local pPhysicsObject = self:GetPhysicsObject();
|
||||
if ( pPhysicsObject ) then
|
||||
pPhysicsObject:AddVelocity( velocity );
|
||||
pPhysicsObject:AddAngleVelocity( angVelocity );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnTakeDamage
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnTakeDamage( dmginfo )
|
||||
|
||||
// Manually apply vphysics because BaseCombatCharacter takedamage doesn't call back to CBaseEntity OnTakeDamage
|
||||
self.Entity:TakePhysicsDamage( dmginfo );
|
||||
|
||||
// Grenades only suffer blast damage and burn damage.
|
||||
if( !(dmginfo:GetDamageType() == bit.bor( DMG_BLAST, DMG_BURN) ) ) then
|
||||
return 0;
|
||||
end
|
||||
|
||||
return self.BaseClass:OnTakeDamage( dmginfo );
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Sound = {}
|
||||
ENT.Sound.Blip = "Grenade.Blip"
|
||||
ENT.Sound.Explode = "BaseGrenade.Explode"
|
||||
|
||||
ENT.Trail = {}
|
||||
ENT.Trail.Color = Color( 255, 0, 0, 255 )
|
||||
ENT.Trail.Material = "sprites/bluelaser1.vmt"
|
||||
ENT.Trail.StartWidth = 8.0
|
||||
ENT.Trail.EndWidth = 1.0
|
||||
ENT.Trail.LifeTime = 0.5
|
||||
|
||||
// Nice helper function, this does all the work.
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: DoExplodeEffect
|
||||
---------------------------------------------------------*/
|
||||
function ENT:DoExplodeEffect()
|
||||
|
||||
local info = EffectData();
|
||||
info:SetEntity( self.Entity );
|
||||
info:SetOrigin( self.Entity:GetPos() );
|
||||
|
||||
util.Effect( "Explosion", info );
|
||||
self:EmitSound("BaseExplosionEffect.Sound")
|
||||
-- util.Effect("mmod_fx_explosion_dlight", info)
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnExplode
|
||||
Desc: The grenade has just exploded.
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnExplode( pTrace )
|
||||
|
||||
local Pos1 = pTrace.HitPos + pTrace.HitNormal
|
||||
local Pos2 = pTrace.HitPos - pTrace.HitNormal
|
||||
|
||||
util.Decal( "Scorch", Pos1, Pos2 );
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnInitialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnInitialize()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: StartTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:StartTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: EndTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:EndTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Touch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Touch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnThink
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnThink()
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.PrintName = ""
|
||||
ENT.Author = ""
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
@@ -0,0 +1,174 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
include( 'shared.lua' )
|
||||
include( 'outputs.lua' )
|
||||
|
||||
|
||||
MAX_AR2_NO_COLLIDE_TIME = 0.2
|
||||
|
||||
AR2_GRENADE_MAX_DANGER_RADIUS = 300
|
||||
|
||||
// Moved to HL2_SharedGameRules because these are referenced by shared AmmoDef functions
|
||||
local sk_plr_dmg_smg1_grenade = 100;
|
||||
local sk_npc_dmg_smg1_grenade = 50;
|
||||
local sk_max_smg1_grenade = 3;
|
||||
|
||||
local sk_smg1_grenade_radius = 250;
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: Initialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Initialize()
|
||||
|
||||
self:Precache( );
|
||||
self.Entity:SetModel( "models/Items/AR2_Grenade.mdl");
|
||||
self.Entity:PhysicsInit( SOLID_VPHYSICS );
|
||||
self.Entity:SetMoveCollide( MOVECOLLIDE_FLY_BOUNCE );
|
||||
|
||||
// Hits everything but debris
|
||||
self.Entity:SetCollisionGroup( COLLISION_GROUP_PROJECTILE );
|
||||
self.Entity:GetPhysicsObject():SetBuoyancyRatio( 0 )
|
||||
|
||||
self.Entity:SetCollisionBounds(Vector(-3, -3, -3), Vector(3, 3, 3));
|
||||
// self.Entity:SetCollisionBounds(Vector(0, 0, 0), Vector(0, 0, 0));
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.1 );
|
||||
|
||||
if( self:GetOwner() && self:GetOwner():IsPlayer() ) then
|
||||
self.m_flDamage = sk_plr_dmg_smg1_grenade;
|
||||
else
|
||||
self.m_flDamage = sk_npc_dmg_smg1_grenade;
|
||||
end
|
||||
|
||||
self.m_DmgRadius = sk_smg1_grenade_radius;
|
||||
self.m_takedamage = DAMAGE_YES;
|
||||
self.m_bIsLive = true;
|
||||
self.m_iHealth = 1;
|
||||
|
||||
self.Entity:SetGravity( 400 / 600 ); // use a lower gravity for grenades to make them easier to see
|
||||
self.Entity:SetFriction( 0.8 );
|
||||
self.Entity:SetSequence( 0 );
|
||||
|
||||
self.m_fDangerRadius = 100;
|
||||
|
||||
self.m_fSpawnTime = CurTime();
|
||||
|
||||
ParticleEffectAttach("hl2mmod_weapon_smg_grenadetrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
|
||||
self:OnInitialize();
|
||||
|
||||
end
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Purpose: The grenade has a slight delay before it goes live. That way the
|
||||
// person firing it can bounce it off a nearby wall. However if it
|
||||
// hits another character it blows up immediately
|
||||
// Input :
|
||||
// Output :
|
||||
//-----------------------------------------------------------------------------
|
||||
function ENT:Think()
|
||||
|
||||
self:OnThink()
|
||||
|
||||
self.Entity:NextThink( CurTime() + 0.05 );
|
||||
|
||||
if (!self.m_bIsLive) then
|
||||
// Go live after a short delay
|
||||
if (self.m_fSpawnTime + MAX_AR2_NO_COLLIDE_TIME < CurTime()) then
|
||||
self.m_bIsLive = true;
|
||||
end
|
||||
end
|
||||
|
||||
// If I just went solid and my velocity is zero, it means I'm resting on
|
||||
// the floor already when I went solid so blow up
|
||||
if (self.m_bIsLive) then
|
||||
if (self.Entity:GetVelocity():Length() == 0.0 ||
|
||||
self.Entity:GetGroundEntity() != NULL ) then
|
||||
// self:Detonate();
|
||||
end
|
||||
end
|
||||
|
||||
// The old way of making danger sounds would scare the crap out of EVERYONE between you and where the grenade
|
||||
// was going to hit. The radius of the danger sound now 'blossoms' over the grenade's lifetime, making it seem
|
||||
// dangerous to a larger area downrange than it does from where it was fired.
|
||||
if( self.m_fDangerRadius <= AR2_GRENADE_MAX_DANGER_RADIUS ) then
|
||||
self.m_fDangerRadius = self.m_fDangerRadius + ( AR2_GRENADE_MAX_DANGER_RADIUS * 0.05 );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: PhysicsCollide
|
||||
---------------------------------------------------------*/
|
||||
function ENT:PhysicsCollide( data, physobj )
|
||||
|
||||
self:Touch( data.HitEntity )
|
||||
self.PhysicsCollide = function( ... ) return end
|
||||
|
||||
end
|
||||
|
||||
function ENT:Detonate()
|
||||
|
||||
if (!self.m_bIsLive) then
|
||||
return;
|
||||
end
|
||||
self.m_bIsLive = false;
|
||||
self.m_takedamage = DAMAGE_NO;
|
||||
|
||||
if(self.m_hSmokeTrail) then
|
||||
self.m_hSmokeTrail:Remove();
|
||||
self.m_hSmokeTrail = NULL;
|
||||
end
|
||||
|
||||
self:DoExplodeEffect()
|
||||
|
||||
local vecForward = self.Entity:GetVelocity();
|
||||
vecForward = VectorNormalize(vecForward);
|
||||
local tr;
|
||||
tr = {};
|
||||
tr.start = self.Entity:GetPos();
|
||||
tr.endpos = self.Entity:GetPos() + 60*vecForward;
|
||||
tr.mask = MASK_SHOT;
|
||||
tr.filter = self;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine ( tr);
|
||||
|
||||
if self:WaterLevel() < 3 then
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2mmod_explosion_grenade_noaftersmoke" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
end
|
||||
|
||||
self:OnExplode( tr );
|
||||
|
||||
self.Entity:EmitSound( self.Sound.Explode );
|
||||
|
||||
util.ScreenShake( self.Entity:GetPos(), 25.0, 150.0, 1.0, 750, SHAKE_START );
|
||||
|
||||
util.BlastDamage ( self.Entity, self:GetOwner(), self.Entity:GetPos(), self.m_DmgRadius, self.m_flDamage );
|
||||
|
||||
self.Entity:Remove();
|
||||
|
||||
end
|
||||
|
||||
function ENT:Precache()
|
||||
|
||||
util.PrecacheModel("models/Items/AR2_Grenade.mdl");
|
||||
|
||||
end
|
||||
@@ -0,0 +1,96 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
ENT.Sound = {}
|
||||
ENT.Sound.Explode = "BaseGrenade.Explode"
|
||||
|
||||
// Nice helper function, this does all the work.
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: DoExplodeEffect
|
||||
---------------------------------------------------------*/
|
||||
function ENT:DoExplodeEffect()
|
||||
|
||||
local info = EffectData();
|
||||
info:SetEntity( self.Entity );
|
||||
info:SetOrigin( self.Entity:GetPos() );
|
||||
|
||||
if self:WaterLevel() >= 3 then
|
||||
util.Effect("WaterSurfaceExplosion", info)
|
||||
end
|
||||
|
||||
self:EmitSound("BaseExplosionEffect.Sound")
|
||||
util.Effect("mmod_fx_explosion_dlight", info, true)
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnExplode
|
||||
Desc: The grenade has just exploded.
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnExplode( pTrace )
|
||||
|
||||
if ((pTrace.Entity != game.GetWorld()) || (pTrace.HitBox != 0)) then
|
||||
// non-world needs smaller decals
|
||||
if( pTrace.Entity && !pTrace.Entity:IsNPC() ) then
|
||||
util.Decal( "SmallScorch", pTrace.HitPos + pTrace.HitNormal, pTrace.HitPos - pTrace.HitNormal );
|
||||
end
|
||||
else
|
||||
util.Decal( "Scorch", pTrace.HitPos + pTrace.HitNormal, pTrace.HitPos - pTrace.HitNormal );
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnInitialize
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnInitialize()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: StartTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:StartTouch( entity )
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: EndTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:EndTouch( entity )
|
||||
end
|
||||
|
||||
function ENT:Touch( pOther )
|
||||
|
||||
assert( pOther );
|
||||
if ( pOther:GetSolid() == SOLID_NONE ) then
|
||||
return;
|
||||
end
|
||||
|
||||
// If I'm live go ahead and blow up
|
||||
if (self.m_bIsLive) then
|
||||
self:Detonate();
|
||||
else
|
||||
// If I'm not live, only blow up if I'm hitting an chacter that
|
||||
// is not the owner of the weapon
|
||||
local pBCC = pOther;
|
||||
if (pBCC && self.Entity:GetOwner() != pBCC) then
|
||||
self.m_bIsLive = true;
|
||||
self:Detonate();
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Name: OnThink
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnThink()
|
||||
end
|
||||
@@ -0,0 +1,19 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.PrintName = ""
|
||||
ENT.Author = ""
|
||||
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
@@ -0,0 +1,66 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
if SERVER then AddCSLuaFile("shared.lua") end
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "HL2 MMod RPG Laser Spot"
|
||||
ENT.Author = "Upset"
|
||||
|
||||
function ENT:SetupDataTables()
|
||||
self:NetworkVar("Bool", 0, "DrawLaser")
|
||||
end
|
||||
|
||||
if SERVER then
|
||||
|
||||
function ENT:Initialize()
|
||||
self:DrawShadow(false)
|
||||
end
|
||||
|
||||
function ENT:Suspend(flSuspendTime)
|
||||
self:SetDrawLaser(false)
|
||||
timer.Simple(flSuspendTime, function()
|
||||
if self and IsValid(self) then
|
||||
self:Revive()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
function ENT:Revive()
|
||||
self:SetDrawLaser(true)
|
||||
end
|
||||
|
||||
else
|
||||
|
||||
ENT.RenderGroup = RENDERGROUP_TRANSLUCENT
|
||||
|
||||
local laser = Material("sprites/redglow1")
|
||||
|
||||
function ENT:DrawTranslucent()
|
||||
if !self:GetDrawLaser() then return end
|
||||
local owner = self:GetOwner()
|
||||
if !owner or !IsValid(owner) or !owner:Alive() then return end
|
||||
local tr = owner:GetEyeTrace()
|
||||
local pos = tr.HitPos
|
||||
local norm = tr.HitNormal
|
||||
local scale = 16.0 + math.Rand(-4.0, 4.0)
|
||||
|
||||
render.SetMaterial(laser)
|
||||
render.DrawSprite(pos + norm * 3 - EyeVector() * 4, 1 * scale, 1 * scale, Color(255,255,255,255))
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local owner = self:GetOwner()
|
||||
if IsValid(owner) then
|
||||
self:SetRenderBoundsWS(LocalPlayer():EyePos(), owner:GetEyeTrace().HitPos)
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,21 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:Draw()
|
||||
if CurTime() > self:GetNWFloat("HideTime", CurTime() + 1) then
|
||||
self:DrawModel()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:IsTranslucent()
|
||||
return true
|
||||
end
|
||||
@@ -0,0 +1,142 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
ENT.Damage = 100
|
||||
ENT.Prime = 0.03
|
||||
ENT.Delay = 30
|
||||
ENT.HideDelay = 0.0
|
||||
function ENT:Initialize()
|
||||
local mdl = self:GetModel()
|
||||
|
||||
if not mdl or mdl == "" or mdl == "models/error.mdl" then
|
||||
self:SetModel("models/weapons/tfa_mmod/w_missile_launch.mdl")
|
||||
end
|
||||
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
--self:PhysicsInitSphere((self:OBBMaxs() - self:OBBMins()):Length() / 4, "metal")
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
local phys = self:GetPhysicsObject()
|
||||
|
||||
if (phys:IsValid()) then
|
||||
phys:Wake()
|
||||
end
|
||||
|
||||
self:SetFriction(self.Delay)
|
||||
self.killtime = CurTime() + self.Delay
|
||||
self:DrawShadow(true)
|
||||
self.StartTime = CurTime()
|
||||
self:EmitSound( "TFA_MMOD.RPG.Loop" )
|
||||
self:SetUseType(SIMPLE_USE)
|
||||
self.HasIdle = true
|
||||
timer.Simple(0.1, function()
|
||||
if IsValid(self) then
|
||||
self:SetOwner()
|
||||
end
|
||||
end)
|
||||
self:SetNWFloat("HideTime",CurTime() + self.HideDelay )
|
||||
self.HP = math.random(30, 60)
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if self.killtime < CurTime() then
|
||||
return false
|
||||
end
|
||||
|
||||
self:NextThink(CurTime())
|
||||
|
||||
return true
|
||||
end
|
||||
|
||||
local effectdata, shake
|
||||
|
||||
function ENT:Explode()
|
||||
if not IsValid(self.Owner) then
|
||||
self:Remove()
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
effectdata = EffectData()
|
||||
effectdata:SetOrigin(self:GetPos())
|
||||
effectdata:SetScale(5)
|
||||
effectdata:SetMagnitude(5)
|
||||
util.Effect("HelicopterMegaBomb", effectdata)
|
||||
util.Effect("Explosion", effectdata)
|
||||
self.Damage = self.mydamage or self.Damage
|
||||
util.BlastDamage(self, self.Owner, self:GetPos(), 512, self.Damage )
|
||||
shake = ents.Create("env_shake")
|
||||
shake:SetOwner(self.Owner)
|
||||
shake:SetPos(self:GetPos())
|
||||
shake:SetKeyValue("amplitude", tostring(self.Damage * 20)) -- Power of the shake
|
||||
shake:SetKeyValue("radius", tostring( 768 ) ) -- Radius of the shake
|
||||
shake:SetKeyValue("duration", tostring( self.Damage / 200 )) -- Time of shake
|
||||
shake:SetKeyValue("frequency", "255") -- How har should the screenshake be
|
||||
shake:SetKeyValue("spawnflags", "4") -- Spawnflags(In Air)
|
||||
shake:Spawn()
|
||||
shake:Activate()
|
||||
shake:Fire("StartShake", "", 0)
|
||||
self:EmitSound("TFA_INS2_RPG7.2")
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, phys)
|
||||
if data.Speed > 60 and CurTime() > self.StartTime + self.Prime then
|
||||
timer.Simple(0,function()
|
||||
if IsValid(self) then
|
||||
self:Explode()
|
||||
end
|
||||
end)
|
||||
else
|
||||
self.Prime = math.huge
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_MMOD.RPG.Loop")
|
||||
self.HasIdle = false
|
||||
self:SetNWFloat("HideTime", -1 )
|
||||
end
|
||||
end
|
||||
--[[elseif self:GetOwner() ~= self then
|
||||
self.Prime = math.huge
|
||||
self:StopSound("TFA_INS2_RPG7.Loop")
|
||||
self:SetOwner(self)
|
||||
end
|
||||
]]--
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if self.HasIdle then
|
||||
self:StopSound("TFA_MMOD.RPG.Loop")
|
||||
self.HasIdle = false
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Use(activator, caller)
|
||||
if activator:IsPlayer() and self.WeaponClass and activator:GetWeapon(self.WeaponClass) then
|
||||
activator:GiveAmmo(1, activator:GetWeapon(self.WeaponClass):GetPrimaryAmmoType(), false)
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnTakeDamage( dmg )
|
||||
if dmg:GetInflictor() == self or dmg:GetAttacker() == self then return end
|
||||
if self.Exploded then return end
|
||||
if self.HP > 0 and self.HP - dmg:GetDamage() <= 0 then
|
||||
self.Exploded = true
|
||||
self:Explode()
|
||||
end
|
||||
self.HP = self.HP - dmg:GetDamage()
|
||||
dmg:SetAttacker(self)
|
||||
dmg:SetInflictor(self)
|
||||
self:TakePhysicsDamage( dmg )
|
||||
end
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Contact Explosive"
|
||||
ENT.Author = ""
|
||||
ENT.Contact = ""
|
||||
ENT.Purpose = ""
|
||||
ENT.Instructions = ""
|
||||
ENT.DoNotDuplicate = true
|
||||
ENT.DisableDuplicator = true
|
||||
@@ -0,0 +1,34 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
local Mat=Material("models/shiny")
|
||||
local Glow=Material("sprites/mat_jack_basicglow")
|
||||
language.Add("ent_rpgrocket","RPG")
|
||||
function ENT:Initialize()
|
||||
self.PrettyModel=ClientsideModel("models/Weapons/w_bullet.mdl")
|
||||
self.PrettyModel:SetPos(self:GetPos()+self:GetUp()*1.25)
|
||||
self.PrettyModel:SetAngles(self:GetAngles())
|
||||
self.PrettyModel:SetParent(self)
|
||||
self.PrettyModel:SetNoDraw(true)
|
||||
self.PrettyModel:SetModelScale(2,0)
|
||||
end
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
if(self:GetDTBool(0))then
|
||||
local Pos=self:GetPos()
|
||||
local Back=-self:GetRight()
|
||||
render.SetMaterial(Glow)
|
||||
render.DrawSprite(Pos+Back*20,100,100,Color(255,220,190,255))
|
||||
end
|
||||
end
|
||||
function ENT:OnRemove()
|
||||
--eat a dick
|
||||
end
|
||||
@@ -0,0 +1,144 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
--gernaaaayud
|
||||
--By Jackarunda
|
||||
AddCSLuaFile('cl_init.lua')
|
||||
AddCSLuaFile('shared.lua')
|
||||
include('shared.lua')
|
||||
|
||||
ENT.MotorPower=2500
|
||||
function ENT:Initialize()
|
||||
self.Owner = self:GetOwner()
|
||||
self.rockettime = CurTime() + 10
|
||||
self.Entity:SetModel("models/weapons/tfa_mmod/w_missile_launch.mdl")
|
||||
self.Entity:PhysicsInit(SOLID_VPHYSICS)
|
||||
self.Entity:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self.Entity:SetSolid(SOLID_VPHYSICS)
|
||||
self.Entity:SetCollisionGroup(COLLISION_GROUP_NONE)
|
||||
self.Entity:SetUseType(SIMPLE_USE)
|
||||
local phys = self.Entity:GetPhysicsObject()
|
||||
if phys:IsValid() then
|
||||
phys:Wake()
|
||||
phys:SetMass(7)
|
||||
--phys:EnableGravity(false)
|
||||
phys:EnableDrag(false)
|
||||
end
|
||||
self:Fire("enableshadow","",0)
|
||||
self.Exploded=false
|
||||
self.ExplosiveMul=0.5
|
||||
self.MotorFired=false
|
||||
self.Engaged=false
|
||||
self:SetModelScale(1,0)
|
||||
self:SetColor(Color(255,255,255))
|
||||
self.InitialAng=self:GetAngles()
|
||||
timer.Simple(0,function()
|
||||
if(IsValid(self))then
|
||||
self:FireMotor()
|
||||
end
|
||||
end)
|
||||
local Settins=physenv.GetPerformanceSettings()
|
||||
if(Settins.MaxVelocity<3000)then
|
||||
Settins.MaxVelocity=3000
|
||||
physenv.SetPerformanceSettings(Settins)
|
||||
end
|
||||
--if not(self.InitialVel)then self.InitialVel=Vector(0,0,0) end
|
||||
end
|
||||
function ENT:FireMotor()
|
||||
self.Entity:EmitSound("TFA_MMOD.RPG.Loop")
|
||||
if(self.MotorFired)then return end
|
||||
self.MotorFired=true
|
||||
--sound.Play("snd_jack_missilemotorfire.wav",self:GetPos(),85,110)
|
||||
--sound.Play("snd_jack_missilemotorfire.wav",self:GetPos()+Vector(0,0,1),88,110)
|
||||
self:SetDTBool(0,true)
|
||||
self.Engaged=true
|
||||
end
|
||||
function ENT:PhysicsCollide(data,physobj)
|
||||
if((data.Speed>80)and(data.DeltaTime>.2))then
|
||||
self:Detonate()
|
||||
end
|
||||
end
|
||||
function ENT:OnTakeDamage(dmginfo)
|
||||
self.Entity:TakePhysicsDamage(dmginfo)
|
||||
end
|
||||
function ENT:Think()
|
||||
if(self.Exploded)then return end
|
||||
if not(self.Engaged)then
|
||||
self:GetPhysicsObject():EnableGravity(false)
|
||||
self:SetAngles(self.InitialAng)
|
||||
--self:GetPhysicsObject():SetVelocity(self.InitialVel)
|
||||
end
|
||||
if(self.MotorFired)then
|
||||
--local Flew=EffectData()
|
||||
--Flew:SetOrigin(self:GetPos()-self:GetRight()*20)
|
||||
--Flew:SetNormal(-self:GetRight())
|
||||
--Flew:SetScale(2)
|
||||
--util.Effect("eff_jack_rocketthrust",Flew)
|
||||
local Flew=EffectData()
|
||||
Flew:SetOrigin(self:GetPos()-self:GetRight()*20)
|
||||
Flew:SetNormal(-self:GetRight())
|
||||
Flew:SetScale(0.5)
|
||||
util.Effect("eff_jack_rocketthrust",Flew)
|
||||
local effdat = EffectData()
|
||||
effdat:SetOrigin( self:GetPos() )
|
||||
effdat:SetNormal( -self:GetForward() )
|
||||
effdat:SetScale( 1 )
|
||||
local SelfPos=self:GetPos()
|
||||
local Phys=self:GetPhysicsObject()
|
||||
Phys:EnableGravity(false)
|
||||
Phys:ApplyForceCenter(self:GetRight()*self.MotorPower)
|
||||
self.MotorPower=self.MotorPower+2000
|
||||
if(self.MotorPower>=2000)then self.MotorPower=2000 end
|
||||
end
|
||||
if self.rockettime < CurTime() then
|
||||
self:Detonate()
|
||||
end
|
||||
self:NextThink(CurTime()+.025)
|
||||
return true
|
||||
end
|
||||
function ENT:OnRemove()
|
||||
--pff
|
||||
end
|
||||
function ENT:Detonate()
|
||||
self.Entity:StopSound( "TFA_MMOD.RPG.Loop" )
|
||||
self.Entity:SetOwner(self.RPGOwner)
|
||||
if(self.Exploding)then return end
|
||||
self.Exploding=true
|
||||
local SelfPos=self:GetPos()
|
||||
local Pos=SelfPos
|
||||
if(true)then
|
||||
/*- EFFECTS -*/
|
||||
util.ScreenShake(SelfPos,99999,99999,1,750)
|
||||
--ParticleEffect("pcf_jack_airsplode_medium",SelfPos,self:GetAngles())
|
||||
for key,thing in pairs(ents.FindInSphere(SelfPos,500))do
|
||||
if((thing:IsNPC())and(self:Visible(thing)))then
|
||||
if(table.HasValue({"npc_strider","npc_combinegunship","npc_helicopter","npc_turret_floor","npc_turret_ground","npc_turret_ceiling"},thing:GetClass()))then
|
||||
thing:SetHealth(1)
|
||||
thing:Fire("selfdestruct","",.5)
|
||||
end
|
||||
end
|
||||
end
|
||||
util.BlastDamage(self.Entity,self.RPGOwner,SelfPos,250,3000)
|
||||
for i=0,40 do
|
||||
local Trayuss=util.QuickTrace(SelfPos,VectorRand()*200,{self.Entity})
|
||||
if(Trayuss.Hit)then
|
||||
util.Decal("Scorch",Trayuss.HitPos+Trayuss.HitNormal,Trayuss.HitPos-Trayuss.HitNormal)
|
||||
end
|
||||
end
|
||||
local Boom=EffectData()
|
||||
Boom:SetOrigin(SelfPos)
|
||||
Boom:SetScale(1)
|
||||
util.Effect("eff_jack_lightboom",Boom,true,true)
|
||||
self.Entity:Remove()
|
||||
end
|
||||
end
|
||||
function ENT:Use(activator,caller)
|
||||
--lol dude
|
||||
end
|
||||
@@ -0,0 +1,17 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "Rocket-Propelled Grenade"
|
||||
ENT.Author = "Jackarunda"
|
||||
ENT.Category = "Jackarunda's Explosives"
|
||||
ENT.Information = "goes zoom outta the rocket launcher and blows shit up"
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
@@ -0,0 +1,18 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
@@ -0,0 +1,175 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
ENT.Model = Model("models/weapons/w_missile.mdl")
|
||||
ENT.ModelLaunch = Model("models/weapons/w_missile_launch.mdl")
|
||||
ENT.Sprite = "sprites/animglow01.vmt"
|
||||
ENT.FlySound = "Missile.Ignite"
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetMoveType(MOVETYPE_FLYGRAVITY)
|
||||
self:SetMoveCollide(MOVECOLLIDE_FLY_BOUNCE)
|
||||
self:SetSolid(SOLID_BBOX)
|
||||
self:SetModel(self.ModelLaunch)
|
||||
self:SetCollisionBounds(Vector(), Vector())
|
||||
|
||||
local angAngs = self:GetAngles()
|
||||
angAngs.x = angAngs.x - 30
|
||||
local vecFwd = angAngs:Forward()
|
||||
|
||||
self:SetLocalVelocity(vecFwd * 250)
|
||||
local svgravity = cvars.Number("sv_gravity", 800)
|
||||
if svgravity != 0 then
|
||||
local gravityMul = 400 / svgravity
|
||||
self:SetGravity(gravityMul)
|
||||
end
|
||||
|
||||
self:NextThink(CurTime() + .4)
|
||||
|
||||
self.radius = 300
|
||||
end
|
||||
|
||||
function ENT:Touch(pOther)
|
||||
if !pOther:IsSolid() or pOther:GetClass() == "hornet" then
|
||||
return
|
||||
end
|
||||
self:Explode(pOther)
|
||||
end
|
||||
|
||||
function ENT:Explode(ent)
|
||||
if self.didHit then return end
|
||||
local vecDir = self:GetForward()
|
||||
local tr = util.TraceLine({
|
||||
start = self:GetPos(),
|
||||
endpos = self:GetPos() + vecDir * 16,
|
||||
mask = MASK_SHOT,
|
||||
filter = self
|
||||
})
|
||||
|
||||
self:SetSolid(SOLID_NONE)
|
||||
if tr.Fraction == 1.0 || !tr.HitSky then
|
||||
local pos, norm = tr.HitPos, tr.HitNormal
|
||||
local explosion = EffectData()
|
||||
explosion:SetOrigin(pos)
|
||||
explosion:SetNormal(norm)
|
||||
if self:WaterLevel() >= 3 then
|
||||
util.Effect("WaterSurfaceExplosion", explosion)
|
||||
else
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "hl2mmod_explosion_rpg" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
end
|
||||
util.Decal("Scorch", pos - vecDir + norm, pos + vecDir)
|
||||
|
||||
local dlighteff = EffectData()
|
||||
dlighteff:SetEntity(self)
|
||||
dlighteff:SetOrigin(self:GetPos())
|
||||
util.Effect("mmod_fx_explosion_dlight", dlighteff)
|
||||
self:EmitSound("BaseExplosionEffect.Sound")
|
||||
|
||||
local owner = IsValid(self.Owner) and self.Owner or self
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetInflictor(self)
|
||||
dmg:SetAttacker(owner)
|
||||
dmg:SetDamage(self.dmg)
|
||||
dmg:SetDamageType(bit.bor(DMG_BLAST, DMG_AIRBOAT))
|
||||
util.BlastDamageInfo(dmg, tr.HitPos, self.radius)
|
||||
end
|
||||
|
||||
self.didHit = true
|
||||
--self:RemoveEffects(EF_BRIGHTLIGHT)
|
||||
self:StopSound(self.FlySound)
|
||||
self:SetLocalVelocity(Vector())
|
||||
self:SetMoveType(MOVETYPE_NONE)
|
||||
self:AddEffects(EF_NODRAW)
|
||||
if self.glow and IsValid(self.glow) then self.glow:Remove() end
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if self.didHit then return end
|
||||
if !self.m_flIgniteTime then
|
||||
self:SetMoveType(MOVETYPE_FLY)
|
||||
self:SetModel(self.Model)
|
||||
ParticleEffectAttach("hl2mmod_weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--self:AddEffects(EF_BRIGHTLIGHT)
|
||||
self:EmitSound(self.FlySound)
|
||||
|
||||
-- self.glow = ents.Create("env_sprite")
|
||||
-- local glow = self.glow
|
||||
-- glow:SetKeyValue("rendercolor", "255 192 64")
|
||||
-- glow:SetKeyValue("GlowProxySize", "2")
|
||||
-- glow:SetKeyValue("HDRColorScale", "1")
|
||||
-- glow:SetKeyValue("renderfx", "15")
|
||||
-- glow:SetKeyValue("rendermode", "3")
|
||||
-- glow:SetKeyValue("renderamt", "255")
|
||||
-- glow:SetKeyValue("model", self.Sprite)
|
||||
-- glow:SetKeyValue("scale", ".08")
|
||||
-- glow:Spawn()
|
||||
-- glow:SetParent(self)
|
||||
-- glow:SetPos(self:GetPos())
|
||||
--ParticleEffectAttach("rocket_smoke_trail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--ParticleEffectAttach("weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
ParticleEffectAttach("hl2mmod_weapon_rpg_smoketrail", PATTACH_ABSORIGIN_FOLLOW, self, 0)
|
||||
--util.SpriteTrail( self.Entity, 0, Color( 165, 165, 165 ), false, 8, 16, 0.5, 1 / ( 165 ), "trails/smoke.vmt" )
|
||||
|
||||
self.m_flIgniteTime = CurTime()
|
||||
self.vecTarget = self:GetForward()
|
||||
|
||||
self:NextThink(CurTime() + 0.1)
|
||||
end
|
||||
if self.bGuiding then
|
||||
local spot = IsValid(self.pLauncher) and !self.pLauncher:GetSprinting() and self.pLauncher:GetSpotEntity() or NULL
|
||||
local vecDir = Vector()
|
||||
|
||||
if IsValid(spot) and spot:GetOwner() == self:GetOwner() and spot:GetDrawLaser() then
|
||||
local tr = util.TraceLine({
|
||||
start = self:GetPos(),
|
||||
endpos = spot:GetPos(),
|
||||
filter = {self, self.Owner, spot}
|
||||
})
|
||||
if tr.Fraction >= 0.90 then
|
||||
vecDir = spot:GetPos() - self:GetPos()
|
||||
vecDir = vecDir:GetNormalized()
|
||||
self.vecTarget = vecDir
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:SetAngles(self.vecTarget:Angle())
|
||||
|
||||
local flSpeed = self:GetVelocity():Length()
|
||||
self:SetLocalVelocity(self:GetVelocity() * 0.2 + self.vecTarget * (flSpeed * 0.8 + 400))
|
||||
if self:WaterLevel() == 3 then
|
||||
if self:GetVelocity():Length() > 300 then
|
||||
self:SetLocalVelocity(self:GetVelocity():GetNormalized() * 300)
|
||||
end
|
||||
else
|
||||
if self:GetVelocity():Length() > 2000 then
|
||||
self:SetLocalVelocity(self:GetVelocity():GetNormalized() * 2000)
|
||||
end
|
||||
end
|
||||
|
||||
self:NextThink(CurTime() + .1)
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self:StopSound(self.FlySound)
|
||||
end
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "HL2 MMod RPG Rocket"
|
||||
ENT.Author = "Upset"
|
||||
@@ -0,0 +1,74 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/tfa_hdtf/w_m67.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:DrawShadow( false )
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_HEGrenade.Throw")
|
||||
self.ExplodeTimer = CurTime() + 1.5
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if SERVER and self.ExplodeTimer <= CurTime() then
|
||||
self:Explode()
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide( data )
|
||||
if SERVER and data.Speed > 150 then
|
||||
self:EmitSound( "TFA_CSGO_HEGrenade.Bounce" )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
|
||||
function ENT:Explode()
|
||||
if SERVER then
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "explosion_hegrenade_brief" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 15 )
|
||||
local explode2 = ents.Create( "info_particle_system" )
|
||||
explode2:SetKeyValue( "effect_name", "explosion_hegrenade_interior" )
|
||||
explode2:SetOwner( self.Owner )
|
||||
explode2:SetPos( self:GetPos() )
|
||||
explode2:Spawn()
|
||||
explode2:Activate()
|
||||
explode2:Fire( "start", "", 0 )
|
||||
explode2:Fire( "kill", "", 15 )
|
||||
self:EmitSound( "TFA_CSGO_BaseGrenade.Explode" )
|
||||
end
|
||||
util.BlastDamage( self, self.Owner, self:GetPos(), 350, 98 )
|
||||
|
||||
local spos = self:GetPos()
|
||||
local trs = util.TraceLine({start=spos + Vector(0,0,64), endpos=spos + Vector(0,0,-32), filter=self})
|
||||
util.Decal("Scorch", trs.HitPos + trs.HitNormal, trs.HitPos - trs.HitNormal)
|
||||
end
|
||||
@@ -0,0 +1,99 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
ENT.Damage = 1
|
||||
|
||||
function ENT:Draw()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self.Damage = 1
|
||||
self:SetNWBool("extinguished",false)
|
||||
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/tfa_csgo/w_eq_incendiarygrenade_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_NONE )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_DEBRIS )
|
||||
self:DrawShadow( false )
|
||||
|
||||
self:CreateFires()
|
||||
end
|
||||
self:NextThink( CurTime() )
|
||||
end
|
||||
|
||||
function ENT:CreateFires()
|
||||
for i = 1, 20 do
|
||||
local fire = ents.Create("info_particle_system")
|
||||
if (i < 2) then
|
||||
fire:SetKeyValue("effect_name","molotov_fire_main_gm")
|
||||
else
|
||||
fire:SetKeyValue("effect_name","molotov_fire_child_gm")
|
||||
end
|
||||
local pos = self:GetPos()
|
||||
//fire:SetPos( Vector( pos.x + 100 * math.sin( math.rad( i * 20 ) ), pos.y + 100 * math.cos( math.rad( i * 20 ) ), pos.z ) )
|
||||
fire:SetPos( Vector( pos.x + math.Rand(0, 144) * math.sin( math.rad( i * math.Rand( 0, 180 ) ) ), pos.y + math.Rand(0, 144) * math.cos( math.rad( i * math.Rand( 0, 180 ) ) ), pos.z ) )
|
||||
fire:SetAngles( self:GetAngles() )
|
||||
fire:SetParent( self )
|
||||
fire:Spawn()
|
||||
fire:Activate()
|
||||
fire:Fire("Start","",0)
|
||||
fire:Fire("Kill", "",8)
|
||||
end
|
||||
|
||||
self.nextFires = CurTime() + 6
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if SERVER then
|
||||
for k, v in pairs( ents.FindInSphere( self:GetPos(), 150 ) ) do
|
||||
if v:IsPlayer() or v:IsNPC() then
|
||||
-- If player did not take the damage in TBC then deal it for 1 second and then stop
|
||||
if (!self.damageReceivers or self.damageReceivers and !self.damageReceivers[v]) then
|
||||
damage = DamageInfo()
|
||||
damage:SetDamage( math.random( 3, 7 ) )
|
||||
damage:SetAttacker( self:GetOwner() )
|
||||
damage:SetInflictor( self:GetCreator() )
|
||||
damage:SetDamageType( DMG_BURN )
|
||||
v:TakeDamageInfo( damage )
|
||||
|
||||
if (self.damageReceivers and self.damageReceivers[v] == nil) then
|
||||
self.damageReceivers[v] = false
|
||||
|
||||
timer.Simple(1, function()
|
||||
if (IsValid(self) and IsValid(v)) then
|
||||
self.damageReceivers[v] = true
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (self.nextFires and CurTime() > self.nextFires) then
|
||||
self:CreateFires()
|
||||
end
|
||||
end
|
||||
if self:GetNWBool("extinguished",true) then
|
||||
if not self.PlayedSound then
|
||||
self:EmitSound("TFA_CSGO_Molotov.Extinguish")
|
||||
self.PlayedSound = true
|
||||
end
|
||||
if SERVER then
|
||||
SafeRemoveEntity( self )
|
||||
end
|
||||
end
|
||||
self:NextThink( CurTime() + math.Rand( 0.2, 0.7 ) )
|
||||
end
|
||||
@@ -0,0 +1,47 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
|
||||
function ENT:Draw()
|
||||
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetNWBool("extinguished",false)
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/tfa_csgo/w_eq_incendiarygrenade_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_NONE )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_DEBRIS )
|
||||
self:DrawShadow( false )
|
||||
end
|
||||
ParticleEffect( "molotov_explosion", self:GetPos(), self:GetAngles() )
|
||||
self:EmitSound( "TFA_CSGO_Inferno.Loop" )
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if self:GetNWBool("extinguished",true) then
|
||||
//ParticleEffect( "extinguish_fire", self:GetPos(), self:GetAngles() )
|
||||
if SERVER then
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
self:EmitSound( "TFA_CSGO_Inferno.FadeOut" )
|
||||
self:StopSound( "TFA_CSGO_Inferno.Loop" )
|
||||
end
|
||||
@@ -0,0 +1,27 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Draw
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Draw()
|
||||
self.Entity:DrawModel()
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
IsTranslucent
|
||||
---------------------------------------------------------*/
|
||||
function ENT:IsTranslucent()
|
||||
return true
|
||||
end
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
include('shared.lua')
|
||||
|
||||
function ENT:Initialize()
|
||||
self:SetModel("models/weapons/arccw_go/w_eq_flashbang_thrown.mdl")
|
||||
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
--self:PhysicsInitSphere( ( self:OBBMaxs() - self:OBBMins() ):Length()/4, "metal" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:DrawShadow( false )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
|
||||
self:EmitSound("TFA_CSGO_Flashbang.Throw")
|
||||
|
||||
local curTime = CurTime()
|
||||
|
||||
self.timeleft = curTime + 2 -- HOW LONG BEFORE EXPLOSION
|
||||
self.removeTime = curTime + 30
|
||||
|
||||
self:Think()
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
local curTime = CurTime()
|
||||
|
||||
if self.timeleft < curTime and !self.deactivated then
|
||||
self:Explosion()
|
||||
end
|
||||
|
||||
if (self.removeTime < curTime and !self.noRemove) then
|
||||
SafeRemoveEntity(self)
|
||||
end
|
||||
|
||||
self:NextThink( curTime )
|
||||
return true
|
||||
end
|
||||
|
||||
function ENT:EntityFacingFactor( theirent )
|
||||
local dir = theirent:EyeAngles():Forward()
|
||||
local facingdir = (self:GetPos() - (theirent.GetShootPos and theirent:GetShootPos() or theirent:GetPos())):GetNormalized()
|
||||
return (facingdir:Dot(dir)+1)/2
|
||||
end
|
||||
|
||||
function ENT:EntityFacingUs( theirent )
|
||||
local dir = theirent:EyeAngles():Forward()
|
||||
local facingdir = (self:GetPos()-(theirent.GetShootPos and theirent:GetShootPos() or theirent:GetPos())):GetNormalized()
|
||||
if facingdir:Dot(dir)>-0.25 then return true end
|
||||
end
|
||||
|
||||
|
||||
function ENT:Explosion()
|
||||
self:EmitSound("TFA_CSGO_FLASHGRENADE.BOOM")
|
||||
|
||||
local tr = {}
|
||||
tr.start = self:GetPos()
|
||||
tr.mask = MASK_SOLID
|
||||
|
||||
for _, v in ipairs(player.GetAll()) do
|
||||
tr.endpos = v:GetShootPos()
|
||||
tr.filter = { self, v, v:GetActiveWeapon() }
|
||||
local traceres = util.TraceLine(tr)
|
||||
|
||||
if !traceres.Hit or traceres.Fraction>=1 or traceres.Fraction<=0 then
|
||||
local factor = self:EntityFacingFactor(v)
|
||||
local distance = v:GetShootPos():Distance(self:GetPos())
|
||||
v:SetNWFloat("TFACSGO_LastFlash", CurTime())
|
||||
v:SetNWEntity("TFACSGO_LastFlashBy", self:GetOwner())
|
||||
v:SetNWFloat("TFACSGO_FlashDistance", distance)
|
||||
v:SetNWFloat("TFACSGO_FlashFactor", factor)
|
||||
|
||||
hook.Run("PlayerFlashed", v, self:GetOwner(), self, distance, factor)
|
||||
|
||||
if v:GetNWFloat("TFACSGO_FlashDistance",distance) < 1500 and v:GetNWFloat("FlashFactor",factor) < tr.endpos:Distance(self:GetPos(v)) then
|
||||
if v:GetNWFloat("TFACSGO_FlashDistance",distance) < 1000 then
|
||||
v:SetDSP( 37 , false )
|
||||
elseif v:GetNWFloat("TFACSGO_FlashDistance",distance) < 800 then
|
||||
v:SetDSP( 36 , false )
|
||||
elseif v:GetNWFloat("TFACSGO_FlashDistance",distance) < 600 then
|
||||
v:SetDSP( 35, false )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
--[[
|
||||
for _, v in ipairs(ents.GetAll()) do
|
||||
if v:IsNPC() and self:EntityFacingUs(v) then
|
||||
tr.endpos = v.GetShootPos and v:GetShootPos() or v:GetPos()
|
||||
tr.filter = { self, v, v.GetActiveWeapon and v:GetActiveWeapon() or v}
|
||||
local traceres = util.TraceLine(tr)
|
||||
if !traceres.Hit or traceres.Fraction>=1 or traceres.Fraction<=0 then
|
||||
local flashdistance = tr.endpos:Distance(self:GetPos())
|
||||
local flashtime = CurTime()
|
||||
local distancefac = ( 1-math.Clamp((flashdistance-csgo_flashdistance+csgo_flashdistancefade)/csgo_flashdistancefade,0,1) )
|
||||
local intensity = ( 1-math.Clamp(((CurTime()-flashtime)/distancefac-csgo_flashtime+csgo_flashfade)/csgo_flashfade,0,1) )
|
||||
if intensity>0.8 then
|
||||
v:SetNWFloat("TFACSGO_LastFlash", CurTime())
|
||||
v:SetNWEntity("TFACSGO_LastFlashBy", self:GetOwner())
|
||||
v:SetNWFloat("TFACSGO_FlashDistance", v:GetShootPos():Distance(self:GetPos()))
|
||||
v:SetNWFloat("TFACSGO_FlashFactor", self:EntityFacingFactor(v))
|
||||
if v.ClearSchedule then
|
||||
v:ClearSchedule()
|
||||
end
|
||||
if v.SetEnemy then
|
||||
v:SetEnemy(nil)
|
||||
end
|
||||
if v.AddEntityRelationship and IsValid(self.Owner) then
|
||||
local oldrel = v.GetRelationship and v:GetRelationship(self.Owner) or ( ( IsFriendEntityName( v:GetClass() ) and !game.GetMap()=="gm_raid" ) and D_LI or D_HT )
|
||||
v:AddEntityRelationship( self.Owner, D_NU, 99)
|
||||
timer.Simple(csgo_flashtime/2, function()
|
||||
if IsValid(v) and v:IsNPC() and IsValid(self) and IsValid(self.Owner) then
|
||||
v:AddEntityRelationship( self.Owner, oldrel, 99)
|
||||
end
|
||||
end)
|
||||
end
|
||||
if v.ClearEnemyMemory then
|
||||
v:ClearEnemyMemory()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
]]
|
||||
|
||||
self.deactivated = true
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
OnTakeDamage
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnTakeDamage( dmginfo )
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Use
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Use( activator, caller, type, value )
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
StartTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:StartTouch( entity )
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
EndTouch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:EndTouch( entity )
|
||||
end
|
||||
|
||||
|
||||
/*---------------------------------------------------------
|
||||
Touch
|
||||
---------------------------------------------------------*/
|
||||
function ENT:Touch( entity )
|
||||
end
|
||||
@@ -0,0 +1,44 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.PrintName = "explosive Grenade"
|
||||
ENT.Author = ""
|
||||
ENT.Contact = ""
|
||||
ENT.Purpose = ""
|
||||
ENT.Instructions = ""
|
||||
ENT.DoNotDuplicate = true
|
||||
ENT.DisableDuplicator = true
|
||||
|
||||
/*---------------------------------------------------------
|
||||
OnRemove
|
||||
---------------------------------------------------------*/
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
PhysicsUpdate
|
||||
---------------------------------------------------------*/
|
||||
function ENT:PhysicsUpdate()
|
||||
end
|
||||
|
||||
/*---------------------------------------------------------
|
||||
PhysicsCollide
|
||||
---------------------------------------------------------*/
|
||||
|
||||
function ENT:PhysicsCollide(data,phys)
|
||||
if data.Speed > 60 then
|
||||
self.Entity:EmitSound(Sound("TFA_CSGO_SmokeGrenade.Bounce"))
|
||||
|
||||
local impulse = (data.OurOldVelocity - 2 * data.OurOldVelocity:Dot(data.HitNormal) * data.HitNormal)*0.25
|
||||
phys:ApplyForceCenter(impulse)
|
||||
end
|
||||
|
||||
end
|
||||
@@ -0,0 +1,74 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/tfa_csgo/w_eq_fraggrenade_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:DrawShadow( false )
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_HEGrenade.Throw")
|
||||
self.ExplodeTimer = CurTime() + 1.5
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if SERVER and self.ExplodeTimer <= CurTime() then
|
||||
self:Explode()
|
||||
self:Remove()
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide( data )
|
||||
if SERVER and data.Speed > 150 then
|
||||
self:EmitSound( "TFA_CSGO_HEGrenade.Bounce" )
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
end
|
||||
|
||||
function ENT:Explode()
|
||||
if SERVER then
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "explosion_hegrenade_brief" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 15 )
|
||||
local explode2 = ents.Create( "info_particle_system" )
|
||||
explode2:SetKeyValue( "effect_name", "explosion_hegrenade_interior" )
|
||||
explode2:SetOwner( self.Owner )
|
||||
explode2:SetPos( self:GetPos() )
|
||||
explode2:Spawn()
|
||||
explode2:Activate()
|
||||
explode2:Fire( "start", "", 0 )
|
||||
explode2:Fire( "kill", "", 15 )
|
||||
self:EmitSound( "TFA_CSGO_BaseGrenade.Explode" )
|
||||
end
|
||||
util.BlastDamage( self, self.Owner, self:GetPos(), 354, 98 )
|
||||
|
||||
local spos = self:GetPos()
|
||||
local trs = util.TraceLine({start=spos + Vector(0,0,64), endpos=spos + Vector(0,0,-32), filter=self})
|
||||
util.Decal("Scorch", trs.HitPos + trs.HitNormal, trs.HitPos - trs.HitNormal)
|
||||
end
|
||||
@@ -0,0 +1,122 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/arccw_go/w_eq_incendiarygrenade_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:DrawShadow( false )
|
||||
|
||||
self.fireEntities = {}
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_IncGrenade.Throw")
|
||||
self.ActiveTimer = CurTime() + 1.5
|
||||
self.IgniteEnd = 0
|
||||
self.IgniteEndTimer = CurTime()
|
||||
self.IgniteStage = 0
|
||||
self.IgniteStageTimer = CurTime()
|
||||
ParticleEffectAttach("incgrenade_thrown_trail",PATTACH_POINT_FOLLOW,self,1)
|
||||
self:PhysicsInitSphere( 8 )
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, phys)
|
||||
if (SERVER and self.ActiveTimer > CurTime() or data.Speed >= 150) then
|
||||
self:EmitSound("TFA_CSGO_SmokeGrenade.Bounce")
|
||||
end
|
||||
|
||||
local ang = data.HitNormal:Angle()
|
||||
ang.p = math.abs(ang.p)
|
||||
ang.y = math.abs(ang.y)
|
||||
ang.r = math.abs(ang.r)
|
||||
|
||||
if (ang.p > 90 or ang.p < 60) then
|
||||
self.Entity:EmitSound(Sound("TFA_CSGO_SmokeGrenade.Bounce"))
|
||||
|
||||
local impulse = (data.OurOldVelocity - 2 * data.OurOldVelocity:Dot(data.HitNormal) * data.HitNormal) * 0.25
|
||||
phys:ApplyForceCenter(impulse)
|
||||
else
|
||||
if (SERVER) then
|
||||
local delayedTrigger = false
|
||||
local client = self.Owner
|
||||
|
||||
for k, v in pairs(ents.FindInSphere(self:GetPos(), 150)) do
|
||||
if (v:IsPlayer() or v:IsNPC()) then
|
||||
hook.Run("InitializeGrenade", client, self, true)
|
||||
delayedTrigger = true
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
local molotovfire = ents.Create("arccw_go_fire")
|
||||
molotovfire:SetPos(self:GetPos())
|
||||
molotovfire:SetOwner(self.Owner)
|
||||
molotovfire:Spawn()
|
||||
|
||||
if (!self.noRemove) then
|
||||
SafeRemoveEntityDelayed(molotovfire, 8)
|
||||
end
|
||||
|
||||
table.insert(self.fireEntities, molotovfire)
|
||||
|
||||
ParticleEffectAttach("fire_large_01", PATTACH_ABSORIGIN_FOLLOW, molotovfire, 0)
|
||||
|
||||
-- Schedule the removal of physics and collision settings after a short delay
|
||||
timer.Simple(0.1, function()
|
||||
if (IsValid(self)) then
|
||||
self:SetMoveType(MOVETYPE_NONE)
|
||||
self:SetSolid(SOLID_NONE)
|
||||
self:PhysicsInit(SOLID_NONE)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_NONE)
|
||||
self:SetRenderMode(RENDERMODE_TRANSALPHA)
|
||||
self:SetColor(Color(255, 255, 255, 0))
|
||||
self:DrawShadow(false)
|
||||
self:StopParticles()
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
self:EmitSound("TFA_CSGO_IncGrenade.Start")
|
||||
self.IgniteEnd = 1
|
||||
self.IgniteEndTimer = CurTime() + 7
|
||||
self.IgniteStage = 1
|
||||
self.IgniteStageTimer = CurTime() + 0.1
|
||||
end
|
||||
|
||||
if (!self.noRemove) then
|
||||
SafeRemoveEntityDelayed(self, 8)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (self.fireEntities and !table.IsEmpty(self.fireEntities)) then
|
||||
for k, v in pairs(self.fireEntities) do
|
||||
if (IsValid(v)) then
|
||||
v:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (timer.Exists("GrenadesCleanup"..self:EntIndex())) then
|
||||
timer.Remove("GrenadesCleanup"..self:EntIndex())
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,92 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.Spawnable = false
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/tfa_csgo/w_eq_molotov_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:DrawShadow( false )
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_Inferno.Throw")
|
||||
self:EmitSound("TFA_CSGO_Inferno.IgniteStart")
|
||||
self.ActiveTimer = CurTime() + 1.5
|
||||
self.IgniteEnd = 0
|
||||
self.IgniteEndTimer = CurTime()
|
||||
self.IgniteStage = 0
|
||||
self.IgniteStageTimer = CurTime()
|
||||
ParticleEffectAttach("weapon_molotov_thrown",PATTACH_POINT_FOLLOW,self,1)
|
||||
self:PhysicsInitSphere( 8 )
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide( data,phys )
|
||||
if SERVER and self.ActiveTimer > CurTime() || data.Speed >= 150 then
|
||||
self:EmitSound(Sound("GlassBottle.ImpactHard"))
|
||||
end
|
||||
local ang = data.HitNormal:Angle()
|
||||
ang.p = math.abs( ang.p )
|
||||
ang.y = math.abs( ang.y )
|
||||
ang.r = math.abs( ang.r )
|
||||
|
||||
if ang.p > 90 or ang.p < 60 then
|
||||
self:EmitSound(Sound("GlassBottle.ImpactHard"))
|
||||
|
||||
local impulse = (data.OurOldVelocity - 2 * data.OurOldVelocity:Dot(data.HitNormal) * data.HitNormal)*0.25
|
||||
phys:ApplyForceCenter(impulse)
|
||||
else
|
||||
if SERVER then
|
||||
local molotovfire = ents.Create( "tfa_csgo_fire_2" )
|
||||
molotovfire:SetPos( self:GetPos() )
|
||||
molotovfire:SetOwner( self.Owner )
|
||||
molotovfire:Spawn()
|
||||
SafeRemoveEntityDelayed(molotovfire, 8)
|
||||
|
||||
local molotovfire = ents.Create( "tfa_csgo_fire_1" )
|
||||
local pos = self:GetPos()
|
||||
molotovfire:SetPos( self:GetPos() )
|
||||
molotovfire:SetOwner( self.Owner )
|
||||
molotovfire:SetCreator( self )
|
||||
molotovfire:Spawn()
|
||||
SafeRemoveEntityDelayed(molotovfire, 8)
|
||||
|
||||
self:SetMoveType( MOVETYPE_NONE )
|
||||
self:SetSolid( SOLID_NONE )
|
||||
self:PhysicsInit( SOLID_NONE )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:SetRenderMode( RENDERMODE_TRANSALPHA )
|
||||
self:SetColor( Color( 255, 255, 255, 0 ) )
|
||||
self:DrawShadow( false )
|
||||
self:StopParticles()
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_Inferno.Start")
|
||||
self.IgniteEnd = 1
|
||||
self.IgniteEndTimer = CurTime() + 7
|
||||
self.IgniteStage = 1
|
||||
self.IgniteStageTimer = CurTime() + 0.1
|
||||
end
|
||||
SafeRemoveEntityDelayed(self, 8)
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (timer.Exists("GrenadesCleanup"..self:EntIndex())) then
|
||||
timer.Remove("GrenadesCleanup"..self:EntIndex())
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,230 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
if (CLIENT) then
|
||||
local EFFECT = {}
|
||||
|
||||
--Thanks Inconceivable/Generic Default
|
||||
function EFFECT:Init(data)
|
||||
self.Entity = data:GetEntity()
|
||||
pos = data:GetOrigin()
|
||||
self.Emitter = ParticleEmitter(pos)
|
||||
|
||||
local cloud = ents.CreateClientside( "arccw_smoke" )
|
||||
|
||||
if !IsValid(cloud) then return end
|
||||
|
||||
cloud:SetPos(pos)
|
||||
cloud:Spawn()
|
||||
|
||||
-- for i = 1, 100 do
|
||||
-- local particle = self.Emitter:Add("arccw/particle/particle_smokegrenade", pos)
|
||||
|
||||
-- if (particle) then
|
||||
-- particle:SetVelocity(VectorRand():GetNormalized() * math.Rand(150, 300))
|
||||
|
||||
-- if i <= 5 then
|
||||
-- particle:SetDieTime(25)
|
||||
-- else
|
||||
-- particle:SetDieTime(math.Rand(20, 25))
|
||||
-- end
|
||||
|
||||
-- particle:SetStartAlpha(math.Rand(150, 255))
|
||||
-- particle:SetEndAlpha(0)
|
||||
-- particle:SetStartSize(44)
|
||||
-- particle:SetEndSize(144)
|
||||
-- particle:SetRoll(math.Rand(0, 360))
|
||||
-- particle:SetRollDelta(math.Rand(-1, 1) / 3)
|
||||
-- particle:SetColor(65, 65, 65)
|
||||
-- particle:SetAirResistance(100)
|
||||
-- particle:SetCollide(true)
|
||||
-- particle:SetBounce(1)
|
||||
-- end
|
||||
-- end
|
||||
end
|
||||
|
||||
function EFFECT:Think()
|
||||
return false
|
||||
end
|
||||
|
||||
function EFFECT:Render()
|
||||
end
|
||||
|
||||
effects.Register(EFFECT, "tfa_csgo_smokenade")
|
||||
end
|
||||
|
||||
AddCSLuaFile()
|
||||
ENT.Type = "anim"
|
||||
ENT.Base = "base_anim"
|
||||
ENT.PrintName = "Smoke Grenade"
|
||||
ENT.Author = ""
|
||||
ENT.Information = ""
|
||||
ENT.Spawnable = false
|
||||
ENT.AdminSpawnable = false
|
||||
|
||||
ENT.BounceSound = Sound("TFA_CSGO_SmokeGrenade.Bounce")
|
||||
ENT.ExplodeSound = Sound("TFA_CSGO_BaseSmokeEffect.Sound")
|
||||
|
||||
function ENT:Draw()
|
||||
self:DrawModel()
|
||||
end
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel( "models/weapons/arccw_go/w_eq_smokegrenade_thrown.mdl" )
|
||||
self:SetMoveType( MOVETYPE_VPHYSICS )
|
||||
self:SetSolid( SOLID_VPHYSICS )
|
||||
self:PhysicsInit( SOLID_VPHYSICS )
|
||||
self:SetCollisionGroup( COLLISION_GROUP_NONE )
|
||||
self:DrawShadow( false )
|
||||
|
||||
self.Delay = CurTime() + 3
|
||||
self.NextParticle = 0
|
||||
self.ParticleCount = 0
|
||||
self.First = true
|
||||
self.IsDetonated = false
|
||||
end
|
||||
self:EmitSound("TFA_CSGO_SmokeGrenade.Throw")
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, physobj)
|
||||
if SERVER then
|
||||
self.HitP = data.HitPos
|
||||
self.HitN = data.HitNormal
|
||||
|
||||
if self:GetVelocity():Length() > 60 then
|
||||
self:EmitSound(self.BounceSound)
|
||||
end
|
||||
|
||||
if self:GetVelocity():Length() < 5 then
|
||||
self:SetMoveType(MOVETYPE_NONE)
|
||||
end
|
||||
|
||||
for k, v in pairs( ents.FindInSphere( self:GetPos(), 155 ) ) do
|
||||
if v:GetClass() == "tfa_csgo_fire_1" or v:GetClass() == "tfa_csgo_fire_2" and self.IsDetonated == false then
|
||||
self:Detonate(self,self:GetPos())
|
||||
self.IsDetonated = true
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Think()
|
||||
if SERVER then
|
||||
local curTime = CurTime()
|
||||
if curTime > self.Delay then
|
||||
if self.IsDetonated == false then
|
||||
self:Detonate(self,self:GetPos())
|
||||
self.IsDetonated = true
|
||||
end
|
||||
end
|
||||
|
||||
if (self.nextSmoke and curTime > self.nextSmoke) then
|
||||
self:CreateSmoke()
|
||||
end
|
||||
end
|
||||
|
||||
for k, v in pairs (ents.GetAll()) do
|
||||
local SmokeHidden2 = v:GetNWBool( "IsInsideSmoke", false )
|
||||
if IsValid(v) and v:IsPlayer() or v:IsNPC() and v.SmokeHidden2 != nil or v.SmokeHidden2 == true then
|
||||
v:SetNWBool("IsInsideSmoke", false)
|
||||
v:RemoveFlags(FL_NOTARGET)
|
||||
end
|
||||
end
|
||||
|
||||
if self.IsDetonated then
|
||||
for k, v in pairs( ents.FindInSphere( self:GetPos(), 155 ) ) do
|
||||
if (v:GetClass("tfa_csgo_fire_1") or v:GetClass("tfa_csgo_fire_2")) and v:IsValid() then
|
||||
v:SetNWBool("extinguished",true)
|
||||
end
|
||||
if v:GetNWBool("extinguished",true) and self.ParticleCreated == false then
|
||||
//ParticleEffect( "extinguish_fire", self:GetPos(), self:GetAngles() )
|
||||
self.ExtinguishParticleCreated = true
|
||||
end
|
||||
if IsValid(v) and v:IsPlayer() or v:IsNPC() then
|
||||
local SmokeHidden = v:GetNWBool( "IsInsideSmoke", false )
|
||||
if v.SmokeHidden != false or v.SmokeHidden == nil then
|
||||
v:SetNWBool("IsInsideSmoke", true)
|
||||
v:AddFlags(FL_NOTARGET)
|
||||
end
|
||||
end
|
||||
if IsValid(v) and v:IsNPC() and v.SmokeHidden == true then
|
||||
if v.OldProfiecency == nil then
|
||||
v.OldProfiecency = v:GetCurrentWeaponProficiency()
|
||||
end
|
||||
v:SetCurrentWeaponProficiency(WEAPON_PROFICIENCY_POOR)
|
||||
v:ClearSchedule()
|
||||
v:SetState(NPC_STATE_ALERT)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:Detonate(self,pos)
|
||||
self.ParticleCreated = false
|
||||
self.ExtinguishParticleCreated = false
|
||||
if SERVER then
|
||||
if not self:IsValid() then return end
|
||||
self:SetNWBool("IsDetonated",true)
|
||||
self:EmitSound(self.ExplodeSound)
|
||||
|
||||
self:CreateSmoke(pos)
|
||||
end
|
||||
if self.ParticleCreated != true then
|
||||
ParticleEffectAttach("explosion_child_smoke03e",PATTACH_ABSORIGIN_FOLLOW,self,0)
|
||||
ParticleEffectAttach("explosion_child_core06b",PATTACH_POINT_FOLLOW,self,0)
|
||||
ParticleEffectAttach("explosion_child_smoke07b",PATTACH_ABSORIGIN_FOLLOW,self,0)
|
||||
ParticleEffectAttach("explosion_child_smoke07c",PATTACH_POINT_FOLLOW,self,0)
|
||||
ParticleEffectAttach("explosion_child_distort01c",PATTACH_POINT_FOLLOW,self,0)
|
||||
self.ParticleCreated = true
|
||||
end
|
||||
for k, v in pairs( ents.FindInSphere( self:GetPos(), 155 ) ) do
|
||||
if (v:GetClass("tfa_csgo_fire_1") or v:GetClass("tfa_csgo_fire_2")) and v:IsValid() then
|
||||
v:SetNWBool("extinguished",true)
|
||||
end
|
||||
if v:GetNWBool("extinguished",true) and self.ParticleCreated == false then
|
||||
//ParticleEffect( "extinguish_fire", self:GetPos(), self:GetAngles() )
|
||||
self.ExtinguishParticleCreated = true
|
||||
end
|
||||
end
|
||||
|
||||
self:SetMoveType( MOVETYPE_NONE )
|
||||
|
||||
if SERVER and !self.noRemove then
|
||||
SafeRemoveEntityDelayed(self, 60)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:CreateSmoke(pos)
|
||||
local gas = EffectData()
|
||||
gas:SetOrigin(pos or self:GetPos())
|
||||
gas:SetEntity(self.Owner) //i dunno, just use it!
|
||||
util.Effect("tfa_csgo_smokenade", gas)
|
||||
|
||||
self.nextSmoke = CurTime() + 20
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
for k, v in pairs (ents.GetAll()) do
|
||||
local SmokeHidden = v:GetNWBool( "IsInsideSmoke", false )
|
||||
if v:IsPlayer() or v:IsNPC() and v.SmokeHidden2 != nil or v.SmokeHidden2 == true then
|
||||
v:SetNWBool("IsInsideSmoke", false)
|
||||
v:RemoveFlags(FL_NOTARGET)
|
||||
end
|
||||
if v:IsNPC() and v.OldProfiecency != nil then
|
||||
v:SetCurrentWeaponProficiency(v.OldProfiecency)
|
||||
end
|
||||
end
|
||||
|
||||
if (timer.Exists("GrenadesCleanup"..self:EntIndex())) then
|
||||
timer.Remove("GrenadesCleanup"..self:EntIndex())
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,232 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
function ENT:Think()
|
||||
local CT = CurTime()
|
||||
local FT = FrameTime()
|
||||
local attach = self:LookupAttachment("Wick")
|
||||
local data = self:GetAttachment(attach)
|
||||
local attpos,attangs
|
||||
attpos = data.Pos
|
||||
attangs = data.Ang
|
||||
|
||||
if self:GetNWBool("Fused") then
|
||||
ParticleEffect("weapon_sensorgren_beeplight",attpos,attangs,self)
|
||||
self.ParticleCreated = true
|
||||
self:StopParticles()
|
||||
if self.FuseTime then
|
||||
if self.FuseTime <= CT then
|
||||
if not self.NextBeep then
|
||||
self.DetonateTime = CT + 1.5
|
||||
self.NextBeep = 0
|
||||
end
|
||||
|
||||
self.NextBeep = self.NextBeep - FT * 6
|
||||
self:StopParticles()
|
||||
self.ParticleCreated = false
|
||||
|
||||
if self.NextBeep <= 0 and self.ParticleCreated == false then
|
||||
self.NextBeep = 1
|
||||
end
|
||||
end
|
||||
else
|
||||
self.FuseTime = CT + 0.65
|
||||
self:StopParticles()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local tr, col = {}, Color(255, 25, 25)
|
||||
local glow = Material("tfa_csgo/sprites/flare_sprite_02")
|
||||
|
||||
function ENT:Draw()
|
||||
local ply = LocalPlayer()
|
||||
local attach = self:LookupAttachment("Wick")
|
||||
local data = self:GetAttachment(attach)
|
||||
local attpos,attangs
|
||||
attpos = data.Pos
|
||||
attangs = data.Ang
|
||||
|
||||
self:DrawModel()
|
||||
|
||||
local CT = CurTime()
|
||||
|
||||
if self.NextBeep then
|
||||
if self.NextBeep > 0 then
|
||||
tr.start = self:GetPos()
|
||||
tr.endpos = ply:EyePos()
|
||||
tr.mask = MASK_SOLID
|
||||
tr.filter = { self, ply, ply:GetActiveWeapon() }
|
||||
|
||||
local trace = util.TraceLine(tr)
|
||||
local fraction = trace.Fraction
|
||||
|
||||
if self.DetonateTime > CT then
|
||||
self:StopParticles()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local TFA_HaloManager = {}
|
||||
TFA_HaloManager.EVENT_NAME = "TFA_SONAR"
|
||||
|
||||
-- Taken from Sakarias88's Intelligent HUD
|
||||
local function GetEntityAABB(ent)
|
||||
local mins = ent:OBBMins()
|
||||
local maxs = ent:OBBMaxs()
|
||||
|
||||
local pos = {
|
||||
ent:LocalToWorld(Vector(maxs.x, maxs.y, maxs.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(maxs.x, mins.y, maxs.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(maxs.x, maxs.y, mins.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(maxs.x, mins.y, mins.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(mins.x, maxs.y, maxs.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(mins.x, mins.y, maxs.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(mins.x, maxs.y, mins.z)):ToScreen(),
|
||||
ent:LocalToWorld(Vector(mins.x, mins.y, mins.z)):ToScreen()
|
||||
}
|
||||
|
||||
local minX = pos[1].x
|
||||
local minY = pos[1].y
|
||||
|
||||
local maxX = pos[1].x
|
||||
local maxY = pos[1].y
|
||||
|
||||
for k = 2, 8 do
|
||||
if pos[k].x > maxX then
|
||||
maxX = pos[k].x
|
||||
end
|
||||
|
||||
if pos[k].y > maxY then
|
||||
maxY = pos[k].y
|
||||
end
|
||||
|
||||
if pos[k].x < minX then
|
||||
minX = pos[k].x
|
||||
end
|
||||
|
||||
if pos[k].y < minY then
|
||||
minY = pos[k].y
|
||||
end
|
||||
end
|
||||
|
||||
return Vector(minX, minY), Vector(maxX, maxY)
|
||||
end
|
||||
|
||||
local function TFA_SONAR_CREATE_HALOS(len, ply)
|
||||
local entnum = net.ReadInt(14)
|
||||
|
||||
for i = 1, entnum do
|
||||
TFA_HaloManager:Add(net.ReadEntity(), 3)
|
||||
end
|
||||
end
|
||||
net.Receive("TFA_CSGO_SONAR_EXPLODE", TFA_SONAR_CREATE_HALOS)
|
||||
|
||||
function TFA_HaloManager:Add(ent, t)
|
||||
if not IsValid(ent) then return end
|
||||
|
||||
table.insert(self, {ent = ent, t = CurTime() + t})
|
||||
self:Enable()
|
||||
end
|
||||
|
||||
local _ents = {}
|
||||
local halo_color = Color(255, 0, 0)
|
||||
|
||||
function TFA_HaloManager:Enable()
|
||||
local events = hook.GetTable()
|
||||
|
||||
local tab = events["PreDrawHalos"]
|
||||
|
||||
if tab and not tab[self.EVENT_NAME] or not tab then
|
||||
hook.Add("PreDrawHalos", self.EVENT_NAME, function()
|
||||
self:DrawHalo()
|
||||
end)
|
||||
end
|
||||
|
||||
local tab = events["PostDrawOpaqueRenderables"]
|
||||
|
||||
if tab and not tab[self.EVENT_NAME] or not tab then
|
||||
hook.Add("PostDrawOpaqueRenderables", self.EVENT_NAME, function()
|
||||
self:Draw()
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function TFA_HaloManager:Disable()
|
||||
hook.Remove("PreDrawHalos", self.EVENT_NAME)
|
||||
hook.Remove("PostDrawOpaqueRenderables", self.EVENT_NAME)
|
||||
end
|
||||
|
||||
local mat1 = Material("models/debug/debugwhite")
|
||||
function TFA_HaloManager:Draw()
|
||||
for k, v in ipairs(self) do
|
||||
if not IsValid(v.ent) then self[k] = nil continue end
|
||||
render.ClearStencil()
|
||||
render.SetStencilEnable(true)
|
||||
|
||||
render.SetStencilWriteMask(255)
|
||||
render.SetStencilTestMask(255)
|
||||
render.SetStencilReferenceValue(1)
|
||||
|
||||
render.SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_ALWAYS)
|
||||
render.SetStencilFailOperation(STENCILOPERATION_KEEP)
|
||||
render.SetStencilPassOperation(STENCILOPERATION_REPLACE)
|
||||
render.SetStencilZFailOperation(STENCILOPERATION_REPLACE)
|
||||
|
||||
v.ent:DrawModel()
|
||||
|
||||
render.SetStencilCompareFunction(STENCILCOMPARISONFUNCTION_EQUAL)
|
||||
|
||||
local mins, maxs = GetEntityAABB(v.ent)
|
||||
|
||||
cam.Start2D()
|
||||
local health = v.ent:Health()
|
||||
local maxHealth = v.ent:GetMaxHealth()
|
||||
|
||||
local mul = math.Clamp(health / maxHealth, 0, 1)
|
||||
|
||||
local x = mins.x
|
||||
local y = mins.y + (maxs.y - mins.y) * mul
|
||||
|
||||
local w = maxs.x - x
|
||||
local h = maxs.y - y
|
||||
|
||||
surface.SetDrawColor(255, 0, 0, 32)
|
||||
surface.DrawRect(x, y, w, h)
|
||||
cam.End2D()
|
||||
|
||||
render.SetStencilEnable(false)
|
||||
end
|
||||
end
|
||||
|
||||
function TFA_HaloManager:DrawHalo()
|
||||
local CT = CurTime()
|
||||
|
||||
for i = 1, #_ents do
|
||||
_ents[i] = nil
|
||||
end
|
||||
|
||||
for k, v in ipairs(self) do
|
||||
if (not IsValid(v.ent) or v.ent:Health() <= 0) or v.t <= CT then
|
||||
table.remove(self, k)
|
||||
else
|
||||
table.insert(_ents, v.ent)
|
||||
end
|
||||
end
|
||||
|
||||
halo.Add(_ents, halo_color, 2, 2, 2, true, true )
|
||||
|
||||
if #self <= 0 then
|
||||
self:Disable()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,140 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
util.AddNetworkString("TFA_CSGO_SONAR_EXPLODE")
|
||||
|
||||
local function EntityFacingFactor(ent1, ent2)
|
||||
local dir = ent2:EyeAngles():Forward()
|
||||
local facingdir = (ent1:GetPos() - (ent2.EyePos and ent2:EyePos() or ent2:GetPos())):GetNormalized()
|
||||
return (facingdir:Dot(dir) + 1) / 2
|
||||
end
|
||||
|
||||
local tr = {}
|
||||
|
||||
function ENT:Detonate()
|
||||
local origin = self:GetPos()
|
||||
|
||||
if IsValid(self.Owner) then
|
||||
local _ents = ents.FindInSphere(origin, self.FindRadius)
|
||||
local tab = {}
|
||||
|
||||
for _, v in ipairs(_ents) do
|
||||
if v:IsNPC() or v:IsPlayer() and v ~= self.Owner then
|
||||
table.insert(tab, v)
|
||||
end
|
||||
end
|
||||
|
||||
if #tab <= 0 then return end
|
||||
|
||||
net.Start("TFA_CSGO_SONAR_EXPLODE", true)
|
||||
net.WriteInt(#tab, 14)
|
||||
for i = 1, #tab do
|
||||
net.WriteEntity(tab[i])
|
||||
end
|
||||
net.Send(self.Owner)
|
||||
end
|
||||
|
||||
tr.start = origin
|
||||
tr.mask = MASK_SOLID
|
||||
|
||||
for k, v in ipairs(player.GetAll()) do
|
||||
tr.endpos = v:EyePos()
|
||||
tr.filter = { self, v, v:GetActiveWeapon() }
|
||||
|
||||
local trace = util.TraceLine(tr)
|
||||
if not trace.Hit or trace.Fraction >= 1 or trace.Fraction <= 0 then
|
||||
v:SetNWFloat("TFACSGO_LastFlash", CurTime() - 4)
|
||||
v:SetNWFloat("TFACSGO_FlashDistance", tr.endpos:Distance(origin))
|
||||
v:SetNWFloat("TFACSGO_FlashFactor", EntityFacingFactor(self, v) * 0.5)
|
||||
end
|
||||
end
|
||||
|
||||
self:EmitSound("TFA_CSGO_Sensor.Detonate")
|
||||
|
||||
local explode = ents.Create( "info_particle_system" )
|
||||
explode:SetKeyValue( "effect_name", "weapon_sensorgren_detonate" )
|
||||
explode:SetOwner( self.Owner )
|
||||
explode:SetPos( self:GetPos() )
|
||||
explode:Spawn()
|
||||
explode:Activate()
|
||||
explode:Fire( "start", "", 0 )
|
||||
explode:Fire( "kill", "", 30 )
|
||||
|
||||
SafeRemoveEntity(self)
|
||||
end
|
||||
|
||||
function ENT:Fuse(ent)
|
||||
if SERVER then
|
||||
self.WeldEnt = constraint.Weld(self, ent, 0, 0, 0, true, false)
|
||||
|
||||
self:EmitSound("TFA_CSGO_Sensor.Activate")
|
||||
timer.Simple(3, function()
|
||||
if IsValid(self) then
|
||||
self:StopParticles()
|
||||
self:Detonate()
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
function ENT:PhysicsCollide(data, physObj)
|
||||
if not self:GetNWBool("Fused") then
|
||||
if data.HitEntity then
|
||||
if not (data.HitEntity:IsNPC() or data.HitEntity:IsPlayer()) then
|
||||
self:SetNWBool("Fused", true)
|
||||
|
||||
timer.Simple(0, function()
|
||||
if IsValid(self) then
|
||||
self:EmitSound("TFA_CSGO_Sensor.Land")
|
||||
self:Fuse(data.HitEntity)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
end
|
||||
orient_angles(physObj,data)
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
if (timer.Exists("GrenadesCleanup"..self:EntIndex())) then
|
||||
timer.Remove("GrenadesCleanup"..self:EntIndex())
|
||||
end
|
||||
end
|
||||
|
||||
function orient_angles(obj, data) --this function juts takes in the hitnormal of the collision and rotates the angles accordingly
|
||||
if data.HitNormal.z < -.5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(0,90,0) ):Angle())
|
||||
return
|
||||
end
|
||||
if data.HitNormal.z > .5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(-90,0,0) ):Angle())
|
||||
return
|
||||
end
|
||||
if data.HitNormal.y < -.5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(0,0,90) ):Angle())
|
||||
return
|
||||
end
|
||||
if data.HitNormal.y > .5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(0,0,90) ):Angle())
|
||||
return
|
||||
end
|
||||
if data.HitNormal.x < -.5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(0,0,90) ):Angle())
|
||||
return
|
||||
end
|
||||
if data.HitNormal.x > .5 then
|
||||
obj:SetAngles((data.HitNormal + Vector(0,0,90) ):Angle())
|
||||
return
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,43 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ENT.Type = "anim"
|
||||
ENT.Spawnable = false
|
||||
|
||||
ENT.FindRadius = 250
|
||||
|
||||
ENT.Model = "models/weapons/tfa_csgo/w_eq_sensorgrenade_thrown.mdl"
|
||||
|
||||
function ENT:Initialize()
|
||||
if SERVER then
|
||||
self:SetModel(self.Model)
|
||||
|
||||
self:PhysicsInit(SOLID_VPHYSICS)
|
||||
self:SetMoveType(MOVETYPE_VPHYSICS)
|
||||
self:SetSolid(SOLID_VPHYSICS)
|
||||
self:SetCollisionGroup(COLLISION_GROUP_NONE)
|
||||
self:DrawShadow( false )
|
||||
|
||||
local phys = self:GetPhysicsObject()
|
||||
if IsValid(phys) then
|
||||
phys:Wake()
|
||||
end
|
||||
end
|
||||
|
||||
self:EmitSound("TFA_CSGO_HEGrenade.Throw")
|
||||
end
|
||||
|
||||
function ENT:Use(activator, caller)
|
||||
return false
|
||||
end
|
||||
|
||||
function ENT:OnRemove()
|
||||
return false
|
||||
end
|
||||
@@ -0,0 +1,83 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
DEFINE_BASECLASS( SWEP.Base )
|
||||
|
||||
SWEP.StatTrakBoneCheck = false
|
||||
SWEP.NameTagBoneCheck = false
|
||||
|
||||
function SWEP:PreDrawViewModel(vm, wep, ply)
|
||||
if not self.StatTrakBoneCheck and IsValid(vm) then
|
||||
if not self.NoStattrak and self.VElements["stattrak"].bonemerge and not vm:LookupBone("v_weapon.stattrack") then
|
||||
self.NoStattrak = true
|
||||
end
|
||||
|
||||
self.StatTrakBoneCheck = true
|
||||
end
|
||||
|
||||
if not self.NameTagBoneCheck and IsValid(vm) then
|
||||
if not self.NoNametag and self.VElements["nametag"].bonemerge and not vm:LookupBone("v_weapon.uid") then
|
||||
self.NoNametag = true
|
||||
end
|
||||
|
||||
self.NameTagBoneCheck = true
|
||||
end
|
||||
|
||||
return BaseClass.PreDrawViewModel(self, vm, wep, ply)
|
||||
end
|
||||
|
||||
local cv_dropmags = GetConVar("cl_tfa_csgo_magdrop") or CreateClientConVar("cl_tfa_csgo_magdrop", "1", true, true, "Drop magazine on weapon reload?")
|
||||
local cv_maglife = GetConVar("cl_tfa_csgo_maglife") or CreateClientConVar("cl_tfa_csgo_maglife", "15",true,true, "Magazine Lifetime")
|
||||
|
||||
SWEP.MagLifeTime = 15
|
||||
|
||||
function SWEP:DropMag()
|
||||
if not cv_dropmags or not cv_dropmags:GetBool() then return end
|
||||
|
||||
if not cv_maglife then
|
||||
cv_maglife = GetConVar("cl_tfa_csgo_maglifelife")
|
||||
end
|
||||
|
||||
if cv_life then
|
||||
self.LifeTime = cv_life:GetInteger()
|
||||
end
|
||||
|
||||
if not self.MagModel then return end
|
||||
|
||||
local mag = ents.CreateClientProp()
|
||||
|
||||
mag:SetModel(self.MagModel)
|
||||
mag:SetMaterial(self:GetMaterial())
|
||||
for i = 1, #self:GetMaterials() do
|
||||
mag:SetSubMaterial(i - 1, self:GetSubMaterial(i - 1))
|
||||
end -- full skin support
|
||||
|
||||
local pos, ang = self:GetPos(), self:GetAngles()
|
||||
|
||||
if self:IsFirstPerson() and self:VMIV() then
|
||||
local vm = self.OwnerViewModel
|
||||
ang = vm:GetAngles()
|
||||
pos = vm:GetPos() - ang:Up() * 8
|
||||
end
|
||||
|
||||
mag:SetPos(pos)
|
||||
mag:SetAngles(ang)
|
||||
|
||||
mag:PhysicsInit(SOLID_VPHYSICS)
|
||||
mag:PhysWake()
|
||||
|
||||
mag:SetMoveType(MOVETYPE_VPHYSICS) -- we call it AFTER physics init
|
||||
|
||||
mag:Spawn()
|
||||
|
||||
SafeRemoveEntityDelayed(mag, self.MagLifeTime)
|
||||
end
|
||||
@@ -0,0 +1,25 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
|
||||
include("shared.lua")
|
||||
|
||||
function SWEP:DropMag()
|
||||
net.Start("TFA_CSGO_DropMag", true)
|
||||
net.WriteEntity(self)
|
||||
|
||||
if sp then
|
||||
net.Broadcast()
|
||||
else
|
||||
net.SendOmit(self:GetOwner())
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,346 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
DEFINE_BASECLASS("tfa_gun_base")
|
||||
SWEP.Skins = {}
|
||||
SWEP.Skin = ""
|
||||
SWEP.Callback = {}
|
||||
SWEP.VMPos = Vector(0.879, 0.804, -1)
|
||||
SWEP.VMPos_Additive = false --Set to false for an easier time using VMPos. If true, VMPos will act as a constant delta ON TOP OF ironsights, run, whateverelse
|
||||
SWEP.ProceduralHolsterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
SWEP.NoStattrak = false
|
||||
SWEP.NoNametag = false
|
||||
SWEP.TracerCount = 1
|
||||
SWEP.TracerName = "tfa_tracer_csgo" -- Change to a string of your tracer name. Can be custom. There is a nice example at https://github.com/garrynewman/garrysmod/blob/master/garrysmod/gamemodes/base/entities/effects/tooltracer.lua
|
||||
SWEP.TracerDelay = 0.0 --Delay for lua tracer effect
|
||||
SWEP.IsTFACSGOWeapon = true
|
||||
|
||||
--These are particle effects INSIDE a pcf file, not PCF files, that are played when you shoot.
|
||||
SWEP.SmokeParticles = {
|
||||
pistol = "weapon_muzzle_smoke",
|
||||
smg = "weapon_muzzle_smoke",
|
||||
grenade = "weapon_muzzle_smoke",
|
||||
ar2 = "weapon_muzzle_smoke_long",
|
||||
shotgun = "weapon_muzzle_smoke_long",
|
||||
rpg = "weapon_muzzle_smoke",
|
||||
physgun = "weapon_muzzle_smoke",
|
||||
crossbow = "weapon_muzzle_smoke",
|
||||
melee = "weapon_muzzle_smoke",
|
||||
slam = "weapon_muzzle_smoke",
|
||||
normal = "weapon_muzzle_smoke",
|
||||
melee2 = "weapon_muzzle_smoke",
|
||||
knife = "weapon_muzzle_smoke",
|
||||
duel = "weapon_muzzle_smoke",
|
||||
camera = "weapon_muzzle_smoke",
|
||||
magic = "weapon_muzzle_smoke",
|
||||
revolver = "weapon_muzzle_smoke",
|
||||
silenced = "weapon_muzzle_smoke"
|
||||
}
|
||||
|
||||
TFA = TFA or {}
|
||||
TFA.CSGO = TFA.CSGO or {}
|
||||
TFA.CSGO.Skins = TFA.CSGO.Skins or {}
|
||||
|
||||
function SWEP:Initialize()
|
||||
BaseClass.Initialize(self)
|
||||
|
||||
self:ReadSkin()
|
||||
|
||||
if SERVER then
|
||||
self:CallOnClient("ReadSkin", "")
|
||||
end
|
||||
end
|
||||
|
||||
local bgcolor = Color(0, 0, 0, 255 * 0.78)
|
||||
local btntextcol = Color(191, 191, 191, 255 * 0.9)
|
||||
local btntextdisabledcol = Color(63, 63, 63, 255 * 0.9)
|
||||
|
||||
local emptyFunc = function() end
|
||||
|
||||
local SkinMenuFrame
|
||||
|
||||
local sp = game.SinglePlayer()
|
||||
|
||||
function SWEP:AltAttack()
|
||||
if sp and SERVER then self:CallOnClient("AltAttack") return end
|
||||
|
||||
if not CLIENT or IsValid(SkinMenuFrame) then return end
|
||||
|
||||
SkinMenuFrame = vgui.Create("DFrame")
|
||||
|
||||
SkinMenuFrame:SetSkin("Default")
|
||||
|
||||
SkinMenuFrame:SetSize(320, 24 + 64 * 3 + 5 * 4)
|
||||
SkinMenuFrame:Center()
|
||||
|
||||
SkinMenuFrame:ShowCloseButton(false)
|
||||
SkinMenuFrame:SetDraggable(false)
|
||||
|
||||
SkinMenuFrame:SetTitle("TFA CS:GO Weapon Actions")
|
||||
SkinMenuFrame:MakePopup()
|
||||
|
||||
SkinMenuFrame.Paint = function(myself, wv, hv)
|
||||
local x, y = myself:GetPos()
|
||||
|
||||
render.SetScissorRect(x, y, x + wv, y + hv, true)
|
||||
Derma_DrawBackgroundBlur(myself)
|
||||
render.SetScissorRect(0, 0, 0, 0, false)
|
||||
|
||||
draw.NoTexture()
|
||||
surface.SetDrawColor(bgcolor)
|
||||
surface.DrawRect(0, 0, wv, hv)
|
||||
end
|
||||
|
||||
local btnSkinPicker = vgui.Create("DButton", SkinMenuFrame)
|
||||
btnSkinPicker:SetTall(64)
|
||||
btnSkinPicker:DockMargin(0, 0, 0, 5)
|
||||
btnSkinPicker:Dock(TOP)
|
||||
|
||||
btnSkinPicker:SetFont("DermaLarge")
|
||||
btnSkinPicker:SetTextColor(btntextcol)
|
||||
btnSkinPicker.Paint = emptyFunc
|
||||
|
||||
btnSkinPicker:SetText("Change Skin")
|
||||
|
||||
btnSkinPicker.DoClick = function(btn, value)
|
||||
RunConsoleCommand("cl_tfa_csgo_vgui_skinpicker")
|
||||
|
||||
SkinMenuFrame:Close()
|
||||
end
|
||||
|
||||
local btnNamePicker = vgui.Create("DButton", SkinMenuFrame)
|
||||
btnNamePicker:SetTall(64)
|
||||
btnNamePicker:DockMargin(0, 0, 0, 5)
|
||||
btnNamePicker:Dock(TOP)
|
||||
|
||||
btnNamePicker:SetFont("DermaLarge")
|
||||
btnNamePicker:SetTextColor(btntextcol)
|
||||
btnNamePicker.Paint = emptyFunc
|
||||
|
||||
btnNamePicker:SetText("Change Nametag")
|
||||
|
||||
if self.NoNametag then
|
||||
btnNamePicker:SetDisabled(true)
|
||||
btnNamePicker:SetTextColor(btntextdisabledcol)
|
||||
btnNamePicker:SetCursor("no")
|
||||
end
|
||||
|
||||
btnNamePicker.DoClick = function(btn, value)
|
||||
RunConsoleCommand("cl_tfa_csgo_vgui_namepicker")
|
||||
|
||||
SkinMenuFrame:Close()
|
||||
end
|
||||
|
||||
local btnClose = vgui.Create("DButton", SkinMenuFrame)
|
||||
btnClose:SetTall(64)
|
||||
btnClose:DockMargin(0, 0, 0, 0)
|
||||
btnClose:Dock(BOTTOM)
|
||||
|
||||
btnClose:SetFont("DermaLarge")
|
||||
btnClose:SetTextColor(btntextcol)
|
||||
btnClose.Paint = emptyFunc
|
||||
|
||||
btnClose:SetText("Close")
|
||||
|
||||
btnClose.DoClick = function(btn, value)
|
||||
SkinMenuFrame:Close()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SaveSkin()
|
||||
if CLIENT then
|
||||
if not file.Exists("tfa_csgo/", "DATA") then
|
||||
file.CreateDir("tfa_csgo")
|
||||
end
|
||||
|
||||
local f = file.Open("tfa_csgo/" .. self:GetClass() .. ".txt", "w", "DATA")
|
||||
f:Write(self.Skin and self.Skin or "")
|
||||
f:Flush()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SyncToServerSkin(skin)
|
||||
if not skin or string.len(skin) <= 0 then
|
||||
skin = self.Skin
|
||||
end
|
||||
|
||||
if not skin then return end
|
||||
if not CLIENT then return end
|
||||
-- net.Start("TFA_CSGO_SKIN", true)
|
||||
-- net.WriteEntity(self)
|
||||
-- net.WriteString(skin)
|
||||
-- net.SendToServer()
|
||||
end
|
||||
|
||||
function SWEP:LoadSkinTable()
|
||||
if true then return end
|
||||
local cl = self:GetClass()
|
||||
|
||||
if TFA.CSGO.Skins[cl] then
|
||||
for k, v in pairs(TFA.CSGO.Skins[cl]) do
|
||||
self.Skins[k] = v
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:ReadSkin()
|
||||
if CLIENT then
|
||||
self:LoadSkinTable()
|
||||
local cl = self:GetClass()
|
||||
local path = "tfa_csgo/" .. cl .. ".txt"
|
||||
|
||||
if file.Exists(path, "DATA") then
|
||||
local f = file.Read(path, "DATA")
|
||||
|
||||
if f and v ~= "" then
|
||||
self.Skin = f
|
||||
end
|
||||
end
|
||||
|
||||
self:SetNWString("skin", self.Skin)
|
||||
self:SyncToServerSkin()
|
||||
end
|
||||
|
||||
self:UpdateSkin()
|
||||
end
|
||||
|
||||
function SWEP:UpdateSkin()
|
||||
if (CLIENT and IsValid(LocalPlayer()) and LocalPlayer() ~= self.Owner) or SERVER then
|
||||
self:SetMaterial("")
|
||||
self.Skin = self:GetNWString("skin")
|
||||
|
||||
if self.Skins and self.Skins[self.Skin] and self.Skins[self.Skin].tbl then
|
||||
self:SetSubMaterial(nil, nil)
|
||||
|
||||
for k, str in ipairs(self.Skins[self.Skin].tbl) do
|
||||
if type(str) == "string" then
|
||||
self:SetSubMaterial(k - 1, str)
|
||||
|
||||
return
|
||||
end
|
||||
end
|
||||
self:ClearMaterialCache()
|
||||
end
|
||||
end
|
||||
|
||||
if not self.Skin then
|
||||
self.Skin = ""
|
||||
end
|
||||
|
||||
if self.Skin and self.Skins and self.Skins[self.Skin] then
|
||||
self.MaterialTable = self.Skins[self.Skin].tbl
|
||||
|
||||
for l, b in pairs(self.MaterialTable) do
|
||||
TFA.CSGO.LoadCachedVMT(string.sub(b, 2))
|
||||
print("Requesting skin #" .. l .. "//" .. string.sub(b, 2))
|
||||
end
|
||||
self:ClearMaterialCache()
|
||||
end
|
||||
end
|
||||
|
||||
SWEP.LerpLight = Vector(1, 1, 1)
|
||||
|
||||
SWEP.VElements = {
|
||||
["nametag"] = { type = "Model", model = "models/weapons/tfa_csgo/uid.mdl", bone = "", rel = "", pos = Vector(0, 0, 0), angle = Angle(0, 0, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bonemerge = true, bodygroup = {}, active = true },
|
||||
["stattrak"] = { type = "Model", model = "models/weapons/tfa_csgo/stattrack.mdl", bone = "", rel = "", pos = Vector(0, 0, 0), angle = Angle(0, 0, 0), size = Vector(1, 1, 1), color = Color(255, 255, 255, 255), surpresslightning = false, material = "", skin = 0, bonemerge = true, bodygroup = {}, active = true },
|
||||
}
|
||||
|
||||
local stattrak_cv = GetConVar("cl_tfa_csgo_stattrack") or CreateClientConVar("cl_tfa_csgo_stattrack", 1, true, true)
|
||||
local dostattrak
|
||||
|
||||
function SWEP:UpdateStattrak()
|
||||
if not CLIENT or not self.VElements["stattrak"] then return end
|
||||
|
||||
dostattrak = stattrak_cv:GetBool() and not self.NoStattrak
|
||||
|
||||
local statname = "VElements.stattrak.active"
|
||||
|
||||
if self:GetStat(statname) ~= dostattrak then
|
||||
self.VElements["stattrak"].active = dostattrak
|
||||
self:ClearStatCache(statname)
|
||||
end
|
||||
end
|
||||
|
||||
local nametag_cv = GetConVar("cl_tfa_csgo_nametag") or CreateClientConVar("cl_tfa_csgo_nametag", 1, true, true)
|
||||
local donametag
|
||||
|
||||
function SWEP:UpdateNametag()
|
||||
if not CLIENT or not self.VElements["nametag"] then return end
|
||||
|
||||
donametag = nametag_cv:GetBool() and not self.NoNametag
|
||||
|
||||
local statname = "VElements.nametag.active"
|
||||
|
||||
if self:GetStat(statname) ~= donametag then
|
||||
self.VElements["nametag"].active = donametag
|
||||
self:ClearStatCache(statname)
|
||||
end
|
||||
end
|
||||
|
||||
local shells_cv = GetConVar("cl_tfa_csgo_2dshells") or CreateClientConVar("cl_tfa_csgo_2dshells", 1, true, true)
|
||||
|
||||
local shellsoverride
|
||||
function SWEP:UpdateShells()
|
||||
if SERVER then
|
||||
shellsoverride = (IsValid(self:GetOwner()) and self:GetOwner():IsPlayer() and self:GetOwner():GetInfoNum(shells_cv:GetName(), 0) > 0) and "tfa_shell_csgo" or nil
|
||||
else
|
||||
shellsoverride = shells_cv:GetBool() and "tfa_shell_csgo" or nil
|
||||
end
|
||||
|
||||
local statname = "ShellEffectOverride"
|
||||
|
||||
if self:GetStat(statname) ~= shellsoverride then
|
||||
self.ShellEffectOverride = shellsoverride
|
||||
self:ClearStatCache(statname)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:MakeShell(...)
|
||||
self:UpdateShells()
|
||||
|
||||
return BaseClass.MakeShell(self, ...)
|
||||
end
|
||||
|
||||
function SWEP:Think2(...)
|
||||
if ((CLIENT and IsValid(LocalPlayer()) and LocalPlayer() ~= self.Owner) or SERVER) and self.Skin ~= self:GetNWString("skin") then
|
||||
self.Skin = self:GetNWString("skin")
|
||||
self:UpdateSkin()
|
||||
end
|
||||
|
||||
self:UpdateStattrak()
|
||||
self:UpdateNametag()
|
||||
|
||||
BaseClass.Think2(self, ...)
|
||||
end
|
||||
|
||||
function SWEP:SetBodyGroupVM(k, v)
|
||||
if isstring(k) then
|
||||
local vals = k:Split(" ")
|
||||
k = vals[1]
|
||||
v = vals[2]
|
||||
end
|
||||
|
||||
self.Bodygroups_V[k] = v
|
||||
|
||||
if SERVER then
|
||||
self:CallOnClient("SetBodyGroupVM", "" .. k .. " " .. v)
|
||||
end
|
||||
end
|
||||
|
||||
local cv_chamber = GetConVar("sv_tfa_csgo_chambering") or CreateConVar("sv_tfa_csgo_chambering", 1, CLIENT and {FCVAR_REPLICATED} or {FCVAR_REPLICATED, FCVAR_ARCHIVE, FCVAR_NOTIFY}, "Allow round-in-the-chamber on TFA CS:GO weapons?")
|
||||
|
||||
function SWEP:CanChamber(...)
|
||||
if not cv_chamber:GetBool() then return false end
|
||||
|
||||
return BaseClass.CanChamber(self, ...)
|
||||
end
|
||||
@@ -0,0 +1,130 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/flashbang/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/flashbang/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.Explode",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 140,
|
||||
sound = { "arccw_go/flashbang/flashbang_explode1.wav",
|
||||
"arccw_go/flashbang/flashbang_explode2.wav" }
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashgrenade.BOOM",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 140,
|
||||
sound = { "arccw_go/flashbang/flashbang_explode1.wav",
|
||||
"arccw_go/flashbang/flashbang_explode2.wav" }
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "arccw_go/flashbang/grenade_hit1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "arccw_go/flashbang/flashbang_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Flashbang.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/flashbang/grenade_throw.wav"
|
||||
} )
|
||||
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "Flashbang" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/arccw_go/v_eq_flashbang.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/w_eq_flashbang_dropped.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_flash"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
|
||||
SWEP.Primary.Damage = 0
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownflash") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 750 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -2,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
@@ -0,0 +1,166 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_FRAGGRENADE.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_FRAGGRENADE.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_FRAGGRENADE.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "weapons/tfa_csgo/hegrenade/he_bounce-1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_FRAGGRENADE.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_FRAGGRENADE.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/hegrenade/he_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_HEGrenade.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_HEGrenade.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_HEGrenade.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "weapons/tfa_csgo/hegrenade/he_bounce-1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_HEGrenade.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/hegrenade/grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_HEGrenade.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/hegrenade/he_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_BaseGrenade.ExplodeOld",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 140,
|
||||
sound = { "weapons/tfa_csgo/hegrenade/explode3.wav",
|
||||
"weapons/tfa_csgo/hegrenade/explode4.wav",
|
||||
"weapons/tfa_csgo/hegrenade/explode5.wav" }
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_BaseGrenade.Explode",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 140,
|
||||
sound = { --"weapons/tfa_csgo/hegrenade/hegrenade_detonate01.wav",
|
||||
"weapons/tfa_csgo/hegrenade/hegrenade_detonate_02.wav",
|
||||
"weapons/tfa_csgo/hegrenade/hegrenade_detonate_03.wav" }
|
||||
} )
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "High Explosive Grenade" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/tfa_csgo/c_eq_fraggrenade.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/tfa_csgo/w_frag.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_frag"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownfrag") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 750 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
@@ -0,0 +1,206 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_INCENDGRENADE.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_bounce-1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_INCENDGRENADE.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_INCENDGRENADE.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_INCENDGRENADE.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_INCENDGRENADE.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_bounce-1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/incgrenade/inc_grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.Start_IncGrenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 95,
|
||||
sound = { "arccw_go/incgrenade/inc_grenade_detonate_1.wav",
|
||||
"arccw_go/incgrenade/inc_grenade_detonate_2.wav",
|
||||
"arccw_go/incgrenade/inc_grenade_detonate_3.wav" }
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_IncGrenade.Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 95,
|
||||
sound = { "arccw_go/incgrenade/inc_grenade_detonate_1.wav",
|
||||
"arccw_go/incgrenade/inc_grenade_detonate_2.wav",
|
||||
"arccw_go/incgrenade/inc_grenade_detonate_3.wav" }
|
||||
} )
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "Incendiary Grenade" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/arccw_go/v_eq_incendiarygrenade.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/arccw_go/w_eq_incendiarygrenade_thrown.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_incend"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
|
||||
SWEP.Primary.Damage = 100
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownincen") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 850 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Delay = 0.05 -- Delay to fire entity
|
||||
SWEP.Delay_Underhand = 0.2 -- Delay to fire entity
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 1.8,
|
||||
Forward = 3.2,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 180
|
||||
},
|
||||
Scale = 0.8
|
||||
}
|
||||
|
||||
function SWEP:ChoosePullAnim()
|
||||
if !self:OwnerIsValid() then return end
|
||||
|
||||
self.Owner:SetAnimation(PLAYER_RELOAD)
|
||||
--self:ResetEvents()
|
||||
local tanim=ACT_VM_PULLPIN
|
||||
local success = true
|
||||
self:SendWeaponAnim(ACT_VM_PULLPIN)
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce",tanim)
|
||||
end
|
||||
|
||||
self.lastact = tanim
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:ThrowStart()
|
||||
if self:Clip1()>0 then
|
||||
self:ChooseShootAnim()
|
||||
self:SetNWBool("Ready",false)
|
||||
local bool = self:GetNWBool("Underhanded",false)
|
||||
if bool then
|
||||
timer.Simple(self.Delay_Underhand,function()
|
||||
if IsValid(self) and self:OwnerIsValid() then self:Throw() end
|
||||
end)
|
||||
else
|
||||
timer.Simple(self.Delay,function()
|
||||
if IsValid(self) and self:OwnerIsValid() then self:Throw() end
|
||||
end)
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,212 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_MolotovGrenade.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/molotov/grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/molotov/grenade_throw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Molotov.Throw",
|
||||
channel = CHAN_STATIC,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_ignite_2.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Molotov.Extinguish",
|
||||
channel = CHAN_STATIC,
|
||||
level = 95,
|
||||
volume = 0.6,
|
||||
sound = "weapons/tfa_csgo/molotov/molotov_extinguish.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.IgniteStart",
|
||||
channel = CHAN_STATIC,
|
||||
level = 65,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_ignite_2.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Molotov.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/molotov/molotov_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Molotov.IdleLoop",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_idle_loop_1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.IdleLoop",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_idle_loop_1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 95,
|
||||
sound = { "weapons/tfa_csgo/molotov/molotov_detonate_1.wav",
|
||||
"weapons/tfa_csgo/molotov/molotov_detonate_2.wav",
|
||||
"weapons/tfa_csgo/molotov/molotov_detonate_3.wav" }
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.FadeOut",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 95,
|
||||
volume = 0.1,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_loop_fadeout_01.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Inferno.Loop",
|
||||
channel = CHAN_AUTO,
|
||||
level = 75,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/molotov/fire_loop_1.wav"
|
||||
} )
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "Molotov" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/tfa_csgo/c_eq_molotov.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/tfa_csgo/w_molotov.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_molly"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
SWEP.Primary.Damage = 100
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownmolotov") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 850 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Delay = 0.05 -- Delay to fire entity
|
||||
SWEP.Delay_Underhand = 0.2 -- Delay to fire entity
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 1.8,
|
||||
Forward = 3.2,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 180
|
||||
},
|
||||
Scale = 0.8
|
||||
}
|
||||
|
||||
function SWEP:ChoosePullAnim()
|
||||
if !self:OwnerIsValid() then return end
|
||||
self.ParticleCreated = false
|
||||
|
||||
if SERVER then
|
||||
self:EmitSound( "TFA_CSGO_Inferno.IdleLoop" )
|
||||
end
|
||||
|
||||
self.Owner:SetAnimation(PLAYER_RELOAD)
|
||||
--self:ResetEvents()
|
||||
local tanim=ACT_VM_PULLPIN
|
||||
local success = true
|
||||
self:SendWeaponAnim(ACT_VM_PULLPIN)
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce",tanim)
|
||||
end
|
||||
|
||||
if IsValid(self) and self:OwnerIsValid() and self.Owner:GetViewModel():GetModel()==self.ViewModel and self.ParticleCreated == false then
|
||||
ParticleEffectAttach("weapon_molotov_fp",PATTACH_POINT_FOLLOW,self.Owner:GetViewModel(),2)
|
||||
self.ParticleCreated = true
|
||||
end
|
||||
|
||||
self.lastact = tanim
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:ThrowStart()
|
||||
if self:Clip1()>0 then
|
||||
self:ChooseShootAnim()
|
||||
self:SetNWBool("Ready",false)
|
||||
local bool = self:GetNWBool("Underhanded",false)
|
||||
if bool then
|
||||
timer.Simple(self.Delay_Underhand,function()
|
||||
if IsValid(self) and self:OwnerIsValid() then
|
||||
if SERVER then
|
||||
self:StopSound( "TFA_CSGO_Inferno.IdleLoop" )
|
||||
end
|
||||
self:Throw() end
|
||||
end)
|
||||
else
|
||||
timer.Simple(self.Delay,function()
|
||||
if IsValid(self) and self:OwnerIsValid() then
|
||||
if SERVER then
|
||||
self:StopSound( "TFA_CSGO_Inferno.IdleLoop" )
|
||||
end
|
||||
self:Throw()
|
||||
end
|
||||
end)
|
||||
end
|
||||
self:CleanParticles()
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,119 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_SmokeGrenade.PullPin_Grenade",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/smokegrenade/pinpull.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_SmokeGrenade.PullPin_Grenade_Start",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/smokegrenade/pinpull_start.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_SmokeGrenade.Bounce",
|
||||
channel = CHAN_ITEM,
|
||||
level = 75,
|
||||
volume = 0.6,
|
||||
sound = "arccw_go/smokegrenade/grenade_hit1.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_BaseSmokeEffect.Sound",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 85,
|
||||
sound = "arccw_go/smokegrenade/sg_explode.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_SmokeGrenade.Draw",
|
||||
channel = CHAN_ITEM,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "arccw_go/smokegrenade/smokegrenade_draw.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_SmokeGrenade.Throw",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
sound = "arccw_go/smokegrenade/grenade_throw.wav"
|
||||
} )
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "Smoke Grenade" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/arccw_go/v_eq_smokegrenade.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/w_eq_smokegrenade_dropped.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.Damage = 0
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_smoke"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownsmoke") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 750 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
@@ -0,0 +1,122 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.Equip",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
volume = 0.4,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_equip.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.Activate",
|
||||
channel = CHAN_WEAPON,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_arm.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.Land",
|
||||
channel = CHAN_STATIC,
|
||||
level = 65,
|
||||
volume = 0.7,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_land.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.WarmupBeep",
|
||||
channel = CHAN_STATIC,
|
||||
level = 75,
|
||||
volume = 0.3,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_detect.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.DetectPlayer_Hud",
|
||||
channel = CHAN_STATIC,
|
||||
level = 65,
|
||||
volume = 0.5,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_detecthud.wav"
|
||||
} )
|
||||
sound.Add(
|
||||
{
|
||||
name = "TFA_CSGO_Sensor.Detonate",
|
||||
channel = CHAN_STATIC,
|
||||
level = 140,
|
||||
volume = 1.0,
|
||||
sound = "weapons/tfa_csgo/sensorgrenade/sensor_explode.wav"
|
||||
} )
|
||||
|
||||
SWEP.Category = "TFA CS:GO Grenades"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "Tactical Awareness Grenade" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/tfa_csgo/c_sonar_bomb.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/tfa_csgo/w_eq_sensorgrenade.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_csnade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.RPM = 30 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "csgo_sonarbomb"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
SWEP.Primary.Round = ("tfa_csgo_thrownsonar") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 750 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 375 -- Entity Velocity
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -2,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 245/260 --Multiply the player's movespeed by this.
|
||||
SWEP.IronSightsMoveSpeed = 245/260*0.8 --Multiply the player's movespeed by this when sighting.
|
||||
@@ -0,0 +1,13 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
|
||||
SWEP.DisplayFalloff = false
|
||||
@@ -0,0 +1,14 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
|
||||
include('shared.lua')
|
||||
@@ -0,0 +1,257 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_csgo_base"
|
||||
|
||||
DEFINE_BASECLASS(SWEP.Base)
|
||||
|
||||
SWEP.NoStattrak = true
|
||||
SWEP.NoNametag = true
|
||||
|
||||
SWEP.MuzzleFlashEffect = ""
|
||||
SWEP.data = {}
|
||||
SWEP.data.ironsights = 0
|
||||
|
||||
SWEP.Delay = 0.1 -- Delay to fire entity
|
||||
SWEP.Delay_Underhand = 0.1 -- Delay to fire entity
|
||||
SWEP.Primary.Round = ("") -- Nade Entity
|
||||
SWEP.Velocity = 550 -- Entity Velocity
|
||||
|
||||
SWEP.Underhanded = false
|
||||
|
||||
function SWEP:Initialize()
|
||||
self.ProjectileEntity = self.ProjectileEntity or self.Primary.Round --Entity to shoot
|
||||
self.ProjectileVelocity = self.Velocity and self.Velocity or 550 --Entity to shoot's velocity
|
||||
self.ProjectileModel = nil --Entity to shoot's model
|
||||
self.ProjectileAngles = nil
|
||||
|
||||
-- copied idea from gauss just because WHY THE FUCK NOT
|
||||
self.GetNW2Bool = self.GetNW2Bool or self.GetNWBool
|
||||
self.SetNW2Bool = self.SetNW2Bool or self.SetNWBool
|
||||
|
||||
self:SetNW2Bool("Charging", false)
|
||||
self:SetNW2Bool("Ready", false)
|
||||
self:SetNW2Bool("Underhanded", false)
|
||||
|
||||
BaseClass.Initialize(self)
|
||||
end
|
||||
|
||||
function SWEP:Deploy()
|
||||
if self:Clip1() <= 0 then
|
||||
if self:Ammo1() <= 0 then
|
||||
timer.Simple(0, function()
|
||||
if CLIENT or not IsValid(self) or not self:OwnerIsValid() then return end
|
||||
self:GetOwner():StripWeapon(self:GetClass())
|
||||
end)
|
||||
else
|
||||
self:TakePrimaryAmmo(1, true)
|
||||
self:SetClip1(1)
|
||||
end
|
||||
end
|
||||
|
||||
self:SetNW2Bool("Charging", false)
|
||||
self:SetNW2Bool("Ready", false)
|
||||
self:SetNW2Bool("Underhanded", false)
|
||||
|
||||
self:CleanParticles()
|
||||
BaseClass.Deploy(self)
|
||||
end
|
||||
|
||||
function SWEP:ChoosePullAnim()
|
||||
if not self:OwnerIsValid() then return end
|
||||
|
||||
if self.Callback.ChoosePullAnim then
|
||||
self.Callback.ChoosePullAnim(self)
|
||||
end
|
||||
|
||||
self.Owner:SetAnimation(PLAYER_RELOAD)
|
||||
--self:ResetEvents()
|
||||
local tanim = ACT_VM_PULLPIN
|
||||
local success = true
|
||||
self:SendViewModelAnim(ACT_VM_PULLPIN)
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce", tanim)
|
||||
end
|
||||
|
||||
self.lastact = tanim
|
||||
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:ChooseShootAnim()
|
||||
if not self:OwnerIsValid() then return end
|
||||
|
||||
if self.Callback.ChooseShootAnim then
|
||||
self.Callback.ChooseShootAnim(self)
|
||||
end
|
||||
|
||||
self.Owner:SetAnimation(PLAYER_ATTACK1)
|
||||
--self:ResetEvents()
|
||||
local mybool = self:GetNW2Bool("Underhanded", false)
|
||||
local tanim = mybool and ACT_VM_RELEASE or ACT_VM_THROW
|
||||
if not self.SequenceEnabled[ACT_VM_RELEASE] then
|
||||
tanim = ACT_VM_THROW
|
||||
end
|
||||
if mybool then
|
||||
tanim = ACT_VM_RELEASE
|
||||
end
|
||||
local success = true
|
||||
self:SendViewModelAnim(tanim)
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce", tanim)
|
||||
end
|
||||
|
||||
self.lastact = tanim
|
||||
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:CanFire()
|
||||
if not self:OwnerIsValid() then return false end
|
||||
if not TFA.Enum.ReadyStatus[self:GetStatus()] then return false end
|
||||
|
||||
--[[
|
||||
local vm = self.Owner:GetViewModel()
|
||||
local seq = vm:GetSequence()
|
||||
local act = vm:GetSequenceActivity(seq)
|
||||
if not (act == ACT_VM_DRAW or act == ACT_VM_IDLE) then return false end
|
||||
if act == ACT_VM_DRAW and vm:GetCycle() < 0.99 then return false end
|
||||
]] -- you see tfa WE DONT NEED THAT OLD CODE ANYMORE
|
||||
|
||||
return not (self:GetNW2Bool("Charging") or self:GetNW2Bool("Ready"))
|
||||
end
|
||||
|
||||
function SWEP:ThrowStart()
|
||||
if self:Clip1() > 0 then
|
||||
self:ChooseShootAnim()
|
||||
self:SetNW2Bool("Ready", false)
|
||||
local bool = self:GetNW2Bool("Underhanded", false)
|
||||
|
||||
self:SetStatus(TFA.Enum.STATUS_GRENADE_THROW)
|
||||
self:SetStatusEnd(CurTime() + (bool and self.Delay_Underhand or self.Delay))
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Throw()
|
||||
if self:Clip1() > 0 then
|
||||
local bool = self:GetNW2Bool("Underhanded", false)
|
||||
local ply = self:GetOwner()
|
||||
|
||||
local entity = ents.Create(self:GetStat("Primary.Round"))
|
||||
entity:SetOwner(ply)
|
||||
|
||||
if not bool then
|
||||
self.ProjectileVelocity = self.Velocity or 550 --Entity to shoot's velocity
|
||||
if IsValid(entity) then
|
||||
entity:SetPos(ply:GetShootPos() + ply:EyeAngles():Forward() * 16)
|
||||
entity:SetAngles(ply:EyeAngles())
|
||||
entity:Spawn()
|
||||
|
||||
local physObj = entity:GetPhysicsObject()
|
||||
if IsValid(physObj) then
|
||||
physObj:SetVelocity(ply:GetAimVector() * self.Velocity + Vector(0, 0, 200))
|
||||
physObj:AddAngleVelocity(Vector(math.Rand(-750, 750), math.Rand(-750, 750), math.Rand(-750, 750)))
|
||||
end
|
||||
end
|
||||
else
|
||||
if self:GetStat("Velocity_Underhand") then
|
||||
if IsValid( entity ) then
|
||||
entity:SetPos( ply:GetShootPos() + ply:EyeAngles():Forward() * 16 + ply:EyeAngles():Up() * -12 )
|
||||
entity:SetAngles( ply:EyeAngles() )
|
||||
entity:Spawn()
|
||||
entity:GetPhysicsObject():SetVelocity( ply:GetAimVector() * self:GetStat("Velocity_Underhand") + Vector( 0, 0, 200 ) )
|
||||
entity:GetPhysicsObject():AddAngleVelocity( Vector( math.Rand( -500, 500 ), math.Rand( -500, 500 ), math.Rand( -500, 500 ) ) )
|
||||
end
|
||||
else
|
||||
--self.ProjectileVelocity = (self.Velocity and self.Velocity or 550) / 1.5
|
||||
if IsValid( entity ) then
|
||||
entity:SetPos( ply:GetShootPos() + ply:EyeAngles():Forward() * 16 )
|
||||
entity:SetAngles( ply:EyeAngles() )
|
||||
entity:Spawn()
|
||||
entity:GetPhysicsObject():SetVelocity( ply:GetAimVector() * self.Velocity + Vector( 0, 0, 200 ) )
|
||||
entity:GetPhysicsObject():AddAngleVelocity( Vector( math.Rand( -750, 750 ), math.Rand( -750, 750 ), math.Rand( -750, 750 ) ) )
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
self:TakePrimaryAmmo(1)
|
||||
|
||||
self:SetStatus(TFA.Enum.STATUS_GRENADE_READY)
|
||||
self:SetStatusEnd(CurTime() + self.OwnerViewModel:SequenceDuration())
|
||||
self:SetNextPrimaryFire(self:GetStatusEnd())
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack()
|
||||
if self:Clip1() > 0 and self:OwnerIsValid() and self:CanFire() then
|
||||
self:ChoosePullAnim()
|
||||
self:SetStatus(TFA.Enum.STATUS_GRENADE_PULL)
|
||||
self:SetStatusEnd(CurTime() + self.OwnerViewModel:SequenceDuration())
|
||||
self:SetNW2Bool("Charging", true)
|
||||
self:SetNW2Bool("Underhanded", false)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
if self:Clip1() > 0 and self:CanFire() then
|
||||
self:ChoosePullAnim()
|
||||
self:SetStatus(TFA.Enum.STATUS_GRENADE_PULL)
|
||||
self:SetStatusEnd(CurTime() + self.OwnerViewModel:SequenceDuration())
|
||||
self:SetNW2Bool("Charging", true)
|
||||
self:SetNW2Bool("Ready", false)
|
||||
self:SetNW2Bool("Underhanded", true)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Reload()
|
||||
if self:Clip1() <= 0 and self:CanFire() then
|
||||
self:Deploy()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:ChooseIdleAnim( ... )
|
||||
if self:GetNW2Bool("Charging") or self:GetNW2Bool("Ready") then return end
|
||||
BaseClass.ChooseIdleAnim(self,...)
|
||||
end
|
||||
|
||||
function SWEP:Think2()
|
||||
if SERVER then
|
||||
local ct = CurTime()
|
||||
|
||||
if self:GetStatus() == TFA.Enum.STATUS_GRENADE_PULL and ct >= self:GetStatusEnd() then
|
||||
self:SetNW2Bool("Charging", false)
|
||||
self:SetNW2Bool("Ready", true)
|
||||
elseif self:GetStatus() == TFA.Enum.STATUS_GRENADE_THROW and ct >= self:GetStatusEnd() then
|
||||
self:Throw()
|
||||
elseif self:GetStatus() == TFA.Enum.STATUS_GRENADE_READY and ct >= self:GetStatusEnd() then
|
||||
self:Deploy()
|
||||
end
|
||||
|
||||
if self:OwnerIsValid() and self:GetOwner():IsPlayer() then -- npc support haHAA
|
||||
if self:GetNW2Bool("Charging", false) and not self:GetNW2Bool("Ready", false) then
|
||||
if self:GetOwner():KeyDown(IN_ATTACK2) then
|
||||
self:SetNW2Bool("Underhanded", true)
|
||||
end
|
||||
elseif not self:GetNW2Bool("Charging", false) and self:GetNW2Bool("Ready", true) then
|
||||
if not self:GetOwner():KeyDown(IN_ATTACK2) and not self:GetOwner():KeyDown(IN_ATTACK) then
|
||||
self:ThrowStart()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return BaseClass.Think2(self)
|
||||
end
|
||||
|
||||
function SWEP:ShootBullet()
|
||||
return false -- OMEGALUL
|
||||
end
|
||||
@@ -0,0 +1,44 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include ("shared.lua")
|
||||
|
||||
SWEP.MagLifeTime = 15
|
||||
|
||||
function SWEP:DropMag()
|
||||
|
||||
if not self.MagModel then return end
|
||||
|
||||
local mag = ents.CreateClientProp()
|
||||
|
||||
mag:SetModel(self.MagModel)
|
||||
mag:SetMaterial(self:GetMaterial())
|
||||
|
||||
local pos, ang = self:GetPos(), self:GetAngles()
|
||||
|
||||
if self:IsFirstPerson() and self:VMIV() then
|
||||
local vm = self.OwnerViewModel
|
||||
ang = vm:GetAngles()
|
||||
pos = vm:GetPos() - ang:Up() * 8
|
||||
end
|
||||
|
||||
mag:SetPos(pos)
|
||||
mag:SetAngles(ang)
|
||||
|
||||
mag:PhysicsInit(SOLID_VPHYSICS)
|
||||
mag:PhysWake()
|
||||
|
||||
mag:SetMoveType(MOVETYPE_VPHYSICS) -- we call it AFTER physics init
|
||||
|
||||
mag:Spawn()
|
||||
|
||||
SafeRemoveEntityDelayed(mag, self.MagLifeTime)
|
||||
|
||||
end
|
||||
@@ -0,0 +1,45 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
-- Copyright (c) 2018-2020 TFA Base Devs
|
||||
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
-- of this software and associated documentation files (the "Software"), to deal
|
||||
-- in the Software without restriction, including without limitation the rights
|
||||
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
-- copies of the Software, and to permit persons to whom the Software is
|
||||
-- furnished to do so, subject to the following conditions:
|
||||
|
||||
-- The above copyright notice and this permission notice shall be included in all
|
||||
-- copies or substantial portions of the Software.
|
||||
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
-- SOFTWARE.
|
||||
|
||||
AddCSLuaFile("cl_init.lua")
|
||||
AddCSLuaFile("shared.lua")
|
||||
include("shared.lua")
|
||||
|
||||
function SWEP:DropMag()
|
||||
net.Start("TFA_HL2R_DropMag")
|
||||
net.WriteEntity(self)
|
||||
|
||||
if sp then
|
||||
net.Broadcast()
|
||||
else
|
||||
net.SendOmit(self:GetOwner())
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,34 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
-- Copyright (c) 2018-2020 TFA Base Devs
|
||||
|
||||
-- Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
-- of this software and associated documentation files (the "Software"), to deal
|
||||
-- in the Software without restriction, including without limitation the rights
|
||||
-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
-- copies of the Software, and to permit persons to whom the Software is
|
||||
-- furnished to do so, subject to the following conditions:
|
||||
|
||||
-- The above copyright notice and this permission notice shall be included in all
|
||||
-- copies or substantial portions of the Software.
|
||||
|
||||
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
-- SOFTWARE.
|
||||
|
||||
SWEP.Gun = ("tfa_hl2r_base")
|
||||
SWEP.Category = "TFA N7"
|
||||
SWEP.Author = ""
|
||||
SWEP.Base = "tfa_gun_base"
|
||||
@@ -0,0 +1,52 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if SERVER then return end
|
||||
|
||||
surface.CreateFont("TitleFont",
|
||||
{
|
||||
font = "HalfLife2",
|
||||
size = 300,
|
||||
weight = 550,
|
||||
blursize = 1,
|
||||
scanlines = 5,
|
||||
symbol = false,
|
||||
antialias = true,
|
||||
additive = true
|
||||
})
|
||||
|
||||
surface.CreateFont("GunFont",
|
||||
{
|
||||
font = "RealBeta's Weapon Icons",
|
||||
size = 300,
|
||||
weight = 550,
|
||||
blursize = 1,
|
||||
scanlines = 5,
|
||||
symbol = false,
|
||||
antialias = true,
|
||||
additive = true
|
||||
})
|
||||
|
||||
function SWEP:DrawWeaponSelection( x, y, wide, tall, alpha )
|
||||
|
||||
// Set us up the texture
|
||||
surface.SetDrawColor( color_transparent )
|
||||
surface.SetTextColor( 255, 220, 0, alpha )
|
||||
surface.SetFont( self.WepSelectFont )
|
||||
local w, h = surface.GetTextSize( self.WepSelectLetter )
|
||||
|
||||
// Draw that mother
|
||||
surface.SetTextPos( x + ( wide / 2 ) - ( w / 2 ),
|
||||
y + ( tall / 2 ) - ( h / 2 ) )
|
||||
surface.DrawText( self.WepSelectLetter )
|
||||
|
||||
end
|
||||
@@ -0,0 +1,345 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("fonts.lua")
|
||||
|
||||
SWEP.WepSelectFont = "TitleFont"
|
||||
SWEP.WepSelectLetter = "k"
|
||||
|
||||
-- Variables that are used on both client and server
|
||||
SWEP.Gun = ("tfa_mmod_grenade") -- must be the name of your swep but NO CAPITALS!
|
||||
if (GetConVar(SWEP.Gun.."_allowed")) != nil then
|
||||
if not (GetConVar(SWEP.Gun.."_allowed"):GetBool()) then SWEP.Base = "tfa_blacklisted" SWEP.PrintName = SWEP.Gun return end
|
||||
end
|
||||
|
||||
-- SWEP Bases Variables
|
||||
GRENADE_TIMER = 2.5 //Seconds
|
||||
|
||||
GRENADE_PAUSED_NO = 0
|
||||
GRENADE_PAUSED_PRIMARY = 1
|
||||
GRENADE_PAUSED_SECONDARY = 2
|
||||
|
||||
GRENADE_DAMAGE_RADIUS = 250.0
|
||||
|
||||
SWEP.FiresUnderwater = true
|
||||
SWEP.Category = "TFA MMOD"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "GRENADE" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 4 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 40 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 2 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "grenade" -- how others view you carrying the weapon
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and ar2 make for good sniper rifles
|
||||
|
||||
SWEP.ViewModelFOV = 55
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModel = "models/weapons/c_grenade.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/items/grenadeammo.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_nade_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
SWEP.DisableIdleAnimations = false
|
||||
|
||||
SWEP.ProceduralHoslterEnabled = true
|
||||
SWEP.ProceduralHolsterTime = 0.0
|
||||
SWEP.ProceduralHolsterPos = Vector(0, 0, 0)
|
||||
SWEP.ProceduralHolsterAng = Vector(0, 0, 0)
|
||||
|
||||
SWEP.Primary.RPM = 120 -- This is in Rounds Per Minute
|
||||
SWEP.Primary.ClipSize = 1 -- Size of a clip
|
||||
SWEP.Primary.DefaultClip = 1 -- Bullets you start with
|
||||
SWEP.Primary.Automatic = false -- Automatic = true; Semi Auto = false
|
||||
SWEP.Primary.Ammo = "Grenade"
|
||||
-- pistol, 357, smg1, ar2, buckshot, slam, SniperPenetratedRound, AirboatGun
|
||||
-- Pistol, buckshot, and slam always ricochet. Use AirboatGun for a metal peircing shotgun slug
|
||||
|
||||
SWEP.Primary.Round = ("mmod_frag") --NAME OF ENTITY GOES HERE
|
||||
|
||||
SWEP.Velocity = 1200 -- Entity Velocity
|
||||
SWEP.Velocity_Underhand = 350 -- Entity Velocity
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1
|
||||
}
|
||||
|
||||
SWEP.SprintAnimation = {
|
||||
["loop"] = {
|
||||
["type"] = TFA.Enum.ANIMATION_SEQ, --Sequence or act
|
||||
["value"] = "sprint", --Number for act, String/Number for sequence
|
||||
["is_idle"] = true
|
||||
}
|
||||
}
|
||||
|
||||
SWEP.WalkAnimation = {
|
||||
["loop"] = {
|
||||
["type"] = TFA.Enum.ANIMATION_SEQ, --Sequence or act
|
||||
["value"] = "walk", --Number for act, String/Number for sequence
|
||||
["is_idle"] = true
|
||||
},
|
||||
}
|
||||
|
||||
SWEP.AllowViewAttachment = true --Allow the view to sway based on weapon attachment while reloading or drawing, IF THE CLIENT HAS IT ENABLED IN THEIR CONVARS.
|
||||
SWEP.Sprint_Mode = TFA.Enum.LOCOMOTION_ANI -- ANI = mdl, HYBRID = ani + lua, Lua = lua only
|
||||
SWEP.Sights_Mode = TFA.Enum.LOCOMOTION_LUA -- ANI = mdl, HYBRID = lua but continue idle, Lua = stop mdl animation
|
||||
SWEP.Walk_Mode = TFA.Enum.LOCOMOTION_ANI -- ANI = mdl, HYBRID = ani + lua, Lua = lua only
|
||||
SWEP.Idle_Mode = TFA.Enum.IDLE_BOTH --TFA.Enum.IDLE_DISABLED = no idle, TFA.Enum.IDLE_LUA = lua idle, TFA.Enum.IDLE_ANI = mdl idle, TFA.Enum.IDLE_BOTH = TFA.Enum.IDLE_ANI + TFA.Enum.IDLE_LUA
|
||||
SWEP.Idle_Blend = 0 --Start an idle this far early into the end of a transition
|
||||
SWEP.Idle_Smooth = 0 --Start an idle this far early into the end of another animation
|
||||
SWEP.SprintBobMult = 0
|
||||
|
||||
DEFINE_BASECLASS (SWEP.Base)
|
||||
|
||||
function SWEP:ChooseShootAnim()
|
||||
if not self:OwnerIsValid() then return end
|
||||
|
||||
self.Owner:SetAnimation(PLAYER_ATTACK1)
|
||||
--self:ResetEvents()
|
||||
local mybool = self:GetNW2Bool("Underhanded", false)
|
||||
local tanim = mybool and ACT_VM_SECONDARYATTACK or ACT_VM_THROW or ACT_VM_HAULBACK
|
||||
if not self.SequenceEnabled[ACT_VM_SECONDARYATTACK] then
|
||||
tanim = ACT_VM_THROW
|
||||
end
|
||||
local success = true
|
||||
self:SendViewModelAnim(tanim)
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce", tanim)
|
||||
end
|
||||
|
||||
self.lastact = tanim
|
||||
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:ChoosePullAnim()
|
||||
if not self:OwnerIsValid() then return end
|
||||
|
||||
if self.Callback.ChoosePullAnim then
|
||||
self.Callback.ChoosePullAnim(self)
|
||||
end
|
||||
|
||||
self:GetOwner():SetAnimation(PLAYER_RELOAD)
|
||||
--self:ResetEvents()
|
||||
local tanim = ACT_VM_PULLPIN
|
||||
local success = true
|
||||
local bool = self:GetNW2Bool("Underhanded", false)
|
||||
|
||||
if not bool then
|
||||
tanim = ACT_VM_PULLBACK_LOW
|
||||
else
|
||||
tanim = ACT_VM_PULLPIN
|
||||
end
|
||||
|
||||
if game.SinglePlayer() then
|
||||
self:CallOnClient("AnimForce", tanim)
|
||||
end
|
||||
|
||||
self:SendViewModelAnim(tanim)
|
||||
|
||||
self.lastact = tanim
|
||||
|
||||
return success, tanim
|
||||
end
|
||||
|
||||
function SWEP:Throw()
|
||||
local pOwner = self.Owner;
|
||||
if self:Clip1() > 0 then
|
||||
local bool = self:GetNW2Bool("Underhanded", false)
|
||||
local own = self:GetOwner()
|
||||
|
||||
if not bool then
|
||||
self:ThrowGrenade( pOwner )
|
||||
elseif self.Owner:KeyDown( IN_DUCK ) and bool then
|
||||
self:RollGrenade( pOwner );
|
||||
else
|
||||
self:LobGrenade( pOwner );
|
||||
end
|
||||
end
|
||||
|
||||
self:TakePrimaryAmmo(1)
|
||||
self:DoAmmoCheck()
|
||||
end
|
||||
|
||||
-- NEW FUNCTIONS
|
||||
|
||||
// check a throw from vecSrc. If not valid, move the position back along the line to vecEye
|
||||
function SWEP:CheckThrowPosition( pPlayer, vecEye, vecSrc )
|
||||
|
||||
local tr;
|
||||
|
||||
tr = {}
|
||||
tr.start = vecEye
|
||||
tr.endpos = vecSrc
|
||||
tr.mins = -Vector(4.0+2,4.0+2,4.0+2)
|
||||
tr.maxs = Vector(4.0+2,4.0+2,4.0+2)
|
||||
tr.mask = MASK_PLAYERSOLID
|
||||
tr.filter = pPlayer
|
||||
tr.collision = pPlayer:GetCollisionGroup()
|
||||
local trace = util.TraceHull( tr );
|
||||
|
||||
if ( trace.Hit ) then
|
||||
vecSrc = tr.endpos;
|
||||
end
|
||||
|
||||
return vecSrc
|
||||
|
||||
end
|
||||
|
||||
function SWEP:ThrowGrenade( pPlayer )
|
||||
|
||||
if ( !CLIENT ) then
|
||||
local vecEye = pPlayer:EyePos();
|
||||
local vecShoot = pPlayer:GetShootPos();
|
||||
local vForward, vRight;
|
||||
|
||||
vForward = pPlayer:EyeAngles():Forward();
|
||||
vRight = pPlayer:EyeAngles():Right();
|
||||
local vecSrc = vecEye + vForward * 18.0 + vRight * 8.0;
|
||||
vecSrc = self:CheckThrowPosition( pPlayer, vecEye, vecSrc );
|
||||
// vForward.x = vForward.x + 0.1;
|
||||
// vForward.y = vForward.y + 0.1;
|
||||
|
||||
local vecThrow;
|
||||
vecThrow = pPlayer:GetVelocity();
|
||||
vecThrow = vecThrow + vForward * 1200;
|
||||
local pGrenade = ents.Create( self.Primary.Round );
|
||||
pGrenade:SetPos( vecSrc );
|
||||
pGrenade:SetAngles( Angle(0,0,0) );
|
||||
pGrenade:SetOwner( pPlayer );
|
||||
pGrenade:Fire( "SetTimer", GRENADE_TIMER );
|
||||
pGrenade:Spawn()
|
||||
pGrenade:GetPhysicsObject():SetVelocity( vecThrow );
|
||||
pGrenade:GetPhysicsObject():AddAngleVelocity( Vector(600,math.random(-1200,1200),0) );
|
||||
|
||||
if ( pGrenade ) then
|
||||
if ( pPlayer && !pPlayer:Alive() ) then
|
||||
vecThrow = pPlayer:GetVelocity();
|
||||
|
||||
local pPhysicsObject = pGrenade:GetPhysicsObject();
|
||||
if ( pPhysicsObject ) then
|
||||
vecThrow = pPhysicsObject:SetVelocity();
|
||||
end
|
||||
end
|
||||
|
||||
pGrenade.m_flDamage = self.Primary.Damage;
|
||||
pGrenade.m_DmgRadius = GRENADE_DAMAGE_RADIUS;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:LobGrenade( pPlayer )
|
||||
|
||||
if ( !CLIENT ) then
|
||||
local vecEye = pPlayer:EyePos();
|
||||
local vForward, vRight;
|
||||
local vecShoot = pPlayer:GetShootPos()
|
||||
|
||||
vForward = pPlayer:EyeAngles():Forward();
|
||||
vRight = pPlayer:EyeAngles():Right();
|
||||
local vecSrc = vecEye + vForward * 18.0 + vRight * 8.0 + Vector( 0, 0, -8 );
|
||||
vecSrc = self:CheckThrowPosition( pPlayer, vecEye, vecSrc );
|
||||
|
||||
local vecThrow;
|
||||
vecThrow = pPlayer:GetVelocity();
|
||||
vecThrow = vecThrow + vForward * 350 + Vector( 0, 0, 50 );
|
||||
local pGrenade = ents.Create( self.Primary.Round );
|
||||
pGrenade:SetPos( vecSrc );
|
||||
pGrenade:SetAngles( Angle(0,0,0) );
|
||||
pGrenade:SetOwner( pPlayer );
|
||||
pGrenade:Fire( "SetTimer", GRENADE_TIMER );
|
||||
pGrenade:Spawn()
|
||||
pGrenade:GetPhysicsObject():SetVelocity( vecThrow );
|
||||
pGrenade:GetPhysicsObject():AddAngleVelocity( Vector(200,math.random(-600,600),0) );
|
||||
|
||||
if ( pGrenade ) then
|
||||
pGrenade.m_flDamage = self.Primary.Damage;
|
||||
pGrenade.m_DmgRadius = GRENADE_DAMAGE_RADIUS;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:RollGrenade( pPlayer )
|
||||
|
||||
if ( !CLIENT ) then
|
||||
// BUGBUG: Hardcoded grenade width of 4 - better not change the model :)
|
||||
local vecSrc;
|
||||
vecSrc = pPlayer:GetPos();
|
||||
vecSrc.z = vecSrc.z + 4.0;
|
||||
|
||||
local vecFacing = pPlayer:GetAimVector( );
|
||||
// no up/down direction
|
||||
vecFacing.z = 0;
|
||||
vecFacing = VectorNormalize( vecFacing );
|
||||
local tr;
|
||||
tr = {};
|
||||
tr.start = vecSrc;
|
||||
tr.endpos = vecSrc - Vector(0,0,16);
|
||||
tr.mask = MASK_PLAYERSOLID;
|
||||
tr.filter = pPlayer;
|
||||
tr.collision = COLLISION_GROUP_NONE;
|
||||
tr = util.TraceLine( tr );
|
||||
if ( tr.Fraction != 1.0 ) then
|
||||
// compute forward vec parallel to floor plane and roll grenade along that
|
||||
local tangent;
|
||||
tangent = CrossProduct( vecFacing, tr.HitNormal );
|
||||
vecFacing = CrossProduct( tr.HitNormal, tangent );
|
||||
end
|
||||
vecSrc = vecSrc + (vecFacing * 18.0);
|
||||
vecSrc = self:CheckThrowPosition( pPlayer, pPlayer:GetPos(), vecSrc );
|
||||
|
||||
local vecThrow;
|
||||
vecThrow = pPlayer:GetVelocity();
|
||||
vecThrow = vecThrow + vecFacing * 700;
|
||||
// put it on its side
|
||||
local orientation = Angle(0,pPlayer:GetLocalAngles().y,-90);
|
||||
// roll it
|
||||
local rotSpeed = Vector(0,0,720);
|
||||
local pGrenade = ents.Create( self.Primary.Round );
|
||||
pGrenade:SetPos( vecSrc );
|
||||
pGrenade:SetAngles( orientation );
|
||||
pGrenade:SetOwner( pPlayer );
|
||||
pGrenade:Fire( "SetTimer", GRENADE_TIMER );
|
||||
pGrenade:Spawn();
|
||||
pGrenade:GetPhysicsObject():SetVelocity( vecThrow );
|
||||
pGrenade:GetPhysicsObject():AddAngleVelocity( rotSpeed );
|
||||
|
||||
if ( pGrenade ) then
|
||||
pGrenade.m_flDamage = self.Primary.Damage;
|
||||
pGrenade.m_DmgRadius = GRENADE_DAMAGE_RADIUS;
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
// player "shoot" animation
|
||||
pPlayer:SetAnimation( PLAYER_ATTACK1 );
|
||||
|
||||
end
|
||||
@@ -0,0 +1,52 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile()
|
||||
|
||||
if SERVER then return end
|
||||
|
||||
surface.CreateFont("TitleFont",
|
||||
{
|
||||
font = "HalfLife2",
|
||||
size = 300,
|
||||
weight = 550,
|
||||
blursize = 1,
|
||||
scanlines = 5,
|
||||
symbol = false,
|
||||
antialias = true,
|
||||
additive = true
|
||||
})
|
||||
|
||||
surface.CreateFont("GunFont",
|
||||
{
|
||||
font = "RealBeta's Weapon Icons",
|
||||
size = 300,
|
||||
weight = 550,
|
||||
blursize = 1,
|
||||
scanlines = 5,
|
||||
symbol = false,
|
||||
antialias = true,
|
||||
additive = true
|
||||
})
|
||||
|
||||
function SWEP:DrawWeaponSelection( x, y, wide, tall, alpha )
|
||||
|
||||
// Set us up the texture
|
||||
surface.SetDrawColor( color_transparent )
|
||||
surface.SetTextColor( 255, 220, 0, alpha )
|
||||
surface.SetFont( self.WepSelectFont )
|
||||
local w, h = surface.GetTextSize( self.WepSelectLetter )
|
||||
|
||||
// Draw that mother
|
||||
surface.SetTextPos( x + ( wide / 2 ) - ( w / 2 ),
|
||||
y + ( tall / 2 ) - ( h / 2 ) )
|
||||
surface.DrawText( self.WepSelectLetter )
|
||||
|
||||
end
|
||||
@@ -0,0 +1,203 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include("fonts.lua")
|
||||
|
||||
SWEP.WepSelectFont = "TitleFont"
|
||||
SWEP.WepSelectLetter = "n"
|
||||
|
||||
SWEP.Category = "TFA MMOD"
|
||||
SWEP.Author = ""
|
||||
SWEP.Contact = ""
|
||||
SWEP.Purpose = ""
|
||||
SWEP.Instructions = ""
|
||||
SWEP.PrintName = "STUNSTICK\n(CIVIL PROTECTION MELEE ISSUE)" -- Weapon name (Shown on HUD)
|
||||
SWEP.Slot = 0 -- Slot in the weapon selection menu
|
||||
SWEP.SlotPos = 27 -- Position in the slot
|
||||
SWEP.DrawAmmo = true -- Should draw the default HL2 ammo counter
|
||||
SWEP.DrawWeaponInfoBox = false -- Should draw the weapon info box
|
||||
SWEP.BounceWeaponIcon = false -- Should the weapon icon bounce?
|
||||
SWEP.DrawCrosshair = false -- set false if you want no crosshair
|
||||
SWEP.Weight = 35 -- rank relative ot other weapons. bigger is better
|
||||
SWEP.AutoSwitchTo = true -- Auto switch to if we pick it up
|
||||
SWEP.AutoSwitchFrom = true -- Auto switch from if you pick up a better weapon
|
||||
SWEP.HoldType = "melee" -- how others view you carrying the weapon
|
||||
SWEP.Primary.Sound = Sound("TFA_MMOD.StunStick.1")
|
||||
SWEP.KnifeShink = "TFA_MMOD.StunStick.HitWall" --Sounds
|
||||
SWEP.KnifeSlash = "TFA_MMOD.StunStick.Hit" --Sounds
|
||||
SWEP.KnifeStab = "TFA_MMOD.StunStick.Hit" --Sounds
|
||||
SWEP.Primary.Delay = 0.0 --Delay for hull (primary)
|
||||
SWEP.Secondary.Delay = 0.0 --Delay for hull (secondary)
|
||||
SWEP.Primary.RPM = 100
|
||||
SWEP.Primary.ClipSize = -1
|
||||
SWEP.Primary.DefaultClip = -1
|
||||
SWEP.Primary.Ammo = nil
|
||||
SWEP.DamageType = DMG_CLUB
|
||||
|
||||
|
||||
function SWEP:ThrowKnife()
|
||||
return false
|
||||
end
|
||||
|
||||
SWEP.IsMelee = true
|
||||
|
||||
SWEP.VMPos = Vector(1,-1,-1)
|
||||
SWEP.VMAng = Vector(0, 0, 0)
|
||||
|
||||
-- normal melee melee2 fist knife smg ar2 pistol rpg physgun grenade shotgun crossbow slam passive
|
||||
-- you're mostly going to use ar2, smg, shotgun or pistol. rpg and crossbow make for good sniper rifles
|
||||
|
||||
SWEP.SlashTable = {"misscenter1", "misscenter2"} --Table of possible hull sequences
|
||||
SWEP.StabTable = {"hitcenter1", "hitcenter2", "hitcenter3"} --Table of possible hull sequences
|
||||
SWEP.StabMissTable = {"misscenter1", "misscenter2"} --Table of possible hull sequences
|
||||
|
||||
SWEP.Primary.Length = 50
|
||||
SWEP.Secondary.Length = 55
|
||||
|
||||
SWEP.Primary.Damage = 35
|
||||
SWEP.Secondary.Damage = 55
|
||||
|
||||
SWEP.ViewModelFlip = false
|
||||
SWEP.ViewModelFOV = 54
|
||||
SWEP.ViewModel = "models/weapons/tfa_mmod/c_stunstick.mdl" -- Weapon view model
|
||||
SWEP.WorldModel = "models/weapons/w_stunbaton.mdl" -- Weapon world model
|
||||
SWEP.ShowWorldModel = true
|
||||
SWEP.Base = "tfa_knife_base"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.UseHands = true
|
||||
SWEP.AdminSpawnable = true
|
||||
SWEP.FiresUnderwater = true
|
||||
|
||||
SWEP.SprintAnimation = {
|
||||
["loop"] = {
|
||||
["type"] = TFA.Enum.ANIMATION_SEQ, --Sequence or act
|
||||
["value"] = "sprint", --Number for act, String/Number for sequence
|
||||
["is_idle"] = true
|
||||
},
|
||||
}
|
||||
|
||||
SWEP.WalkAnimation = {
|
||||
["loop"] = {
|
||||
["type"] = TFA.Enum.ANIMATION_SEQ, --Sequence or act
|
||||
["value"] = "walk", --Number for act, String/Number for sequence
|
||||
["is_idle"] = true
|
||||
},
|
||||
}
|
||||
|
||||
SWEP.AllowViewAttachment = true --Allow the view to sway based on weapon attachment while reloading or drawing, IF THE CLIENT HAS IT ENABLED IN THEIR CONVARS.
|
||||
SWEP.Sprint_Mode = TFA.Enum.LOCOMOTION_ANI -- ANI = mdl, HYBRID = ani + lua, Lua = lua only
|
||||
SWEP.Sights_Mode = TFA.Enum.LOCOMOTION_ANI -- ANI = mdl, HYBRID = lua but continue idle, Lua = stop mdl animation
|
||||
SWEP.Walk_Mode = TFA.Enum.LOCOMOTION_ANI -- ANI = mdl, HYBRID = ani + lua, Lua = lua only
|
||||
SWEP.Idle_Mode = TFA.Enum.IDLE_BOTH --TFA.Enum.IDLE_DISABLED = no idle, TFA.Enum.IDLE_LUA = lua idle, TFA.Enum.IDLE_ANI = mdl idle, TFA.Enum.IDLE_BOTH = TFA.Enum.IDLE_ANI + TFA.Enum.IDLE_LUA
|
||||
SWEP.Idle_Blend = 0 --Start an idle this far early into the end of a transition
|
||||
SWEP.Idle_Smooth = 0 --Start an idle this far early into the end of another animation
|
||||
SWEP.SprintBobMult = 0
|
||||
|
||||
DEFINE_BASECLASS ( SWEP.Base )
|
||||
|
||||
local tracedata = {}
|
||||
|
||||
function SWEP:DoImpactEffect(tr, dmgtype)
|
||||
if tr.HitSky then return true end
|
||||
local ib = self.BashBase and IsValid(self) and self:GetBashing()
|
||||
local dmginfo = DamageInfo()
|
||||
dmginfo:SetDamageType(dmgtype)
|
||||
|
||||
if ib and self.Secondary.BashDamageType == DMG_GENERIC then return true end
|
||||
if ib then return end
|
||||
|
||||
if self.ImpactDecal and self.ImpactDecal ~= "" then
|
||||
util.Decal(self.ImpactDecal, tr.HitPos + tr.HitNormal, tr.HitPos - tr.HitNormal)
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack()
|
||||
if not self:CanAttack() then return end
|
||||
|
||||
local ow, gsp, ea, fw, tr
|
||||
|
||||
ow = self:GetOwner()
|
||||
gsp = ow:GetShootPos()
|
||||
ea = ow:EyeAngles()
|
||||
fw = ea:Forward()
|
||||
tracedata.start = gsp
|
||||
tracedata.endpos = gsp + fw * self.Primary.Length
|
||||
tracedata.filter = ow
|
||||
|
||||
tr = self:GetSlashTrace(tracedata, fw)
|
||||
|
||||
if self:GetNextPrimaryFire() < CurTime() and self:GetOwner():IsPlayer() and not self:GetOwner():KeyDown(IN_RELOAD) then
|
||||
self.SlashCounter = self.SlashCounter + 1
|
||||
|
||||
if self.SlashCounter > #self.SlashTable then
|
||||
self.SlashCounter = 1
|
||||
end
|
||||
|
||||
if tr.Hit then
|
||||
self:SendViewModelSeq(self.StabTable[self.SlashCounter])
|
||||
else
|
||||
self:SendViewModelSeq(self.SlashTable[self.SlashCounter])
|
||||
end
|
||||
|
||||
self:GetOwner():SetAnimation(PLAYER_ATTACK1)
|
||||
self:SetNextPrimaryFire(CurTime() + 1 / (self.Primary.RPM / 60))
|
||||
self:SetNextSecondaryFire(CurTime() + 1 / (self.Primary.RPM / 60))
|
||||
self:SetStatus(TFA.Enum.STATUS_RELOADING)
|
||||
self:SetStatusEnd(CurTime() + self.Primary.Delay)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:SecondaryAttack()
|
||||
return false
|
||||
end
|
||||
|
||||
function SWEP:SmackEffect(tr)
|
||||
local vSrc = tr.StartPos
|
||||
local bFirstTimePredicted = IsFirstTimePredicted()
|
||||
local bHitWater = bit.band(util.PointContents(vSrc), MASK_WATER) ~= 0
|
||||
local bEndNotWater = bit.band(util.PointContents(tr.HitPos), MASK_WATER) == 0
|
||||
|
||||
local trSplash = bHitWater and bEndNotWater and util.TraceLine({
|
||||
start = tr.HitPos,
|
||||
endpos = vSrc,
|
||||
mask = MASK_WATER
|
||||
}) or not (bHitWater or bEndNotWater) and util.TraceLine({
|
||||
start = vSrc,
|
||||
endpos = tr.HitPos,
|
||||
mask = MASK_WATER
|
||||
})
|
||||
|
||||
if (trSplash and bFirstTimePredicted) then
|
||||
local data = EffectData()
|
||||
data:SetOrigin(trSplash.HitPos)
|
||||
data:SetScale(1)
|
||||
|
||||
if (bit.band(util.PointContents(trSplash.HitPos), CONTENTS_SLIME) ~= 0) then
|
||||
data:SetFlags(1) --FX_WATER_IN_SLIME
|
||||
end
|
||||
|
||||
util.Effect("watersplash", data)
|
||||
end
|
||||
|
||||
self:DoImpactEffect(tr, self.DamageType)
|
||||
|
||||
if (tr.Hit and bFirstTimePredicted and not trSplash) then
|
||||
local data = EffectData()
|
||||
data:SetOrigin(tr.HitPos)
|
||||
data:SetStart(vSrc)
|
||||
data:SetSurfaceProp(tr.SurfaceProps)
|
||||
data:SetDamageType(self.DamageType)
|
||||
data:SetHitBox(tr.HitBox)
|
||||
data:SetEntity(tr.Entity)
|
||||
util.Effect("Impact", data)
|
||||
util.Effect("StunstickImpact", data)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,11 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
@@ -0,0 +1,14 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
|
||||
include('shared.lua')
|
||||
@@ -0,0 +1,49 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
DEFINE_BASECLASS("tfa_bash_base")
|
||||
|
||||
SWEP.Slot = 2
|
||||
SWEP.SlotPos = 73
|
||||
|
||||
SWEP.LuaShellEject = true
|
||||
|
||||
SWEP.ForceDryFireOff = false --Disables dryfire. Set to false to enable them.
|
||||
SWEP.DisableIdleAnimations = true --Disables idle animations. Set to false to enable them.
|
||||
SWEP.ForceEmptyFireOff = false --Disables empty fire animations. Set to false to enable them.
|
||||
|
||||
SWEP.Secondary.BashSound = Sound("Weapon_Crowbar.Shove")
|
||||
SWEP.Secondary.BashDelay = 0.05
|
||||
SWEP.ViewModelFOV = 50
|
||||
SWEP.UseHands = true
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) }
|
||||
}
|
||||
|
||||
SWEP.KF2StyleShotgun = false --Allow empty reloads for shotguns?
|
||||
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -3,
|
||||
Right = 1,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -2,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.1
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 0.9
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed * 0.8
|
||||
@@ -0,0 +1,59 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Baseball Bat"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_bat_metal.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_bat_metal.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -4.7,
|
||||
Right = 1,
|
||||
Forward = 0.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = ""--Sound("Weapon_Melee.HatchetLight")
|
||||
SWEP.Secondary.Sound = ""--Sound("Weapon_Melee.FireaxeHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.9
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(4.84, 1.424, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.RPM = 50
|
||||
SWEP.Primary.Damage = 70
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Middle04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-8.212, 1.121, 1.263) },
|
||||
["Pinky05"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(11.793, 4.677, 11.218) }
|
||||
}
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Secondary.Blunt = true
|
||||
@@ -0,0 +1,79 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.AnimSequences = {
|
||||
attack_quick = "Attack_Quick_1",
|
||||
attack_quick2 = "Attack_Quick_2",
|
||||
charge_begin = "Attack_Charge_Begin",
|
||||
charge_loop = "Attack_Charge_Idle",
|
||||
charge_end = "Attack_Charge_End"
|
||||
}
|
||||
|
||||
SWEP.PrintName = "Claw Hammer"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_tool_barricade.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_tool_barricade.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -5,
|
||||
Right = 2,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.HammerSwing")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.HammerSwing")
|
||||
|
||||
SWEP.MoveSpeed = 0.95
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(15.069, -15.437, 5.85)
|
||||
SWEP.InspectAng = Vector(30.03, 43.618, 40.874)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Reach = 65
|
||||
SWEP.Primary.RPM = 80
|
||||
SWEP.Primary.SoundDelay = 0.1
|
||||
SWEP.Primary.Delay = 0.25
|
||||
SWEP.Primary.Damage = 60
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 45 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 65
|
||||
SWEP.Secondary.SoundDelay = 0.05
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
|
||||
SWEP.Secondary.BashDamage = 24
|
||||
SWEP.Secondary.BashDelay = 0.1
|
||||
SWEP.Secondary.BashLength = 54
|
||||
SWEP.Secondary.BashDamageType = DMG_CLUB
|
||||
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Maglite"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, -30), angle = Angle(0, 0, 0) }
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Cleaver"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_cleaver.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_cleaver.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 0,
|
||||
Right = 0.5,
|
||||
Forward = -0.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.2
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.HatchetLight")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.HatchetHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.975
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(3.874, -13.436, 3.969)
|
||||
SWEP.InspectAng = Vector(-7.27, 41.632, 4.92)
|
||||
|
||||
SWEP.Primary.Blunt = false
|
||||
SWEP.Primary.Damage = 60
|
||||
SWEP.Primary.Reach = 40
|
||||
SWEP.Primary.RPM = 100
|
||||
SWEP.Primary.SoundDelay = 0.15
|
||||
SWEP.Primary.Delay = 0.3
|
||||
SWEP.Primary.Window = 0.2
|
||||
|
||||
SWEP.Secondary.Blunt = false
|
||||
SWEP.Secondary.RPM = 80 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 45
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.3
|
||||
|
||||
SWEP.Secondary.BashDamage = 20
|
||||
SWEP.Secondary.BashDelay = 0.2
|
||||
SWEP.Secondary.BashLength = 50
|
||||
@@ -0,0 +1,64 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Crowbar"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_crowbar.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_crowbar.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -6,
|
||||
Right = 1.5,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.CrowbarLight")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.CrowbarHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.975
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(-3.086, -6.5, 7.236)
|
||||
SWEP.InspectAng = Vector(-8.443, 11.651, 12.725)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Damage = 50
|
||||
SWEP.Primary.Reach = 60
|
||||
SWEP.Primary.RPM = 100
|
||||
SWEP.Primary.SoundDelay = 0.15
|
||||
SWEP.Primary.Delay = 0.3
|
||||
SWEP.Primary.Window = 0.2
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 60 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 80
|
||||
SWEP.Secondary.Reach = 60
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.3
|
||||
|
||||
SWEP.Secondary.BashDamage = 50
|
||||
SWEP.Secondary.BashDelay = 0.35
|
||||
SWEP.Secondary.BashLength = 50
|
||||
@@ -0,0 +1,56 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Fire Axe"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_axe_fire.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_axe_fire.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -6,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -4,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = ""--Sound("Weapon_Melee.HatchetLight")
|
||||
SWEP.Secondary.Sound = ""--Sound("Weapon_Melee.FireaxeHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.9
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(5.5, 1.424, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.RPM = 50
|
||||
SWEP.Primary.Damage = 70
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Middle04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-8.212, 1.121, 1.263) },
|
||||
["Pinky05"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(11.793, 4.677, 11.218) }
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Fubar"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_fubar.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_fubar.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -2,
|
||||
Right = 0.5,
|
||||
Forward = 0.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 0.9
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(5.3, 1.7, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Damage = 100
|
||||
SWEP.Primary.Reach = 90
|
||||
SWEP.Primary.RPM = 40
|
||||
SWEP.Primary.SoundDelay = 0.3
|
||||
SWEP.Primary.Delay = 0.5
|
||||
SWEP.Primary.Window = 0.3
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 40 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 200
|
||||
SWEP.Secondary.Reach = 100
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.4
|
||||
|
||||
SWEP.Secondary.BashDamage = 50
|
||||
SWEP.Secondary.BashDelay = 0.4
|
||||
SWEP.Secondary.BashLength = 70
|
||||
@@ -0,0 +1,77 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.AnimSequences = {
|
||||
attack_quick = "Attack_Quick",
|
||||
attack_quick2 = "Attack_Quick2",
|
||||
charge_begin = "Attack_Charge_Begin",
|
||||
charge_loop = "Attack_Charge_Idle",
|
||||
charge_end = "Attack_Charge_End"
|
||||
}
|
||||
|
||||
SWEP.PrintName = "Hatchet"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_hatchet.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_hatchet.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -5,
|
||||
Right = 2,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = ""--Sound("Weapon_Melee.HatchetLight")
|
||||
SWEP.Secondary.Sound = ""--Sound("Weapon_Melee.HatchetHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.975
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(15.069, -15.437, 5.85)
|
||||
SWEP.InspectAng = Vector(30.03, 43.618, 40.874)
|
||||
|
||||
SWEP.Primary.Reach = 65
|
||||
SWEP.Primary.RPM = 80
|
||||
SWEP.Primary.SoundDelay = 0.1
|
||||
SWEP.Primary.Delay = 0.25
|
||||
SWEP.Primary.Damage = 60
|
||||
|
||||
SWEP.Secondary.RPM = 45 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 65
|
||||
SWEP.Secondary.SoundDelay = 0.05
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
|
||||
SWEP.Secondary.BashDamage = 24
|
||||
SWEP.Secondary.BashDelay = 0.1
|
||||
SWEP.Secondary.BashLength = 54
|
||||
SWEP.Secondary.BashDamageType = DMG_CLUB
|
||||
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Maglite"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, -30), angle = Angle(0, 0, 0) }
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Kit Knife"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_kitknife.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_kitknife.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "knife"
|
||||
SWEP.DefaultHoldType = "knife"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -1,
|
||||
Right = 1,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.3
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_KitKnife.SwingLight")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_KitKnife.SwingHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 1.0
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(9.649, -18.091, 0.6)
|
||||
SWEP.InspectAng = Vector(26.03, 61.206, 28.141)
|
||||
|
||||
SWEP.Primary.Reach = 40
|
||||
SWEP.Primary.RPM = 85
|
||||
SWEP.Primary.SoundDelay = 0.1
|
||||
SWEP.Primary.Delay = 0.25
|
||||
SWEP.Primary.Damage = 60
|
||||
|
||||
SWEP.Secondary.RPM = 60 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 90
|
||||
SWEP.Secondary.Reach = 40
|
||||
SWEP.Secondary.SoundDelay = 0.05
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
|
||||
SWEP.Secondary.BashDamage = 20
|
||||
SWEP.Secondary.BashDelay = 0.1
|
||||
SWEP.Secondary.BashLength = 54
|
||||
SWEP.Secondary.BashDamageType = DMG_GENERIC
|
||||
SWEP.Secondary.BashHitSound = ""
|
||||
@@ -0,0 +1,71 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Lead Pipe"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_pipe_lead.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_pipe_lead.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -5,
|
||||
Right = 2,
|
||||
Forward = 3.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = ""--Sound("Weapon_Melee.PipeLeadLight")
|
||||
SWEP.Secondary.Sound = ""--Sound("Weapon_Melee.PipeLeadHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.97
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(-3.418, -6.433, 8.241)
|
||||
SWEP.InspectAng = Vector(-9.146, 9.145, 17.709)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Damage = 55
|
||||
SWEP.Primary.Reach = 60
|
||||
SWEP.Primary.RPM = 90
|
||||
SWEP.Primary.SoundDelay = 0
|
||||
SWEP.Primary.Delay = 0.3
|
||||
SWEP.Primary.Window = 0.2
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 60 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 85
|
||||
SWEP.Secondary.Reach = 60
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.3
|
||||
|
||||
SWEP.Secondary.BashDamage = 50
|
||||
SWEP.Secondary.BashDelay = 0.35
|
||||
SWEP.Secondary.BashLength = 50
|
||||
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Maglite"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, -30), angle = Angle(0, 0, 0) }
|
||||
}
|
||||
@@ -0,0 +1,63 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Machete"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_machete.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_machete.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee"
|
||||
SWEP.DefaultHoldType = "melee"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -10,
|
||||
Right = 2,
|
||||
Forward = 4.0,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.MacheteLight")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.MacheteHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.975
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(15.069, -7.437, 10.85)
|
||||
SWEP.InspectAng = Vector(26.03, 43.618, 54.874)
|
||||
|
||||
SWEP.Primary.Reach = 60
|
||||
SWEP.Primary.RPM = 80
|
||||
SWEP.Primary.SoundDelay = 0.1
|
||||
SWEP.Primary.Delay = 0.25
|
||||
SWEP.Primary.Damage = 60
|
||||
|
||||
SWEP.Secondary.RPM = 45 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 55
|
||||
SWEP.Secondary.SoundDelay = 0.05
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
|
||||
SWEP.Secondary.BashDamage = 15
|
||||
SWEP.Secondary.BashDelay = 0.1
|
||||
SWEP.Secondary.BashLength = 54
|
||||
SWEP.Secondary.BashDamageType = DMG_GENERIC
|
||||
SWEP.Secondary.BashHitSound = ""
|
||||
@@ -0,0 +1,45 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Pickaxe"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_pickaxe.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_pickaxe.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -4.7,
|
||||
Right = 1,
|
||||
Forward = 0.5,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 0.95
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(4.84, 1.424, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.Damage = 65
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
@@ -0,0 +1,61 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Sledgehammer"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_sledge.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_sledge.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -2,
|
||||
Right = 0.75,
|
||||
Forward = 4.0,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 8,
|
||||
Forward = 185
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.MoveSpeed = 0.85
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(5.3, 1.7, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Damage = 100
|
||||
SWEP.Primary.Reach = 85
|
||||
SWEP.Primary.RPM = 40
|
||||
SWEP.Primary.SoundDelay = 0.3
|
||||
SWEP.Primary.Delay = 0.475
|
||||
SWEP.Primary.Window = 0.3
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 40 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 160
|
||||
SWEP.Secondary.Reach = 90
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.4
|
||||
|
||||
SWEP.Secondary.BashDamage = 25
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
SWEP.Secondary.BashLength = 70
|
||||
@@ -0,0 +1,72 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Spade"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_spade.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_spade.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "melee2"
|
||||
SWEP.DefaultHoldType = "melee2"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = -6,
|
||||
Right = 1,
|
||||
Forward = 3,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = -4,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = ""--Sound("Weapon_Melee.HatchetLight")
|
||||
SWEP.Secondary.Sound = ""--Sound("Weapon_Melee.FireaxeHeavy")
|
||||
|
||||
SWEP.MoveSpeed = 0.925
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(5.5, 1.424, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.Primary.RPM = 70
|
||||
SWEP.Primary.Damage = 60
|
||||
SWEP.Primary.Reach = 70
|
||||
SWEP.Primary.Delay = 0.5
|
||||
SWEP.Primary.Blunt = true
|
||||
|
||||
SWEP.Secondary.RPM = 80
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 70
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
SWEP.Secondary.Blunt = true
|
||||
|
||||
SWEP.Secondary.BashDamage = 40
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
SWEP.Secondary.BashLength = 80
|
||||
SWEP.Secondary.BashDamageType = DMG_CLUB
|
||||
|
||||
|
||||
SWEP.Secondary.BashDelay = 0.3
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
["Middle04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(-8.212, 1.121, 1.263) },
|
||||
["Pinky05"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(11.793, 4.677, 11.218) }
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
SWEP.Base = "tfa_nmrimelee_base"
|
||||
SWEP.Category = "Willard Melee Weapons"
|
||||
SWEP.Spawnable = true
|
||||
SWEP.AdminSpawnable = true
|
||||
|
||||
SWEP.PrintName = "Pipe Wrench"
|
||||
|
||||
SWEP.ViewModel = "models/weapons/tfa_nmrih/v_me_wrench.mdl" --Viewmodel path
|
||||
SWEP.ViewModelFOV = 50
|
||||
|
||||
SWEP.WorldModel = "models/weapons/tfa_nmrih/w_me_wrench.mdl" --Viewmodel path
|
||||
SWEP.HoldType = "knife"
|
||||
SWEP.DefaultHoldType = "knife"
|
||||
SWEP.Offset = { --Procedural world model animation, defaulted for CS:S purposes.
|
||||
Pos = {
|
||||
Up = 2,
|
||||
Right = 2,
|
||||
Forward = 0,
|
||||
},
|
||||
Ang = {
|
||||
Up = -1,
|
||||
Right = 5,
|
||||
Forward = 178
|
||||
},
|
||||
Scale = 1.0
|
||||
}
|
||||
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.Wrench")
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.Wrench")
|
||||
|
||||
SWEP.MoveSpeed = 0.97
|
||||
SWEP.IronSightsMoveSpeed = SWEP.MoveSpeed
|
||||
|
||||
SWEP.InspectPos = Vector(-2.5, -12.58, 1.769)
|
||||
SWEP.InspectAng = Vector(-6.19, 26.36, -4.468)
|
||||
|
||||
SWEP.Primary.Blunt = true
|
||||
SWEP.Primary.Damage = 65
|
||||
SWEP.Primary.Reach = 60
|
||||
SWEP.Primary.RPM = 60
|
||||
SWEP.Primary.SoundDelay = 0.2
|
||||
SWEP.Primary.Delay = 0.4
|
||||
SWEP.Primary.Window = 0.2
|
||||
|
||||
SWEP.Secondary.Blunt = true
|
||||
SWEP.Secondary.RPM = 60 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 100
|
||||
SWEP.Secondary.Reach = 60
|
||||
SWEP.Secondary.SoundDelay = 0.1
|
||||
SWEP.Secondary.Delay = 0.3
|
||||
|
||||
SWEP.Secondary.BashDamage = 50
|
||||
SWEP.Secondary.BashDelay = 0.35
|
||||
SWEP.Secondary.BashLength = 50
|
||||
|
||||
SWEP.ViewModelBoneMods = {
|
||||
["ValveBiped.Bip01_R_Finger1"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0.254, 0.09), angle = Angle(15.968, -11.193, 1.437) },
|
||||
["ValveBiped.Bip01_R_Finger0"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(3.552, 4.526, 0) },
|
||||
["Thumb04"] = { scale = Vector(1, 1, 1), pos = Vector(0, 0, 0), angle = Angle(6, 0, 0) },
|
||||
-- ["Maglite"] = { scale = Vector(0.009, 0.009, 0.009), pos = Vector(0, 0, -30), angle = Angle(0, 0, 0) }
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
include('shared.lua')
|
||||
@@ -0,0 +1,14 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
AddCSLuaFile( "cl_init.lua" )
|
||||
AddCSLuaFile( "shared.lua" )
|
||||
|
||||
include('shared.lua')
|
||||
@@ -0,0 +1,598 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
DEFINE_BASECLASS("tfa_bash_base")
|
||||
|
||||
SWEP.Type = "Melee"
|
||||
|
||||
SWEP.LuaShellEject = false
|
||||
|
||||
SWEP.Primary.Blunt = false
|
||||
SWEP.Primary.Damage = 60
|
||||
SWEP.Primary.Reach = 75
|
||||
SWEP.Primary.RPM = 60
|
||||
SWEP.Primary.SoundDelay = 0.2
|
||||
SWEP.Primary.Delay = 0.35
|
||||
SWEP.Primary.Window = 0.3
|
||||
|
||||
SWEP.Secondary.Blunt = false
|
||||
SWEP.Secondary.RPM = 45 -- Delay = 60/RPM, this is only AFTER you release your heavy attack
|
||||
SWEP.Secondary.Damage = 120
|
||||
SWEP.Secondary.Reach = 70
|
||||
SWEP.Secondary.SoundDelay = 0.05
|
||||
SWEP.Secondary.Delay = 0.25
|
||||
|
||||
SWEP.Secondary.BashDamage = 25
|
||||
SWEP.Secondary.BashDelay = 0.2
|
||||
SWEP.Secondary.BashLength = 65
|
||||
SWEP.Secondary.BashDamageType = DMG_CLUB
|
||||
|
||||
SWEP.DisableChambering = true
|
||||
SWEP.Primary.Motorized = false
|
||||
SWEP.Primary.Motorized_ToggleBuffer = 0.1 --Blend time to idle when toggling
|
||||
SWEP.Primary.Motorized_ToggleTime = 1.5 --Time until we turn on/off, independent of the above
|
||||
SWEP.Primary.Motorized_IdleSound = Sound("Weapon_Chainsaw.IdleLoop") --Idle sound, when on
|
||||
SWEP.Primary.Motorized_SawSound = Sound("Weapon_Chainsaw.SawLoop") --Rev sound, when on
|
||||
SWEP.Primary.Motorized_AmmoConsumption_Idle = 100/120 --Ammo units to consume while idle
|
||||
SWEP.Primary.Motorized_AmmoConsumption_Saw = 100/15 --Ammo units to consume while sawing
|
||||
SWEP.Primary.Motorized_RPM = 600
|
||||
SWEP.Primary.Motorized_Damage = 100 --DPS
|
||||
SWEP.Primary.Motorized_Reach = 60 --DPS
|
||||
|
||||
SWEP.Slot = 0
|
||||
SWEP.DrawCrosshair = false
|
||||
|
||||
SWEP.AnimSequences = {
|
||||
attack_quick = "Attack_Quick",
|
||||
--attack_quick2 = "Attack_Quick2",
|
||||
charge_begin = "Attack_Charge_Begin",
|
||||
charge_loop = "Attack_Charge_Idle",
|
||||
charge_end = "Attack_Charge_End",
|
||||
turn_on = "TurnOn",
|
||||
turn_off = "TurnOff",
|
||||
idle_on = "IdleOn",
|
||||
attack_enter = "Idle_To_Attack",
|
||||
attack_loop = "Attack_On",
|
||||
attack_exit = "Attack_To_Idle"
|
||||
}
|
||||
|
||||
SWEP.Primary.Ammo = ""
|
||||
SWEP.Primary.ClipSize = -1
|
||||
SWEP.Primary.Sound = Sound("Weapon_Melee.FireaxeLight")
|
||||
SWEP.Primary.HitSound_Flesh = {
|
||||
sharp = "Weapon_Melee_Sharp.Impact_Light",
|
||||
blunt = "Weapon_Melee_Blunt.Impact_Light"
|
||||
}
|
||||
SWEP.Primary.HitSound = {
|
||||
sharp = {
|
||||
[MAT_CONCRETE] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_DIRT] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_GRASS] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SNOW] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SAND] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_METAL] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_VENT] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_CLIP] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_COMPUTER] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_WOOD] = Sound("Weapon_Melee.Impact_Wood"),
|
||||
[MAT_WARPSHIELD] = "",
|
||||
[MAT_DEFAULT] = ""
|
||||
},
|
||||
blunt = {
|
||||
[MAT_CONCRETE] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_DIRT] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_GRASS] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SNOW] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SAND] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_METAL] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_VENT] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_CLIP] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_COMPUTER] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_WOOD] = Sound("Weapon_Melee.Impact_Wood"),
|
||||
[MAT_WARPSHIELD] = "",
|
||||
[MAT_DEFAULT] = ""
|
||||
}
|
||||
}
|
||||
|
||||
SWEP.Secondary.Sound = Sound("Weapon_Melee.FireaxeHeavy")
|
||||
SWEP.Secondary.HitSound_Flesh = {
|
||||
sharp = "Weapon_Melee_Sharp.Impact_Heavy",
|
||||
blunt = "Weapon_Melee_Blunt.Impact_Heavy"
|
||||
}
|
||||
SWEP.Secondary.HitSound = {
|
||||
sharp = {
|
||||
[MAT_CONCRETE] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_DIRT] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_GRASS] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SNOW] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SAND] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_METAL] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_VENT] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_CLIP] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_COMPUTER] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_WOOD] = Sound("Weapon_Melee.Impact_Wood"),
|
||||
[MAT_WARPSHIELD] = "",
|
||||
[MAT_DEFAULT] = ""
|
||||
},
|
||||
blunt = {
|
||||
[MAT_CONCRETE] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_DIRT] = Sound("Weapon_Melee.Impact_Concrete"),
|
||||
[MAT_GRASS] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SNOW] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_SAND] = Sound("Weapon_Melee.Impact_Generic"),
|
||||
[MAT_METAL] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_VENT] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_CLIP] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_COMPUTER] = Sound("Weapon_Melee.Impact_Metal"),
|
||||
[MAT_WOOD] = Sound("Weapon_Melee.Impact_Wood"),
|
||||
[MAT_WARPSHIELD] = "",
|
||||
[MAT_DEFAULT] = ""
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
SWEP.InspectPos = Vector(4.84, 1.424, -3.131)
|
||||
SWEP.InspectAng = Vector(17.086, 3.938, 14.836)
|
||||
|
||||
SWEP.IronSightsPos = Vector()
|
||||
SWEP.IronSightsAng = Vector()
|
||||
|
||||
SWEP.Secondary.IronFOV = 90
|
||||
|
||||
SWEP.Sights_Mode = TFA.Enum.LOCOMOTION_LUA -- ANI = mdl, Hybrid = stop mdl animation, Lua = hybrid but continue idle
|
||||
SWEP.Sprint_Mode = TFA.Enum.LOCOMOTION_LUA -- ANI = mdl, Hybrid = ani + lua, Lua = lua only
|
||||
SWEP.Idle_Mode = TFA.Enum.IDLE_BOTH
|
||||
|
||||
SWEP.RunSightsPos = Vector(0,0,0)
|
||||
SWEP.RunSightsAng = Vector(0,0,0)
|
||||
|
||||
SWEP.data = {}
|
||||
SWEP.data.ironsights = 0
|
||||
|
||||
SWEP.IsKnife = true
|
||||
|
||||
DEFINE_BASECLASS("tfa_bash_base")
|
||||
|
||||
SWEP.TFA_NMRIH_MELEE = true
|
||||
|
||||
SWEP.UseHands = true
|
||||
|
||||
|
||||
|
||||
SWEP.NextSwingSoundTime = -1
|
||||
SWEP.NextSwingTime = -1
|
||||
|
||||
local stat
|
||||
|
||||
function SWEP:Deploy()
|
||||
BaseClass.Deploy(self)
|
||||
if not self:OwnerIsValid() then return true end
|
||||
self.Owner.LastNMRIMSwing = nil
|
||||
self.Owner.HasTFANMRIMSwing = false
|
||||
return true
|
||||
end
|
||||
|
||||
function SWEP:Holster( ... )
|
||||
if not self:OwnerIsValid() then return true end
|
||||
self.Owner.LastNMRIMSwing = nil
|
||||
self.Owner.HasTFANMRIMSwing = false
|
||||
self:StopSound( self.Primary.Motorized_SawSound )
|
||||
self:StopSound( self.Primary.Motorized_IdleSound )
|
||||
return BaseClass.Holster( self, ... )
|
||||
end
|
||||
|
||||
local IdleStatus = {
|
||||
[ TFA.GetStatus("NMRIH_MELEE_CHARGE_LOOP") ] = true,
|
||||
[ TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP") ] = true,
|
||||
[ TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") ] = true
|
||||
}
|
||||
|
||||
local OnStatus = {
|
||||
[ TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP") ] = true,
|
||||
[ TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") ] = true
|
||||
}
|
||||
|
||||
local TYPE_PRIMARY = 0
|
||||
local TYPE_SECONDARY = 1
|
||||
local TYPE_MOTORIZED = 2
|
||||
|
||||
SWEP.AmmoDrainDelta = 0
|
||||
|
||||
function SWEP:Think2()
|
||||
if not self:OwnerIsValid() then return end
|
||||
stat = self:GetStatus()
|
||||
if self.Primary.Motorized then
|
||||
--[[
|
||||
if stat == TFA.GetStatus("bashing") and self.GetBashing and self:GetBashing() and CurTime() >= self:GetStatusEnd() and self.reqon then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP")
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( math.huge )
|
||||
self:ChooseIdleAnim()
|
||||
self:PlayIdleSound( false )
|
||||
self:CompleteReload()
|
||||
end
|
||||
]]--
|
||||
if OnStatus[stat] then
|
||||
if SERVER then
|
||||
self.AmmoDrainDelta = self.AmmoDrainDelta + ( self.Owner:KeyDown(IN_ATTACK) and self.Primary.Motorized_AmmoConsumption_Saw or self.Primary.Motorized_AmmoConsumption_Idle ) * TFA.FrameTime()
|
||||
while self.AmmoDrainDelta > 0 do
|
||||
self.AmmoDrainDelta = self.AmmoDrainDelta - 1
|
||||
self:TakePrimaryAmmo(1)
|
||||
end
|
||||
end
|
||||
if self:Clip1() <= 0 then
|
||||
self:TurnOff()
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") and CurTime() > self:GetNextPrimaryFire() then
|
||||
local ft = 60 / self.Primary.Motorized_RPM
|
||||
self:HitThing( self.Primary.Motorized_Damage * ft, self.Primary.Motorized_Damage * 0.2 * ft, self.Primary.Motorized_Reach, false, TYPE_MOTORIZED )
|
||||
self:SetNextPrimaryFire( CurTime() + ft )
|
||||
end
|
||||
end
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_START") and CurTime() > self:GetStatusEnd() then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP")
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( math.huge )
|
||||
self:ChooseIdleAnim()
|
||||
self:PlayIdleSound( false )
|
||||
self:CompleteReload()
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP") and self.Owner:KeyDown(IN_ATTACK) then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK")
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( math.huge )
|
||||
self:SendViewModelSeq(self.AnimSequences.attack_enter)
|
||||
self:StopSound(self.Primary.Motorized_IdleSound)
|
||||
self.HasPlayedSound[ "idle" ] = false
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") and not self.Owner:KeyDown(IN_ATTACK) then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP")
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( math.huge )
|
||||
self:SendViewModelSeq(self.AnimSequences.attack_exit)
|
||||
self:StopSound(self.Primary.Motorized_SawSound)
|
||||
self.HasPlayedSound[ "saw" ] = false
|
||||
end
|
||||
end
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_CHARGE_START") and CurTime() > self:GetStatusEnd() then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_CHARGE_LOOP")
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( math.huge )
|
||||
self:ChooseIdleAnim()
|
||||
end
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_CHARGE_LOOP") and not self.Owner:KeyDown(IN_ATTACK) then
|
||||
stat = TFA.GetStatus("NMRIH_MELEE_CHARGE_END")
|
||||
self:SwingThirdPerson()
|
||||
self:SendViewModelSeq(self.AnimSequences.charge_end)
|
||||
self:SetStatus( stat )
|
||||
self:SetStatusEnd( CurTime() + self.OwnerViewModel:SequenceDuration() - 0.3 )
|
||||
self.Owner.HasTFANMRIMSwing = false
|
||||
self.Owner.LastNMRIMSwing = nil
|
||||
end
|
||||
BaseClass.Think2(self)
|
||||
|
||||
if game.SinglePlayer() and CLIENT then return end
|
||||
|
||||
self:HandleDelayedAttack( stat )
|
||||
if IdleStatus[stat] and CurTime() > self:GetNextIdleAnim() then
|
||||
self:ChooseIdleAnim()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Reload()
|
||||
if not self.Primary.Motorized then return end
|
||||
if not self.Owner:KeyPressed(IN_RELOAD) then return end
|
||||
stat = self:GetStatus()
|
||||
if stat == TFA.GetStatus("IDLE") and ( self:Clip1() > 0 or self:Ammo1() > 0 ) then
|
||||
self.reqon = true
|
||||
self:SendViewModelSeq(self.AnimSequences.turn_on)
|
||||
self:SetStatus( TFA.GetStatus("NMRIH_MELEE_MOTOR_START") )
|
||||
self:SetStatusEnd( CurTime() + self.OwnerViewModel:SequenceDuration() - 0.1 )
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP") then
|
||||
self:TurnOff()
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:TurnOff()
|
||||
self:SendViewModelSeq(self.AnimSequences.turn_off)
|
||||
self:SetStatus( TFA.GetStatus("NMRIH_MELEE_MOTOR_END") )
|
||||
self:SetStatusEnd( CurTime() + self.OwnerViewModel:SequenceDuration() - 0.1 )
|
||||
self:StopSound( self.Primary.Motorized_SawSound )
|
||||
self:StopSound( self.Primary.Motorized_IdleSound )
|
||||
self.reqon = false
|
||||
end
|
||||
|
||||
SWEP.wassw_old = false
|
||||
SWEP.wassw_hard_old = false
|
||||
|
||||
function SWEP:HandleDelayedAttack( statv )
|
||||
stat = statv
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_SWING") then
|
||||
if self.wassw_old == false then
|
||||
self.NextSwingTime = CurTime() + self.Primary.Delay
|
||||
self.NextSwingSoundTime = CurTime() + self.Primary.SoundDelay
|
||||
end
|
||||
if self.NextSwingTime > 0 and CurTime() > self.NextSwingTime then
|
||||
self:HitThing( self.Primary.Damage, self.Primary.Damage * 0.2, self.Primary.Reach, self.Primary.Blunt, TYPE_PRIMARY )
|
||||
self.NextSwingTime = -1
|
||||
|
||||
if (SERVER and self.Owner:IsPlayer() and self.Owner.GetCharacter and self.Owner:GetCharacter()) then
|
||||
self.Owner:GetCharacter():DoAction("melee_slash")
|
||||
end
|
||||
end
|
||||
if self.NextSwingSoundTime > 0 and CurTime() > self.NextSwingSoundTime then
|
||||
self:EmitSound(self.Primary.Sound)
|
||||
self.NextSwingSoundTime = -1
|
||||
end
|
||||
self.wassw_old = true
|
||||
else
|
||||
self.wassw_old = false
|
||||
end
|
||||
|
||||
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_CHARGE_END") then
|
||||
if self.wassw_hard_old == false then
|
||||
self.NextSwingTime_Hard = CurTime() + self.Secondary.Delay
|
||||
self.NextSwingSoundTime_Hard = CurTime() + self.Secondary.SoundDelay
|
||||
end
|
||||
if self.NextSwingTime_Hard > 0 and CurTime() > self.NextSwingTime_Hard then
|
||||
self:HitThing( self.Secondary.Damage, self.Secondary.Damage * 0.2, self.Secondary.Reach, self.Secondary.Blunt, TYPE_SECONDARY )
|
||||
self.NextSwingTime_Hard = -1
|
||||
|
||||
if (SERVER and self.Owner:IsPlayer() and self.Owner.GetCharacter and self.Owner:GetCharacter()) then
|
||||
self.Owner:GetCharacter():DoAction("melee_slash_heavy")
|
||||
end
|
||||
end
|
||||
if self.NextSwingSoundTime_Hard > 0 and CurTime() > self.NextSwingSoundTime_Hard then
|
||||
self:EmitSound(self.Secondary.Sound)
|
||||
|
||||
if self.Owner.Vox then
|
||||
self.Owner:Vox("bash", 4)
|
||||
end
|
||||
|
||||
self.NextSwingSoundTime_Hard = -1
|
||||
end
|
||||
self.wassw_hard_old = true
|
||||
else
|
||||
self.wassw_hard_old = false
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:PrimaryAttack( release, docharge )
|
||||
self:VMIV()
|
||||
if (release) then
|
||||
if (not docharge) then
|
||||
self:Swing()
|
||||
else
|
||||
self:StartCharge()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:Swing()
|
||||
if (!self:VMIV()) then return end
|
||||
if (hook.Run("CanDoMeleeAttack", self) == false) then
|
||||
return
|
||||
end
|
||||
|
||||
math.randomseed(CurTime() - 1)
|
||||
if (self.AnimSequences.attack_quick2 and math.random(0,1) == 0) then
|
||||
self:SendViewModelSeq(self.AnimSequences.attack_quick2)
|
||||
else
|
||||
self:SendViewModelSeq(self.AnimSequences.attack_quick)
|
||||
end
|
||||
self:SwingThirdPerson()
|
||||
self:SetStatus(TFA.GetStatus("NMRIH_MELEE_SWING"))
|
||||
self:SetStatusEnd(CurTime() + 60 / self.Primary.RPM)
|
||||
self.NeedsHit = true
|
||||
end
|
||||
|
||||
function SWEP:StartCharge()
|
||||
if (hook.Run("CanDoHeavyMeleeAttack", self) == false) then
|
||||
self.Owner.HasTFANMRIMSwing = false
|
||||
self.Owner.LastNMRIMSwing = nil
|
||||
return
|
||||
end
|
||||
|
||||
self:SendViewModelSeq(self.AnimSequences.charge_begin)
|
||||
self:SetStatus( TFA.GetStatus("NMRIH_MELEE_CHARGE_START") )
|
||||
self:SetStatusEnd( CurTime() + self.OwnerViewModel:SequenceDuration() - 0.1 )
|
||||
end
|
||||
|
||||
local pos,ang,hull
|
||||
hull = {}
|
||||
|
||||
function SWEP:HitThing( damage, force, reach, blunt, sndtype )
|
||||
if not self:OwnerIsValid() then return end
|
||||
pos = self.Owner:GetShootPos()
|
||||
ang = self.Owner:GetAimVector()
|
||||
|
||||
local secondary = false
|
||||
if sndtype == TYPE_SECONDARY then
|
||||
if (hook.Run("CanDoHeavyMeleeAttack", self) == false) then
|
||||
return
|
||||
end
|
||||
secondary = true
|
||||
elseif sndtype == TYPE_PRIMARY then
|
||||
if (hook.Run("CanDoMeleeAttack", self) == false) then
|
||||
return
|
||||
end
|
||||
end
|
||||
|
||||
self.Owner:LagCompensation(true)
|
||||
|
||||
hull.start = pos
|
||||
hull.endpos = pos + (ang * reach)
|
||||
hull.filter = self.Owner
|
||||
hull.mins = Vector(-5, -5, 0)
|
||||
hull.maxs = Vector(5, 5, 5)
|
||||
local slashtrace = util.TraceHull(hull)
|
||||
|
||||
self.Owner:LagCompensation(false)
|
||||
|
||||
if slashtrace.Hit then
|
||||
if slashtrace.Entity == nil then return end
|
||||
|
||||
if (SERVER and IsValid(slashtrace.Entity) and (slashtrace.Entity:IsPlayer() or slashtrace.Entity:IsNPC())) then
|
||||
if (sndtype == TYPE_SECONDARY) then
|
||||
self.ixAttackType = "heavy"
|
||||
elseif (sndtype == TYPE_PRIMARY) then
|
||||
self.ixAttackType = nil
|
||||
end
|
||||
end
|
||||
|
||||
if game.GetTimeScale() > 0.99 then
|
||||
local srctbl = secondary and self.Secondary or self.Primary
|
||||
if sndtype == TYPE_MOTORIZED then srctbl = nil end
|
||||
self.Owner:FireBullets({
|
||||
Attacker = self.Owner,
|
||||
Inflictor = self,
|
||||
Damage = damage,
|
||||
Force = force,
|
||||
Distance = reach + 10,
|
||||
HullSize = 12.5,
|
||||
Tracer = 0,
|
||||
Src = self.Owner:GetShootPos(),
|
||||
Dir = slashtrace.Normal,
|
||||
Callback = function(a, b, c)
|
||||
if c then
|
||||
if sndtype == TYPE_MOTORIZED then
|
||||
c:SetDamageType( bit.bor( DMG_SLASH,DMG_ALWAYSGIB) )
|
||||
else
|
||||
c:SetDamageType( blunt and DMG_CLUB or DMG_SLASH )
|
||||
end
|
||||
end
|
||||
if srctbl then
|
||||
if b.MatType == MAT_FLESH or b.MatType == MAT_ALIENFLESH then
|
||||
self:EmitSound( srctbl.HitSound_Flesh["sharp"] or srctbl.HitSound_Flesh["blunt"] )
|
||||
else
|
||||
local sndtbl = srctbl.HitSound[ blunt and "blunt" or "sharp" ]
|
||||
local snd = sndtbl[ b.MatType ] or sndtbl[ MAT_DIRT ]
|
||||
self:EmitSound( snd )
|
||||
end
|
||||
end
|
||||
end
|
||||
})
|
||||
else
|
||||
local dmg = DamageInfo()
|
||||
dmg:SetAttacker(self.Owner)
|
||||
dmg:SetInflictor(self)
|
||||
dmg:SetDamagePosition(self.Owner:GetShootPos())
|
||||
dmg:SetDamageForce(self.Owner:GetAimVector() * (damage * 0.25))
|
||||
dmg:SetDamage(damage)
|
||||
if sndtype == TYPE_MOTORIZED then
|
||||
dmg:SetDamageType( bit.bor( DMG_SLASH,DMG_ALWAYSGIB) )
|
||||
else
|
||||
dmg:SetDamageType( blunt and DMG_CLUB or DMG_SLASH )
|
||||
end
|
||||
slashtrace.Entity:TakeDamageInfo(dmg)
|
||||
end
|
||||
|
||||
targ = slashtrace.Entity
|
||||
|
||||
local srctbl = secondary and self.Secondary or self.Primary
|
||||
if sndtype == TYPE_MOTORIZED then sndtbl = nil end
|
||||
if srctbl and game.GetTimeScale() < 0.99 then
|
||||
if slashtrace.MatType == MAT_FLESH or slashtrace.MatType == MAT_ALIENFLESH then
|
||||
self:EmitSound( srctbl.HitSound_Flesh["sharp"] or srctbl.HitSound_Flesh["blunt"] )
|
||||
else
|
||||
local sndtbl = srctbl.HitSound[ blunt and "blunt" or "sharp" ]
|
||||
local snd = sndtbl[ slashtrace.MatType ] or sndtbl[ MAT_DIRT ]
|
||||
self:EmitSound( snd )
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:ChooseIdleAnim()
|
||||
stat = self:GetStatus()
|
||||
if self.Primary.Motorized then
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_LOOP") then
|
||||
self:SendViewModelSeq(self.AnimSequences.idle_on)
|
||||
self:PlayIdleSound( false )
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") then
|
||||
self:SendViewModelSeq(self.AnimSequences.attack_loop)
|
||||
self:PlayIdleSound( true )
|
||||
end
|
||||
return
|
||||
end
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_CHARGE_LOOP") then
|
||||
self:SendViewModelSeq(self.AnimSequences.charge_loop)
|
||||
else
|
||||
BaseClass.ChooseIdleAnim(self)
|
||||
end
|
||||
end
|
||||
|
||||
SWEP.HasPlayedSound = {
|
||||
["idle"] = false,
|
||||
["saw"] = false
|
||||
}
|
||||
|
||||
function SWEP:PlayIdleSound( sawing )
|
||||
if game.SinglePlayer() and CLIENT then return end
|
||||
local sndid = sawing and "saw" or "idle"
|
||||
if sawing and self.HasPlayedSound[ "idle" ] then
|
||||
self:StopSound(self.Primary.Motorized_IdleSound)
|
||||
self.HasPlayedSound[ "idle" ] = false
|
||||
elseif self.HasPlayedSound[ "saw" ] and not sawing then
|
||||
self:StopSound(self.Primary.Motorized_SawSound)
|
||||
self.HasPlayedSound[ "saw" ] = false
|
||||
end
|
||||
if not self.HasPlayedSound[ sndid ] then
|
||||
self.HasPlayedSound[ sndid ] = true
|
||||
self:EmitSound( sawing and self.Primary.Motorized_SawSound or self.Primary.Motorized_IdleSound)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:DoImpactEffect(tr, dmgtype)
|
||||
if not IsValid(self) then return end
|
||||
stat = self:GetStatus()
|
||||
if stat == TFA.GetStatus("NMRIH_MELEE_SWING") then
|
||||
dmgtype = self.Primary.Blunt and DMG_CLUB or DMG_SLASH
|
||||
elseif stat == TFA.GetStatus("NMRIH_MELEE_CHARGE_END") then
|
||||
dmgtype = self.Secondary.Blunt and DMG_CLUB or DMG_SLASH
|
||||
elseif self.Primary.Motorized and not ( self.GetBashing and self:GetBashing() ) then
|
||||
dmgtype = DMG_SLASH
|
||||
end
|
||||
if tr.MatType ~= MAT_FLESH and tr.MatType ~= MAT_ALIENFLESH then
|
||||
self:ImpactEffectFunc( tr.HitPos, tr.HitNormal, tr.MatType )
|
||||
if tr.HitSky then return true end
|
||||
if bit.band(dmgtype,DMG_SLASH) == DMG_SLASH then
|
||||
util.Decal("ManhackCut", tr.HitPos + tr.HitNormal * 4, tr.HitPos - tr.HitNormal)
|
||||
return true
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
function SWEP:SwingThirdPerson()
|
||||
if self.HoldType == "melee" or self.HoldType == "melee2" then
|
||||
self.Owner:SetAnimation(PLAYER_ATTACK1)
|
||||
else
|
||||
self.Owner:AnimRestartGesture(0, ACT_HL2MP_GESTURE_RANGE_ATTACK_MELEE2, true)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:ProcessHoldType( ... )
|
||||
if self.Primary.Motorized and self:GetStatus() == TFA.GetStatus("NMRIH_MELEE_MOTOR_ATTACK") then
|
||||
self:SetHoldType( "ar2" )
|
||||
else
|
||||
BaseClass.ProcessHoldType(self, ...)
|
||||
end
|
||||
end
|
||||
|
||||
function SWEP:AltAttack()
|
||||
return BaseClass.AltAttack(self)
|
||||
end
|
||||
|
||||
local l_CT = CurTime
|
||||
|
||||
function SWEP:AltAttack()
|
||||
BaseClass.AltAttack(self)
|
||||
end
|
||||
@@ -0,0 +1,134 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
ITEM.name = "TFA Weapons"
|
||||
ITEM.base = "base_weapons"
|
||||
ITEM.description = "A Weapon."
|
||||
ITEM.category = "Weapons"
|
||||
ITEM.model = "models/weapons/w_pistol.mdl"
|
||||
ITEM.class = "weapon_pistol"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 2
|
||||
ITEM.isWeapon = true
|
||||
ITEM.isGrenade = false
|
||||
ITEM.weaponCategory = "sidearm"
|
||||
ITEM.useSound = "items/ammo_pickup.wav"
|
||||
|
||||
ITEM.atts = {}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local description = {self.description}
|
||||
return table.concat(description, "")
|
||||
end
|
||||
|
||||
function ITEM:GetBaseInfo()
|
||||
local baseInfo = {}
|
||||
if (self.balanceCat) then
|
||||
baseInfo[#baseInfo + 1] = "Kategoria broni: "
|
||||
baseInfo[#baseInfo + 1] = self.balanceCat
|
||||
if (self.isMelee) then
|
||||
baseInfo[#baseInfo + 1] = " melee"
|
||||
end
|
||||
if (CLIENT) then
|
||||
baseInfo[#baseInfo + 1] = "\nBazowa szansa na trafienie krytyczne: "
|
||||
if (self.isMelee) then
|
||||
baseInfo[#baseInfo + 1] = math.max(math.floor(ix.weapons:GetMeleeWeaponBaseHitChance(LocalPlayer():GetCharacter(), self.class) * ix.weapons:GetWeaponAimPenalty(self.class) * 100), 0)
|
||||
else
|
||||
baseInfo[#baseInfo + 1] = math.floor(ix.weapons:GetWeaponSkillMod(LocalPlayer():GetCharacter(), self.class) * ix.weapons:GetWeaponAimPenalty(self.class) * 100)
|
||||
end
|
||||
baseInfo[#baseInfo + 1] = "%%"
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(baseInfo, "")
|
||||
end
|
||||
|
||||
function ITEM:GetExtendedInfo()
|
||||
local extendedInfo = {}
|
||||
if (self.balanceCat) then
|
||||
if (self.isMelee) then
|
||||
extendedInfo[#extendedInfo + 1] = "Bazowe obrażenia: "
|
||||
extendedInfo[#extendedInfo + 1] = ix.weapons:GetMeleeWeaponBaseDamage(self.class)
|
||||
else
|
||||
extendedInfo[#extendedInfo + 1] = "Bazowe obrażenia: "
|
||||
extendedInfo[#extendedInfo + 1] = ix.weapons:GetWeaponBaseDamage(self.class)
|
||||
|
||||
local min, max, bFlat = ix.weapons:GetWeaponSkillRequired(self.class)
|
||||
if (!bFlat) then
|
||||
extendedInfo[#extendedInfo + 1] = "\nZasięg umiejętności: "
|
||||
extendedInfo[#extendedInfo + 1] = min.."-"..max
|
||||
else
|
||||
extendedInfo[#extendedInfo + 1] = "\nWymagana umiejętność: "
|
||||
extendedInfo[#extendedInfo + 1] = min
|
||||
end
|
||||
|
||||
local minR, effR = ix.weapons:GetWeaponEffectiveRanges(self.class)
|
||||
extendedInfo[#extendedInfo + 1] = "\nMinimalny skuteczny zasięg: "
|
||||
extendedInfo[#extendedInfo + 1] = minR.."m"
|
||||
extendedInfo[#extendedInfo + 1] = "\nMaksymalny skuteczny zasięg: "
|
||||
extendedInfo[#extendedInfo + 1] = effR.."m"
|
||||
|
||||
extendedInfo[#extendedInfo + 1] = "\nStrzały na punkt akcji: "
|
||||
extendedInfo[#extendedInfo + 1] = ix.weapons:GetWeaponNumShots(self.class)
|
||||
extendedInfo[#extendedInfo + 1] = "\nPrzebicie pancerza: "
|
||||
extendedInfo[#extendedInfo + 1] = math.floor(ix.weapons:GetArmorPen(self.class) * 100).."%%"
|
||||
end
|
||||
end
|
||||
|
||||
return table.concat(extendedInfo, "")
|
||||
end
|
||||
|
||||
function ITEM:GetColorAppendix()
|
||||
if self.balanceCat then
|
||||
return {["blue"] = self:GetBaseInfo(), ["red"] = self:GetExtendedInfo()}
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnRegistered()
|
||||
if (self.balanceCat and ix.weapons) then
|
||||
if (self.isMelee) then
|
||||
ix.weapons:RegisterMeleeWeapon(self.class, self.balanceCat)
|
||||
else
|
||||
ix.weapons:RegisterWeapon(self.class, self.balanceCat)
|
||||
end
|
||||
|
||||
ix.weapons:RegisterWeaponExceptions(self.class, self.baseDamage, self.armorPen, self.aimPenalty, self.numShots)
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:OnEquipWeapon(client, weapon)
|
||||
if (self:GetData("BioLocked") or self:GetData("tfa_atts") or !table.IsEmpty(self.atts)) then
|
||||
timer.Simple(0.5, function()
|
||||
weapon:SetNetVar("ixItemAtts", self.atts)
|
||||
|
||||
if (!IsValid(weapon)) then return end
|
||||
weapon:InitAttachments()
|
||||
|
||||
for _, v in pairs(self.atts) do
|
||||
if (self:GetData("tfa_default_atts_uneq", {})[v]) then continue end
|
||||
|
||||
weapon:Attach(v)
|
||||
end
|
||||
|
||||
if (self:GetData("tfa_atts")) then
|
||||
for _, v in pairs(self:GetData("tfa_atts")) do
|
||||
if (istable(v) and v.att) then
|
||||
weapon:Attach(v.att)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if (self:GetData("BioLocked")) then
|
||||
weapon:SetNetVar("BioLocked", true)
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Kij bejsbolowy"
|
||||
ITEM.description = "Śmiało, wyżyj się na czymś."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_bat_metal.mdl"
|
||||
ITEM.class = "tfa_nmrih_bat"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "medium"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.62, 400.03, 0),
|
||||
fov = 0.58
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Młotek pazurowy"
|
||||
ITEM.description = "Zwyczajny młotek do wbijania gwoździ, ale możesz też wbić nim komuś rozum do głowy."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_tool_barricade.mdl"
|
||||
ITEM.class = "tfa_nmrih_bcd"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "light"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 3
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.69, 400, 0),
|
||||
fov = 0.35
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Tasak"
|
||||
ITEM.description = "Tasak to krojenia mięsa."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_cleaver.mdl"
|
||||
ITEM.class = "tfa_nmrih_cleaver"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "light"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 3
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.73, 400.09, 0),
|
||||
fov = 0.35
|
||||
}
|
||||
|
||||
ITEM.maxDurability = 20
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,152 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Łom"
|
||||
ITEM.description = "Hm... Łom. Tylko nie próbuj teraz atakować nim oficerów Civil Protection!"
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_crowbar.mdl"
|
||||
ITEM.class = "tfa_nmrih_crowbar"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "medium"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(25.07, 400.05, 0),
|
||||
fov = 0.58
|
||||
}
|
||||
ITEM.maxDurability = 25
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Set durability", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Siekiera Strażacka"
|
||||
ITEM.description = "Strażacka siekiera do niszczenia drzwi czy ścian kiedy nie ma innej opcji, ewentualnie można użyć jej w samoobronie."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_axe_fire.mdl"
|
||||
ITEM.class = "tfa_nmrih_fireaxe"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "heavy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.94, 400.02, 0),
|
||||
fov = 0.68
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Fubar"
|
||||
ITEM.description = "Duże narzędzie wielofunkcyjne."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_fubar.mdl"
|
||||
ITEM.class = "tfa_nmrih_fubar"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "heavy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.82, 400.04, 0),
|
||||
fov = 0.84
|
||||
}
|
||||
ITEM.maxDurability = 40
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,154 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Toporek"
|
||||
ITEM.description = "Toporek, który idealnie nada się do ścinania drzew... lub ludzi."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_hatchet.mdl"
|
||||
ITEM.class = "tfa_nmrih_hatchet"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "light"
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_hatchet.mdl"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 3
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.97, 400.05, 0),
|
||||
fov = 0.48
|
||||
}
|
||||
|
||||
ITEM.maxDurability = 12
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,154 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Naostrzony nóż kuchenny"
|
||||
ITEM.description = "Naostrzony nóż kuchenny. W porównaniu do tego co jest publicznie dostępne... ten napewno nie jest legalny."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_kitknife.mdl"
|
||||
ITEM.class = "tfa_nmrih_kknife"
|
||||
ITEM.isMelee = true
|
||||
ITEM.baseDamage = 17
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "light"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 2
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(0.77, -5.3, 199.95),
|
||||
ang = Angle(91.56, 278.2, 0),
|
||||
fov = 1.73
|
||||
}
|
||||
|
||||
ITEM.maxDurability = 9
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Rura"
|
||||
ITEM.description = "Rura która może posłużyć za broń."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_pipe_lead.mdl"
|
||||
ITEM.class = "tfa_nmrih_lpipe"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "medium"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(25, 400.02, 0),
|
||||
fov = 0.53
|
||||
}
|
||||
@@ -0,0 +1,153 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Maczeta"
|
||||
ITEM.description = "Ostra maczeta, tylko po co ci ona?"
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_machete.mdl"
|
||||
ITEM.class = "tfa_nmrih_machete"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "medium"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(0, 200, 0),
|
||||
ang = Angle(-0.01, 270.06, 0),
|
||||
fov = 2.51
|
||||
}
|
||||
|
||||
ITEM.maxDurability = 15
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,155 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Kilof"
|
||||
ITEM.description = "Chcesz iść pokopać? Z tym kilofem to napewno ci się uda. Uważaj żeby nie obudzić Antlionów!"
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_pickaxe.mdl"
|
||||
ITEM.class = "tfa_nmrih_pickaxe"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "heavy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.57, 400.01, 0),
|
||||
fov = 0.86
|
||||
}
|
||||
|
||||
ITEM.maxDurability = 20
|
||||
--ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nDurability: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self.player:StripWeapon("tfa_nmrih_pickaxe")
|
||||
self:SetData("equip", false)
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Tarcza Balistyczna"
|
||||
ITEM.description = "Tarcza Balistyczna stworzona na potrzeby Civil Protection."
|
||||
ITEM.model = "models/weapons/tfa_mw2cr/riotshield/w_riotshield.mdl"
|
||||
ITEM.class = "tfa_mw2cr_riotshield"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "heavy"
|
||||
ITEM.width = 2
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.57, 400.01, 0),
|
||||
fov = 0.86
|
||||
}
|
||||
@@ -0,0 +1,152 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Młot wyburzeniowy"
|
||||
ITEM.description = "Ciężki i mocarny. Uważaj żeby nikogo nie uderzyć!"
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_sledge.mdl"
|
||||
ITEM.class = "tfa_nmrih_sledge"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "heavy"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.76, 400, 0),
|
||||
fov = 0.77
|
||||
}
|
||||
ITEM.maxDurability = 50
|
||||
ITEM.isTool = true
|
||||
|
||||
local color_green = Color(100, 255, 100)
|
||||
local color_red = Color(200, 25, 25)
|
||||
|
||||
if (CLIENT) then
|
||||
function ITEM:PaintOver(item, w, h)
|
||||
if (item:GetData("equip")) then
|
||||
surface.SetDrawColor(110, 255, 110, 100)
|
||||
surface.DrawRect(w - 14, h - 20, 8, 8)
|
||||
end
|
||||
local maxDurability = item:GetMaxDurability()
|
||||
local durability = item:GetDurability()
|
||||
local width = w - 8
|
||||
local cellWidth = math.Round(width / maxDurability)
|
||||
local color = ix.util.ColorLerp(1 - durability / maxDurability, color_green, color_red)
|
||||
surface.SetDrawColor(color)
|
||||
|
||||
for i = 0, durability - 1 do
|
||||
surface.DrawRect(5 + i * cellWidth, h - 8, cellWidth - 1, 4)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
ITEM.functions.SetMaxDurability = {
|
||||
name = "Ustaw maks. wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź maks. wartość wytrzymałości", itemTable:GetMaxDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0) then
|
||||
netstream.Start("ixSetToolMaxDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
ITEM.functions.SetDurability = {
|
||||
name = "Ustaw wytrzymałość",
|
||||
icon = "icon16/wrench.png",
|
||||
OnClick = function(itemTable)
|
||||
local client = itemTable.player
|
||||
Derma_StringRequest("Ustaw wytrzymałość", "Wprowadź tutaj wartość wytrzymałości dla tego narzędzia", itemTable:GetDurability(), function(text)
|
||||
local amount = tonumber(text)
|
||||
|
||||
if (amount and amount > 0 and amount <= itemTable:GetMaxDurability()) then
|
||||
netstream.Start("ixSetToolDurability", itemTable:GetID(), math.floor(amount))
|
||||
else
|
||||
client:Notify("Nieprawidłowy numer")
|
||||
end
|
||||
end)
|
||||
end,
|
||||
OnRun = function(itemTable)
|
||||
return false
|
||||
end,
|
||||
OnCanRun = function(itemTable)
|
||||
if (IsValid(itemTable.entity)) then
|
||||
return false
|
||||
end
|
||||
|
||||
if (!CAMI.PlayerHasAccess(itemTable.player, "Helix - Basic Admin Commands")) then
|
||||
return false
|
||||
end
|
||||
|
||||
return true
|
||||
end
|
||||
}
|
||||
|
||||
function ITEM:GetDescription()
|
||||
local maxDurability = self:GetMaxDurability()
|
||||
local durability = self:GetDurability()
|
||||
return self.description .. "\n\nWytrzymałość: " .. durability .. "/" .. maxDurability
|
||||
end
|
||||
|
||||
function ITEM:OnInstanced(index, x, y, item)
|
||||
self:SetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:DamageDurability(amount)
|
||||
self:SetData("durability", math.max(0, self:GetDurability() - 1))
|
||||
|
||||
if (self:GetDurability() == 0) then
|
||||
self:OnBreak()
|
||||
end
|
||||
end
|
||||
|
||||
function ITEM:GetBreakSound()
|
||||
return "weapons/crowbar/crowbar_impact"..math.random(1, 2)..".wav"
|
||||
end
|
||||
|
||||
function ITEM:OnBreak()
|
||||
local breakSound = self:GetBreakSound()
|
||||
|
||||
if (IsValid(self.player)) then
|
||||
self.player:EmitSound(breakSound, 65)
|
||||
elseif (IsValid(self.entity)) then
|
||||
self.entity:EmitSound(breakSound, 65)
|
||||
end
|
||||
|
||||
self:Remove()
|
||||
end
|
||||
|
||||
function ITEM:GetDurability()
|
||||
return self:GetData("durability", self:GetMaxDurability())
|
||||
end
|
||||
|
||||
function ITEM:GetMaxDurability()
|
||||
return self:GetData("maxDurability", self.maxDurability)
|
||||
end
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Szpadel"
|
||||
ITEM.description = "Szpadel do kopania w ziemi. Nic specjalnego."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_spade.mdl"
|
||||
ITEM.class = "tfa_nmrih_spade"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "medium"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 4
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(0, -200, 0),
|
||||
ang = Angle(-0.66, 449.91, 0),
|
||||
fov = 3.36
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
ITEM.name = "Klucz"
|
||||
ITEM.description = "Klucz do przykręcania śrub, można też nim komuś przywalić."
|
||||
ITEM.model = "models/weapons/tfa_nmrih/w_me_wrench.mdl"
|
||||
ITEM.class = "tfa_nmrih_wrench"
|
||||
ITEM.isMelee = true
|
||||
ITEM.weaponCategory = "melee"
|
||||
ITEM.balanceCat = "light"
|
||||
ITEM.width = 1
|
||||
ITEM.height = 3
|
||||
ITEM.iconCam = {
|
||||
pos = Vector(-509.64, -427.61, 310.24),
|
||||
ang = Angle(24.64, 400.03, 0),
|
||||
fov = 0.38
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
ITEM.name = "Granat błyskowy"
|
||||
ITEM.description = "Granat M84 znany także jako 'Flashbang'. Po wybuchu tymczasowo oślepia i ogłusza."
|
||||
ITEM.model = "models/weapons/w_eq_flashbang_dropped.mdl"
|
||||
ITEM.class = "tfa_csgo_flash"
|
||||
ITEM.grenadeEntityClass = "tfa_csgo_thrownflash"
|
||||
ITEM.weaponCategory = "grenade"
|
||||
ITEM.isGrenade = true
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
@@ -0,0 +1,20 @@
|
||||
--[[
|
||||
| This file was obtained through the combined efforts
|
||||
| of Madbluntz & Plymouth Antiquarian Society.
|
||||
|
|
||||
| Credits: lifestorm, Gregory Wayne Rossel JR.,
|
||||
| Maloy, DrPepper10 @ RIP, Atle!
|
||||
|
|
||||
| Visit for more: https://plymouth.thetwilightzone.ru/
|
||||
--]]
|
||||
|
||||
|
||||
ITEM.name = "Granat odłamkowy"
|
||||
ITEM.description = "Granat odłamkowy MK3A2"
|
||||
ITEM.model = "models/items/grenadeammo.mdl"
|
||||
ITEM.class = "tfa_mmod_grenade"
|
||||
ITEM.grenadeEntityClass = "mmod_frag"
|
||||
ITEM.weaponCategory = "grenade"
|
||||
ITEM.isGrenade = true
|
||||
ITEM.width = 1
|
||||
ITEM.height = 1
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user