X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fwarpzonelib%2Fclient.qc;h=5979c804d2f01e3b52d42f2a653b149376db337d;hp=d084e08084ce854d08b723911a97b63185610937;hb=8b3142364603ea77d9514d20be020370102da9fc;hpb=f536d182b06173bac130d0e77dfcf25833641504 diff --git a/qcsrc/warpzonelib/client.qc b/qcsrc/warpzonelib/client.qc index d084e0808..5979c804d 100644 --- a/qcsrc/warpzonelib/client.qc +++ b/qcsrc/warpzonelib/client.qc @@ -1,6 +1,25 @@ +void WarpZone_Fade_PreDraw() +{ + if(self.warpzone_fadestart) + { + vector org; + org = R_SetView3fv(VF_ORIGIN); + self.alpha = bound(0, (self.warpzone_fadeend - vlen(org - self.origin - 0.5 * (self.mins + self.maxs))) / (self.warpzone_fadeend - self.warpzone_fadestart), 1); + } + else + self.alpha = 1; + //print(sprintf("%v <-> %v\n", view_origin, self.origin + 0.5 * (self.mins + self.maxs))); + if(self.alpha <= 0) + self.drawmask = 0; + else + self.drawmask = MASK_NORMAL; +} + void WarpZone_Read(float isnew) { - ++warpzone_warpzones_exist; + float f; + + warpzone_warpzones_exist = 1; if not(self.enemy) { self.enemy = spawn(); @@ -8,10 +27,16 @@ void WarpZone_Read(float isnew) } self.classname = "trigger_warpzone"; - self.warpzone_isboxy = ReadByte(); - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); + f = ReadByte(); + self.warpzone_isboxy = (f & 1); + if(f & 4) + { + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + } + else + self.origin = '0 0 0'; self.modelindex = ReadShort(); self.mins_x = ReadCoord(); self.mins_y = ReadCoord(); @@ -33,25 +58,48 @@ void WarpZone_Read(float isnew) self.avelocity_y = ReadCoord(); self.avelocity_z = ReadCoord(); + if(f & 2) + { + self.warpzone_fadestart = ReadShort(); + self.warpzone_fadeend = max(self.warpzone_fadestart + 1, ReadShort()); + } + else + { + self.warpzone_fadestart = 0; + self.warpzone_fadeend = 0; + } + // common stuff WarpZone_SetUp(self, self.enemy.oldorigin, self.enemy.avelocity, self.oldorigin, self.avelocity); - // engine currently wants this - self.drawmask = MASK_NORMAL; - // link me //setmodel(self, self.model); setorigin(self, self.origin); setsize(self, self.mins, self.maxs); + + // how to draw + // engine currently wants this + if(self.warpzone_fadestart) + self.predraw = WarpZone_Fade_PreDraw; + else + self.drawmask = MASK_NORMAL; } void WarpZone_Camera_Read(float isnew) { - ++warpzone_cameras_exist; + float f; + warpzone_cameras_exist = 1; self.classname = "func_warpzone_camera"; - self.origin_x = ReadCoord(); - self.origin_y = ReadCoord(); - self.origin_z = ReadCoord(); + + f = ReadByte(); + if(f & 4) + { + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + } + else + self.origin = '0 0 0'; self.modelindex = ReadShort(); self.mins_x = ReadCoord(); self.mins_y = ReadCoord(); @@ -67,6 +115,17 @@ void WarpZone_Camera_Read(float isnew) self.avelocity_y = ReadCoord(); self.avelocity_z = ReadCoord(); + if(f & 2) + { + self.warpzone_fadestart = ReadShort(); + self.warpzone_fadeend = max(self.warpzone_fadestart + 1, ReadShort()); + } + else + { + self.warpzone_fadestart = 0; + self.warpzone_fadeend = 0; + } + // common stuff WarpZone_Camera_SetUp(self, self.oldorigin, self.avelocity); @@ -77,38 +136,60 @@ void WarpZone_Camera_Read(float isnew) //setmodel(self, self.model); setorigin(self, self.origin); setsize(self, self.mins, self.maxs); + + // how to draw + // engine currently wants this + if(self.warpzone_fadestart) + self.predraw = WarpZone_Fade_PreDraw; + else + self.drawmask = MASK_NORMAL; } -float warpzone_fixingview; -float warpzone_fixingview_drawexteriormodel; -//float warpzone_fixingview_sidespeed; -//float warpzone_fixingview_forwardspeed; -void WarpZone_Inside() +void CL_RotateMoves(vector ang) = #638; +void WarpZone_Teleported_Read(float isnew) { - if(warpzone_fixingview) + vector v; + self.classname = "warpzone_teleported"; + v_x = ReadCoord(); + v_y = ReadCoord(); + v_z = ReadCoord(); + if(!isnew) return; - warpzone_fixingview = 1; - warpzone_fixingview_drawexteriormodel = cvar("r_drawexteriormodel"); - //warpzone_fixingview_sidespeed = cvar("cl_sidespeed"); - //warpzone_fixingview_forwardspeed = cvar("cl_forwardspeed"); - cvar_set("r_drawexteriormodel", "0"); - //cvar_set("cl_sidespeed", ftos(warpzone_fixingview_sidespeed / 100)); // just keep a bit of it in case player gets stuck - //cvar_set("cl_forwardspeed", ftos(warpzone_fixingview_forwardspeed / 100)); // just keep a bit of it in case player gets stuck + self.warpzone_transform = v; + R_SetView3fv(VF_CL_VIEWANGLES, WarpZone_TransformVAngles(self, R_SetView3fv(VF_CL_VIEWANGLES))); + if(checkextension("DP_CSQC_ROTATEMOVES")) + CL_RotateMoves(v); + //CL_RotateMoves('0 90 0'); } -void WarpZone_Outside() +float warpzone_fixingview; +float warpzone_fixingview_drawexteriormodel; +float autocvar_chase_active; + +void WarpZone_View_Outside() { if(!warpzone_fixingview) return; warpzone_fixingview = 0; cvar_set("r_drawexteriormodel", ftos(warpzone_fixingview_drawexteriormodel)); - //cvar_set("cl_sidespeed", ftos(warpzone_fixingview_sidespeed)); - //cvar_set("cl_forwardspeed", ftos(warpzone_fixingview_forwardspeed)); +} + +void WarpZone_View_Inside() +{ + if(autocvar_chase_active) + { + WarpZone_View_Outside(); + return; + } + if(warpzone_fixingview) + return; + warpzone_fixingview = 1; + warpzone_fixingview_drawexteriormodel = cvar("r_drawexteriormodel"); + cvar_set("r_drawexteriormodel", "0"); } vector WarpZone_FixNearClip(vector o, vector c0, vector c1, vector c2, vector c3) { - float nearclipdistance; vector mi, ma; entity e; float pd; @@ -139,88 +220,82 @@ vector WarpZone_FixNearClip(vector o, vector c0, vector c1, vector c2, vector c3 return '0 0 0'; } -float warpzone_saved; -vector warpzone_saved_origin; -vector warpzone_saved_angles; -vector warpzone_saved_cl_viewangles; +void WarpZone_FixPMove() +{ + entity e; + e = WarpZone_Find(pmove_org, pmove_org); + if(e) + { + pmove_org = WarpZone_TransformOrigin(e, pmove_org); + input_angles = WarpZone_TransformVAngles(e, input_angles); + } +} + #ifndef KEEP_ROLL var float autocvar_cl_rollkillspeed = 10; #endif void WarpZone_FixView() { - float pd, f; - vector o; entity e; - vector corner0, corner1, corner2, corner3, nearclip; - - warpzone_saved = 0; - warpzone_saved_origin = warpzone_fixview_origin; - warpzone_saved_angles = warpzone_fixview_angles; - warpzone_saved_cl_viewangles = warpzone_fixview_cl_viewangles; - - nearclip = '0 0 1' * (cvar("r_nearclip") * 1.125); - corner0 = cs_unproject('0 0 0' + nearclip); - corner1 = cs_unproject('1 0 0' * cvar("vid_conwidth") + nearclip); - corner2 = cs_unproject('0 1 0' * cvar("vid_conheight") + nearclip); - corner3 = cs_unproject('1 0 0' * cvar("vid_conwidth") + '0 1 0' * cvar("vid_conheight") + nearclip); + vector org, ang, nearclip, corner0, corner1, corner2, corner3, o; + float f; -#ifndef KEEP_ROLL - if(warpzone_fixview_angles_z != 0 || warpzone_fixview_cl_viewangles_z != 0) - { - if(autocvar_cl_rollkillspeed) - f = max(0, (1 - frametime * autocvar_cl_rollkillspeed)); - else - f = 0; - warpzone_fixview_angles_z *= f; - warpzone_fixview_cl_viewangles_z *= f; - warpzone_saved_angles_z *= f; // PERMANENTLY apply that change! - warpzone_saved_cl_viewangles_z *= f; // PERMANENTLY apply that change! - warpzone_saved = 2; - R_SetView(VF_CL_VIEWANGLES_Z, warpzone_fixview_angles_z); - } + org = R_SetView3fv(VF_ORIGIN); + ang = R_SetView3fv(VF_ANGLES); +#ifdef WORKAROUND_XON010 + float dirty; + dirty = checkextension("DP_CSQC_ROTATEMOVES"); #endif - e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin); + e = WarpZone_Find(org, org); if(e) { - warpzone_saved = 1; - warpzone_fixview_origin = WarpZone_TransformOrigin(e, warpzone_fixview_origin); - corner0 = WarpZone_TransformOrigin(e, corner0); - corner1 = WarpZone_TransformOrigin(e, corner1); - corner2 = WarpZone_TransformOrigin(e, corner2); - corner3 = WarpZone_TransformOrigin(e, corner3); - warpzone_fixview_angles = WarpZone_TransformVAngles(e, warpzone_fixview_angles); - warpzone_fixview_cl_viewangles = WarpZone_TransformVAngles(e, warpzone_fixview_cl_viewangles); - WarpZone_Inside(); + org = WarpZone_TransformOrigin(e, org); + ang = WarpZone_TransformVAngles(e, ang); +#ifdef WORKAROUND_XON010 + dirty = 1; +#endif + WarpZone_View_Inside(); } else - WarpZone_Outside(); + WarpZone_View_Outside(); - // if we are near any warpzone planes - MOVE AWAY (work around nearclip) - o = WarpZone_FixNearClip(warpzone_fixview_origin, corner0, corner1, corner2, corner3); - if(o != '0 0 0') - { - warpzone_saved = 1; - warpzone_fixview_origin += o; - } +#ifndef KEEP_ROLL + float rick; + if(autocvar_cl_rollkillspeed) + f = max(0, (1 - frametime * autocvar_cl_rollkillspeed)); + else + f = 0; - if(warpzone_saved == 1) - { - R_SetView(VF_ORIGIN, warpzone_fixview_origin); - R_SetView(VF_ANGLES, warpzone_fixview_cl_viewangles); - } -} -void WarpZone_UnFixView() -{ - if(warpzone_saved) + rick = R_SetView(VF_CL_VIEWANGLES_Z); + rick *= f; + R_SetView(VF_CL_VIEWANGLES_Z, rick); + +#ifdef WORKAROUND_XON010 + if(ang_z > 1 || ang_z < -1) + dirty = 1; +#endif + ang_z *= f; +#endif + +#ifdef WORKAROUND_XON010 + if(dirty) { - warpzone_fixview_origin = warpzone_saved_origin; - warpzone_fixview_angles = warpzone_saved_angles; - warpzone_fixview_cl_viewangles = warpzone_saved_cl_viewangles; - R_SetView(VF_ORIGIN, warpzone_fixview_origin); - R_SetView(VF_ANGLES, warpzone_fixview_angles); - R_SetView(VF_CL_VIEWANGLES, warpzone_fixview_cl_viewangles); +#endif + R_SetView(VF_ORIGIN, org); + R_SetView(VF_ANGLES, ang); +#ifdef WORKAROUND_XON010 } +#endif + + nearclip = '0 0 1' * (cvar("r_nearclip") * 1.125); + corner0 = cs_unproject('0 0 0' + nearclip); + corner1 = cs_unproject('1 0 0' * cvar("vid_conwidth") + nearclip); + corner2 = cs_unproject('0 1 0' * cvar("vid_conheight") + nearclip); + corner3 = cs_unproject('1 0 0' * cvar("vid_conwidth") + '0 1 0' * cvar("vid_conheight") + nearclip); + o = WarpZone_FixNearClip(org, corner0, corner1, corner2, corner3); + if(o != '0 0 0') + R_SetView(VF_ORIGIN, org + o); } void WarpZone_Init() @@ -229,5 +304,5 @@ void WarpZone_Init() void WarpZone_Shutdown() { - WarpZone_Outside(); + WarpZone_View_Outside(); }