Nivel de Pawn: MEDIO
Hago este tutorial porque he visto que hay varios users que no saben hacer algo tan basico como cambiar un model. 1ero les dejo por si alguno quiere cambiar un model en un plugin que no sea zp.-
Bueno empezemos. Primero les dejo esto que lo hizo chip suit pero fue explicado por meTaLiCroSS:
Bueno ahora para zp 4.2:
Ahi ya tendriamos el V MODEL, el que ve el jugador en su mano.
Bueno ahora para zp 4.3. Hay 2 formas para hacerlo, la 1era:
La 2da forma:
Luego abrimos el zombieplague.ini y buscamos la seccion [Weapon Models] y debajo del ultimo ponemos
Por si quieren cambiar mas models, les dejo los CSW de las armas.
NOTA: si usan fakemeta asegurense de usar pev_weaponmodel2 y pev_viewmodel2. Si usan pev_viewmodel solo o pev_weaponmodel les puede tirar el server diciendo SV_MODLINDEX not found: %·$&/%&/%·$, ami me paso y luego de leer el inc me di cuenta:
Creditos: Chip Suit y metaLiCroSS ( 1er y ultimo code ) - Kane (demás codes)
Bueno costo escribir, asique espero que sirva. Cualquier cosa pregunten si no entienden algo.
Saludos.
Hago este tutorial porque he visto que hay varios users que no saben hacer algo tan basico como cambiar un model. 1ero les dejo por si alguno quiere cambiar un model en un plugin que no sea zp.-
Bueno empezemos. Primero les dejo esto que lo hizo chip suit pero fue explicado por meTaLiCroSS:
Código PHP:
#include <amxmodx>
#include <engine>
#include <fakemeta>
new VIEW_MODEL[] = "models/v_<nombre del model>.mdl"
new PLAYER_MODEL[] = "models/p_<nombre del model>.mdl"
new WORLD_MODEL[] = "models/w_<nombre del model>.mdl"
new OLDWORLD_MODEL[] = "models/w_<nombre del model>.mdl" // el world model que quieres reemplasar por el que esta mas arriba
new PLUGIN_NAME[] = "Custom Weapon Model"
new PLUGIN_AUTHOR[] = "Cheap_Suit"
new PLUGIN_VERSION[] = "1.0"
public plugin_init()
{
// Info del Plugin
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
// Evento CurWeapon, cuando un player activa/pone/selecciona un arma
register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
// Evento (FAKEMETA) en el cual se setean Models (claramente el mismo evento lo dice)
register_forward(FM_SetModel, "fw_SetModel")
}
public plugin_precache()
{
// Haciendo Precache de los Models
precache_model(VIEW_MODEL)
precache_model(PLAYER_MODEL)
precache_model(WORLD_MODEL)
}
public Event_CurWeapon(id)
{
// obtenemos la ID del arma que porta el jugador
new weaponID = read_data(2)
// ejemplo: si el arma no es la AK-47, detenemos la operacion
if(weaponID != CSW_AK47)
return PLUGIN_CONTINUE
// aplicamos el View Model (el que el user tiene en sus manos)
entity_set_string(id, EV_SZ_viewmodel, VIEW_MODEL) // ENGINE
// aplicamos el Player Model (el que los demas users Ven que tiene el user en sus manos)
entity_set_string(id, EV_SZ_weaponmodel, PLAYER_MODEL) // ENGINE
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
// detectamos si la entidad es correcta/sin errores, de no ser asi, detenemos la operacion
if(!is_valid_ent(entity)) // ENGINE
return FMRES_IGNORED
// detectamos si el Model ES como el que queremos reemplasar, de no ser asi, detenemos la operacion
if(!equali(model, OLDWORLD_MODEL))
return FMRES_IGNORED
// Obtenemos el Classname de la Entidad
new className[33]
entity_get_string(entity, EV_SZ_classname, className, 32) // ENGINE
// Detectamos si los Classnames son equivalentes a la de un arma
// "weaponbox": Arma botada
// "armoury_entity": Arma botada por el Mapa en si
// "grenade": Granada, C4
if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
{
// seteamos el World Model (el que esta botado en el piso)
entity_set_model(entity, WORLD_MODEL) // ENGINE
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
Bueno ahora para zp 4.2:
Código PHP:
new const model_m3[] = { "models/v_<aca_el_nombre>.mdl" } // nombre y modelo que vamos a usar
// Ahora nos vamos a plugin_precache() para precacherlo. Abajo de // Custom weapon models
engfunc(EngFunc_PrecacheModel, model_m3)
// fakemeta_const.inc
/* Used with engfunc()
EngFunc_PrecacheModel, // int ) (char *s);
*/
// tambien podemos usar
precache_model(model_m3)
// Luego iremos al public donde se cambian todos los modelos que es
// public replace_models(id) y adentro del switch agregamos
case CSW_M3: // le decimos cual arma qeremos cambiarle el model
{
// Engine - Forma 1
entity_set_string(id, EV_SZ_viewmodel, model_m3)
// Forma 2
entity_set_model(id, model_m3)
// o
// fakemeta
set_pev(id, pev_viewmodel2, model_m3)
}
Bueno ahora para zp 4.3. Hay 2 formas para hacerlo, la 1era:
Código PHP:
new const model_m3[] = { "models/v_<aca_el_nombre>.mdl" } // nombre y modelo que vamos a usar
// Ahora nos vamos a plugin_precache() para precacherlo. Abajo de // Custom weapon models
engfunc(EngFunc_PrecacheModel, model_m3)
// fakemeta_const.inc
/* Used with engfunc()
EngFunc_PrecacheModel, // int ) (char *s);
*/
// tambien podemos usar
precache_model(model_m3)
// Luego iremos al public donde se cambian todos los modelos que es
// replace_weapon_models(id, weaponid) y adentro del switch agregamos
case CSW_M3:
{
// Engine - Forma 1
entity_set_string(id, EV_SZ_viewmodel, model_m3)
// Forma 2
entity_set_model(id, model_m3)
// o
// Fakemeta
set_pev(id, pev_viewmodel2, model_m3)
}
La 2da forma:
Código PHP:
new v_model_m3[64] // creamos la variable que va a leer el modelo de la m3 del archvo zombieplague.ini
// Ahora nos vamos a plugin_precache() para precacherlo. Abajo de // Custom weapon models
engfunc(EngFunc_PrecacheModel, v_model_m3)
// fakemeta_const.inc
/* Used with engfunc()
EngFunc_PrecacheModel, // int ) (char *s);
*/
// tambien podemos usar
precache_model(v_model_m3)
// Ahora nos vamos a load_customization_from_files() y buscamos el case SECTION_WEAPON_MODELS:
// al final de eso agregamos
else if (equal(key, "V_M3")) // que encuentro la linea en el archivo .ini llamada V_M3
copy(v_model_m3, charsmax(v_model_m3), value) // que copie la ruta del modelo a v_model_m3 para luego aplicarsela al player
// Ahora nos dirigimos a replace_weapon_models(id, weaponid) y agregamos otro case adentro del swtich
case CSW_M3:
{
// Engine - Forma 1
entity_set_string(id, EV_SZ_viewmodel, v_model_m3)
// Forma 2
entity_set_model(id,v_model_m3)
// o
// Fakemeta
set_pev(id, pev_viewmodel2, v_model_m3)
}
Luego abrimos el zombieplague.ini y buscamos la seccion [Weapon Models] y debajo del ultimo ponemos
Código PHP:
V_M3 = models/zombie_plague/v_m3.mdl // la ruta del model que luego va a utilizar la variable v_model_m3
Código PHP:
// Esto fue sacado de fakemeta.inc
/**
* Sets entvar data for an entity. Use the pev_* enum from fakemeta_const.inc for reference.
*
* @note Setting string data will automatically allocate a new string (via AllocString)
* If you have a string already allocated with your own call to AllocString, use
* set_pev_string_ptr instead.
*
* @param _index The entity index to set the value on.
* @param _value The pev field to set, (look in fakemeta_const.inc)
*/
native set_pev(_index,_value,any:...);
// esto de fakemeta_const.inc
enum {
pev_string_start = 0,
pev_classname,
pev_globalname,
pev_model,
pev_target,
pev_targetname,
pev_netname,
pev_message,
pev_noise,
pev_noise1,
pev_noise2,
pev_noise3,
pev_string_end,
pev_edict_start,
pev_chain,
pev_dmg_inflictor,
pev_enemy,
pev_aiment,
pev_owner,
pev_groundentity,
pev_euser1,
pev_euser2,
pev_euser3,
pev_euser4,
pev_edict_end,
pev_float_start,
pev_impacttime,
pev_starttime,
pev_idealpitch,
pev_ideal_yaw,
pev_pitch_speed,
pev_yaw_speed,
pev_ltime,
pev_nextthink,
pev_gravity,
pev_friction,
pev_frame,
pev_animtime,
pev_framerate,
pev_scale,
pev_renderamt,
pev_health,
pev_frags,
pev_takedamage,
pev_max_health,
pev_teleport_time,
pev_armortype,
pev_armorvalue,
pev_dmg_take,
pev_dmg_save,
pev_dmg,
pev_dmgtime,
pev_speed,
pev_air_finished,
pev_pain_finished,
pev_radsuit_finished,
pev_maxspeed,
pev_fov,
pev_flFallVelocity,
pev_fuser1,
pev_fuser2,
pev_fuser3,
pev_fuser4,
pev_float_end,
pev_int_start,
pev_fixangle,
pev_modelindex,
pev_viewmodel,
pev_weaponmodel,
pev_movetype,
pev_solid,
pev_skin,
pev_body,
pev_effects,
pev_light_level,
pev_sequence,
pev_gaitsequence,
pev_rendermode,
pev_renderfx,
pev_weapons,
pev_deadflag,
pev_button,
pev_impulse,
pev_spawnflags,
pev_flags,
pev_colormap,
pev_team,
pev_waterlevel,
pev_watertype,
pev_playerclass,
pev_weaponanim,
pev_pushmsec,
pev_bInDuck,
pev_flTimeStepSound,
pev_flSwimTime,
pev_flDuckTime,
pev_iStepLeft,
pev_gamestate,
pev_oldbuttons,
pev_groupinfo,
pev_iuser1,
pev_iuser2,
pev_iuser3,
pev_iuser4,
pev_int_end,
pev_byte_start,
pev_controller_0,
pev_controller_1,
pev_controller_2,
pev_controller_3,
pev_blending_0,
pev_blending_1,
pev_byte_end,
pev_bytearray_start,
pev_controller,
pev_blending,
pev_bytearray_end,
pev_vecarray_start,
pev_origin,
pev_oldorigin,
pev_velocity,
pev_basevelocity,
pev_clbasevelocity,
pev_movedir,
pev_angles,
pev_avelocity,
pev_v_angle,
pev_endpos,
pev_startpos,
pev_absmin,
pev_absmax,
pev_mins,
pev_maxs,
pev_size,
pev_rendercolor,
pev_view_ofs,
pev_vuser1,
pev_vuser2,
pev_vuser3,
pev_vuser4,
pev_punchangle,
pev_vecarray_end,
pev_string2_begin, /* anything after here are string corrections */
pev_weaponmodel2,
pev_viewmodel2,
pev_string2_end,
pev_edict2_start, /* edict corrections */
pev_pContainingEntity,
pev_absolute_end
};
Código PHP:
// engine.inc
/* Sets the model of an Entity. */
native entity_set_model(iIndex, const szModel[]);
/* Sets/gets things in an entities Entvars Struct. */
native entity_set_string(iIndex, iKey, const szNewVal[]);
// y los EV_SZ de engine_const.inc
/* String */
enum {
EV_SZ_classname = 0,
EV_SZ_globalname,
EV_SZ_model,
EV_SZ_target,
EV_SZ_targetname,
EV_SZ_netname,
EV_SZ_message,
EV_SZ_noise,
EV_SZ_noise1,
EV_SZ_noise2,
EV_SZ_noise3,
EV_SZ_viewmodel,
EV_SZ_weaponmodel,
};
Por si quieren cambiar mas models, les dejo los CSW de las armas.
Código PHP:
// amxconst.inc
/* Id of weapons in CS */
#define CSW_P228 1
#define CSW_SCOUT 3
#define CSW_HEGRENADE 4
#define CSW_XM1014 5
#define CSW_C4 6
#define CSW_MAC10 7
#define CSW_AUG 8
#define CSW_SMOKEGRENADE 9
#define CSW_ELITE 10
#define CSW_FIVESEVEN 11
#define CSW_UMP45 12
#define CSW_SG550 13
#define CSW_GALI 14
#define CSW_GALIL 14
#define CSW_FAMAS 15
#define CSW_USP 16
#define CSW_GLOCK18 17
#define CSW_AWP 18
#define CSW_MP5NAVY 19
#define CSW_M249 20
#define CSW_M3 21
#define CSW_M4A1 22
#define CSW_TMP 23
#define CSW_G3SG1 24
#define CSW_FLASHBANG 25
#define CSW_DEAGLE 26
#define CSW_SG552 27
#define CSW_AK47 28
#define CSW_KNIFE 29
#define CSW_P90 30
#define CSW_VEST 31
#define CSW_VESTHELM 32
NOTA: si usan fakemeta asegurense de usar pev_weaponmodel2 y pev_viewmodel2. Si usan pev_viewmodel solo o pev_weaponmodel les puede tirar el server diciendo SV_MODLINDEX not found: %·$&/%&/%·$, ami me paso y luego de leer el inc me di cuenta:
Código PHP:
// fakemeta_const.inc
pev_string2_begin, /* anything after here are string corrections */
pev_weaponmodel2,
pev_viewmodel2,
pev_string2_end,
pev_edict2_start, /* edict corrections */
pev_pContainingEntity,
pev_absolute_end
Código PHP:
// Esto fue echo por meTaLiCroSS, me parecio interesante por si alguno tiene alguna duda sobre los includes
// Engine: | Fakemeta:
is_valid_ent(entity) | pev_valid(entity)
entity_set_string(id, EV_SZ_viewmodel, ...) | set_pev(id, pev_viewmodel2, ...)
entity_set_string(id, EV_SZ_weaponmodel, ...) | set_pev(id, pev_weaponmodel2, ...)
entity_set_model(entity, ...) | engfunc(EngFunc_SetModel, entity, ...)
entity_get_string(entity, EV_SZ_classname, ...) | pev(entity, pev_classname, ...)
Creditos: Chip Suit y metaLiCroSS ( 1er y ultimo code ) - Kane (demás codes)
Bueno costo escribir, asique espero que sirva. Cualquier cosa pregunten si no entienden algo.
Saludos.