-- -- 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