Veteran Member
Join Date: Apr 2009
Location: Buenos Aires
|
12-25-2009
, 02:24
[ZP] Crear Niveles + Guardarlos con Nvault [Update 2]
|
#1
|
Crear Niveles en el Zombie Plague por AmmoPacks
Lo explique todo en el code, esta muy bueno, tiene niveles, con sonidos y prints, y como guardarlos, con nvault
y hago un up, para qe lo vean, y depaso noten que optimize varias partes partes del code y ahora funciona mejor supongo ^^
hace paso a paso dentro del .sma de su zp v4.2 (usen v4.3 si quieren pero no doi soporte a eso)
Update 1 !!!
- Arregle cosas menores, ahora si funciona al 100%
Update 2 !!!
Fecha de la Ultima Actualizacion 2|04|2010
- Agregado donde se debe poner la funcion de checkeo de nivel (gracias kiske, los aqe de tu post, ya qe la manera es la misma, de donde se ganan los ap)
- Agregado al Guardado de Nvault, el guardado de la clase zombie qe este usando el player
PHP Code:
// Creamos La varible del nivel new g_level[33]
// aca defino qe la cantidad maxima de niveles va a ser 10 // puede modificarse, siempre y cuando con respecto a su cantidad // de niveles haya en la const LEVELS #define MAXLEVELS 10
// Creo los niveles, el requisito en AmmoPacks para cada nivel // si aumentan el valor del define MAXLEVELS, deberan aumentar // los niveles en la const LEVELS en cantidades iguales new const LEVELS[MAXLEVELS] = { 0, 20, 30, 40, 50, 60, 70, 80, 90, 100 }
// debajo de g_primaryitems, agregamos esta const // no conte bien las armas, eso lo ajustaran ustedes // lo que si, no son frags lo qe requiere, sino nivel new const g_levelprimary[] = { 1, 2, 5, 2, 1, 3, 3, 7, 9, 10, 10, 10, 4, 1 }
// y creamos uno para las pistolas (armas secundarias) new const g_levelsecundary[] = { 1, 3, 10, 7, 3, 4 }
// Creamos un sonido, para qe se reprodusca cuando subamos de nivel // No se Preocupen, ese sonido esta en el Engine del HL new const LevelUp[] = "plats/elevbell1.wav"
// lo precacheamos public plugin_precache() { precache_sound(LevelUp) }
// Creamos un public para qe los niveles Funcionen public check_player_level(id) { // Hacemos un while para detectar la subida de nivel while (g_ammopacks[id] >= LEVELS[g_level[id]]) { // Aumentamos su nivel g_level[id]++ // Le mandamos un print, indicando qe subio de nivel, y poniendo su nuevo nivel zp_colored_print(id, "^x04[ZP] Subiste al Nivel^x03 %d ^x04!!!", g_level[id]) // Le mandamos un sonido, indicando qe subimos de nivel client_cmd(id, "spk %s", LevelUp) } }
// Nos dirigimos a la Forward: public fw_PlayerKilled(victim, attacker, shouldgib) {
// Adentro de este Public, buscamos la siguiente linea: if (g_zombie[attacker] && (!g_nemesis[attacker] || !get_pcvar_num(cvar_nemignoreammo))) g_ammopacks[attacker] += get_pcvar_num(cvar_ammoinfect) // Agregamos para qe revise el nivel check_player_level(attacker) }
// Ahora nos dirigimos a la Forward: public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type) {
// Y adentro de este Public buscamos esta linea: g_ammopacks[attacker]++ // Agregamos para qe revise el nivel check_player_level(attacker) // En este mismo Public buscamos esta linea que se encuentra mas abajo: g_ammopacks[attacker] += get_pcvar_num(cvar_ammoinfect) // ammo packs given to zombie for infection // Agregamos para qe revise el nivel check_player_level(attacker) }
// Ahora buscamos la Funcion: infection_explode(ent) { // Aca adentro buscamos la siguiente Linea: g_ammopacks[attacker] += get_pcvar_num(cvar_ammoinfect) // ammo packs given to zombie for infection } // Ahora vamos a reiniciar la variable g_level[id] // para que al empezar sean nivel 1 // vamos a reset_vars(id, resetall) reset_vars(id, resetall) { // code // en resetall ponemos g_level[id] = 1 if (resetall) { g_level[id] = 1 } }
// OK Ya tenemos los niveles, y todo checkeadito ;D // Ahora pasemos a restringirlos // Vamos a public show_menu_buy1(taskid) // y donde dice // 1-7. Weapon List todo lo de abajo // Vamos a modificarlo por este otro for (weap = WPN_STARTID; weap < min(WPN_STARTID+7, WPN_MAXIDS); weap++) { // Si el nivel qe tenemos es igual al que pide el arma if(g_level[id] >= g_levelprimary[weap]) { // habilitamos el arma // al final de todo ponemos // g_levelprimary[weap] // para qe detecte el nivel de cada arma len += formatex(menu[len], sizeof menu - 1 - len, "\r%d.\w %s \y[Nivel %d]^n", weap-WPN_STARTID+1, WEAPONNAMES[get_weaponid(g_primary_items[weap])], g_levelprimary[weap]) } // Sino else { // no la habilitamos len += formatex(menu[len], sizeof menu - 1 - len, "\d%d. %s [Nivel %d]^n", weap-WPN_STARTID+1, WEAPONNAMES[get_weaponid(g_primary_items[weap])], g_levelprimary[weap]) } }
// despues buscamos show_menu_buy2(id) // y hacemos lo mismo // donde dice // 1-6. Weapon List // lo de abajo lo reemplazamos por for (weap = 0; weap < sizeof g_secondary_items; weap++) { if(g_level[id] >= g_levelsecundary[weap]) { // habilitamos el arma // al final de todo ponemos // g_levelsecundary[weap] // para qe detecte el nivel de cada arma len += formatex(menu[len], sizeof menu - 1 - len, "^n\r%d.\w %s \y[Nivel %d]", weap+1, WEAPONNAMES[get_weaponid(g_secondary_items[weap])], g_levelsecundary[weap]) } // Sino else { // no la habilitamos len += formatex(menu[len], sizeof menu - 1 - len, "^n\d%d. %s [Nivel %d]", weap+1, WEAPONNAMES[get_weaponid(g_secondary_items[weap])], g_levelsecundary[weap]) } }
// Ahora vamos a // public menu_buy1(id, key) // y reemplazamos TODA la funcion por esto // o como les guste copien lo del level nomas public menu_buy1(id, key) { // Zombies or survivors get no guns if (g_zombie[id] || g_survivor[id] || !is_user_alive(id)) return PLUGIN_HANDLED; // Special keys / weapon list exceeded if (key >= MENU_KEY_AUTOSELECT || WPN_SELECTION >= WPN_MAXIDS) { switch (key) { case MENU_KEY_AUTOSELECT: // toggle auto select { WPN_AUTO_ON = 1 - WPN_AUTO_ON } case MENU_KEY_NEXT: // next/back { if (WPN_STARTID+7 < WPN_MAXIDS) WPN_STARTID += 7 else WPN_STARTID = 0 } case MENU_KEY_EXIT: // exit { return PLUGIN_HANDLED; } } // Show buy menu again show_menu_buy1(id) return PLUGIN_HANDLED; } if(g_level[id] < g_levelprimary[WPN_SELECTION]) { show_menu_buy1(id) client_print(id, print_center, "No Tenes Nivel Suficiente Para usar esta Arma (Nivel Requerido %d)", g_primary_level[WPN_SELECTION]) zp_colored_print(id, "^x04[ZP]^x01 No Tenes Nivel Suficiente Para usar esta Arma ^x03(Nivel Requerido %d)", g_primary_level[WPN_SELECTION]) return PLUGIN_HANDLED; } // Store selected weapon id WPN_AUTO_PRI = WPN_SELECTION // Buy primary weapon buy_primary_weapon(id, WPN_AUTO_PRI) // Show pistols menu show_menu_buy2(id) return PLUGIN_HANDLED; }
// lo mismo con el menu 2 // buscan public menu_buy2(id, key) // reemplazan todo lo que haya por la funcion entera // o copian la parte de level
// Buy Menu 2 public menu_buy2(id, key) { // Zombies or survivors get no guns if (g_zombie[id] || g_survivor[id] || !is_user_alive(id)) return PLUGIN_HANDLED; // Special keys / weapon list exceeded if (key >= sizeof g_secondary_items) { // Toggle autoselect if (key == MENU_KEY_AUTOSELECT) WPN_AUTO_ON = 1 - WPN_AUTO_ON // Reshow menu unless user exited if (key != MENU_KEY_EXIT) show_menu_buy2(id) return PLUGIN_HANDLED; } // Store selected weapon WPN_AUTO_SEC = key
// Drop secondary gun again, in case we picked another (bugfix) drop_weapons(id, 2) // Get weapon index static weaponid weaponid = get_weaponid(g_secondary_items[key]) // Give the new weapon with full ammo fm_give_item(id, g_secondary_items[key]) fm_set_user_bpammo(id, weaponid, MAXBPAMMO[weaponid]) // si no tiene nivel suficiente we // la bloquea, el print lo explica todo :B if(g_level[id] < g_levelsecundary[key]) { show_menu_buy2(id) client_print(id, print_center, "No Tenes Nivel Suficiente Para usar esta Arma (Nivel Requerido %d)", g_secondary_level[key]) zp_colored_print(id, "^x04[ZP]^x01 No Tenes Nivel Suficiente Para usar esta Arma ^x03(Nivel Requerido %d)", g_secondary_level[key]) return PLUGIN_HANDLED; } return PLUGIN_HANDLED; }
// Ahora paso a hacer un sistema de guardado para nuestros niveles y ammopacks // a ninguno le gusta un sistema de niveles sin un buen guardado xD // // Modulo a usar: NVAULT // recuerden poner arriba de todo de su zp // #include <nvault> // // y cercionense de qe en el modules.ini, el modulo nvault este sin el ; atras // // Empezemos, vamos abajo de todo del plugin o donde quieran // y creamos los publics para cargar y guardar
// Public de Carga public Load(id) { // Una simple Variable Timestamp, deben crearla new timestamp // creamos un vault nuevo, y entre las comillas "" // ponen el nombre qe quieren new g_Vault = nvault_open("zombie_vault")
// Creamos la Key, qe seria el nombre // la Data, qe sera lo qe va a contener, a los niveles y los AP // y por ultimo szAmmos y szLevel, son para poder guardar cada uno new name[32], key[40], data[200], szAmmos[15], szLevel[15], szClassZ[15] // obtenemos el nombre para Key get_user_name(id, name, charsmax(name)) // esto es por si usa simbolos o espacios formatex(key, charsmax(key), "^"%s^"", name) // Hacemos un lookup, para poder guardar mas de una variable if(nvault_lookup(g_Vault, key, data, charsmax(data), timestamp)) { // Hacemos un Parse para la data (para separarla y ponen las cosas en su lugar correspondiente), // qe contenga los ammos y el level, de esta manera: parse(data, szAmmos, charsmax(szAmmos), szLevel, charsmax(szLevel), szClassZ, charsmax(szClassZ)) // Pasamos los Ammo packs, la clase zombie // y el level, adentro del vault g_ammopacks[id] = str_to_num(szAmmos) g_level[id] = str_to_num(szLevel) g_zombieclassnext[id] = str_to_num(szClassZ) } // y lo cerramos nvault_close(g_Vault) }
// Public de Guardado public Save(id) { // Creamos el vaul, con el mismo nombre qe el anterior, // tanto como la variable (g_Vault), como el nombre del vault // en este caso "zombie_vault" new g_Vault = nvault_open("zombie_vault") // Creamos la Key, qe seria el nombre // y un Valor, para guardar los AP, el LEVEL y la clase de zombie qe este usando el player new name[32], key[40], szValue[64] // obtenemos el nombre para Key get_user_name(id, name, charsmax(name)) // esto es por si usa simbolos o espacios formatex(key, charsmax(key), "^"%s^"", name) // le damos un formato al value, para 3 variables formatex(szValue, charsmax(szValue), "%d %d %d", g_ammopacks[id], g_level[id], g_zombieclassnext[id]) // Seteamos al vault, el valor y el nombre nvault_set(g_Vault, key, szValue) // cerramos nvault_close(g_Vault) }
// ahora van a client_putinserver, y abajo de todo, ponen
public client_putinserver(id) { // abajo de todo // Cargamos Load(id) }
// y en client_disconnect
public client_disconnect(id) { // Guardamos Save(id) }
// ahora vamos a registrar unas forwards de fakemeta // para qe si el sv se cae de 3 diferentes maneras, tmb se guarden los ammos // // Van a plugin_init // y registran estas 3 forwards
public plugin_init() { // como veran las 3 nos llevan al mismo public register_forward(FM_Sys_Error, "fw_ServerOff") register_forward(FM_GameShutdown, "fw_ServerOff") register_forward(FM_ServerDeactivate, "fw_ServerOff") }
// creamos el public fw_ServerOff(), y adentro hacemos un Save(id)
public fw_ServerOff() { // Como pudieron notar // el serverOff no tiene ID // procedemos a crear un ID, con un LOOP static id; for (id = 1; id <= g_maxplayers; id++) { // checkeamos si esta conectado // para qe no lo haga 32 veces, // por qe el sv, puede llegar a estar 32/32 o no // y lo repita las veces nesesarias if(is_user_connected(id)) { // Guardamos Save(id) } } }
// tambien pueden guardar los ap cada vez que termina la ronda (si quieren) // van a public logevent_round_end() public logevent_round_end() { // code code code // code code code // code code code // abajo de todo el public ponemos lo mismo que hicimos con "fw_ServerOff" // loop de todos los players static id; for (id = 1; id <= g_maxplayers; id++) { // checkeamos si esta conectado // para qe no lo haga 32 veces, // por qe el sv, puede llegar a estar 32/32 o no // y lo repita las veces nesesarias if(is_user_connected(id)) { // Guardamos Save(id) } } } // Bueno doi por finalizado el tuto xP // Fecha de la Ultima Actualizacion 2|04|2010 // Agregados los datos de donde se debe poner la funcion de checkeo de nivel // Agregado al nvault, el guardado de la clase zombie elejida :D
Saludos =)
Gracias a L// que me ayudo con Nvault, y las forwards del fakemeta
Gracias a Kiske que me ayudo y me explico sobre los loops y me ayudo con algunas cosas de menu ^^
__________________
"There is no knowledge, that is not power"
Last edited by eXacT; 04-02-2010 at 18:44.
|
|