En este Tutorial les vamos a mostrar un metodo para cambiar los models de las armas. Los 3 tipos de Models que hay son: View, Player y World
View: El Model que el Player ve en Primera Persona
Player: El Model que un jugador aparte ve que el user esta Portando
World: El Model que se encuentra botado en el Suelo
Aqui se puede mostrar un ejemplo de los 3:
http://temple.fpsbanana.com/ss/srends/65962a.jpg
Este tutorial esta hecho para los 2 siguientes modulos: Engine y Fakemeta. Se isieron de las 2 formas porque algunos no se familiarisan con Engine y vicebersa.
Bueno, aqui comensamos
Engine y Fakemeta:
PHP Code:
#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
}
Solo Fakemeta:
PHP Code:
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)
set_pev(id, pev_viewmodel2, VIEW_MODEL) // FAKEMETA
// aplicamos el Player Model (el que los demas users Ven que tiene el user en sus manos)
set_pev(id, pev_weaponmodel2, PLAYER_MODEL) // FAKEMETA
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
// detectamos si la entidad es correcta/sin errores, de no ser asi, detenemos la operacion
if(!pev_valid(entity)) // FAKEMETA
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]
pev(entity, pev_classname, className, 32) // FAKEMETA
// 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)
engfunc(EngFunc_SetModel, entity, WORLD_MODEL) // FAKEMETA
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
P: Porque "pev_viewmodel2" / "pev_weaponmodel2" ? (Referente al "2")
R:
Using viewmodel2 and weaponmodel2. La unica diferencia entre viewmodel y viewmodel2 (tambien weaponmodel) es que en viewmodel/weaponmodel tienes que Allocar el String (nose cmo se dice en Spanish
)
PHP Code:
set_pev(id, pev_viewmodel, engfunc(EngFunc_AllocString, VIEW_MODEL))
set_pev(id, pev_viewmodel2, VIEW_MODEL)
ID de las Armas:
PHP Code:
#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_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
Ejemplo cambiando el Skin del Knife (Engine + Fakemeta):
PHP Code:
#include <amxmodx>
#include <engine>
#include <fakemeta>
new VIEW_MODEL[] = "models/v_newKnife.mdl"
new PLAYER_MODEL[] = "models/p_newKnife.mdl"
new WORLD_MODEL[] = "models/w_knife.mdl"
new OLDWORLD_MODEL[] = "models/w_knife.mdl"
new PLUGIN_NAME[] = "Custom Knife Model"
new PLUGIN_AUTHOR[] = "Cheap_Suit"
new PLUGIN_VERSION[] = "1.0"
public plugin_init()
{
register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR)
register_event("CurWeapon", "Event_CurWeapon", "be","1=1")
register_forward(FM_SetModel, "fw_SetModel")
}
public plugin_precache()
{
precache_model(VIEW_MODEL)
precache_model(PLAYER_MODEL)
precache_model(WORLD_MODEL)
}
public Event_CurWeapon(id)
{
new weaponID = read_data(2)
if(weaponID != CSW_KNIFE)
return PLUGIN_CONTINUE
set_pev(id, pev_viewmodel2, VIEW_MODEL)
set_pev(id, pev_weaponmodel2, PLAYER_MODEL)
return PLUGIN_CONTINUE
}
public fw_SetModel(entity, model[])
{
if(!is_valid_ent(entity))
return FMRES_IGNORED
if(!equali(model, OLDWORLD_MODEL))
return FMRES_IGNORED
new className[33]
entity_get_string(entity, EV_SZ_classname, className, 32)
if(equal(className, "weaponbox") || equal(className, "armoury_entity") || equal(className, "grenade"))
{
engfunc(EngFunc_SetModel, entity, WORLD_MODEL)
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
Notas:
- Diferencias entre Engine y Fakemeta: Ya fue dicho otras veces, Engine es mas eficiente que Fakemeta, pero algunos ignoran este dicho ya que hasta ahora no se encuentra problema al usarlo y/o usan ahorro de modulos
- Solo con Engine: No se puede, de una forma solo puede usarse Engine & Fakemeta y/o Fakemeta Solo, ya que si fuese solo Engine no podrias cambiar los World Model, ya que Engine no tiene acceso a una forward como SetModel en la cual se detecta la creacion de la entidad de un World Model (por decir asi).
- Engine --> Fakemeta | Fakemeta --> Engine:
PHP Code:
// 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, ...)
Suerte! Cualquier duda pueden postear.
__________________