[GUÍA] PEV->BODY (uso/funcionamiento/tips)
#2
EXTRA

He creado este stock (un port de SetBodyGroup del Half-Life) para hacer la tarea más facil:
Código PHP:
stock bool:SetBodyGroup(const iEntity, const iGroup, const iPart)
{
    new 
bool:bResult;
    
    static 
szModel[64];
    
pev(iEntitypev_modelszModelcharsmax(szModel));
    
    new 
iModelPtr fopen(szModel"rb");
    if (!
iModelPtr)
        goto 
Result;
    
    new 
iBodyPartsCount iGroup;
    new 
iBodyPartNumModels;
    new 
iBodyPartBase;
    
Model_GetBodyPartInfo(iModelPtriBodyPartsCountiBodyPartNumModelsiBodyPartBase);
    
    if (
iGroup iBodyPartsCount)
        goto 
Result;
    
    if (
iPart >= iBodyPartNumModels)
        goto 
Result;
    
    new 
iBody;
    new 
iCurrent;
    
    
iBody pev(iEntitypev_body);
    
iCurrent = (iBody iBodyPartBase) % iBodyPartNumModels;
    
iBody iBody - (iCurrent iBodyPartBase) + (iPart iBodyPartBase);
    
    
set_pev(iEntitypev_bodyiBody);
    
bResult true
    
    Result
:
    {
        
fclose(iModelPtr);
        return 
bResult;
    }
}

Model_GetBodyPartInfo(const pmodel, &numbodyparts, &nummodels, &base)
{
    if (!
pmodel)
        return;
    
    new 
group numbodyparts;
    new 
bodypartindex;
    
    const 
studiohdr_s_numbodyparts 204 // studiohdr_t->numbodyparts offset (from start)
    
const mstudiobodyparts_s_nummodels 64// mstudiobodyparts_t->nummodels offset (from start)
    
const mstudiobodyparts_s_size 76// mstudiobodyparts_t size (64char x 1byte + 3int * 4byte)

    
fseek(pmodelstudiohdr_s_numbodypartsSEEK_SET);
    
fread(pmodelnumbodypartsBLOCK_INT);
    
fread(pmodelbodypartindexBLOCK_INT);
    
    
bodypartindex += (group mstudiobodyparts_s_size) + mstudiobodyparts_s_nummodels;
    
    
fseek(pmodelbodypartindexSEEK_SET);
    
fread(pmodelnummodelsBLOCK_INT);
    
fread(pmodelbaseBLOCK_INT);


SetBodygroup (HLSDK)
Código:
void SetBodygroup( void *pmodel, entvars_t *pev, int iGroup, int iValue )
{
    studiohdr_t *pstudiohdr;
    
    pstudiohdr = (studiohdr_t *)pmodel;
    if (! pstudiohdr)
        return;

    if (iGroup > pstudiohdr->numbodyparts)
        return;

    mstudiobodyparts_t *pbodypart = (mstudiobodyparts_t *)((byte *)pstudiohdr + pstudiohdr->bodypartindex) + iGroup;

    if (iValue >= pbodypart->nummodels)
        return;

    int iCurrent = (pev->body / pbodypart->base) % pbodypart->nummodels;

    pev->body = (pev->body - (iCurrent * pbodypart->base) + (iValue * pbodypart->base));
}

Al igual, que he dejado adjunto un modelo de prueba, para que puedan hacer sus pruebas

Se puede usar tan solo como esto:
Código PHP:
SetBodyGroup(entitybody-groupbody-part

Usando el mismo modelo, por ejemplo:
Código PHP:
SetBodyGroup(entity01);
SetBodyGroup(entity24); 

Resultado:
[Imagen: Qq4wEm6.jpg]


Archivos adjuntos
.rar   svc.rar (Tamaño: 1.68 MB / Descargas: 8)
2
Responder


Mensajes en este tema
RE: [GUÍA] PEV->BODY (uso/funcionamiento/tips) - por SVC - 20/05/2023, 09:28 PM

Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)