Skip to content

Commit 76edae7

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

File tree

2 files changed

+85
-41
lines changed

2 files changed

+85
-41
lines changed

api_player_model.sma

+83-40
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,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

5859
public 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+
6879
public 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-
8994
public 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+
98109
public 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

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

113131
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);
119134
}
120135

121136
@Player_UpdateCurrentModel(pPlayer);
122137
}
123138

124139
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]);
136142
}
137143

138144
return HAM_HANDLED;
@@ -168,32 +174,29 @@ public @Player_UpdateAnimationModel(this) {
168174
}
169175

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

188192
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];
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+
232275
GetAnimationIndexByAnimExt(const szAnimExt[]) {
233276
static szSequence[32];
234277
format(szSequence, charsmax(szSequence), "ref_aim_%s", szAnimExt);

include/api_player_model.inc

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77

88
native PlayerModel_Get(pPlayer, szOut[], iLen);
99
native PlayerModel_GetCurrent(pPlayer, szOut[], iLen);
10+
native PlayerModel_GetEntity(pPlayer);
1011
native PlayerModel_Set(pPlayer, const szModel[]);
1112
native PlayerModel_Update(pPlayer);
1213
native PlayerModel_Reset(pPlayer);
13-
native PlayerModel_PrecacheAnimation(const szAnimation[]);
1414
native PlayerModel_SetSequence(pPlayer, const szSequence[]);
15+
native PlayerModel_PrecacheAnimation(const szAnimation[]);

0 commit comments

Comments
 (0)