@@ -15,11 +15,11 @@ new g_rgszDefaultPlayerModel[MAX_PLAYERS + 1][32];
1515new g_rgszCurrentPlayerModel[MAX_PLAYERS + 1 ][256 ];
1616new g_rgszCustomPlayerModel[MAX_PLAYERS + 1 ][256 ];
1717new g_rgiPlayerAnimationIndex[MAX_PLAYERS + 1 ];
18- new bool: g_rgbPlayerUseDefaultModel [MAX_PLAYERS + 1 ];
18+ new bool: g_rgbPlayerUseCustomModel [MAX_PLAYERS + 1 ];
1919
2020new Trie: g_itPlayerSequenceModelIndexes = Invalid_Trie;
2121new Trie: g_itPlayerSequences = Invalid_Trie;
22- new g_pPlayerModel [MAX_PLAYERS + 1 ];
22+ new g_pPlayerSubModel [MAX_PLAYERS + 1 ];
2323
2424new gmsgClCorpse;
2525
@@ -48,11 +48,12 @@ public plugin_natives() {
4848 register_library (" api_player_model" );
4949 register_native (" PlayerModel_Get" , " Native_GetPlayerModel" );
5050 register_native (" PlayerModel_GetCurrent" , " Native_GetCurrentPlayerModel" );
51+ register_native (" PlayerModel_GetEntity" , " Native_GetPlayerEntity" );
5152 register_native (" PlayerModel_Set" , " Native_SetPlayerModel" );
5253 register_native (" PlayerModel_Reset" , " Native_ResetPlayerModel" );
5354 register_native (" PlayerModel_Update" , " Native_UpdatePlayerModel" );
54- register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
5555 register_native (" PlayerModel_SetSequence" , " Native_SetPlayerSequence" );
56+ register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
5657}
5758
5859public Native_GetPlayerModel (iPluginId, iArgc) {
@@ -65,6 +66,16 @@ public Native_GetCurrentPlayerModel(iPluginId, iArgc) {
6566 set_string (2 , g_rgszCurrentPlayerModel[pPlayer], get_param (3 ));
6667}
6768
69+ public Native_GetPlayerEntity (iPluginId, iArgc) {
70+ new pPlayer = get_param (1 );
71+
72+ if (g_pPlayerSubModel[pPlayer] && @PlayerSubModel_IsActive (g_pPlayerSubModel[pPlayer])) {
73+ return g_pPlayerSubModel[pPlayer];
74+ }
75+
76+ return pPlayer;
77+ }
78+
6879public Native_SetPlayerModel (iPluginId, iArgc) {
6980 new pPlayer = get_param (1 );
7081 get_string (2 , g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]));
@@ -80,12 +91,6 @@ public Native_UpdatePlayerModel(iPluginId, iArgc) {
8091 @Player_UpdateCurrentModel (pPlayer);
8192}
8293
83- public Native_PrecacheAnimation (iPluginId, iArgc) {
84- static szAnimation[MAX_RESOURCE_PATH_LENGTH];
85- get_string (1 , szAnimation, charsmax (szAnimation));
86- PrecachePlayerAnimation (szAnimation);
87- }
88-
8994public Native_SetPlayerSequence (iPluginId, iArgc) {
9095 new pPlayer = get_param (1 );
9196
@@ -95,44 +100,45 @@ public Native_SetPlayerSequence(iPluginId, iArgc) {
95100 return @Player_SetSequence (pPlayer, szSequence);
96101}
97102
103+ public Native_PrecacheAnimation (iPluginId, iArgc) {
104+ static szAnimation[MAX_RESOURCE_PATH_LENGTH];
105+ get_string (1 , szAnimation, charsmax (szAnimation));
106+ PrecachePlayerAnimation (szAnimation);
107+ }
108+
98109public client_connect (pPlayer) {
99110 copy (g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]), NULL_STRING);
100111 copy (g_rgszDefaultPlayerModel[pPlayer], charsmax (g_rgszDefaultPlayerModel[]), NULL_STRING);
101112 copy (g_rgszCurrentPlayerModel[pPlayer], charsmax (g_rgszCurrentPlayerModel[]), NULL_STRING);
102113 g_rgiPlayerAnimationIndex[pPlayer] = 0 ;
103- g_rgbPlayerUseDefaultModel[pPlayer] = true ;
114+ g_rgbPlayerUseCustomModel[pPlayer] = false ;
115+ }
116+
117+ public client_disconnected (pPlayer) {
118+ if (g_pPlayerSubModel[pPlayer]) {
119+ @PlayerSubModel_Destroy (g_pPlayerSubModel[pPlayer]);
120+ g_pPlayerSubModel[pPlayer] = 0 ;
121+ }
104122}
105123
106124public Message_ClCorpse (iMsgId, iMsgDest, pPlayer) {
107125 new pTargetPlayer = get_msg_arg_int (12 );
108- if (! g_rgbPlayerUseDefaultModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
126+ if (g_rgbPlayerUseCustomModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
109127 set_msg_arg_string (1 , g_rgszCurrentPlayerModel[pTargetPlayer]);
110128 }
111129}
112130
113131public HamHook_Player_Spawn_Post (pPlayer) {
114- if (! g_pPlayerModel[pPlayer]) {
115- new pPlayerModel = engfunc (EngFunc_CreateNamedEntity, g_iszModelClassname);
116- set_pev (pPlayerModel, pev_movetype, MOVETYPE_FOLLOW);
117- set_pev (pPlayerModel, pev_aiment, pPlayer);
118- g_pPlayerModel[pPlayer] = pPlayerModel;
132+ if (! g_pPlayerSubModel[pPlayer]) {
133+ g_pPlayerSubModel[pPlayer] = @PlayerSubModel_Create (pPlayer);
119134 }
120135
121136 @Player_UpdateCurrentModel (pPlayer);
122137}
123138
124139public HamHook_Player_PostThink_Post (pPlayer) {
125- if (g_pPlayerModel[pPlayer]) {
126- set_entvar (g_pPlayerModel[pPlayer], var_skin, get_entvar (pPlayer, var_skin));
127- set_entvar (g_pPlayerModel[pPlayer], var_body, get_entvar (pPlayer, var_body));
128- set_entvar (g_pPlayerModel[pPlayer], var_colormap, get_entvar (pPlayer, var_colormap));
129- set_entvar (g_pPlayerModel[pPlayer], var_rendermode, get_entvar (pPlayer, var_rendermode));
130- set_entvar (g_pPlayerModel[pPlayer], var_renderfx, get_entvar (pPlayer, var_renderfx));
131- set_entvar (g_pPlayerModel[pPlayer], var_renderamt, get_entvar (pPlayer, var_renderamt));
132-
133- static rgflColor[3 ];
134- get_entvar (pPlayer, var_rendercolor, rgflColor);
135- set_entvar (g_pPlayerModel[pPlayer], var_rendercolor, rgflColor);
140+ if (g_pPlayerSubModel[pPlayer]) {
141+ @PlayerSubModel_Think (g_pPlayerSubModel[pPlayer]);
136142 }
137143
138144 return HAM_HANDLED;
@@ -168,32 +174,29 @@ public @Player_UpdateAnimationModel(this) {
168174}
169175
170176public @Player_UpdateCurrentModel (this) {
171- new bool: bUsedDefault = g_rgbPlayerUseDefaultModel [this];
177+ new bool: bUsedCustom = g_rgbPlayerUseCustomModel [this];
172178
173- g_rgbPlayerUseDefaultModel [this] = false ;
179+ g_rgbPlayerUseCustomModel [this] = ! equal (g_rgszCustomPlayerModel[this], NULL_STRING) ;
174180
175- if (equal (g_rgszCustomPlayerModel[this], NULL_STRING)) {
181+ if (g_rgbPlayerUseCustomModel[this]) {
182+ copy (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), g_rgszCustomPlayerModel[this]);
183+ } else {
176184 if (! equal (g_rgszDefaultPlayerModel[this], NULL_STRING)) {
177185 format (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), " models/player/%s /%s .mdl" , g_rgszDefaultPlayerModel[this], g_rgszDefaultPlayerModel[this]);
178186 }
179-
180- g_rgbPlayerUseDefaultModel[this] = true ;
181- } else {
182- copy (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), g_rgszCustomPlayerModel[this]);
183187 }
184188
185- @Player_UpdateModel (this, ! bUsedDefault && g_rgbPlayerUseDefaultModel [this]);
189+ @Player_UpdateModel (this, bUsedCustom && ! g_rgbPlayerUseCustomModel [this]);
186190}
187191
188192public @Player_UpdateModel (this, bool: bForce) {
189- new iAnimationIndex = g_rgiPlayerAnimationIndex[this];
190-
191- if (bForce || ! g_rgbPlayerUseDefaultModel[this] || iAnimationIndex) {
193+ if (bForce || (g_rgbPlayerUseCustomModel[this] || g_rgiPlayerAnimationIndex[this])) {
194+ new iAnimationIndex = g_rgiPlayerAnimationIndex[this];
192195 new iModelIndex = engfunc (EngFunc_ModelIndex, g_rgszCurrentPlayerModel[this]);
193196 @Player_SetModelIndex (this, iAnimationIndex ? iAnimationIndex : iModelIndex);
194- set_pev (g_pPlayerModel [this], pev_modelindex, iAnimationIndex ? iModelIndex : 0 );
197+ set_pev (g_pPlayerSubModel [this], pev_modelindex, iAnimationIndex ? iModelIndex : 0 );
195198 } else {
196- set_pev (g_pPlayerModel [this], pev_modelindex, 0 );
199+ set_pev (g_pPlayerSubModel [this], pev_modelindex, 0 );
197200 }
198201}
199202
@@ -229,6 +232,46 @@ public @Player_SetSequence(this, const szSequence[]) {
229232 return iSequence;
230233}
231234
235+ public @PlayerSubModel_Create (pPlayer) {
236+ new this = engfunc (EngFunc_CreateNamedEntity, g_iszModelClassname);
237+ set_pev (this, pev_movetype, MOVETYPE_FOLLOW);
238+ set_pev (this, pev_aiment, pPlayer);
239+ set_pev (this, pev_owner, pPlayer);
240+
241+ return this;
242+ }
243+
244+ public @PlayerSubModel_Destroy (this) {
245+ set_pev (this, pev_modelindex, 0 );
246+ set_pev (this, pev_flags, pev (this, pev_flags) | FL_KILLME);
247+ dllfunc (DLLFunc_Think, this);
248+ }
249+
250+ public @PlayerSubModel_Think (this) {
251+ if (! @PlayerSubModel_IsActive (this)) {
252+ set_entvar (this, var_effects, get_entvar (this, var_effects) | EF_NODRAW);
253+ return ;
254+ }
255+
256+ new pOwner = pev (this, pev_owner);
257+
258+ set_entvar (this, var_skin, get_entvar (pOwner, var_skin));
259+ set_entvar (this, var_body, get_entvar (pOwner, var_body));
260+ set_entvar (this, var_colormap, get_entvar (pOwner, var_colormap));
261+ set_entvar (this, var_rendermode, get_entvar (pOwner, var_rendermode));
262+ set_entvar (this, var_renderfx, get_entvar (pOwner, var_renderfx));
263+ set_entvar (this, var_renderamt, get_entvar (pOwner, var_renderamt));
264+ set_entvar (this, var_effects, get_entvar (this, var_effects) & ~ EF_NODRAW);
265+
266+ static rgflColor[3 ];
267+ get_entvar (pOwner, var_rendercolor, rgflColor);
268+ set_entvar (this, var_rendercolor, rgflColor);
269+ }
270+
271+ public @PlayerSubModel_IsActive (this) {
272+ return (pev (this, pev_modelindex) > 0 );
273+ }
274+
232275GetAnimationIndexByAnimExt (const szAnimExt[]) {
233276 static szSequence[32 ];
234277 format (szSequence, charsmax (szSequence), " ref_aim_%s " , szAnimExt);
0 commit comments