--
--
As some of you know valve disabled hit-box tests for client-side
tracelines. This causes problems with inconsistent hits between the
client and server, leading to many "OMG HAXXOR I SHOT YOU!!111"s. To fix
this, I implemented my own hitbox tests using the ray-polyhedron
intersection algorithm from Graphics Gems II. Code is attached.
g_BonePositions[n] is the stored value of m_pbonetransform after
StudioDrawPlayer for player index n+1.
Jonah
--
extern float g_BonePositions[32][ MAXSTUDIOBONES ][ 3 ][ 4 ];
void RealTrace(vec3_t start, vec3_t end,pmtrace_t *tr)
{
vec3_t dir,c[2],vec[3],o;
int idx,i,x;
cl_entity_t *ent;
studiohdr_t *hdr;
mstudiobbox_t *bbox;
float t_near,t_far,t_max,t,vd,vn;
gEngfuncs.pEventAPI->EV_PlayerTrace(start,end,PM_NORMAL,-1,tr);
if(tr->fraction==1.0f)
return;
idx=gEngfuncs.pEventAPI->EV_IndexFromTrace(tr);
if(idx<1 || idx > gEngfuncs.GetMaxClients())
return;
ent=gEngfuncs.GetEntityByIndex(idx);
if(!ent)
return;
hdr=(studiohdr_t*)IEngineStudio.Mod_Extradata(ent->model);
bbox=(mstudiobbox_t*)((unsigned long)hdr + hdr->hitboxindex);
idx--;
VectorSubtract(end,start,dir);
VectorScale(dir,1/Length(dir),dir);
for(i=hdr->numhitboxes-1;i>=0;i--,bbox++) {
vec[0][0]=g_BonePositions[idx][bbox->bone][0][0];
vec[0][1]=g_BonePositions[idx][bbox->bone][1][0];
vec[0][2]=g_BonePositions[idx][bbox->bone][2][0];
vec[1][0]=g_BonePositions[idx][bbox->bone][0][1];
vec[1][1]=g_BonePositions[idx][bbox->bone][1][1];
vec[1][2]=g_BonePositions[idx][bbox->bone][2][1];
vec[2][0]=g_BonePositions[idx][bbox->bone][0][2];
vec[2][1]=g_BonePositions[idx][bbox->bone][1][2];
vec[2][2]=g_BonePositions[idx][bbox->bone][2][2];
o[0]=g_BonePositions[idx][bbox->bone][0][3];
o[1]=g_BonePositions[idx][bbox->bone][1][3];
o[2]=g_BonePositions[idx][bbox->bone][2][3];
VectorMA(o,bbox->bbmax[0],vec[0],c[0]);
VectorMA(c[0],bbox->bbmax[1],vec[1],c[0]);
VectorMA(c[0],bbox->bbmax[2],vec[2],c[0]);
VectorMA(o,bbox->bbmin[0],vec[0],c[1]);
VectorMA(c[1],bbox->bbmin[1],vec[1],c[1]);
VectorMA(c[1],bbox->bbmin[2],vec[2],c[1]);
t_near=-99999.0;
t_far=99999.0;
t_max=99999.0f;
for(x=0;x<2;x++) {
if(x) {
VectorInverse(vec[0]);
VectorInverse(vec[1]);
VectorInverse(vec[2]);
}
for(int j=0;j<3;j++) {
vd=DotProduct(dir,vec[j]);
if(vd==0.0f)
continue;
vn=DotProduct(vec[j],start)-DotProduct(vec[j],c[x]);
t=-vn/vd;
if(vd>0.0&&t<t_far)
t_far=t;
else if(vd<0.0f&&t>t_near)
t_near=t;
if(t_near>t_far)
goto box_end;
}
}
tr->fraction=0.5f;
return;
box_end:
do { } while(0);
}
tr->fraction=1.0f;
}
--
[ Content of type application/pgp-signature deleted ]
_______________________________________________
To unsubscribe, edit your list preferences, or view the list archives, please visit:
http://list.valvesoftware.com/mailman/listinfo/hlcoders