Skip to content

Commit e509948

Browse files
committed
improve player model api
1 parent 7558ae7 commit e509948

File tree

2 files changed

+93
-41
lines changed

2 files changed

+93
-41
lines changed

api_player_model.sma

Lines changed: 90 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ new g_rgszDefaultPlayerModel[MAX_PLAYERS + 1][32];
1515
new g_rgszCurrentPlayerModel[MAX_PLAYERS + 1][256];
1616
new g_rgszCustomPlayerModel[MAX_PLAYERS + 1][256];
1717
new g_rgiPlayerAnimationIndex[MAX_PLAYERS + 1];
18-
new bool:g_rgbPlayerUseDefaultModel[MAX_PLAYERS + 1];
18+
new bool:g_rgbPlayerUseCustomModel[MAX_PLAYERS + 1];
1919

2020
new Trie:g_itPlayerSequenceModelIndexes = Invalid_Trie;
2121
new Trie:g_itPlayerSequences = Invalid_Trie;
22-
new g_pPlayerModel[MAX_PLAYERS + 1];
22+
new g_pPlayerSubModel[MAX_PLAYERS + 1];
2323

2424
new 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

5860
public 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+
6886
public 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-
89101
public 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+
98116
public 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

106131
public 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

113138
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;
139+
if (!g_pPlayerSubModel[pPlayer]) {
140+
g_pPlayerSubModel[pPlayer] = @PlayerSubModel_Create(pPlayer);
119141
}
120142

121143
@Player_UpdateCurrentModel(pPlayer);
122144
}
123145

124146
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);
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

170183
public @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

188199
public @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+
232282
GetAnimationIndexByAnimExt(const szAnimExt[]) {
233283
static szSequence[32];
234284
format(szSequence, charsmax(szSequence), "ref_aim_%s", szAnimExt);

include/api_player_model.inc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77

88
native PlayerModel_Get(pPlayer, szOut[], iLen);
99
native PlayerModel_GetCurrent(pPlayer, szOut[], iLen);
10+
native PlayerModel_GetEntity(pPlayer);
11+
native bool:PlayerModel_HasCustom(pPlayer);
1012
native PlayerModel_Set(pPlayer, const szModel[]);
1113
native PlayerModel_Update(pPlayer);
1214
native PlayerModel_Reset(pPlayer);
13-
native PlayerModel_PrecacheAnimation(const szAnimation[]);
1415
native PlayerModel_SetSequence(pPlayer, const szSequence[]);
16+
native PlayerModel_PrecacheAnimation(const szAnimation[]);

0 commit comments

Comments
 (0)