Últimamente he visto varia gente que
no sabe como setear los modelos de una forma mas optimizada o como quieran llamarle o que nos les tire el famoso
SVC_BAD bueno hoy les enseñare o guiaré a como hacerlo.
Bueno primero que todo para que esta guía les funcione
tienen que bajarse el API de MeRcyLeZZ
Link:
http://forums.alliedmods.net/showthread.php?t=161255
Luego de descargarlo poner cada archivo donde tiene que ir
cs_player_models_api.inc : en la carpeta includes
cs_player_models_api.sma : Obviamente hay que compilarlo al momento de compilarlo lo agregan a plugins-zplague.ini de la siguiente manera
Code:
; - Quick tips -
; * Rename this file to disabled-zplague.ini to turn the mod off
; * Rename it back to plugins-zplague.ini to turn it on
; * Put a semi-colon in front of a plugin to disable it
; * Remove a semi-colon to re-enable a plugin
; * Add the word debug after a plugin to place it in debug mode
; Main plugin
cs_player_models_api.amxx ; Lo agregan antes del zombie_plague40.amxx o como lo tengan puesto...
zombie_plague40.amxx
; Add sub-plugins, custom zombie classes, and extra items here
zp_zclasses40.amxx
Luego de esto añaden el include dentro del ZP :
#include <cs_player_models_api>
Si lo hacen en un Plugin que no sea ZP hacen lo mismo pero siempre el plugin principal que usen lo dejan abajo del API.
Lo primero que deben hacer es eliminar la forma que setea los models el ZP:
Primero buscan: stock fm_cs_set_user_model_index
Y eliminan todo ese stock hasta el otro stock que se llama fm_set_playermodel_ent luego de eso bajan un poco y esta
el stock fm_set_weaponmodel_ent lo eliminan tambien y siguen eliminando hasta el stock fm_user_model_update
Se me olvidaba despues de eso vayan al public fw_ClientDisconnect y mas abajo borran esto:
PHP Code:
if (g_handle_models_on_separate_ent)
{
// Remove custom model entities
fm_remove_model_ents(id)
}
Despues van al public de la forward fw_ClientUserInfoChanged y lo dejan así:
PHP Code:
// Forward Client User Info Changed -prevent players from changing models-
public fw_ClientUserInfoChanged(id)
get_user_name(id, g_playername[id], charsmax(g_playername[]))
Luego van // CS Player PData Offsets (win32)
que esta casi en el principio del plugin y eliminan el offset const OFFSET_MODELINDEX = 491 // Orangutanz
no creo que sea muy importante eliminarlo pero para que no tengan cosas al pedo lo hacen xDD
Despues buscan el variable g_ent_playermodel y lo eliminan tambien buscan g_models_targettime y g_modelchange_delay
y las eliminan tambien eliminan new const MODEL_ENT_CLASSNAME[] = "player_model" y Float:g_modelchange_delay, g_set_modelindex_offset, g_handle_models_on_separate_ent, g_ent_playermodel[33], Float:g_models_targettime
tambien eliminan if (!g_handle_models_on_separate_ent) register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
obviamente su public tambien lo eliminan
luego de eso buscan if (g_handle_models_on_separate_ent) register_message(get_user_msgid("ClCorpse"), "message_clcorpse")
tambien lo borran y luego van a su publica y tambien lo borran xD
Ahora van al case SECTION_SVC_BAD: y lo eliminan.
Luego se van al public frost_explode bajan hasta
PHP Code:
// Light blue glow while frozen
if (g_handle_models_on_separate_ent)
fm_set_rendering(g_ent_playermodel[victim], kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
else
fm_set_rendering(victim, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
y lo dejan así
PHP Code:
// Light blue glow while frozen
fm_set_rendering(victim, kRenderFxGlowShell, 0, 100, 200, kRenderNormal, 25)
Despues van a remove_freeze(id)
y cambian:
PHP Code:
// Restore rendering
if (g_handle_models_on_separate_ent)
{
// Nemesis or Survivor glow / remove glow on player model entity
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
else if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(g_ent_playermodel[id])
}
else
{
// Nemesis or Survivor glow / remove glow
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
else if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(id)
}
Por esto:
PHP Code:
// Nemesis or Survivor glow / remove glow
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
else if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(id)
Ahora van a replace_weapon_models(id, weaponid)
y Bajan hasta el ultimo y lo dejan así
PHP Code:
// Update model on weaponmodel ent
fm_set_weaponmodel_ent(id)
Luego de eso se van a fw_PlayerSpawn_Post
bajan un poco y encontraran // Custom models stuff
borran todo lo que esta debajo y lo dejan así
PHP Code:
// Custom models stuff
static Rand
// Set the right model, after checking that we don't already have it
if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_human) - 1)
ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
else
{
iRand = random_num(0, ArraySize(model_human) - 1)
ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
// Remove glow
fm_set_rendering(id)
Lo siguiente que tienen que hacer es ir a humanme(id, survivor, silentmode)
en el public bajan un poco y veran la parte que dice Custom model stuff cambian esto:
PHP Code:
// Custom models stuff
static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
already_has_model = false
if (g_handle_models_on_separate_ent)
{
// Set the right model
if (g_survivor[id])
{
iRand = random_num(0, ArraySize(model_survivor) - 1)
ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand))
}
else
{
if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_human) - 1)
ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
}
else
{
iRand = random_num(0, ArraySize(model_human) - 1)
ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
}
}
// Set model on player model entity
fm_set_playermodel_ent(id)
// Set survivor glow / remove glow on player model entity, unless frozen
if (!g_frozen[id])
{
if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(g_ent_playermodel[id])
}
}
else
{
// Get current model for comparing it with the current one
fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it
if (g_survivor[id])
{
size = ArraySize(model_survivor)
for (i = 0; i < size; i++)
{
ArrayGetString(model_survivor, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_survivor, iRand))
}
}
else
{
if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
size = ArraySize(model_admin_human)
for (i = 0; i < size; i++)
{
ArrayGetString(model_admin_human, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_human, iRand))
}
}
else
{
size = ArraySize(model_human)
for (i = 0; i < size; i++)
{
ArrayGetString(model_human, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_human, iRand))
}
}
}
// Need to change the model?
if (!already_has_model)
{
// An additional delay is offset at round start
// since SVC_BAD is more likely to be triggered there
if (g_newround)
set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
else
fm_user_model_update(id+TASK_MODEL)
}
// Set survivor glow / remove glow, unless frozen
if (!g_frozen[id])
{
if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(id)
}
}
Lo cambian por esto:
PHP Code:
// Custom models stuff
static iRand
if (g_survivor[id])
{
iRand = random_num(0, ArraySize(model_survivor) - 1)
ArrayGetString(model_survivor, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
else
{
if (get_pcvar_num(cvar_adminmodelshuman) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_human) - 1)
ArrayGetString(model_admin_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
else
{
iRand = random_num(0, ArraySize(model_human) - 1)
ArrayGetString(model_human, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
}
// Set survivor glow / remove glow, unless frozen
if (!g_frozen[id])
{
if (g_survivor[id] && get_pcvar_num(cvar_survglow))
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 255, kRenderNormal, 25)
else
fm_set_rendering(id)
}
Ahora les enseñaré a setear los modelos de los Zombies:
Buscan zombieme(id, infector, nemesis, silentmode, rewards) y bajan hasta donde dice
Y cambian todo esto :
PHP Code:
// Custom models stuff
static currentmodel[32], tempmodel[32], already_has_model, i, iRand, size
already_has_model = false
if (g_handle_models_on_separate_ent)
{
// Set the right model
if (g_nemesis[id])
{
iRand = random_num(0, ArraySize(model_nemesis) - 1)
ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
}
else
{
if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_zombie) - 1)
ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
}
else
{
iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
}
}
// Set model on player model entity
fm_set_playermodel_ent(id)
// Nemesis glow / remove glow on player model entity, unless frozen
if (!g_frozen[id])
{
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(g_ent_playermodel[id], kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
else
fm_set_rendering(g_ent_playermodel[id])
}
}
else
{
// Get current model for comparing it with the current one
fm_cs_get_user_model(id, currentmodel, charsmax(currentmodel))
// Set the right model, after checking that we don't already have it
if (g_nemesis[id])
{
size = ArraySize(model_nemesis)
for (i = 0; i < size; i++)
{
ArrayGetString(model_nemesis, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_nemesis, iRand))
}
}
else
{
if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
size = ArraySize(model_admin_zombie)
for (i = 0; i < size; i++)
{
ArrayGetString(model_admin_zombie, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(0, size - 1)
ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_modelindex_admin_zombie, iRand))
}
}
else
{
for (i = ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]); i < ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]); i++)
{
ArrayGetString(g_zclass_playermodel, i, tempmodel, charsmax(tempmodel))
if (equal(currentmodel, tempmodel)) already_has_model = true
}
if (!already_has_model)
{
iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
if (g_set_modelindex_offset) fm_cs_set_user_model_index(id, ArrayGetCell(g_zclass_modelindex, iRand))
}
}
}
// Need to change the model?
if (!already_has_model)
{
// An additional delay is offset at round start
// since SVC_BAD is more likely to be triggered there
if (g_newround)
set_task(5.0 * g_modelchange_delay, "fm_user_model_update", id+TASK_MODEL)
else
fm_user_model_update(id+TASK_MODEL)
}
Por este code:
PHP Code:
// Custom models stuff
static iRand
// Set the right model, after checking that we don't already have it
if (g_nemesis[id])
{
iRand = random_num(0, ArraySize(model_nemesis) - 1)
ArrayGetString(model_nemesis, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
else
{
if (get_pcvar_num(cvar_adminmodelszombie) && (get_user_flags(id) & g_access_flag[ACCESS_ADMIN_MODELS]))
{
iRand = random_num(0, ArraySize(model_admin_zombie) - 1)
ArrayGetString(model_admin_zombie, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
else
{
iRand = random_num(ArrayGetCell(g_zclass_modelsstart, g_zombieclass[id]), ArrayGetCell(g_zclass_modelsend, g_zombieclass[id]) - 1)
ArrayGetString(g_zclass_playermodel, iRand, g_playermodel[id], charsmax(g_playermodel[]))
cs_set_player_model(id, g_playermodel[id])
}
// Nemesis glow / remove glow, unless frozen
if (!g_frozen[id])
{
if (g_nemesis[id] && get_pcvar_num(cvar_nemglow))
fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 25)
else
fm_set_rendering(id)
}
}
Si usan unas de las versiones fixs del zp tendran una native nueva, vayan a native_override_user_model(id, const newmodel[])
y cambian todo ese public por esto:
PHP Code:
public native_override_user_model(id, const newmodel[])
{
// ZP disabled
if (!g_pluginenabled)
return false;
if (!is_user_valid_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZP] Invalid Player (%d)", id)
return false;
}
// Strings passed byref
param_convert(2)
copy(g_playermodel[id], charsmax(g_playermodel[]), newmodel)
cs_set_player_model(id, g_playermodel[id])
return true;
}
Y listo Cualquier duda o error no duden en decirmela Hasta la proxima
__________________