Cambiar Modelo de Armas
#1
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:

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_NAMEPLUGIN_VERSIONPLUGIN_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(idEV_SZ_viewmodelVIEW_MODEL)   // ENGINE
    
    // aplicamos el Player Model (el que los demas users Ven que tiene el user en sus manos)
    
entity_set_string(idEV_SZ_weaponmodelPLAYER_MODEL// ENGINE
    
    
return PLUGIN_CONTINUE 
}

public 
fw_SetModel(entitymodel[])
{
    
// 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(modelOLDWORLD_MODEL)) 
        return 
FMRES_IGNORED
    
    
// Obtenemos el Classname de la Entidad
    
new className[33]
    
entity_get_string(entityEV_SZ_classnameclassName32// 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(entityWORLD_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_PrecacheModelmodel_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(idEV_SZ_viewmodelmodel_m3)
    
// Forma 2
    
entity_set_model(idmodel_m3)
    
    
// o
    
    // fakemeta
    
set_pev(idpev_viewmodel2model_m3)

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:
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_PrecacheModelmodel_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(idEV_SZ_viewmodelmodel_m3)
    
// Forma 2
    
entity_set_model(idmodel_m3)
    
    
// o
    
    // Fakemeta
    
set_pev(idpev_viewmodel2model_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_PrecacheModelv_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_m3charsmax(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(idEV_SZ_viewmodelv_model_m3)
    
// Forma 2
    
entity_set_model(id,v_model_m3)
    
    
// o
    
    // Fakemeta
    
set_pev(idpev_viewmodel2v_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(iIndexiKey, 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(idEV_SZ_viewmodel, ...)          | set_pev(idpev_viewmodel2, ...)
entity_set_string(idEV_SZ_weaponmodel, ...)     | set_pev(idpev_weaponmodel2, ...)
entity_set_model(entity, ...)                                | engfunc(EngFunc_SetModelentity, ...)
entity_get_string(entityEV_SZ_classname, ...)    | pev(entitypev_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.
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#2
Prefiero 1000 veces usar Ham_item_deploy ya que no me han dado buenas referencia de CurWeapon pero de todas maneras buen tuto para la gente mas nueva
Responder
#3
Para que usaria ham si ya con fakemeta o engine/fakemeta alcanza?
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#4
cuando le quieras setear 2 models diferentes a la misma CSW del arma en el mismo menu me entendaras a lo que me refiero
Responder
#5
No entiendo que tiene que ver con el tutorial
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#6
CurWeapon es uno de los peores métodos para cambiar el model del arma.

fíjate en el zp cuando se llama replace_weapon_models, ahí está optimizado.
(17/04/2015, 03:36 PM)Neeeeeeeeeel.- escribió: No se va a volver a conectar a internet en toda su puta vida... nadie sube porno a mi foro y vive para contarlo.
Responder
#7
(10/03/2014, 11:52 AM)RauliTop escribió: CurWeapon es uno de los peores métodos para cambiar el model del arma.

fíjate en el zp cuando se llama replace_weapon_models, ahí está optimizado.

te refieres a este cierto? al menos es el que yo uso

Código PHP:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <cstrike>
#include <zombieplague>

const OFFSET_ACTIVE_ITEM 373
const OFFSET_WEAPONOWNER 41
const OFFSET_LINUX 5
const OFFSET_LINUX_WEAPONS 4

new glock_V_MODEL[64] = "models/cso/v_glock.mdl"
new glock_P_MODEL[64] = "models/cso/p_glock.mdl"
new glock_W_MODEL[64] = "models/cso/w_glock.mdl"

const PRIMARY_WEAPONS_BIT_SUM 
(
1<<CSW_SCOUT)|(1<<CSW_XM1014)|(1<<CSW_MAC10)|(1<<CSW_AUG)|(1<<CSW_UMP45)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_AWP)|(1<<
CSW_MP5NAVY)|(1<<CSW_M249)|(1<<CSW_M3)|(1<<CSW_M4A1)|(1<<CSW_TMP)|(1<<CSW_G3SG1)|(1<<CSW_SG552)|(1<<CSW_AK47)|(1<<CSW_P90)
new const 
WEAPONENTNAMES[][] = { """weapon_p228""""weapon_scout""weapon_hegrenade""weapon_xm1014""weapon_c4""weapon_mac10",
            
"weapon_aug""weapon_smokegrenade""weapon_elite""weapon_fiveseven""weapon_ump45""weapon_sg550",
            
"weapon_galil""weapon_famas""weapon_usp""weapon_glock18""weapon_awp""weapon_mp5navy""weapon_m249",
            
"weapon_m3""weapon_m4a1""weapon_tmp""weapon_g3sg1""weapon_flashbang""weapon_deagle""weapon_sg552",
            
"weapon_ak47""weapon_knife""weapon_p90" }

public 
plugin_init()
{
    
register_plugin("[ZP] Weapon Replacement""1.0""LARS-BLOODLIKER")
    for(new 
1sizeof WEAPONENTNAMESi++)
    if(
WEAPONENTNAMES[i][0]) RegisterHam(Ham_Item_DeployWEAPONENTNAMES[i], "fw_Item_Deploy_Post"1)
    
register_forward(FM_SetModel"fw_SetModel")
}

public 
plugin_precache()
{
    
precache_model(glock_V_MODEL)
    
precache_model(glock_P_MODEL)
    
precache_model(glock_W_MODEL)
    
precache_model(usp_V_MODEL)
    
precache_model(usp_P_MODEL)
    
precache_model(usp_W_MODEL)
}

public 
fw_SetModel(entitymodel[])
{
    if(!
is_valid_ent(entity))
        return 
FMRES_IGNORED
    
    
static szClassName[33]
    
entity_get_string(entityEV_SZ_classnameszClassNamecharsmax(szClassName))
        
    if(!
equal(szClassName"weaponbox"))
        return 
FMRES_IGNORED
    
    
if(equal(model"models/w_glock18.mdl"))
    {        
        
entity_set_model(entityglock_W_MODEL)
            
        return 
FMRES_SUPERCEDE
    
}
    else if(
equal(model"models/w_usp.mdl"))
    {        
        
entity_set_model(entityusp_W_MODEL)
            
        return 
FMRES_SUPERCEDE
    
}
    return 
FMRES_IGNORED
}

public 
fw_Item_Deploy_Post(weapon_ent)
{
    static 
owner
    owner 
fm_cs_get_weapon_ent_owner(weapon_ent)
    
    static 
weaponid
    weaponid 
cs_get_weapon_id(weapon_ent)
    
    
replace_weapon_models(ownerweaponid)
}

replace_weapon_models(idweaponid)
{
    if(
zp_get_user_zombie(id) || zp_get_user_survivor(id))
        return

    switch(
weaponid)
    {
        case 
CSW_GLOCK18:
        {
            
set_pev(idpev_viewmodel2glock_V_MODEL)
            
set_pev(idpev_weaponmodel2glock_P_MODEL)
        }
        case 
CSW_USP:
        {    
            
set_pev(idpev_viewmodel2usp_V_MODEL)
            
set_pev(idpev_weaponmodel2usp_P_MODEL)
        }
    }
}

stock fm_cs_get_current_weapon_ent(id)
{
    return 
get_pdata_cbase(idOFFSET_ACTIVE_ITEMOFFSET_LINUX)
}

stock fm_cs_get_weapon_ent_owner(ent)
{
    return 
get_pdata_cbase(entOFFSET_WEAPONOWNEROFFSET_LINUX_WEAPONS)

Responder
#8
Tengo una duda, el tutorial es interno al zp o externo? siempre tuve esa duda
Responder
#9
(19/05/2014, 08:06 PM)Metallica_Forever escribió: Tengo una duda, el tutorial es interno al zp o externo? siempre tuve esa duda
Tenes dos tutoriales, uno para usar en un modo cualquiera y otro para zp. En la de zp tenes para la versión 4.2 y 4.3
(19/06/2014, 11:08 PM)01011001 escribió: No tiene niveles infinitos, llega hasta 2147483648 (Y despues hace un integer overflow)

(19/06/2014, 11:08 PM)[R]ak escribió: Mis conocimientos aumentaron un 500% con este post
Responder
#10
esto es para un model normal pero para un extra item como se hace soy nuevo y tengo un tiempo buscando o guienme gracias atodo lo que me puedan aportar
CREANDO UNA GRAN COMUNIDAD
Responder
#11
(17/06/2019, 02:35 AM)Arlekyng1998 escribió: esto es para un model normal pero para un extra item como se hace soy nuevo y tengo un tiempo buscando o guienme gracias atodo lo que me puedan aportar

Ocupas la variable del extra items.
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)