Raised This Month: $51 Target: $400
 12% 

[ZP] Crear Niveles + Guardarlos con Nvault [Update 2]


  
 
 
Thread Tools Display Modes
Author Message
eXacT
Veteran Member
Join Date: Apr 2009
Location: Buenos Aires
Old 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] = { 02030405060708090100 }

// 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[] = { 1252133791010104}

// y creamos uno para las pistolas (armas secundarias)
new const g_levelsecundary[] = { 131073}

// 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(victimattackershouldgib)
{

    
// 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(victiminflictorattackerFloat:damagedamage_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(idresetall)
{
        
// 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_STARTIDweap min(WPN_STARTID+7WPN_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 len"\r%d.\w %s \y[Nivel %d]^n"weap-WPN_STARTID+1WEAPONNAMES[get_weaponid(g_primary_items[weap])], g_levelprimary[weap])
    }
    
// Sino
    
else
    {
        
// no la habilitamos
        
len += formatex(menu[len], sizeof menu len"\d%d. %s [Nivel %d]^n"weap-WPN_STARTID+1WEAPONNAMES[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 0weap sizeof g_secondary_itemsweap++)
{
    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 len"^n\r%d.\w %s  \y[Nivel %d]"weap+1WEAPONNAMES[get_weaponid(g_secondary_items[weap])], g_levelsecundary[weap])
    }
    
// Sino
    
else
    {
        
// no la habilitamos
        
len += formatex(menu[len], sizeof menu len"^n\d%d. %s [Nivel %d]"weap+1WEAPONNAMES[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(idkey)
{
    
// 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 WPN_AUTO_ON
            
}
            case 
MENU_KEY_NEXT// next/back
            
{
                if (
WPN_STARTID+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(idprint_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(idWPN_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(idkey)
{    
    
// 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 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(id2)
    
    
// Get weapon index
    
static weaponid
    weaponid 
get_weaponid(g_secondary_items[key])
    
    
// Give the new weapon with full ammo
    
fm_give_item(idg_secondary_items[key])
    
fm_set_user_bpammo(idweaponidMAXBPAMMO[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(idprint_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(idnamecharsmax(name))
    
    
// esto es por si usa simbolos o espacios
    
formatex(keycharsmax(key), "^"%s^""name)
    
    
// Hacemos un lookup, para poder guardar mas de una variable
    
if(nvault_lookup(g_Vaultkeydatacharsmax(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(dataszAmmoscharsmax(szAmmos), szLevelcharsmax(szLevel), szClassZcharsmax(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(idnamecharsmax(name))
    
    
// esto es por si usa simbolos o espacios
    
formatex(keycharsmax(key), "^"%s^""name)
    
    
// le damos un formato al value, para 3 variables
    
formatex(szValuecharsmax(szValue), "%d %d %d"g_ammopacks[id], g_level[id], g_zombieclassnext[id])
    
    
// Seteamos al vault, el valor y el nombre
    
nvault_set(g_VaultkeyszValue)
    
    
// 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 1id <= g_maxplayersid++)
    {
    
    
// 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 1id <= g_maxplayersid++)
    {
    
    
// 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 ^^
Attached Files
File Type: sma Get Plugin or Get Source (zp_tut_levels+nvault_save.sma - 3741 views - 13.2 KB)
__________________

"There is no knowledge, that is not power"

Last edited by eXacT; 04-02-2010 at 18:44.
eXacT is offline
Send a message via MSN to eXacT Send a message via Skype™ to eXacT
Kiske
Veteran Member
Join Date: May 2009
Old 12-25-2009 , 02:34   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#2

Quote:
Originally Posted by eXacT
// por qe el sv, no puede llegar a estar 32/32
porque no puede ? :S
__________________

Kiske is offline
Send a message via Skype™ to Kiske
eXacT
Veteran Member
Join Date: Apr 2009
Location: Buenos Aires
Old 12-25-2009 , 02:37   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#3

Quote:
Originally Posted by Kiske View Post
porque no puede ? :S
me confundi, ademas me olvide de los creditos a vos, con ese loop, xP

listo ya lo edite, pasa qe lo hize muy rapdio, y le pifie a las palabras
__________________

"There is no knowledge, that is not power"
eXacT is offline
Send a message via MSN to eXacT Send a message via Skype™ to eXacT
Kiske
Veteran Member
Join Date: May 2009
Old 12-25-2009 , 02:43   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#4

Me di cuenta de otra cosa, pusiste "g_maxplayers" pero nunca creaste esa variable..
Y cuando la creas te falta poner:
PHP Code:
g_maxplayers get_maxplayers() 
__________________

Kiske is offline
Send a message via Skype™ to Kiske
eXacT
Veteran Member
Join Date: Apr 2009
Location: Buenos Aires
Old 12-25-2009 , 02:49   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#5

Quote:
Originally Posted by Kiske View Post
Me di cuenta de otra cosa, pusiste "g_maxplayers" pero nunca creaste esa variable..
Y cuando la creas te falta poner:
PHP Code:
g_maxplayers get_maxplayers() 

es q, esto va derecho en el zombieplague, cosa qe eso ya esta creado ahi, por aso no lo hize
__________________

"There is no knowledge, that is not power"
eXacT is offline
Send a message via MSN to eXacT Send a message via Skype™ to eXacT
01101101
BANNED
Join Date: Nov 2009
Location: 9`su 09`n0n7e`r0f76a
Old 12-25-2009 , 08:12   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#6

Ya hay como 10 "tutoriales" (ya que no son tutoriales) de esta misma mierda. Piensan seguir poniendo?

Y con como lo tenes hecho, primero que si entras y sos level medio alto, te va a kickear por overflow. Segundo, si subis 2 levels juntos te va a aparecer como subiste uno solo.
01101101 is offline
[B.F.T] JuaNCruz
BANNED
Join Date: Dec 2009
Location: Argentina, Mendoza
Old 12-25-2009 , 11:21   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#7

Buen TUTO
[B.F.T] JuaNCruz is offline
Send a message via MSN to [B.F.T] JuaNCruz
TucanN#
Veteran Member
Join Date: May 2009
Location: Argentina, Mendoza
Old 12-25-2009 , 11:32   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#8

si la verdad hay 500 tutos sobre esto, la verdad ya no se que usar porque a todos les encuentran algo malo
TucanN# is offline
Send a message via MSN to TucanN#
tomjz
Senior Member
Join Date: Dec 2009
Old 12-25-2009 , 15:29   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#9

si loco es posta eso, hay tantos de lvl que no se sabe cual poner.. speed vos que criticas tanto hace uno vos q vos tenes la posta y el q hizo el primer sistema de niveles fuiste vos y el mismo que esta posteando ahora "eXacT" lo pidio y se armo todo un puterio con la comunidad Positive etc..
tomjz is offline
eXacT
Veteran Member
Join Date: Apr 2009
Location: Buenos Aires
Old 12-25-2009 , 15:55   Re: [ES][ZP][TUT] Crear Niveles + Guardarlos con Nvault
#10

Quote:
Originally Posted by tomjz View Post
si loco es posta eso, hay tantos de lvl que no se sabe cual poner.. speed vos que criticas tanto hace uno vos q vos tenes la posta y el q hizo el primer sistema de niveles fuiste vos y el mismo que esta posteando ahora "eXacT" lo pidio y se armo todo un puterio con la comunidad Positive etc..
sos TJN, o Dementhor ?
__________________

"There is no knowledge, that is not power"
eXacT is offline
Send a message via MSN to eXacT Send a message via Skype™ to eXacT
 



Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT -4. The time now is 22:38.


Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
Theme made by Freecode