<?xml version="1.0"?>
<rss version="2.0"><channel><title>Gameplay Latest Topics</title><link>https://torque3d.org/forums/forum/20-gameplay/</link><description>Gameplay Latest Topics</description><language>en</language><item><title>Torque 4: Third Person Free Camera With ScreenSpace Movement And Lock On Target</title><link>https://torque3d.org/forums/topic/7136-torque-4-third-person-free-camera-with-screenspace-movement-and-lock-on-target/</link><description><![CDATA[<p>
	Third Person Free Camera With ScreenSpace Movement And Lock On Target, that works in Torque 4 devhead as of today.
</p>

<p>
	This is the FINAL (hopefully) version of this resource, I have now fixed my client-server predication issues. Needless to say, I had been looking the wrong place, and it was pretty much a 1 line fix.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/4Ylm_rUejiQ?feature=oembed" title="Lock On Rotation Client Prediction Fix" width="200"></iframe>
	</div>
</div>

<p>
	 
</p>

<p>
	Player.h
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_5" style=""><span class="com">//in protected</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
   </span><span class="typ">SimObjectPtr</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">&gt;</span><span class="pln"> mControlObject</span><span class="pun">;</span><span class="pln"> </span><span class="com">///&lt; Controlling object</span><span class="pln">

   </span><span class="typ">SimObjectPtr</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">&gt;</span><span class="pln"> mLockOn</span><span class="pun">;</span><span class="com">//yorks - gamebase/shapebase object id we are locked on to, this keeps the camera pointing at this object</span><span class="pln">

   </span><span class="com">/// @name Animation threads &amp; data</span><span class="pln">
</span><span class="com">//...</span><span class="pln">

</span><span class="com">//down in public</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
   </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> getControlObject</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//yorks block</span><span class="pln">
   F32 getLockOnHorizontal</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">);</span><span class="pln">
   F32 getLockOnVertical</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">);</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> setLockOn</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">);</span><span class="pln">
   </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> getLockOn</span><span class="pun">();</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> clearLockOn</span><span class="pun">();</span><span class="com">//yorks end</span><span class="pln">
   
   </span><span class="com">//</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> updateWorkingCollisionSet</span><span class="pun">();</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	Player.cpp
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_7" style=""><span class="com">//...</span><span class="pln">
</span><span class="typ">Player</span><span class="pun">::</span><span class="typ">Player</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mTypeMask </span><span class="pun">|=</span><span class="pln"> </span><span class="typ">PlayerObjectType</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">DynamicShapeObjectType</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
   dMemset</span><span class="pun">(</span><span class="pln"> mSplashEmitter</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln"> mSplashEmitter </span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// 0;//yorks for locking on a shapeBase/gameBase id</span><span class="pln">

   mUseHeadZCalc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="com">//..</span></pre>

<p>
	And into the player's main player::updateMove where the action happens.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_9" style=""><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">updateMove</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">*</span><span class="pln"> move</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">Move</span><span class="pln"> my_move</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
  
         setImageAltTriggerState</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">trigger</span><span class="pun">[</span><span class="pln">sImageTrigger1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="com">//yorks &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span class="pln">
   F32 camZ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="typ">GameConnection</span><span class="pun">*</span><span class="pln"> con </span><span class="pun">=</span><span class="pln"> getControllingClient</span><span class="pun">();</span><span class="pln">
   </span><span class="kwd">bool</span><span class="pln"> thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">con </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">con</span><span class="pun">-&gt;</span><span class="pln">isFirstPerson</span><span class="pun">())</span><span class="pln">
      thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="com">//yorks end &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><span class="pln">

   </span><span class="com">// Update current orientation</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      F32 prevZRot </span><span class="pun">=</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
	  mDelta</span><span class="pun">.</span><span class="pln">headVec </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">;</span><span class="pln">

      </span><span class="kwd">bool</span><span class="pln"> doStandardMove </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">bool</span><span class="pln"> absoluteDelta </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
      </span><span class="com">//GameConnection* con = getControllingClient();//yorks moved above now</span><span class="pln">

</span><span class="com">#ifdef</span><span class="pln"> TORQUE_EXTENDED_MOVE
  </span><span class="com">//...</span></pre>

<p>
	Now find the doStandardMove and replace it.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_11" style=""><span class="pln">      </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">doStandardMove</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="com">//yorks new</span><span class="pln">
         F32 p </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">pitch</span><span class="pun">;</span><span class="pln">
         F32 y </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">yaw</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//yorks &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; moved below for first person only</span><span class="pln">
         </span><span class="com">/*F32 p = move-&gt;pitch * (mPose == SprintPose ? mDataBlock-&gt;sprintPitchScale : 1.0f);
         if (p &gt; M_PI_F) 
            p -= M_2PI_F;

         mHead.x = mClampF(mHead.x + p,mDataBlock-&gt;minLookAngle, mDataBlock-&gt;maxLookAngle);

         F32 y = move-&gt;yaw * (mPose == SprintPose ? mDataBlock-&gt;sprintYawScale : 1.0f);
         if (y &gt; M_PI_F)
            y -= M_2PI_F;*/</span><span class="pln">

         </span><span class="com">/*if (move-&gt;freeLook &amp;&amp; ((isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))
         {
            mHead.z = mClampF(mHead.z + y,
                              -mDataBlock-&gt;maxFreelookAngle,
                              mDataBlock-&gt;maxFreelookAngle);
         }
         else
         {
            mRot.z += y;
            // Rotate the head back to the front, center horizontal
            // as well if we're controlling another object.
            mHead.z *= 0.5f;
            if (mControlObject)
               mHead.x *= 0.5f;
         }//yorks end of moved below for first person &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;
         */</span><span class="pln">
         </span><span class="com">// yorks start &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span class="pln">
            </span><span class="com">//if (((move-&gt;freeLook &amp;&amp; isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))//out no freelook now</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//if not default to first person stock code below</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">//think we might need a check to see if mLockOn is a real thing?</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
                     setLockOn</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">);</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
               </span><span class="kwd">else</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">//yorks moved down here</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1.4f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.9f</span><span class="pun">);</span><span class="com">//direct values now//yorksmDataBlock-&gt;minLookAngle, mDataBlock-&gt;maxLookAngle);//yorks added 0.5f to slow p down a bit</span><span class="pln">

                  </span><span class="com">//let us run the camera around in a big old never ending circle</span><span class="pln">
                  F32 camRot </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">);</span><span class="com">//slow y down a bit, techincally you should do this input script mouse sensitivity, also see p above</span><span class="pln">
                  </span><span class="com">//constrain the range of camRot within pi*2</span><span class="pln">
                  </span><span class="com">/*if (camRot &gt; M_PI_F)
                     camRot -= M_2PI_F;
                  else if (camRot &lt; -M_PI_F)
                     camRot += M_2PI_F;*/</span><span class="pln">
                  camRot </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camRot</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> camRot</span><span class="pun">;</span><span class="pln">
                  </span><span class="com">// mHead.z = mClampF(mHead.z + y,</span><span class="pln">
                                    </span><span class="com">// -mDataBlock-&gt;maxFreelookAngle,</span><span class="pln">
                                    </span><span class="com">// mDataBlock-&gt;maxFreelookAngle);//yorks end</span><span class="pln">
                  </span><span class="com">//Con::printf("camRot/mHead.z %f", camRot);</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//yorks original code moved down here</span><span class="pln">
               p </span><span class="pun">*=</span><span class="pln"> mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintPitchScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">;</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                  p </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="pln">

               y </span><span class="pun">*=</span><span class="pln"> mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintYawScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">;</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                  y </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
               </span><span class="com">// Rotate the head back to the front, center horizontal</span><span class="pln">
               </span><span class="com">// as well if we're controlling another object.</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
      </span><span class="com">//}//yorks end &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><span class="pln">

         </span><span class="com">// constrain the range of mRot.z</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&gt;</span><span class="pln"> M_2PI_F</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">

	  mDelta</span><span class="pun">.</span><span class="pln">rot </span><span class="pun">=</span><span class="pln"> mRot</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	This is good for both first person view, our new third person camera, and AiPlayers.
</p>

<p>
	Now replace the whole of;
</p>

<p>
	if ((mState == MoveState || (mState == RecoverState &amp;&amp; mDataBlock-&gt;recoverRunForceScale &gt; 0.0f)) &amp;&amp; mDamageState == Enabled &amp;&amp; !isAnimationLocked())
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_13" style=""><span class="com">//...</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">MoveState</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">RecoverState</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">recoverRunForceScale </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">))</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isAnimationLocked</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      F32 yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="com">//yorks start</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">GameBase</span><span class="pun">*</span><span class="pln"> cam </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">-&gt;</span><span class="pln">getCameraObject</span><span class="pun">();</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cam</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//get the camera's transform</span><span class="pln">
            F32 pos </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="typ">MatrixF</span><span class="pln"> camTrans</span><span class="pun">;</span><span class="pln">
            cam</span><span class="pun">-&gt;</span><span class="pln">getCameraTransform</span><span class="pun">(&amp;</span><span class="pln">pos</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">camTrans</span><span class="pun">);</span><span class="pln">

            </span><span class="com">//flatten the transform to X&amp;Y (so when the camera</span><span class="pln">
            </span><span class="com">//is facing up/down the move remains horizontal)</span><span class="pln">
            camTrans</span><span class="pun">[</span><span class="lit">9</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="pln">

            </span><span class="com">//create a move vector and multiply by the camera transform</span><span class="pln">
            </span><span class="typ">VectorF</span><span class="pln"> temp</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">mulV</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// get the z rotation of the camera for working with right stick aiming - don't need this here but have it for debugging below</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> camTrans</span><span class="pun">.</span><span class="pln">toEuler</span><span class="pun">().</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camZ </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
               camZ </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

            </span><span class="com">// Constrain the range of camZ within pi*2</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camZ</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">))</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">)))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">// This is make the player turn towards the direction that they are moving</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> transVec </span><span class="pun">=</span><span class="pln"> getTransform</span><span class="pun">().</span><span class="pln">getForwardVector</span><span class="pun">();</span><span class="pln"> </span><span class="com">//getVelocity();</span><span class="pln">

               F32 tran </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">transVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> transVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tran </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  tran </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mWrapF</span><span class="pun">(</span><span class="pln">tran</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="pln">

               F32 moveDir </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">getVelocity</span><span class="pun">().</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> getVelocity</span><span class="pun">().</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">moveDir </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  moveDir </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               yawDiff </span><span class="pun">=</span><span class="pln"> moveDir </span><span class="pun">-</span><span class="pln"> tran</span><span class="pun">;</span><span class="pln">

               </span><span class="com">//ignore very small rotations</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.005f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.005f</span><span class="pun">)</span><span class="com">//yorks now less than a third of 1 degree//0.001f)//</span><span class="pln">
                  yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">))</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  F32 slower</span><span class="pun">;</span><span class="com">//slower exists to slow the turn down</span><span class="pln">
                  slower </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.15f</span><span class="pun">;</span><span class="pln">

                  mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="com">//the camera is still attached to the player so we need to compensate for the player's new rotation</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               F32 testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
               testVal </span><span class="pun">=</span><span class="pln"> getLockOnHorizontal</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> testVal</span><span class="pun">;</span><span class="pln">
               </span><span class="com">//----------------------</span><span class="pln">
               F32 headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
               headV </span><span class="pun">=</span><span class="pln"> getLockOnVertical</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+=</span><span class="pln"> headV</span><span class="pun">;</span><span class="pln">
				
              </span><span class="com">//yorks this is what we forgot before - to update the headVec for a second time because we have altered it</span><span class="pln">
               mDelta</span><span class="pun">.</span><span class="pln">headVec </span><span class="pun">-=</span><span class="pln"> </span><span class="typ">Point3F</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> testVal</span><span class="pun">);</span><span class="pln">

               </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">U32 i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> </span><span class="pun">++</span><span class="pln">i</span><span class="pun">)</span><span class="com">//yorks safety</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDelta</span><span class="pun">.</span><span class="pln">headVec</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                     mDelta</span><span class="pun">.</span><span class="pln">headVec</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDelta</span><span class="pun">.</span><span class="pln">headVec</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
                     mDelta</span><span class="pun">.</span><span class="pln">headVec</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">

         F32 dirSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.785f</span><span class="pun">)</span><span class="com">//0-45deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5.497f</span><span class="pun">)</span><span class="com">//315-360deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.784f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2.356f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5.496f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3.926f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         moveSpeed </span><span class="pun">=</span><span class="pln"> dirSpeed</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
      </span><span class="pun">{</span><span class="com">//yorks original movement code below</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintStrafeScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">));</span><span class="pln">
         </span><span class="typ">VectorF</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">tv</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">+=</span><span class="pln"> tv </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">;</span><span class="pln">

         </span><span class="com">// Clamp water movement</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">

            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="com">//yorks added to segregate original code from freecam </span><span class="pln">

      </span><span class="com">// Cancel any script driven animations if we are going to move.</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">moveVec</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">z </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
         </span><span class="pun">(</span><span class="pln">mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NumTableActionAnims</span><span class="pln">
            </span><span class="pun">||</span><span class="pln"> mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">LandAnim</span><span class="pun">))</span><span class="pln">
         mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NullAnimation</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="com">//this is all stock code down here</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      moveVec</span><span class="pun">.</span><span class="typ">set</span><span class="pun">(</span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">);</span><span class="pln">
      moveSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	Write and Read the packets to send our lockOn target's ghost over net.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_15" style=""><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
   </span><span class="com">//...</span><span class="pln">
   </span><span class="com">//yorks, at the bottom</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> connection</span><span class="pun">-&gt;</span><span class="pln">getGhostIndex</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="pln">ghost </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
         stream</span><span class="pun">-&gt;</span><span class="pln">writeRangedU32</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="com">//yorks end</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
   </span><span class="com">//yorks at the bottom</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">readFlag</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readRangedU32</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> lock </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">static_cast</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">*&gt;(</span><span class="pln">connection</span><span class="pun">-&gt;</span><span class="pln">resolveGhost</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">));</span><span class="com">//static_cast as we have a check for shapebase object when we assign it</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> lock</span><span class="pun">;</span><span class="com">// setLockOn(lock);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// setLockOn(NULL);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	At the bottom of the file add the maths and functions for the lockOn target.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_17" style=""><span class="pun">/</span><span class="pln">yorks start to end of file
F32 </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOnHorizontal</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="com">//face to look at the object's center - no look at it's base to keep the camera higher</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> centerLock </span><span class="pun">=</span><span class="pln"> mLockOn</span><span class="pun">-&gt;</span><span class="pln">getPosition</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//get the vector from us to the target and break it down to x (up/down) and z horizontal rotation</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> ourCenter </span><span class="pun">=</span><span class="pln"> getBoxCenter</span><span class="pun">();</span><span class="com">// use our center to their base for additional vert rotation</span><span class="pln">
   </span><span class="typ">VectorF</span><span class="pln"> lookAtVec </span><span class="pun">=</span><span class="pln"> centerLock </span><span class="pun">-</span><span class="pln"> ourCenter</span><span class="pun">;</span><span class="pln">
   lookAtVec</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="com">//just in case</span><span class="pln">

   </span><span class="com">//get the angle in radians and then invert it as we want to be at the far side of our player --- apparently doesn't need inverting</span><span class="pln">
   F32 viewRad </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   viewRad </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">lookAtVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> lookAtVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
   viewRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">viewRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

   F32 totalRad </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
   totalRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

   F32 testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   testVal </span><span class="pun">=</span><span class="pln"> viewRad </span><span class="pun">-</span><span class="pln"> totalRad</span><span class="pun">;</span><span class="pln">

   </span><span class="com">//ignore very small rotations</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.001f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.001f</span><span class="pun">)</span><span class="com">//yorks //0.017f = 1 degree; 0.005f = 0.2864789 of 1 degree//0.001f</span><span class="pln">
      testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">))</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

      </span><span class="com">//testVal = mWrapF(testVal, 0.0f, M_2PI_F);//this is not the fast turn above!!!! Must not have this for interlope</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">)</span><span class="com">//stagger the turn if large</span><span class="pln">
         testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="kwd">return</span><span class="pln"> testVal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

F32 </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOnVertical</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="com">//face to look at the object's center - no look at it's base to keep the camera higher</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> centerLock </span><span class="pun">=</span><span class="pln"> mLockOn</span><span class="pun">-&gt;</span><span class="pln">getPosition</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//get the vector from us to the target and break it down to x (up/down) and z horizontal rotation</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> ourCenter </span><span class="pun">=</span><span class="pln"> getBoxCenter</span><span class="pun">();</span><span class="pln"> </span><span class="com">// use our center to their base for additional vert rotation</span><span class="pln">
   </span><span class="typ">VectorF</span><span class="pln"> lookAtVec </span><span class="pun">=</span><span class="pln"> centerLock </span><span class="pun">-</span><span class="pln"> ourCenter</span><span class="pun">;</span><span class="pln">
   lookAtVec</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="com">//just in case ;)</span><span class="pln">

   </span><span class="com">//mHead.x = mWrapF(mHead.x, -M_HALFPI_F, M_HALFPI_F);lock it between half -Pi (-1.57) and half +Pi (+1.57)think it works better without</span><span class="pln">
   F32 vertZ</span><span class="pun">;</span><span class="pln">
   F32 headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   F32 lenTo </span><span class="pun">=</span><span class="pln"> lookAtVec</span><span class="pun">.</span><span class="pln">len</span><span class="pun">();</span><span class="com">// len() or lenSquared() ?</span><span class="pln">
   vertZ </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">lookAtVec</span><span class="pun">.</span><span class="pln">z</span><span class="pun">),</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">lenTo</span><span class="pun">));</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ourCenter</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> centerLock</span><span class="pun">.</span><span class="pln">z</span><span class="pun">)</span><span class="pln">
      vertZ </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
   vertZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">vertZ</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">,</span><span class="pln"> M_HALFPI_F</span><span class="pun">);</span><span class="com">//yorks use the new method - lock it between half -Pi (-1.57) and half +Pi (+1.57)</span><span class="pln">

   F32 totalRad </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">x</span><span class="pun">;</span><span class="com">//mRot.x should be zero</span><span class="pln">
   totalRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">,</span><span class="pln"> M_HALFPI_F</span><span class="pun">);</span><span class="pln">

   headV </span><span class="pun">=</span><span class="pln"> vertZ </span><span class="pun">-</span><span class="pln"> totalRad</span><span class="pun">;</span><span class="pln">

   </span><span class="com">//ignore very small rotations</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.001f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.001f</span><span class="pun">)</span><span class="com">//yorks //0.017f = 1 degree; 0.005f = 0.2864789 of 1 degree//0.001f</span><span class="pln">
      headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">))</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&gt;</span><span class="pln"> M_HALFPI_F</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">-=</span><span class="pln"> M_PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">+=</span><span class="pln"> M_PI_F</span><span class="pun">;</span><span class="pln">

      </span><span class="com">//headV = mWrapF(headV, -M_HALFPI_F, M_HALFPI_F);//&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;this is not the above fast turn!!!! Must not have this for interlope</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">)</span><span class="com">//stagger the turn if large</span><span class="pln">
         headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> headV</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn no obj or not shapebase"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj not properly added"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">getDamageStateName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"Enabled"</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj dead"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">bool</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">))</span><span class="com">//Az thought this might help</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         clearProcessAfter</span><span class="pun">();</span><span class="pln">
         clearNotify</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> obj</span><span class="pun">;</span><span class="com">//set the lockOn object</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">bool</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">))</span><span class="pln"> </span><span class="com">// Az thought this might help</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         processAfter</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
         deleteNotify</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> mLockOn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">clearLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	And finally after that, the script calls.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7358_19" style=""><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> setLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">),</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="str">"set lockOn target object"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   object</span><span class="pun">-&gt;</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> getLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ShapeBase</span><span class="pun">*,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Get player's lock on object. return 0 if no lockOn."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> object</span><span class="pun">-&gt;</span><span class="pln">getLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> clearLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Clear player's lock on object."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   object</span><span class="pun">-&gt;</span><span class="pln">clearLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	And there you have it, a third person free camera with a movement to screenSpace with a target lock on system.
</p>

<p>
	Now you too can be Sleeping Torquedogs, Torque Ring or Grand Theft Kork 6!
</p>
]]></description><guid isPermaLink="false">7136</guid><pubDate>Fri, 10 Mar 2023 19:45:36 +0000</pubDate></item><item><title>MMORPG style Inventory - Stock Torque3D 3.10.1</title><link>https://torque3d.org/forums/topic/1292-mmorpg-style-inventory-stock-torque3d-3101/</link><description><![CDATA[<p>Hello everyone,<br /></p><p>Isn't it high time that Torque3D had a easy to use, easy to maintain, and easy to expand upon inventory system? I think so too! And in that spirit here is a MMORPG style server to client inventory resource written in TorqueScript for stock Torque3D 3.10.1... probably works on any version of Torque but 3.10.1 is where it's been tested.<br /></p><p><br /></p><p><b><strong>Video showing off inventory functionality:</strong></b><br /></p><p>llPf0IQMmDw <br /></p><p><br /></p><p><b><strong>Current Version:</strong></b> 1.0.0a<br /></p><p><b><strong>Download:</strong></b> <a href="https://www.dropbox.com/s/p4x4e8qvwf9e4q5/MMO_Inventory.zip?dl=0" rel="external nofollow">https://www.dropbox.com/s/p4x4e8qvwf9e4q5/MMO_Inventory.zip?dl=0</a><br /></p><p><b><strong>Installation:</strong></b> Instructions are found in the downloaded folder's base directory<br /></p><p><b><strong>License:</strong></b> Code: MIT | Art/Sound files: CC0<br /></p><p><br /></p><p><br /></p><p><b><strong>General Notes:</strong></b></p><p></p><ul><li>Networked with a "never trust the client" mindset</li></ul><p></p><p></p><ul><li>Standardized images/bitmap arrays</li></ul><p></p><p></p><ul><li>Standardized data variables for all the things</li></ul><p></p><p></p><ul><li>Standardized "helper" functionality</li></ul><p></p><p></p><ul><li>Using a flat database system</li></ul><p></p><p></p><ul><li>Using object namespaces to reduce redundancies</li></ul><p></p><p></p><ul><li>Written in just TorqueScript</li></ul><p></p><p></p><ul><li>No .gui files, the gui elements are built to a targeted gui(standard is set to PlayGui)</li></ul><p></p><p></p><ul><li>Data driven gui approach with full customization</li></ul><p></p><p></p><ul><li>Plenty of example objects</li></ul><p></p><p> </p><p><br /></p><p><b><strong>System Features:</strong></b></p><p></p><ul><li>Base inventory</li></ul><p></p><p></p><ul><li>Inventory Menu</li></ul><p></p><p></p><ul><li>Currency panel</li></ul><p></p><p></p><ul><li>Notify panel</li></ul><p></p><p></p><ul><li>Examine panel</li></ul><p></p><p></p><ul><li>Sound suite</li></ul><p></p><p></p><ul><li>Select object behavior</li></ul><p></p><p> </p><p><br /></p><p><b><strong>Network Optimizations:</strong></b></p><p></p><ul><li>Full inventory data is only sent when player opens their inventory for the first time</li></ul><p></p><p></p><ul><li>Split/drop/Move/pickup functions only send data for the affected slots</li></ul><p></p><p></p><ul><li>client verifies data before a request is made reducing redundant server calls</li></ul><p></p><p></p><ul><li>server is only called if/when actions are taken not for redundant tasks such as open/close states</li></ul><p></p><p> </p><p><br /></p><p><b><strong>Inventory Item Types:</strong></b></p><p></p><ul><li>Currency</li></ul><p></p><p></p><ul><li>Stackable items</li></ul><p></p><p></p><ul><li>Non-stackable items</li></ul><p></p><p></p><ul><li>Equipable items</li></ul><p></p><p></p><ul><li>Food items</li></ul><p></p><p> </p><p><br /></p><p><b><strong>Inventory Item Functions(Menu System):</strong></b></p><p></p><ul><li>Split stack</li></ul><p></p><p></p><ul><li>Pickup item</li></ul><p></p><p></p><ul><li>Move item</li></ul><p></p><p></p><ul><li>Examine item</li></ul><p></p><p></p><ul><li>Drop item</li></ul><p></p><p> </p><p><b><strong>A Word On Adding Content:</strong></b><br /></p><p>One thing I've learnt over the years is that efficiency on the data layer is useless if it means the content layer suffers(learnt that the hard way), so with that in mind content additions are handles exclusively within a scope that a artist without code/scripting skills can master. A item addition requires a shape(.dae) used for world placement, a 2D inventory image(.png) of the item, and a datablock akin to a simple non-interactive spreadsheet.<br /></p><p>That is it, you do not need to even touch the codebase of the inventory system to fully interact with the content layer.<br /></p><p><br /></p><p><b><strong>A Word On System Customization:</strong></b><br /></p><p>One of my biggest pet peeves is when developers build cool systems as external resources(for any engine or data system) that are very specifically engineered to do one thing very well but if you want to modify them at all you might as well re-engineer the worlds power grid first as that would probably be simpler.<br /></p><p>With that in mind i wrote this resource to be adaptable through the dankest of data driven approaches, for example: Want the inventory on the left side instead? No problem just change $InvBase_PnlPos and your done, more inventory slots and rows? Just change $Inv_Rows, $Inv_NumBtns and $Inv_InventoryMaxSize and your good to go.<br /></p><p>It's easy to change things and it should be easy.<br /></p><p><br /></p><p><b><strong>A Word On Data Management:</strong></b><br /></p><p>You will notice that this resource uses a flat database as opposed to a more sophisticated separate database system for data handling. As i started this project i contemplated writing a database system to go with it and get some inter-server goodness going right of the bat for that sweet sweet efficiency. But limited time along with the fact that i was not gonna use the system myself made me lean towards a simpler solution, after all if you need a sophisticated database for your game then you probably already have a preference for a existing system.<br /></p><p><br /></p><p><b><strong>A Word On Client Login:</strong></b><br /></p><p>This inventory system does not sport a client login system, instead it simply uses the client player name to connect the player to the server side inventory, this is what we in the industry call a complete lack of security bordering the absurd. This is by design though as i wanted to avoid writing a login system as at that point this resource would land in the security sphere which i'm not really comfortable with for a public resource like this. So keep this in mind for your multiplayer projects, you need to connect your login system to the inventory where appropriate.<br /></p><p><br /></p><p><b><strong>Feedback:</strong></b><br /></p><p>If you decide to use this system for your project(s) and find some gaping flaw that i, in my infinite wisdom of course, overlooked completely i would very much appreciate if you would report back so i can break out the ol' shovel and get back in the trench to fix it.<br /></p><p><br /></p><p>Lastly if you have any questions feel free to reach out to me either in this thread, on discord, or twitter and i will do my best to help you out.<br /></p><p>Twitter: Zweshi<br /></p><p>Discord: Zweshi#0840<br /></p><p><br /></p><p>All the best and happy inventorying!<br /></p><p>- Jonas</p>]]></description><guid isPermaLink="false">1292</guid><pubDate>Fri, 09 Nov 2018 01:36:22 +0000</pubDate></item><item><title>Third Person Free Camera With Lock On REDUX</title><link>https://torque3d.org/forums/topic/7115-third-person-free-camera-with-lock-on-redux/</link><description><![CDATA[<p>
	This is the cleaned up version of the <a href="https://torque3d.org/forums/topic/7075-lock-on-target-camera-with-screenspace-oriented-movement/" rel="">previous "lock-on camera" resource</a> which I posted. It includes a check for client interpolation to try and synchronize with the server but I still feel it's not quite getting their somehow, but does clean up a lot of the target object and target shapeName jitter. Thanks to <a contenteditable="false" data-ipshover="" data-ipshover-target="https://torque3d.org/profile/12-azaezel/?do=hovercard" data-mentionid="12" href="https://torque3d.org/profile/12-azaezel/" id="ips_uid_4848_4" rel="">@Azaezel</a>for the tips.
</p>

<p>
	As for ease of use, the code below includes the <a href="https://torque3d.org/forums/topic/7065-elden-ringgta-third-person-free-camera-with-screenspace-movement" rel="">third person free camera resource</a> I wrote earlier which the lock-on system uses.
</p>

<p>
	Here's what it looks like in play:
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/8QXpMg2WYmU?feature=oembed" title="Multi Move Mode Rotate Lerp Test" width="200"></iframe>
	</div>
</div>

<p>
	<br>
	As ever, follow the comment tag "yorks" for changes.
</p>

<p>
	Player.h
</p>

<p>
	Inside "protected"
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="com">//...</span><span class="pln">
   </span><span class="typ">SimObjectPtr</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">&gt;</span><span class="pln"> mControlObject</span><span class="pun">;</span><span class="pln"> </span><span class="com">///&lt; Controlling object</span><span class="pln">

   </span><span class="typ">SimObjectPtr</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">&gt;</span><span class="pln"> mLockOn</span><span class="pun">;</span><span class="com">//yorks - gamebase/shapebase object id we are locked on to, this keeps the camera pointing at this object</span><span class="pln">

   </span><span class="com">/// @name Animation threads &amp; data</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	And then down the bottom under public: declare_conObject Player;
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="com">//...</span><span class="pln">
   </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> getControlObject</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//yorks block</span><span class="pln">
   F32 getLockOnHorizontal</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">);</span><span class="pln">
   F32 getLockOnVertical</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">);</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> setLockOn</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pln"> </span><span class="pun">*</span><span class="pln">obj</span><span class="pun">);</span><span class="pln">
   </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> getLockOn</span><span class="pun">();</span><span class="com">// { return (mLockOn); }</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> clearLockOn</span><span class="pun">();</span><span class="pln">
   
   </span><span class="com">//</span><span class="pln">
   </span><span class="kwd">void</span><span class="pln"> updateWorkingCollisionSet</span><span class="pun">();</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	On to player.cpp
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="com">//...</span><span class="pln">
</span><span class="typ">Player</span><span class="pun">::</span><span class="typ">Player</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mTypeMask </span><span class="pun">|=</span><span class="pln"> </span><span class="typ">PlayerObjectType</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">DynamicShapeObjectType</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
   dMemset</span><span class="pun">(</span><span class="pln"> mSplashEmitter</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln"> mSplashEmitter </span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// 0;//yorks for locking on a shapeBase/gameBase id</span><span class="pln">

   mUseHeadZCalc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="com">//..</span></pre>

<p>
	This is the part in UpdateMove, where I seperate activated lock-on, from my previous third person free camera resource.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">updateMove</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">*</span><span class="pln"> move</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">Move</span><span class="pln"> my_move</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
         setImageAltTriggerState</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">trigger</span><span class="pun">[</span><span class="pln">sImageTrigger1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="com">//yorks &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span class="pln">
   F32 camZ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="typ">GameConnection</span><span class="pun">*</span><span class="pln"> con </span><span class="pun">=</span><span class="pln"> getControllingClient</span><span class="pun">();</span><span class="pln">
   </span><span class="kwd">bool</span><span class="pln"> thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">con </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">con</span><span class="pun">-&gt;</span><span class="pln">isFirstPerson</span><span class="pun">())</span><span class="pln">
      thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="com">//yorks end &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><span class="pln">

   </span><span class="com">// Update current orientation</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  
</span><span class="com">//...</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">doStandardMove</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         F32 p </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">pitch </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintPitchScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> 
            p </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//mHead.x = mClampF(mHead.x + p,mDataBlock-&gt;minLookAngle,</span><span class="pln">
                          </span><span class="com">// mDataBlock-&gt;maxLookAngle);</span><span class="pln">

         F32 y </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">yaw </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintYawScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
            y </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

         </span><span class="com">//yorks start &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span class="pln">
         </span><span class="com">//if (((move-&gt;freeLook &amp;&amp; isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))//out no freelook now</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//if not default to first person stock code below</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//think we might need a check to see if mLockOn is a real thing?</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
                  setLockOn</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//yorks moved down here</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks added 0.5f to slow p down a bit</span><span class="pln">

               </span><span class="com">//let us run the camera around in a big old never ending circle</span><span class="pln">
               F32 camRot </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">);</span><span class="com">//slow y down a bit, techincally you should do this input script mouse sensitivity, also see p above</span><span class="pln">
               </span><span class="com">//constrain the range of camRot within pi*2</span><span class="pln">
               </span><span class="com">/*if (camRot &gt; M_PI_F)
                  camRot -= M_2PI_F;
               else if (camRot &lt; -M_PI_F)
                  camRot += M_2PI_F;*/</span><span class="pln">
               camRot </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camRot</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> camRot</span><span class="pun">;</span><span class="pln">
               </span><span class="com">// mHead.z = mClampF(mHead.z + y,</span><span class="pln">
                                 </span><span class="com">// -mDataBlock-&gt;maxFreelookAngle,</span><span class="pln">
                                 </span><span class="com">// mDataBlock-&gt;maxFreelookAngle);//yorks end</span><span class="pln">
               </span><span class="com">//Con::printf("camRot/mHead.z %f", camRot);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//yorks original code moved down here</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//note min-max angle is replaced with -/+M_HALFPI_F see pack/unpack</span><span class="pln">

            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
            </span><span class="com">// Rotate the head back to the front, center horizontal</span><span class="pln">
            </span><span class="com">// as well if we're controlling another object.</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="com">//yorks end &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><span class="pln">

      </span><span class="com">// constrain the range of mRot.z</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
</span><span class="com">//...</span><span class="pln">

    </span><span class="com">//yorks remove the entire statement which deals with movement speed and direction and replace with this</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">MoveState</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">RecoverState</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">recoverRunForceScale </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">))</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isAnimationLocked</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      F32 yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="com">//yorks start</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">GameBase</span><span class="pun">*</span><span class="pln"> cam </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">-&gt;</span><span class="pln">getCameraObject</span><span class="pun">();</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cam</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//get the camera's transform</span><span class="pln">
            F32 pos </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="typ">MatrixF</span><span class="pln"> camTrans</span><span class="pun">;</span><span class="pln">
            cam</span><span class="pun">-&gt;</span><span class="pln">getCameraTransform</span><span class="pun">(&amp;</span><span class="pln">pos</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">camTrans</span><span class="pun">);</span><span class="pln">

            </span><span class="com">//flatten the transform to X&amp;Y (so when the camera</span><span class="pln">
            </span><span class="com">//is facing up/down the move remains horizontal)</span><span class="pln">
            camTrans</span><span class="pun">[</span><span class="lit">9</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="pln">

            </span><span class="com">//create a move vector and multiply by the camera transform</span><span class="pln">
            </span><span class="typ">VectorF</span><span class="pln"> temp</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">mulV</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// get the z rotation of the camera for working with right stick aiming - don't need this here but have it for debugging below</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> camTrans</span><span class="pun">.</span><span class="pln">toEuler</span><span class="pun">().</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camZ </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
               camZ </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

            </span><span class="com">// Constrain the range of camZ within pi*2</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camZ</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">))</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">)))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// This is make the player turn towards the direction that they are moving</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> transVec </span><span class="pun">=</span><span class="pln"> getTransform</span><span class="pun">().</span><span class="pln">getForwardVector</span><span class="pun">();</span><span class="pln"> </span><span class="com">//getVelocity();</span><span class="pln">

               F32 tran </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">transVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> transVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tran </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  tran </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mWrapF</span><span class="pun">(</span><span class="pln">tran</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="pln">

               F32 moveDir </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">getVelocity</span><span class="pun">().</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> getVelocity</span><span class="pun">().</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">moveDir </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  moveDir </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               yawDiff </span><span class="pun">=</span><span class="pln"> moveDir </span><span class="pun">-</span><span class="pln"> tran</span><span class="pun">;</span><span class="pln">
              
               </span><span class="com">//ignore very small rotations</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.005f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.005f</span><span class="pun">)</span><span class="com">//yorks now less than a third of 1 degree//0.001f)//</span><span class="pln">
                  yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">))</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  F32 slower</span><span class="pun">;</span><span class="com">//slower exists to slow the turn down</span><span class="pln">
                  slower </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.15f</span><span class="pun">;</span><span class="pln">

                  mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> yawDiff</span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="com">//the camera is still attached to the player so we need to compensate for the player's new rotation</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               F32 testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
               testVal </span><span class="pun">=</span><span class="pln"> getLockOnHorizontal</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln">testVal</span><span class="pun">;</span><span class="pln">
               </span><span class="com">//----------------------</span><span class="pln">
               F32 headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
               headV </span><span class="pun">=</span><span class="pln"> getLockOnVertical</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+=</span><span class="pln"> headV</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
        
         F32 dirSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.785f</span><span class="pun">)</span><span class="com">//0-45deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5.497f</span><span class="pun">)</span><span class="com">//315-360deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.784f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2.356f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//secSpeed = mDataBlock-&gt;maxSideSpeed;</span><span class="pln">
            </span><span class="com">//Con::printf("side right 0.784-2.356; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5.496f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3.926f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         moveSpeed </span><span class="pun">=</span><span class="pln"> dirSpeed</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
      </span><span class="pun">{</span><span class="com">//yorks original movement code below</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintStrafeScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">));</span><span class="pln">
         </span><span class="typ">VectorF</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">tv</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">+=</span><span class="pln"> tv </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">;</span><span class="pln">

         </span><span class="com">// Clamp water movement</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">

            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="com">//yorks added to segregate original code from freecam </span><span class="pln">

      </span><span class="com">// Cancel any script driven animations if we are going to move.</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">moveVec</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">z </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
          </span><span class="pun">(</span><span class="pln">mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NumTableActionAnims</span><span class="pln">
               </span><span class="pun">||</span><span class="pln"> mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">LandAnim</span><span class="pun">))</span><span class="pln">
         mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NullAnimation</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="com">//this is all stock code down here</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      moveVec</span><span class="pun">.</span><span class="typ">set</span><span class="pun">(</span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">);</span><span class="pln">
      moveSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
     </span></pre>

<p>
	Okidoki, time to actually get the data from server to client with write/read Packets.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
  
</span><span class="com">//...</span><span class="pln">
   </span><span class="com">//yorks, at the bottom</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> connection</span><span class="pun">-&gt;</span><span class="pln">getGhostIndex</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="pln">ghost </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
         stream</span><span class="pun">-&gt;</span><span class="pln">writeRangedU32</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="com">//yorks end</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
  
   </span><span class="com">//yorks at the bottom</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">readFlag</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readRangedU32</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> lock </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">static_cast</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">*&gt;(</span><span class="pln">connection</span><span class="pun">-&gt;</span><span class="pln">resolveGhost</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">));</span><span class="com">//static_cast as we have a check for shapebase object when we assign it</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> lock</span><span class="pun">;</span><span class="com">// setLockOn(lock);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// setLockOn(NULL);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	Whilst doing all of this I decided to make some changes to pack/unpack - mostly because the new third person free camera is not limited by the player datablocks freeview settings.
</p>

<p>
	I also tried to pack/unpack the mLockOn ghost, but it always returned -1, so I gave that up as a bad job ...<img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f937-200d-2642-fe0f.png" class="ipsEmoji" alt="🤷‍♂️">
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="pln">U32 </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">packUpdate</span><span class="pun">(</span><span class="typ">NetConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">con</span><span class="pun">,</span><span class="pln"> U32 mask</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   U32 retMask </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">packUpdate</span><span class="pun">(</span><span class="pln">con</span><span class="pun">,</span><span class="pln"> mask</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
           </span><span class="com">// constrain the range of mRot.z</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&gt;</span><span class="pln"> M_2PI_F</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">


      </span><span class="pun">}</span><span class="pln">
      </span><span class="com">//stream-&gt;writeFloat(mRot.x / M_PI_F, 7);//yorks? nah with delay turn it jitters</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFloat</span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">/</span><span class="pln"> M_2PI_F</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">);</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeSignedFloat</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">/</span><span class="pln"> </span><span class="pun">(-</span><span class="pln">M_HALFPI_F </span><span class="pun">-</span><span class="pln"> M_HALFPI_F</span><span class="pun">),</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="com">//yorks//(mDataBlock-&gt;maxLookAngle - mDataBlock-&gt;minLookAngle), 6);</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeSignedFloat</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">/</span><span class="pln"> M_2PI_F</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="com">//yorks//mDataBlock-&gt;maxFreelookAngle, 6);</span><span class="pln">
	  mDelta</span><span class="pun">.</span><span class="pln">move</span><span class="pun">.</span><span class="pln">pack</span><span class="pun">(</span><span class="pln">stream</span><span class="pun">);</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(!(</span><span class="pln">mask </span><span class="pun">&amp;</span><span class="pln"> </span><span class="typ">NoWarpMask</span><span class="pun">));</span><span class="pln">
</span><span class="com">//...</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">unpackUpdate</span><span class="pun">(</span><span class="typ">NetConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">con</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">unpackUpdate</span><span class="pun">(</span><span class="pln">con</span><span class="pun">,</span><span class="pln">stream</span><span class="pun">);</span><span class="pln">
</span><span class="com">//...</span><span class="pln">
        rot</span><span class="pun">.</span><span class="pln">y </span><span class="pun">=</span><span class="pln"> rot</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
      </span><span class="com">//rot.y = 0.0f;//yorks</span><span class="pln">
      </span><span class="com">//rot.x = stream-&gt;readFloat(7) * M_PI_F;//yorks ?nah with delay turn it jitters</span><span class="pln">
      rot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readFloat</span><span class="pun">(</span><span class="lit">7</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
      mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readSignedFloat</span><span class="pun">(</span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(-</span><span class="pln">M_HALFPI_F </span><span class="pun">-</span><span class="pln"> M_HALFPI_F</span><span class="pun">);</span><span class="com">//yorks// (mDataBlock-&gt;maxLookAngle - mDataBlock-&gt;minLookAngle);</span><span class="pln">
      mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readSignedFloat</span><span class="pun">(</span><span class="lit">6</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="com">//yorks// mDataBlock-&gt;maxFreelookAngle;</span><span class="pln">
	  mDelta</span><span class="pun">.</span><span class="pln">move</span><span class="pun">.</span><span class="pln">unpack</span><span class="pun">(</span><span class="pln">stream</span><span class="pun">);</span><span class="pln">

     mDelta</span><span class="pun">.</span><span class="pln">head </span><span class="pun">=</span><span class="pln">  mHead</span><span class="pun">;</span><span class="pln">
	  mDelta</span><span class="pun">.</span><span class="pln">headVec</span><span class="pun">.</span><span class="typ">set</span><span class="pun">(</span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//...</span></pre>

<p>
	Right at the bottom of Player.cpp and all the following:
</p>

<p>
	I split up the maths for getting hold of the horizontal and vertical camera when locked on.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="com">//yorks start to end of file</span><span class="pln">
F32 </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOnHorizontal</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="com">//face to look at the object's center - no look at it's base to keep the camera higher</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> centerLock </span><span class="pun">=</span><span class="pln"> mLockOn</span><span class="pun">-&gt;</span><span class="pln">getPosition</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//get the vector from us to the target and break it down to x (up/down) and z horizontal rotation</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> ourCenter </span><span class="pun">=</span><span class="pln"> getBoxCenter</span><span class="pun">();</span><span class="com">// use our center to their base for additional vert rotation</span><span class="pln">
   </span><span class="typ">VectorF</span><span class="pln"> lookAtVec </span><span class="pun">=</span><span class="pln"> centerLock </span><span class="pun">-</span><span class="pln"> ourCenter</span><span class="pun">;</span><span class="pln">
   lookAtVec</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="com">//just in case</span><span class="pln">

   </span><span class="com">//get the angle in radians and then invert it as we want to be at the far side of our player --- apparently doesn't need inverting</span><span class="pln">
   F32 viewRad </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   viewRad </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">lookAtVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> lookAtVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
   viewRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">viewRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

   F32 totalRad </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
   totalRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

   F32 testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   testVal </span><span class="pun">=</span><span class="pln"> viewRad </span><span class="pun">-</span><span class="pln"> totalRad</span><span class="pun">;</span><span class="pln">

   </span><span class="com">//ignore very small rotations</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.001f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.001f</span><span class="pun">)</span><span class="com">//yorks //0.017f = 1 degree; 0.005f = 0.2864789 of 1 degree//0.001f</span><span class="pln">
      testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">))</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

      </span><span class="com">//testVal = mWrapF(testVal, 0.0f, M_2PI_F);//this is not the fast turn above!!!! Must not have this for interlope</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">)</span><span class="com">//stagger the turn if large</span><span class="pln">
         testVal </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">testVal </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">)</span><span class="pln">
         testVal </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="kwd">return</span><span class="pln"> testVal</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

F32 </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOnVertical</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="com">//face to look at the object's center - no look at it's base to keep the camera higher</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> centerLock </span><span class="pun">=</span><span class="pln"> mLockOn</span><span class="pun">-&gt;</span><span class="pln">getPosition</span><span class="pun">();</span><span class="pln">

   </span><span class="com">//get the vector from us to the target and break it down to x (up/down) and z horizontal rotation</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> ourCenter </span><span class="pun">=</span><span class="pln"> getBoxCenter</span><span class="pun">();/</span><span class="pln">use our center to their base </span><span class="kwd">for</span><span class="pln"> additional vert rotation
   </span><span class="typ">VectorF</span><span class="pln"> lookAtVec </span><span class="pun">=</span><span class="pln"> centerLock </span><span class="pun">-</span><span class="pln"> ourCenter</span><span class="pun">;</span><span class="pln">
   lookAtVec</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="com">//just in case ;)</span><span class="pln">

   </span><span class="com">//mHead.x = mWrapF(mHead.x, -M_HALFPI_F, M_HALFPI_F);lock it between half -Pi (-1.57) and half +Pi (+1.57)think it works better without</span><span class="pln">
   F32 vertZ</span><span class="pun">;</span><span class="pln">
   F32 headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   F32 lenTo </span><span class="pun">=</span><span class="pln"> lookAtVec</span><span class="pun">.</span><span class="pln">len</span><span class="pun">();</span><span class="com">// len() or lenSquared() ?</span><span class="pln">
   vertZ </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">lookAtVec</span><span class="pun">.</span><span class="pln">z</span><span class="pun">),</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">lenTo</span><span class="pun">));</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">ourCenter</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> centerLock</span><span class="pun">.</span><span class="pln">z</span><span class="pun">)</span><span class="pln">
      vertZ </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">;</span><span class="pln">
   vertZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">vertZ</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">,</span><span class="pln"> M_HALFPI_F</span><span class="pun">);</span><span class="com">//yorks use the new method - lock it between half -Pi (-1.57) and half +Pi (+1.57)</span><span class="pln">
  
   F32 totalRad </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">x</span><span class="pun">;</span><span class="com">//mRot.x should be zero</span><span class="pln">
   totalRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">,</span><span class="pln"> M_HALFPI_F</span><span class="pun">);</span><span class="pln">

   headV </span><span class="pun">=</span><span class="pln"> vertZ </span><span class="pun">-</span><span class="pln"> totalRad</span><span class="pun">;</span><span class="pln">

   </span><span class="com">//ignore very small rotations</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.001f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.001f</span><span class="pun">)</span><span class="com">//yorks //0.017f = 1 degree; 0.005f = 0.2864789 of 1 degree//0.001f</span><span class="pln">
      headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">headV</span><span class="pun">))</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&gt;</span><span class="pln"> M_HALFPI_F</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">-=</span><span class="pln"> M_PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_HALFPI_F</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">+=</span><span class="pln"> M_PI_F</span><span class="pun">;</span><span class="pln">

      </span><span class="com">//headV = mWrapF(headV, -M_HALFPI_F, M_HALFPI_F);//&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;this is not the above fast turn!!!! Must not have this for interlope</span><span class="pln">
     
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">)</span><span class="com">//stagger the turn if large</span><span class="pln">
         headV </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">headV </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">)</span><span class="pln">
         headV </span><span class="pun">=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.05f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> headV</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	And then the rest of the relevant lockon functions.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pln"> </span><span class="pun">*</span><span class="pln">obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn no obj or not shapebase"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj not properly added"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">getDamageStateName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"Enabled"</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj dead"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">bool</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">))</span><span class="com">//Az thought this might help</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         clearProcessAfter</span><span class="pun">();</span><span class="pln">
         clearNotify</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> obj</span><span class="pun">;</span><span class="com">//set the lockOn object</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">bool</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">))/</span><span class="typ">Az</span><span class="pln"> thought </span><span class="kwd">this</span><span class="pln"> might help
      </span><span class="pun">{</span><span class="pln">
         processAfter</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
         deleteNotify</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> mLockOn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">clearLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> setLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pln"> </span><span class="pun">*</span><span class="pln">obj</span><span class="pun">),</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="str">"set lockOn target object"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
     object</span><span class="pun">-&gt;</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> getLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ShapeBase</span><span class="pun">*,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Get player's lock on object. return 0 if no lockOn."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> object</span><span class="pun">-&gt;</span><span class="pln">getLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> clearLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Clear player's lock on object."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   object</span><span class="pun">-&gt;</span><span class="pln">clearLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	And finally, and the bit that I'm really not sure about ... is getting client side predication to stop jitter. So we go all the way back up the file to interpolateTick.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted"><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">interpolateTick</span><span class="pun">(</span><span class="pln">F32 dt</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln">
      mControlObject</span><span class="pun">-&gt;</span><span class="pln">interpolateTick</span><span class="pun">(</span><span class="pln">dt</span><span class="pun">);</span><span class="pln">

   </span><span class="com">// Client side interpolation</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">interpolateTick</span><span class="pun">(</span><span class="pln">dt</span><span class="pun">);</span><span class="pln">

  </span><span class="com">//yorks start &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span><span class="pln">
   </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> targetObj </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">static_cast</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">*&gt;(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="com">//in tick seems to work best here, bad above or below</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">bool</span><span class="pun">)</span><span class="pln">targetObj </span><span class="pun">&amp;&amp;</span><span class="pln"> isFirstPerson</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="com">//enters the shadow realm in fps so we need the safety</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="com">//this orientates movement to the target and camera follows - hopefully</span><span class="pln">
      F32 horz</span><span class="pun">,</span><span class="pln"> vert</span><span class="pun">;</span><span class="pln">
      vert </span><span class="pun">=</span><span class="pln"> getLockOnVertical</span><span class="pun">(</span><span class="pln">targetObj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> dt</span><span class="pun">;</span><span class="pln">
      horz </span><span class="pun">=</span><span class="pln"> getLockOnHorizontal</span><span class="pun">(</span><span class="pln">targetObj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> dt</span><span class="pun">;</span><span class="pln">
      </span><span class="com">//mDelta.head.x += vert;// mWrapF(vert, -M_HALFPI_F, M_HALFPI_F);</span><span class="pln">
      </span><span class="com">//mDelta.head.z += horz;// mWrapF(horz, 0.0f, M_2PI_F);</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">horz </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> vert </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="com">//Con::printf("interpolateTick 1: mDelta.head %f %f %f;", mDelta.head.x, mDelta.head.y, mDelta.head.z);</span><span class="pln">
         mDelta</span><span class="pun">.</span><span class="pln">head </span><span class="pun">+=</span><span class="pln"> </span><span class="typ">Point3F</span><span class="pun">(</span><span class="pln">vert</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> horz</span><span class="pun">);</span><span class="pln">
         </span><span class="com">//Con::printf("interpolateTick 2: mDelta.head %f %f %f;", mDelta.head.x, mDelta.head.y, mDelta.head.z);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">

      </span><span class="com">//targePos += (targePos - delta.targePos) * dt ????example but I'm not using the actual positions</span><span class="pln">
      </span><span class="com">//mDelta.head = (targetObj-&gt;getPosition() - getBoxCenter()) * dt;//lol no</span><span class="pln">
   </span><span class="pun">}</span><span class="com">//yorks end &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><span class="pln">

   </span><span class="typ">Point3F</span><span class="pln"> pos </span><span class="pun">=</span><span class="pln"> mDelta</span><span class="pun">.</span><span class="pln">pos </span><span class="pun">+</span><span class="pln"> mDelta</span><span class="pun">.</span><span class="pln">posVec </span><span class="pun">*</span><span class="pln"> dt</span><span class="pun">;</span><span class="pln">
   </span><span class="typ">Point3F</span><span class="pln"> rot </span><span class="pun">=</span><span class="pln"> mDelta</span><span class="pun">.</span><span class="pln">rot </span><span class="pun">+</span><span class="pln"> mDelta</span><span class="pun">.</span><span class="pln">rotVec </span><span class="pun">*</span><span class="pln"> dt</span><span class="pun">;</span><span class="pln">
</span><span class="com">//...</span></pre>

<p>
	So, there it is, hopefully it helps someone.
</p>
]]></description><guid isPermaLink="false">7115</guid><pubDate>Tue, 07 Mar 2023 20:59:26 +0000</pubDate></item><item><title>Lock-On Target Camera With ScreenSpace Oriented Movement</title><link>https://torque3d.org/forums/topic/7075-lock-on-target-camera-with-screenspace-oriented-movement/</link><description><![CDATA[<p>
	This is a continuation of the Elden Ring/GTA/Sleeping Dogs (the only one I have actually played) screenSpace movement resource that I added <a href="https://torque3d.org/forums/topic/7065-elden-ringgta-third-person-free-camera-with-screenspace-movement/" rel="">here</a>.
</p>

<p>
	The camera locks on a target and then follows it, the code presented here is my initial test case and moves slower than the player movement so you can see that the camera orientates correctly, this makes it look janky as hell.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/qXQ0660xNhg?feature=oembed" title="Lock On Target Camera ScreenSpace Movement" width="200"></iframe>
	</div>
</div>

<p>
	Warning: this code was written at some god-forsaken time when my brain had died and is fugly as hell, feel free to pretty it up, also there is no X (vertical) axis.
</p>

<p>
	Code: Player.cpp and Player.h
</p>

<p>
	Player.h
</p>

<p>
	Somewhere under protected ...
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3974_7" style=""><span class="pln">   //...
SimObjectPtr</span><span class="tag">&lt;ShapeBase&gt;</span><span class="pln"> mControlObject; ///&lt; Controlling object

   SimObjectPtr</span><span class="tag">&lt;ShapeBase&gt;</span><span class="pln"> mLockOn;//yorks - gamebase/shapebase object id we are locked on to, this keeps the camera pointing at this object

   /// @name Animation threads &amp; data
     //...</span></pre>

<p>
	And then way down under public ...
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3974_9" style=""><span class="pln">//...
   ShapeBase* getControlObject();

   //yorks
   ShapeBase* getLockOn();// { return (mLockOn); }
   void setLockOn(ShapeBase *obj);
   void clearLockOn();
   //yorks end
   
   //
   void updateWorkingCollisionSet();
//...</span></pre>

<p>
	Player.cpp
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3974_11" style=""><span class="com">//...</span><span class="pln">
</span><span class="typ">Player</span><span class="pun">::</span><span class="typ">Player</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mTypeMask </span><span class="pun">|=</span><span class="pln"> </span><span class="typ">PlayerObjectType</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">DynamicShapeObjectType</span><span class="pun">;</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
  
     dMemset</span><span class="pun">(</span><span class="pln"> mSplashEmitter</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">sizeof</span><span class="pun">(</span><span class="pln"> mSplashEmitter </span><span class="pun">)</span><span class="pln"> </span><span class="pun">);</span><span class="pln">

   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// 0;//yorks for locking on a shapeBase/gameBase id</span><span class="pln">

   mUseHeadZCalc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
  
</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">updateMove</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">*</span><span class="pln"> move</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
  
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">doStandardMove</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         F32 p </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">pitch </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintPitchScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> 
            p </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//mHead.x = mClampF(mHead.x + p,mDataBlock-&gt;minLookAngle,</span><span class="pln">
                          </span><span class="com">// mDataBlock-&gt;maxLookAngle);</span><span class="pln">

         F32 y </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">yaw </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintYawScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
            y </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

         </span><span class="com">//yorks start - this is my older camera screen space code; see link in forum post above!</span><span class="pln">
         </span><span class="com">//if (((move-&gt;freeLook &amp;&amp; isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="com">//yorks - this is the new stuff!!!!!! we check to make sure it's still a good target</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//think we might need a check to see if mLockOn is a real thing? Safety first!</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
                  setLockOn</span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">);</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//yorks moved down here</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks added 0.5f to slow p down a bit</span><span class="pln">
              </span><span class="com">//...</span><span class="pln">
              
</span><span class="com">//in the middle of the previous screenSpace move code</span><span class="pln">
              </span><span class="com">//...</span><span class="pln">
                  mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> yawDiff</span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="com">//the camera is still attached to the player so we need to compensate for the player's new rotation</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="com">//yorks this is the new lockon code &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; beware fugly sleep deprivation</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//face to look at the object's center</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> centerLock </span><span class="pun">=</span><span class="pln"> mLockOn</span><span class="pun">-&gt;</span><span class="pln">getBoxCenter</span><span class="pun">();</span><span class="com">// getWorldBox().getCenter();</span><span class="pln">

               </span><span class="com">//get the vector from us to the target and break it down to x (up/down) and z horizontal rotation</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> ourCenter </span><span class="pun">=</span><span class="pln"> getBoxCenter</span><span class="pun">();</span><span class="com">// getWorldBox().getCenter();</span><span class="pln">
               </span><span class="typ">VectorF</span><span class="pln"> lookAtVec </span><span class="pun">=</span><span class="pln"> centerLock </span><span class="pun">-</span><span class="pln"> ourCenter</span><span class="pun">;</span><span class="pln">
               lookAtVec</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="com">//just in case</span><span class="pln">

               </span><span class="com">//get the angle in radians and then invert it as we want to be at the far side of our player --- apparently doesn't need inverting</span><span class="pln">
               F32 viewRad </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

               viewRad </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">lookAtVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> lookAtVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="com">//</span><span class="pln">
               viewRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">viewRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

               F32 totalRad </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
               F32 testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="com">// 0.0f;</span><span class="pln">
               totalRad </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
               </span><span class="com">//Con::printf("viewRad %f; mHead.z %f; mRot.z %f, totalRad %f", viewRad, mHead.z, mRot.z, totalRad);</span><span class="pln">

               </span><span class="com">//works but god it's fugly</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">totalRad </span><span class="pun">&gt;=</span><span class="pln"> viewRad</span><span class="pun">)</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">))</span><span class="pln">
                     testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="com">// 0.0f;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln">
                  </span><span class="pun">{</span><span class="pln">
                     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                     </span><span class="pun">{</span><span class="pln">
                        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">+</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> totalRad</span><span class="pun">)</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        </span><span class="kwd">else</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        testVal </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
                        </span><span class="com">//Con::printf("viewRad LESS totalRad; += 0.02f; mHead.z = %f; viewRad = %f; totalRad %f;", mHead.z, viewRad, totalRad);</span><span class="pln">
                     </span><span class="pun">}</span><span class="pln">
                     </span><span class="kwd">else</span><span class="pln">
                     </span><span class="pun">{</span><span class="pln">
                        </span><span class="kwd">if</span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">+</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> totalRad</span><span class="pun">)</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        </span><span class="kwd">else</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        testVal </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
                        </span><span class="com">//Con::printf("viewRad LESS totalRad; -= 0.02f; mHead.z = %f; viewRad = %f; totalRad %f;", mHead.z, viewRad, totalRad);</span><span class="pln">
                     </span><span class="pun">}</span><span class="pln">
                  </span><span class="pun">}</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
               </span><span class="kwd">else</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">totalRad</span><span class="pun">))</span><span class="pln">
                     testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="com">// 0.0f;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln">
                  </span><span class="pun">{</span><span class="pln">
                     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> M_2PI_F</span><span class="pun">)</span><span class="pln">
                     </span><span class="pun">{</span><span class="pln">
                        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">+</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> totalRad</span><span class="pun">)</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        </span><span class="kwd">else</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        testVal </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
                        </span><span class="com">//Con::printf("viewRad MORE totalRad; -= 0.02f; mHead.z = %f; viewRad = %f; totalRad %f;", mHead.z, viewRad, totalRad);</span><span class="pln">
                     </span><span class="pun">}</span><span class="pln">
                     </span><span class="kwd">else</span><span class="pln">
                     </span><span class="pun">{</span><span class="pln">
                        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">viewRad </span><span class="pun">-</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> totalRad</span><span class="pun">)</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        </span><span class="kwd">else</span><span class="pln">
                           testVal </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0.02f</span><span class="pun">;</span><span class="pln">
                        testVal </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">testVal</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
                        </span><span class="com">//Con::printf("viewRad MORE totalRad; += 0.02f; mHead.z = %f; viewRad = %f; totalRad %f;", mHead.z, viewRad, totalRad);</span><span class="pln">
                     </span><span class="pun">}</span><span class="pln">
                  </span><span class="pun">}</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> testVal</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//yorks note; you can remove this and put it all under the above if(thirdP) from the other code snippet if you want</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="com">//get facing movement direction as yawDiff</span><span class="pln">
         F32 dirSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//F32 secSpeed = 0.0f;</span><span class="pln">
  
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.785f</span><span class="pun">)</span><span class="com">//0-45deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
           </span><span class="com">//...</span><span class="pln">
           
</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//..</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      S32 gIndex </span><span class="pun">=</span><span class="pln"> connection</span><span class="pun">-&gt;</span><span class="pln">getGhostIndex</span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="pln">gIndex </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
         stream</span><span class="pun">-&gt;</span><span class="pln">writeInt</span><span class="pun">(</span><span class="pln">gIndex</span><span class="pun">,</span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">GhostIdBitSize</span><span class="pun">);</span><span class="pln">
         mControlObject</span><span class="pun">-&gt;</span><span class="pln">writePacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="pln">

   </span><span class="com">//yorks</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mLockOn</span><span class="pun">.</span><span class="pln">isNull</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> connection</span><span class="pun">-&gt;</span><span class="pln">getGhostIndex</span><span class="pun">(</span><span class="pln">mLockOn</span><span class="pun">);</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="pln">ghost </span><span class="pun">!=</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
         stream</span><span class="pun">-&gt;</span><span class="pln">writeRangedU32</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      stream</span><span class="pun">-&gt;</span><span class="pln">writeFlag</span><span class="pun">(</span><span class="kwd">false</span><span class="pun">);</span><span class="com">//yorks end</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

oid </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="typ">GameConnection</span><span class="pln"> </span><span class="pun">*</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BitStream</span><span class="pln"> </span><span class="pun">*</span><span class="pln">stream</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="typ">Parent</span><span class="pun">::</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
  
        obj</span><span class="pun">-&gt;</span><span class="pln">readPacketData</span><span class="pun">(</span><span class="pln">connection</span><span class="pun">,</span><span class="pln"> stream</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      setControlObject</span><span class="pun">(</span><span class="lit">0</span><span class="pun">);</span><span class="pln">

   </span><span class="com">//yorks</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">stream</span><span class="pun">-&gt;</span><span class="pln">readFlag</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      S32 ghost </span><span class="pun">=</span><span class="pln"> stream</span><span class="pun">-&gt;</span><span class="pln">readRangedU32</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="typ">NetConnection</span><span class="pun">::</span><span class="typ">MaxGhostCount</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> lock </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">static_cast</span><span class="pun">&lt;</span><span class="typ">ShapeBase</span><span class="pun">*&gt;(</span><span class="pln">connection</span><span class="pun">-&gt;</span><span class="pln">resolveGhost</span><span class="pun">(</span><span class="pln">ghost</span><span class="pun">));</span><span class="com">//static_cast as we have a check for shapebase object when we assign it</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> lock</span><span class="pun">;</span><span class="com">// setLockOn(lock);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="com">// setLockOn(NULL);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
        
</span><span class="com">//...</span><span class="pln">
        
</span><span class="com">//right at the bottom of the file and all of this</span><span class="pln">
        
</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pln"> </span><span class="pun">*</span><span class="pln">obj</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn no obj or not shapebase"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">isProperlyAdded</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj not properly added"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">obj</span><span class="pun">-&gt;</span><span class="pln">getDamageStateName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"Enabled"</span><span class="pun">)</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
      </span><span class="typ">Con</span><span class="pun">::</span><span class="pln">printf</span><span class="pun">(</span><span class="str">"setLockOn obj dead"</span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
      mLockOn </span><span class="pun">=</span><span class="pln"> obj</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">ShapeBase</span><span class="pun">*</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">getLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> mLockOn</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">clearLockOn</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   mLockOn </span><span class="pun">=</span><span class="pln"> NULL</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> setLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ShapeBase</span><span class="pln"> </span><span class="pun">*</span><span class="pln">obj</span><span class="pun">),</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="str">"set lockOn target object"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
     object</span><span class="pun">-&gt;</span><span class="pln">setLockOn</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> getLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="typ">ShapeBase</span><span class="pun">*,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Get player's lock on object. return NULL if no lockOn."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">return</span><span class="pln"> object</span><span class="pun">-&gt;</span><span class="pln">getLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">DefineEngineMethod</span><span class="pun">(</span><span class="typ">Player</span><span class="pun">,</span><span class="pln"> clearLockOnTarget</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">void</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(),</span><span class="pln"> </span><span class="pun">,</span><span class="pln">
   </span><span class="str">"@brief Clear player's lock on object."</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   object</span><span class="pun">-&gt;</span><span class="pln">clearLockOn</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	So there you have it, lock-on camera with screenSpace movement (and a delay which was part of debugging). Remember you need the code for screenSpace input movement first, which can be found <a href="https://torque3d.org/forums/topic/7065-elden-ringgta-third-person-free-camera-with-screenspace-movement/" rel="">here</a>.
</p>
]]></description><guid isPermaLink="false">7075</guid><pubDate>Tue, 28 Feb 2023 19:18:38 +0000</pubDate></item><item><title>Elden Ring/GTA Third Person Free Camera With ScreenSpace Movement</title><link>https://torque3d.org/forums/topic/7065-elden-ringgta-third-person-free-camera-with-screenspace-movement/</link><description><![CDATA[<p>
	After my previous Third Person camera movement system which I have edited to label as a <a href="https://torque3d.org/forums/topic/7061-shooter-style-third-person-camera-orientated-movement/" rel="">shooter style</a>, I decided to expand it and make an actual Elden Ring/GTA/Sleeping Dogs (the last one I actually have played) style third person free camera with screenSpace based movement input; eg: move left makes the player move screen left. The player also turns to face the direction that they are moving in. In the video this is exaggerated by having side and backwards speed set very low and forward speed set very high. Standard code of Move-&gt;x and Move-&gt;y are not taken into account and movement speed is based purely on player datablock move speeds and I didn't include "prone" as a pose.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/spIr5v1p2Go?feature=oembed" title="Elden Ring Style Third Person Camera Movement With Independant Rotation" width="200"></iframe>
	</div>
</div>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5222_7" style=""><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">updateMove</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">*</span><span class="pln"> move</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
   </span><span class="kwd">struct</span><span class="pln"> </span><span class="typ">Move</span><span class="pln"> my_move</span><span class="pun">;</span><span class="pln">
  
   </span><span class="com">//...</span><span class="pln">
  
         setImageAltTriggerState</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">trigger</span><span class="pun">[</span><span class="pln">sImageTrigger1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="com">//yorks</span><span class="pln">
   F32 camZ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="typ">GameConnection</span><span class="pun">*</span><span class="pln"> con </span><span class="pun">=</span><span class="pln"> getControllingClient</span><span class="pun">();</span><span class="pln">
   </span><span class="kwd">bool</span><span class="pln"> thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">con </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">con</span><span class="pun">-&gt;</span><span class="pln">isFirstPerson</span><span class="pun">())</span><span class="pln">
      thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="com">//yorks end</span><span class="pln">

   </span><span class="com">// Update current orientation</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     
     </span><span class="com">//...</span><span class="pln">
     
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">doStandardMove</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         F32 p </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">pitch </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintPitchScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> 
            p </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//mHead.x = mClampF(mHead.x + p,mDataBlock-&gt;minLookAngle,</span><span class="pln">
                          </span><span class="com">// mDataBlock-&gt;maxLookAngle);//yorks out</span><span class="pln">

         F32 y </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">yaw </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintYawScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
            y </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

         </span><span class="com">//yorks start</span><span class="pln">
         </span><span class="com">//if (((move-&gt;freeLook &amp;&amp; isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//yorks moved down here</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks added 0.5f to slow p down a bit</span><span class="pln">

               </span><span class="com">//let us run the camera around in a big old never ending circle</span><span class="pln">
               F32 camRot </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">);</span><span class="com">//slow y down a bit, techincally you should do this input script mouse sensitivity, also see p above</span><span class="pln">
               </span><span class="com">//constrain the range of camRot within pi*2</span><span class="pln">
               </span><span class="com">/*if (camRot &gt; M_PI_F)
                  camRot -= M_2PI_F;
               else if (camRot &lt; -M_PI_F)
                  camRot += M_2PI_F;*/</span><span class="pln">
               camRot </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camRot</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> camRot</span><span class="pun">;</span><span class="pln">
               </span><span class="com">// mHead.z = mClampF(mHead.z + y,</span><span class="pln">
                                 </span><span class="com">// -mDataBlock-&gt;maxFreelookAngle,</span><span class="pln">
                                 </span><span class="com">// mDataBlock-&gt;maxFreelookAngle);//yorks end</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//yorks moved down here</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks added 0.5f to slow p down a bit</span><span class="pln">

            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
            </span><span class="com">// Rotate the head back to the front, center horizontal</span><span class="pln">
            </span><span class="com">// as well if we're controlling another object.</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
     
     </span><span class="com">//...</span><span class="pln">
     
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">MoveState</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">RecoverState</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">recoverRunForceScale </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">))</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isAnimationLocked</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      F32 yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">GameBase</span><span class="pun">*</span><span class="pln"> cam </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">-&gt;</span><span class="pln">getCameraObject</span><span class="pun">();</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cam</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//get the camera's transform</span><span class="pln">
            F32 pos </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="typ">MatrixF</span><span class="pln"> camTrans</span><span class="pun">;</span><span class="pln">
            cam</span><span class="pun">-&gt;</span><span class="pln">getCameraTransform</span><span class="pun">(&amp;</span><span class="pln">pos</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">camTrans</span><span class="pun">);</span><span class="pln">

            </span><span class="com">//flatten the transform to X&amp;Y (so when the camera</span><span class="pln">
            </span><span class="com">//is facing up/down the move remains horizontal)</span><span class="pln">
            camTrans</span><span class="pun">[</span><span class="lit">9</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="pln">

            </span><span class="com">//create a move vector and multiply by the camera transform</span><span class="pln">
            </span><span class="typ">VectorF</span><span class="pln"> temp</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">mulV</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// get the z rotation of the camera for working with right stick aiming</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> camTrans</span><span class="pun">.</span><span class="pln">toEuler</span><span class="pun">().</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camZ </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
               camZ </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

            </span><span class="com">//Con::printf("Camz %f", camZ);</span><span class="pln">

            </span><span class="com">// Constrain the range of camZ within pi*2</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camZ</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
 
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">))</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">)))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
                </span><span class="com">// This is make the player turn towards the direction that they are moving</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> transVec </span><span class="pun">=</span><span class="pln"> getTransform</span><span class="pun">().</span><span class="pln">getForwardVector</span><span class="pun">();</span><span class="pln"> 

               F32 tran </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">transVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> transVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tran </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  tran </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mWrapF</span><span class="pun">(</span><span class="pln">tran</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="pln">

               F32 moveDir </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">getVelocity</span><span class="pun">().</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> getVelocity</span><span class="pun">().</span><span class="pln">y</span><span class="pun">);</span><span class="com">//it's the x and y of player velocity we want</span><span class="pln">
               </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">moveDir </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  moveDir </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               yawDiff </span><span class="pun">=</span><span class="pln"> moveDir </span><span class="pun">-</span><span class="pln"> tran</span><span class="pun">;</span><span class="pln">

               </span><span class="com">//Con::printf("moveDir %f; tran %f; yawDiff %f", moveDir, tran, yawDiff);</span><span class="pln">

               </span><span class="com">//ignore very small rotations</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.005f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.005f</span><span class="pun">)</span><span class="com">//yorks now less than a third of 1 degree//0.001f)//</span><span class="pln">
                  yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">))</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
                  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

                  F32 slower</span><span class="pun">;</span><span class="com">//slower exists to slow the turn down</span><span class="pln">
                  slower </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.15f</span><span class="pun">;</span><span class="pln">

                  mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="com">//the camera is still attached to the player so we need to compensate for the player's new rotation</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">

      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//yorks this is broken up a bit for debug testing</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="com">//get facing movement direction as yawDiff</span><span class="pln">
         F32 dirSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
  
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.785f</span><span class="pun">)</span><span class="com">//0-45deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//Con::printf("forward 0-0.785; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5.497f</span><span class="pun">)</span><span class="com">//315-360deg</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//Con::printf("forward 5.497-6.283; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.784f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2.356f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//Con::printf("side right 0.784-2.356; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">5.496f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> yawDiff </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3.926f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//Con::printf("side left 3.926-5.496; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln">
               dirSpeed </span><span class="pun">=</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed</span><span class="pun">;</span><span class="pln">
            </span><span class="com">//Con::printf("back 2.356-5.496; %f", yawDiff);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         moveSpeed </span><span class="pun">=</span><span class="pln"> dirSpeed</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
        </span><span class="com">//move the first person standard movement here - yorks</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintStrafeScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">));</span><span class="pln">
         </span><span class="typ">VectorF</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">tv</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">+=</span><span class="pln"> tv </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">;</span><span class="pln">

         </span><span class="com">// Clamp water movement</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxForwardSpeed </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mSwimming</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxUnderwaterSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PronePose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxProneSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">CrouchPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxCrouchSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pun">)</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSprintSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
            </span><span class="kwd">else</span><span class="pln"> </span><span class="com">// StandPose</span><span class="pln">
               moveSpeed </span><span class="pun">=</span><span class="pln"> getMax</span><span class="pun">(</span><span class="pln">mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxBackwardSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">),</span><span class="pln">
                  mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxSideSpeed </span><span class="pun">*</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">));</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">

      </span><span class="com">// Cancel any script driven animations if we are going to move.</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">moveVec</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">y </span><span class="pun">+</span><span class="pln"> moveVec</span><span class="pun">.</span><span class="pln">z </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
          </span><span class="pun">(</span><span class="pln">mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NumTableActionAnims</span><span class="pln">
               </span><span class="pun">||</span><span class="pln"> mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">==</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">LandAnim</span><span class="pun">))</span><span class="pln">
         mActionAnimation</span><span class="pun">.</span><span class="pln">action </span><span class="pun">=</span><span class="pln"> </span><span class="typ">PlayerData</span><span class="pun">::</span><span class="typ">NullAnimation</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
   </span><span class="kwd">else</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      moveVec</span><span class="pun">.</span><span class="typ">set</span><span class="pun">(</span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">);</span><span class="pln">
      moveSpeed </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">
     
     </span><span class="com">//...</span></pre>

<p>
	Hope this helps someone. <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/263a.png" class="ipsEmoji" alt="☺️">
</p>
]]></description><guid isPermaLink="false">7065</guid><pubDate>Sun, 26 Feb 2023 19:05:44 +0000</pubDate></item><item><title>Shooter Style Third Person Camera Orientated Movement</title><link>https://torque3d.org/forums/topic/7061-shooter-style-third-person-camera-orientated-movement/</link><description><![CDATA[<p>
	Disclaimer: I haven't actually played GTA or Elden Ring so I've never actually experienced the camera and movement control system. But anyway - here's what I think it's like (probably). <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14.0.2/assets/72x72/1f605.png" class="ipsEmoji" alt="😅"> UPDATE: this camera and movement style is really more relevant to a 3rd person shooter.
</p>

<div class="ipsEmbeddedVideo" contenteditable="false">
	<div>
		<iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" frameborder="0" height="113" src="https://www.youtube-nocookie.com/embed/dcyzMI6vLl4?feature=oembed" title="Third Person Camera Orientated Movement Test" width="200"></iframe>
	</div>
</div>

<p>
	This is a movement test based on third person camera direction, kind of like what I did top-down for Monsters Loot Swag but the camera remains fixed to the player rather than being independant - because of that I had apply inverse rotation to the camera when the player moved and turned to face the camera's original vector.
</p>

<p>
	Horizontal camera rotation wraps around -/+M_PI_F rather than being constrained by the stock engine's playerDatablock maxFreeLook value, this means that the camera can loop seamlessly around the player using z axis but is still constrained to maximums when looking up and down, so it doesn't flip upside-down.
</p>

<p>
	Code: Player.cpp, in UpdateMove(const Move* move)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7371_6" style=""><span class="kwd">void</span><span class="pln"> </span><span class="typ">Player</span><span class="pun">::</span><span class="pln">updateMove</span><span class="pun">(</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Move</span><span class="pun">*</span><span class="pln"> move</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="com">//...</span><span class="pln">
           setImageAltTriggerState</span><span class="pun">(</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">trigger</span><span class="pun">[</span><span class="pln">sImageTrigger1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">);</span><span class="pln">
   </span><span class="pun">}</span><span class="pln">

   </span><span class="com">//yorks</span><span class="pln">
   F32 camZ </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">
   </span><span class="typ">GameConnection</span><span class="pun">*</span><span class="pln"> con </span><span class="pun">=</span><span class="pln"> getControllingClient</span><span class="pun">();</span><span class="pln">
   </span><span class="kwd">bool</span><span class="pln"> thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">con </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">con</span><span class="pun">-&gt;</span><span class="pln">isFirstPerson</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      thirdP </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
   </span><span class="pun">}</span><span class="com">//yorks end</span><span class="pln">

   </span><span class="com">// Update current orientation</span><span class="pln">
   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      F32 prevZRot </span><span class="pun">=</span><span class="pln"> mRot</span><span class="pun">.</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
	  mDelta</span><span class="pun">.</span><span class="pln">headVec </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">;</span><span class="pln">

      </span><span class="kwd">bool</span><span class="pln"> doStandardMove </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">bool</span><span class="pln"> absoluteDelta </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
      </span><span class="com">//GameConnection* con = getControllingClient();//yorks out and moved above so we can get this below too</span><span class="pln">


</span><span class="com">#ifdef</span><span class="pln"> TORQUE_EXTENDED_MOVE
  </span><span class="com">//...</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">doStandardMove</span><span class="pun">)</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         F32 p </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">pitch </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintPitchScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln"> 
            p </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="com">//mHead.x = mClampF(mHead.x + p,mDataBlock-&gt;minLookAngle,</span><span class="pln">
                          </span><span class="com">// mDataBlock-&gt;maxLookAngle);</span><span class="pln">

         F32 y </span><span class="pun">=</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">yaw </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintYawScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">);</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
            y </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

         </span><span class="com">//yorks start</span><span class="pln">
         </span><span class="com">//if (((move-&gt;freeLook &amp;&amp; isMounted() &amp;&amp; getMountNode() == 0) || (con &amp;&amp; !con-&gt;isFirstPerson())))//out</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//from above</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//yorks moved down here</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">),</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks added 0.5f to slow p down a bit</span><span class="pln">

            </span><span class="com">//let us run the camera around in a big old never ending circle</span><span class="pln">
            F32 camRot </span><span class="pun">=</span><span class="pln"> mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y </span><span class="pun">*</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">);</span><span class="com">//slow y down a bit, techincally you should do this input script mouse sensitivity, also see p above</span><span class="pln">
            </span><span class="com">//constrain the range of camRot within pi*2</span><span class="pln">
            camRot </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camRot</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">=</span><span class="pln"> camRot</span><span class="pun">;</span><span class="pln">
            </span><span class="com">// mHead.z = mClampF(mHead.z + y,</span><span class="pln">
                              </span><span class="com">// -mDataBlock-&gt;maxFreelookAngle,</span><span class="pln">
                              </span><span class="com">// mDataBlock-&gt;maxFreelookAngle);</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
         </span><span class="kwd">else</span><span class="pln">
         </span><span class="pun">{</span><span class="com">//yorks end block</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">=</span><span class="pln"> mClampF</span><span class="pun">(</span><span class="pln">mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">+</span><span class="pln"> p</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">minLookAngle</span><span class="pun">,</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">maxLookAngle</span><span class="pun">);</span><span class="com">//yorks moved down here for normal cam/move mode</span><span class="pln">

            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
            </span><span class="com">// Rotate the head back to the front, center horizontal</span><span class="pln">
            </span><span class="com">// as well if we're controlling another object.</span><span class="pln">
            mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mControlObject</span><span class="pun">)</span><span class="pln">
               mHead</span><span class="pun">.</span><span class="pln">x </span><span class="pun">*=</span><span class="pln"> </span><span class="lit">0.5f</span><span class="pun">;</span><span class="pln">
         </span><span class="pun">}</span><span class="com">//yorks added</span><span class="pln">

         </span><span class="com">// constrain the range of mRot.z</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
         </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">&gt;</span><span class="pln"> M_2PI_F</span><span class="pun">)</span><span class="pln">
            mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
     </span><span class="com">//...</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">MoveState</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">RecoverState</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">recoverRunForceScale </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">))</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mDamageState </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enabled</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">!</span><span class="pln">isAnimationLocked</span><span class="pun">())</span><span class="pln">
   </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">thirdP</span><span class="pun">)</span><span class="com">//yorks start big in</span><span class="pln">
      </span><span class="pun">{</span><span class="pln">
         </span><span class="typ">GameBase</span><span class="pun">*</span><span class="pln"> cam </span><span class="pun">=</span><span class="pln"> con</span><span class="pun">-&gt;</span><span class="pln">getCameraObject</span><span class="pun">();</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">cam</span><span class="pun">)</span><span class="pln">
         </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//get the camera's transform</span><span class="pln">
            F32 pos </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="typ">MatrixF</span><span class="pln"> camTrans</span><span class="pun">;</span><span class="pln">
            cam</span><span class="pun">-&gt;</span><span class="pln">getCameraTransform</span><span class="pun">(&amp;</span><span class="pln">pos</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">camTrans</span><span class="pun">);</span><span class="pln">

            </span><span class="com">//flatten the transform to X&amp;Y (so when the camera</span><span class="pln">
            </span><span class="com">//is facing up/down the move remains horizontal)</span><span class="pln">
            camTrans</span><span class="pun">[</span><span class="lit">9</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">normalize</span><span class="pun">();</span><span class="pln">

            </span><span class="com">//create a move vector and multiply by the camera transform</span><span class="pln">
            </span><span class="typ">VectorF</span><span class="pln"> temp</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
            camTrans</span><span class="pun">.</span><span class="pln">mulV</span><span class="pun">(</span><span class="pln">temp</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">

            </span><span class="com">// get the z rotation of the camera for working with right stick aiming</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> camTrans</span><span class="pun">.</span><span class="pln">toEuler</span><span class="pun">().</span><span class="pln">z</span><span class="pun">;</span><span class="pln">
            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">camZ </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
               camZ </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

            </span><span class="com">//Con::printf("Camz %f", camZ);</span><span class="pln">

            </span><span class="com">// Constrain the range of camZ within pi*2</span><span class="pln">
            camZ </span><span class="pun">=</span><span class="pln"> mWrapF</span><span class="pun">(</span><span class="pln">camZ</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="com">//yorks use the new method</span><span class="pln">

            </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">))</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x</span><span class="pun">)))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
               </span><span class="com">//we are moving and so should turn the player towards the direction that the camera is facing</span><span class="pln">
               </span><span class="typ">Point3F</span><span class="pln"> transVec </span><span class="pun">=</span><span class="pln"> getTransform</span><span class="pun">().</span><span class="pln">getForwardVector</span><span class="pun">();</span><span class="pln">

               F32 tran </span><span class="pun">=</span><span class="pln"> mAtan2</span><span class="pun">(</span><span class="pln">transVec</span><span class="pun">.</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> transVec</span><span class="pun">.</span><span class="pln">y</span><span class="pun">);</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">tran </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
                  tran </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">

               mWrapF</span><span class="pun">(</span><span class="pln">tran</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">,</span><span class="pln"> M_2PI_F</span><span class="pun">);</span><span class="pln">

               F32 yawDiff </span><span class="pun">=</span><span class="pln"> camZ </span><span class="pun">-</span><span class="pln"> tran</span><span class="pun">;</span><span class="pln">

               </span><span class="com">//Con::printf("camToDir %f; tran %f; yawDiff %f", dir, tran, yawDiff);</span><span class="pln">

               </span><span class="com">//ignore very small rotations</span><span class="pln">
               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0.005f</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> mFabs</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="pun">-</span><span class="lit">0.005f</span><span class="pun">)</span><span class="com">//yorks now less than a third of 1 degree//0.001f)//</span><span class="pln">
                  yawDiff </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">;</span><span class="pln">

               </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">mIsZero</span><span class="pun">(</span><span class="pln">yawDiff</span><span class="pun">))</span><span class="pln">
               </span><span class="pun">{</span><span class="pln">
                  </span><span class="com">//Con::printf("yawDiff %f", yawDiff);</span><span class="pln">
                  </span><span class="com">// now make sure we take the short way around the circle</span><span class="pln">
                 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&gt;</span><span class="pln"> M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">-=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">yawDiff </span><span class="pun">&lt;</span><span class="pln"> </span><span class="pun">-</span><span class="pln">M_PI_F</span><span class="pun">)</span><span class="pln">
                     yawDiff </span><span class="pun">+=</span><span class="pln"> M_2PI_F</span><span class="pun">;</span><span class="pln">
                 
                  F32 slower</span><span class="pun">;</span><span class="com">//slower exists to slow the turn down otherwise it's instantaneous</span><span class="pln">
                  slower </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.15f</span><span class="pun">;</span><span class="pln">

                  mRot</span><span class="pun">.</span><span class="pln">z </span><span class="pun">+=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="pln">
                  mHead</span><span class="pun">.</span><span class="pln">z </span><span class="pun">-=</span><span class="pln"> yawDiff </span><span class="pun">*</span><span class="pln"> slower</span><span class="pun">;</span><span class="com">//the camera is still attached to the player so we need to compensate for the player's new rotation</span><span class="pln">
               </span><span class="pun">}</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
         </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">}</span><span class="com">//yorks end big in</span><span class="pln">

         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">moveVec</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">*=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">x </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="pln">mPose </span><span class="pun">==</span><span class="pln"> </span><span class="typ">SprintPose</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> mDataBlock</span><span class="pun">-&gt;</span><span class="pln">sprintStrafeScale </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1.0f</span><span class="pun">));</span><span class="pln">
         </span><span class="typ">VectorF</span><span class="pln"> tv</span><span class="pun">;</span><span class="pln">
         zRot</span><span class="pun">.</span><span class="pln">getColumn</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">tv</span><span class="pun">);</span><span class="pln">
         moveVec </span><span class="pun">+=</span><span class="pln"> tv </span><span class="pun">*</span><span class="pln"> move</span><span class="pun">-&gt;</span><span class="pln">y</span><span class="pun">;</span><span class="pln">

         </span><span class="com">// Clamp water movement</span><span class="pln">
         </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">move</span><span class="pun">-&gt;</span><span class="pln">y </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0.0f</span><span class="pun">)</span><span class="pln">
       </span><span class="com">//...</span></pre>

<p>
	And there you go, that should be it. In 3rd person view and ONLY 3rd person view you can rotate the camera horizontally around the player without it stopping at maxLook and movement is tied to the camera view, so that the player will reorientate himself to that when moving.
</p>

<p>
	This could be expanded by adding a lock-on feature to have the camera point constantly at the selected enemy, and also maybe add a toggle that allows the player to move relative to the camera but without turning to face the camera's vector.
</p>

<p>
	Hope this helps some folks.
</p>
]]></description><guid isPermaLink="false">7061</guid><pubDate>Sat, 25 Feb 2023 00:25:59 +0000</pubDate></item><item><title>aim and shoot.</title><link>https://torque3d.org/forums/topic/1721-aim-and-shoot/</link><description><![CDATA[<p>
	you aim and shoot a zombie
</p>]]></description><guid isPermaLink="false">1721</guid><pubDate>Mon, 17 May 2021 23:38:27 +0000</pubDate></item><item><title>Jump Pad</title><link>https://torque3d.org/forums/topic/1403-jump-pad/</link><description><![CDATA[<p><b><strong>Trigger based Jump Pad</strong></b> (like Quake 3)<br></p><p>This Trigger will launch the AI or Player wherever the Trigger is "facing".<br></p><p>This assumes you are familiar with creating and using Triggers within Torque.<br></p><p><br></p><p>UPDATE: The force that the Jump Pad pushes the AI or Player can now be set as a Dynamic Value within the Trigger itself. This will allow you to have multiple Jump Pads with various amounts of force within your mission.<br></p><p><br></p><p> </p><pre class="lang-c ported-from-old-forums">
datablock TriggerData(JumpPadTrigger)
{
   tickPeriodMS = 1000;
};
 
function JumpPadTrigger::onEnterTrigger(%this, %trigger, %obj)
{
   //set the force the Jump Pad pushes the player at as a Dynamic Value
   %jumppadforce = %trigger.getFieldValue(JumpPadForceRef);
 
   //get the direction the trigger is "facing" (theta)
   %aim = %trigger.getForwardVector();
 
   //take the getForwardVector and add some force
   %impulseVec = vectorScale(%aim, %jumppadforce);
 
   //take the above mix and add some additional direction if needed
   %impulseVec = vectorAdd(%impulseVec, "0 0 0");
 
   //apply this to any AI/Player that enters the trigger
   %obj.applyImpulse("0 0 0", %impulseVec);
 
   //TODO: add your audio here
}
 
function JumpPadTrigger::onLeaveTrigger(%this, %trigger, %obj)
{
   ECHO("WHEE!");
}
</pre><p> </p><p>After creating your JumpPadTrigger within the editor create a Dynamic Field called JumpPadForceRef and set its value to the amount of force you want to push the AI or Player at.</p>]]></description><guid isPermaLink="false">1403</guid><pubDate>Thu, 20 Jun 2019 07:42:07 +0000</pubDate></item><item><title>Simple Flashlight</title><link>https://torque3d.org/forums/topic/1371-simple-flashlight/</link><description><![CDATA[<p>Here is a very simple flashlight that uses the weapons fire light as a flashlight.<br></p><p><br></p><p>Some of it was from a few different posts from the old forum.<br></p><p><br></p><p>Some obvious problems are that the flash of light from your weapon is disabled while the flashlight is on. The AI Turret doesn't have light.<br></p><p><br></p><p>Really just a starting point but thought it might be useful.<br></p><p><br></p><p>lightRadius is equal to "range" so change that for distance of beam.<br></p><p><br></p><p>Download:<br></p><p><a href="https://drive.google.com/open?id=1CreRU3RchgZ-4WQhLwEWz4Yh0NoeD417" rel="external nofollow">https://drive.google.com/open?id=1CreRU3RchgZ-4WQhLwEWz4Yh0NoeD417</a><br></p><p><br></p><p>Install instructions:<br></p><p><br></p><p>1) in game/scripts/client/default.bind.cs<br></p><p><br></p><p>add to bottom:</p><pre class="lang-c ported-from-old-forums">
 
//Add Flashlight
 
$FlashlightVar = "1";
function toggleFlashlight(%val)
{
   if (%val)
   {
      if($FlashlightVar)
      {
         $FlashlightVar = "0";
         commandToServer('EnableFlashlight');
      }
      else
      {
         $FlashlightVar = "1";
         commandToServer('DisableFlashlight');
      }
   }
}
moveMap.bind( keyboard, f, toggleFlashlight );</pre><p> </p><p><br></p><p><br></p><p>2) in game/scripts/server/player.cs<br></p><p><br></p><p>add to bottom:<br></p><p> </p><pre class="lang-c ported-from-old-forums">//Add Flashlight
 
function Player::FlashlightEnable(%player)
{
    %player.getMountedImage($WeaponSlot).setFieldValue("lightType", "SpotLight");
    %player.getMountedImage($WeaponSlot).setFieldValue("lightRadius", "25"); 
}
 
function Player::FlashlightDisable(%player)
{
     %player.getMountedImage($WeaponSlot).setFieldValue("lightType", "WeaponFireLight");
     %player.getMountedImage($WeaponSlot).setFieldValue("lightRadius", "10");
}</pre><p> </p><p>3) in game/scripts/server/commands.cs<br></p><p><br></p><p>add to bottom:</p><pre class="lang-c ported-from-old-forums">
//Add Flashlight
 
function serverCmdEnableFlashlight(%client)
 {
    %player = %client.player;
    %player.FlashlightEnable();
 }
 
 
function serverCmdDisableFlashlight(%client)
 {
    %player = %client.player;
    %player.FlashlightDisable();
 }</pre><p><a href="https://ipbt3d.lukasj.org/applications/core/interface/file/attachment.php?id=119" data-fileid="119" data-fileext="zip" rel="">SimpleFlashlight.zip</a></p><p>install Flashlight</p><p><a class="ipsAttachLink ipsAttachLink_image" href="https://ipbt3d.lukasj.org/uploads/monthly_2019_03/flashLight.jpg.0b0611159b6c8030c5a6241faafe0d71.jpg" data-fileid="120" data-fileext="jpg" rel=""><img data-fileid="120" class="ipsImage ipsImage_thumbnailed" alt="flashLight.thumb.jpg.67bf30809f2053747fe0b9aedf2bb934.jpg" src="https://ipbt3d.lukasj.org/uploads/monthly_2021_03/flashLight.thumb.jpg.67bf30809f2053747fe0b9aedf2bb934.jpg"></a></p>]]></description><guid isPermaLink="false">1371</guid><pubDate>Sun, 31 Mar 2019 07:25:04 +0000</pubDate></item><item><title>Vector To Rotation</title><link>https://torque3d.org/forums/topic/1342-vector-to-rotation/</link><description><![CDATA[<p>Just a useful function for vector math. <br></p><p><br></p><p>Drop it at the bottom of mathTypes.cpp</p><pre class="lang-c ported-from-old-forums">DefineConsoleFunction(createOrientFromDir, const char*, ( VectorF vec),,"Returns orientation from a vector input")
{
	MatrixF mat = MathUtils::createOrientFromDir(vec);
	AngAxisF aa(mat);
	char* ret = Con::getReturnBuffer(256);
	dSprintf(ret, 255, "%g %g %g %g", aa.axis.x, aa.axis.y, aa.axis.z, aa.angle);
	return ret;
}</pre>]]></description><guid isPermaLink="false">1342</guid><pubDate>Wed, 06 Feb 2019 17:27:06 +0000</pubDate></item><item><title>Automatic Script Reloading</title><link>https://torque3d.org/forums/topic/1329-automatic-script-reloading/</link><description><![CDATA[<p>This is a small update of an old resource that was on garage games.  <br></p><p><a href="http://www.garagegames.com/community/blogs/view/21262" rel="external nofollow">http://www.garagegames.com/community/blogs/view/21262</a><br></p><p><br></p><p>I added the ability to mark files that you are working in to keeps systems and things like the editor from freaking out and breaking.<br></p><p><br></p><p>example: <br></p><p>exec("scripts/server/stuff.cs");<br></p><p>to<br></p><p>rexec("scripts/server/stuff.cs"); // this file will now auto exec after saving <br></p><p><br></p><p>////////////////////////////////////////////////////////////////////////////<br></p><p>First open up volume.h<br></p><p><br></p><p>Find these lines <br></p><p>template <br></p><p>inline bool AddChangeNotification( const Path &amp;path, T obj, U func )<br></p><p><br></p><p>Then add code above them</p><pre class="lang-c ported-from-old-forums">template 
inline bool AddChangeNotification(const Path &amp;path, U func)
{
	FileSystemRef fs = GetFileSystem(path);
	if (!fs || !fs-&gt;getChangeNotifier())
		return false;
 
	FileSystemChangeNotifier::ChangeDelegate dlg(func);
	return fs-&gt;getChangeNotifier()-&gt;addNotification(path, dlg);
}</pre><p> </p><p><br></p><p>Now open up console.cpp<br></p><p>Above  this function bool executeFile(const char* fileName, bool noCalls, bool journalScript)<br></p><p><br></p><p>Add</p><pre class="lang-c ported-from-old-forums">void reExec(const Torque::Path &amp;path);</pre><p> </p><p>Now change  bool executeFile(const char* fileName, bool noCalls, bool journalScript) <br></p><p><br></p><p>To</p><pre class="lang-c ported-from-old-forums">bool executeFile(const char* fileName, bool noCalls, bool journalScript, bool rexec)</pre><p> </p><p>In the same function change this line<br></p><p>if( (dsoPath &amp;&amp; *dsoPath == 0) || (prefsPath &amp;&amp; prefsPath[ 0 ] &amp;&amp; dStrnicmp(scriptFileName, prefsPath, dStrlen(prefsPath)) == 0) )<br></p><p><br></p><p>To</p><pre class="lang-c ported-from-old-forums">if( (dsoPath &amp;&amp; *dsoPath == 0) || dStrstr(scriptFileName, "prefs.cs")) //(prefsPath &amp;&amp; prefsPath[ 0 ] &amp;&amp; dStrnicmp(scriptFileName, prefsPath, dStrlen(prefsPath)) == 0) )
</pre><p> </p><p>Still in the same function add this after the last #endif  <br></p><p> </p><pre class="lang-c ported-from-old-forums">if (compiled &amp;&amp; rexec) 
 {
      Torque::Path path(scriptFileName);
      Torque::FS::AddChangeNotification(path, &amp;reExec);
 }</pre><p> </p><p>After the bool executeFile function  add<br></p><p> </p><pre class="lang-c ported-from-old-forums">void reExec(const Torque::Path &amp;path)
{
	//we know this is a file that exists, and a .cs file, so we can skip a lot of checks...  
	CodeBlock *newCodeBlock = new CodeBlock();
	StringTableEntry name = StringTable-&gt;insert(path.getFullPath().c_str());
 
	void *data;
	U32 dataSize = 0;
	Torque::FS::ReadFile(name, data, dataSize, true);
 
	newCodeBlock-&gt;compileExec(name, (char*)data, false, 0);
 
	delete[] data;
}
</pre><p> </p><p>Now open up console.h and change <br></p><p>bool executeFile(const char* fileName, bool noCalls, bool journalScript);<br></p><p><br></p><p>To</p><pre class="lang-c ported-from-old-forums">bool executeFile(const char* fileName, bool noCalls, bool journalScript,bool rexec);</pre><p> </p><p>Lastly open up consoleFunctioncs.cpp and replace<br></p><p> </p><pre class="lang-c ported-from-old-forums">DefineEngineFunction( exec, bool, ( const char* fileName, bool noCalls, bool journalScript ), ( false, false ),
   "Execute the given script file.\n"
   "@param fileName Path to the file to execute\n"
   "@param noCalls Deprecated\n"
   "@param journalScript Deprecated\n"
   "@return True if the script was successfully executed, false if not.\n\n"
   "@tsexample\n"
      "// Execute the init.cs script file found in the same directory as the current script file.\n"
      "exec( \"./init.cs\" );\n"
   "@endtsexample\n\n"
   "@see compile\n"
   "@see eval\n"
   "@ingroup Scripting" )
{
   return Con::executeFile(fileName, noCalls, journalScript);
}
</pre><p> </p><p>With this </p><pre class="lang-c ported-from-old-forums">DefineEngineFunction( exec, bool, ( const char* fileName, bool noCalls, bool journalScript ), ( false, false ),
   "Execute the given script file.\n"
   "@param fileName Path to the file to execute\n"
   "@param noCalls Deprecated\n"
   "@param journalScript Deprecated\n"
   "@return True if the script was successfully executed, false if not.\n\n"
   "@tsexample\n"
      "// Execute the init.cs script file found in the same directory as the current script file.\n"
      "exec( \"./init.cs\" );\n"
   "@endtsexample\n\n"
   "@see compile\n"
   "@see eval\n"
   "@ingroup Scripting" )
{
   return Con::executeFile(fileName, noCalls, journalScript, false);
}
DefineEngineFunction(rexec, bool, (const char* fileName, bool noCalls, bool journalScript), (false, false),
	"Execute the given script file. As well as re-execute said file automatically after saving\n")
{
   return Con::executeFile(fileName, noCalls, journalScript, true);
}</pre>]]></description><guid isPermaLink="false">1329</guid><pubDate>Tue, 29 Jan 2019 04:42:44 +0000</pubDate></item><item><title>Enable xaxis/yaw mouse movement for mounted player</title><link>https://torque3d.org/forums/topic/1309-enable-xaxisyaw-mouse-movement-for-mounted-player/</link><description><![CDATA[<p><a href="https://forums.torque3d.org/viewtopic.php?f=36&amp;t=1449" rel="external nofollow">This topic is in response to this Job Board posting.</a><br></p><p>Thanks to @JeffR for the assistance. <br></p><p><br></p><p>These source code changes will enable xaxis/yaw mouse movement (look left/right/turn around) for mounted players. Previously the player was restricted to only yaxis/pitch (look up/down) movement.<br></p><p><br></p><p>In PLAYER.CPP under Player::setPosition<br></p><p>Replace the default isMounted code with the following:</p><pre class="lang-c ported-from-old-forums">
   if (isMounted()) {
	  // Use transform from mounted object - Thanks to Jeff Raab
	  MatrixF zrot;
	  mMount.object-&gt;getMountTransform( mMount.node, mMount.xfm, &amp;mat );
	  zrot.set(EulerF(0.0f, 0.0f, rot.z));
	  mat.mul(zrot);
   }
</pre><p> </p><p><br></p><p>In PLAYER.CPP under Player::setRenderPosition<br></p><p>Replace the default isMounted code with the following:</p><pre class="lang-c ported-from-old-forums">
   if (isMounted()) {
	  // Use transform from mounted object - Thanks to Jeff Raab
	  MatrixF zrot;
	  mMount.object-&gt;getRenderMountTransform( dt, mMount.node, mMount.xfm, &amp;mat );
	  bool isSer = isServerObject();
	  S32 id = getId();
	  zrot.set(EulerF(0.0f, 0.0f, rot.z));
	  mat.mul(zrot);
   }
</pre><p> </p><p><br></p><p>In SHAPEBASE.CPP under ShapeBase::advanceTime<br></p><p>Comment out the following:</p><pre class="lang-c ported-from-old-forums">
   if (isMounted()) { //Standard Torque 3.9 code, commented out to fix jitter bug when enabling full mouse movement when mounted, thanks to Jeff Raab
      MatrixF mat;
      mMount.object-&gt;getRenderMountTransform( 0.0f, mMount.node, mMount.xfm, &amp;mat );
      Parent::setRenderTransform(mat);
   }
</pre>]]></description><guid isPermaLink="false">1309</guid><pubDate>Mon, 31 Dec 2018 06:51:20 +0000</pubDate></item><item><title>OpenAL Reverb Effect</title><link>https://torque3d.org/forums/topic/1280-openal-reverb-effect/</link><description><![CDATA[<p>NOTE:: This resource is working now but it is still in early stages of testing. I will be replacing this with a full resource hopefully tying it in with torques frontend.<br /></p><p><br /></p><p>SAVE THIS SPACE</p>]]></description><guid isPermaLink="false">1280</guid><pubDate>Sun, 14 Oct 2018 21:50:20 +0000</pubDate></item><item><title>OpenAL Exponential Falloff</title><link>https://torque3d.org/forums/topic/1275-openal-exponential-falloff/</link><description><![CDATA[<p>This resource will add the exponential falloff to torque3ds sound distance attenuation instead of the linear falloff that it uses as stock... ALOT OF CODE CHANGES INCOMING BACK UP YOUR SOURCE!!! :) These changes were tested on stock Torque3d 3.10.1 release.<br></p><p><br></p><p>Our first change of many: <br></p><p>in sfxCommon.h around line 152 you should see enum SFXDistanceModel<br></p><p><br></p><p>after SFXDistanceModelLogarithmic add:</p><pre class="lang-c ported-from-old-forums">SFXDistanceModelExponent,</pre><p> </p><p>then at line 189 after break; ad<br></p><p> </p><pre class="lang-c ported-from-old-forums">case SFXDistanceModelExponent:
distance = getMax(distance, minDistance);
distance = getMin(distance, maxDistance);
 
gain = pow((distance / minDistance), (-rolloffFactor));
break;</pre><p> </p><p>Then in sfxDSDevice.cpp at line 203 you will see SFXDevice::setDistanceModel<br></p><p><br></p><p>in the switch below break at case SFXDistanceModelLogarithmic:<br></p><p><br></p><p>add<br></p><p> </p><pre class="lang-c ported-from-old-forums"> case SFXDistanceModelExponent:
	   Con::errorf("SFXDSDevice::setDistanceModel - 'exponential' distance attenuation not supported by DirectSound");
	   break;</pre><p> </p><p>I'm not sure whether directsound has an exponential attenuation feature but just in case it doesnt i thought it best to sort it out with an error here.<br></p><p><br></p><p>Next in sfxALDevice.cpp find SFXALDevice::setDistanceModel under the case SFXDistanceModelLogarithmic break;<br></p><p><br></p><p>add:<br></p><p> </p><pre class="lang-c ported-from-old-forums">case SFXDistanceModelExponent:
		  mOpenAL.alDistanceModel(AL_EXPONENT_DISTANCE_CLAMPED);
		  if (mUserRolloffFactor != mRolloffFactor)
			  _setRolloffFactor(mUserRolloffFactor);
		  break;</pre><p> </p><p>You could just copy and paste the logarithmic case here and change the values to be exponent but that would just be lazy...........  :? <br></p><p><br></p><p>Next in sfxSystem.cpp<br></p><p><br></p><p>Find around line 94 <br></p><p> { SFXDistanceModelLogarithmic, "Logarithmic", <br></p><p>      "Volume attenuates logarithmically starting from the reference distance and halving every reference distance step from there on. "<br></p><p>      "Attenuation stops at max distance but volume won't reach zero." },<br></p><p><br></p><p>Below this add</p><pre class="lang-c ported-from-old-forums"> { SFXDistanceModelExponent, "Exponential",
	"Volume attenuates exponentially starting from the reference distance and attenuating every reference distance step by the rolloff factor. "
	"Attenuation stops at max distance but volume won't reach zero." },</pre><p> </p><p>Because we are using AL_EXPONENT_DISTANCE_CLAMPED the volume attenuation stops when the source reaches max distance.<br></p><p><br></p><p>Then load up your level in the world editor choose thelevelinfo from the mission group and scroll down to sound, under that change soundDistanceModel to Exponential. Done now any sound profiles that you have you can create an exponential rolloff attenuation rather than a linear rolloff.</p>]]></description><guid isPermaLink="false">1275</guid><pubDate>Fri, 12 Oct 2018 15:30:09 +0000</pubDate></item><item><title>Raycast Damage At Close Range Instead Of Projectile Spawning</title><link>https://torque3d.org/forums/topic/1247-raycast-damage-at-close-range-instead-of-projectile-spawning/</link><description><![CDATA[<p>As creation of projectiles takes program resources, I always thought that it was somewhat wasteful at close range. If you have a visible bullet projectile model (something stock Torque no longer bothers with) and if it is not ballistic with a delayed arming system (eg: not a grenade), players are not going to get the chance to see it spawn at close range anyway - so why not save a bit CPU effort and check for a 2 metre/unit raycast and just roll for damage if anything is that close. If nothing is found, then create the projectile normally. This also allows for longer projectiles which could clip into the gun when they spawn (eg: you're using an animated texture for a bullet trail on the projectile model).<br></p><p><br></p><p>First up in the weaponImage datablock, create a new flag to check for raycast, this could be an int on how much range to check for, but here I'm going to keep it simple and just use it as a bool.<br></p><p> </p><pre class="lang-c ported-from-old-forums">
datablock ShapeBaseImageData(YourWeaponImage)
{
//...
rayTest = 1;
//...
};
</pre><p> </p><p>In scripts/server/weapon.cs onFIre() function:</p><pre class="lang-c ported-from-old-forums">
function WeaponImage::onFire(%this, %obj, %slot)
{
   //echo("\c4WeaponImage::onFire( "@%this.getName()@", "@%obj.client.nameBase@", "@%slot@" )");
 
   // Make sure we have valid data
   if (!isObject(%this.projectile))
   {
      error("WeaponImage::onFire() - Invalid projectile datablock");
      return;
   }
 
   %doRay = %this.rayTest;//&lt;---------yorks new
 
   //...
 
      // Add player's velocity
      %muzzleVelocity = VectorAdd(
         VectorScale(%muzzleVector, %this.projectile.muzzleVelocity),
         VectorScale(%objectVelocity, %this.projectile.velInheritFactor));
 
	//yorks new in here! start.
   if(%doRay == 1)
   {
      //use the 2m raycast to check for hits
      %masks = $TypeMasks::ShapeBaseObjectType;//standard projectile collison mask in projectile.cs
      %testDist = VectorAdd(%obj.getMuzzlePoint(%slot), VectorScale(%muzzleVector, 2));
      %hit = containerRayCast(%eyePoint, %testDist, %masks, %obj);
 
      if(%hit != 0)
      {
		  //hit something, find out what and resolve damage
         %target = firstWord(%hit);
 
         //echo("target hit = " @ %target);
 
         %pos = getWords(%hit, 1, 3);
         %rot = getWords(%hit, 4, 6);
 
         if (%target.getType() &amp; ($TypeMasks::ShapeBaseObjectType))
            %target.damage(%obj, %pos, %projectile.directDamage, %projectile.damageType);
 
		//you might also want to spawn explosions or decals here or do another check for static/terrains or something
        %decal = %projectile.decal;
		%explode = %projectile.explosion;
        %blast = new explosion()
        {
            dataBlock = %explode;
            position = %pos;
            rotation = %rot;
        };
        MissionCleanup.add(%blast);
 
        decalManagerAddDecal(%pos, %rot, 0, 1, %decal, false);
 
		return;//no need to spawn a projectile now
	  }
   }
   //nothing found in the way, so spawn the projectile as standard //yorks end.
 
      // Create the projectile object
      %p = new (%this.projectileType)()
      {
         dataBlock = %this.projectile;
         initialVelocity = %muzzleVelocity;
         initialPosition = %obj.getMuzzlePoint(%slot);
         sourceObject = %obj;
         sourceSlot = %slot;
         client = %obj.client;
         sourceClass = %obj.getClassName();
      };
      MissionCleanup.add(%p);
   }
}
</pre>]]></description><guid isPermaLink="false">1247</guid><pubDate>Mon, 20 Aug 2018 14:44:32 +0000</pubDate></item><item><title>Random Player Skins WITHOUT Tab Seperated String</title><link>https://torque3d.org/forums/topic/1246-random-player-skins-without-tab-seperated-string/</link><description><![CDATA[<p>For some reason, tab seperated strings hate me.  :? <br></p><p>Sometimes my custom player/aiplayers will spawn with skin set to "alt3 alt4" as the tabbed string decides to ignore the tab seperation because ... because it hates me.  :cry: <br></p><p><br></p><p>A second issue with the stock skin selection is that <b><strong>%skin = addTaggedString( getField(%availableSkins, getRandom(%count)) );</strong></b> gives the whole <b><strong>getCount()</strong></b>, but <b><strong>getRandom()</strong></b> <u><span style="text-decoration:underline;">starts at </span><b><i><span style="text-decoration:underline;"><strong><em>0</em></strong></span></i></b></u>, meaning that it's looking for 1 more skin than is available because "base" skin is in the availableSkins string.<br></p><p><br></p><p>So I changed everything to words seperated with a space. <br></p><p><br></p><p>Player/AIPlayer datablock</p><pre class="lang-c ported-from-old-forums">
   //availableSkins =  "base	alt1	alt2	alt3	alt4";
   availableSkins = "base alt1 alt2 alt3 alt4";//words not tabs
</pre><p> </p><p>In wherever you have the randomized skin function (scripts/server/gameBase.cs is stock)</p><pre class="lang-c ported-from-old-forums">
      // Choose a random, unique skin for this client
      %count = getWordCount(%availableSkins);//getFieldCount(%availableSkins);//tabs out words in
      if(%count &gt; 0)
      {
         %skin = getWord(%availableSkins, getRandom(%count - 1));//now with -1 for the real number
         //%skin = addTaggedString( getField(%availableSkins, getRandom(%count)) );
         %player.setSkinName(%skin);
         echo("skins " @ %count SPC %skin);
      }
</pre><p> </p><p>Not entirely certain why tabbed fields were chosen over spaced words for stock but hey. :|</p>]]></description><guid isPermaLink="false">1246</guid><pubDate>Fri, 17 Aug 2018 16:45:36 +0000</pubDate></item><item><title>GG Zombie GamePlay Resource</title><link>https://torque3d.org/forums/topic/1144-gg-zombie-gameplay-resource/</link><description><![CDATA[<p>Whilst look through some ancient files, I found I had the Zombie Gameplay Resource which [GG]Mich had designed back in the days T3D1.2. It's basically Call Of Duty Zombies for Torque.  :!: <br /></p><p><br /></p><p>24hN4s85OJw <br /></p><p><br /></p><p>Here's the resource's original url as the comments include script changes.<br /></p><p><a href="https://www.garagegames.com/community/resource/view/21702/" rel="external nofollow">https://www.garagegames.com/community/resource/view/21702/</a><br /></p><p><br /></p><p>Here's the resource:<br /></p><p><a href="http://yorkshirerifles.com/downloads/ZombieResource.zip" rel="external nofollow">http://yorkshirerifles.com/downloads/ZombieResource.zip</a><br /></p><p><br /></p><p>And here's the zombies and weapon packs on github to go with it all.<br /></p><p><a href="https://github.com/GarageGames/ContentPacks" rel="external nofollow">https://github.com/GarageGames/ContentPacks</a><br /></p><p><br /></p><p>As I say, there might be a few changes to scripts needed with fixes in the comments (and always the chance that a stock 1.2 function has been renamed).  :?:<br /></p><p><br /></p><p>Knock yourselves out.  :lol:<br /></p><p><br /></p><p>AGgOUoaO8a4 </p>]]></description><guid isPermaLink="false">1144</guid><pubDate>Mon, 23 Apr 2018 15:16:03 +0000</pubDate></item><item><title>Time of Day Events: Lights and Sound</title><link>https://torque3d.org/forums/topic/1132-time-of-day-events-lights-and-sound/</link><description><![CDATA[<p>Time Events: Lights and Sound  <br /></p><p><br /></p><p>Original Dynamic Light Code by John Ford<br /></p><p>Sounds are CC0<br /></p><p><br /></p><p>Adds the ability to have  lights in the level that turn on at night.<br /></p><p>Also demonstrates one way to have other things occur. I've included ambient sound that changes from day to night.<br /></p><p>Shows how relatively simple using a timed events are.<br /></p><p><br /></p><p>Download timeEvent.zip<br /></p><p><a href="https://drive.google.com/open?id=1T8xUVNn6M0FKpmluDmefig5OihBxFzGN" rel="external nofollow">https://drive.google.com/open?id=1T8xUVNn6M0FKpmluDmefig5OihBxFzGN</a><br /></p><p>Follow my crappy included instructions.<br /></p><p><br /></p><p>Edit: Forgot to add to instructions. For the sound to start initially you need to call the function. I just put it in game.cs when the mission is loaded.<br /></p><p><br /></p><p>Add :<br /></p><p>startDaySounds ();<br /></p><p><br /></p><p>If your mission starts at night add:<br /></p><p>startNightSounds ();<br /></p><p><br /></p><p>vvbel_h9pmQ </p><p><a class="ipsAttachLink ipsAttachLink_image" href="https://torque3d.org/uploads/monthly_2018_04/sceneTree_nestedLights.jpg.0e811d2a23cc093c0fd9cf059641d8bf.jpg" data-fileid="101" data-fileext="jpg" rel=""><img data-fileid="101" class="ipsImage ipsImage_thumbnailed" alt="sceneTree_nestedLights.jpg.0e811d2a23cc093c0fd9cf059641d8bf.jpg" data-src="https://torque3d.org/uploads/monthly_2018_04/sceneTree_nestedLights.jpg.0e811d2a23cc093c0fd9cf059641d8bf.jpg" src="https://torque3d.org/applications/core/interface/js/spacer.png" /></a></p><p>Make sure that you have a scene set-up in a similar manner. AmbientSound, DynamicLights and MissionLights match the included code.</p>]]></description><guid isPermaLink="false">1132</guid><pubDate>Fri, 13 Apr 2018 12:09:11 +0000</pubDate></item><item><title>Basic flyingVehicle mod</title><link>https://torque3d.org/forums/topic/883-basic-flyingvehicle-mod/</link><description><![CDATA[<p>¡Hola!<br /></p><p><br /></p><p>Here’s a preview of ‘Vehiclo’, an extensive T3D mod that adds additional vehicles types, functionality and vehicular AI.<br /></p><p>This simple mod will add a basic flyingVehicle to the ‘Full’ Template, with which you can begin your own experimentation with flyers in Torque.<br /></p><p>This is written for T3D 3.10 but should, with a few tweaks, work in any T3D_3+ version.<br /></p><p><br /></p><p>Caveats:<br /></p><p><br /></p><p>	Passenger/Weapon mounting not included.<br /></p><p>	By default this will make mounted players hidden<br /></p><p>	Flyers have had issues ‘sticking’ to terrain since TGE. Check this post for scripted/coded fixes:<br /></p><p>		<a href="http://forums.torque3d.org/viewtopic.php?f=23&amp;t=102&amp;p=784&amp;hilit=flyingVehicle#p784" rel="external nofollow">http://forums.torque3d.org/viewtopic.php?f=23&amp;t=102&amp;p=784&amp;hilit=flyingVehicle#p784</a><br /></p><p><br /></p><p>I hope to post the complete 'Vehiculo' mods on GitHub soon, just have to work out a few more issues…<br /></p><p><br /></p><p><br /></p><p>Step 1:	Setup a new project using the Full template<br /></p><p><br /></p><p>Download these files, and extract to a new directory, art/shapes/vehicles/jetFighter<br /></p><p><br /></p><p><a href="http://opengameart.org/content/future-fighterjet-for-torque3d" rel="external nofollow">http://opengameart.org/content/future-fighterjet-for-torque3d</a><br /></p><p><br /></p><p>Step 2: Add these files to "art/datablocks/vehicles"<br /></p><p><br /></p><p>art/datablocks/vehicles/jetFighter_fx.cs</p><p></p><pre class="ipsCode">
//-----------------------------------------------------------------------------
// Vehiculo
// "Gibby's Generic Jet Fighter FX"
// Basic Jet Fighter effects
//-----------------------------------------------------------------------------

//--------------------------------------------------------------
// Glowing explosion Sparks 
//--------------------------------------------------------------
datablock ParticleData(jetFighterExplosionSparks)
{
textureName          = "art/particles/SparkParticle";
dragCoefficient      = 0;
gravityCoefficient   = 0.5;
inheritedVelFactor   = 0.1;
constantAcceleration = 0.0;
lifetimeMS           = 3000;
lifetimeVarianceMS   = 500;

colors[0]     		= "0.60 0.40 0.30 1.0";
colors[1]     		= "0.60 0.40 0.30 1.0";
colors[2]    		= "1.0 0.40 0.30 0.0";
sizes[0]      		= 1.0;
sizes[1]      		= 0.4;
sizes[2]      		= 0.1;
times[0]      		= 0.0;
times[1]      		= 1.4;
times[2]      		= 2.0;
};

datablock ParticleEmitterData(jetFighterExplosionSparkEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 8;
velocityVariance = 2;
thetaMin         = 0.0;
thetaMax         = 180.0;
lifetimeMS       = 1000;	
overrideAdvances = false;
orientParticles  = true;
particles 		 = "jetFighterExplosionSparks";
};

//--------------------------------------------------------------
// Explosion Smoke
//--------------------------------------------------------------
datablock ParticleData(jetFighterExplosionSmoke)
{
textureName          	= "art/particles/smoke";
dragCoeffiecient     	= 0.7;
gravityCoefficient   	= 0.1;
inheritedVelFactor   	= 1.0;
//constantAcceleration = -0.80;
lifetimeMS           	= 10000;
lifetimeVarianceMS   	= 3000;
useInvAlpha 			=  true;
windCoefficient 		= 0.0;
colors[0]     			= "0.56 0.36 0.26 1.0";
colors[1]     			= "0.0 0.0 0.0 1.0";
colors[2]     			= "0.2 0.2 0.2 0.0";
sizes[0]      			= 10.0;
sizes[1]      			= 20.0;
sizes[2]      			= 50.0;
times[0]      			= 0.0;
times[1]      			= 0.1;
times[2]      			= 1.0;
};

datablock ParticleEmitterData(jetFighterExplosionSmokeEmitter)
{
ejectionPeriodMS 	= 100;
periodVarianceMS 	= 0;
ejectionVelocity 	= 5;
velocityVariance 	= 5;
thetaMin         	= 0.0;
thetaMax         	= 180.0;
lifetimeMS       	= 1500;
particles 		 	= "jetFighterExplosionSmoke";
};


//--------------------------------------------------------------
// jetFighter Debris Smoke
//--------------------------------------------------------------
datablock ParticleData(jetFighterDebrisSmoke)
{
dragCoefficient      = 0.0;
//gravityCoefficient   = -0.1;
gravityCoefficient   = 0.1;
inheritedVelFactor   = 0.2;
windCoefficient      = 0.3;
constantAcceleration = 0.0;
lifetimeMS           = 4000;
lifetimeVarianceMS   = 1500;
useInvAlpha          = true;
spinRandomMin        = -90.0;
spinRandomMax        = 90.0;
textureName          = "art/particles/smoke";
colors[0]     		= "0.1 0.1 0.1 0.8";
colors[1]     		= "0.7 0.7 0.7 0.6";
colors[2]     		= "0.9 0.9 0.9 0.0";
sizes[0]     		= 0.5;
sizes[1]      		= 1.0;
sizes[2]      		= 2.0;
times[0]      		= 0.0;
times[1]      		= 0.4;
times[2]      		= 1.0;
};
datablock ParticleEmitterData(jetFighterDebrisSmokeEmitter)
{
ejectionPeriodMS 	= 20;
periodVarianceMS 	= 0;
ejectionVelocity 	= 1;
velocityVariance 	= 1.0;
ejectionOffset   	= 0.0;
thetaMin         	= 0;
thetaMax         	= 35;
phiReferenceVel  	= 0;
phiVariance      	= 10;
overrideAdvances 	= false;
particles 			= "jetFighterDebrisSmoke";
lifetimeMS 			= 10000;
lifetimeVarianceMS   = 2000;
};

//--------------------------------------------------------------
// Contrail smoke
//--------------------------------------------------------------
datablock ParticleData(jetFighterContrailParticle)
{
dragCoefficient      = 1.5;
gravityCoefficient   = 0;
inheritedVelFactor   = 0.2;
constantAcceleration = 0.0;
lifetimeMS           = 2000;
lifetimeVarianceMS   = 0;
textureName          = "art/particles/dustParticle";
colors[0]     		 = "0.6 0.6 0.6 0.5";
colors[1]     		 = "0.2 0.2 0.2 0";
sizes[0]      		 = 0.6;
sizes[1]      		 = 2;
};

datablock ParticleEmitterData(jetFighterContrailEmitter)
{
ejectionPeriodMS = 10;
periodVarianceMS = 0;
ejectionVelocity = 1;
velocityVariance = 1.0;
ejectionOffset   = 0.0;
thetaMin         = 0;
thetaMax         = 10;
phiReferenceVel  = 0;
phiVariance      = 360;
overrideAdvances = false;
particles 		 = "jetFighterContrailParticle";
};


//--------------------------------------------------------------
// jetFighter damage smoke
//--------------------------------------------------------------

datablock ParticleData(jetFighterDamageSmokeParticle)
{
dragCoefficient      = 0.0;
gravityCoefficient   = 0.1;
inheritedVelFactor   = 0.5;
constantAcceleration = 0.0;
lifetimeMS           = 1500;
lifetimeVarianceMS   = 200;
useInvAlpha          = true;
spinRandomMin        = -90.0;
spinRandomMax        = 90.0;
textureName          = "art/particles/dustParticle";	
colors[0]     		= "0.7 0.7 0.7 0.0";
colors[1]     		= "0.5 0.5 0.5 0.7";
colors[2]     		= "0.3 0.3 0.3 0.0";
sizes[0]      		= 1.2;
sizes[1]      		= 2.6;
sizes[2]      		= 4.0;
times[0]      		= 0.0;
times[1]      		= 0.5;
times[2]      		= 1.0;
};

datablock ParticleEmitterData(jetFighterDamageSmoke)
{
ejectionPeriodMS 	= 30;
periodVarianceMS 	= 6;
ejectionVelocity 	= 4.0;
velocityVariance 	= 0.5;
ejectionOffset   	= 1.5;
thetaMin         	= 0;
thetaMax         	= 35;
overrideAdvances 	= false;
particles 		 	= "jetFighterDamageSmokeParticle";
};


//--------------------------------------------------------------
// Flying jet smoke 
//--------------------------------------------------------------
datablock ParticleData(jetFighterParticle)
{
dragCoefficient      	= 1.5;
gravityCoefficient   	= 0;
inheritedVelFactor   	= 0.2;
constantAcceleration 	= 0.0;
lifetimeMS           	= 1000;
lifetimeVarianceMS   	= 200;
useInvAlpha          	= true;
textureName          	= "art/particles/dustParticle";
colors[0]     			= "0.96 0.96 0.96 0.6";
colors[1]     			= "0.3 0.3 0.3 0";
sizes[0]      			= 1;
sizes[1]      			= 6;
//times[0] 				= 0.0;
//times[1] 				= 0.4;
};

datablock ParticleEmitterData(jetFighterJetEmitter)
{
ejectionPeriodMS = 15;
periodVarianceMS = 0;
ejectionVelocity = 20;
velocityVariance = 1.0;
ejectionOffset   = 0.0;
thetaMin         = 0;
thetaMax         = 10;
phiReferenceVel  = 0;
phiVariance      = 360;
overrideAdvances = false;
particles 		= "jetFighterParticle";
};

//--------------------------------------------------------------
// Lift off smoke (vertical)
//--------------------------------------------------------------
datablock ParticleData(jetFighterParticleDown)
{
dragCoefficient      = 1.5;
gravityCoefficient   = 0.5;
inheritedVelFactor   = 0.2;
constantAcceleration = 0.0;
lifetimeMS           = 500;
lifetimeVarianceMS   = 50;
textureName          = "art/particles/dustParticle";
useInvAlpha          = true;
colors[0]     		= "0.9 0.9 0.9 0.6";
colors[1]     		= "0.3 0.3 0.3 0";
//colors[0]     		= "0.9 0.7 0.3 0.6";
//colors[1]     		= "0.3 0.3 0.5 0";
sizes[0]      		= 1;
sizes[1]      		= 6;
};

datablock ParticleEmitterData(jetFighterJetEmitterDown)
{
ejectionPeriodMS 	= 15;
periodVarianceMS 	= 0;
ejectionVelocity 	= 20;
velocityVariance 	= 1.0;
ejectionOffset   	= 0.0;
thetaMin         	= 0;
thetaMax         	= 10;
phiReferenceVel  	= 0;
phiVariance      	= 360;
overrideAdvances 	= false;
particles 			= "jetFighterParticleDown";
};



//--------------------------------------------------------------
// Hover smoke
//--------------------------------------------------------------
datablock ParticleData(jetFighterDust)
{
  dragCoefficient      = 1.0;
  gravityCoefficient   = 0.01;
  inheritedVelFactor   = 0.0;
  constantAcceleration = 0.0;
  lifetimeMS           = 1000;
  lifetimeVarianceMS   = 200;
  useInvAlpha          = true;
  spinRandomMin        = -90.0;
  spinRandomMax        = 500.0;
  textureName          = "art/particles/dustParticle";   
  colors[0]     		= "0.46 0.36 0.26 0.0";
  colors[1]     		= "0.46 0.46 0.36 0.9";
  colors[2]     		= "0.46 0.46 0.36 0.4";
  sizes[0]      		= 3.2;
  sizes[1]      		= 4.6;
  sizes[2]      		= 7.0;
  times[0]      		= 0.0;
  times[1]      		= 0.5;
  times[2]      		= 1.0;
};

datablock ParticleEmitterData(jetFighterDustEmitter)
{
  ejectionPeriodMS = 15;
  periodVarianceMS = 0;
  ejectionVelocity = 15.0;
  velocityVariance = 0.0;
  ejectionOffset   = 0.0;
  thetaMin         = 90;
  thetaMax         = 90;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  //useEmitterColors = true;
  particles 		= "jetFighterDust";
};



//--------------------------------------------------------------
// Foam Smoke
//--------------------------------------------------------------
datablock ParticleData(jetFighterFoamParticle)
{
  dragCoefficient      = 2.0;
  gravityCoefficient   = -0.05;
  inheritedVelFactor   = 0.0;
  constantAcceleration = 0.0;
  lifetimeMS           = 1200;
  lifetimeVarianceMS   = 400;
  useInvAlpha          = false;
  spinRandomMin        = -90.0;
  spinRandomMax        = 500.0;
  textureName          = "art/particles/dustParticle";   
  colors[0]     		= "0.7 0.8 1.0 1.0";
  colors[1]     		= "0.7 0.8 1.0 0.5";
  colors[2]     		= "0.7 0.8 1.0 0.0";
  sizes[0]      		= 2;
  sizes[1]      		= 4;
  sizes[2]      		= 6;
  times[0]     		= 0.0;
  times[1]      		= 0.5;
  times[2]     		= 1.0;
};

datablock ParticleEmitterData(jetFighterFoamEmitter)
{
  ejectionPeriodMS = 40;
  periodVarianceMS = 0;
  ejectionVelocity = 10.0;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 85;
  thetaMax         = 85;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles 		= "jetFighterFoamParticle";
};

//  ---------------------------------------------------------------

datablock ParticleData(jetFighterExplosionParticle)
{
  dragCoefficient      = 2;
  gravityCoefficient   = 0.2;
  inheritedVelFactor   = 0.9;
  constantAcceleration = 0.0;
  lifetimeMS           = 6000;
  lifetimeVarianceMS   = 800;
  textureName          = "art/particles/dustParticle";   
  colors[0]     		= "0.86 0.36 0.26 1.0";
  colors[1]    	 	= "0.70 0.36 0.26 0.5";
  colors[2]    		 = "0.56 0.36 0.26 0.0";
  sizes[0]      		= 8.5;
  sizes[1]      		= 11.5;
  sizes[2]      		= 17.0;
};

datablock ParticleEmitterData(jetFighterExplosionEmitter)
{
  ejectionPeriodMS = 12;
  periodVarianceMS = 0;
  ejectionVelocity = 5;
  velocityVariance = 1.0;
  ejectionOffset   = 0.0;
  thetaMin         = 0;
  thetaMax         = 60;
  phiReferenceVel  = 0;
  phiVariance      = 360;
  overrideAdvances = false;
  particles 		= "jetFighterExplosionParticle";
};

datablock ExplosionData(jetFighterExplosion)
{
  //explosionShape 		= "art/shapes/vehicles/ship_scout/scout_debris.dts";
  playSpeed 			   = 1.0;
  particleEmitter 		= jetFighterExplosionEmitter;
  particleDensity 		= 60;
  particleRadius 		= 2; // total size of the explosion. Scale it up to have bigger explosions

  faceViewer     		= true;
  explosionScale 		= "1 1 1";

  shakeCamera 			= true;
  camShakeFreq 		   = "10.0 11.0 10.0";
  camShakeAmp 			= "1.0 1.0 1.0";
  camShakeDuration 	   = 0.5;
  camShakeRadius 		= 80.0;

  //soundProfile   		= jetFighterExplosionSound;
  emitter[0] 			   = jetFighterExplosionSparkEmitter;
};

datablock DebrisData(jetFighterDebris)
{
  explodeOnMaxBounce 	= true;
  elasticity 			= 0.15;
  friction 			= 0.5;
  lifetime 			= 7.0;
  lifetimeVariance 	= 4.0;
  minSpinSpeed 		= 40;
  maxSpinSpeed 		= 600;
  numBounces 			= 1;
  bounceVariance 	= 1;
  staticOnMaxBounce = true;
  gravModifier 		= 1.0;
  useRadiusMass 		= true;
  baseRadius 			= 1;
  velocity 			= 30.0;
  velocityVariance 	= 12.0;
  emitters[0] 		= jetFighterDebrisSmokeEmitter;
};

</pre><div></div><p></p><p> </p><p>art/datablocks/vehicles/jetFighterDB.cs<br /></p><p> </p><p></p><pre class="ipsCode">
//-----------------------------------------------------------------------------
// Vehiculo
// "Gibby's Generic Get Fighter"
// A basic flying vehicle datablock
//-----------------------------------------------------------------------------

exec("./jetFighter_fx.cs"); // visual fx

datablock FlyingVehicleData( JetFighter )
{
  category = "Vehicles";
  shapeFile = "art/shapes/vehicles/fighterJet/fighterJet.dts";

  // 3rd person camera settings
  cameraRoll              = true;
  cameraMaxDist           = 16;
  cameraOffset            = 1.0;
  cameraLag               =  0.1;
  cameraDecay             = 1.25;

  // Rigid Body
  mass                    = 100;
  massCenter              = "0 -0.2 0";
  massBox                 = "0 0 0";
  integration             = 3;
  collisionTol            = 0.6;
  contactTol              = 0.4;

  bodyFriction            = 0;
  bodyRestitution         = 0.8;
  minRollSpeed            = 2000;
  minImpactSpeed          = 5;
  softImpactSpeed         = 3;
  hardImpactSpeed         = 15;

  // Physics

  drag                    = 0.25;

  minDrag                 = 40;
  rotationalDrag          = 20;

  // Autostabilizer
  maxAutoSpeed            = 6;
  autoAngularForce        = 400;
  autoLinearForce         = 300;
  autoInputDamping        = 0.55;

  // Maneuvering
  maxSteeringAngle        = 3;
  powerSteering           = true;  // Power Steering 
  steeringReturn          = 0;     // Steering return-to-center
  steeringReturnSpeedScale = 0.01; // Steering return-to-center scale
  horizontalSurfaceForce  = 20;
  verticalSurfaceForce    = 20;
  maneuveringForce        = 6400;
  steeringForce           = 500;
  steeringRollForce       = 200;
  rollForce               = 10;
  hoverHeight             = 0.5;
  createHoverHeight       = 0.5;
  maxForwardSpeed         = 150;

  // Vertical jetting
  minJetEnergy            = 5;
  jetForce                = 750;
  jetEnergyDrain          = 5;
  vertThrustMultiple      = 10.0;

  // Object Impact Damage
  collDamageThresholdVel = 10.0;
  collDamageMultiplier   = 0.05;   
  minImpactSpeed = 10;         // If hit ground at speed above this then it's an impact. Meters / second
  speedDamageScale = 0.5;       // war 0.06   

  // Misc
  computeCRC = true;

  // Damage/Energy
maxDamage = 500;              // total damage until explosion
maxEnergy = 5000;              // Afterburner and any energy weapon pool
//energyPerDamagePoint = 160;
  destroyedLevel = 1.40;
  rechargeRate = 50;          // Afterburner recharge rate was 0.41

  // Emitters
  forwardJetEmitter       = jetFighterJetEmitter;
  backwardJetEmitter      = jetFighterJetEmitter;
  downJetEmitter          = jetFighterJetEmitterDown;
  trailEmitter            = jetFighterContrailEmitter;
  minTrailSpeed           = 10;
  //splashEmitter = VehicleFoamEmitter; 	// water splash stuff
  //dustEmitter = DustEmitter; // dust emitter when hovering over the ground
  //triggerDustHeight = 8;
  //dustHeight = 8;

  // Sounds
  engineSound             = genericJetEngineSound;//FighterEngineSnd;
  //jetSound                = genericJetThrustSound; //FighterJettingSnd;
  //----------------
  softImpactSound         = softImpact;
  hardImpactSound         = hardImpact;
  // Velocities
  softSplashSoundVelocity     = 10.0;
  mediumSplashSoundVelocity   = 15.0;
  hardSplashSoundVelocity     = 20.0;
  exitSplashSoundVelocity     = 10.0;

  // Damage emitters
  damageEmitter[0]         = jetFighterDamageSmoke;
  damageEmitter[1]         = HeavyDamageSmoke;
  damageEmitter[2]         = DestroyedDamageSmoke;
  damageEmitterOffset[0]   = "0 0 0";
  damageLevelTolerance[0]  = 0.3;
  damageLevelTolerance[1]  = 0.7;
  damageLevelTolerance[2]  = 0.9;
  numDmgEmitterAreas       = 3;

     // Explosion and debris setup
  explosion = jetFighterExplosion;
  underwaterExplosion = RocketLauncherWaterExplosion;
  explosionDamage = 40;         // How much damage is applied through a radiusDamage function call
explosionRadius = 30;         // the radius for the radiusDamage function call
  debris = jetFighterDebris;         // the debris datablock
  debrisShapeName = "art/shapes/vehicles/fighterJet/fighterJetDebris.dts"; // our debris shape (containts the explosion parts)  

  mountPose = "sitting";   
};
</pre><div></div><p></p><p> </p><p>Step3:	Add these lines to art/datablockExec.cs at line 65<br /></p><p> </p><p></p><pre class="ipsCode">
exec("./vehicles/jetFighter_fx.cs");
exec("./vehicles/jetFighterDB.cs");
</pre><div></div><p></p><p> </p><p>Step4: Add these lines to Empty Terrain.mis at line 115:<br /></p><p> </p><p></p><pre class="ipsCode">
   new FlyingVehicle() {
     disableMove = "0";
     isAIControlled = "0";
     dataBlock = "jetFighter";
     position = "-4.55322 -4.56358 246.531";
     rotation = "0.00621613 0.00266831 -0.999977 24.1927";
     scale = "1 1 1";
     canSave = "1";
     canSaveDynamicFields = "1";
     mountable = "1";
  };
</pre><div></div><p></p><p>   <br /></p><p>Step 5: Add these lines to scripts/client/default.binds.cs <br /></p><p>at line 304:<br /></p><p> </p><p></p><pre class="ipsCode">
//--&gt;&gt; Vehiculo
function doBoost(%val)
{
$mvTriggerCount3++;
}
//&lt;&lt;-- Vehiculo
</pre><div></div><p></p><p> </p><p>And this to the vehicleMap at line 762:</p><p></p><pre class="ipsCode">
vehicleMap.bind(keyboard, "lshift", doBoost);
</pre><div></div><p></p><p>	<br /></p><p>Step 6: Add this file to server/vehicles/ and execute it in scriptExec.cs:<br /></p><p>	<br /></p><p>jetFighter.cs</p><p></p><pre class="ipsCode">
//-----------------------------------------------------------------------------
// Vehiculo
// "Gibby's Generic Jet Fighter"
// Basic flying vehicle functionality
//-----------------------------------------------------------------------------

function jetFighter::create(%block)
{
  //echo("jetFighter-&gt;create called.");
%obj = new FlyingVehicle() {
	dataBlock = %block;
};
  return(%obj);
}

function jetFighter::onAdd(%this,%obj)
{
  Parent::onAdd( %this, %obj );

%obj.setEnergyLevel(%this.MaxEnergy);
%obj.setRechargeRate(%this.rechargeRate);
  //%obj.setRechargeRate( 25 );
  %obj.setRepairRate(0);
  %obj.mountable=true;
}

function jetFighter::onCollision(%this, %obj, %col)
{
  //echo("jetFighter-&gt;onCollision called.");

  if(!isObject(%obj))
     return;//don't do anything if we don't exist :P 
}

function jetFighter::onImpact(%this, %obj, %collidedObject, %vec, %vecLen)
{
  //echo("jetFighter-&gt;onImpact called: " @ %this SPC %obj SPC %collidedObject SPC %vec SPC %vecLen);
if(%vecLen &gt; %obj.minImpactSpeed)
	   %obj.damage(0, VectorAdd(%obj.getPosition(), %vec), %vecLen * %this.speedDamageScale, "Impact");
}

function jetFighter::damage(%this, %obj, %sourceObject, %position, %damage, %damageType)
{
if (%obj.getDamageState() $= "Destroyed")
	return;

%name = %obj.getShapeName;
%db = %obj.getDatablock().getName();
%damageMax = %db.maxDamage;
%team = %obj.team;

%obj.applyDamage(%damage);

if (%obj.getDamageState() $= "Destroyed")
{      
     //Conventional Blast here
     %pos = %obj.getPosition();
     %blastPos = %pos;
     %vehicle_blast = new explosion()
	{
		dataBlock = RocketLauncherExplosion;
		position = %blastPos;
	};
	MissionCleanup.add(%vehicle_blast);

}
}

function jetFighter::onDamage(%this, %obj, %delta)
{
  //echo("jetFighter-&gt;onDamage called.");
%damage = %obj.getDamageLevel();
%healthLeft = %this.maxDamage - %damage;
if(%damage &gt;= %this.maxDamage)
{
	if (isObject(%obj))
	{
		%obj.setDamageState(Destroyed);
	}
}
}

function jetFighter::onDisabled(%this,%obj,%state)
{
  //echo("jetFighter-&gt;onDisabled called.");

// Release the main weapon trigger
%obj.setImageTrigger(0,false);
%obj.setImageTrigger(1,false);

// Schedule corpse removal. Just keeping the place clean.
%obj.schedule(1, "startFade", 1, 0, true);
%obj.schedule(1, "delete");
}



$FlyerDamageWater 		= 1.4;
$FlyerDamageLava 		= 1.4;
$FlyerDamageHotLava 	= 1.4;
$FlyerDamageCrustyLava 	= 1.4;

function jetFighter::onEnterLiquid(%this, %obj, %coverage, %type)
{
  //echo("jetFighter-&gt;onEnterLiquid called.");
switch(%type)
{
	case 0: //Water
		%obj.setDamageDt($FlyerDamageWater, "Water");
	case 1: //Ocean Water
		%obj.setDamageDt($FlyerDamageWater, "Water");
	case 2: //River Water
		%obj.setDamageDt($FlyerDamageWater, "Water");
	case 3: //Stagnant Water
		%obj.setDamageDt($FlyerDamageWater, "Water");
	case 4: //Lava
		%obj.setDamageDt($FlyerDamageLava, "Lava");
	case 5: //Hot Lava
		%obj.setDamageDt($FlyerDamageHotLava, "Lava");
	case 6: //Crusty Lava
		%obj.setDamageDt($FlyerDamageCrustyLava, "Lava");
	case 7: //Quick Sand
}
}

function jetFighter::onLeaveLiquid(%this, %obj, %type)
{
  //echo("jetFighter-&gt;onLeaveLiquid called.");
%obj.clearDamageDt();
}
</pre><div></div><p></p><p>Step 7: Change this line in PlayerData::onCollision at line 176:<br /></p><p> </p><p></p><pre class="ipsCode">
      if ((%db.getClassName() $= "WheeledVehicleData" || %db.getClassName() $= "FlyingVehicleData") &amp;&amp; %obj.mountVehicle &amp;&amp; %obj.getState() $= "Move" &amp;&amp; %col.mountable)
</pre><div></div><p></p><p> </p><p>Step 8: Add this line to the PlayerData::onMount function in scripts/server/player.cs at line 66:<br /></p><p> </p><p></p><pre class="ipsCode">
      %obj.setAllMeshesHidden(true);  
     %obj.isHidden = true;
</pre><div></div><p></p><p>Step 9: Add these lines to the PlayerData::onUnmount function in scripts/server/player.cs at line 88:</p><p></p><pre class="ipsCode">
   %obj.setAllMeshesHidden(false);  
  %obj.isHidden = false;

  if(%obj.getClassName() $= "Player")
     commandToClient(%obj.client, 'toggleVehicleMap', true);
</pre><div></div><p></p><p> </p><p>Step 10: Add this line to scripts/server/scriptExec.cs at line 54:<br /></p><p> </p><p></p><pre class="ipsCode">
exec("./vehicles/jetFighter.cs");
</pre><div></div><p></p><p> </p><p>Run the game, play the ‘Empty Terrain’ mission and look to your left. Bump into the flyer and you’re airborne!</p>]]></description><guid isPermaLink="false">883</guid><pubDate>Sat, 04 Feb 2017 19:58:56 +0000</pubDate></item><item><title>Cut Scene Cam</title><link>https://torque3d.org/forums/topic/1126-cut-scene-cam/</link><description><![CDATA[<p><a href="https://github.com/TwistedJenius/CutSceneCam" rel="external nofollow">Get it here right now.</a><br /></p><p><br /></p><p>The Cut Scene Cam was originally going to be a paid product for T3D. I never announced it and only got it to an alpha/beta state before the market for paid T3D products dried up; so I never ended up finishing it. However, even in its current state, it's still fairly solid and better than any currently available alternative.<br /></p><p><br /></p><p>The Cut Scene Cam is mainly about camera work, with a little bit of choreography thrown in. Compared to Verve which seems to be mainly about choreography, with a little bit of camera work thrown in. And, although this was never really finished, it still seems to be more stable, complete, and easier to install and use than Verve or the Game Mechanics Kit.</p>]]></description><guid isPermaLink="false">1126</guid><pubDate>Sun, 01 Apr 2018 02:30:46 +0000</pubDate></item><item><title>[C++]Bullet decals disappear if the base is destroyed</title><link>https://torque3d.org/forums/topic/707-cbullet-decals-disappear-if-the-base-is-destroyed/</link><description><![CDATA[<p>Small code change to make the decals from bullet shots to dissapear if the object under it dissapears (or moves away or the shape changes and under the shots there is nothing anymore).<br /></p><p>I'm not sure if it works for multiplayer and it may be heavy on resources if there are a lot of decals active.<br /></p><p><br /></p><p>(Related to <a href="http://forums.torque3d.org/viewtopic.php?f=12&amp;t=733" rel="external nofollow">http://forums.torque3d.org/viewtopic.php?f=12&amp;t=733</a> )<br /></p><p><br /></p><p>Example_ A Red cube becomes a smaller green shape after a few bullets impact.<br /></p><p>Before the code change some decals keep hanging:<br /></p><p><span>http://i.imgur.com/RoWzqdB.png</span><br /></p><p><br /></p><p>With this code change the decals without base disappear:<br /></p><p><span>http://i.imgur.com/XkkwlBR.png</span><br /></p><p><br /></p><p>(Note: The decals need to have lifetime. Permanent decals keep hanging.)<br /></p><p><br /></p><p><br /></p><p>--Code changes--<br /></p><p><br /></p><p>In decalInstance.h add after<br /></p><p> </p><p></p><pre class="ipsCode">      DecalData *mDataBlock;</pre><div></div><p></p><p> </p><p>this line:<br /></p><p> </p><p></p><pre class="ipsCode">      S32 surfaceObject;</pre><div></div><p></p><p> </p><p><br /></p><p>Then, also in that file, replace<br /></p><p> </p><p></p><pre class="ipsCode">	   DecalInstance() : mId(-1) {}   </pre><div></div><p></p><p> </p><p>with<br /></p><p> </p><p></p><pre class="ipsCode">	   DecalInstance() : mId(-1), surfaceObject(0) {}   </pre><div></div><p></p><p> </p><p><br /></p><p><br /></p><p>In projectile.cpp find:<br /></p><p> </p><p></p><pre class="ipsCode">      // Client (impact) decal.
     if ( mDataBlock-&gt;decal )     
        gDecalManager-&gt;addDecal(p, n, 0.0f, mDataBlock-&gt;decal);</pre><div></div><p></p><p>         <br /></p><p>And replace it with:<br /></p><p> </p><p></p><pre class="ipsCode">      // Client (impact) decal.
     DecalInstance * decalReturn = NULL;
     if ( mDataBlock-&gt;decal )     
        decalReturn = gDecalManager-&gt;addDecal(p, n, 0.0f, mDataBlock-&gt;decal);
     if(decalReturn)
     {
        RayInfo rInfo;
        Point3F oldPosition = p;
        Point3F newPosition = p - (n*0.05);
        // Raycast the abstract PhysicsWorld if a PhysicsPlugin exists.
        bool hit = false;
        //disableCollision();
        //let's ignore bullet physics and go the poor castRay
        hit = gClientContainer.castRay(oldPosition, newPosition, csmDynamicCollisionMask | csmStaticCollisionMask, &amp;rInfo);
        //enableCollision();
        //if(rInfo.object has some quality that enables this check) {
           if(hit)
              decalReturn-&gt;surfaceObject = (rInfo.object)-&gt;getId(); //else, surfaceObject keeps being 0
        //} ----- closing of  if(rInfo.object has some quality...)
     }</pre><div></div><p></p><p>      <br /></p><p>---------------------------------      <br /></p><p><br /></p><p>In decalManager.cpp find:</p><p></p><pre class="ipsCode">            if ( dinst-&gt;mVisibility &lt;= 0.0f )
           {
              mDecalQueue.erase_fast( i );
              removeDecal( dinst );               
              i--;
              continue;
           }
        }</pre><div></div><p></p><p>         <br /></p><p>And add after that:</p><p></p><pre class="ipsCode">         if(dinst-&gt;surfaceObject)
        {
           if(!Sim::findObject(dinst-&gt;surfaceObject))
           {
              //the object that was under the decal does not exist anymore
              mDecalQueue.erase_fast( i );
              removeDecal( dinst );               
              i--;
              continue;
           }
           RayInfo rInfo;
           Point3F oldPosition = dinst-&gt;mPosition;
           Point3F newPosition = dinst-&gt;mPosition - (dinst-&gt;mNormal*0.05);
           bool hit = false;
           //disableCollision();
           //let's ignore bullet physics and go the poor castRay in the client
           hit = gClientContainer.castRay(oldPosition, newPosition, (PlayerObjectType | VehicleObjectType) | (TerrainObjectType | StaticShapeObjectType), &amp;rInfo);
           //enableCollision();
           if(!hit || ((rInfo.object)-&gt;getId() != dinst-&gt;surfaceObject))
           {
              //the object that was under the decal moved or transformed and the decal is in the air
              mDecalQueue.erase_fast( i );
              removeDecal( dinst );               
              i--;
              continue;
           }
        }
</pre><div></div><p></p><p> </p><p>They should end as:<br /></p><p>source\T3D\decal\decalInstance.h : <a href="http://pastebin.com/43QiN2df" rel="external nofollow">http://pastebin.com/43QiN2df</a><br /></p><p>source\T3D\projectile.cpp : <a href="http://pastebin.com/B170LDAm" rel="external nofollow">http://pastebin.com/B170LDAm</a><br /></p><p>source\T3D\decal\decalManager.cpp : <a href="http://pastebin.com/r1U5fJ5F" rel="external nofollow">http://pastebin.com/r1U5fJ5F</a></p>]]></description><guid isPermaLink="false">707</guid><pubDate>Wed, 27 Jul 2016 11:28:29 +0000</pubDate></item><item><title>RPG Dialog resource updated for T3D 3.8</title><link>https://torque3d.org/forums/topic/712-rpg-dialog-resource-updated-for-t3d-38/</link><description><![CDATA[<p>RPG Dialog 1.4 to T3D 3.8<br /></p><p>(*It also works in T3D 3.9)<br /></p><p><br /></p><p>Since I couldn’t get the Yack Pack working in T3D 3.8, I decided to check out an old GG resource called: RPG Dialog (v1.4). After some experimenting, I was able to get NPCs spawning with the dialog options. Only issue is the sound isn't working. See console errors:<br /></p><p><br /></p><p><b><strong>scripts/client/RPGDialog.cs (190): Unable to find function alxIsPlaying</strong><br /></b></p><p><strong>scripts/client/RPGDialog.cs (191): Unable to find function alxStop</strong><br /></p><p><strong>scripts/client/RPGDialog.cs (194): Unable to find function alxPlay</strong><br /></p><p><br /></p><p><br /></p><p>DropBox link: <a href="https://www.dropbox.com/sh/gxfy58huq3hvrpl/AACefZCSBHwnU4JAftDhzv9Ga?dl=0" rel="external nofollow">https://www.dropbox.com/sh/gxfy58huq3hvrpl/AACefZCSBHwnU4JAftDhzv9Ga?dl=0</a><br /></p><p><br /></p><p>I used the following forum topics to get this working:<br /></p><p>(Original Resource): <a href="http://www.garagegames.com/community/resources/view/3531" rel="external nofollow">http://www.garagegames.com/community/resources/view/3531</a><br /></p><p><a href="https://www.garagegames.com/community/forums/viewthread/93667" rel="external nofollow">https://www.garagegames.com/community/forums/viewthread/93667</a><br /></p><p><a href="http://www.garagegames.com/community/forums/viewthread/75606" rel="external nofollow">http://www.garagegames.com/community/forums/viewthread/75606</a><br /></p><p><a href="https://www.garagegames.com/community/forums/viewthread/137872" rel="external nofollow">https://www.garagegames.com/community/forums/viewthread/137872</a></p>]]></description><guid isPermaLink="false">712</guid><pubDate>Sun, 31 Jul 2016 18:20:58 +0000</pubDate></item><item><title>Side-scroller Scripts</title><link>https://torque3d.org/forums/topic/893-side-scroller-scripts/</link><description><![CDATA[<p>U4ti1Z4Y6Hs <br /></p><p><br /></p><p>Download:<br /></p><p><a href="https://drive.google.com/file/d/0B4K1M7P0W_qbSlRJZDhvcktHaTA/view?usp=sharing" rel="external nofollow">https://drive.google.com/file/d/0B4K1M7P0W_qbSlRJZDhvcktHaTA/view?usp=sharing</a><br /></p><p><br /></p><p>Another resource that I had been working on, only to later abandon. <br /></p><p><br /></p><p>The files are as is, and probably won't be updated by me. <b><strong>This was made using Torque3D 3.9</strong></b><br /></p><p><br /></p><p>I included a video tutorial of setting up a side-scroller level. <i><em>The video is no where near professional. I tried though.</em></i></p>]]></description><guid isPermaLink="false">893</guid><pubDate>Thu, 16 Feb 2017 15:26:43 +0000</pubDate></item><item><title>Starter.Racing - TGE Demo port.</title><link>https://torque3d.org/forums/topic/781-starterracing-tge-demo-port/</link><description><![CDATA[<p><span style="font-size:48px;">Starter.Racing</span><br /></p><p><br /></p><p>This is a slightly enhanced port of the original TGE starter.racing demo. Based on the resource as packaged in TGE 1.52.<br /></p><p><br /></p><p>Primarily a script resource, this includes one engine source file to fix potentially game-crashing bugs in guiSpeedometer.cpp found in T3D versions 3.9 and lower. To use the resource in stock T3D without rebuilding, the GuiSpeedometerHud control should be removed from /art/gui/playGui.gui before trying to play the game.<br /></p><p><br /></p><p>A precompiled version with the GuiSpeedometerHud bug fixes can be found in the ./game subdirectory.<br /></p><p><br /></p><p><span style="font-size:24px;">Gameplay</span><br /></p><p>This is a simple multiplayer racer using typical Torque keyboard/mouse controls featuring a *very* basic demo level. The game begins and waits for network players to join. The race will start after a set wait period elapses or when a player triggers race start (depending on settings). Players drive through series of checkpoints (defined by trigger objects) to complete a determined number of laps. When a player enters the final trigger the race is complete. A simple scoreboard of race wins is displayed for a set time and then new round will begin. If multiple levels have been defined, the game will cycle through them when progressing through rounds.<br /></p><p><br /></p><p>If the game is not set to autoStart, racing rounds must be started with the ctrl-s keyboard command.<br /></p><p><br /></p><p><span style="font-size:24px;">Usage</span><br /></p><p>The game is controlled by a handful of global variables set in /sripts/server/game.cs as follows:</p><p></p><ul><li>$Game::DefaultPlayerDataBlock - Datablock to define vehicles in race.<br /><br />$Game::laps - Number of laps per race<br /><br />$Game::autoStart - If true, the race starts automatically after $Game::WaitTime seconds. If false, each race is started with a keyboard command (ctrl+s)<br /><br />$Game::WaitTime - How long to wait for players to enter the game before starting a race (if autoStart=true).<br /><br />$Game::EndGamePause - How long to display the scoreboard after a race is complete.<br /></li></ul><p></p><p>Checkpoints are laid out using standard trigger objects defined with the following fields:</p><p></p><ul><li>datablock - must be "<b><strong>CheckpointTrigger</strong></b>".<br /><br />checkpoint - Integer defining the order checkpoints should be entered.<br /><br />isLast - Boolean defining which checkpoint ends the race.<br /></li></ul><p></p><p><span style="font-size:24px;">Installation</span><br /></p><p>Files can be downloaded <a href="https://github.com/yourarcade/torque/raw/master/t3d/resources/starter.racing/starter.racing.current.zip" rel="external nofollow">in a zip file</a>. Source can be <a href="https://github.com/yourarcade/torque/tree/master/t3d/resources/starter.racing" rel="external nofollow">browsed on Gihub</a>.<br /></p><p><br /></p><p>This resource is based on T3D 3.8 and project manager 2.2. To install, create a new project using the empty template. Copy all files into the project directory and regenerate the project.</p>]]></description><guid isPermaLink="false">781</guid><pubDate>Sat, 01 Oct 2016 19:49:22 +0000</pubDate></item><item><title>Yack Pack 3.8 merge with errors</title><link>https://torque3d.org/forums/topic/676-yack-pack-38-merge-with-errors/</link><description><![CDATA[<p>*Updated Subject for clarification*<br></p><p><br></p><p>Hi all. I had Yack Pack working in 3.6.1 and now I'm having some trouble with 3.8. Below is the merge guide I created for 3.6.1 and used for 3.8 (*note: only changed code snippets are shown. You still need to own Yack Pack and have access to it's merge guide.)<br></p><p><br></p><p>First, here are some helpful references that I used:<br></p><p>TDN: <a href="http://tdn.garagegames.com/wiki/TorqueShaderEngine/Yack_Pack_TGEA_1_7" rel="external nofollow">http://tdn.garagegames.com/wiki/TorqueShaderEngine/Yack_Pack_TGEA_1_7</a><br></p><p>Resource: <a href="http://www.garagegames.com/community/resource/view/19541/1" rel="external nofollow">http://www.garagegames.com/community/resource/view/19541/1</a><br></p><p>Forums: <a href="http://www.garagegames.com/community/forums/viewthread/100823/1" rel="external nofollow">http://www.garagegames.com/community/forums/viewthread/100823/1</a><br></p><p><br></p><p>And here is the current Visual Studio error I'm getting when trying to compile with 3.8. I think it has something to do with "console.h". A lot has changed in that file since 3.6 and "dialogMemory.cpp" has that as an #include. Any tips on what I need to change?<br></p><p><br></p><p><b><strong>error C2440: 'type cast' : cannot convert from 'ConsoleValueRef' to 'char *'          dialogMemory.cpp	120</strong><br></b></p><p><strong>error C2440: 'type cast' : cannot convert from 'ConsoleValueRef' to 'char *'          dialogMemory.cpp	125</strong><br></p><p><br></p><p><b><strong>dilaogMemory.cpp</strong></b> code that the errors are referring to:</p><pre class="lang-c ported-from-old-forums">ConsoleMethod(DialogMemory, addPhrase, void, 3, 3, "phrase")
{
	object-&gt;addPhrase((char*)argv[2]);
}
 
ConsoleMethod(DialogMemory, hasPhrase, bool, 3, 3, "phrase")
{
	return object-&gt;hasPhrase((char*)argv[2]);
}</pre><p> </p><p><br></p><p><b><u><strong><span style="text-decoration:underline;">And now for the 3.6.1 merge changes:</span></strong></u></b><br></p><p><br></p><p><u><span style="text-decoration:underline;">Change the following in dialogMemory.cpp:</span></u><br></p><p>change <b><strong>#include "core/bitStream.h"</strong></b> to <b><strong>#include "core/stream/bitStream.h"</strong></b><br></p><p>change <b><strong>#include "game/gameConnection.h"</strong></b> to <b><strong>#include "T3D/gameBase/gameConnection.h"</strong></b><br></p><p>change <b><strong>#include "game/dialogMemory.h"</strong></b> to <b><strong>#include "T3D/dialogMemory.h"</strong></b><br></p><p>change <b><strong>bool DialogMemory::onNewDataBlock(GameBaseData* dptr)</strong></b> to <b><strong>bool DialogMemory::onNewDataBlock(GameBaseData* dptr, bool reload)</strong></b><br></p><p>change <b><strong>if (!mDataBlock || !Parent::onNewDataBlock(dptr))</strong></b> to <b><strong>if (!mDataBlock || !Parent::onNewDataBlock(dptr, reload))</strong></b><br></p><p><br></p><p><u><span style="text-decoration:underline;">Change the following in dialogMemory.h:</span></u><br></p><p>change <b><strong>#include "game/gameConnection.h"</strong></b> to <b><strong>#include "T3D/gameBase/gameConnection.h"</strong></b><br></p><p>change <b><strong>#include "core/tVector.h"</strong></b> to <b><strong>#include "core/util/tVector.h"</strong></b><br></p><p>change <b><strong>#include "game/gameBase.h"</strong></b> to <b><strong>#include "T3D/gameBase/gameBase.h"</strong></b><br></p><p>change <b><strong>bool onNewDataBlock(GameBaseData* dptr);</strong></b> to <b><strong>bool onNewDataBlock(GameBaseData* dptr, bool reload);</strong></b><br></p><p><br></p><p><u><span style="text-decoration:underline;">Follow the official Yack Pack Merge Guide with the noted changes:</span></u><br></p><p><br></p><p><b><strong>Step 1) engine/source/T3D/player.h</strong></b><br></p><p>1. Insert: replace #include "game/dialogMemory.h" with #include "T3D/dialogMemory.h"<br></p><p>2. Insert: same as merge guide<br></p><p>3. Insert: same as merge guide<br></p><p><br></p><p><b><strong>Step 2) engine/source/T3D/player.cpp</strong></b><br></p><p>1. Insert: same as merge guide<br></p><p>2. Insert: same as merge guide<br></p><p>3. Insert: same as merge guide<br></p><p>4. Insert: same as merge guide<br></p><p><br></p><p><b><strong>Step 3) engine/source/T3D/shapeBase.h</strong></b><br></p><p>1. Insert: Place after the following <b><strong>bool mTrigger[MaxTriggerKeys];</strong></b>  ///&lt; What triggers are set, if any.<br></p><p>2. Insert: comment out <b><strong>static void initPersistFields();</strong></b><br></p><p><br></p><p><b><strong>Step 4) engine/source/T3D/shapeBase.cpp</strong></b><br></p><p>1. Replace: Not necessary, sAudioTimeout is already set to 500<br></p><p>2. Insert: Place after the following <b><strong>mWeaponCamShake = NULL; (instead of damageDir.set(0, 0, 1);)</strong></b><br></p><p>3. Insert: same as merge guide<br></p><p>4. Insert: same as merge guide<br></p><p>5. Insert: Place after the following <b><strong>“Parent::initPersistFields();”</strong></b> (in the void ShapeBase::initPersistFields() function)</p><pre class="lang-c ported-from-old-forums">//START YACK
addField("enableUse", TypeBool, Offset(mEnableUse, ShapeBase));
//END YACK</pre><p>Then insert the following at the end of the file:</p><pre class="lang-c ported-from-old-forums">//START YACK
ConsoleMethod( ShapeBase, enableUse, void, 3, 3, "bool")
{
	object-&gt;enableUse(dAtob(argv[2]));
}
 
ConsoleMethod( ShapeBase, isUseEnabled, bool, 2, 2, "")
{
	return object-&gt;isUseEnabled();
}
//END YACK</pre><p> </p><p><b><strong>Step 5) engine/source/T3D/fps/guiCrossHairHud.cpp</strong></b><br></p><p>1. Insert: same as merge guide<br></p><p>2. Insert: same as merge guide<br></p><p>3. Insert: same as merge guide<br></p><p>4. Insert: same as merge guide<br></p><p>5. Replace: same as merge guide<br></p><p>6. Replace: same as merge guide<br></p><p>7. Insert: same as merge guide<br></p><p>8. Insert: same as merge guide<br></p><p>9. Insert: replace <b><strong>Con::executef(this, 1, "onRender");</strong></b> with <b><strong>Con::executef(this, "onRender");</strong></b><br></p><p>10. Insert: same as merge guide<br></p><p><br></p><p><b><strong>Step 6) engine/source/gui/utility/guiInputCtrl.h</strong></b><br></p><p>1. Insert: place after the following: <b><strong>typedef GuiMouseEventCtrl Parent;</strong></b><br></p><p>2. Insert: place the following after <b><strong>DECLARE_CONOBJECT(GuiInputCtrl);</strong></b></p><pre class="lang-c ported-from-old-forums">//START YACK
GuiInputCtrl();
//END YACK</pre><p> </p><p><b><strong>Step 7) engine/source/gui/utility/guiInputCtrl.cpp</strong></b><br></p><p>1. Insert: same as merge guide<br></p><p>2. Insert: place after the following <b><strong>IMPLEMENT_CONOBJECT(GuiInputCtrl);</strong></b></p><pre class="lang-c ported-from-old-forums">//START YACK
GuiInputCtrl::GuiInputCtrl()
{
    mAutoGrabInput = true;
}
//END YACK</pre><p>Then place after the following <b><strong>Parent::initPersistFields();</strong></b> (in the void GuiInputCtrl::initPersistFields() function)</p><pre class="lang-c ported-from-old-forums">//START YACK
addField("autoGrabInput", TypeBool, Offset(mAutoGrabInput, GuiInputCtrl));
//END YACK</pre><p>3. Replace: same as merge guide<br></p><p>4. Replace: same as merge guide<br></p><p><br></p><p><b><strong>Step 8) engine/source/gui/controls/guiTextListCtrl.h</strong></b><br></p><p>1. Insert: same as merge guide<br></p><p>2. Insert: same as merge guide<br></p><p>3. Insert: same as merge guide<br></p><p><br></p><p><b><strong>Step 9) engine/source/gui/controls/guiTextListCtrl.cpp</strong></b><br></p><p>1. Insert: same as merge guide<br></p><p>2. Insert: same as merge guide<br></p><p>3. Replace: the entire <b><strong>GuiTextListCtrl::onRenderCell</strong></b> function with:</p><pre class="lang-c ported-from-old-forums">void GuiTextListCtrl::onRenderCell(Point2I offset, Point2I cell, bool selected, bool mouseOver)
{
   if ( mList[cell.y].active )
   {
      if (selected || (mProfile-&gt;mMouseOverSelected &amp;&amp; mouseOver))
      {
         RectI highlightRect = RectI(offset.x, offset.y, mCellSize.x, mCellSize.y);
         highlightRect.inset( 0, -1 );
         renderFilledBorder( highlightRect, mProfile-&gt;mBorderColorHL, mProfile-&gt;mFillColorHL);
         GFX-&gt;getDrawUtil()-&gt;setBitmapModulation(mProfile-&gt;mFontColorHL);
      }
      else
         GFX-&gt;getDrawUtil()-&gt;setBitmapModulation(mouseOver ? mProfile-&gt;mFontColorHL : mProfile-&gt;mFontColor);
   }
   else
      GFX-&gt;getDrawUtil()-&gt;setBitmapModulation( mProfile-&gt;mFontColorNA );
 
   const char *text = mList[cell.y].text;
   for(U32 index = 0; index &lt; mColumnOffsets.size(); index++)
   {
      const char *nextCol = dStrchr(text, '\t');
      if(mColumnOffsets[index] &gt;= 0)
      {
         dsize_t slen;
         if(nextCol)
            slen = nextCol - text;
         else
            slen = dStrlen(text);
 
         Point2I pos(offset.x + 4 + mColumnOffsets[index], offset.y);
 
         RectI saveClipRect;
         bool clipped = false;
 
         if(mClipColumnText &amp;&amp; (index != (mColumnOffsets.size() - 1)))
         {
            saveClipRect = GFX-&gt;getClipRect();
 
            RectI clipRect(pos, Point2I(mColumnOffsets[index+1] - mColumnOffsets[index] - 4, mCellSize.y));
            if(clipRect.intersect(saveClipRect))
            {
               clipped = true;
               GFX-&gt;setClipRect( clipRect );
            }
         }
 
         GFX-&gt;getDrawUtil()-&gt;drawTextN(mFont, pos, text, slen, mProfile-&gt;mFontColors);
 
         if(clipped)
            GFX-&gt;setClipRect( saveClipRect );
      }
      if(!nextCol)
         break;
      text = nextCol+1;
   }
}</pre><p>4. Insert: same as merge guide<br></p><p>5. Insert: same as merge guide<br></p><p>6. Insert: same as merge guide<br></p><p>7. Insert: same as merge guide</p>]]></description><guid isPermaLink="false">676</guid><pubDate>Wed, 06 Jul 2016 02:19:02 +0000</pubDate></item></channel></rss>
