you have to comment out the pitch and roll clamping in the input code.
On Mon, Mar 5, 2012 at 11:54 AM, Joel R. <joelru...@gmail.com> wrote: > Try using my Quat class, it does the calculations differently, and is > perfectly tuned for engine->SetViewAngles > > > > On Sun, Mar 4, 2012 at 8:48 PM, Craig Louie <craiglo...@gmail.com> wrote: > >> Considering my old log file further, it looks like the hitch is >> definitely caused by the sudden switch from (yaw=0, roll=0) to (yaw=+/-180, >> roll=+/-180). >> >> >> 89.787949 0.000000 0.000000 >> 89.796173 0.000000 0.000000 >> 89.950935 -0.000000 0.000000 >> 89.989258 -0.000000 0.000000 >> 89.796158 180.000000 180.000000 >> 89.639793 -180.000000 -180.000000 >> 89.543274 180.000000 180.000000 >> 89.290382 -180.000000 -180.000000 >> >> The QuaternionAngles() function will always produce QAngles with pitch >> clamped between +/-90, therefore the yaw/roll values of +/-180 will always >> occur as shown in the log above. >> Example: >> Pitch = 91; Yaw = 0; Roll = 0; >> is equal to >> Pitch = 89; Yaw = 180; Roll = 180; >> These angles represent the point just past pitching straight down, when >> the player is starting to flip upside down. >> >> It would then seem that to fix the hitch, I would have to either move the >> entire engine away from using Euler Angles, or I would have to change the >> motion blur system. These changes aren't really in the scope of my humble >> mod. For now I will settle with turning off motion blur. >> >> Unfortunately, I have a more important gameplay bug that has been lurking >> from the beginning. I haven't mentioned it until now. When I pitch >> downwards towards the ground very, very slowly, the player stops pitching >> right around pitch = 89, straight down. So just as the player is about to >> look straight down, the slow downward pitch gets stuck (the bug also occurs >> when looking straight up). This is what it looks like in the log: >> >> Pitch Yaw Roll look_angle (this is the amount of >> pitch being applied in a given frame) >> 89.964256 0.000000 0.000000 -0.049802 >> 89.981636 0.000000 0.000000 -0.017369 >> 89.985939 0.000000 0.000000 -0.032433 >> 89.964264 0.000000 0.000000 -0.049802 >> 89.969955 0.000000 0.000000 -0.005686 >> 89.975136 0.000000 0.000000 -0.054909 >> 89.981659 0.000000 0.000000 -0.043205 >> 89.999550 0.000000 0.000000 -0.018781 >> >> So for very small pitch increments, the player's rotation gets stuck when >> the pitch nears 90 degrees (straight down). You can see the pitch values >> fluctuating up and down over these several frames. Note, the pitch doesn't >> get stuck with larger pitch increments, so it definitely has to do with the >> small look_angle values. >> >> My initial theory was that there was some lingering pitch clamping >> somewhere in the code, but I believe I have removed all instances of >> clamping (Tony's article made a point of removing pitch clamping from >> various places in the code). >> >> If anyone has any advice, I'd love to hear it. >> >> I also wanted to thank Saul, Minh, Joel and Tony for getting me this far. >> You guys are awesome and I am really humbled by your generous advice. >> >> Thanks! >> >> >> >> On Sat, Mar 3, 2012 at 11:23 PM, Joel R. <joelru...@gmail.com> wrote: >> >>> I think I ran into a similar problem building the orientation state >>> using AxisAngles. I believe you have to first build the "default" state >>> before you can multiply the (yaw/pitch/roll) quaternions. >>> >>> >>> On Sun, Mar 4, 2012 at 12:31 AM, Craig Louie <craiglo...@gmail.com>wrote: >>> >>>> I've tried both Joel and Tony's methods, but I'm still unsure of how I >>>> can escape the inherent aliasing problem of Euler Angles. >>>> >>>> With Joel's method, for instance, after I have used Slerp to get a >>>> rotation quaternion, I still need to convert the resulting quaternion back >>>> into Euler Angles (with QuaternionAngles()) because the Source engine >>>> ultimately needs orientation in QAngle form when I call >>>> engine->SetViewAngles(viewangles). Any thoughts on this? >>>> >>>> Also, I've learned more about the nature of the twisting hitch >>>> experienced when looking straight up/down (this was my original problem). >>>> When I turn off motion blur, the hitch isn't visible. My theory is that the >>>> twisting hitch I am seeing is a result of the player's orientation twisting >>>> at the instant the player looks straight up/down. >>>> >>>> Below is a part of a log showing the changes in viewangle as I pitch >>>> down through pitch=90 (as shown in my youtube video). >>>> >>>> 88.025864 0.000000 0.000000 >>>> 88.136208 0.000000 0.000000 >>>> 88.278770 0.000000 0.000000 >>>> 88.421890 0.000000 0.000000 >>>> 88.531670 0.000000 0.000000 >>>> 88.683762 0.000000 0.000000 >>>> 88.784576 0.000000 0.000000 >>>> 88.976646 0.000000 0.000000 >>>> 89.037476 0.000000 0.000000 >>>> 89.261894 0.000000 0.000000 >>>> 89.290375 0.000000 0.000000 >>>> 89.522987 0.000000 0.000000 >>>> 89.543274 0.000000 0.000000 >>>> 89.787949 0.000000 0.000000 >>>> 89.796173 0.000000 0.000000 >>>> 89.950935 -0.000000 0.000000 >>>> 89.989258 -0.000000 0.000000 >>>> 89.796158 180.000000 180.000000 >>>> 89.639793 -180.000000 -180.000000 >>>> 89.543274 180.000000 180.000000 >>>> 89.290382 -180.000000 -180.000000 >>>> 89.266182 180.000000 180.000000 >>>> 89.037491 -180.000000 -180.000000 >>>> 88.784592 180.000000 180.000000 >>>> 88.531693 -180.000000 -180.000000 >>>> 88.334381 180.000000 180.000000 >>>> 88.278809 -180.000000 -180.000000 >>>> 88.025909 180.000000 180.000000 >>>> >>>> The sudden yaw and roll change to +/-180 is probably what is causing >>>> the hitch. The motion blur is creating a blur effect as if the player is >>>> spinning for an instant. How to get around this, I am not sure. >>>> >>>> >>>> Here's my current code in in_joystick.cpp's JoyStickMove() function: >>>> >>>> //############################################################################### >>>> >>>> Vector vec_for, vec_rt, vec_up, vec_for_out, vec_rt_out, vec_up_out; >>>> Quaternion viewangles_q, turn_q, look_q, roll_q, qTemp, qDelta, >>>> qResult, viewangles_q_out; >>>> >>>> AngleVectors(viewangles, &vec_for, &vec_rt, &vec_up); >>>> >>>> //Converting the current viewangles to a Quaternion (viewangles_q). >>>> RadianEuler viewangles_euler(viewangles); >>>> AngleQuaternion(viewangles_euler, viewangles_q); >>>> >>>> //Build a set of quaternion transforms that rotate around >>>> corresponding axes in local space by corresponding angles. >>>> // NOTE: non-unit vectors will bias the resulting rotation angle >>>> (but not the axis) >>>> >>>> VectorNormalize(vec_up); >>>> AxisAngleQuaternion(vec_up, turn_angle, turn_q); >>>> VectorNormalize(vec_rt); >>>> AxisAngleQuaternion(vec_rt, look_angle, look_q); >>>> VectorNormalize(vec_for); >>>> AxisAngleQuaternion(vec_for, roll_angle, roll_q); >>>> >>>> //Combine Quaternions. >>>> QuaternionMult(look_q, turn_q, qTemp); >>>> QuaternionMult(qTemp, roll_q, qDelta); >>>> >>>> //Slerp >>>> QuaternionSlerp(viewangles_q, qDelta, 1.0, qResult); >>>> >>>> //Applying the Quaternion rotation. >>>> QuaternionMult(qResult, viewangles_q, viewangles_q_out); >>>> >>>> //Converting Quaternion into a QAngle for >>>> engine->SetViewAngles(viewangles_out) >>>> QAngle viewangles_out; >>>> QuaternionAngles(viewangles_q_out, viewangles_out); >>>> >>>> COM_Log("viewangle_hitch.txt", "%2f %2f %2f \n", viewangles_out.x, >>>> viewangles_out.y, viewangles_out.z); >>>> >>>> if (viewangles_out[PITCH] > 180) >>>> { >>>> viewangles_out[PITCH] -= 360; >>>> } >>>> else if (viewangles_out[PITCH] < -180) >>>> { >>>> viewangles_out[PITCH] += 360; >>>> } >>>> >>>> if (viewangles_out[YAW] > 180) >>>> { >>>> viewangles_out[YAW] -= 360; >>>> } >>>> else if (viewangles_out[YAW] < -180) >>>> { >>>> viewangles_out[YAW] += 360; >>>> } >>>> >>>> if (viewangles_out[ROLL] > 180) >>>> { >>>> viewangles_out[ROLL] -= 360; >>>> } >>>> else if (viewangles_out[ROLL] < -180) >>>> { >>>> viewangles_out[ROLL] += 360; >>>> } >>>> >>>> //############################################################################### >>>> >>>> >>>> Thanks! >>>> >>>> >>>> >>>> On Fri, Mar 2, 2012 at 12:40 AM, Craig Louie <craiglo...@gmail.com>wrote: >>>> >>>>> Thanks Tony and Joel for more awesome help. I didn't get as much time >>>>> as I would have liked to work on it tonight. I will have to continue >>>>> tomorrow night (and probably into the weekend). I'll keep the thread >>>>> posted. Thanks! >>>>> >>>>> P.S. cool flight sim vid, Joel. Are you a fellow X-Wing/Tie Fighter >>>>> fan? Freespace perhaps? >>>>> >>>>> >>>>> >>>>> On Thu, Mar 1, 2012 at 10:29 PM, Joel R. <joelru...@gmail.com> wrote: >>>>> >>>>>> http://www.youtube.com/watch?v=5y6a_oFtNiI >>>>>> >>>>>> >>>>>> On Thu, Mar 1, 2012 at 10:35 PM, Tony "omega" Sergi < >>>>>> omegal...@gmail.com> wrote: >>>>>> >>>>>>> This actually will work in Source, as the input/view stuff is >>>>>>> basically identical: >>>>>>> http://articles.thewavelength.net/269/ >>>>>>> -Tony >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Fri, Mar 2, 2012 at 5:09 AM, Craig Louie <craiglo...@gmail.com>wrote: >>>>>>> >>>>>>>> Thanks Joel! I'll also try out your method when I get home. I'll >>>>>>>> keep everyone posted on my results. >>>>>>>> >>>>>>>> Thanks! >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Mar 1, 2012 at 11:12 AM, Joel R. <joelru...@gmail.com>wrote: >>>>>>>> >>>>>>>>> Quaternion.h >>>>>>>>> http://pastebin.com/hxTBab3T >>>>>>>>> >>>>>>>>> Quaternion.cpp >>>>>>>>> http://pastebin.com/2WizAewD >>>>>>>>> >>>>>>>>> Quaternion Rotation Formulas (Yaw/Pitch/Roll) >>>>>>>>> http://pastebin.com/BHRvcbCG >>>>>>>>> >>>>>>>>> I got most of the quaternion stuff from Ogre engine and converted >>>>>>>>> to work on Source Engine. The functions you will be interested in >>>>>>>>> using >>>>>>>>> are FromRotationMatrix, ToRotationMatrix, AxisAngle, ToAxisAngle, >>>>>>>>> GetRotationTo, ToAxes, Slerp, GetAngles, GetMatrix >>>>>>>>> >>>>>>>>> So basically you'll do what's below: (this is psuedocode, function >>>>>>>>> names are not exact!) >>>>>>>>> >>>>>>>>> >>>>>>>>> Quat current, target; >>>>>>>>> current.FromRotationMatrix( ent->EntityWorldTransform() ); >>>>>>>>> >>>>>>>>> target = current; >>>>>>>>> target = yaw( target, 10 ); //10 degrees to the right, this >>>>>>>>> function is not part of Quat class for some reason >>>>>>>>> >>>>>>>>> current = Slerp( current, target, 0.2 ); //This is only 20%, >>>>>>>>> you'll need to calculate the angle difference between current/target, >>>>>>>>> and >>>>>>>>> then move based on your angles per second speed. >>>>>>>>> >>>>>>>>> matrix3x4_t newRot; >>>>>>>>> current.ToRotationMatrix( newRot ); >>>>>>>>> ent->SetWorldTransform( newRot ); >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> Enjoy! >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Mar 1, 2012 at 12:46 PM, Joel R. <joelru...@gmail.com>wrote: >>>>>>>>> >>>>>>>>>> The quaternion calculations you're doing are similar to just >>>>>>>>>> manipulating the Euler Angles, which cause Gimbal Lock. >>>>>>>>>> >>>>>>>>>> The way I did it in my flight simulation is to create a Current >>>>>>>>>> Quaternion (from the starting Matrix Transformation when user >>>>>>>>>> spawns) and >>>>>>>>>> Target Quaternion (where they want to rotate to). I also used some >>>>>>>>>> formulas to rotate the quaternion in the individual yaw/pitch/roll >>>>>>>>>> orientations, I recommend googling for these formulas. I then used >>>>>>>>>> the >>>>>>>>>> Slerp formula to animate from the Current quaternion to the Target >>>>>>>>>> quaternion. Slerp will avoid Gimbal-Lock entirely, which is very >>>>>>>>>> neat. >>>>>>>>>> >>>>>>>>>> After you do those calculations, just convert the new Current >>>>>>>>>> Quaternion into a Matrix Transformation and set the Entity to take >>>>>>>>>> that >>>>>>>>>> transform. >>>>>>>>>> >>>>>>>>>> I've used this to control the entity rotation as well as the >>>>>>>>>> camera, it allows you to do some pretty nifty tricks. >>>>>>>>>> >>>>>>>>>> I'll look for the code, if I still have it, and I'll post it here >>>>>>>>>> for you. Or if you figure out, please post a video =D >>>>>>>>>> >>>>>>>>>> Regards, >>>>>>>>>> >>>>>>>>>> Joel >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Thu, Mar 1, 2012 at 11:55 AM, Minh <minh...@telus.net> wrote: >>>>>>>>>> >>>>>>>>>>> You can try spitting out the results to a file so you can >>>>>>>>>>> observe the hitch more closely. >>>>>>>>>>> Look for a function called COM_Log >>>>>>>>>>> >>>>>>>>>>> COM_Log ( "viewangle_hitch.txt", "%.2f %.2f %.2f \n", >>>>>>>>>>> viewangles.x, viewangles.y, viewangles.z ); >>>>>>>>>>> >>>>>>>>>>> On 3/1/2012 3:55 AM, Craig Louie wrote: >>>>>>>>>>> >>>>>>>>>>> Thanks for the reply Saul. I hadn't thought of disabling >>>>>>>>>>> prediction. I just gave it a shot. I changed to "engine->ClientCmd( >>>>>>>>>>> "cl_predict 0" );" in cdll_client_int.cpp. With another test, the >>>>>>>>>>> unsmooth >>>>>>>>>>> rotation when looking straight up/down still occurs. >>>>>>>>>>> >>>>>>>>>>> My main theories at this point: >>>>>>>>>>> 1) Something is occurring in VectorAngles(vec_for_out, >>>>>>>>>>> vec_up_out, viewangles) to cause this. VectorAngles() might not >>>>>>>>>>> produce >>>>>>>>>>> straight up/down Euler angles properly - choking because of aliasing >>>>>>>>>>> perhaps? This is a big guess because I don't know the inner >>>>>>>>>>> workings of >>>>>>>>>>> VectorAngles(). >>>>>>>>>>> 2) There is some code somewhere else that is conflicting with >>>>>>>>>>> the full, unclamped rotation I've implemented. I've tried to remove >>>>>>>>>>> all >>>>>>>>>>> instances of pitch clamping, for example. But I may have missed >>>>>>>>>>> something. >>>>>>>>>>> Also, it's possible mouse rotation is somehow conflicting with my >>>>>>>>>>> changes >>>>>>>>>>> to joystick rotation. >>>>>>>>>>> >>>>>>>>>>> Here's a video of the issue I'm seeing. It happens a few times >>>>>>>>>>> in the video. You'll see it happen the first time at about 11 >>>>>>>>>>> seconds in >>>>>>>>>>> when the text on the floor twists/shakes. >>>>>>>>>>> http://www.youtube.com/watch?v=PLN641Qsn08 >>>>>>>>>>> >>>>>>>>>>> Thanks! >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Wed, Feb 29, 2012 at 11:34 PM, Saul Rennison < >>>>>>>>>>> saul.renni...@gmail.com> wrote: >>>>>>>>>>> >>>>>>>>>>>> The hitching is most likely something trying to revert your >>>>>>>>>>>> angle changes (I.e. in prediction). Have you tried disabling >>>>>>>>>>>> prediction? >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Thursday, March 1, 2012, Craig Louie wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hello Coders, >>>>>>>>>>>>> >>>>>>>>>>>>> I'm trying to create a space flight combat game with the >>>>>>>>>>>>> Source SDK. Currently, I am trying to achieve rotation around the >>>>>>>>>>>>> player's >>>>>>>>>>>>> local axes for airplane-like pitch, yaw and roll. Below is the >>>>>>>>>>>>> code I'm >>>>>>>>>>>>> using to try to implement full 3D rotation. I'm running into a >>>>>>>>>>>>> problem >>>>>>>>>>>>> where the player's view twists and hitches unsmoothly when the >>>>>>>>>>>>> player looks >>>>>>>>>>>>> straight up or straight down. I think this may be because of the >>>>>>>>>>>>> inherent >>>>>>>>>>>>> problem of aliasing/Gimbal-lock when using Euler angles. Any >>>>>>>>>>>>> advise? >>>>>>>>>>>>> >>>>>>>>>>>>> //######################################### >>>>>>>>>>>>> //Take the Euler angles for the player's orientation >>>>>>>>>>>>> (viewangles) and convert them to vectors. >>>>>>>>>>>>> Vector vec_for, vec_rt, vec_up, vec_for_out, vec_rt_out, >>>>>>>>>>>>> vec_up_out; >>>>>>>>>>>>> AngleVectors(viewangles, &vec_for, &vec_rt, &vec_up); >>>>>>>>>>>>> >>>>>>>>>>>>> //Take the resulting vectors and the desired rotation amounts >>>>>>>>>>>>> and convert them to Quaternions. >>>>>>>>>>>>> Quaternion turn_q, look_q, roll_q; >>>>>>>>>>>>> // NOTE: Assumes axis is a unit vector, non-unit vectors will >>>>>>>>>>>>> bias the resulting rotation angle (but not the axis) >>>>>>>>>>>>> VectorNormalize(vec_up); >>>>>>>>>>>>> AxisAngleQuaternion(vec_up, turn_angle, turn_q); >>>>>>>>>>>>> >>>>>>>>>>>>> VectorNormalize(vec_rt); >>>>>>>>>>>>> AxisAngleQuaternion(vec_rt, look_angle, look_q); >>>>>>>>>>>>> >>>>>>>>>>>>> VectorNormalize(vec_for); >>>>>>>>>>>>> AxisAngleQuaternion(vec_for, roll_angle, roll_q); >>>>>>>>>>>>> >>>>>>>>>>>>> //Convert the quaternions to matrices. >>>>>>>>>>>>> matrix3x4_t xform0, xform1, xform2; >>>>>>>>>>>>> QuaternionMatrix(turn_q, xform0); >>>>>>>>>>>>> QuaternionMatrix(look_q, xform1); >>>>>>>>>>>>> QuaternionMatrix(roll_q, xform2); >>>>>>>>>>>>> >>>>>>>>>>>>> //Combine matrices. >>>>>>>>>>>>> matrix3x4_t xformA, xformB; >>>>>>>>>>>>> MatrixMultiply(xform0, xform1, xformA); >>>>>>>>>>>>> MatrixMultiply(xformA, xform2, xformB); >>>>>>>>>>>>> >>>>>>>>>>>>> //Rotate the vectors with our combined rotation matrix. >>>>>>>>>>>>> VectorRotate(vec_for, xformB, vec_for_out); >>>>>>>>>>>>> VectorRotate(vec_rt, xformB, vec_rt_out); >>>>>>>>>>>>> VectorRotate(vec_up, xformB, vec_up_out); >>>>>>>>>>>>> >>>>>>>>>>>>> //Determine the new viewangles based on our rotated vectors. >>>>>>>>>>>>> VectorAngles(vec_for_out, vec_up_out, viewangles); >>>>>>>>>>>>> //######################################### >>>>>>>>>>>>> >>>>>>>>>>>>> I put this code into in_joystick.cpp in the JoyStickMove( >>>>>>>>>>>>> float frametime, CUserCmd *cmd ) function. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Thanks! >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Kind regards, >>>>>>>>>>>> *Saul Rennison* >>>>>>>>>>>> >>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>>>>>>> archives, please visit: >>>>>>>>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>>>>>> archives, please >>>>>>>>>>> visit:https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> _______________________________________________ >>>>>>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>>>>>> archives, please visit: >>>>>>>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> _______________________________________________ >>>>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>>>> archives, please visit: >>>>>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>>> archives, please visit: >>>>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>> >>>>>>> >>>>>>> -- >>>>>>> -Tony >>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>>> archives, please visit: >>>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>>> >>>>>>> >>>>>>> >>>>>> >>>>>> _______________________________________________ >>>>>> To unsubscribe, edit your list preferences, or view the list >>>>>> archives, please visit: >>>>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>>>> >>>>>> >>>>>> >>>>> >>>> >>>> _______________________________________________ >>>> To unsubscribe, edit your list preferences, or view the list archives, >>>> please visit: >>>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>>> >>>> >>>> >>> >>> _______________________________________________ >>> To unsubscribe, edit your list preferences, or view the list archives, >>> please visit: >>> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >>> >>> >>> >> >> _______________________________________________ >> To unsubscribe, edit your list preferences, or view the list archives, >> please visit: >> https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders >> >> >> > > _______________________________________________ > To unsubscribe, edit your list preferences, or view the list archives, > please visit: > https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders > > > -- -Tony
_______________________________________________ To unsubscribe, edit your list preferences, or view the list archives, please visit: https://list.valvesoftware.com/cgi-bin/mailman/listinfo/hlcoders