@@ -15,11 +15,11 @@ new g_rgszDefaultPlayerModel[MAX_PLAYERS + 1][32];
15
15
new g_rgszCurrentPlayerModel[MAX_PLAYERS + 1 ][256 ];
16
16
new g_rgszCustomPlayerModel[MAX_PLAYERS + 1 ][256 ];
17
17
new g_rgiPlayerAnimationIndex[MAX_PLAYERS + 1 ];
18
- new bool: g_rgbPlayerUseDefaultModel [MAX_PLAYERS + 1 ];
18
+ new bool: g_rgbPlayerUseCustomModel [MAX_PLAYERS + 1 ];
19
19
20
20
new Trie: g_itPlayerSequenceModelIndexes = Invalid_Trie;
21
21
new Trie: g_itPlayerSequences = Invalid_Trie;
22
- new g_pPlayerModel [MAX_PLAYERS + 1 ];
22
+ new g_pPlayerSubModel [MAX_PLAYERS + 1 ];
23
23
24
24
new gmsgClCorpse;
25
25
@@ -48,11 +48,12 @@ public plugin_natives() {
48
48
register_library (" api_player_model" );
49
49
register_native (" PlayerModel_Get" , " Native_GetPlayerModel" );
50
50
register_native (" PlayerModel_GetCurrent" , " Native_GetCurrentPlayerModel" );
51
+ register_native (" PlayerModel_GetEntity" , " Native_GetPlayerEntity" );
51
52
register_native (" PlayerModel_Set" , " Native_SetPlayerModel" );
52
53
register_native (" PlayerModel_Reset" , " Native_ResetPlayerModel" );
53
54
register_native (" PlayerModel_Update" , " Native_UpdatePlayerModel" );
54
- register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
55
55
register_native (" PlayerModel_SetSequence" , " Native_SetPlayerSequence" );
56
+ register_native (" PlayerModel_PrecacheAnimation" , " Native_PrecacheAnimation" );
56
57
}
57
58
58
59
public Native_GetPlayerModel (iPluginId, iArgc) {
@@ -65,6 +66,16 @@ public Native_GetCurrentPlayerModel(iPluginId, iArgc) {
65
66
set_string (2 , g_rgszCurrentPlayerModel[pPlayer], get_param (3 ));
66
67
}
67
68
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
+
68
79
public Native_SetPlayerModel (iPluginId, iArgc) {
69
80
new pPlayer = get_param (1 );
70
81
get_string (2 , g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]));
@@ -80,12 +91,6 @@ public Native_UpdatePlayerModel(iPluginId, iArgc) {
80
91
@Player_UpdateCurrentModel (pPlayer);
81
92
}
82
93
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
-
89
94
public Native_SetPlayerSequence (iPluginId, iArgc) {
90
95
new pPlayer = get_param (1 );
91
96
@@ -95,44 +100,45 @@ public Native_SetPlayerSequence(iPluginId, iArgc) {
95
100
return @Player_SetSequence (pPlayer, szSequence);
96
101
}
97
102
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
+
98
109
public client_connect (pPlayer) {
99
110
copy (g_rgszCustomPlayerModel[pPlayer], charsmax (g_rgszCustomPlayerModel[]), NULL_STRING);
100
111
copy (g_rgszDefaultPlayerModel[pPlayer], charsmax (g_rgszDefaultPlayerModel[]), NULL_STRING);
101
112
copy (g_rgszCurrentPlayerModel[pPlayer], charsmax (g_rgszCurrentPlayerModel[]), NULL_STRING);
102
113
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
+ }
104
122
}
105
123
106
124
public Message_ClCorpse (iMsgId, iMsgDest, pPlayer) {
107
125
new pTargetPlayer = get_msg_arg_int (12 );
108
- if (! g_rgbPlayerUseDefaultModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
126
+ if (g_rgbPlayerUseCustomModel [pTargetPlayer] || g_rgiPlayerAnimationIndex[pTargetPlayer]) {
109
127
set_msg_arg_string (1 , g_rgszCurrentPlayerModel[pTargetPlayer]);
110
128
}
111
129
}
112
130
113
131
public 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);
119
134
}
120
135
121
136
@Player_UpdateCurrentModel (pPlayer);
122
137
}
123
138
124
139
public 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]);
136
142
}
137
143
138
144
return HAM_HANDLED;
@@ -168,32 +174,29 @@ public @Player_UpdateAnimationModel(this) {
168
174
}
169
175
170
176
public @Player_UpdateCurrentModel (this) {
171
- new bool: bUsedDefault = g_rgbPlayerUseDefaultModel [this];
177
+ new bool: bUsedCustom = g_rgbPlayerUseCustomModel [this];
172
178
173
- g_rgbPlayerUseDefaultModel [this] = false ;
179
+ g_rgbPlayerUseCustomModel [this] = ! equal (g_rgszCustomPlayerModel[this], NULL_STRING) ;
174
180
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 {
176
184
if (! equal (g_rgszDefaultPlayerModel[this], NULL_STRING)) {
177
185
format (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), " models/player/%s /%s .mdl" , g_rgszDefaultPlayerModel[this], g_rgszDefaultPlayerModel[this]);
178
186
}
179
-
180
- g_rgbPlayerUseDefaultModel[this] = true ;
181
- } else {
182
- copy (g_rgszCurrentPlayerModel[this], charsmax (g_rgszCurrentPlayerModel[]), g_rgszCustomPlayerModel[this]);
183
187
}
184
188
185
- @Player_UpdateModel (this, ! bUsedDefault && g_rgbPlayerUseDefaultModel [this]);
189
+ @Player_UpdateModel (this, bUsedCustom && ! g_rgbPlayerUseCustomModel [this]);
186
190
}
187
191
188
192
public @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];
192
195
new iModelIndex = engfunc (EngFunc_ModelIndex, g_rgszCurrentPlayerModel[this]);
193
196
@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 );
195
198
} else {
196
- set_pev (g_pPlayerModel [this], pev_modelindex, 0 );
199
+ set_pev (g_pPlayerSubModel [this], pev_modelindex, 0 );
197
200
}
198
201
}
199
202
@@ -229,6 +232,46 @@ public @Player_SetSequence(this, const szSequence[]) {
229
232
return iSequence;
230
233
}
231
234
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
+
232
275
GetAnimationIndexByAnimExt (const szAnimExt[]) {
233
276
static szSequence[32 ];
234
277
format (szSequence, charsmax (szSequence), " ref_aim_%s " , szAnimExt);
0 commit comments