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

Reply via email to