Class RipperAmmo : Ammo { Default { Tag "Razor Blades"; Inventory.PickupMessage "You picked up Razor Blades."; Inventory.Amount 25; Inventory.MaxAmount 75; Ammo.BackpackAmount 50; Ammo.BackpackMaxAmount 150; Ammo.DropAmount 10; } States { Spawn: BHOP A -1; Stop; } } Class Razor2Trail : Actor { Default { RenderStyle "Add"; +NOGRAVITY; +NOCLIP; +DONTSPLASH; +NOTELEPORT; Radius 0.1; Height 0; } override void Tick() { if ( !target || target.InStateSequence(target.CurState,target.ResolveState("Death")) ) { Destroy(); return; } SetOrigin(target.pos,true); A_SetAngle(target.angle,SPF_INTERPOLATE); A_SetPitch(target.pitch,SPF_INTERPOLATE); A_SetRoll(target.roll,SPF_INTERPOLATE); alpha = target.vel.length()/target.speed; } States { Spawn: RAZB A -1 Bright; Stop; } } Class Razor2 : Actor { Default { Radius 2; Height 2; Speed 40; // should be 26 but it looks way too slow DamageFunction (Random[Ripper](30,40)*((DamageType=='Decapitated')?3.5:1.0)); DamageType 'Ripper'; Obituary "%k ripped a chunk of meat out of %o with the Ripper."; BounceType "Doom"; ReactionTime 7; BounceFactor 1.0; WallBounceFactor 1.0; PROJECTILE; +USEBOUNCESTATE; -BOUNCEAUTOOFF; +SKYEXPLODE; +CANBOUNCEWATER; +NODAMAGETHRUST; } override void PostBeginPlay() { Super.PostBeginPlay(); let t = Spawn("Razor2Trail",pos); t.target = self; A_PlaySound("ripper/hum",CHAN_VOICE,1.0,true,3.0); Vector3 dir = vel.unit(); A_SetAngle(atan2(dir.y,dir.x)); A_SetPitch(asin(-dir.z)); } override int SpecialMissileHit( Actor victim ) { if ( pos.z > victim.pos.z+victim.height*0.75 ) DamageType = 'Decapitated'; return -1; } override int DoSpecialDamage( Actor target, int damage, Name damagetype ) { if ( !target.bNOBLOOD ) { target.SpawnBlood(pos,AngleTo(target),damage); A_PlaySound("ripper/flesh"); A_AlertMonsters(); } UTMainHandler.DoKnockback(target,vel.unit(),15000); return damage; } action void A_RazorHit() { A_PlaySound("ripper/hit"); A_AlertMonsters(); A_SprayDecal("WallCrack",-20); int numpt = Random[Ripper](5,10); Vector3 x = (cos(angle)*cos(pitch),sin(angle)*cos(pitch),-sin(pitch)); for ( int i=0; i