Seems to be coming down to a custom new operator and dynamic memory handling. 
in character.cpp, right above the constructor
MACRO_ALLOC_POOL_ID_IMPL(CCharacter, MAX_CLIENTS)
in entity.h
#define MACRO_ALLOC_POOL_ID_IMPL(POOLTYPE, PoolSize) \
    static char ms_PoolData##POOLTYPE[PoolSize][sizeof(POOLTYPE)] = {{0}}; \
    static int ms_PoolUsed##POOLTYPE[PoolSize] = {0}; \
    void *POOLTYPE::operator new(size_t Size, int id) \
    { \
        dbg_assert(sizeof(POOLTYPE) == Size, "size error"); \
        dbg_assert(!ms_PoolUsed##POOLTYPE[id], "already used"); \
        /*dbg_msg("pool", "++ %s %d", #POOLTYPE, id);*/ \
        ms_PoolUsed##POOLTYPE[id] = 1; \
        mem_zero(ms_PoolData##POOLTYPE[id], Size); \
        return ms_PoolData##POOLTYPE[id]; \
    } \