Есть код (модуль):
Код:
int CheckVisibility(const edict_t *entity, unsigned char *pset) {
const char *szClassName = STRING(entity->v.classname);
if (!(FStrEq(szClassName, szEspClassName)))
RETURN_META_VALUE(MRES_IGNORED, 0);
RETURN_META_VALUE(MRES_SUPERCEDE, 1);
}
int AddToFullPack_Post(entity_state_s *state, int e, edict_t *ent, edict_t *host, int hostflags, int player, unsigned char *pSet) {
if (!(player) || ent == host || host->v.iuser2 == ENTINDEX(ent))
RETURN_META_VALUE(MRES_IGNORED, 0);
if (host->v.iuser1 != 2 && host->v.iuser1 != 4)
RETURN_META_VALUE(MRES_IGNORED, 0);
if(!(MF_IsPlayerAlive(ENTINDEX(ent))))
RETURN_META_VALUE(MRES_IGNORED, 0);
UTIL_PrintF(host, "You[%d] see for player [%d]. Mode [%d] | Other player [%d]", ENTINDEX(host), host->v.iuser2, host->v.iuser1, ENTINDEX(ent));
Vector vStartPosition = host->v.origin + VEC_VIEW;
Vector vEndPosition = ent->v.origin;
Vector vVector = vStartPosition - vEndPosition;
TraceResult tr;
TRACE_LINE(vStartPosition, vEndPosition, 0, host, &tr);
Vector vEnd = tr.vecEndPos;
Vector vVectorCopy = vVector;
vVectorCopy = (vVectorCopy * (1.0f / vVectorCopy.Length())) * 10.0f;
vEndPosition = vEnd + vVectorCopy;
vEnd = vEndPosition - vStartPosition;
printf("=============================\n");
printf("vStartPosition = %f | %f | %f\n", vStartPosition.x, vStartPosition.y, vStartPosition.z);
printf("vViewOfs = %f | %f | %f\n", host->v.view_ofs.x, host->v.view_ofs.y, host->v.view_ofs.z);
printf("vVectorCopy = %f | %f | %f\n", vVectorCopy.x, vVectorCopy.y, vVectorCopy.z);
state->origin = vEndPosition;
state->modelindex = (UTIL_GetUserTeam(ent) == UTIL_GetUserTeam(INDEXENT(host->v.iuser2)) ? g_pSpriteFriendId : g_pSpriteEnemyId);
state->scale = vEnd.Length() / vVector.Length();
state->renderamt = 255.0f;
RETURN_META_VALUE(MRES_HANDLED, 0);
}
edict_t *funcCreateSprite(const int iIndex) {
edict_t *eId = CREATE_NAMED_ENTITY(ALLOC_STRING("info_target"));
if (!(FNullEnt(eId))) {
eId->v.classname = ALLOC_STRING(szEspClassName);
SET_ORIGIN(eId, Vector(306.0, 2434.0, -91.0));
SET_SIZE(eId, Vector(-1.0, -1.0, -1.0), Vector(1.0, 1.0, 1.0));
SET_MODEL(eId, szSpriteFriend);
eId->v.renderfx = kRenderFxNone;
eId->v.rendercolor = Vector(255.0, 255.0, 255.0);
eId->v.rendermode = kRenderTransAlpha;
eId->v.renderamt = 0.0f;
eId->v.solid = SOLID_NOT;
eId->v.movetype = MOVETYPE_NONE;
MDLL_Spawn(eId);
return eId;
}
return NULL;
}
Думаю все функции понятны
Так же есть код из плагина spriteEsp:
Код:
public checkVisibility(id,pset){
if( !pev_valid( id ) ){
return FMRES_IGNORED;
}
new szClass[ 64 ];
pev( id , pev_classname , szClass , charsmax( szClass ) );
if( !equal( szClass , espClassName ) ){
return FMRES_IGNORED;
}
forward_return(FMV_CELL,1)
return FMRES_SUPERCEDE
}
public addToFullPack( es_state, e, ENT, HOST, hostflags, player, set){
if( player || !is_user_alive( HOST ) ){
return FMRES_IGNORED;
}
if( !pev_valid( ENT ) ){
return FMRES_IGNORED;
}
new iOwner = pev( ENT , pev_owner );
if( !is_user_alive( iOwner ) || !espON[ HOST ] || temporarySprites[ pev( ENT , pev_owner ) ] != ENT || iOwner == HOST ){
return FMRES_IGNORED;
}
new Float: startPosition[ 3 ],
Float: endPosition[ 3 ],
Float: fEnd[ 3 ],
Float: fVector[ 3 ],
Float: fEndPosition[ 3 ],
Float: endVector[ 3 ],
Float: fLenNew,
Float: fLenOld;
//calculateStartPosition( HOST , startPosition );
new Float: fOrigin[ 3 ],
Float: fView[ 3 ];
pev( HOST , pev_origin , fOrigin );
pev( HOST , pev_view_ofs , fView );
startPosition[0] = fOrigin[0] + fView[0];
startPosition[1] = fOrigin[1] + fView[1];
startPosition[2] = fOrigin[2] + fView[2];
//calculateEndPosition( iOwner , endPosition );
pev( iOwner , pev_origin , endPosition );
//calculateVector( startPosition , endPosition , fVector );
fVector[0] = startPosition[0] - endPosition[0];
fVector[1] = startPosition[1] - endPosition[1];
fVector[2] = startPosition[2] - endPosition[2];
//traceLine( startPosition , endPosition , fEnd , HOST );
new pTR = create_tr2();
engfunc( EngFunc_TraceLine , startPosition , endPosition , IGNORE_MONSTERS , HOST , pTR );
get_tr2( pTR , TR_vecEndPos , fEnd );
free_tr2( pTR );
//movePosition( fEnd , fVector , fEndPosition );
new Float: fVectorCopy[ 3 ];
//xs_vec_copy( fVector , fVectorCopy );
fVectorCopy[0] = fVector[0];
fVectorCopy[1] = fVector[1];
//fVectorCopy[2] = fVector[2];
//xs_vec_normalize( fVectorCopy , fVectorCopy );
new Float:invlen = 1.0/floatsqroot(fVectorCopy[0]*fVectorCopy[0] + fVectorCopy[1]*fVectorCopy[1] + fVectorCopy[2]*fVectorCopy[2]);
fVectorCopy[0] = fVectorCopy[0] * invlen;
fVectorCopy[1] = fVectorCopy[1] * invlen;
//fVectorCopy[2] = fVectorCopy[2] * invlen;
//xs_vec_mul_scalar( fVectorCopy , spriteDistance , fVectorCopy );
fVectorCopy[0] = fVectorCopy[0] * 10.0;
fVectorCopy[1] = fVectorCopy[1] * 10.0;
fVectorCopy[2] = fVectorCopy[2] * 10.0;
//xs_vec_add( fPosition , fVectorCopy , fEndPosition );
fEndPosition[0] = fEnd[0] + fVectorCopy[0];
fEndPosition[1] = fEnd[1] + fVectorCopy[1];
fEndPosition[2] = fEnd[2] + fVectorCopy[2];
//calculateEndVector( startPosition , fEndPosition , endVector );
endVector[0] = fEndPosition[0] - startPosition[0];
endVector[1] = fEndPosition[1] - startPosition[1];
endVector[2] = fEndPosition[2] - startPosition[2];
fLenNew = xs_vec_len( endVector );
fLenOld = xs_vec_len( fVector );
set_es( es_state , ES_Origin , fEndPosition );
set_es( es_state , ES_ModelIndex , spriteEnemyIndex );
set_es( es_state , ES_Scale , fLenNew / fLenOld );
set_es( es_state, ES_RenderAmt , 255.0 );
return FMRES_HANDLED;
}
createSprite( iOwner ){
new iEnt = engfunc( EngFunc_CreateNamedEntity , engfunc( EngFunc_AllocString , "info_target" ) );
if( !pev_valid( iEnt ) ){
return 0;
}
set_pev( iEnt , pev_classname , espClassName );
engfunc( EngFunc_SetSize , iEnt , Float:{ -1.0 , -1.0 , -1.0 } , Float:{ 1.0 , 1.0 , 1.0 } );
engfunc( EngFunc_SetOrigin , iEnt , Float:{ 306.0 , 2434.0 , -91.0 } );
engfunc( EngFunc_SetModel , iEnt , spriteEnemy );
set_pev( iEnt, pev_renderfx, kRenderFxNone );
set_pev( iEnt, pev_rendercolor, Float:{ 255.0 , 255.0 , 255.0 } );
set_pev( iEnt, pev_rendermode, kRenderTransAlpha );
set_pev( iEnt, pev_renderamt, 0.0 );
set_pev( iEnt , pev_solid , SOLID_NOT );
set_pev( iEnt , pev_movetype , MOVETYPE_NONE );
set_pev( iEnt, pev_owner , iOwner );
dllfunc(DLLFunc_Spawn, iEnt )
return iEnt;
}
Он идеально работает и нет нареканий.
Модуль писался как аналог spriteEsp, поэтому все функции взяты с плагина.
По идее всё точно так же и сделано, но почему-то моделька игрока пропадает и спрайт ведёт себя как-то не корректно.
Так же, логи координат позиций игроков (от плагина и от модуля) идентичны.