|
#1
|
||||
|
||||
|
Miren encontre este tutorial para hacerme un zombie plague + lvl y miren no encuentro este archivo : new g_level[33]
En qué parte esta eso ? el tutorial es éste : [SPOILER]// 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, "^nr%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, "^nd%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 Requeri do %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 Requeri do %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) [/SPOILER] |