meTaLiCroSS |
07-15-2009 18:15 |
Cambiar los Models de las Armas
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 :D
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 :P)
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.
|