14 Sep 2009

This commit is contained in:
g-cont 2009-09-14 00:00:00 +04:00 committed by Alibek Omarov
parent 407490f4cd
commit 4ee4b14558
52 changed files with 430 additions and 492 deletions

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: baserc - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
baserc.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: client - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
client.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -34,6 +34,8 @@ static HUD_FUNCTIONS gFunctionTable =
HUD_CreateEntities,
HUD_StudioEvent,
V_CalcRefdef,
V_StartPitchDrift,
V_StopPitchDrift,
};
//=======================================================================
@ -72,7 +74,6 @@ int HUD_Redraw( float flTime, int state )
switch( state )
{
case CL_DISCONNECTED:
V_RenderSplash();
break;
case CL_LOADING:
V_RenderPlaque();
@ -125,6 +126,7 @@ void HUD_UpdateEntityVars( edict_t *ent, ref_params_t *view, const entity_state_
ent->v.solid = state->solid;
ent->v.movetype = state->movetype;
ent->v.flags = state->flags;
ent->v.ideal_pitch = state->idealpitch;
switch( state->ed_type )
{

View File

@ -563,11 +563,6 @@ void V_RenderPlaque( void )
DrawImageBar( CVAR_GET_FLOAT( "scr_download" ), "m_download", (ScreenWidth-128)/2, ScreenHeight-60 );
}
void V_RenderSplash( void )
{
DrawImageRectangle( SPR_Load( "gfx/shell/splash" ));
}
//
// hl2 fade - this supports multiple fading
// FIXME: make Class CHudFade instead of C-style code?

View File

@ -24,6 +24,8 @@ extern void HUD_CreateEntities( void );
extern void HUD_StudioEvent( const dstudioevent_t *event, edict_t *entity );
extern void HUD_ParseTempEntity( void );
extern void V_CalcRefdef( ref_params_t *parms );
extern void V_StartPitchDrift( void );
extern void V_StopPitchDrift( void );
extern void V_Init( void );
#define VIEWPORT_SIZE 512
@ -200,7 +202,6 @@ extern void DrawGenericBar( float percent, int x, int y, int w, int h );
extern void Draw_VidInit( void );
// from cl_view.c
extern void V_RenderSplash( void );
extern void V_RenderPlaque( void );
extern edict_t *spot;

View File

@ -9,6 +9,7 @@
#include "triangle_api.h"
#include "pm_movevars.h"
#include "studio_ref.h"
#include "user_cmd.h"
#include "hud.h"
#define ORIGIN_BACKUP 64
@ -30,13 +31,23 @@ typedef struct
int CurrentAngle;
} viewinterp_t;
typedef struct pitchdrift_s
{
int nodrift;
float pitchvel;
float driftmove;
float laststop;
} pitchdrift_t;
static viewinterp_t ViewInterp;
static pitchdrift_t pd;
// view CVARS
cvar_t *scr_ofsx;
cvar_t *scr_ofsy;
cvar_t *scr_ofsz;
cvar_t *cl_vsmoothing;
cvar_t *cl_forwardspeed;
cvar_t *r_mirrors;
cvar_t *r_portals;
cvar_t *r_screens;
@ -129,6 +140,7 @@ void V_Init( void )
scr_ofsz = g_engfuncs.pfnRegisterVariable( "scr_ofsz", "0", 0, "screen offset by Z" );
cl_vsmoothing = g_engfuncs.pfnRegisterVariable( "cl_vsmoothing", "0", 0, "enables lepring in multiplayer" );
cl_forwardspeed = g_engfuncs.pfnRegisterVariable( "cl_forwardspeed", "200", 0, "client forward speed limit" );
v_iyaw_cycle = g_engfuncs.pfnRegisterVariable( "v_iyaw_cycle", "2", 0, "viewing inverse yaw cycle" );
v_iroll_cycle = g_engfuncs.pfnRegisterVariable( "v_iroll_cycle", "0.5", 0, "viewing inverse roll cycle" );
@ -138,7 +150,7 @@ void V_Init( void )
v_ipitch_level = g_engfuncs.pfnRegisterVariable( "v_iyaw_level", "0.3", 0, "viewing inverse pitch level" );
v_centermove = g_engfuncs.pfnRegisterVariable( "v_centermove", "0.15", 0, "center moving scale" );
v_centerspeed = g_engfuncs.pfnRegisterVariable( "v_centerspeed","500", 0, "center moving speed" );
v_centerspeed = g_engfuncs.pfnRegisterVariable( "v_centerspeed", "500", 0, "center moving speed" );
cl_bobcycle = g_engfuncs.pfnRegisterVariable( "cl_bobcycle","0.8", 0, "bob full cycle" );
cl_bob = g_engfuncs.pfnRegisterVariable( "cl_bob", "0.01", 0, "bob value" );
@ -154,6 +166,86 @@ void V_Init( void )
r_debug = g_engfuncs.pfnRegisterVariable( "r_debug", "0", 0, "show renderer state" );
}
//==========================
// V_StartPitchDrift
//==========================
void V_StartPitchDrift( void )
{
if( pd.laststop == GetClientTime())
return;
if( pd.nodrift || !pd.pitchvel )
{
pd.pitchvel = v_centerspeed->value;
pd.nodrift = 0;
pd.driftmove = 0;
}
}
//==========================
// V_StopPitchDrift
//==========================
void V_StopPitchDrift( void )
{
pd.laststop = GetClientTime();
pd.nodrift = 1;
pd.pitchvel = 0;
}
//==========================
// V_DriftPitch
//==========================
void V_DriftPitch( ref_params_t *pparams )
{
float delta, move;
if( pparams->movetype == MOVETYPE_NOCLIP || !pparams->onground || pparams->demoplayback )
{
pd.driftmove = 0;
pd.pitchvel = 0;
return;
}
if( pd.nodrift )
{
if( fabs( (float)pparams->cmd->forwardmove ) < cl_forwardspeed->value )
pd.driftmove = 0;
else pd.driftmove += pparams->frametime;
if( pd.driftmove > v_centermove->value ) V_StartPitchDrift();
return;
}
delta = pparams->idealpitch - pparams->cl_viewangles[PITCH];
if( !delta )
{
pd.pitchvel = 0;
return;
}
move = pparams->frametime * pd.pitchvel;
pd.pitchvel += pparams->frametime * v_centerspeed->value;
if( delta > 0 )
{
if( move > delta )
{
pd.pitchvel = 0;
move = delta;
}
pparams->cl_viewangles[PITCH] += move;
}
else if( delta < 0 )
{
if( move > -delta )
{
pd.pitchvel = 0;
move = -delta;
}
pparams->cl_viewangles[PITCH] -= move;
}
}
//==========================
// V_CalcFov
//==========================
@ -831,6 +923,7 @@ void V_CalcFirstPersonRefdef( ref_params_t *pparams )
edict_t *view = GetViewModel();
int i;
if( g_bFinalPass ) V_DriftPitch( pparams );
bob = V_CalcBob( pparams );
// refresh the position

View File

@ -6,6 +6,7 @@
#define CLGAME_API_H
typedef int HSPRITE; // handle to a graphic
typedef struct usercmd_s usercmd_t;
typedef struct cparticle_s cparticle_t;
typedef struct ref_params_s ref_params_t;
typedef struct dstudioevent_s dstudioevent_t;
@ -158,7 +159,9 @@ typedef struct
void (*pfnDrawTransparentTriangles)( void );
void (*pfnCreateEntities)( void );
void (*pfnStudioEvent)( const dstudioevent_t *event, edict_t *entity );
void (*pfnCalcRefdef)( struct ref_params_s *parms );
void (*pfnCalcRefdef)( ref_params_t *parms );
void (*pfnStartPitchDrift)( void );
void (*pfnStopPitchDrift)( void );
} HUD_FUNCTIONS;
typedef int (*CLIENTAPI)( HUD_FUNCTIONS *pFunctionTable, cl_enginefuncs_t* pEngfuncsFromEngine );

View File

@ -82,7 +82,6 @@ typedef struct entity_state_s
int rendermode; // hl1 legacy stuff, working, but not needed
// client specific
vec3_t delta_angles; // add to command angles to get view direction
vec3_t punch_angles; // add to view direction to get render angles
vec3_t viewangles; // already calculated view angles on server-side
vec3_t viewoffset; // viewoffset over ground
@ -92,6 +91,7 @@ typedef struct entity_state_s
int weaponanim; // weaponmodel sequence
int weaponbody; // weaponmodel body
int weaponskin; // weaponmodel skin
float idealpitch; // client idealpitch
float maxspeed; // min( pev->maxspeed, sv_maxspeed->value )
float health; // client health (other parms can be send by custom messages)
int weapons; // weapon flags

View File

@ -40,6 +40,8 @@ typedef struct ref_params_s
float time; // client time
float oldtime; // studio lerping
usercmd_t *cmd; // last issued usercmd
movevars_t *movevars; // sv.movevars
latched_params_t prev;
@ -56,6 +58,7 @@ typedef struct ref_params_s
edict_t *onground; // pointer to onground entity
byte *areabits; // come from server, contains visible areas list
int waterlevel;
int movetype; // client movetype
skyportal_t skyportal;
@ -66,10 +69,11 @@ typedef struct ref_params_s
vec3_t angles; // viewangles that came from server
vec3_t origin; // origin + viewheight = vieworg
vec3_t viewheight;
float idealpitch;
int health;
vec3_t crosshairangle; // pfnCrosshairAngle values from server
vec3_t punchangle; // recivied from server
vec3_t punchangle; // receivied from server
int clientnum;
int viewmodel; // viewmodel index
int num_entities;

View File

@ -149,7 +149,6 @@ typedef struct enginefuncs_s
word (*pfnCRC_Final)( word pulCRC );
long (*pfnRandomLong)( long lLow, long lHigh );
float (*pfnRandomFloat)( float flLow, float flHigh );
void (*pfnFixAngle)( edict_t *pClient, const float *rgflAngles );
void (*pfnCrosshairAngle)( const edict_t *pClient, float pitch, float yaw );
byte* (*pfnLoadFile)( const char *filename, int *pLength );
void *(*pfnFOpen)( const char* path, const char* mode );

19
common/user_cmd.h Normal file
View File

@ -0,0 +1,19 @@
//=======================================================================
// Copyright XashXT Group 2009 ©
// user_cmd.h - usercmd communication
//=======================================================================
#ifndef USER_CMD_H
#define USER_CMD_H
// usercmd_t communication (a part of network protocol)
typedef struct usercmd_s
{
int msec;
vec3_t angles;
int forwardmove;
int sidemove;
int upmove;
int buttons;
} usercmd_t;
#endif//USER_CMD_H

View File

@ -72,5 +72,5 @@ if exist xtools\xtools.plg del /f /q xtools\xtools.plg
echo Build succeeded!
echo Please wait. Xash is now loading
cd D:\Xash3D\
xash.exe -log -dev 3 +map qctest
xash.exe -log -dev 3 +map start
:done

View File

@ -6,6 +6,8 @@
#include "common.h"
#include "client.h"
#define mlook_active (freelook->integer || (in_mlook.state & 1))
typedef struct
{
int down[2]; // key nums holding it down
@ -18,15 +20,25 @@ cvar_t *cl_yawspeed;
cvar_t *cl_sidespeed;
cvar_t *cl_pitchspeed;
cvar_t *cl_forwardspeed;
cvar_t *cl_backspeed;
cvar_t *cl_anglespeedkey;
cvar_t *cl_nodelta;
cvar_t *v_centermove;
cvar_t *v_centerspeed;
cvar_t *cl_mouseaccel;
cvar_t *m_sensitivity;
cvar_t *m_filter; // mouse filtering
cvar_t *m_pitch;
cvar_t *m_yaw;
cvar_t *m_forward;
cvar_t *m_side;
kbutton_t in_klook, in_left, in_right, in_forward, in_back;
cvar_t *lookspring;
cvar_t *lookstrafe;
cvar_t *freelook;
kbutton_t in_mlook, in_klook, in_left, in_right, in_forward, in_back;
kbutton_t in_lookup, in_lookdown, in_moveleft, in_moveright;
kbutton_t in_strafe, in_speed, in_use, in_jump, in_attack, in_attack2;
kbutton_t in_up, in_down, in_duck, in_reload, in_alt1, in_score, in_break;
@ -91,15 +103,24 @@ void CL_MouseMove( usercmd_t *cmd )
mx *= accel_sensitivity;
my *= accel_sensitivity;
if( !mx && !my ) return;
// add mouse X/Y movement to cmd
if( cl_mouselook->value ) cl.viewangles[YAW] -= m_yaw->value * mx;
else if( in_strafe.state & 1 ) cmd->sidemove = cmd->sidemove + m_side->value * mx;
if(( in_strafe.state & 1 ) || (lookstrafe->integer && mlook_active))
cmd->sidemove += m_side->value * mx;
else cl.refdef.cl_viewangles[YAW] -= m_yaw->value * mx;
if( cl_mouselook->value ) cl.viewangles[PITCH] += m_pitch->value * my;
else if( in_strafe.state & 1 ) cmd->forwardmove = cmd->forwardmove - m_forward->value * my;
if( mlook_active ) clgame.dllFuncs.pfnStopPitchDrift();
if( mlook_active && !( in_strafe.state & 1 ))
{
cl.refdef.cl_viewangles[PITCH] += m_pitch->value * my;
cl.refdef.cl_viewangles[PITCH] = bound( -70, cl.refdef.cl_viewangles[PITCH], 80 );
}
else
{
if(( in_strafe.state & 1 ) && cl.frame.ps.movetype == MOVETYPE_NOCLIP )
cmd->upmove -= m_forward->value * my;
else cmd->forwardmove -= m_forward->value * my;
}
}
}
@ -219,7 +240,7 @@ float CL_KeyState( kbutton_t *key )
else val = 0.25; // pressed and released this frame
}
key->state &= 1; // clear impulses
key->state &= 1; // clear impulses
return val;
}
@ -269,10 +290,18 @@ void IN_ScoreUp(void) {IN_KeyUp( &in_score ); }
void IN_BreakDown(void) {IN_KeyDown( &in_break ); }
void IN_BreakUp(void) {IN_KeyUp( &in_break ); }
void IN_Cancel(void) { in_cancel = 1; } // special handling
void IN_MLookDown(void) { Cvar_SetValue( "cl_mouselook", 1 ); }
void IN_MLookUp(void) { IN_CenterView(); Cvar_SetValue( "cl_mouselook", 0 ); }
void IN_CenterView (void){ cl.viewangles[PITCH] = -cl.frame.ps.delta_angles[PITCH]; }
void IN_MLookDown(void) {IN_KeyDown( &in_mlook ); }
void IN_CenterView(void)
{
if( !mlook_active ) clgame.dllFuncs.pfnStartPitchDrift();
else cl.refdef.cl_viewangles[PITCH] = 0;
}
void IN_MLookUp(void)
{
IN_KeyUp( &in_mlook );
if( !mlook_active && lookspring->integer )
clgame.dllFuncs.pfnStopPitchDrift();
}
//==========================================================================
/*
@ -285,22 +314,36 @@ Moves the local angle positions
void CL_AdjustAngles( void )
{
float speed;
float up, down;
if( cl.frame.ps.health <= 0 ) return;
if( in_speed.state & 1 )
speed = cls.frametime * cl_anglespeedkey->value;
else speed = cls.frametime;
speed = ( in_speed.state & 1 ) ? cls.frametime * cl_anglespeedkey->value : cls.frametime;
if(!(in_strafe.state & 1))
if(!( in_strafe.state & 1 ))
{
cl.viewangles[YAW] -= speed * cl_yawspeed->value * CL_KeyState( &in_right );
cl.viewangles[YAW] += speed * cl_yawspeed->value * CL_KeyState( &in_left );
cl.viewangles[YAW] = anglemod( cl.viewangles[YAW] );
cl.refdef.cl_viewangles[YAW] -= speed * cl_yawspeed->value * CL_KeyState( &in_right );
cl.refdef.cl_viewangles[YAW] += speed * cl_yawspeed->value * CL_KeyState( &in_left );
cl.refdef.cl_viewangles[YAW] = anglemod( cl.refdef.cl_viewangles[YAW] );
}
if( in_klook.state & 1 )
{
clgame.dllFuncs.pfnStopPitchDrift ();
cl.refdef.cl_viewangles[PITCH] -= speed * cl_pitchspeed->value * CL_KeyState( &in_forward );
cl.refdef.cl_viewangles[PITCH] += speed * cl_pitchspeed->value * CL_KeyState( &in_back );
}
up = CL_KeyState( &in_lookup );
down = CL_KeyState( &in_lookdown );
cl.viewangles[PITCH] -= speed * cl_pitchspeed->value * CL_KeyState( &in_lookup );
cl.viewangles[PITCH] += speed * cl_pitchspeed->value * CL_KeyState( &in_lookdown );
cl.refdef.cl_viewangles[PITCH] -= speed * cl_pitchspeed->value * up;
cl.refdef.cl_viewangles[PITCH] += speed * cl_pitchspeed->value * down;
if( up || down ) clgame.dllFuncs.pfnStopPitchDrift();
cl.refdef.cl_viewangles[PITCH] = bound( -70, cl.refdef.cl_viewangles[PITCH], 80 );
cl.refdef.cl_viewangles[ROLL] = bound( -50, cl.refdef.cl_viewangles[ROLL], 50 );
}
/*
@ -314,23 +357,25 @@ void CL_BaseMove( usercmd_t *cmd )
{
CL_AdjustAngles ();
memset( cmd, 0, sizeof( *cmd ));
VectorCopy (cl.viewangles, cmd->angles);
Mem_Set( cmd, 0, sizeof( *cmd ));
if( in_strafe.state & 1 )
{
cmd->sidemove += cl_sidespeed->value * CL_KeyState (&in_right);
cmd->sidemove -= cl_sidespeed->value * CL_KeyState (&in_left);
cmd->sidemove += cl_sidespeed->value * CL_KeyState( &in_right );
cmd->sidemove -= cl_sidespeed->value * CL_KeyState( &in_left );
}
cmd->sidemove += cl_sidespeed->value * CL_KeyState (&in_moveright);
cmd->sidemove -= cl_sidespeed->value * CL_KeyState (&in_moveleft);
cmd->sidemove += cl_sidespeed->value * CL_KeyState( &in_moveright );
cmd->sidemove -= cl_sidespeed->value * CL_KeyState( &in_moveleft );
cmd->upmove += cl_upspeed->value * CL_KeyState (&in_up);
cmd->upmove -= cl_upspeed->value * CL_KeyState (&in_down);
cmd->upmove += cl_upspeed->value * CL_KeyState( &in_up );
cmd->upmove -= cl_upspeed->value * CL_KeyState( &in_down );
cmd->forwardmove += cl_forwardspeed->value * CL_KeyState (&in_forward);
cmd->forwardmove -= cl_forwardspeed->value * CL_KeyState (&in_back);
if(!( in_klook.state & 1 ))
{
cmd->forwardmove += cl_forwardspeed->value * CL_KeyState( &in_forward );
cmd->forwardmove -= cl_backspeed->value * CL_KeyState( &in_back );
}
// adjust for speed key / running
if( in_speed.state & 1 ^ cl_run->integer )
@ -341,19 +386,6 @@ void CL_BaseMove( usercmd_t *cmd )
}
}
void CL_ClampPitch (void)
{
float pitch;
pitch = cl.frame.ps.delta_angles[PITCH];
if( pitch > 180 ) pitch -= 360;
if( cl.viewangles[PITCH] + pitch < -360 ) cl.viewangles[PITCH] += 360; // wrapped
if( cl.viewangles[PITCH] + pitch > 360 ) cl.viewangles[PITCH] -= 360; // wrapped
if( cl.viewangles[PITCH] + pitch > 89 ) cl.viewangles[PITCH] = 89 - pitch;
if( cl.viewangles[PITCH] + pitch < -89 ) cl.viewangles[PITCH] = -89 - pitch;
}
/*
==============
CL_ButtonBits
@ -472,12 +504,7 @@ void CL_FinishMove( usercmd_t *cmd )
if( ms > 250 ) ms = 100; // time was unreasonable
cmd->msec = ms;
CL_ClampPitch();
VectorCopy( cl.viewangles, cmd->angles );
// HACKHACK: client lightlevel
cmd->lightlevel = (byte)cl_lightlevel->value;
if( cls.key_dest == key_game )
cmd->buttons = CL_ButtonBits( 1 );
@ -487,7 +514,9 @@ void CL_FinishMove( usercmd_t *cmd )
cl.data.iWeaponBits = cl.frame.ps.weapons;
cl.data.mouse_sensitivity = cl.mouse_sens;
VectorCopy( cl.viewangles, cl.data.angles );
VectorCopy( cl.refdef.cl_viewangles, cmd->angles );
VectorCopy( cl.refdef.cl_viewangles, cl.data.angles );
VectorCopy( cl.refdef.origin, cl.data.origin );
clgame.dllFuncs.pfnUpdateClientData( &cl.data, ( cl.time * 0.001f ));
@ -528,16 +557,16 @@ void CL_SendCmd( void )
{
sizebuf_t buf;
byte data[128];
usercmd_t *cmd, *oldcmd;
usercmd_t *oldcmd;
usercmd_t nullcmd;
int checksumIndex;
// build a command even if not connected
// save this command off for prediction
cmd = &cl.cmds[cls.netchan.outgoing_sequence & (CMD_BACKUP-1)];
cl.refdef.cmd = &cl.cmds[cls.netchan.outgoing_sequence & (CMD_BACKUP-1)];
cl.cmd_time[cls.netchan.outgoing_sequence & (CMD_BACKUP-1)] = cls.realtime;
*cmd = CL_CreateCmd ();
*cl.refdef.cmd = CL_CreateCmd ();
if( cls.state == ca_disconnected || cls.state == ca_connecting )
return;
@ -554,6 +583,12 @@ void CL_SendCmd( void )
return;
}
if( freelook->modified )
{
if( !mlook_active && lookspring->value )
clgame.dllFuncs.pfnStartPitchDrift();
}
// send a userinfo update if needed
if( userinfo_modified )
{
@ -583,17 +618,17 @@ void CL_SendCmd( void )
// send this and the previous cmds in the message, so
// if the last packet was dropped, it can be recovered
cmd = &cl.cmds[(cls.netchan.outgoing_sequence-2) & (CMD_BACKUP-1)];
cl.refdef.cmd = &cl.cmds[(cls.netchan.outgoing_sequence-2) & (CMD_BACKUP-1)];
Mem_Set( &nullcmd, 0, sizeof( nullcmd ));
MSG_WriteDeltaUsercmd( &buf, &nullcmd, cmd) ;
oldcmd = cmd;
MSG_WriteDeltaUsercmd( &buf, &nullcmd, cl.refdef.cmd );
oldcmd = cl.refdef.cmd;
cmd = &cl.cmds[(cls.netchan.outgoing_sequence-1) & (CMD_BACKUP-1)];
MSG_WriteDeltaUsercmd( &buf, oldcmd, cmd );
oldcmd = cmd;
cl.refdef.cmd = &cl.cmds[(cls.netchan.outgoing_sequence-1) & (CMD_BACKUP-1)];
MSG_WriteDeltaUsercmd( &buf, oldcmd, cl.refdef.cmd );
oldcmd = cl.refdef.cmd;
cmd = &cl.cmds[(cls.netchan.outgoing_sequence) & (CMD_BACKUP-1)];
MSG_WriteDeltaUsercmd( &buf, oldcmd, cmd );
cl.refdef.cmd = &cl.cmds[(cls.netchan.outgoing_sequence) & (CMD_BACKUP-1)];
MSG_WriteDeltaUsercmd( &buf, oldcmd, cl.refdef.cmd );
// calculate a checksum over the move commands
buf.data[checksumIndex] = CRC_Sequence( buf.data + checksumIndex + 1, buf.cursize - checksumIndex - 1, cls.netchan.outgoing_sequence);
@ -618,6 +653,15 @@ void CL_InitInput( void )
v_centermove = Cvar_Get ("v_centermove", "0.15", 0, "client center moving" );
v_centerspeed = Cvar_Get ("v_centerspeed", "500", 0, "client center speed" );
cl_nodelta = Cvar_Get ("cl_nodelta", "0", 0, "disable delta-compression for usercommnds" );
freelook = Cvar_Get( "freelook", "1", CVAR_ARCHIVE, "enables mouse look" );
lookspring = Cvar_Get( "lookspring", "0", CVAR_ARCHIVE, "allow look spring" );
lookstrafe = Cvar_Get( "lookstrafe", "0", CVAR_ARCHIVE, "allow look strafe" );
m_pitch = Cvar_Get ("m_pitch", "0.022", CVAR_ARCHIVE, "mouse pitch value" );
m_yaw = Cvar_Get ("m_yaw", "0.022", 0, "mouse yaw value" );
m_forward = Cvar_Get ("m_forward", "1", 0, "mouse forward speed" );
m_side = Cvar_Get ("m_side", "1", 0, "mouse side speed" );
Cmd_AddCommand ("centerview", IN_CenterView, "gradually recenter view (stop looking up/down)" );

View File

@ -23,7 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "client.h"
#include "byteorder.h"
cvar_t *freelook;
cvar_t *rcon_client_password;
cvar_t *rcon_address;
@ -42,16 +41,6 @@ cvar_t *cl_showclamp;
cvar_t *cl_mouselook;
cvar_t *cl_paused;
cvar_t *lookspring;
cvar_t *lookstrafe;
cvar_t *m_pitch;
cvar_t *m_yaw;
cvar_t *m_forward;
cvar_t *m_side;
cvar_t *cl_lightlevel;
//
// userinfo
//
@ -1084,48 +1073,36 @@ void CL_InitLocal( void )
CL_InitInput();
// register our variables
cl_footsteps = Cvar_Get ("cl_footsteps", "1", 0, "disables player footsteps" );
cl_predict = Cvar_Get ("cl_predict", "1", CVAR_ARCHIVE, "disables client movement prediction" );
cl_maxfps = Cvar_Get ("cl_maxfps", "1000", 0, "maximum client fps" );
cl_footsteps = Cvar_Get( "cl_footsteps", "1", 0, "disables player footsteps" );
cl_predict = Cvar_Get( "cl_predict", "1", CVAR_ARCHIVE, "disables client movement prediction" );
cl_maxfps = Cvar_Get( "cl_maxfps", "1000", 0, "maximum client fps" );
cl_particles = Cvar_Get( "cl_particles", "1", CVAR_ARCHIVE, "disables particle effects" );
cl_particlelod = Cvar_Get( "cl_lod_particle", "0", CVAR_ARCHIVE, "enables particle LOD (1, 2, 3)" );
cl_upspeed = Cvar_Get ("cl_upspeed", "200", 0, "client upspeed limit" );
cl_forwardspeed = Cvar_Get ("cl_forwardspeed", "200", 0, "client forward speed limit" );
cl_sidespeed = Cvar_Get ("cl_sidespeed", "200", 0, "client side-speed limit" );
cl_yawspeed = Cvar_Get ("cl_yawspeed", "140", 0, "client yaw speed" );
cl_pitchspeed = Cvar_Get ("cl_pitchspeed", "150", 0, "client pitch speed" );
cl_anglespeedkey = Cvar_Get ("cl_anglespeedkey", "1.5", 0, "client anglespeed" );
cl_upspeed = Cvar_Get( "cl_upspeed", "200", 0, "client upspeed limit" );
cl_forwardspeed = Cvar_Get( "cl_forwardspeed", "200", 0, "client forward speed limit" );
cl_backspeed = Cvar_Get( "cl_backspeed", "200", 0, "client bask speed limit" );
cl_sidespeed = Cvar_Get( "cl_sidespeed", "200", 0, "client side-speed limit" );
cl_yawspeed = Cvar_Get( "cl_yawspeed", "140", 0, "client yaw speed" );
cl_pitchspeed = Cvar_Get( "cl_pitchspeed", "150", 0, "client pitch speed" );
cl_anglespeedkey = Cvar_Get( "cl_anglespeedkey", "1.5", 0, "client anglespeed" );
cl_run = Cvar_Get( "cl_run", "0", CVAR_ARCHIVE, "keep client for always run mode" );
cl_run = Cvar_Get ("cl_run", "0", CVAR_ARCHIVE, "keep client for always run mode" );
cl_mouselook = Cvar_Get( "cl_mouselook", "1", CVAR_ARCHIVE, "enables mouse look" );
lookspring = Cvar_Get ("lookspring", "0", CVAR_ARCHIVE, "allow look spring" );
lookstrafe = Cvar_Get ("lookstrafe", "0", CVAR_ARCHIVE, "allow look strafe" );
cl_shownet = Cvar_Get( "cl_shownet", "0", 0, "client show network packets" );
cl_showmiss = Cvar_Get( "cl_showmiss", "0", 0, "client show network errors" );
cl_showclamp = Cvar_Get( "cl_showclamp", "0", CVAR_ARCHIVE, "show client clamping" );
cl_timeout = Cvar_Get( "cl_timeout", "120", 0, "connect timeout (in-seconds)" );
m_pitch = Cvar_Get ("m_pitch", "0.022", CVAR_ARCHIVE, "mouse pitch value" );
m_yaw = Cvar_Get ("m_yaw", "0.022", 0, "mouse yaw value" );
m_forward = Cvar_Get ("m_forward", "1", 0, "mouse forward speed" );
m_side = Cvar_Get ("m_side", "1", 0, "mouse side speed" );
rcon_client_password = Cvar_Get( "rcon_password", "", 0, "remote control client password" );
rcon_address = Cvar_Get( "rcon_address", "", 0, "remote control address" );
cl_shownet = Cvar_Get ("cl_shownet", "0", 0, "client show network packets" );
cl_showmiss = Cvar_Get ("cl_showmiss", "0", 0, "client show network errors" );
cl_showclamp = Cvar_Get ("cl_showclamp", "0", CVAR_ARCHIVE, "show client clamping" );
cl_timeout = Cvar_Get ("cl_timeout", "120", 0, "connect timeout (in-seconds)" );
rcon_client_password = Cvar_Get ("rcon_password", "", 0, "remote control client password" );
rcon_address = Cvar_Get ("rcon_address", "", 0, "remote control address" );
cl_lightlevel = Cvar_Get ("r_lightlevel", "0", 0, "no description" );
//
// userinfo
//
info_password = Cvar_Get ("password", "", CVAR_USERINFO, "player password" );
info_spectator = Cvar_Get ("spectator", "0", CVAR_USERINFO, "spectator mode" );
name = Cvar_Get ("name", "unnamed", CVAR_USERINFO | CVAR_ARCHIVE, "player name" );
rate = Cvar_Get ("rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE, "player network rate" ); // FIXME
fov = Cvar_Get ("fov", "90", CVAR_USERINFO | CVAR_ARCHIVE, "client fov" );
cl_showfps = Cvar_Get ("cl_showfps", "1", CVAR_ARCHIVE, "show client fps" );
info_password = Cvar_Get( "password", "", CVAR_USERINFO, "player password" );
info_spectator = Cvar_Get( "spectator", "0", CVAR_USERINFO, "spectator mode" );
name = Cvar_Get( "name", "unnamed", CVAR_USERINFO | CVAR_ARCHIVE, "player name" );
rate = Cvar_Get( "rate", "25000", CVAR_USERINFO | CVAR_ARCHIVE, "player network rate" ); // FIXME
fov = Cvar_Get( "fov", "90", CVAR_USERINFO | CVAR_ARCHIVE, "client fov" );
cl_showfps = Cvar_Get( "cl_showfps", "1", CVAR_ARCHIVE, "show client fps" );
// register our commands
Cmd_AddCommand ("cmd", CL_ForwardToServer_f, "send a console commandline to the server" );

View File

@ -418,9 +418,9 @@ set the view angle to this absolute value
*/
void CL_ParseSetAngle( sizebuf_t *msg )
{
cl.viewangles[0] = MSG_ReadAngle32( msg );
cl.viewangles[1] = MSG_ReadAngle32( msg );
cl.viewangles[2] = MSG_ReadAngle32( msg );
cl.refdef.cl_viewangles[0] = MSG_ReadAngle32( msg );
cl.refdef.cl_viewangles[1] = MSG_ReadAngle32( msg );
cl.refdef.cl_viewangles[2] = MSG_ReadAngle32( msg );
}
/*

View File

@ -343,7 +343,7 @@ void CL_PredictMovement (void)
{
// just set angles
for( i = 0; i < 3; i++ )
cl.predicted_angles[i] = cl.viewangles[i] + cl.frame.ps.delta_angles[i];
cl.predicted_angles[i] = cl.refdef.cl_viewangles[i];
return;
}

View File

@ -83,7 +83,10 @@ void V_SetupRefDef( void )
// see if the player entity was teleported this frame
if( ps->ed_flags & ESF_NO_PREDICTION )
{
cl.render_flags &= ~RDF_OLDAREABITS;
ops = ps; // don't interpolate
}
// UNDONE: temporary place for detect waterlevel
CL_CheckWater( clent );
@ -100,7 +103,6 @@ void V_SetupRefDef( void )
VectorCopy( ops->viewoffset, cl.refdef.prev.viewheight );
VectorCopy( ps->punch_angles, cl.refdef.punchangle );
VectorCopy( ops->punch_angles, cl.refdef.prev.punchangle );
VectorCopy( cl.predicted_angles, cl.refdef.cl_viewangles );
cl.refdef.movevars = &clgame.movevars;
@ -111,6 +113,8 @@ void V_SetupRefDef( void )
cl.refdef.clientnum = cl.playernum; // not a entity num
cl.refdef.viewmodel = ps->viewmodel;
cl.refdef.health = ps->health;
cl.refdef.movetype = ps->movetype;
cl.refdef.idealpitch = ps->idealpitch;
cl.refdef.num_entities = clgame.numEntities;
cl.refdef.max_entities = clgame.maxEntities;
cl.refdef.max_clients = clgame.maxClients;

View File

@ -99,13 +99,6 @@ typedef struct
int mouse_step;
float mouse_sens;
// the client maintains its own idea of view angles, which are
// sent to the server each frame. It is cleared to 0 upon entering each level.
// the server sends a delta each frame which is added to the locally
// tracked view angles to account for standing on rotating objects,
// and teleport direction changes
vec3_t viewangles;
double mtime[2]; // the timestamp of the last two messages
double time; // this is the time value that the client
double oldtime; // cl.oldtime
@ -297,6 +290,7 @@ extern cvar_t *cl_footsteps;
extern cvar_t *cl_showfps;
extern cvar_t *cl_upspeed;
extern cvar_t *cl_forwardspeed;
extern cvar_t *cl_backspeed;
extern cvar_t *cl_sidespeed;
extern cvar_t *cl_shownet;
extern cvar_t *cl_yawspeed;
@ -312,18 +306,9 @@ extern cvar_t *cl_showclamp;
extern cvar_t *cl_particles;
extern cvar_t *cl_particlelod;
extern cvar_t *lookspring;
extern cvar_t *lookstrafe;
extern cvar_t *m_pitch;
extern cvar_t *m_yaw;
extern cvar_t *m_forward;
extern cvar_t *m_side;
extern cvar_t *cl_mouselook;
extern cvar_t *cl_testentities;
extern cvar_t *cl_testlights;
extern cvar_t *cl_testflashlight;
extern cvar_t *cl_lightlevel; // FIXME HACK
extern cvar_t *cl_paused;
extern cvar_t *cl_levelshot_name;

View File

@ -90,9 +90,6 @@ static net_field_t ent_fields[] =
{ ES_FIELD(oldorigin[1]), NET_FLOAT, true },
{ ES_FIELD(oldorigin[2]), NET_FLOAT, true },
{ ES_FIELD(rendermode), NET_BYTE, false }, // render mode (legacy stuff)
{ ES_FIELD(delta_angles[0]), NET_ANGLE, false },
{ ES_FIELD(delta_angles[1]), NET_ANGLE, false },
{ ES_FIELD(delta_angles[2]), NET_ANGLE, false },
{ ES_FIELD(punch_angles[0]), NET_SCALE, false },
{ ES_FIELD(punch_angles[1]), NET_SCALE, false },
{ ES_FIELD(punch_angles[2]), NET_SCALE, false },
@ -102,6 +99,7 @@ static net_field_t ent_fields[] =
{ ES_FIELD(viewoffset[0]), NET_SCALE, false },
{ ES_FIELD(viewoffset[1]), NET_SCALE, false },
{ ES_FIELD(viewoffset[2]), NET_SCALE, false },
{ ES_FIELD(idealpitch), NET_SCALE, false },
{ ES_FIELD(viewmodel), NET_WORD, false },
{ ES_FIELD(maxspeed), NET_FLOAT, false }, // client maxspeed
{ ES_FIELD(fov), NET_FLOAT, false }, // client horizontal field of view
@ -122,7 +120,6 @@ static net_field_t cmd_fields[] =
{ CM_FIELD(sidemove), NET_SHORT, false },
{ CM_FIELD(upmove), NET_SHORT, false },
{ CM_FIELD(buttons), NET_SHORT, false },
{ CM_FIELD(lightlevel), NET_BYTE, false },
{ NULL },
};
@ -231,8 +228,8 @@ write # of bytes
*/
void _MSG_WriteBits( sizebuf_t *msg, long value, const char *name, int net_type, const char *filename, const int fileline )
{
union { long l; float f; } dat;
byte *buf;
ftol_t dat;
byte *buf;
// this isn't an exact overflow check, but close enough
if( msg->maxsize - msg->cursize < 4 )
@ -275,12 +272,16 @@ void _MSG_WriteBits( sizebuf_t *msg, long value, const char *name, int net_type,
buf[3] = (value>>24);
break;
case NET_ANGLE8:
value = ANGLE2CHAR( value );
if( dat.f > 360 ) dat.f -= 360;
else if( dat.f < 0 ) dat.f += 360;
value = ANGLE2CHAR( dat.f );
buf = MSG_GetSpace( msg, 1 );
buf[0] = value;
break;
case NET_ANGLE:
value = ANGLE2SHORT( value );
if( dat.f > 360 ) dat.f -= 360;
else if( dat.f < 0 ) dat.f += 360;
value = ANGLE2SHORT( dat.f );
buf = MSG_GetSpace( msg, 2 );
buf[0] = value & 0xff;
buf[1] = value>>8;
@ -318,8 +319,8 @@ read # of bytes
*/
long _MSG_ReadBits( sizebuf_t *msg, int net_type, const char *filename, const int fileline )
{
union { long l; float f; } dat;
long value = 0;
ftol_t dat;
long value = 0;
switch( net_type )
{
@ -343,22 +344,26 @@ long _MSG_ReadBits( sizebuf_t *msg, int net_type, const char *filename, const in
break;
case NET_WORD:
case NET_SHORT:
dat.l = (short)BuffLittleShort(msg->data + msg->readcount);
dat.l = (short)BuffLittleShort( msg->data + msg->readcount );
msg->readcount += 2;
break;
case NET_LONG:
case NET_FLOAT:
dat.l = (long)BuffLittleLong(msg->data + msg->readcount);
dat.l = (long)BuffLittleLong( msg->data + msg->readcount );
msg->readcount += 4;
break;
case NET_ANGLE8:
value = (unsigned char)msg->data[msg->readcount];
dat.l = CHAR2ANGLE( value );
dat.f = CHAR2ANGLE( value );
if( dat.f < -180 ) dat.f += 360;
else if( dat.f > 180 ) dat.f -= 360;
msg->readcount += 1;
break;
case NET_ANGLE:
value = (unsigned short)BuffLittleShort( msg->data + msg->readcount );
dat.l = SHORT2ANGLE( value );
dat.f = SHORT2ANGLE( value );
if( dat.f < -180 ) dat.f += 360;
else if( dat.f > 180 ) dat.f -= 360;
msg->readcount += 2;
break;
case NET_COORD:

View File

@ -22,6 +22,12 @@ enum net_types_e
NET_TYPES,
};
typedef union
{
float f;
long l;
} ftol_t;
typedef struct net_desc_s
{
int type; // pixelformat
@ -113,6 +119,7 @@ static const net_desc_t NWDesc[] =
==========================================================
*/
#include "user_cmd.h"
#include "entity_state.h"
#define ES_FIELD( x ) #x,(int)&((entity_state_t*)0)->x

View File

@ -6,36 +6,13 @@
--------------------Configuration: engine - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D4.tmp" with contents
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBB.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "common" /I "server" /I "client" /I "uimenu" /I "../public" /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\engine\!debug/" /Fo"..\temp\engine\!debug/" /Fd"..\temp\engine\!debug/" /FD /c
"D:\Xash3D\src_main\engine\common\cinematic.c"
"D:\Xash3D\src_main\engine\client\cl_cmds.c"
"D:\Xash3D\src_main\engine\client\cl_demo.c"
"D:\Xash3D\src_main\engine\client\cl_effects.c"
"D:\Xash3D\src_main\engine\client\cl_frame.c"
"D:\Xash3D\src_main\engine\client\cl_game.c"
"D:\Xash3D\src_main\engine\client\cl_input.c"
"D:\Xash3D\src_main\engine\client\cl_main.c"
"D:\Xash3D\src_main\engine\client\cl_parse.c"
"D:\Xash3D\src_main\engine\client\cl_phys.c"
"D:\Xash3D\src_main\engine\client\cl_scrn.c"
"D:\Xash3D\src_main\engine\client\cl_view.c"
"D:\Xash3D\src_main\engine\common\con_keys.c"
"D:\Xash3D\src_main\engine\common\con_main.c"
"D:\Xash3D\src_main\engine\common\con_utils.c"
"D:\Xash3D\src_main\engine\common\engfuncs.c"
"D:\Xash3D\src_main\engine\host.c"
"D:\Xash3D\src_main\engine\common\input.c"
"D:\Xash3D\src_main\engine\uimenu\ui_ingame.c"
"D:\Xash3D\src_main\engine\uimenu\ui_loadgame.c"
"D:\Xash3D\src_main\engine\uimenu\ui_main.c"
"D:\Xash3D\src_main\engine\uimenu\ui_menu.c"
"D:\Xash3D\src_main\engine\uimenu\ui_mods.c"
"D:\Xash3D\src_main\engine\uimenu\ui_savegame.c"
"D:\Xash3D\src_main\engine\common\net_msg.c"
]
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D4.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D5.tmp" with contents
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBB.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBC.tmp" with contents
[
user32.lib msvcrtd.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\engine\!debug/engine.pdb" /debug /machine:I386 /nodefaultlib:"msvcrt.lib" /out:"..\temp\engine\!debug/engine.dll" /implib:"..\temp\engine\!debug/engine.lib" /pdbtype:sept
"\Xash3D\src_main\temp\engine\!debug\cinematic.obj"
@ -96,43 +73,16 @@ user32.lib msvcrtd.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..
"\Xash3D\src_main\temp\engine\!debug\ui_singleplayer.obj"
"\Xash3D\src_main\temp\engine\!debug\ui_video.obj"
]
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D5.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D6.bat" with contents
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBC.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBD.bat" with contents
[
@echo off
copy \Xash3D\src_main\temp\engine\!debug\engine.dll "D:\Xash3D\bin\engine.dll"
]
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP64D6.bat"
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP6DBD.bat"
Compiling...
cinematic.c
cl_cmds.c
cl_demo.c
cl_effects.c
cl_frame.c
cl_game.c
cl_input.c
cl_main.c
cl_parse.c
cl_phys.c
cl_scrn.c
cl_view.c
con_keys.c
con_main.c
con_utils.c
engfuncs.c
host.c
input.c
ui_ingame.c
ui_loadgame.c
Generating Code...
Compiling...
ui_main.c
ui_menu.c
ui_mods.c
ui_savegame.c
Generating Code...
net_msg.c
Linking...
Creating library ..\temp\engine\!debug/engine.lib and object ..\temp\engine\!debug/engine.exp
<h3>Output Window</h3>
Performing Custom Build Step on \Xash3D\src_main\temp\engine\!debug\engine.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.

View File

@ -472,7 +472,7 @@ void Host_InitCommon( const int argc, const char **argv )
if( FS_GetParmFromCmdLine( "-dev", dev_level ))
host.developer = com.atoi( dev_level );
FS_LoadGameInfo();
FS_LoadGameInfo( NULL );
zonepool = Mem_AllocPool( "Zone Engine" );

View File

@ -274,6 +274,7 @@ extern cvar_t *sv_noreload; // don't reload level state when reentering
extern cvar_t *sv_airaccelerate; // don't reload level state when reentering
extern cvar_t *sv_accelerate;
extern cvar_t *sv_friction;
extern cvar_t *sv_idealpitchscale;
extern cvar_t *sv_maxvelocity;
extern cvar_t *sv_gravity;
extern cvar_t *sv_fps; // running server at
@ -360,9 +361,9 @@ void SV_GetChallenge( netadr_t from );
void SV_DirectConnect( netadr_t from );
void SV_PutClientInServer( edict_t *ent );
void SV_ClientThink( sv_client_t *cl, usercmd_t *cmd );
void SV_SetAngle( edict_t *ent, const float *rgflAngles );
void SV_ExecuteClientMessage( sv_client_t *cl, sizebuf_t *msg );
void SV_ConnectionlessPacket( netadr_t from, sizebuf_t *msg );
void SV_SetIdealPitch( sv_client_t *cl );
//
// sv_ccmds.c

View File

@ -7,6 +7,8 @@
#include "const.h"
#include "server.h"
#define MAX_FORWARD 6
typedef struct ucmd_s
{
const char *name;
@ -468,17 +470,6 @@ void SV_RemoteCommand( netadr_t from, sizebuf_t *msg )
SV_EndRedirect();
}
void SV_SetAngle( edict_t *ent, const float *rgflAngles )
{
if( !ent || !ent->pvServerData || !ent->pvServerData->client ) return;
MSG_Begin( svc_setangle );
MSG_WriteAngle32( &sv.multicast, rgflAngles[0] );
MSG_WriteAngle32( &sv.multicast, rgflAngles[1] );
MSG_WriteAngle32( &sv.multicast, rgflAngles[2] );
MSG_Send( MSG_ONE_R, vec3_origin, ent );
}
/*
===========
PutClientInServer
@ -1012,9 +1003,7 @@ void SV_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
void SV_ApplyClientMove( sv_client_t *cl, usercmd_t *cmd )
{
int i;
float temp, pitch;
edict_t *ent = cl->edict;
edict_t *ent = cl->edict;
ent->v.button = cmd->buttons; // initialize buttons
if( cmd->upmove < 0 ) ent->v.button |= IN_DUCK;
@ -1024,21 +1013,7 @@ void SV_ApplyClientMove( sv_client_t *cl, usercmd_t *cmd )
if( cmd->forwardmove > 0 ) ent->v.button |= IN_FORWARD;
if( cmd->forwardmove < 0 ) ent->v.button |= IN_BACK;
// circularly clamp the angles with deltas
for( i = 0; i < 3; i++ )
{
temp = cmd->angles[i] + ent->pvServerData->s.delta_angles[i];
ent->v.viewangles[i] = temp;
}
pitch = ent->pvServerData->s.delta_angles[PITCH];
if( pitch > 180 ) pitch -= 360;
// don't let the player look up or down more than 90 degrees
if( ent->v.viewangles[PITCH] + pitch < -360 ) ent->v.viewangles[PITCH] += 360; // wrapped
if( ent->v.viewangles[PITCH] + pitch > 360 ) ent->v.viewangles[PITCH] -= 360; // wrapped
if( ent->v.viewangles[PITCH] + pitch > 89 ) ent->v.viewangles[PITCH] = 89 - pitch;
if( ent->v.viewangles[PITCH] + pitch < -89 ) ent->v.viewangles[PITCH] = -89 - pitch;
VectorCopy( cmd->angles, ent->v.viewangles );
if( ent->v.flags & FL_DUCKING && ent->v.flags & FL_ONGROUND )
{
@ -1125,6 +1100,72 @@ float SV_CalcRoll( vec3_t angles, vec3_t velocity )
}
/*
===============
SV_SetIdealPitch
===============
*/
void SV_SetIdealPitch( sv_client_t *cl )
{
float angleval, sinval, cosval;
trace_t tr;
vec3_t top, bottom;
float z[MAX_FORWARD];
int i, j;
int step, dir, steps;
edict_t *ent = cl->edict;
if( !( ent->v.flags & FL_ONGROUND ))
return;
angleval = ent->v.angles[YAW] * M_PI * 2 / 360;
com.sincos( angleval, &sinval, &cosval );
for( i = 0; i < MAX_FORWARD; i++ )
{
top[0] = ent->v.origin[0] + cosval * (i + 3) * 12;
top[1] = ent->v.origin[1] + sinval * (i + 3) * 12;
top[2] = ent->v.origin[2] + ent->v.view_ofs[2];
bottom[0] = top[0];
bottom[1] = top[1];
bottom[2] = top[2] - 160;
tr = SV_Trace( top, vec3_origin, vec3_origin, bottom, MOVE_NOMONSTERS, ent, SV_ContentsMask( ent ));
if( tr.allsolid )
return; // looking at a wall, leave ideal the way is was
if( tr.fraction == 1 )
return; // near a dropoff
z[i] = top[2] + tr.fraction * (bottom[2] - top[2]);
}
dir = 0;
steps = 0;
for( j = 1; j < i; j++ )
{
step = z[j] - z[j-1];
if( step > -ON_EPSILON && step < ON_EPSILON )
continue;
if( dir && ( step-dir > ON_EPSILON || step-dir < -ON_EPSILON ))
return; // mixed changes
steps++;
dir = step;
}
if( !dir )
{
ent->v.ideal_pitch = 0;
return;
}
if( steps < 2 ) return;
ent->v.ideal_pitch = -dir * sv_idealpitchscale->value;
}
/*
==============
SV_Accelerate
@ -1328,10 +1369,10 @@ void SV_ClientThink( sv_client_t *cl, usercmd_t *cmd )
// angles
// show 1/3 the pitch angle and all the roll angle
VectorAdd( cl->edict->v.viewangles, cl->edict->v.punchangle, viewangles );
cl->edict->v.viewangles[ROLL] = SV_CalcRoll( viewangles, cl->edict->v.velocity) * 4;
cl->edict->v.viewangles[ROLL] = SV_CalcRoll( viewangles, cl->edict->v.velocity ) * 4;
if( !cl->edict->v.fixangle )
{
cl->edict->v.angles[PITCH] = -viewangles[PITCH] / 3;
cl->edict->v.angles[PITCH] = -(viewangles[PITCH] / 3);
cl->edict->v.angles[YAW] = viewangles[YAW];
}
@ -1349,8 +1390,10 @@ void SV_ClientThink( sv_client_t *cl, usercmd_t *cmd )
SV_CheckVelocity( cl->edict );
return;
}
SV_AirMove( cl, &cl->lastcmd );
SV_CheckVelocity( cl->edict );
SV_SetIdealPitch( cl );
VectorCopy( cl->edict->v.origin, cl->edict->pvServerData->s.origin );
VectorCopy( cl->edict->v.velocity, cl->edict->pvServerData->s.velocity );

View File

@ -49,6 +49,15 @@ void SV_UpdateEntityState( edict_t *ent, bool baseline )
if( !ent->pvServerData->s.classname )
ent->pvServerData->s.classname = SV_ClassIndex( STRING( ent->v.classname ));
if( ent->pvServerData->s.ed_type == ED_CLIENT && ent->v.fixangle )
{
MSG_Begin( svc_setangle );
MSG_WriteAngle32( &sv.multicast, ent->v.angles[0] );
MSG_WriteAngle32( &sv.multicast, ent->v.angles[1] );
MSG_WriteAngle32( &sv.multicast, 0 );
MSG_Send( MSG_ONE_R, vec3_origin, ent );
}
svgame.dllFuncs.pfnUpdateEntityState( &ent->pvServerData->s, ent, baseline );
// always keep an actual

View File

@ -2859,7 +2859,6 @@ static enginefuncs_t gEngfuncs =
pfnCRC_Final,
pfnRandomLong,
pfnRandomFloat,
SV_SetAngle,
pfnCrosshairAngle,
pfnLoadFile,
pfnFOpen,

View File

@ -16,6 +16,7 @@ cvar_t *zombietime; // seconds to sink messages after disconnect
cvar_t *rcon_password; // password for remote server commands
cvar_t *allow_download;
cvar_t *sv_airaccelerate;
cvar_t *sv_idealpitchscale;
cvar_t *sv_maxvelocity;
cvar_t *sv_gravity;
cvar_t *sv_stepheight;
@ -417,6 +418,7 @@ void SV_Init( void )
sv_rollangle = Cvar_Get( "sv_rollangle", DEFAULT_ROLLANGLE, 0, "how much to tilt the view when strafing" );
sv_rollspeed = Cvar_Get( "sv_rollspeed", DEFAULT_ROLLSPEED, 0, "how much strafing is necessary to tilt the view" );
sv_airaccelerate = Cvar_Get("sv_airaccelerate", DEFAULT_AIRACCEL, CVAR_LATCH, "player accellerate in air" );
sv_idealpitchscale = Cvar_Get( "sv_idealpitchscale", "0.8", 0, "how much to look up/down slopes and stairs when not using freelook" );
sv_maxvelocity = Cvar_Get("sv_maxvelocity", DEFAULT_MAXVELOCITY, CVAR_LATCH, "max world velocity" );
sv_gravity = Cvar_Get("sv_gravity", DEFAULT_GRAVITY, CVAR_LATCH, "world gravity" );
sv_maxspeed = Cvar_Get("sv_maxspeed", DEFAULT_MAXSPEED, 0, "maximum speed a player can accelerate to when on ground");

View File

@ -23,7 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "input.h"
#include "client.h"
#define ART_BACKGROUND "gfx/shell/title_screen/title_backg"
#define ART_BACKGROUND "gfx/shell/splash"
#define ART_LOGO "gfx/shell/title_screen/q2e_logo"
#define ART_SINGLEPLAYER "gfx/shell/title_screen/singleplayer_n"
#define ART_SINGLEPLAYER2 "gfx/shell/title_screen/singleplayer_s"

View File

@ -1459,17 +1459,18 @@ static bool FS_ParseGameInfo( const char *filename, gameinfo_t *GameInfo )
================
FS_LoadGameInfo
FIXME: create an argment that passed name of gamedir for soft-change games ?
can be passed null arg
================
*/
void FS_LoadGameInfo( void )
void FS_LoadGameInfo( const char *rootfolder )
{
int i;
// lock uplevel of gamedir for read\write
fs_ext_path = false;
MsgDev( D_NOTE, "FS_LoadGameInfo()\n" );
if( rootfolder ) com.strcpy( gs_basedir, rootfolder );
MsgDev( D_NOTE, "FS_LoadGameInfo( %s )\n", gs_basedir );
// clear any old pathes
FS_ClearSearchPath();
@ -1666,6 +1667,14 @@ FS_Shutdown
*/
void FS_Shutdown( void )
{
int i;
// release gamedirs
for( i = 0; i < SI.numgames; i++ )
if( SI.games[i] ) Mem_Free( SI.games[i] );
Mem_Set( &SI, 0, sizeof( SI ));
FS_ClearSearchPath(); // release all wad files too
FS_UpdateEnvironmentVariables(); // merge working directory
FS_UpdateConfig();

View File

@ -321,7 +321,7 @@ void FS_ClearSearchPath( void );
void FS_AllowDirectPaths( bool enable );
void FS_AddGameHierarchy( const char *dir, int flags );
int FS_CheckParm( const char *parm );
void FS_LoadGameInfo( void );
void FS_LoadGameInfo( const char *rootfolder );
void FS_FileBase( const char *in, char *out );
const char *FS_FileExtension( const char *in );
void FS_DefaultExtension( char *path, const char *extension );

View File

@ -1,63 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: launch - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC2.tmp" with contents
[
/nologo /MDd /W3 /Gm /Gi /GX /ZI /Od /I "./" /I "imagelib" /I "../public" /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\launch\!debug/" /Fo"..\temp\launch\!debug/" /Fd"..\temp\launch\!debug/" /FD /GZ /c
"D:\Xash3D\src_main\launch\filesystem.c"
]
Creating command line "cl.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC2.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC3.tmp" with contents
[
zlib.lib png.lib jpg.lib user32.lib gdi32.lib shell32.lib advapi32.lib winmm.lib /nologo /dll /incremental:yes /pdb:"..\temp\launch\!debug/launch.pdb" /debug /machine:I386 /nodefaultlib:"libc.lib" /out:"..\temp\launch\!debug/launch.dll" /implib:"..\temp\launch\!debug/launch.lib" /pdbtype:sept /libpath:"./imagelib"
"\Xash3D\src_main\temp\launch\!debug\cmd.obj"
"\Xash3D\src_main\temp\launch\!debug\console.obj"
"\Xash3D\src_main\temp\launch\!debug\cpuinfo.obj"
"\Xash3D\src_main\temp\launch\!debug\crclib.obj"
"\Xash3D\src_main\temp\launch\!debug\cvar.obj"
"\Xash3D\src_main\temp\launch\!debug\export.obj"
"\Xash3D\src_main\temp\launch\!debug\filesystem.obj"
"\Xash3D\src_main\temp\launch\!debug\img_bmp.obj"
"\Xash3D\src_main\temp\launch\!debug\img_dds.obj"
"\Xash3D\src_main\temp\launch\!debug\img_jpg.obj"
"\Xash3D\src_main\temp\launch\!debug\img_main.obj"
"\Xash3D\src_main\temp\launch\!debug\img_pcx.obj"
"\Xash3D\src_main\temp\launch\!debug\img_png.obj"
"\Xash3D\src_main\temp\launch\!debug\img_tga.obj"
"\Xash3D\src_main\temp\launch\!debug\img_utils.obj"
"\Xash3D\src_main\temp\launch\!debug\img_vtf.obj"
"\Xash3D\src_main\temp\launch\!debug\img_wad.obj"
"\Xash3D\src_main\temp\launch\!debug\memlib.obj"
"\Xash3D\src_main\temp\launch\!debug\network.obj"
"\Xash3D\src_main\temp\launch\!debug\parselib.obj"
"\Xash3D\src_main\temp\launch\!debug\patch.obj"
"\Xash3D\src_main\temp\launch\!debug\stdlib.obj"
"\Xash3D\src_main\temp\launch\!debug\system.obj"
"\Xash3D\src_main\temp\launch\!debug\utils.obj"
]
Creating command line "link.exe @C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC3.tmp"
Creating temporary file "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC4.bat" with contents
[
@echo off
copy \Xash3D\src_main\temp\launch\!debug\launch.dll "D:\Xash3D\bin\launch.dll"
]
Creating command line "C:\DOCUME~1\MIKE~1.MIK\LOCALS~1\Temp\RSP5FC4.bat"
Compiling...
filesystem.c
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \Xash3D\src_main\temp\launch\!debug\launch.dll
‘Ş®Ż¨ŕ®˘ ­® ä ©«®˘: 1.
<h3>Results</h3>
launch.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -4,6 +4,7 @@
//=======================================================================
#include "cm_local.h"
#include "user_cmd.h"
#include "matrix_lib.h"
int characterID;
@ -61,9 +62,6 @@ are being updated isntead of a full move
*/
void CM_UpdateViewAngles( entity_state_t *state, const usercmd_t *cmd )
{
short temp;
int i;
if( state->flags & FL_FROZEN )
{
return; // no view changes at all
@ -74,23 +72,16 @@ void CM_UpdateViewAngles( entity_state_t *state, const usercmd_t *cmd )
}
if( state->ed_flags & ESF_NO_PREDICTION )
{
state->viewangles[YAW] = cmd->angles[YAW] - state->delta_angles[YAW];
state->viewangles[YAW] = cmd->angles[YAW];
state->viewangles[PITCH] = 0;
state->viewangles[ROLL] = 0;
}
// circularly clamp the angles with deltas
for( i = 0; i < 3; i++ )
{
temp = cmd->angles[i] + state->delta_angles[i];
state->viewangles[i] = temp;
}
VectorCopy( cmd->angles, state->viewangles );
// don't let the player look up or down more than 90 degrees
if( state->viewangles[PITCH] > 89 && state->viewangles[PITCH] < 180 )
state->viewangles[PITCH] = 89;
else if( state->viewangles[PITCH] < 271 && state->viewangles[PITCH] >= 180 )
state->viewangles[PITCH] = 271;
// don't let the player look up or down more than 80 degrees
state->viewangles[PITCH] = bound( -70, state->viewangles[PITCH], 80 );
state->viewangles[ROLL] = bound( -50, state->viewangles[ROLL], 50 );
}

View File

@ -76,9 +76,9 @@ void CM_ModelBounds( cmodel_t *model, vec3_t mins, vec3_t maxs );
float CM_FindFloor( vec3_t p0, float maxDist );
void CM_SetOrigin( physbody_t *body, vec3_t origin );
void CM_PlayerMove( entity_state_t *pmove, usercmd_t *cmd, physbody_t *body, bool clientmove );
void CM_ServerMove( entity_state_t *pmove, usercmd_t *cmd, physbody_t *body );
void CM_ClientMove( entity_state_t *pmove, usercmd_t *cmd, physbody_t *body );
void CM_PlayerMove( entity_state_t *pmove, struct usercmd_s *cmd, physbody_t *body, bool clientmove );
void CM_ServerMove( entity_state_t *pmove, struct usercmd_s *cmd, physbody_t *body );
void CM_ClientMove( entity_state_t *pmove, struct usercmd_s *cmd, physbody_t *body );
void PolygonF_QuadForPlane( float *outpoints, float planenormalx, float planenormaly, float planenormalz, float planedist, float quadsize );
void PolygonD_QuadForPlane( double *outpoints, double planenormalx, double planenormaly, double planenormalz, double planedist, double quadsize );

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: physic - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
physic.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -21,18 +21,6 @@
#define MAX_EDICTS 65535 // absolute limit that never be reached, (do not edit!)
#define MAX_VERTS_ON_POLY 10 // decal vertices
// usercmd_t communication (a part of network protocol)
typedef struct usercmd_s
{
int msec;
int angles[3];
int forwardmove;
int sidemove;
int upmove;
int buttons;
int lightlevel;
} usercmd_t;
/*
==============================================================================

View File

@ -464,7 +464,7 @@ typedef struct stdilib_api_s
// common functions
void (*Com_InitRootDir)( char *path ); // init custom rootdir
void (*Com_LoadGameInfo)( void ); // initialize gameinfo.txt
void (*Com_LoadGameInfo)( const char *rootfolder ); // initialize gamedir
void (*Com_AddGameHierarchy)( const char *dir, int flags ); // add base directory in search list
void (*Com_AllowDirectPaths)( bool enable ); // allow direct paths e.g. C:\windows
int (*Com_CheckParm)( const char *parm ); // check parm in cmdline

View File

@ -58,7 +58,7 @@ typedef struct physic_exp_s
void (*CombineTraces)( trace_t *cliptrace, const trace_t *trace, edict_t *touch, bool is_bmodel );
// player movement code
void (*PlayerMove)( struct entity_state_s *pmove, usercmd_t *cmd, physbody_t *body, bool clientmove );
void (*PlayerMove)( struct entity_state_s *pmove, struct usercmd_s *cmd, physbody_t *body, bool clientmove );
// simple objects
physbody_t *(*CreateBody)( edict_t *ed, cmodel_t *mod, const vec3_t org, const matrix3x3 m, int solid, int move );

View File

@ -443,6 +443,7 @@ extern cvar_t *r_allow_software;
extern cvar_t *r_frontbuffer;
extern cvar_t *r_width;
extern cvar_t *r_height;
extern cvar_t *r_paused;
extern cvar_t *r_flares;
extern cvar_t *r_flaresize;

View File

@ -27,6 +27,7 @@ glstate_t glState;
byte *r_temppool;
byte *r_framebuffer;
cvar_t *r_paused;
cvar_t *r_norefresh;
cvar_t *r_drawentities;
cvar_t *r_drawworld;
@ -488,6 +489,7 @@ void GL_InitCommands( void )
// system screen width and height (don't suppose for change from console at all)
r_width = Cvar_Get( "width", "640", CVAR_READ_ONLY, "screen width" );
r_height = Cvar_Get( "height", "480", CVAR_READ_ONLY, "screen height" );
r_paused = Cvar_Get( "paused", "0", 0, "game pasued" );
r_norefresh = Cvar_Get( "r_norefresh", "0", 0, "disable rendering (use with caution)" );
r_fullbright = Cvar_Get( "r_fullbright", "0", CVAR_CHEAT|CVAR_LATCH_VIDEO, "disable lightmaps, get fullbright" );

View File

@ -500,8 +500,10 @@ float R_StudioFrameAdvance( ref_entity_t *ent, float flInterval )
}
}
if( !ent->animtime ) flInterval = 0.0;
ent->frame += flInterval * ent->framerate;
// stop auto-animation on pause
if( !r_paused->integer )
ent->frame += flInterval * ent->framerate;
//ent->animtime = RI.refdef.time;
if( ent->frame < 0.0 || ent->frame >= 256.0 )

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: render - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
render.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -720,12 +720,11 @@ void CFuncTeleport :: Touch( CBaseEntity *pOther )
if( pOther->IsPlayer())
{
pOther->pev->angles.x = pOther->pev->viewangles.x;
SET_FIXANGLE( ENT( pOther->pev ), pOther->pev->angles );
pOther->pev->fixangle = TRUE;
}
// set new velocity
vecVA = UTIL_VecToAngles(pOther->pev->velocity);
vecVA = UTIL_VecToAngles( pOther->pev->velocity );
vecVA.y += ydiff;
UTIL_MakeVectors(vecVA);
pOther->pev->velocity = gpGlobals->v_forward * pOther->pev->velocity.Length();
@ -756,7 +755,6 @@ void CFuncTeleport :: Touch( CBaseEntity *pOther )
pOther->pev->velocity = g_vecZero;
if( pOther->IsPlayer( ))
{
SET_FIXANGLE( ENT( pOther->pev ), pTarget->pev->angles );
pOther->pev->viewangles = pTarget->pev->angles;
pOther->pev->fixangle = TRUE;
}

View File

@ -68,8 +68,6 @@ edict_t *CGameRules :: GetPlayerSpawnSpot( CBasePlayer *pPlayer )
pPlayer->pev->punchangle = g_vecZero;
pPlayer->pev->fixangle = TRUE;
SET_FIXANGLE( ENT( pPlayer->pev ), pPlayer->pev->angles );
if( pentSpawnSpot->v.spawnflags & 1 ) // the START WITH SUIT flag
{
g_startSuit = TRUE;

View File

@ -1032,6 +1032,7 @@ void UpdateEntityState( entity_state_t *to, edict_t *from, int baseline )
to->viewoffset = pNet->pev->view_ofs;
to->viewangles = pNet->pev->viewangles;
to->idealpitch = pNet->pev->ideal_pitch;
to->punch_angles = pNet->pev->punchangle;
// playermodel sequence, that will be playing on a client

View File

@ -123,7 +123,6 @@ inline void *GET_PRIVATE( edict_t *pent )
#define CMD_ARGC (*g_engfuncs.pfnCmd_Argc)
#define CMD_ARGV (*g_engfuncs.pfnCmd_Argv)
#define GET_ATTACHMENT (*g_engfuncs.pfnGetAttachment)
#define SET_FIXANGLE (*g_engfuncs.pfnFixAngle)
#define SET_CROSSHAIRANGLE (*g_engfuncs.pfnCrosshairAngle)
#define SET_SKYBOX (*g_engfuncs.pfnSetSkybox)
#define LOAD_FILE (*g_engfuncs.pfnLoadFile)

View File

@ -3429,11 +3429,9 @@ int CBasePlayer::Restore( CRestore &restore )
pev->origin = VARS(pentSpawnSpot)->origin + Vector(0,0,1);
pev->angles = VARS(pentSpawnSpot)->angles;
}
pev->viewangles.z = 0; // Clear out roll
pev->viewangles.z = 0; // clear out roll
pev->angles = pev->viewangles;
SET_FIXANGLE( ENT( pev ), pev->angles );
pev->fixangle = TRUE; // turn this way immediately
pev->fixangle = TRUE; // turn this way immediately
// Copied from spawn() for now
m_bloodColor = BLOOD_COLOR_RED;

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: server - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
server.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -124,7 +124,7 @@ Beta 13.12.09
101. replace Matrix_ with Matrix3x3_ OK
102. replace Matrix4_ with Matrix4x4_ OK
103. fixup studio culling OK
103. fixup client angles & blending
103. fixup client angles & blending OK
104. sorting folder resources OK
105. sorting sources folder OK
106. implement q3map2 into xtools.dll OK

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: vprogs - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
vprogs.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: vsound - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
vsound.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>

View File

@ -533,7 +533,7 @@ bool PrepareBSPModel( int argc, char **argv )
jitters[ i ] = sin( i * 139.54152147 );
game = &games[1]; // defaulting to Xash
FS_LoadGameInfo();
FS_LoadGameInfo( NULL );
BspFunc = NULL;
if( FS_CheckParm( "-analyze" )) BspFunc = AnalyzeBSP;

View File

@ -1,16 +0,0 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: xtools - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
<h3>Results</h3>
xtools.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>