diff --git a/wadsrc/static/zscript/actors/shared/camera.zs b/wadsrc/static/zscript/actors/shared/camera.zs index 334be382f..8005e7ca3 100644 --- a/wadsrc/static/zscript/actors/shared/camera.zs +++ b/wadsrc/static/zscript/actors/shared/camera.zs @@ -132,6 +132,11 @@ class AimingCamera : SecurityCamera class SpectatorCamera : Actor { + double lagdistance; + bool chasing_tracer; + property lagdistance : lagdistance; + property chasing_tracer : chasing_tracer; + default { +NOBLOCKMAP @@ -140,29 +145,65 @@ class SpectatorCamera : Actor +NOINTERACTION RenderStyle "None"; CameraHeight 0; + SpectatorCamera.chasing_tracer false; + SpectatorCamera.lagdistance 0.0; } void Init(double dist, double yaw, double inpitch, int inflags) { if(((inflags > 0) && (inflags & VPSF_ORTHOGRAPHIC)) || ((inflags < 0) && (ViewPos.Flags & VPSF_ORTHOGRAPHIC))) dist *= 3.0; - SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)-0.5*players[consoleplayer].mo.height), inflags); - // CameraHeight = players[consoleplayer].mo.viewheight; // Not used + + double zshift = 0.0; + if(tracer != NULL) + { + if(player != NULL) zshift = -0.5*tracer.height; + else zshift = 0.5*tracer.height; + } + else if (player != NULL && player.mo != NULL) zshift = -0.5*player.mo.height; + + SetViewPos((-dist*Cos(yaw), -dist*Sin(yaw), dist*Tan(inpitch)+zshift), inflags); LookAtSelf(inpitch); } void LookAtSelf(double inpitch) { - if(ViewPos.Offset != (0., 0., 0.)) - { - Vector3 negviewpos = (-1.0) * ViewPos.Offset; - angle = negviewpos.Angle(); - pitch = inpitch; - } + if(ViewPos.Offset != (0., 0., 0.)) + { + Vector3 negviewpos = (-1.0) * ViewPos.Offset; + angle = negviewpos.Angle(); + pitch = inpitch; + } } override void Tick() { - if(player != NULL) + if(tracer != NULL) + { + Vector3 distvec = tracer.pos - pos; + double dist = distvec.length(); + if((dist <= 4 && chasing_tracer) || lagdistance <= 0.0) // Keep tracer centered on screen + { + SetOrigin(tracer.pos, true); + chasing_tracer = false; + } + else // Lazy follow tracer + { + if(dist >= 2*lagdistance) + { + SetOrigin(tracer.pos, true); + chasing_tracer = false; + } + else if(dist > lagdistance && !chasing_tracer) chasing_tracer = true; + + if(chasing_tracer) + { + speed = tracer.vel.xy.length()/dist; + if(speed == 0.0) speed = tracer.speed/dist; + SetOrigin(pos + 2*distvec*speed, true); + } + } + } + else if(player != NULL && player.mo != NULL) { cameraFOV = player.FOV; SetOrigin(player.mo.pos, true);