@@ -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,13 @@ 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" );
52+ register_native (" PlayerModel_HasCustom" , " Native_HasCustomPlayerModel" );
5153 register_native (" PlayerModel_Set" , " Native_SetPlayerModel" );
5254 register_native (" PlayerModel_Reset" , " Native_ResetPlayerModel" );
5355 register_native (" PlayerModel_Update" , " Native_UpdatePlayerModel" );
54- register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
5556 register_native (" PlayerModel_SetSequence" , " Native_SetPlayerSequence" );
57+ register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
5658}
5759
5860public Native_GetPlayerModel (iPluginId, iArgc) {
@@ -65,6 +67,22 @@ public Native_GetCurrentPlayerModel(iPluginId, iArgc) {
6567 set_string (2 , g_rgszCurrentPlayerModel[pPlayer], get_param (3 ));
6668}
6769
70+ public Native_GetPlayerEntity (iPluginId, iArgc) {
71+ new pPlayer = get_param (1 );
72+
73+ if (g_pPlayerSubModel[pPlayer] && @PlayerSubModel_IsActive (g_pPlayerSubModel[pPlayer])) {
74+ return g_pPlayerSubModel[pPlayer];
75+ }
76+
77+ return pPlayer;
78+ }
79+
80+ public bool: Native_HasCustomPlayerModel (iPluginId, iArgc) {
81+ new pPlayer = get_param (1 );
82+
83+ return g_rgbPlayerUseCustomModel[pPlayer];
84+ }
85+
6886public Native_SetPlayerModel (iPluginId, iArgc) {
6987 new pPlayer = get_param (1 );
7088 get_string (2 , g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]));
@@ -80,12 +98,6 @@ public Native_UpdatePlayerModel(iPluginId, iArgc) {
8098 @Player_UpdateCurrentModel (pPlayer);
8199}
82100
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-
89101public Native_SetPlayerSequence (iPluginId, iArgc) {
90102 new pPlayer = get_param (1 );
91103
@@ -95,44 +107,45 @@ public Native_SetPlayerSequence(iPluginId, iArgc) {
95107 return @Player_SetSequence (pPlayer, szSequence);
96108}
97109
110+ public Native_PrecacheAnimation (iPluginId, iArgc) {
111+ static szAnimation[MAX_RESOURCE_PATH_LENGTH];
112+ get_string (1 , szAnimation, charsmax (szAnimation));
113+ return PrecachePlayerAnimation (szAnimation);
114+ }
115+
98116public client_connect (pPlayer) {
99117 copy (g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]), NULL_STRING);
100118 copy (g_rgszDefaultPlayerModel[pPlayer], charsmax (g_rgszDefaultPlayerModel[]), NULL_STRING);
101119 copy (g_rgszCurrentPlayerModel[pPlayer], charsmax (g_rgszCurrentPlayerModel[]), NULL_STRING);
102120 g_rgiPlayerAnimationIndex[pPlayer] = 0 ;
103- g_rgbPlayerUseDefaultModel[pPlayer] = true ;
121+ g_rgbPlayerUseCustomModel[pPlayer] = false ;
122+ }
123+
124+ public client_disconnected (pPlayer) {
125+ if (g_pPlayerSubModel[pPlayer]) {
126+ @PlayerSubModel_Destroy (g_pPlayerSubModel[pPlayer]);
127+ g_pPlayerSubModel[pPlayer] = 0 ;
128+ }
104129}
105130
106131public Message_ClCorpse (iMsgId, iMsgDest, pPlayer) {
107132 new pTargetPlayer = get_msg_arg_int (12 );
108- if (! g_rgbPlayerUseDefaultModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
133+ if (g_rgbPlayerUseCustomModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
109134 set_msg_arg_string (1 , g_rgszCurrentPlayerModel[pTargetPlayer]);
110135 }
111136}
112137
113138public 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;
139+ if (! g_pPlayerSubModel[pPlayer]) {
140+ g_pPlayerSubModel[pPlayer] = @PlayerSubModel_Create (pPlayer);
119141 }
120142
121143 @Player_UpdateCurrentModel (pPlayer);
122144}
123145
124146public 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);
147+ if (g_pPlayerSubModel[pPlayer]) {
148+ @PlayerSubModel_Think (g_pPlayerSubModel[pPlayer]);
136149 }
137150
138151 return HAM_HANDLED;
@@ -168,32 +181,29 @@ public @Player_UpdateAnimationModel(this) {
168181}
169182
170183public @Player_UpdateCurrentModel (this) {
171- new bool: bUsedDefault = g_rgbPlayerUseDefaultModel [this];
184+ new bool: bUsedCustom = g_rgbPlayerUseCustomModel [this];
172185
173- g_rgbPlayerUseDefaultModel [this] = false ;
186+ g_rgbPlayerUseCustomModel [this] = ! equal (g_rgszCustomPlayerModel[this], NULL_STRING) ;
174187
175- if (equal (g_rgszCustomPlayerModel[this], NULL_STRING)) {
188+ if (g_rgbPlayerUseCustomModel[this]) {
189+ copy (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), g_rgszCustomPlayerModel[this]);
190+ } else {
176191 if (! equal (g_rgszDefaultPlayerModel[this], NULL_STRING)) {
177192 format (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), " models/player/%s /%s .mdl" , g_rgszDefaultPlayerModel[this], g_rgszDefaultPlayerModel[this]);
178193 }
179-
180- g_rgbPlayerUseDefaultModel[this] = true ;
181- } else {
182- copy (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), g_rgszCustomPlayerModel[this]);
183194 }
184195
185- @Player_UpdateModel (this, ! bUsedDefault && g_rgbPlayerUseDefaultModel [this]);
196+ @Player_UpdateModel (this, bUsedCustom && ! g_rgbPlayerUseCustomModel [this]);
186197}
187198
188199public @Player_UpdateModel (this, bool: bForce) {
189- new iAnimationIndex = g_rgiPlayerAnimationIndex[this];
190-
191- if (bForce || ! g_rgbPlayerUseDefaultModel[this] || iAnimationIndex) {
200+ if (bForce || (g_rgbPlayerUseCustomModel[this] || g_rgiPlayerAnimationIndex[this])) {
201+ new iAnimationIndex = g_rgiPlayerAnimationIndex[this];
192202 new iModelIndex = engfunc (EngFunc_ModelIndex, g_rgszCurrentPlayerModel[this]);
193203 @Player_SetModelIndex (this, iAnimationIndex ? iAnimationIndex : iModelIndex);
194- set_pev (g_pPlayerModel [this], pev_modelindex, iAnimationIndex ? iModelIndex : 0 );
204+ set_pev (g_pPlayerSubModel [this], pev_modelindex, iAnimationIndex ? iModelIndex : 0 );
195205 } else {
196- set_pev (g_pPlayerModel [this], pev_modelindex, 0 );
206+ set_pev (g_pPlayerSubModel [this], pev_modelindex, 0 );
197207 }
198208}
199209
@@ -229,6 +239,46 @@ public @Player_SetSequence(this, const szSequence[]) {
229239 return iSequence;
230240}
231241
242+ public @PlayerSubModel_Create (pPlayer) {
243+ new this = engfunc (EngFunc_CreateNamedEntity, g_iszModelClassname);
244+ set_pev (this, pev_movetype, MOVETYPE_FOLLOW);
245+ set_pev (this, pev_aiment, pPlayer);
246+ set_pev (this, pev_owner, pPlayer);
247+
248+ return this;
249+ }
250+
251+ public @PlayerSubModel_Destroy (this) {
252+ set_pev (this, pev_modelindex, 0 );
253+ set_pev (this, pev_flags, pev (this, pev_flags) | FL_KILLME);
254+ dllfunc (DLLFunc_Think, this);
255+ }
256+
257+ public @PlayerSubModel_Think (this) {
258+ if (! @PlayerSubModel_IsActive (this)) {
259+ set_entvar (this, var_effects, get_entvar (this, var_effects) | EF_NODRAW);
260+ return ;
261+ }
262+
263+ new pOwner = pev (this, pev_owner);
264+
265+ set_entvar (this, var_skin, get_entvar (pOwner, var_skin));
266+ set_entvar (this, var_body, get_entvar (pOwner, var_body));
267+ set_entvar (this, var_colormap, get_entvar (pOwner, var_colormap));
268+ set_entvar (this, var_rendermode, get_entvar (pOwner, var_rendermode));
269+ set_entvar (this, var_renderfx, get_entvar (pOwner, var_renderfx));
270+ set_entvar (this, var_renderamt, get_entvar (pOwner, var_renderamt));
271+ set_entvar (this, var_effects, get_entvar (this, var_effects) & ~ EF_NODRAW);
272+
273+ static rgflColor[3 ];
274+ get_entvar (pOwner, var_rendercolor, rgflColor);
275+ set_entvar (this, var_rendercolor, rgflColor);
276+ }
277+
278+ public @PlayerSubModel_IsActive (this) {
279+ return (pev (this, pev_modelindex) > 0 );
280+ }
281+
232282GetAnimationIndexByAnimExt (const szAnimExt[]) {
233283 static szSequence[32 ];
234284 format (szSequence, charsmax (szSequence), " ref_aim_%s " , szAnimExt);
0 commit comments