<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title><![CDATA[VadaVaka - Programming]]></title>
		<link>https://vadavaka.com/forums/</link>
		<description><![CDATA[VadaVaka - https://vadavaka.com/forums]]></description>
		<pubDate>Sat, 12 Sep 2026 08:04:18 +0000</pubDate>
		<generator>MyBB</generator>
		<item>
			<title><![CDATA[Universal Mouse Movement Transformer (Natural Acceleration)]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=5232</link>
			<pubDate>Thu, 21 Apr 2022 17:18:05 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=105">LiTHiuM</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=5232</guid>
			<description><![CDATA[MOUSE_DIMENSION.h<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#pragma once<br />
<br />
#define MOUSE_PI 3.14159265358979323846264338327950f<br />
<br />
class MOUSE_DIMENSION<br />
{<br />
private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned long long m_CALLS_PER_INSTANCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned long long m_INSTANCES_PER_LOSS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;long long m_TOTAL_ANGLE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: Change to double<br />
&nbsp;&nbsp;&nbsp;&nbsp;//unsigned long long m_INFLATION_FACTOR;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double m_INFLATION_FACTOR;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_RESOLUTION;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_FOV;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_SENSITIVITY;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_CIRCUMFERENCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_RADIUS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float RESOLUTION_AND_FOV_TO_RADIUS(float RESOLUTION, float FOV);<br />
public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;MOUSE_DIMENSION(float RESOLUTION, float FOV, float SENSITIVITY, unsigned long long CALLS_PER_INSTANCE, unsigned long long INSTANCES_PER_LOSS, int MAXIMUM_SENSITIVITY, int STATIC_SENSITIVITY_INCREMENT_SIZE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_RESOLUTION(float RESOLUTION);<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_FOV(float FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_SENSITIVITY(float SENSITIVITY);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;long INPUT(float INPUT);<br />
};</code></div></div><br />
MOUSE_DIMENSION.cpp<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include "MOUSE_DIMENSION.h"<br />
<br />
float MOUSE_DIMENSION::RESOLUTION_AND_FOV_TO_RADIUS(float RESOLUTION, float FOV)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: return RADIUS from FOV in PIXELS instead of DEGREES<br />
&nbsp;&nbsp;&nbsp;&nbsp;return (RESOLUTION / sin(MOUSE_PI / (360 / FOV))) / 2;<br />
}<br />
<br />
MOUSE_DIMENSION::MOUSE_DIMENSION(float RESOLUTION = 800, float FOV = 90, float SENSITIVITY = 1, unsigned long long CALLS_PER_INSTANCE = 1, unsigned long long INSTANCES_PER_LOSS = 360000, int MAXIMUM_SENSITIVTY = 10, int INCREMENTS_PER_UNIT_OF_SENSITIVITY = 5)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_RESOLUTION = RESOLUTION;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(RESOLUTION, FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_CIRCUMFERENCE = this-&gt;m_RADIUS * MOUSE_PI * 2;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_FOV = FOV;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_SENSITIVITY = SENSITIVITY;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_CALLS_PER_INSTANCE = CALLS_PER_INSTANCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_INSTANCES_PER_LOSS = INSTANCES_PER_LOSS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// this accounts for maximum transduced input of PI radians (THE RESULT OF TRANSDUCTION IS ALWAYS BETWEEN -PI AND PI RADIANS)<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_INFLATION_FACTOR = m_CALLS_PER_INSTANCE * m_INSTANCES_PER_LOSS * (MOUSE_PI * 1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_TOTAL_ANGLE = 0;<br />
}<br />
void MOUSE_DIMENSION::UPDATE_RESOLUTION(float RESOLUTION)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_TOTAL_ANGLE = (m_TOTAL_ANGLE / (m_RESOLUTION / (m_RESOLUTION = RESOLUTION)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(RESOLUTION, this-&gt;m_FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_CIRCUMFERENCE = m_RADIUS * MOUSE_PI * 2;<br />
<br />
}<br />
void MOUSE_DIMENSION::UPDATE_FOV(float FOV)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(m_RESOLUTION, m_FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_CIRCUMFERENCE = m_RADIUS * MOUSE_PI * 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: UPDATE CIRCUMFERENCE, INFLATION_FACTOR, and TOTAL_ANGLE<br />
}<br />
void MOUSE_DIMENSION::UPDATE_SENSITIVITY(float SENSITIVITY)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_SENSITIVITY = SENSITIVITY;<br />
}<br />
float ABSN(float INPUT)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return sqrt(INPUT * INPUT);<br />
}<br />
float ATANN(float INPUT) <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return INPUT / ABSN(INPUT);<br />
}<br />
inline float MODULO(float x, float y)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return fmod(x, y);<br />
}<br />
inline float INTEGERIZE(float input)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return input - MODULO(input, 1);<br />
}<br />
inline float CLAMP(float rotations_in_n_units, float half_n_unit)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return MODULO(INTEGERIZE(rotations_in_n_units / half_n_unit), 2) * -1 * half_n_unit + MODULO(rotations_in_n_units, half_n_unit);<br />
}<br />
float TRANSDUCE(float INPUT, float SENSITIVITY) <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return ATANN(INPUT) * 2 * asinf(ABSN(CLAMP(INPUT * SENSITIVITY, 2)) / 2);<br />
}<br />
float FORMAT_INPUT(float INPUT, float SENSITIVITY)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return TRANSDUCE(INPUT, SENSITIVITY);<br />
}<br />
long MOUSE_DIMENSION::INPUT(float INPUT)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;long TOTAL_ANGLE = this-&gt;m_TOTAL_ANGLE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_TOTAL_ANGLE = static_cast&lt;long long&gt;(fmod(m_TOTAL_ANGLE + (FORMAT_INPUT(INPUT, this-&gt;m_SENSITIVITY) * this-&gt;m_RADIUS * this-&gt;m_INFLATION_FACTOR ),m_CIRCUMFERENCE * m_INFLATION_FACTOR));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; "m_RESOLUTION: " &lt;&lt; m_RESOLUTION &lt;&lt; ", m_INFLATION_FACTOR: " &lt;&lt; m_INFLATION_FACTOR &lt;&lt; ", NEW_TOTAL: " &lt;&lt; TOTAL_ANGLE &lt;&lt; "&#92;n";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return static_cast&lt;long long&gt;(TOTAL_ANGLE / m_INFLATION_FACTOR);<br />
}</code></div></div>]]></description>
			<content:encoded><![CDATA[MOUSE_DIMENSION.h<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#pragma once<br />
<br />
#define MOUSE_PI 3.14159265358979323846264338327950f<br />
<br />
class MOUSE_DIMENSION<br />
{<br />
private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned long long m_CALLS_PER_INSTANCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;unsigned long long m_INSTANCES_PER_LOSS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;long long m_TOTAL_ANGLE;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: Change to double<br />
&nbsp;&nbsp;&nbsp;&nbsp;//unsigned long long m_INFLATION_FACTOR;<br />
&nbsp;&nbsp;&nbsp;&nbsp;double m_INFLATION_FACTOR;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_RESOLUTION;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_FOV;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_SENSITIVITY;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_CIRCUMFERENCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;float m_RADIUS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;float RESOLUTION_AND_FOV_TO_RADIUS(float RESOLUTION, float FOV);<br />
public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;MOUSE_DIMENSION(float RESOLUTION, float FOV, float SENSITIVITY, unsigned long long CALLS_PER_INSTANCE, unsigned long long INSTANCES_PER_LOSS, int MAXIMUM_SENSITIVITY, int STATIC_SENSITIVITY_INCREMENT_SIZE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_RESOLUTION(float RESOLUTION);<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_FOV(float FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;void UPDATE_SENSITIVITY(float SENSITIVITY);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;long INPUT(float INPUT);<br />
};</code></div></div><br />
MOUSE_DIMENSION.cpp<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>#include "MOUSE_DIMENSION.h"<br />
<br />
float MOUSE_DIMENSION::RESOLUTION_AND_FOV_TO_RADIUS(float RESOLUTION, float FOV)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: return RADIUS from FOV in PIXELS instead of DEGREES<br />
&nbsp;&nbsp;&nbsp;&nbsp;return (RESOLUTION / sin(MOUSE_PI / (360 / FOV))) / 2;<br />
}<br />
<br />
MOUSE_DIMENSION::MOUSE_DIMENSION(float RESOLUTION = 800, float FOV = 90, float SENSITIVITY = 1, unsigned long long CALLS_PER_INSTANCE = 1, unsigned long long INSTANCES_PER_LOSS = 360000, int MAXIMUM_SENSITIVTY = 10, int INCREMENTS_PER_UNIT_OF_SENSITIVITY = 5)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_RESOLUTION = RESOLUTION;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(RESOLUTION, FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_CIRCUMFERENCE = this-&gt;m_RADIUS * MOUSE_PI * 2;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_FOV = FOV;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_SENSITIVITY = SENSITIVITY;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_CALLS_PER_INSTANCE = CALLS_PER_INSTANCE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_INSTANCES_PER_LOSS = INSTANCES_PER_LOSS;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;// this accounts for maximum transduced input of PI radians (THE RESULT OF TRANSDUCTION IS ALWAYS BETWEEN -PI AND PI RADIANS)<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_INFLATION_FACTOR = m_CALLS_PER_INSTANCE * m_INSTANCES_PER_LOSS * (MOUSE_PI * 1);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_TOTAL_ANGLE = 0;<br />
}<br />
void MOUSE_DIMENSION::UPDATE_RESOLUTION(float RESOLUTION)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_TOTAL_ANGLE = (m_TOTAL_ANGLE / (m_RESOLUTION / (m_RESOLUTION = RESOLUTION)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(RESOLUTION, this-&gt;m_FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_CIRCUMFERENCE = m_RADIUS * MOUSE_PI * 2;<br />
<br />
}<br />
void MOUSE_DIMENSION::UPDATE_FOV(float FOV)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_RADIUS = this-&gt;RESOLUTION_AND_FOV_TO_RADIUS(m_RESOLUTION, m_FOV);<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_CIRCUMFERENCE = m_RADIUS * MOUSE_PI * 2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//TODO: UPDATE CIRCUMFERENCE, INFLATION_FACTOR, and TOTAL_ANGLE<br />
}<br />
void MOUSE_DIMENSION::UPDATE_SENSITIVITY(float SENSITIVITY)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;m_SENSITIVITY = SENSITIVITY;<br />
}<br />
float ABSN(float INPUT)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return sqrt(INPUT * INPUT);<br />
}<br />
float ATANN(float INPUT) <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return INPUT / ABSN(INPUT);<br />
}<br />
inline float MODULO(float x, float y)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return fmod(x, y);<br />
}<br />
inline float INTEGERIZE(float input)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return input - MODULO(input, 1);<br />
}<br />
inline float CLAMP(float rotations_in_n_units, float half_n_unit)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return MODULO(INTEGERIZE(rotations_in_n_units / half_n_unit), 2) * -1 * half_n_unit + MODULO(rotations_in_n_units, half_n_unit);<br />
}<br />
float TRANSDUCE(float INPUT, float SENSITIVITY) <br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return ATANN(INPUT) * 2 * asinf(ABSN(CLAMP(INPUT * SENSITIVITY, 2)) / 2);<br />
}<br />
float FORMAT_INPUT(float INPUT, float SENSITIVITY)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;return TRANSDUCE(INPUT, SENSITIVITY);<br />
}<br />
long MOUSE_DIMENSION::INPUT(float INPUT)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;long TOTAL_ANGLE = this-&gt;m_TOTAL_ANGLE;<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_TOTAL_ANGLE = static_cast&lt;long long&gt;(fmod(m_TOTAL_ANGLE + (FORMAT_INPUT(INPUT, this-&gt;m_SENSITIVITY) * this-&gt;m_RADIUS * this-&gt;m_INFLATION_FACTOR ),m_CIRCUMFERENCE * m_INFLATION_FACTOR));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;std::cout &lt;&lt; "m_RESOLUTION: " &lt;&lt; m_RESOLUTION &lt;&lt; ", m_INFLATION_FACTOR: " &lt;&lt; m_INFLATION_FACTOR &lt;&lt; ", NEW_TOTAL: " &lt;&lt; TOTAL_ANGLE &lt;&lt; "&#92;n";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;return static_cast&lt;long long&gt;(TOTAL_ANGLE / m_INFLATION_FACTOR);<br />
}</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[An Idea of Mine]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=5093</link>
			<pubDate>Wed, 16 Jan 2008 21:54:43 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=35">Wha?</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=5093</guid>
			<description><![CDATA[I was thinking about finding a way for ricochet bots to shoot something other than simple targets, and I thought, &amp;quot;why not just have the bot develop its own method?&amp;quot; But, instead of trying to learn how to use a neural net, or other complicated arrangement, why not use an option that&#39;s been proven effective over 3.7 billion years?<br />
<br />
I am of course referring to evolution. If the bot has dynamic AI code, and is subject to selection pressures, it will eventually become well-suited to those pressures, and thus a smarter, tougher bot is born--provided you specify the right pressures.<br />
<br />
Right now I&#39;m just trying to come up with rough methods to achieve the key effects: Mutation, selection, inheritability, and how not to crash the game while doing it.<br />
<br />
Any interest?]]></description>
			<content:encoded><![CDATA[I was thinking about finding a way for ricochet bots to shoot something other than simple targets, and I thought, &amp;quot;why not just have the bot develop its own method?&amp;quot; But, instead of trying to learn how to use a neural net, or other complicated arrangement, why not use an option that&#39;s been proven effective over 3.7 billion years?<br />
<br />
I am of course referring to evolution. If the bot has dynamic AI code, and is subject to selection pressures, it will eventually become well-suited to those pressures, and thus a smarter, tougher bot is born--provided you specify the right pressures.<br />
<br />
Right now I&#39;m just trying to come up with rough methods to achieve the key effects: Mutation, selection, inheritability, and how not to crash the game while doing it.<br />
<br />
Any interest?]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Ricochet HLTV Support]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=5037</link>
			<pubDate>Sun, 16 Sep 2007 22:18:56 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=73">GoD-Tony</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=5037</guid>
			<description><![CDATA[This code will prevent an HLTV Proxy from being entered into matches while on arena (it already worked in deathmatch):<br />
<br />
In disc_arena.cpp (Line 93):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>if &#40;pPlayer &amp;amp;&amp;amp; &#40;pPlayer-&#62;m_pCurrentArena == this&#41; &amp;amp;&amp;amp; pPlayer-&#62;m_bHasDisconnected &#33;= TRUE &amp;amp;&amp;amp; &#40;stricmp&#40;GETPLAYERAUTHID&#40;pPlayer-&#62;edict&#40;&#41;&#41;, &#34;HLTV&#34;&#41; &#33;= 0&#41;&#41;</code></div></div><br />
This is what the function CDiscArena::Reset will look like after the code has been added (starting on line 86):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>void CDiscArena&#58;&#58;Reset&#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Remove all clients in the queue<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; int i = 1; i &#60;= gpGlobals-&#62;maxClients; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CBasePlayer *pPlayer = &#40;CBasePlayer *&#41;UTIL_PlayerByIndex&#40; i &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pPlayer &amp;amp;&amp;amp; &#40;pPlayer-&#62;m_pCurrentArena == this&#41; &amp;amp;&amp;amp; pPlayer-&#62;m_bHasDisconnected &#33;= TRUE &amp;amp;&amp;amp; &#40;stricmp&#40;GETPLAYERAUTHID&#40;pPlayer-&#62;edict&#40;&#41;&#41;, &#34;HLTV&#34;&#41; &#33;= 0&#41;&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RemoveClient&#40; pPlayer &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Move her into spectator mode<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//MoveToSpectator&#40; pPlayer &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_pPlayerQueue = NULL;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_iPlayers = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_flTimeLimitOver = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_bShownTimeWarning = FALSE;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_iArenaState = ARENA_WAITING_FOR_PLAYERS;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset&#40; m_hCombatants, 0, sizeof&#40; m_hCombatants &#41; &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetThink&#40; NULL &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pev-&#62;nextthink = 0;<br />
}</code></div></div><br />
Any HLTV Proxy that connects to a server has the SteamID of HLTV, which makes it easier to distinguish  from real players.]]></description>
			<content:encoded><![CDATA[This code will prevent an HLTV Proxy from being entered into matches while on arena (it already worked in deathmatch):<br />
<br />
In disc_arena.cpp (Line 93):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>if &#40;pPlayer &amp;amp;&amp;amp; &#40;pPlayer-&#62;m_pCurrentArena == this&#41; &amp;amp;&amp;amp; pPlayer-&#62;m_bHasDisconnected &#33;= TRUE &amp;amp;&amp;amp; &#40;stricmp&#40;GETPLAYERAUTHID&#40;pPlayer-&#62;edict&#40;&#41;&#41;, &#34;HLTV&#34;&#41; &#33;= 0&#41;&#41;</code></div></div><br />
This is what the function CDiscArena::Reset will look like after the code has been added (starting on line 86):<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>void CDiscArena&#58;&#58;Reset&#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Remove all clients in the queue<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; int i = 1; i &#60;= gpGlobals-&#62;maxClients; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CBasePlayer *pPlayer = &#40;CBasePlayer *&#41;UTIL_PlayerByIndex&#40; i &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pPlayer &amp;amp;&amp;amp; &#40;pPlayer-&#62;m_pCurrentArena == this&#41; &amp;amp;&amp;amp; pPlayer-&#62;m_bHasDisconnected &#33;= TRUE &amp;amp;&amp;amp; &#40;stricmp&#40;GETPLAYERAUTHID&#40;pPlayer-&#62;edict&#40;&#41;&#41;, &#34;HLTV&#34;&#41; &#33;= 0&#41;&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;RemoveClient&#40; pPlayer &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Move her into spectator mode<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//MoveToSpectator&#40; pPlayer &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_pPlayerQueue = NULL;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_iPlayers = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_flTimeLimitOver = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_bShownTimeWarning = FALSE;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;m_iArenaState = ARENA_WAITING_FOR_PLAYERS;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;memset&#40; m_hCombatants, 0, sizeof&#40; m_hCombatants &#41; &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SetThink&#40; NULL &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pev-&#62;nextthink = 0;<br />
}</code></div></div><br />
Any HLTV Proxy that connects to a server has the SteamID of HLTV, which makes it easier to distinguish  from real players.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[String Sorting Algorithm]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=4566</link>
			<pubDate>Mon, 27 Feb 2006 15:10:57 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=144">8-up</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=4566</guid>
			<description><![CDATA[I&#39;ve been trying to write a string sorting algorithm for the past few days.<br />
<br />
I&#39;m using a lanugage that does not have any built-in functions that sort the way I want to sort.<br />
<br />
The strings will contain alpha <span style="font-weight: bold;" class="mycode_b">and</span> numeric characters.<br />
<br />
Here&#39;s an example of what I want to do:<br />
<br />
Let&#39;s say we have a file with the following strings:<br />
<br />
TEST, BELT, 40E, A1, A2, 1, 2,3, 4, 1A, 1D, 2D, 65A, 3D, 4D, 10D, 1E, 20D, 30D, 40D, 41D, 1D1<br />
<br />
<br />
The user is able to choose a minimum and maximum.<br />
<br />
For example, user enters<br />
Min: 1D<br />
Max: 40D<br />
<br />
and it should pull the following:<br />
1D, 2D, 3D, 4D, 10D, 20D, 30D, 40D<br />
<br />
(in that order)<br />
<br />
<br />
I&#39;m guessing it would be similar to the StrCmpLogicalW function, but I would like it to not be case sensitive.<br />
<br />
I would appreciate the help.]]></description>
			<content:encoded><![CDATA[I&#39;ve been trying to write a string sorting algorithm for the past few days.<br />
<br />
I&#39;m using a lanugage that does not have any built-in functions that sort the way I want to sort.<br />
<br />
The strings will contain alpha <span style="font-weight: bold;" class="mycode_b">and</span> numeric characters.<br />
<br />
Here&#39;s an example of what I want to do:<br />
<br />
Let&#39;s say we have a file with the following strings:<br />
<br />
TEST, BELT, 40E, A1, A2, 1, 2,3, 4, 1A, 1D, 2D, 65A, 3D, 4D, 10D, 1E, 20D, 30D, 40D, 41D, 1D1<br />
<br />
<br />
The user is able to choose a minimum and maximum.<br />
<br />
For example, user enters<br />
Min: 1D<br />
Max: 40D<br />
<br />
and it should pull the following:<br />
1D, 2D, 3D, 4D, 10D, 20D, 30D, 40D<br />
<br />
(in that order)<br />
<br />
<br />
I&#39;m guessing it would be similar to the StrCmpLogicalW function, but I would like it to not be case sensitive.<br />
<br />
I would appreciate the help.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[my pic]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=4274</link>
			<pubDate>Thu, 06 Oct 2005 23:42:36 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=98">CowEater</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=4274</guid>
			<description><![CDATA[see<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1886" target="_blank" title="">notworking.JPG</a> (Size: 109.11 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[see<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1886" target="_blank" title="">notworking.JPG</a> (Size: 109.11 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Third person]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=4164</link>
			<pubDate>Mon, 05 Sep 2005 22:24:40 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=4164</guid>
			<description><![CDATA[This is the entire view.cpp since I made a few changes that will keep thirdperson off for those who don&#39;t want it on when they die<img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" />.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>// view/refresh setup functions<br />
<br />
#include &#34;hud.h&#34;<br />
#include &#34;cl_util.h&#34;<br />
#include &#34;cvardef.h&#34;<br />
#include &#34;usercmd.h&#34;<br />
#include &#34;const.h&#34;<br />
<br />
#include &#34;entity_state.h&#34;<br />
#include &#34;cl_entity.h&#34;<br />
#include &#34;ref_params.h&#34;<br />
#include &#34;in_defs.h&#34; // PITCH YAW ROLL<br />
#include &#34;pm_movevars.h&#34;<br />
#include &#34;pm_shared.h&#34;<br />
#include &#34;pmtrace.h&#34;<br />
#include &#34;screenfade.h&#34;<br />
#include &#34;shake.h&#34;<br />
<br />
// Spectator Mode<br />
extern &#34;C&#34; <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vecNewViewAngles&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iHasNewViewAngles;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vecNewViewOrigin&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iHasNewViewOrigin;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iIsSpectator;<br />
}<br />
<br />
extern float g_flStartScaleTime;<br />
extern int iMouseInUse;<br />
void CAM_ToThirdPerson&#40;void&#41;;<br />
void CAM_ToFirstPerson&#40;void&#41;;<br />
<br />
#ifndef M_PI<br />
#define M_PI Â 3.14159265358979323846&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// matches value in gcc v2 math.h<br />
#endif<br />
<br />
extern &#34;C&#34; <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CL_IsThirdPerson&#40; void &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void CL_CameraOffset&#40; float *ofs &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void DLLEXPORT V_CalcRefdef&#40; struct ref_params_s *pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void PM_ParticleLine&#40; float *start, float *end, int pcolor, float life, float vert&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int PM_GetInfo&#40; int ent &#41;;<br />
<br />
}<br />
<br />
void V_DropPunchAngle &#40; float frametime, float *ev_punchangle &#41;;<br />
void VectorAngles&#40; const float *forward, float *angles &#41;;<br />
<br />
/*<br />
The view is allowed to move slightly from it&#39;s true position for bobbing,<br />
but if it exceeds 8 pixels linear distance &#40;spherical, not box&#41;, the list of<br />
entities sent from the server may not include everything in the pvs, especially<br />
when crossing a water boudnary.<br />
*/<br />
<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_forwardspeed;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*chase_active;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsx, *scr_ofsy, *scr_ofsz;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_vsmoothing;<br />
<br />
vec3_t v_origin, v_angles;<br />
<br />
vec3_t ev_punchangle;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsx;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsy;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsz;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_centermove;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_centerspeed;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bobcycle;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bob;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bobup;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_waterdist;<br />
<br />
// These cvars are not registered &#40;so users can&#39;t cheat&#41;, so set the -&#62;value field directly<br />
// Register these cvars in V_Init&#40;&#41; if needed for easy tweaking<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iyaw_cycle Â = {&#34;v_iyaw_cycle&#34;, &#34;2&#34;, 0, 2};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iroll_cycle Â = {&#34;v_iroll_cycle&#34;, &#34;0.5&#34;, 0, 0.5};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_ipitch_cycle Â = {&#34;v_ipitch_cycle&#34;, &#34;1&#34;, 0, 1};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iyaw_level Â = {&#34;v_iyaw_level&#34;, &#34;0.3&#34;, 0, 0.3};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iroll_level Â = {&#34;v_iroll_level&#34;, &#34;0.1&#34;, 0, 0.1};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_ipitch_level Â = {&#34;v_ipitch_level&#34;, &#34;0.3&#34;, 0, 0.3};<br />
<br />
float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale; Â // used by TFC for concussion grenade effect<br />
<br />
//=============================================================================<br />
void V_NormalizeAngles&#40; float *angles &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Normalize angles<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; angles&#91;i&#93; &#62; 180.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles&#91;i&#93; -= 360.0;<br />
 Â }<br />
 Â else if &#40; angles&#91;i&#93; &#60; -180.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles&#91;i&#93; += 360.0;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
/*<br />
===================<br />
V_InterpolateAngles<br />
<br />
Interpolate Euler angles.<br />
FIXME&#58; Â Use Quaternions to avoid discontinuities<br />
Frac is 0.0 to 1.0 &#40; i.e., should probably be clamped, but doesn&#39;t have to be &#41;<br />
===================<br />
*/<br />
void V_InterpolateAngles&#40; float *start, float *end, float *output, float frac &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float ang1, ang2;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float d;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; start &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; end &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â ang1 = start&#91;i&#93;;<br />
 Â ang2 = end&#91;i&#93;;<br />
<br />
 Â d = ang2 - ang1;<br />
 Â if &#40; d &#62; 180 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d -= 360;<br />
 Â }<br />
 Â else if &#40; d &#60; -180 &#41;<br />
 Â {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d += 360;<br />
 Â }<br />
<br />
 Â output&#91;i&#93; = ang1 + d * frac;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; output &#41;;<br />
}<br />
<br />
// Quakeworld bob code, this fixes jitters in the mutliplayer since the clock &#40;pparams-&#62;time&#41; isn&#39;t quite linear<br />
float V_CalcBob &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bobtime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;spectator &#124;&#124; iIsSpectator &#41;<br />
 Â return 0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;onground == -1 &#124;&#124;<br />
 Â  pparams-&#62;time == lasttime &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // just use old value<br />
 Â return bob;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime = pparams-&#62;time;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bobtime += pparams-&#62;frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle = bobtime - &#40;int&#41;&#40; bobtime / cl_bobcycle-&#62;value &#41; * cl_bobcycle-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle /= cl_bobcycle-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cycle &#60; cl_bobup-&#62;value &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cycle = M_PI * cycle / cl_bobup-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cycle = M_PI + M_PI * &#40; cycle - cl_bobup-&#62;value &#41;/&#40; 1.0 - cl_bobup-&#62;value &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// bob is proportional to simulated velocity in the xy plane<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &#40;don&#39;t count Z, or jumping messes it up&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simvel, vel &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vel&#91;2&#93; = 0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = sqrt&#40; vel&#91;0&#93; * vel&#91;0&#93; + vel&#91;1&#93; * vel&#91;1&#93; &#41; * cl_bob-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = bob * 0.3 + bob * 0.7 * sin&#40;cycle&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = min&#40; bob, 4 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = max&#40; bob, -7 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return bob;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
}<br />
<br />
/*<br />
===============<br />
V_CalcRoll<br />
Used by view and sv_user<br />
===============<br />
*/<br />
float V_CalcRoll &#40;vec3_t angles, vec3_t velocity, float rollangle, float rollspeed &#41;<br />
{<br />
 Â  Â float Â  sign;<br />
 Â  Â float Â  side;<br />
 Â  Â float Â  value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t Â forward, right, up;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; angles, forward, right, up &#41;;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;side = DotProduct &#40;velocity, right&#41;;<br />
 Â  Â sign = side &#60; 0 ? -1 &#58; 1;<br />
 Â  Â side = fabs&#40; side &#41;;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value = rollangle;<br />
 Â  Â if &#40;side &#60; rollspeed&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â side = side * value / rollspeed;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â  Â else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â side = value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return side * sign;<br />
}<br />
<br />
typedef struct pitchdrift_s<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â pitchvel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodrift;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â driftmove;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double Â laststop;<br />
} pitchdrift_t;<br />
<br />
static pitchdrift_t pd;<br />
<br />
void V_StartPitchDrift&#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pd.laststop == gEngfuncs.GetClientTime&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â return; Â // something else is keeping it from drifting<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pd.nodrift &#124;&#124; &#33;pd.pitchvel &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.pitchvel = v_centerspeed-&#62;value;<br />
 Â pd.nodrift = 0;<br />
 Â pd.driftmove = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
void V_StopPitchDrift &#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.laststop = gEngfuncs.GetClientTime&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.nodrift = 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
}<br />
<br />
/*<br />
===============<br />
V_DriftPitch<br />
<br />
Moves the client pitch angle towards idealpitch sent by the server.<br />
<br />
If the user is adjusting pitch manually, either with lookup/lookdown,<br />
mlook and mouse, or klook and keyboard, pitch drifting is constantly stopped.<br />
===============<br />
*/<br />
void V_DriftPitch &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â delta, move;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; gEngfuncs.IsNoClipping&#40;&#41; &#124;&#124; &#33;pparams-&#62;onground &#124;&#124; pparams-&#62;demoplayback &#124;&#124; pparams-&#62;spectator &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.driftmove = 0;<br />
 Â pd.pitchvel = 0;<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t count small mouse motion<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pd.nodrift&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; fabs&#40; pparams-&#62;cmd-&#62;forwardmove &#41; &#60; cl_forwardspeed-&#62;value &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.driftmove = 0;<br />
 Â else<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.driftmove += pparams-&#62;frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â if &#40; pd.driftmove &#62; v_centermove-&#62;value&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_StartPitchDrift &#40;&#41;;<br />
 Â }<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delta = pparams-&#62;idealpitch - pparams-&#62;cl_viewangles&#91;PITCH&#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;&#33;delta&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.pitchvel = 0;<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = pparams-&#62;frametime * pd.pitchvel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel += pparams-&#62;frametime * v_centerspeed-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
//Con_Printf &#40;&#34;move&#58; %f &#40;%f&#41;&#092;n&#34;, move, pparams-&#62;frametime&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;delta &#62; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40;move &#62; delta&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = delta;<br />
 Â }<br />
 Â pparams-&#62;cl_viewangles&#91;PITCH&#93; += move;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;delta &#60; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40;move &#62; -delta&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = -delta;<br />
 Â }<br />
 Â pparams-&#62;cl_viewangles&#91;PITCH&#93; -= move;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
/* <br />
============================================================================== <br />
 Â  Â  Â VIEW RENDERING <br />
============================================================================== <br />
*/ <br />
<br />
/*<br />
==================<br />
V_CalcGunAngle<br />
==================<br />
*/<br />
void V_CalcGunAngle &#40; struct ref_params_s *pparams &#41;<br />
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *viewent;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent = gEngfuncs.GetViewModel&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;viewent &#41;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;YAW&#93; Â  = Â pparams-&#62;viewangles&#91;YAW&#93; Â  + pparams-&#62;crosshairangle&#91;YAW&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;PITCH&#93; = -pparams-&#62;viewangles&#91;PITCH&#93; + pparams-&#62;crosshairangle&#91;PITCH&#93; * 0.25;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;ROLL&#93; Â -= v_idlescale * sin&#40;pparams-&#62;time*v_iroll_cycle.value&#41; * v_iroll_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t apply all of the v_ipitch to prevent normally unseen parts of viewmodel from coming into view.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;PITCH&#93; -= v_idlescale * sin&#40;pparams-&#62;time*v_ipitch_cycle.value&#41; * &#40;v_ipitch_level.value * 0.5&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;YAW&#93; Â  -= v_idlescale * sin&#40;pparams-&#62;time*v_iyaw_cycle.value&#41; * v_iyaw_level.value;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewent-&#62;angles, viewent-&#62;curstate.angles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewent-&#62;angles, viewent-&#62;latched.prevangles &#41;;<br />
}<br />
<br />
/*<br />
==============<br />
V_AddIdle<br />
<br />
Idle swaying<br />
==============<br />
*/<br />
void V_AddIdle &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;ROLL&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_iroll_cycle.value&#41; * v_iroll_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;PITCH&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_ipitch_cycle.value&#41; * v_ipitch_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;YAW&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_iyaw_cycle.value&#41; * v_iyaw_level.value;<br />
}<br />
<br />
<br />
/*<br />
==============<br />
V_CalcViewRoll<br />
<br />
Roll is induced by movement and damage<br />
==============<br />
*/<br />
void V_CalcViewRoll &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â side;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *viewentity;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewentity = gEngfuncs.GetEntityByIndex&#40; pparams-&#62;viewentity &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;viewentity &#41;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;side = V_CalcRoll &#40; viewentity-&#62;angles, pparams-&#62;simvel, pparams-&#62;movevars-&#62;rollangle, pparams-&#62;movevars-&#62;rollspeed &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;ROLL&#93; += side;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;health &#60;= 0 &amp;amp;&amp;amp; &#40; pparams-&#62;viewheight&#91;2&#93; &#33;= 0 &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // only roll the view if the player is dead and the viewheight&#91;2&#93; is nonzero <br />
 Â // this is so deadcam in multiplayer will work.<br />
 Â pparams-&#62;viewangles&#91;ROLL&#93; = 80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// dead view angle<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
<br />
/*<br />
==================<br />
V_CalcIntermissionRefdef<br />
<br />
==================<br />
*/<br />
void V_CalcIntermissionRefdef &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*ent, *view;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â old;<br />
<br />
// don&#39;t allow cheats in multiplayer<br />
#if &#33;defined&#40; _DEBUG &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;maxclients &#62; 1 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsx&#34;, 0&#41;;<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsy&#34;, 0&#41;;<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsz&#34;, 0&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ent is the player model &#40; visible when out of body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ent = gEngfuncs.GetLocalPlayer&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// view is the weapon model &#40;only visible from inside body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view = gEngfuncs.GetViewModel&#40;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, pparams-&#62;vieworg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;model = NULL;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// allways idle in intermission<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old = v_idlescale;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale = 1;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_AddIdle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale = old;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_origin = pparams-&#62;vieworg;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
}<br />
<br />
#define ORIGIN_BACKUP 64<br />
#define ORIGIN_MASK &#40; ORIGIN_BACKUP - 1 &#41;<br />
<br />
typedef struct <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Origins&#91; ORIGIN_BACKUP &#93;&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float OriginTime&#91; ORIGIN_BACKUP &#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Angles&#91; ORIGIN_BACKUP &#93;&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float AngleTime&#91; ORIGIN_BACKUP &#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CurrentOrigin;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CurrentAngle;<br />
} viewinterp_t;<br />
<br />
/*<br />
==================<br />
V_CalcRefdef<br />
<br />
==================<br />
*/<br />
void V_CalcNormalRefdef &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t Â *ent, *view;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â  Â i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob, waterOffset;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static viewinterp_t Â ViewInterp;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float oldz = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float lasttime;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float lastang&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t angdelta;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t camAngles, camForward, camRight, camUp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *pwater;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Miagi to store flag<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float cam_gotofirstperson;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t allow cheats in multiplayer<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;maxclients &#62; 1 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â scr_ofsx-&#62;value = 0.0;<br />
 Â scr_ofsy-&#62;value = 0.0;<br />
 Â scr_ofsz-&#62;value = 0.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_DriftPitch &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ent is the player model &#40; visible when out of body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ent = gEngfuncs.GetLocalPlayer&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// view is the weapon model &#40;only visible from inside body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view = gEngfuncs.GetViewModel&#40;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// transform the view offset by the model&#39;s matrix to get the offset from<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// model origin for the view<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = V_CalcBob &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Observer angle capturing and smoothing<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; iHasNewViewOrigin &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // Get the angles from the physics code<br />
 Â VectorCopy&#40; vecNewViewOrigin, pparams-&#62;vieworg &#41;;<br />
 Â VectorCopy&#40; vecNewViewOrigin, pparams-&#62;simorg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// refresh position<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, pparams-&#62;vieworg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += &#40; bob &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;vieworg, pparams-&#62;viewheight, pparams-&#62;vieworg &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Observer angle capturing and smoothing<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; iHasNewViewAngles &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // Get the angles from the physics code<br />
 Â VectorCopy&#40; vecNewViewAngles, pparams-&#62;cl_viewangles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40; pparams-&#62;health == -5 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â //Miagi saving view<br />
 Â if &#40; &#33;CL_IsThirdPerson&#40;&#41; &#41;<br />
 Â { <br />
 Â  Â cam_gotofirstperson = 1;<br />
 Â }<br />
 Â //End Miagi saving<br />
 Â CAM_ToThirdPerson&#40;&#41;;<br />
<br />
 Â // Lock mouse movement Â  Miagi-Dont lock<br />
 Â iMouseInUse=0;<br />
<br />
 Â pparams-&#62;cl_viewangles&#91;0&#93; = 89;<br />
<br />
 Â // Spin the view<br />
 Â float flTimeDelta = &#40;pparams-&#62;time - g_flStartScaleTime&#41;;<br />
 Â if &#40; flTimeDelta &#62; 0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float flROFSpin = 1.0 + &#40;flTimeDelta * 2.0&#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float flSpin = flTimeDelta * 45;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;cl_viewangles&#91;1&#93; = flSpin * flROFSpin;<br />
 Â }<br />
 Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Miagi Go back to first if in first<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; cam_gotofirstperson == 1 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cam_gotofirstperson = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CAM_ToFirstPerson&#40;&#41;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//End Miagi<br />
/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Â  Â causing the problem.. Miagi<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â //CAM_ToFirstPerson&#40;&#41;;<br />
<br />
 Â // Unlock mouse movement<br />
 Â //iMouseInUse=0;<br />
<br />
 Â CAM_ToThirdPerson&#40;&#41;;<br />
<br />
 Â // Lock mouse movement<br />
 Â iMouseInUse=0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}*/<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorSubtract&#40; pparams-&#62;cl_viewangles, lastang, angdelta &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; Length&#40; angdelta &#41; &#33;= 0.0 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â VectorCopy&#40; pparams-&#62;cl_viewangles, ViewInterp.Angles&#91; ViewInterp.CurrentAngle &amp;amp; ORIGIN_MASK &#93; &#41;;<br />
 Â ViewInterp.AngleTime&#91; ViewInterp.CurrentAngle &amp;amp; ORIGIN_MASK &#93; = pparams-&#62;time;<br />
 Â ViewInterp.CurrentAngle++;<br />
<br />
 Â VectorCopy&#40; pparams-&#62;cl_viewangles, lastang &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cl_vsmoothing &amp;amp;&amp;amp; cl_vsmoothing-&#62;value &amp;amp;&amp;amp; &#40; iIsSpectator &amp;amp; SPEC_SMOOTH_ANGLES &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int foundidx;<br />
 Â int i;<br />
 Â float t;<br />
<br />
 Â if &#40; cl_vsmoothing-&#62;value &#60; 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.Cvar_SetValue&#40; &#34;cl_vsmoothing&#34;, 0.0 &#41;;<br />
 Â }<br />
<br />
 Â t = pparams-&#62;time - cl_vsmoothing-&#62;value;<br />
<br />
 Â for &#40; i = 1; i &#60; ORIGIN_MASK; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundidx = ViewInterp.CurrentAngle - 1 - i;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#60;= t &#41;<br />
 Â  Â break;<br />
 Â }<br />
<br />
 Â if &#40; i &#60; ORIGIN_MASK &amp;amp;&amp;amp; ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Interpolate<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double dt;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt = ViewInterp.AngleTime&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93; - ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; dt &#62; 0.0 &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â double frac;<br />
<br />
 Â  Â frac = &#40; t - ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK&#93; &#41; / dt;<br />
 Â  Â frac = min&#40; 1.0, frac &#41;;<br />
<br />
 Â  Â // interpolate angles<br />
 Â  Â V_InterpolateAngles&#40; ViewInterp.Angles&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, ViewInterp.Angles&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93;, pparams-&#62;cl_viewangles, frac &#41;;<br />
<br />
 Â  Â VectorCopy&#40; pparams-&#62;cl_viewangles, vecNewViewAngles &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_CalcShake&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_ApplyShake&#40; pparams-&#62;vieworg, pparams-&#62;viewangles, 1.0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// never let view origin sit exactly on a node line, because a water plane can<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// dissapear when viewed with the eye exactly on it.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// FIXME, we send origin at 1/128 now, change this?<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// the server protocol only specifies to 1/16 pixel, so add 1/32 in each axis<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;0&#93; += 1.0/32;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;1&#93; += 1.0/32;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 1.0/32;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Check for problems around water, move the viewer artificially if necessary <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// -- this prevents drawing errors in GL due to waves<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;waterlevel &#62;= 2 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int Â i, contents, waterDist, waterEntity;<br />
 Â vec3_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point;<br />
 Â waterDist = cl_waterdist-&#62;value;<br />
<br />
 Â if &#40; pparams-&#62;hardware &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterEntity = gEngfuncs.PM_WaterEntity&#40; pparams-&#62;simorg &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; waterEntity &#62;= 0 &amp;amp;&amp;amp; waterEntity &#60; pparams-&#62;max_entities &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â pwater = gEngfuncs.GetEntityByIndex&#40; waterEntity &#41;;<br />
 Â  Â if &#40; pwater &amp;amp;&amp;amp; &#40; pwater-&#62;model &#33;= NULL &#41; &#41;<br />
 Â  Â {<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterDist += &#40; pwater-&#62;curstate.scale * 16 &#41;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add in wave height<br />
 Â  Â }<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterEntity = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Don&#39;t need this in software<br />
 Â }<br />
 Â <br />
 Â VectorCopy&#40; pparams-&#62;vieworg, point &#41;;<br />
<br />
 Â // Eyes are above water, make sure we&#39;re above the waves<br />
 Â if &#40; pparams-&#62;waterlevel == 2 &#41;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point&#91;2&#93; -= waterDist;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; waterDist; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â contents = gEngfuncs.PM_PointContents&#40; point, NULL &#41;;<br />
 Â  Â if &#40; contents &#62; CONTENTS_WATER &#41;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />
 Â  Â point&#91;2&#93; += 1;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = &#40;point&#91;2&#93; + waterDist&#41; - pparams-&#62;vieworg&#91;2&#93;;<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// eyes are under water. Â Make sure we&#39;re far enough under<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point&#91;2&#93; += waterDist;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; waterDist; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â contents = gEngfuncs.PM_PointContents&#40; point, NULL &#41;;<br />
 Â  Â if &#40; contents &#60;= CONTENTS_WATER &#41;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />
 Â  Â point&#91;2&#93; -= 1;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = &#40;point&#91;2&#93; - waterDist&#41; - pparams-&#62;vieworg&#91;2&#93;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += waterOffset;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_CalcViewRoll &#40; pparams &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_AddIdle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// offsets<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;cl_viewangles, angles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; angles, pparams-&#62;forward, pparams-&#62;right, pparams-&#62;up &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i=0; i&#60;3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pparams-&#62;vieworg&#91;i&#93; += scr_ofsx-&#62;value*pparams-&#62;forward&#91;i&#93; + scr_ofsy-&#62;value*pparams-&#62;right&#91;i&#93; + scr_ofsz-&#62;value*pparams-&#62;up&#91;i&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Treating cam_ofs&#91;2&#93; as the distance<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&#40; CL_IsThirdPerson&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â vec3_t ofs;<br />
 Â ofs&#91;0&#93; = ofs&#91;1&#93; = ofs&#91;2&#93; = 0.0;<br />
 Â CL_CameraOffset&#40; &#40;float *&#41;&amp;amp;ofs &#41;;<br />
<br />
 Â VectorCopy&#40; ofs, camAngles &#41;;<br />
 Â camAngles&#91; ROLL &#93;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 0;<br />
 Â AngleVectors&#40; camAngles, camForward, camRight, camUp &#41;;<br />
<br />
 Â // Is the player in a falling anim? If so, raise camera above and look down<br />
 Â if &#40; pparams-&#62;health == -5 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 92;<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â pparams-&#62;vieworg&#91; i &#93; += -ofs&#91;2&#93; * camForward&#91; i &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 20;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Give gun our viewangles<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, view-&#62;angles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// set up gun position<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_CalcGunAngle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Use predicted origin as view origin.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, view-&#62;origin &#41;; Â  Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; += &#40; waterOffset &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; view-&#62;origin, pparams-&#62;viewheight, view-&#62;origin &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Let the viewmodel shake at about 10% of the amplitude<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_ApplyShake&#40; view-&#62;origin, view-&#62;angles, 0.9 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91; i &#93; += bob * 0.4 * pparams-&#62;forward&#91; i &#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; += bob;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// throw in a little tilt.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;YAW&#93; Â  -= bob * 0.5;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;ROLL&#93; Â -= bob * 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;PITCH&#93; -= bob * 0.3;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// pushing the view origin down off of the same X/Z plane as the ent&#39;s origin will give the<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// gun a very nice &#39;shifting&#39; effect when the player looks up/down. If there is a problem<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// with view model distortion, this may be a cause. &#40;SJB&#41;. <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; -= 1;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// fudge position around to keep amount of weapon visible<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// roughly equal with different FOV<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pparams-&#62;viewsize == 110&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 100&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 2;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 90&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 80&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 0.5;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add in the punchangle, if any<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd &#40; pparams-&#62;viewangles, pparams-&#62;punchangle, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Include client side punch, too<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd &#40; pparams-&#62;viewangles, &#40;float *&#41;&amp;amp;ev_punchangle, pparams-&#62;viewangles&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_DropPunchAngle &#40; pparams-&#62;frametime, &#40;float *&#41;&amp;amp;ev_punchangle &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// smooth out stair step ups<br />
#if 1<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;pparams-&#62;smoothing &amp;amp;&amp;amp; pparams-&#62;onground &amp;amp;&amp;amp; pparams-&#62;simorg&#91;2&#93; - oldz &#62; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â float steptime;<br />
 Â <br />
 Â steptime = pparams-&#62;time - lasttime;<br />
 Â if &#40;steptime &#60; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//FIXME Â I_Error &#40;&#34;steptime &#60; 0&#34;&#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;steptime = 0;<br />
<br />
 Â oldz += steptime * 150;<br />
 Â if &#40;oldz &#62; pparams-&#62;simorg&#91;2&#93;&#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oldz = pparams-&#62;simorg&#91;2&#93;;<br />
 Â if &#40;pparams-&#62;simorg&#91;2&#93; - oldz &#62; 18&#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oldz = pparams-&#62;simorg&#91;2&#93;- 18;<br />
 Â pparams-&#62;vieworg&#91;2&#93; += oldz - pparams-&#62;simorg&#91;2&#93;;<br />
 Â view-&#62;origin&#91;2&#93; += oldz - pparams-&#62;simorg&#91;2&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â oldz = pparams-&#62;simorg&#91;2&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â static float lastorg&#91;3&#93;;<br />
 Â vec3_t delta;<br />
<br />
 Â VectorSubtract&#40; pparams-&#62;simorg, lastorg, delta &#41;;<br />
<br />
 Â if &#40; Length&#40; delta &#41; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, ViewInterp.Origins&#91; ViewInterp.CurrentOrigin &amp;amp; ORIGIN_MASK &#93; &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewInterp.OriginTime&#91; ViewInterp.CurrentOrigin &amp;amp; ORIGIN_MASK &#93; = pparams-&#62;time;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewInterp.CurrentOrigin++;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, lastorg &#41;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Smooth out whole view in multiplayer when on trains, lifts<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cl_vsmoothing &amp;amp;&amp;amp; cl_vsmoothing-&#62;value &amp;amp;&amp;amp;<br />
 Â &#40; &#40; iIsSpectator &amp;amp; SPEC_SMOOTH_ORIGIN &#41; &#124;&#124; &#40;pparams-&#62;smoothing &amp;amp;&amp;amp; &#40; pparams-&#62;maxclients &#62; 1 &#41; &#41; &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int foundidx;<br />
 Â int i;<br />
 Â float t;<br />
<br />
 Â if &#40; cl_vsmoothing-&#62;value &#60; 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.Cvar_SetValue&#40; &#34;cl_vsmoothing&#34;, 0.0 &#41;;<br />
 Â }<br />
<br />
 Â t = pparams-&#62;time - cl_vsmoothing-&#62;value;<br />
<br />
 Â for &#40; i = 1; i &#60; ORIGIN_MASK; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundidx = ViewInterp.CurrentOrigin - 1 - i;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#60;= t &#41;<br />
 Â  Â break;<br />
 Â }<br />
<br />
 Â if &#40; i &#60; ORIGIN_MASK &amp;amp;&amp;amp; Â ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Interpolate<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t delta;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double frac;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double dt;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t neworg;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt = ViewInterp.OriginTime&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93; - ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; dt &#62; 0.0 &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â frac = &#40; t - ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK&#93; &#41; / dt;<br />
 Â  Â frac = min&#40; 1.0, frac &#41;;<br />
 Â  Â VectorSubtract&#40; ViewInterp.Origins&#91; &#40; foundidx + 1 &#41; &amp;amp; ORIGIN_MASK &#93;, ViewInterp.Origins&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, delta &#41;;<br />
 Â  Â VectorMA&#40; ViewInterp.Origins&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, frac, delta, neworg &#41;;<br />
<br />
 Â  Â // Dont interpolate large changes<br />
 Â  Â if &#40; Length&#40; delta &#41; &#60; 64 &#41;<br />
 Â  Â {<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorSubtract&#40; neworg, pparams-&#62;simorg, delta &#41;;<br />
<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;simorg, delta, pparams-&#62;simorg &#41;;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;vieworg, delta, pparams-&#62;vieworg &#41;;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; view-&#62;origin, delta, view-&#62;origin &#41;;<br />
<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, vecNewViewOrigin &#41;;<br />
 Â  Â }<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Store off v_angles before munging for third person<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; CL_IsThirdPerson&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â VectorCopy&#40; camAngles, pparams-&#62;viewangles&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// override all previous settings if the viewent isn&#39;t the client<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;viewentity &#62; pparams-&#62;maxclients &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cl_entity_t *viewentity;<br />
 Â viewentity = gEngfuncs.GetEntityByIndex&#40; pparams-&#62;viewentity &#41;;<br />
 Â if &#40; viewentity &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewentity-&#62;origin, pparams-&#62;vieworg &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewentity-&#62;angles, pparams-&#62;viewangles &#41;;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Store off overridden viewangles<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime = pparams-&#62;time;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_origin = pparams-&#62;vieworg;<br />
}<br />
<br />
void DLLEXPORT V_CalcRefdef&#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// intermission / finale rendering<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;intermission &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â V_CalcIntermissionRefdef &#40; pparams &#41;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40; &#33;pparams-&#62;paused &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â V_CalcNormalRefdef &#40; pparams &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
/*<br />
// Example of how to overlay the whole screen with red at 50 % alpha<br />
#define SF_TEST<br />
#if defined SF_TEST<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â screenfade_t sf;<br />
 Â gEngfuncs.pfnGetScreenFade&#40; &amp;amp;sf &#41;;<br />
<br />
 Â sf.fader = 255;<br />
 Â sf.fadeg = 0;<br />
 Â sf.fadeb = 0;<br />
 Â sf.fadealpha = 128;<br />
 Â sf.fadeFlags = FFADE_STAYOUT &#124; FFADE_OUT;<br />
<br />
 Â gEngfuncs.pfnSetScreenFade&#40; &amp;amp;sf &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
*/<br />
}<br />
<br />
/*<br />
=============<br />
V_DropPunchAngle<br />
<br />
=============<br />
*/<br />
void V_DropPunchAngle &#40; float frametime, float *ev_punchangle &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len = VectorNormalize &#40; ev_punchangle &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len -= &#40;10.0 + len * 0.5&#41; * frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len = max&#40; len, 0.0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorScale &#40; ev_punchangle, len, ev_punchangle &#41;;<br />
}<br />
<br />
/*<br />
=============<br />
V_PunchAxis<br />
<br />
Client side punch effect<br />
=============<br />
*/<br />
void V_PunchAxis&#40; int axis, float punch &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ev_punchangle&#91; axis &#93; = punch;<br />
}<br />
<br />
/*<br />
=============<br />
V_Init<br />
=============<br />
*/<br />
void V_Init &#40;void&#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.pfnAddCommand &#40;&#34;centerview&#34;, V_StartPitchDrift &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsx Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsx&#34;,&#34;0&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsy Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsy&#34;,&#34;0&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsz Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsz&#34;,&#34;0&#34;, 0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_centermove Â = gEngfuncs.pfnRegisterVariable&#40; &#34;v_centermove&#34;, &#34;0.15&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_centerspeed Â = gEngfuncs.pfnRegisterVariable&#40; &#34;v_centerspeed&#34;,&#34;500&#34;, 0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bobcycle Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bobcycle&#34;,&#34;0.8&#34;, 0 &#41;;// best default for my experimental gun wag &#40;sjb&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bob Â  Â = gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bob&#34;,&#34;0.01&#34;, 0 &#41;;// best default for my experimental gun wag &#40;sjb&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bobup Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bobup&#34;,&#34;0.5&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_waterdist Â = gEngfuncs.pfnRegisterVariable&#40; &#34;cl_waterdist&#34;,&#34;4&#34;, 0 &#41;;<br />
}<br />
<br />
<br />
//#define TRACE_TEST<br />
#if defined&#40; TRACE_TEST &#41;<br />
<br />
extern float in_fov;<br />
/*<br />
====================<br />
CalcFov<br />
====================<br />
*/<br />
float CalcFov &#40;float fov_x, float width, float height&#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;fov_x &#60; 1 &#124;&#124; fov_x &#62; 179&#41;<br />
 Â fov_x = 90;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// error, set to 90<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = width/tan&#40;fov_x/360*M_PI&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = atan &#40;height/x&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = a*360/M_PI;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a;<br />
}<br />
<br />
int hitent = -1;<br />
<br />
void V_Move&#40; int mx, int my &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float fov;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float fx, fy;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float dx, dy;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float c_x, c_y;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float dX, dY;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t forward, up, right;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t newangles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t farpoint;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pmtrace_t tr;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fov = CalcFov&#40; in_fov, &#40;float&#41;ScreenWidth, &#40;float&#41;ScreenHeight &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c_x = &#40;float&#41;ScreenWidth / 2.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c_y = &#40;float&#41;ScreenHeight / 2.0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dx = &#40;float&#41;mx - c_x;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dy = &#40;float&#41;my - c_y;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Proportion we moved in each direction<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fx = dx / c_x;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fy = dy / c_y;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dX = fx * in_fov / 2.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dY = fy * fov / 2.0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles = v_angles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles&#91; YAW &#93; -= dX;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles&#91; PITCH &#93; += dY;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Now rotate v_forward around that point<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; newangles, forward, right, up &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;farpoint = v_origin + 8192 * forward;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Trace<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tr = *&#40;gEngfuncs.PM_TraceLine&#40; &#40;float *&#41;&amp;amp;v_origin, &#40;float *&#41;&amp;amp;farpoint, PM_TRACELINE_PHYSENTSONLY, 2 /*point sized hull*/, -1 &#41;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; tr.fraction &#33;= 1.0 &amp;amp;&amp;amp; tr.ent &#33;= 0 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â hitent = PM_GetInfo&#40; tr.ent &#41;;<br />
 Â PM_ParticleLine&#40; &#40;float *&#41;&amp;amp;v_origin, &#40;float *&#41;&amp;amp;tr.endpos, 5, 1.0, 0.0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â hitent = -1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
#endif</code></div></div>]]></description>
			<content:encoded><![CDATA[This is the entire view.cpp since I made a few changes that will keep thirdperson off for those who don&#39;t want it on when they die<img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" />.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>// view/refresh setup functions<br />
<br />
#include &#34;hud.h&#34;<br />
#include &#34;cl_util.h&#34;<br />
#include &#34;cvardef.h&#34;<br />
#include &#34;usercmd.h&#34;<br />
#include &#34;const.h&#34;<br />
<br />
#include &#34;entity_state.h&#34;<br />
#include &#34;cl_entity.h&#34;<br />
#include &#34;ref_params.h&#34;<br />
#include &#34;in_defs.h&#34; // PITCH YAW ROLL<br />
#include &#34;pm_movevars.h&#34;<br />
#include &#34;pm_shared.h&#34;<br />
#include &#34;pmtrace.h&#34;<br />
#include &#34;screenfade.h&#34;<br />
#include &#34;shake.h&#34;<br />
<br />
// Spectator Mode<br />
extern &#34;C&#34; <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vecNewViewAngles&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iHasNewViewAngles;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vecNewViewOrigin&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iHasNewViewOrigin;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â iIsSpectator;<br />
}<br />
<br />
extern float g_flStartScaleTime;<br />
extern int iMouseInUse;<br />
void CAM_ToThirdPerson&#40;void&#41;;<br />
void CAM_ToFirstPerson&#40;void&#41;;<br />
<br />
#ifndef M_PI<br />
#define M_PI Â 3.14159265358979323846&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// matches value in gcc v2 math.h<br />
#endif<br />
<br />
extern &#34;C&#34; <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CL_IsThirdPerson&#40; void &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void CL_CameraOffset&#40; float *ofs &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void DLLEXPORT V_CalcRefdef&#40; struct ref_params_s *pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;void PM_ParticleLine&#40; float *start, float *end, int pcolor, float life, float vert&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int PM_GetInfo&#40; int ent &#41;;<br />
<br />
}<br />
<br />
void V_DropPunchAngle &#40; float frametime, float *ev_punchangle &#41;;<br />
void VectorAngles&#40; const float *forward, float *angles &#41;;<br />
<br />
/*<br />
The view is allowed to move slightly from it&#39;s true position for bobbing,<br />
but if it exceeds 8 pixels linear distance &#40;spherical, not box&#41;, the list of<br />
entities sent from the server may not include everything in the pvs, especially<br />
when crossing a water boudnary.<br />
*/<br />
<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_forwardspeed;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*chase_active;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsx, *scr_ofsy, *scr_ofsz;<br />
extern cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_vsmoothing;<br />
<br />
vec3_t v_origin, v_angles;<br />
<br />
vec3_t ev_punchangle;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsx;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsy;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*scr_ofsz;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_centermove;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*v_centerspeed;<br />
<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bobcycle;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bob;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_bobup;<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*cl_waterdist;<br />
<br />
// These cvars are not registered &#40;so users can&#39;t cheat&#41;, so set the -&#62;value field directly<br />
// Register these cvars in V_Init&#40;&#41; if needed for easy tweaking<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iyaw_cycle Â = {&#34;v_iyaw_cycle&#34;, &#34;2&#34;, 0, 2};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iroll_cycle Â = {&#34;v_iroll_cycle&#34;, &#34;0.5&#34;, 0, 0.5};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_ipitch_cycle Â = {&#34;v_ipitch_cycle&#34;, &#34;1&#34;, 0, 1};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iyaw_level Â = {&#34;v_iyaw_level&#34;, &#34;0.3&#34;, 0, 0.3};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_iroll_level Â = {&#34;v_iroll_level&#34;, &#34;0.1&#34;, 0, 0.1};<br />
cvar_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_ipitch_level Â = {&#34;v_ipitch_level&#34;, &#34;0.3&#34;, 0, 0.3};<br />
<br />
float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale; Â // used by TFC for concussion grenade effect<br />
<br />
//=============================================================================<br />
void V_NormalizeAngles&#40; float *angles &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Normalize angles<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; angles&#91;i&#93; &#62; 180.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles&#91;i&#93; -= 360.0;<br />
 Â }<br />
 Â else if &#40; angles&#91;i&#93; &#60; -180.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles&#91;i&#93; += 360.0;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
/*<br />
===================<br />
V_InterpolateAngles<br />
<br />
Interpolate Euler angles.<br />
FIXME&#58; Â Use Quaternions to avoid discontinuities<br />
Frac is 0.0 to 1.0 &#40; i.e., should probably be clamped, but doesn&#39;t have to be &#41;<br />
===================<br />
*/<br />
void V_InterpolateAngles&#40; float *start, float *end, float *output, float frac &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float ang1, ang2;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float d;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; start &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; end &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â ang1 = start&#91;i&#93;;<br />
 Â ang2 = end&#91;i&#93;;<br />
<br />
 Â d = ang2 - ang1;<br />
 Â if &#40; d &#62; 180 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d -= 360;<br />
 Â }<br />
 Â else if &#40; d &#60; -180 &#41;<br />
 Â {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;d += 360;<br />
 Â }<br />
<br />
 Â output&#91;i&#93; = ang1 + d * frac;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_NormalizeAngles&#40; output &#41;;<br />
}<br />
<br />
// Quakeworld bob code, this fixes jitters in the mutliplayer since the clock &#40;pparams-&#62;time&#41; isn&#39;t quite linear<br />
float V_CalcBob &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bobtime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;spectator &#124;&#124; iIsSpectator &#41;<br />
 Â return 0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;onground == -1 &#124;&#124;<br />
 Â  pparams-&#62;time == lasttime &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // just use old value<br />
 Â return bob;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime = pparams-&#62;time;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bobtime += pparams-&#62;frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle = bobtime - &#40;int&#41;&#40; bobtime / cl_bobcycle-&#62;value &#41; * cl_bobcycle-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cycle /= cl_bobcycle-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cycle &#60; cl_bobup-&#62;value &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cycle = M_PI * cycle / cl_bobup-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cycle = M_PI + M_PI * &#40; cycle - cl_bobup-&#62;value &#41;/&#40; 1.0 - cl_bobup-&#62;value &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// bob is proportional to simulated velocity in the xy plane<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// &#40;don&#39;t count Z, or jumping messes it up&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simvel, vel &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vel&#91;2&#93; = 0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = sqrt&#40; vel&#91;0&#93; * vel&#91;0&#93; + vel&#91;1&#93; * vel&#91;1&#93; &#41; * cl_bob-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = bob * 0.3 + bob * 0.7 * sin&#40;cycle&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = min&#40; bob, 4 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = max&#40; bob, -7 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return bob;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
}<br />
<br />
/*<br />
===============<br />
V_CalcRoll<br />
Used by view and sv_user<br />
===============<br />
*/<br />
float V_CalcRoll &#40;vec3_t angles, vec3_t velocity, float rollangle, float rollspeed &#41;<br />
{<br />
 Â  Â float Â  sign;<br />
 Â  Â float Â  side;<br />
 Â  Â float Â  value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t Â forward, right, up;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; angles, forward, right, up &#41;;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;side = DotProduct &#40;velocity, right&#41;;<br />
 Â  Â sign = side &#60; 0 ? -1 &#58; 1;<br />
 Â  Â side = fabs&#40; side &#41;;<br />
 Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value = rollangle;<br />
 Â  Â if &#40;side &#60; rollspeed&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â side = side * value / rollspeed;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â  Â else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â side = value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return side * sign;<br />
}<br />
<br />
typedef struct pitchdrift_s<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â pitchvel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nodrift;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â driftmove;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double Â laststop;<br />
} pitchdrift_t;<br />
<br />
static pitchdrift_t pd;<br />
<br />
void V_StartPitchDrift&#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pd.laststop == gEngfuncs.GetClientTime&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â return; Â // something else is keeping it from drifting<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pd.nodrift &#124;&#124; &#33;pd.pitchvel &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.pitchvel = v_centerspeed-&#62;value;<br />
 Â pd.nodrift = 0;<br />
 Â pd.driftmove = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
void V_StopPitchDrift &#40; void &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.laststop = gEngfuncs.GetClientTime&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.nodrift = 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
}<br />
<br />
/*<br />
===============<br />
V_DriftPitch<br />
<br />
Moves the client pitch angle towards idealpitch sent by the server.<br />
<br />
If the user is adjusting pitch manually, either with lookup/lookdown,<br />
mlook and mouse, or klook and keyboard, pitch drifting is constantly stopped.<br />
===============<br />
*/<br />
void V_DriftPitch &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â delta, move;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; gEngfuncs.IsNoClipping&#40;&#41; &#124;&#124; &#33;pparams-&#62;onground &#124;&#124; pparams-&#62;demoplayback &#124;&#124; pparams-&#62;spectator &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.driftmove = 0;<br />
 Â pd.pitchvel = 0;<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t count small mouse motion<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pd.nodrift&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; fabs&#40; pparams-&#62;cmd-&#62;forwardmove &#41; &#60; cl_forwardspeed-&#62;value &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.driftmove = 0;<br />
 Â else<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.driftmove += pparams-&#62;frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â if &#40; pd.driftmove &#62; v_centermove-&#62;value&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_StartPitchDrift &#40;&#41;;<br />
 Â }<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;delta = pparams-&#62;idealpitch - pparams-&#62;cl_viewangles&#91;PITCH&#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;&#33;delta&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pd.pitchvel = 0;<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = pparams-&#62;frametime * pd.pitchvel;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel += pparams-&#62;frametime * v_centerspeed-&#62;value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
//Con_Printf &#40;&#34;move&#58; %f &#40;%f&#41;&#092;n&#34;, move, pparams-&#62;frametime&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;delta &#62; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40;move &#62; delta&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = delta;<br />
 Â }<br />
 Â pparams-&#62;cl_viewangles&#91;PITCH&#93; += move;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;delta &#60; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40;move &#62; -delta&#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pd.pitchvel = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;move = -delta;<br />
 Â }<br />
 Â pparams-&#62;cl_viewangles&#91;PITCH&#93; -= move;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
/* <br />
============================================================================== <br />
 Â  Â  Â VIEW RENDERING <br />
============================================================================== <br />
*/ <br />
<br />
/*<br />
==================<br />
V_CalcGunAngle<br />
==================<br />
*/<br />
void V_CalcGunAngle &#40; struct ref_params_s *pparams &#41;<br />
{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *viewent;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent = gEngfuncs.GetViewModel&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;viewent &#41;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;YAW&#93; Â  = Â pparams-&#62;viewangles&#91;YAW&#93; Â  + pparams-&#62;crosshairangle&#91;YAW&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;PITCH&#93; = -pparams-&#62;viewangles&#91;PITCH&#93; + pparams-&#62;crosshairangle&#91;PITCH&#93; * 0.25;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;ROLL&#93; Â -= v_idlescale * sin&#40;pparams-&#62;time*v_iroll_cycle.value&#41; * v_iroll_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t apply all of the v_ipitch to prevent normally unseen parts of viewmodel from coming into view.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;PITCH&#93; -= v_idlescale * sin&#40;pparams-&#62;time*v_ipitch_cycle.value&#41; * &#40;v_ipitch_level.value * 0.5&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewent-&#62;angles&#91;YAW&#93; Â  -= v_idlescale * sin&#40;pparams-&#62;time*v_iyaw_cycle.value&#41; * v_iyaw_level.value;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewent-&#62;angles, viewent-&#62;curstate.angles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewent-&#62;angles, viewent-&#62;latched.prevangles &#41;;<br />
}<br />
<br />
/*<br />
==============<br />
V_AddIdle<br />
<br />
Idle swaying<br />
==============<br />
*/<br />
void V_AddIdle &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;ROLL&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_iroll_cycle.value&#41; * v_iroll_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;PITCH&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_ipitch_cycle.value&#41; * v_ipitch_level.value;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;YAW&#93; += v_idlescale * sin&#40;pparams-&#62;time*v_iyaw_cycle.value&#41; * v_iyaw_level.value;<br />
}<br />
<br />
<br />
/*<br />
==============<br />
V_CalcViewRoll<br />
<br />
Roll is induced by movement and damage<br />
==============<br />
*/<br />
void V_CalcViewRoll &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â side;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *viewentity;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;viewentity = gEngfuncs.GetEntityByIndex&#40; pparams-&#62;viewentity &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;viewentity &#41;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;side = V_CalcRoll &#40; viewentity-&#62;angles, pparams-&#62;simvel, pparams-&#62;movevars-&#62;rollangle, pparams-&#62;movevars-&#62;rollspeed &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;viewangles&#91;ROLL&#93; += side;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;health &#60;= 0 &amp;amp;&amp;amp; &#40; pparams-&#62;viewheight&#91;2&#93; &#33;= 0 &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // only roll the view if the player is dead and the viewheight&#91;2&#93; is nonzero <br />
 Â // this is so deadcam in multiplayer will work.<br />
 Â pparams-&#62;viewangles&#91;ROLL&#93; = 80;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// dead view angle<br />
 Â return;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
<br />
/*<br />
==================<br />
V_CalcIntermissionRefdef<br />
<br />
==================<br />
*/<br />
void V_CalcIntermissionRefdef &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*ent, *view;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â old;<br />
<br />
// don&#39;t allow cheats in multiplayer<br />
#if &#33;defined&#40; _DEBUG &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;maxclients &#62; 1 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsx&#34;, 0&#41;;<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsy&#34;, 0&#41;;<br />
 Â gEngfuncs.Cvar_SetValue &#40;&#34;scr_ofsz&#34;, 0&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ent is the player model &#40; visible when out of body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ent = gEngfuncs.GetLocalPlayer&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// view is the weapon model &#40;only visible from inside body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view = gEngfuncs.GetViewModel&#40;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, pparams-&#62;vieworg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;model = NULL;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// allways idle in intermission<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;old = v_idlescale;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale = 1;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_AddIdle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_idlescale = old;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_origin = pparams-&#62;vieworg;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
}<br />
<br />
#define ORIGIN_BACKUP 64<br />
#define ORIGIN_MASK &#40; ORIGIN_BACKUP - 1 &#41;<br />
<br />
typedef struct <br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Origins&#91; ORIGIN_BACKUP &#93;&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float OriginTime&#91; ORIGIN_BACKUP &#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Angles&#91; ORIGIN_BACKUP &#93;&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float AngleTime&#91; ORIGIN_BACKUP &#93;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CurrentOrigin;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int CurrentAngle;<br />
} viewinterp_t;<br />
<br />
/*<br />
==================<br />
V_CalcRefdef<br />
<br />
==================<br />
*/<br />
void V_CalcNormalRefdef &#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t Â *ent, *view;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int Â  Â i;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;angles;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob, waterOffset;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static viewinterp_t Â ViewInterp;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float oldz = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float lasttime;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float lastang&#91;3&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t angdelta;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t camAngles, camForward, camRight, camUp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_entity_t *pwater;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Miagi to store flag<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;static float cam_gotofirstperson;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// don&#39;t allow cheats in multiplayer<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;maxclients &#62; 1 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â scr_ofsx-&#62;value = 0.0;<br />
 Â scr_ofsy-&#62;value = 0.0;<br />
 Â scr_ofsz-&#62;value = 0.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_DriftPitch &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// ent is the player model &#40; visible when out of body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ent = gEngfuncs.GetLocalPlayer&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// view is the weapon model &#40;only visible from inside body &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view = gEngfuncs.GetViewModel&#40;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// transform the view offset by the model&#39;s matrix to get the offset from<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// model origin for the view<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bob = V_CalcBob &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Observer angle capturing and smoothing<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; iHasNewViewOrigin &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // Get the angles from the physics code<br />
 Â VectorCopy&#40; vecNewViewOrigin, pparams-&#62;vieworg &#41;;<br />
 Â VectorCopy&#40; vecNewViewOrigin, pparams-&#62;simorg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// refresh position<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, pparams-&#62;vieworg &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += &#40; bob &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;vieworg, pparams-&#62;viewheight, pparams-&#62;vieworg &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Observer angle capturing and smoothing<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; iHasNewViewAngles &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â // Get the angles from the physics code<br />
 Â VectorCopy&#40; vecNewViewAngles, pparams-&#62;cl_viewangles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40; pparams-&#62;health == -5 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â //Miagi saving view<br />
 Â if &#40; &#33;CL_IsThirdPerson&#40;&#41; &#41;<br />
 Â { <br />
 Â  Â cam_gotofirstperson = 1;<br />
 Â }<br />
 Â //End Miagi saving<br />
 Â CAM_ToThirdPerson&#40;&#41;;<br />
<br />
 Â // Lock mouse movement Â  Miagi-Dont lock<br />
 Â iMouseInUse=0;<br />
<br />
 Â pparams-&#62;cl_viewangles&#91;0&#93; = 89;<br />
<br />
 Â // Spin the view<br />
 Â float flTimeDelta = &#40;pparams-&#62;time - g_flStartScaleTime&#41;;<br />
 Â if &#40; flTimeDelta &#62; 0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float flROFSpin = 1.0 + &#40;flTimeDelta * 2.0&#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float flSpin = flTimeDelta * 45;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;cl_viewangles&#91;1&#93; = flSpin * flROFSpin;<br />
 Â }<br />
 Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Miagi Go back to first if in first<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â if &#40; cam_gotofirstperson == 1 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cam_gotofirstperson = 0;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CAM_ToFirstPerson&#40;&#41;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//End Miagi<br />
/*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else Â  Â causing the problem.. Miagi<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â //CAM_ToFirstPerson&#40;&#41;;<br />
<br />
 Â // Unlock mouse movement<br />
 Â //iMouseInUse=0;<br />
<br />
 Â CAM_ToThirdPerson&#40;&#41;;<br />
<br />
 Â // Lock mouse movement<br />
 Â iMouseInUse=0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}*/<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorSubtract&#40; pparams-&#62;cl_viewangles, lastang, angdelta &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; Length&#40; angdelta &#41; &#33;= 0.0 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â VectorCopy&#40; pparams-&#62;cl_viewangles, ViewInterp.Angles&#91; ViewInterp.CurrentAngle &amp;amp; ORIGIN_MASK &#93; &#41;;<br />
 Â ViewInterp.AngleTime&#91; ViewInterp.CurrentAngle &amp;amp; ORIGIN_MASK &#93; = pparams-&#62;time;<br />
 Â ViewInterp.CurrentAngle++;<br />
<br />
 Â VectorCopy&#40; pparams-&#62;cl_viewangles, lastang &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cl_vsmoothing &amp;amp;&amp;amp; cl_vsmoothing-&#62;value &amp;amp;&amp;amp; &#40; iIsSpectator &amp;amp; SPEC_SMOOTH_ANGLES &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int foundidx;<br />
 Â int i;<br />
 Â float t;<br />
<br />
 Â if &#40; cl_vsmoothing-&#62;value &#60; 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.Cvar_SetValue&#40; &#34;cl_vsmoothing&#34;, 0.0 &#41;;<br />
 Â }<br />
<br />
 Â t = pparams-&#62;time - cl_vsmoothing-&#62;value;<br />
<br />
 Â for &#40; i = 1; i &#60; ORIGIN_MASK; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundidx = ViewInterp.CurrentAngle - 1 - i;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#60;= t &#41;<br />
 Â  Â break;<br />
 Â }<br />
<br />
 Â if &#40; i &#60; ORIGIN_MASK &amp;amp;&amp;amp; ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Interpolate<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double dt;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt = ViewInterp.AngleTime&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93; - ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; dt &#62; 0.0 &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â double frac;<br />
<br />
 Â  Â frac = &#40; t - ViewInterp.AngleTime&#91; foundidx &amp;amp; ORIGIN_MASK&#93; &#41; / dt;<br />
 Â  Â frac = min&#40; 1.0, frac &#41;;<br />
<br />
 Â  Â // interpolate angles<br />
 Â  Â V_InterpolateAngles&#40; ViewInterp.Angles&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, ViewInterp.Angles&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93;, pparams-&#62;cl_viewangles, frac &#41;;<br />
<br />
 Â  Â VectorCopy&#40; pparams-&#62;cl_viewangles, vecNewViewAngles &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_CalcShake&#40;&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_ApplyShake&#40; pparams-&#62;vieworg, pparams-&#62;viewangles, 1.0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// never let view origin sit exactly on a node line, because a water plane can<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// dissapear when viewed with the eye exactly on it.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// FIXME, we send origin at 1/128 now, change this?<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// the server protocol only specifies to 1/16 pixel, so add 1/32 in each axis<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;0&#93; += 1.0/32;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;1&#93; += 1.0/32;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 1.0/32;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Check for problems around water, move the viewer artificially if necessary <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// -- this prevents drawing errors in GL due to waves<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = 0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;waterlevel &#62;= 2 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int Â i, contents, waterDist, waterEntity;<br />
 Â vec3_t&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point;<br />
 Â waterDist = cl_waterdist-&#62;value;<br />
<br />
 Â if &#40; pparams-&#62;hardware &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterEntity = gEngfuncs.PM_WaterEntity&#40; pparams-&#62;simorg &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; waterEntity &#62;= 0 &amp;amp;&amp;amp; waterEntity &#60; pparams-&#62;max_entities &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â pwater = gEngfuncs.GetEntityByIndex&#40; waterEntity &#41;;<br />
 Â  Â if &#40; pwater &amp;amp;&amp;amp; &#40; pwater-&#62;model &#33;= NULL &#41; &#41;<br />
 Â  Â {<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterDist += &#40; pwater-&#62;curstate.scale * 16 &#41;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add in wave height<br />
 Â  Â }<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterEntity = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Don&#39;t need this in software<br />
 Â }<br />
 Â <br />
 Â VectorCopy&#40; pparams-&#62;vieworg, point &#41;;<br />
<br />
 Â // Eyes are above water, make sure we&#39;re above the waves<br />
 Â if &#40; pparams-&#62;waterlevel == 2 &#41;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point&#91;2&#93; -= waterDist;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; waterDist; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â contents = gEngfuncs.PM_PointContents&#40; point, NULL &#41;;<br />
 Â  Â if &#40; contents &#62; CONTENTS_WATER &#41;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />
 Â  Â point&#91;2&#93; += 1;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = &#40;point&#91;2&#93; + waterDist&#41; - pparams-&#62;vieworg&#91;2&#93;;<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// eyes are under water. Â Make sure we&#39;re far enough under<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;point&#91;2&#93; += waterDist;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; waterDist; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â contents = gEngfuncs.PM_PointContents&#40; point, NULL &#41;;<br />
 Â  Â if &#40; contents &#60;= CONTENTS_WATER &#41;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;<br />
 Â  Â point&#91;2&#93; -= 1;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;waterOffset = &#40;point&#91;2&#93; - waterDist&#41; - pparams-&#62;vieworg&#91;2&#93;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += waterOffset;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_CalcViewRoll &#40; pparams &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_AddIdle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// offsets<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;cl_viewangles, angles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; angles, pparams-&#62;forward, pparams-&#62;right, pparams-&#62;up &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i=0; i&#60;3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â pparams-&#62;vieworg&#91;i&#93; += scr_ofsx-&#62;value*pparams-&#62;forward&#91;i&#93; + scr_ofsy-&#62;value*pparams-&#62;right&#91;i&#93; + scr_ofsz-&#62;value*pparams-&#62;up&#91;i&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Treating cam_ofs&#91;2&#93; as the distance<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&#40; CL_IsThirdPerson&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â vec3_t ofs;<br />
 Â ofs&#91;0&#93; = ofs&#91;1&#93; = ofs&#91;2&#93; = 0.0;<br />
 Â CL_CameraOffset&#40; &#40;float *&#41;&amp;amp;ofs &#41;;<br />
<br />
 Â VectorCopy&#40; ofs, camAngles &#41;;<br />
 Â camAngles&#91; ROLL &#93;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= 0;<br />
 Â AngleVectors&#40; camAngles, camForward, camRight, camUp &#41;;<br />
<br />
 Â // Is the player in a falling anim? If so, raise camera above and look down<br />
 Â if &#40; pparams-&#62;health == -5 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 92;<br />
 Â }<br />
 Â else<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â pparams-&#62;vieworg&#91; i &#93; += -ofs&#91;2&#93; * camForward&#91; i &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pparams-&#62;vieworg&#91;2&#93; += 20;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Give gun our viewangles<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;cl_viewangles, view-&#62;angles &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// set up gun position<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_CalcGunAngle &#40; pparams &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Use predicted origin as view origin.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy &#40; pparams-&#62;simorg, view-&#62;origin &#41;; Â  Â  Â <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; += &#40; waterOffset &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; view-&#62;origin, pparams-&#62;viewheight, view-&#62;origin &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Let the viewmodel shake at about 10% of the amplitude<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.V_ApplyShake&#40; view-&#62;origin, view-&#62;angles, 0.9 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for &#40; i = 0; i &#60; 3; i++ &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91; i &#93; += bob * 0.4 * pparams-&#62;forward&#91; i &#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; += bob;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// throw in a little tilt.<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;YAW&#93; Â  -= bob * 0.5;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;ROLL&#93; Â -= bob * 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;angles&#91;PITCH&#93; -= bob * 0.3;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// pushing the view origin down off of the same X/Z plane as the ent&#39;s origin will give the<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// gun a very nice &#39;shifting&#39; effect when the player looks up/down. If there is a problem<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// with view model distortion, this may be a cause. &#40;SJB&#41;. <br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;view-&#62;origin&#91;2&#93; -= 1;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// fudge position around to keep amount of weapon visible<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// roughly equal with different FOV<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;pparams-&#62;viewsize == 110&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 100&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 2;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 90&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40;pparams-&#62;viewsize == 80&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â view-&#62;origin&#91;2&#93; += 0.5;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Add in the punchangle, if any<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd &#40; pparams-&#62;viewangles, pparams-&#62;punchangle, pparams-&#62;viewangles &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Include client side punch, too<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd &#40; pparams-&#62;viewangles, &#40;float *&#41;&amp;amp;ev_punchangle, pparams-&#62;viewangles&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;V_DropPunchAngle &#40; pparams-&#62;frametime, &#40;float *&#41;&amp;amp;ev_punchangle &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// smooth out stair step ups<br />
#if 1<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#33;pparams-&#62;smoothing &amp;amp;&amp;amp; pparams-&#62;onground &amp;amp;&amp;amp; pparams-&#62;simorg&#91;2&#93; - oldz &#62; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â float steptime;<br />
 Â <br />
 Â steptime = pparams-&#62;time - lasttime;<br />
 Â if &#40;steptime &#60; 0&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//FIXME Â I_Error &#40;&#34;steptime &#60; 0&#34;&#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;steptime = 0;<br />
<br />
 Â oldz += steptime * 150;<br />
 Â if &#40;oldz &#62; pparams-&#62;simorg&#91;2&#93;&#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oldz = pparams-&#62;simorg&#91;2&#93;;<br />
 Â if &#40;pparams-&#62;simorg&#91;2&#93; - oldz &#62; 18&#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;oldz = pparams-&#62;simorg&#91;2&#93;- 18;<br />
 Â pparams-&#62;vieworg&#91;2&#93; += oldz - pparams-&#62;simorg&#91;2&#93;;<br />
 Â view-&#62;origin&#91;2&#93; += oldz - pparams-&#62;simorg&#91;2&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â oldz = pparams-&#62;simorg&#91;2&#93;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â static float lastorg&#91;3&#93;;<br />
 Â vec3_t delta;<br />
<br />
 Â VectorSubtract&#40; pparams-&#62;simorg, lastorg, delta &#41;;<br />
<br />
 Â if &#40; Length&#40; delta &#41; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, ViewInterp.Origins&#91; ViewInterp.CurrentOrigin &amp;amp; ORIGIN_MASK &#93; &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewInterp.OriginTime&#91; ViewInterp.CurrentOrigin &amp;amp; ORIGIN_MASK &#93; = pparams-&#62;time;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewInterp.CurrentOrigin++;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, lastorg &#41;;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Smooth out whole view in multiplayer when on trains, lifts<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; cl_vsmoothing &amp;amp;&amp;amp; cl_vsmoothing-&#62;value &amp;amp;&amp;amp;<br />
 Â &#40; &#40; iIsSpectator &amp;amp; SPEC_SMOOTH_ORIGIN &#41; &#124;&#124; &#40;pparams-&#62;smoothing &amp;amp;&amp;amp; &#40; pparams-&#62;maxclients &#62; 1 &#41; &#41; &#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â int foundidx;<br />
 Â int i;<br />
 Â float t;<br />
<br />
 Â if &#40; cl_vsmoothing-&#62;value &#60; 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.Cvar_SetValue&#40; &#34;cl_vsmoothing&#34;, 0.0 &#41;;<br />
 Â }<br />
<br />
 Â t = pparams-&#62;time - cl_vsmoothing-&#62;value;<br />
<br />
 Â for &#40; i = 1; i &#60; ORIGIN_MASK; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foundidx = ViewInterp.CurrentOrigin - 1 - i;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#60;= t &#41;<br />
 Â  Â break;<br />
 Â }<br />
<br />
 Â if &#40; i &#60; ORIGIN_MASK &amp;amp;&amp;amp; Â ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93; &#33;= 0.0 &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Interpolate<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t delta;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double frac;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;double dt;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t neworg;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt = ViewInterp.OriginTime&#91; &#40;foundidx + 1&#41; &amp;amp; ORIGIN_MASK &#93; - ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK &#93;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; dt &#62; 0.0 &#41;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â frac = &#40; t - ViewInterp.OriginTime&#91; foundidx &amp;amp; ORIGIN_MASK&#93; &#41; / dt;<br />
 Â  Â frac = min&#40; 1.0, frac &#41;;<br />
 Â  Â VectorSubtract&#40; ViewInterp.Origins&#91; &#40; foundidx + 1 &#41; &amp;amp; ORIGIN_MASK &#93;, ViewInterp.Origins&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, delta &#41;;<br />
 Â  Â VectorMA&#40; ViewInterp.Origins&#91; foundidx &amp;amp; ORIGIN_MASK &#93;, frac, delta, neworg &#41;;<br />
<br />
 Â  Â // Dont interpolate large changes<br />
 Â  Â if &#40; Length&#40; delta &#41; &#60; 64 &#41;<br />
 Â  Â {<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorSubtract&#40; neworg, pparams-&#62;simorg, delta &#41;;<br />
<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;simorg, delta, pparams-&#62;simorg &#41;;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; pparams-&#62;vieworg, delta, pparams-&#62;vieworg &#41;;<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorAdd&#40; view-&#62;origin, delta, view-&#62;origin &#41;;<br />
<br />
 Â  Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; pparams-&#62;simorg, vecNewViewOrigin &#41;;<br />
 Â  Â }<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Store off v_angles before munging for third person<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; CL_IsThirdPerson&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â VectorCopy&#40; camAngles, pparams-&#62;viewangles&#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// override all previous settings if the viewent isn&#39;t the client<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;viewentity &#62; pparams-&#62;maxclients &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â cl_entity_t *viewentity;<br />
 Â viewentity = gEngfuncs.GetEntityByIndex&#40; pparams-&#62;viewentity &#41;;<br />
 Â if &#40; viewentity &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewentity-&#62;origin, pparams-&#62;vieworg &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorCopy&#40; viewentity-&#62;angles, pparams-&#62;viewangles &#41;;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Store off overridden viewangles<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_angles = pparams-&#62;viewangles;<br />
 Â }<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lasttime = pparams-&#62;time;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_origin = pparams-&#62;vieworg;<br />
}<br />
<br />
void DLLEXPORT V_CalcRefdef&#40; struct ref_params_s *pparams &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// intermission / finale rendering<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; pparams-&#62;intermission &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
 Â V_CalcIntermissionRefdef &#40; pparams &#41;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if &#40; &#33;pparams-&#62;paused &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â V_CalcNormalRefdef &#40; pparams &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
<br />
/*<br />
// Example of how to overlay the whole screen with red at 50 % alpha<br />
#define SF_TEST<br />
#if defined SF_TEST<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â screenfade_t sf;<br />
 Â gEngfuncs.pfnGetScreenFade&#40; &amp;amp;sf &#41;;<br />
<br />
 Â sf.fader = 255;<br />
 Â sf.fadeg = 0;<br />
 Â sf.fadeb = 0;<br />
 Â sf.fadealpha = 128;<br />
 Â sf.fadeFlags = FFADE_STAYOUT &#124; FFADE_OUT;<br />
<br />
 Â gEngfuncs.pfnSetScreenFade&#40; &amp;amp;sf &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
#endif<br />
*/<br />
}<br />
<br />
/*<br />
=============<br />
V_DropPunchAngle<br />
<br />
=============<br />
*/<br />
void V_DropPunchAngle &#40; float frametime, float *ev_punchangle &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len = VectorNormalize &#40; ev_punchangle &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len -= &#40;10.0 + len * 0.5&#41; * frametime;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;len = max&#40; len, 0.0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VectorScale &#40; ev_punchangle, len, ev_punchangle &#41;;<br />
}<br />
<br />
/*<br />
=============<br />
V_PunchAxis<br />
<br />
Client side punch effect<br />
=============<br />
*/<br />
void V_PunchAxis&#40; int axis, float punch &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ev_punchangle&#91; axis &#93; = punch;<br />
}<br />
<br />
/*<br />
=============<br />
V_Init<br />
=============<br />
*/<br />
void V_Init &#40;void&#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;gEngfuncs.pfnAddCommand &#40;&#34;centerview&#34;, V_StartPitchDrift &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsx Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsx&#34;,&#34;0&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsy Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsy&#34;,&#34;0&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;scr_ofsz Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;scr_ofsz&#34;,&#34;0&#34;, 0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_centermove Â = gEngfuncs.pfnRegisterVariable&#40; &#34;v_centermove&#34;, &#34;0.15&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v_centerspeed Â = gEngfuncs.pfnRegisterVariable&#40; &#34;v_centerspeed&#34;,&#34;500&#34;, 0 &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bobcycle Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bobcycle&#34;,&#34;0.8&#34;, 0 &#41;;// best default for my experimental gun wag &#40;sjb&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bob Â  Â = gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bob&#34;,&#34;0.01&#34;, 0 &#41;;// best default for my experimental gun wag &#40;sjb&#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_bobup Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= gEngfuncs.pfnRegisterVariable&#40; &#34;cl_bobup&#34;,&#34;0.5&#34;, 0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cl_waterdist Â = gEngfuncs.pfnRegisterVariable&#40; &#34;cl_waterdist&#34;,&#34;4&#34;, 0 &#41;;<br />
}<br />
<br />
<br />
//#define TRACE_TEST<br />
#if defined&#40; TRACE_TEST &#41;<br />
<br />
extern float in_fov;<br />
/*<br />
====================<br />
CalcFov<br />
====================<br />
*/<br />
float CalcFov &#40;float fov_x, float width, float height&#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;fov_x &#60; 1 &#124;&#124; fov_x &#62; 179&#41;<br />
 Â fov_x = 90;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// error, set to 90<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x = width/tan&#40;fov_x/360*M_PI&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = atan &#40;height/x&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;a = a*360/M_PI;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return a;<br />
}<br />
<br />
int hitent = -1;<br />
<br />
void V_Move&#40; int mx, int my &#41;<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float fov;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float fx, fy;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float dx, dy;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float c_x, c_y;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;float dX, dY;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t forward, up, right;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t newangles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;vec3_t farpoint;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pmtrace_t tr;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fov = CalcFov&#40; in_fov, &#40;float&#41;ScreenWidth, &#40;float&#41;ScreenHeight &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c_x = &#40;float&#41;ScreenWidth / 2.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c_y = &#40;float&#41;ScreenHeight / 2.0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dx = &#40;float&#41;mx - c_x;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dy = &#40;float&#41;my - c_y;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Proportion we moved in each direction<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fx = dx / c_x;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fy = dy / c_y;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dX = fx * in_fov / 2.0;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dY = fy * fov / 2.0;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles = v_angles;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles&#91; YAW &#93; -= dX;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newangles&#91; PITCH &#93; += dY;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Now rotate v_forward around that point<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AngleVectors &#40; newangles, forward, right, up &#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;farpoint = v_origin + 8192 * forward;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Trace<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tr = *&#40;gEngfuncs.PM_TraceLine&#40; &#40;float *&#41;&amp;amp;v_origin, &#40;float *&#41;&amp;amp;farpoint, PM_TRACELINE_PHYSENTSONLY, 2 /*point sized hull*/, -1 &#41;&#41;;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; tr.fraction &#33;= 1.0 &amp;amp;&amp;amp; tr.ent &#33;= 0 &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â hitent = PM_GetInfo&#40; tr.ent &#41;;<br />
 Â PM_ParticleLine&#40; &#40;float *&#41;&amp;amp;v_origin, &#40;float *&#41;&amp;amp;tr.endpos, 5, 1.0, 0.0 &#41;;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â hitent = -1;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
}<br />
<br />
#endif</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Colour Switch]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=4161</link>
			<pubDate>Mon, 05 Sep 2005 02:26:05 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=35">Wha?</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=4161</guid>
			<description><![CDATA[If you play DM, you&#39;re well aware of the seventh player who is indistinguishable from the first. I did some digging through the source, and there&#39;s no way to *fix* this; though there is a painless workaround.<br />
<br />
These are the disc colours:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>//disc_weapon_disc.cpp, line 32<br />
<br />
<br />
float g_iaDiscColors&#91;33&#93;&#91;3&#93; =<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 255, 255, 255, },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 0, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 0, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 250, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 250, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 250, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 250 },<br />
};</code></div></div>And this is how they map out:<br />
NOTE: g_iaDiscColors[32][] is left empty. Not sure why, or what happens to player 32.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1761" target="_blank" title="">rico_disc_colours.JPG</a> (Size: 23.49 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[If you play DM, you&#39;re well aware of the seventh player who is indistinguishable from the first. I did some digging through the source, and there&#39;s no way to *fix* this; though there is a painless workaround.<br />
<br />
These are the disc colours:<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>//disc_weapon_disc.cpp, line 32<br />
<br />
<br />
float g_iaDiscColors&#91;33&#93;&#91;3&#93; =<br />
{<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 255, 255, 255, },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 0, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 0, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 250, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 0 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 0, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 0, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 0, 250, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 250, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 128, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 250, 64, 128 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 250, 64 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 64, 128, 250 },<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{ 128, 64, 250 },<br />
};</code></div></div>And this is how they map out:<br />
NOTE: g_iaDiscColors[32][] is left empty. Not sure why, or what happens to player 32.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1761" target="_blank" title="">rico_disc_colours.JPG</a> (Size: 23.49 KB / Downloads: 2)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Mirc dictionary script]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=4113</link>
			<pubDate>Wed, 10 Aug 2005 20:08:33 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=4113</guid>
			<description><![CDATA[Here&#39;s a little script I made that utilizes dictionary.com and webster to check spelling/definitions/thesaurus.<br />
<br />
<br />
Download and put the wordtools.mrc file into your mirc folder.<br />
<br />
While in Mirc, type /load -rs wordtools.mrc<br />
<br />
<br />
<br />
To use it, you can copy the word you want to look up, right click in the chat window, goto word tools, and choose one of the tools, and either paste or type the word in the box that will popup and it should open a browser to the site you chose.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/unknown.png" title="Unknown" border="0" alt=".mrc" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1673" target="_blank" title="">wordtools.mrc</a> (Size: 803 bytes / Downloads: 7)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Here&#39;s a little script I made that utilizes dictionary.com and webster to check spelling/definitions/thesaurus.<br />
<br />
<br />
Download and put the wordtools.mrc file into your mirc folder.<br />
<br />
While in Mirc, type /load -rs wordtools.mrc<br />
<br />
<br />
<br />
To use it, you can copy the word you want to look up, right click in the chat window, goto word tools, and choose one of the tools, and either paste or type the word in the box that will popup and it should open a browser to the site you chose.<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/unknown.png" title="Unknown" border="0" alt=".mrc" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1673" target="_blank" title="">wordtools.mrc</a> (Size: 803 bytes / Downloads: 7)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Rico fixes]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3999</link>
			<pubDate>Sun, 05 Jun 2005 16:55:39 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3999</guid>
			<description><![CDATA[Here&#39;s the windows version with the up-to-date fixes.<br />
<br />
Server-side fixes.<br />
<br />
<br />
<br />
12/08/05: [DTC]Miagi<br />
   - Fixed arena float bug, removed old white disc fix<br />
   - Stopped players from exploding on spawn/team switch<br />
	in Deathmatch Teamplay<br />
<br />
<br />
<br />
9/18/05:<br />
   - Added Team DM Support :: [DTC]Miagi &amp;amp;&amp;amp; [CAKE]Wha?<br />
	+ Change teams with &#39;team teamname&#39; in console<br />
	+ Add &amp;quot;mp_teamlist&amp;quot; &amp;quot;red;blue&amp;quot; to game.cfg<br />
	+ Enable permanently in game.cfg &amp;quot;mp_teamplay&amp;quot; &amp;quot;1&amp;quot;<br />
<br />
9/9/05:<br />
   - DM Spawn Protection :: [CAKE]Wha?<br />
   - DM Respawn command<br />
	+ Type &amp;quot;ready&amp;quot; in console<br />
<br />
Unknown dates:<br />
	- Model Switching :: Evil_admin (desnotes)<br />
	- Reconnector :: .ASM<br />
	- White disc :: .ASM<br />
	- Use key :: Evil_admin (desnotes) &amp;amp;&amp;amp; .ASM<br />
	- DM Double Kill :: .ASM &amp;amp;&amp;amp; netniV<br />
	- DM Spectate with disc bug &amp;amp;&amp;amp; disconnect :: Miagi<br />
	- Arena Floating :: Miagi<br />
	- Arena Spectate :: Miagi<br />
	- 2v2 White Disc and Scoreboard :: Miagi<br />
<br />
<br />
====================<br />
Commands/How to:<br />
====================<br />
If you are using this on a windows machine, make mp.dll read-only. Otherwise steam will overwrite mp.dll.<br />
<br />
Respawn:<br />
	- ready : Console command to respawn self in DM<br />
<br />
Team Deathmatch:<br />
	- Create/modify game.cfg in ricochet directory<br />
	- Add/modify &amp;quot;mp_teamlist&amp;quot; &amp;quot;red;blue&amp;quot;<br />
	- To enable permanently, in game.cfg add &amp;quot;mp_teamplay&amp;quot; &amp;quot;1&amp;quot;<br />
<br />
<br />
<br />
If I miscredited any fixes, pm me <img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" />.<br />
<br />
<br />
<br />
Comments/Questions, make a new topic.<br />
<br />
<br />
[attachment=2305:attachment]<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1478" target="_blank" title="">mp_12_08_05.zip</a> (Size: 226.93 KB / Downloads: 50)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[Here&#39;s the windows version with the up-to-date fixes.<br />
<br />
Server-side fixes.<br />
<br />
<br />
<br />
12/08/05: [DTC]Miagi<br />
   - Fixed arena float bug, removed old white disc fix<br />
   - Stopped players from exploding on spawn/team switch<br />
	in Deathmatch Teamplay<br />
<br />
<br />
<br />
9/18/05:<br />
   - Added Team DM Support :: [DTC]Miagi &amp;amp;&amp;amp; [CAKE]Wha?<br />
	+ Change teams with &#39;team teamname&#39; in console<br />
	+ Add &amp;quot;mp_teamlist&amp;quot; &amp;quot;red;blue&amp;quot; to game.cfg<br />
	+ Enable permanently in game.cfg &amp;quot;mp_teamplay&amp;quot; &amp;quot;1&amp;quot;<br />
<br />
9/9/05:<br />
   - DM Spawn Protection :: [CAKE]Wha?<br />
   - DM Respawn command<br />
	+ Type &amp;quot;ready&amp;quot; in console<br />
<br />
Unknown dates:<br />
	- Model Switching :: Evil_admin (desnotes)<br />
	- Reconnector :: .ASM<br />
	- White disc :: .ASM<br />
	- Use key :: Evil_admin (desnotes) &amp;amp;&amp;amp; .ASM<br />
	- DM Double Kill :: .ASM &amp;amp;&amp;amp; netniV<br />
	- DM Spectate with disc bug &amp;amp;&amp;amp; disconnect :: Miagi<br />
	- Arena Floating :: Miagi<br />
	- Arena Spectate :: Miagi<br />
	- 2v2 White Disc and Scoreboard :: Miagi<br />
<br />
<br />
====================<br />
Commands/How to:<br />
====================<br />
If you are using this on a windows machine, make mp.dll read-only. Otherwise steam will overwrite mp.dll.<br />
<br />
Respawn:<br />
	- ready : Console command to respawn self in DM<br />
<br />
Team Deathmatch:<br />
	- Create/modify game.cfg in ricochet directory<br />
	- Add/modify &amp;quot;mp_teamlist&amp;quot; &amp;quot;red;blue&amp;quot;<br />
	- To enable permanently, in game.cfg add &amp;quot;mp_teamplay&amp;quot; &amp;quot;1&amp;quot;<br />
<br />
<br />
<br />
If I miscredited any fixes, pm me <img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" />.<br />
<br />
<br />
<br />
Comments/Questions, make a new topic.<br />
<br />
<br />
[attachment=2305:attachment]<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/zip.gif" title="ZIP File" border="0" alt=".zip" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1478" target="_blank" title="">mp_12_08_05.zip</a> (Size: 226.93 KB / Downloads: 50)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[DM Spectating bug fixed]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3998</link>
			<pubDate>Sun, 05 Jun 2005 15:24:32 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3998</guid>
			<description><![CDATA[I fixed one bug in dm having to do with a players disc rotate around them while they are spectating.<br />
<br />
<br />
I just added this to the beginning of discthink of disc_weapon_disc.cpp<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>void CDisc&#58;&#58;DiscThink&#40;&#41;<br />
{<br />
<br />
<br />
//Miagi prevent disc returning to spectators<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#40;&#40;CBasePlayer*&#41;&#40;CBaseEntity*&#41;m_hOwner&#41;-&#62;IsObserver&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â <br />
 Â //UTIL_ClientPrintAll&#40; HUD_PRINTNOTIFY, &#34;Observer is true&#34; &#41;;<br />
 Â ReturnToThrower&#40;&#41;;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//End miagi</code></div></div><br />
<br />
Now onto making a respawn command.]]></description>
			<content:encoded><![CDATA[I fixed one bug in dm having to do with a players disc rotate around them while they are spectating.<br />
<br />
<br />
I just added this to the beginning of discthink of disc_weapon_disc.cpp<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>void CDisc&#58;&#58;DiscThink&#40;&#41;<br />
{<br />
<br />
<br />
//Miagi prevent disc returning to spectators<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40; &#40;&#40;CBasePlayer*&#41;&#40;CBaseEntity*&#41;m_hOwner&#41;-&#62;IsObserver&#40;&#41; &#41;<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â <br />
 Â //UTIL_ClientPrintAll&#40; HUD_PRINTNOTIFY, &#34;Observer is true&#34; &#41;;<br />
 Â ReturnToThrower&#40;&#41;;<br />
 Â return;<br />
<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//End miagi</code></div></div><br />
<br />
Now onto making a respawn command.]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[2v2]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3997</link>
			<pubDate>Sun, 05 Jun 2005 05:23:00 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=14">Pique</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3997</guid>
			<description><![CDATA[not sure if this is ricochet or programming but whatever<br />
<br />
2v2 NOW WORKS&#33;&#33;&#33;&#33;&#33;<br />
There are still some obvious bugs as the scoreboard messes up a lot.  The Teams dont get changed up until they lose.  And the titles.txt needs some serious work.  Also the map isn&#39;t great either, now i need to fix it up.  <br />
<br />
BUT TEAMPLAY IS NOW FUNCTIONABLE&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;<br />
MUHAHAHHAHAHAHHAHHAHHAHHA<br />
<br />
Miagi is a godsend.<br />
<br />
heres a screen for all you non-believers<br />
<br />
haha what great news for my 300th post<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1477" target="_blank" title="">2v2.JPG</a> (Size: 19.29 KB / Downloads: 0)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[not sure if this is ricochet or programming but whatever<br />
<br />
2v2 NOW WORKS&#33;&#33;&#33;&#33;&#33;<br />
There are still some obvious bugs as the scoreboard messes up a lot.  The Teams dont get changed up until they lose.  And the titles.txt needs some serious work.  Also the map isn&#39;t great either, now i need to fix it up.  <br />
<br />
BUT TEAMPLAY IS NOW FUNCTIONABLE&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;&#33;<br />
MUHAHAHHAHAHAHHAHHAHHAHHA<br />
<br />
Miagi is a godsend.<br />
<br />
heres a screen for all you non-believers<br />
<br />
haha what great news for my 300th post<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/image.gif" title="JPG Image" border="0" alt=".jpg" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1477" target="_blank" title="">2v2.JPG</a> (Size: 19.29 KB / Downloads: 0)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Arena Floating Bug]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3996</link>
			<pubDate>Sun, 05 Jun 2005 03:41:35 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3996</guid>
			<description><![CDATA[We believe we fixed another bug in arena. The floating bug. It&#39;s on my linux server and pique tested it out and said it worked. PNG also helped test it out and he.. well... he fell out of the sky proving that it worked<img src="https://vadavaka.com/forums/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />.<br />
<br />
Pique pointed me to the right direction on fixing it. I was close in my other attempt except I put the stopobserver in the wrong spot :x.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>for &#40; int i = 0; i &#60; &#40;m_iPlayersPerTeam * 2&#41;; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//.asm - white disc haxxx...<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if the player is &#34;dead&#34; during countdown and they are not NULL<br />
 Â  Â  Â <br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CBasePlayer *pPlayer = &#40;&#40;CBasePlayer*&#41;&#40;CBaseEntity*&#41;m_hCombatants&#91;i&#93;&#41;;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&#40; m_hCombatants&#91;i&#93; &#33;= NULL &amp;amp;&amp;amp; &#33;m_hCombatants&#91;i&#93;-&#62;IsAlive&#40;&#41; &#41;<br />
 Â  Â  Â  Â  Â  Â <br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â //SpawnCombatant&#40; pPlayer &#41;;<br />
 Â  Â pPlayer-&#62;Spawn&#40;&#41;;<br />
 Â  Â //Miagi Stop floaters<br />
 Â  Â pPlayer-&#62;StopObserver&#40;&#41;;<br />
 Â  Â  Â <br />
<br />
 Â  Â //UTIL_ClientPrintAll&#40; HUD_PRINTNOTIFY, &#34;Spawned&#34; &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// end hax<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;m_hCombatants&#91;i&#93;&#41;<br />
 Â  Â &#40;&#40;CBaseEntity*&#41;m_hCombatants&#91;i&#93;&#41;-&#62;pev-&#62;maxspeed = 320;<br />
 Â }</code></div></div>]]></description>
			<content:encoded><![CDATA[We believe we fixed another bug in arena. The floating bug. It&#39;s on my linux server and pique tested it out and said it worked. PNG also helped test it out and he.. well... he fell out of the sky proving that it worked<img src="https://vadavaka.com/forums/images/smilies/biggrin.gif" alt="Big Grin" title="Big Grin" class="smilie smilie_4" />.<br />
<br />
Pique pointed me to the right direction on fixing it. I was close in my other attempt except I put the stopobserver in the wrong spot :x.<br />
<br />
<div class="codeblock"><div class="title">Code:</div><div class="body" dir="ltr"><code>for &#40; int i = 0; i &#60; &#40;m_iPlayersPerTeam * 2&#41;; i++ &#41;<br />
 Â {<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//.asm - white disc haxxx...<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// if the player is &#34;dead&#34; during countdown and they are not NULL<br />
 Â  Â  Â <br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CBasePlayer *pPlayer = &#40;&#40;CBasePlayer*&#41;&#40;CBaseEntity*&#41;m_hCombatants&#91;i&#93;&#41;;<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if&#40; m_hCombatants&#91;i&#93; &#33;= NULL &amp;amp;&amp;amp; &#33;m_hCombatants&#91;i&#93;-&#62;IsAlive&#40;&#41; &#41;<br />
 Â  Â  Â  Â  Â  Â <br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{<br />
 Â  Â //SpawnCombatant&#40; pPlayer &#41;;<br />
 Â  Â pPlayer-&#62;Spawn&#40;&#41;;<br />
 Â  Â //Miagi Stop floaters<br />
 Â  Â pPlayer-&#62;StopObserver&#40;&#41;;<br />
 Â  Â  Â <br />
<br />
 Â  Â //UTIL_ClientPrintAll&#40; HUD_PRINTNOTIFY, &#34;Spawned&#34; &#41;;<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// end hax<br />
<br />
 Â &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if &#40;m_hCombatants&#91;i&#93;&#41;<br />
 Â  Â &#40;&#40;CBaseEntity*&#41;m_hCombatants&#91;i&#93;&#41;-&#62;pev-&#62;maxspeed = 320;<br />
 Â }</code></div></div>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[Sigh C++ is teh suck]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3863</link>
			<pubDate>Wed, 23 Feb 2005 15:00:08 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=112">Coldmetal</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3863</guid>
			<description><![CDATA[For those of you who have mircosoft visual CPP I seriously need help on hell 2 programs.... My AIM name is Coldmetal14<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/txt.gif" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1359" target="_blank" title="">program1.txt</a> (Size: 2.16 KB / Downloads: 18)
<!-- end: postbit_attachments_attachment -->]]></description>
			<content:encoded><![CDATA[For those of you who have mircosoft visual CPP I seriously need help on hell 2 programs.... My AIM name is Coldmetal14<br /><!-- start: postbit_attachments_attachment -->
<br /><!-- start: attachment_icon -->
<img src="https://vadavaka.com/forums/images/attachtypes/txt.gif" title="Text Document" border="0" alt=".txt" />
<!-- end: attachment_icon -->&nbsp;&nbsp;<a href="attachment.php?aid=1359" target="_blank" title="">program1.txt</a> (Size: 2.16 KB / Downloads: 18)
<!-- end: postbit_attachments_attachment -->]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[HL2 Source Compiling]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3826</link>
			<pubDate>Thu, 13 Jan 2005 23:07:54 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=64">Miagi</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3826</guid>
			<description><![CDATA[For those interested in compiling hl2 source code in VC 6.0 instead of having to get .NET version here&#39;s a great site with instructions.<br />
<br />
<a href="http://www.sourcewiki.org/wiki/index.php/Compiling" target="_blank" rel="noopener" class="mycode_url">http://www.sourcewiki.org/wiki/index.php/Compiling</a><br />
<br />
<br />
Following the instructions is the most important part <img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" /><br />
<br />
Everything compiles correctly.<br />
<br />
Though there is no Multiplayer code in it yet.<br />
<br />
Also if you are planning to mess around in it here are fixes to some of the bugs.<br />
<br />
<a href="http://www.hl2dev.tk/" target="_blank" rel="noopener" class="mycode_url">http://www.hl2dev.tk/</a>]]></description>
			<content:encoded><![CDATA[For those interested in compiling hl2 source code in VC 6.0 instead of having to get .NET version here&#39;s a great site with instructions.<br />
<br />
<a href="http://www.sourcewiki.org/wiki/index.php/Compiling" target="_blank" rel="noopener" class="mycode_url">http://www.sourcewiki.org/wiki/index.php/Compiling</a><br />
<br />
<br />
Following the instructions is the most important part <img src="https://vadavaka.com/forums/images/smilies/tongue.gif" alt="Tongue" title="Tongue" class="smilie smilie_5" /><br />
<br />
Everything compiles correctly.<br />
<br />
Though there is no Multiplayer code in it yet.<br />
<br />
Also if you are planning to mess around in it here are fixes to some of the bugs.<br />
<br />
<a href="http://www.hl2dev.tk/" target="_blank" rel="noopener" class="mycode_url">http://www.hl2dev.tk/</a>]]></content:encoded>
		</item>
		<item>
			<title><![CDATA[server crash bug]]></title>
			<link>https://vadavaka.com/forums/showthread.php?tid=3679</link>
			<pubDate>Sat, 25 Sep 2004 04:11:22 +0000</pubDate>
			<dc:creator><![CDATA[<a href="https://vadavaka.com/forums/member.php?action=profile&uid=41">_Acid_Head_</a>]]></dc:creator>
			<guid isPermaLink="false">https://vadavaka.com/forums/showthread.php?tid=3679</guid>
			<description><![CDATA[This is what makes the server reset &amp;quot;randomly&amp;quot;<br />
<br />
Player A plays Player B, Player B falls during a round and leaves before the next round commences (newbs do this a lot when they get frustrated). Server keeps playing the round thinking a player is still there, it shows Player A vs. (blank). Server crashes.<br />
<br />
Fix this if possible.]]></description>
			<content:encoded><![CDATA[This is what makes the server reset &amp;quot;randomly&amp;quot;<br />
<br />
Player A plays Player B, Player B falls during a round and leaves before the next round commences (newbs do this a lot when they get frustrated). Server keeps playing the round thinking a player is still there, it shows Player A vs. (blank). Server crashes.<br />
<br />
Fix this if possible.]]></content:encoded>
		</item>
	</channel>
</rss>