Class ModuleHitbox : Actor { Default { Radius 5; Height 4; +SHOOTABLE; +NOGRAVITY; +NOCLIP; +DONTSPLASH; +NOBLOOD; } override int DamageMobj( Actor inflictor, Actor source, int damage, Name mod, int flags, double angle ) { if ( target ) { if ( inflictor ) target.vel += level.Vec3Diff(inflictor.pos,pos).unit()*damage*0.2; else if ( source ) target.vel += level.Vec3Diff(source.pos,pos).unit()*damage*0.2; target.vel.z = 5; } if ( !target || (target.target && ((target.target == source) || target.target.isTeammate(source))) ) return 0; target.bAMBUSH = true; return 0; } override void Tick() { Super.Tick(); if ( !target ) { Destroy(); return; } SetOrigin(target.pos,true); if ( target.bMISSILE ) return; let bi = BlockThingsIterator.Create(self,32); while ( bi.Next() ) { if ( !bi.Thing || (bi.Thing != target.target) ) continue; if ( (Distance2D(bi.Thing)-bi.Thing.radius <= radius) && ((bi.Thing.pos.z <= pos.z+height) && (bi.Thing.pos.z+bi.Thing.height >= pos.z-height)) ) { A_PlaySound("misc/i_pkup"); target.Destroy(); return; } } } States { Spawn: TNT1 A 10 A_AlertMonsters(0,AMF_TARGETEMITTER); Wait; } } Class TranslocatorGlowLight : DynamicLight { Default { DynamicLight.Type "Point"; Args 255,255,255,40; } override void Tick() { Super.Tick(); if ( !target ) { Destroy(); return; } SetOrigin(target.pos,true); } } Class TranslocatorGlow : Actor { override void PostBeginPlay() { Super.PostBeginPlay(); let l = Spawn("TranslocatorGlowLight",pos); l.target = self; l.args[0] = fillcolor.r; l.args[1] = fillcolor.g; l.args[2] = fillcolor.b; } override void Tick() { Super.Tick(); if ( !target ) { Destroy(); return; } SetOrigin(target.Vec3Offset(0,0,10),true); } Default { Radius 0.1; Height 0; +NOCLIP; +NOGRAVITY; +DONTSPLASH; +FORCEXYBILLBOARD; RenderStyle "AddShaded"; StencilColor "FFFFFF"; Scale 0.5; } States { Spawn: TGLO A -1 Bright; Stop; } } Class TranslocatorModule : Actor { Actor b; Default { Radius 2; Height 2; Speed 25; PROJECTILE; -NOGRAVITY; +USEBOUNCESTATE; +SKYEXPLODE; +HITTRACER; +MOVEWITHSECTOR; BounceType "Doom"; BounceFactor 0.5; WallBounceFactor 0.5; } override void PostBeginPlay() { Super.PostBeginPlay(); if ( !target ) { Destroy(); return; } b = Spawn("ModuleHitbox",pos); b.target = self; A_PlaySound("transloc/hum",CHAN_VOICE,0.5,true,2.0); } override bool CanCollideWith( Actor other, bool passive ) { return (other != tracer); } action void A_LightUp() { let l = Spawn("TranslocatorGlow",Vec3Offset(0,0,10)); l.target = self; if ( !target || !target.player ) return; Color gcol; if ( deathmatch && (target.player.GetTeam() < teams.size()) ) gcol = teams[target.player.GetTeam()].mName; else gcol = target.player.GetColor(); // maximize brightness if ( (gcol.r+gcol.g+gcol.b) <= 0 ) gcol = "White"; else { int maxcomp = max(gcol.r,max(gcol.g,gcol.b)); int newr = int(gcol.r*(255./maxcomp)); int newg = int(gcol.g*(255./maxcomp)); int newb = int(gcol.b*(255./maxcomp)); gcol = Color(newr,newg,newb); } l.SetShade(gcol); } override void Tick() { Super.Tick(); if ( bAMBUSH && !Random[Transloc](0,40) ) { A_PlaySound("transloc/spark"); int numpt = Random[Transloc](20,40); for ( int i=0; i