Cofres + MySQLt
#1
Descripcion:
  • Menu para tirar cajas
  • Se puede modificar el tipo de cajas
  • Se pueden guardar (usa MySQL)

Modo de uso:
  • Tipear en say "/cajas" para abrir el menu, ahi saldra toda la configuracion

Info:
  • El codigo esta creado para un zp, se puede modificar para cualquier mod.
  • Si o si funciona con MySQL (+ el modulo MySQLt de Destro)
  • Lo subo mas que nada para que tengan una base ademas de que vean como guardar/cargar "cordenadas" en MySQL y luego crear la entidad.

Modulo:
[Modulo] MySQL Threads 1.2

Imagenes:
[Imagen: l1ZWMjU.jpg]
[Imagen: kQH7730.jpg]
[Imagen: sB8wofn.jpg]

Codigo:
Código PHP:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <mysqlt>

#define MYSQL_HOST "IP"
#define MYSQL_USER "Usuario"
#define MYSQL_PASS "Contraseña"
#define MYSQL_DATABASE "base de datos pa :v"

new const szTableBoxs[ ] = "zr2_boxs";

new 
Handle:g_hTuple;
new 
Handle:g_Connection;

new 
g_szQuery[256]

// Cantidad de cajas que se pueden guardar por mapa
#define MAX_BOXS 25

#define BOX_TYPE             EV_INT_iuser2
#define BOX_REWARD         EV_INT_iuser3

new const ENT_BOX[] = "entSupplyBox";
new const 
MODEL_BOX[] = "models/magic_box.mdl" ;

enum _:BOXTYPE {
    
BOX_AMMOPACKS,
    
BOX_HUMANS,
    
BOX_ZOMBIE,
    
BOX_GOLDS,
    
BOX_DEAD
}

enum _:BOX_STRUCT {
    
NAME_TYPE[45],
    
TYPE
}

new const 
STRUCT_BOXS[5][BOX_STRUCT] = {
    { 
"Ammo Pack's",                 BOX_AMMOPACKS },
    { 
"Puntos Humanos",                BOX_HUMANS },
    { 
"Puntos Zombie",                BOX_ZOMBIE },
    { 
"Puntos Gold",                BOX_GOLDS },
    { 
"Cajita de la muerte (Mata al jugador)",     BOX_DEAD }
}

enum _:BOX_VARs {
    
SELECT_TYPE,
    
GIVE_AWARD,
    
SPAWN_MANUALLY,
    
BOXS_INMAP,
    
RANDOM_SPAWN
}

new 
g_BoxVars[BOX_VARs]

new 
Float:g_BoxCords[MAX_BOXS][3];
new 
g_BoxType[MAX_BOXS]
new 
g_BoxReward[MAX_BOXS]

new 
szMapName32 ]

public 
plugin_init() 
{
    
register_plugin("Cofres + MySQLt""2.0""Ipolito (SpaM)")

    
register_clcmd("say /cajas""show_menu_BoxConfig")

    
register_touch(ENT_BOX"player""box__Touched")

    
MySQLx_Init( )
}

public 
plugin_precache()
    
precache_model(MODEL_BOX)

public 
MySQLx_Init( )
{
    
g_hTuple mysql_makehostMYSQL_HOSTMYSQL_USERMYSQL_PASSMYSQL_DATABASE );
    
    new 
error[256], errnum
    g_Connection 
mysql_connect(g_hTupleerrnumerror255)

    if(
errnum)
        
log_to_file("mysqlt.log""ERROR1: [%d]- [%s]"errnumerror)
    
    
mysql_performance(50506)

    
Load_BoxsCoords()
}

Load_BoxsCoords() {
    
get_mapnameszMapName31)

    
formatex(g_szQuerycharsmaxg_szQuery ), "SELECT * FROM `%s` WHERE `mapName`=^"%s^""szTableBoxsszMapName)
    
mysql_query(g_Connection"boxs__Coords"g_szQuery
}

public 
boxs__Coords(failstateerror[], errnumdata[], sizeFloat:queuetime) {  
    if(
failstate == TQUERY_CONNECT_FAILED || failstate == TQUERY_QUERY_FAILED) {  
        
log_to_file"SQL_SentrLogs.txt""Error en la consulta al MySQL [%i]: %s"errnumerror );
        return 
    } 
    else { 
        if(
mysql_num_results()) {
            static 
idBoxidBox 0;

            while(
mysql_more_results()) {
                if(
idBox mysql_num_results()) {
                    
mysql_read_result(mysql_fieldnametonum("vecNewOrigin1"), Float:g_BoxCords[idBox][0])
                    
mysql_read_result(mysql_fieldnametonum("vecNewOrigin2"), Float:g_BoxCords[idBox][1])
                    
mysql_read_result(mysql_fieldnametonum("vecNewOrigin3"), Float:g_BoxCords[idBox][2])

                    
g_BoxType[idBox] = mysql_read_result(mysql_fieldnametonum("Type"))
                    
g_BoxReward[idBox] = mysql_read_result(mysql_fieldnametonum("Reward"))

                    
idBox++;

                    
g_BoxVars[BOXS_INMAP] = idBox

                    mysql_next_row
() 
                }
                else
                    break;
            }
        }
    }
}


public 
IgnoreHandle(failstateerror[], errnumdata[], sizeFloat:queuetime) {  
    if(
failstate == TQUERY_CONNECT_FAILED || failstate == TQUERY_QUERY_FAILED)  
    {  
        
log_to_file"SQL_LOG_TQ.txt""Error en la consulta al MySQL [%i]: %s"errnumerror );
        return 
    } 
}


public 
createBox(const Float:vecOrigin[3]) 
{
    new 
iEntiEnt create_entity("info_target");
    
     if(
is_valid_ent(iEnt))
    {
        
entity_set_string(iEntEV_SZ_classnameENT_BOX);

        if(
g_BoxVars[SPAWN_MANUALLY])
        {
            
g_BoxVars[SPAWN_MANUALLY] = 0

            entity_set_int
iEntBOX_TYPESTRUCT_BOXS[g_BoxVars[SELECT_TYPE]][TYPE] );
            
entity_set_intiEntBOX_REWARDg_BoxVars[GIVE_AWARD] );
        }
        else
        {
            
entity_set_intiEntBOX_TYPESTRUCT_BOXS[g_BoxType[g_BoxVars[RANDOM_SPAWN]]][TYPE] );
            
entity_set_intiEntBOX_REWARDg_BoxReward[g_BoxVars[RANDOM_SPAWN]] );
        }

        
entity_set_model(iEntMODEL_BOX);

             
entity_set_int(iEntEV_INT_solidSOLID_BBOX);
        
entity_set_int(iEntEV_INT_movetypeMOVETYPE_PUSHSTEP);

        new 
Float:vecMins[3] = {-2.79, -0.0, -6.14}
        new 
Float:vecMax[3] = {2.421.996.35}

        
entity_set_size(iEntvecMinsvecMax);

        
entity_set_origin(iEntvecOrigin);

        
set_rendering(iEntkRenderFxGlowShell200200200kRenderNormal10);

    }
    
}

public 
box__Touched(const box, const id)

    if (!
is_valid_ent(box) || !is_user_alive(id)) return FMRES_IGNORED

    
new sClassName[32];
    
entity_get_string(boxEV_SZ_classnamesClassName31);
    
    if (
equali(sClassNameENT_BOX))
    {    
        static 
RewardReward entity_get_intboxBOX_REWARD)

        new 
szPlayerName[32]
        
get_user_name(idszPlayerNamecharsmax(szPlayerName))

        switch( 
entity_get_intboxBOX_TYPE ) )
        {
            case 
BOX_AMMOPACKS:
            {
                
// g_ammopacks[id] += Reward
                
client_print(0print_chat"[AM-ES] El jugador %s agarro un cofre con %d AP's"szPlayerNameReward)
            }
            case 
BOX_HUMANS:
            {
                
//g_puntos[id][HUMAN] += Reward
                
client_print(0print_chat"[AM-ES] El jugador %s agarro un cofre con %d puntos humanos"szPlayerNameReward)
            }
            case 
BOX_ZOMBIE:
            {
                
//g_puntos[id][ZOMBIE] += Reward
                
client_print(0print_chat"[AM-ES] El jugador %s agarro un cofre con %d puntos zombies"szPlayerNameReward)
            }

            case 
BOX_GOLDS:
            {
                
//g_puntos[id][GOLD] += Reward
                
client_print(0print_chat"[AM-ES] El jugador %s agarro un cofre con %d puntos golds"szPlayerNameReward)
            }

            case 
BOX_DEAD:
            {
                
user_kill(id)
                
client_print(0print_chat"[AM-ES] El jugador %s agarro un cofre y se murio :o"szPlayerName)
            }
        }
        
        if(
is_valid_ent(box))
            
remove_entity(box);
    }
    
    return 
FMRES_IGNORED
}

public 
spawnRandomBox()
{
    
g_BoxVars[RANDOM_SPAWN] = random_num(0g_BoxVars[BOXS_INMAP]-1)

    new 
Float:vecNewOrigin[3];

    
vecNewOrigin[0] = g_BoxCords[g_BoxVars[RANDOM_SPAWN]][0]
    
vecNewOrigin[1] = g_BoxCords[g_BoxVars[RANDOM_SPAWN]][1]
    
vecNewOrigin[2] = g_BoxCords[g_BoxVars[RANDOM_SPAWN]][2]

    
createBox(vecNewOrigin)
}


public 
show_menu_BoxConfig(id) {
    static 
szText[250], menu

    
formatex(szTextcharsmax(szText), "\yConfiguracion de cajas^n^n\wMapa:\y %s^n\wCantidad de cajas:\y %d / %d^n^n\wRecompensa:\y %d"szMapNameg_BoxVars[BOXS_INMAP], MAX_BOXSg_BoxVars[GIVE_AWARD])
    
menu menu_create(szText"menu_config_boxs")

    
formatex(szTextcharsmax(szText), "Tipo de caja:\y %s"STRUCT_BOXS[g_BoxVars[SELECT_TYPE]][NAME_TYPE])
    
menu_additem(menuszText"1")

    
menu_additem(menu"Aumentar recompensa""2")

    
menu_additem(menu"Resetear recompensa^n""3")

    
formatex(szTextcharsmax(szText), "Tirar cajita")
    
menu_additem(menuszText"4")

    
formatex(szTextcharsmax(szText), "%sPoner caja en estas cordenadas y guardar"g_BoxVars[BOXS_INMAP] >= MAX_BOXS "\d" "\w")
    
menu_additem(menuszText"5")

    
formatex(szTextcharsmax(szText), "%sEliminar todas las cajas de este mapa"g_BoxVars[BOXS_INMAP] < "\d" "\w")
    
menu_additem(menuszText"6")

    
formatex(szTextcharsmax(szText), "%sSpawnear cajita random"g_BoxVars[BOXS_INMAP] < "\d" "\w")
    
menu_additem(menuszText"7")

    
menu_setprop(menuMPROP_EXITNAME"Salir")
    
menu_display(idmenu0)
}

public 
menu_config_boxs(idmenuitem) {
    if (
item == MENU_EXIT) {

        
menu_destroy(menu)
        return
    }

    new 
Float:vecOrigin[3];
    new 
Float:vecNewOrigin[3];
    new 
Float:vecTraceDirection[3];
    new 
Float:vecTraceEnd[3];
    new 
Float:vecTraceResult[3];
    
    switch(
item)
    {
        case 
0:
        {
            
g_BoxVars[SELECT_TYPE]++

            if(
g_BoxVars[SELECT_TYPE] >= 5)
                
g_BoxVars[SELECT_TYPE] = 0
        
}
        case 
1:
        {
            if(!
g_BoxVars[SELECT_TYPE])
                
g_BoxVars[GIVE_AWARD] += 25000
            
else
                
g_BoxVars[GIVE_AWARD]++
        }
        case 
2g_BoxVars[GIVE_AWARD] = 0
        
case 3:
        {
            
g_BoxVars[SPAWN_MANUALLY] = 1


            entity_get_vector
(idEV_VEC_originvecOrigin);

            
velocity_by_aim(id64vecTraceDirection);

            
vecTraceEnd[0] = vecTraceDirection[0] + vecOrigin[0];
            
vecTraceEnd[1] = vecTraceDirection[1] + vecOrigin[1];
            
vecTraceEnd[2] = vecTraceDirection[2] + vecOrigin[2];

            
trace_line(idvecOriginvecTraceEndvecTraceResult);

            
vecNewOrigin[0] = vecTraceResult[0];
            
vecNewOrigin[1] = vecTraceResult[1];
            
vecNewOrigin[2] = vecOrigin[2];

            
createBox(vecNewOrigin)
        }
        case 
4:
        {
            if(
g_BoxVars[BOXS_INMAP] < MAX_BOXS)
            {
                
g_BoxVars[SPAWN_MANUALLY] = 1

                entity_get_vector
(idEV_VEC_originvecOrigin);

                
velocity_by_aim(id64vecTraceDirection);

                
vecTraceEnd[0] = vecTraceDirection[0] + vecOrigin[0];
                
vecTraceEnd[1] = vecTraceDirection[1] + vecOrigin[1];
                
vecTraceEnd[2] = vecTraceDirection[2] + vecOrigin[2];

                
trace_line(idvecOriginvecTraceEndvecTraceResult);

                
vecNewOrigin[0] = vecTraceResult[0];
                
vecNewOrigin[1] = vecTraceResult[1];
                
vecNewOrigin[2] = vecOrigin[2];

                
createBox(vecNewOrigin)

                
g_BoxVars[BOXS_INMAP]++

                
client_print(0print_chat"Spawn de caja guardado en las cordenadas: (%f) - (%f) - (%f)"vecNewOrigin[0], vecNewOrigin[1], vecNewOrigin[2])

                
formatexg_szQuerycharsmax(g_szQuery), "INSERT INTO `%s` (`mapName`, `vecNewOrigin1`, `vecNewOrigin2`, `vecNewOrigin3`, `Type`, `Reward`) VALUES (^"%s^", '%f', '%f', '%f', '%d', '%d')",
                
szTableBoxsszMapNamevecNewOrigin[0], vecNewOrigin[1], vecNewOrigin[2], g_BoxVars[SELECT_TYPE], g_BoxVars[GIVE_AWARD]);

                
mysql_query(g_Connection"IgnoreHandle"g_szQuery);
            }
            else
                
client_print(0print_chat"No podes guardar mas cajitas")
        }
        case 
5:
        {
            if(
g_BoxVars[BOXS_INMAP])
            {
                
formatex(g_szQuerycharsmaxg_szQuery ), "DELETE FROM `%s` WHERE `mapName`=^"%s^""szTableBoxsszMapName)
                
mysql_query(g_Connection"IgnoreHandle"g_szQuery );

                
client_print(0print_chat" Todas las cajas (%d) del mapa %s fueron eliminadas"g_BoxVars[BOXS_INMAP], szMapName)

                
g_BoxVars[BOXS_INMAP] = 0
            
}
            else
                
client_print(0print_chat"No hay cajas guardadas")
        }
        case 
6:
        {
            if(
g_BoxVars[BOXS_INMAP])
            {
                
g_BoxVars[SPAWN_MANUALLY] = 0
                spawnRandomBox
()
            }
            else
                
client_print(0print_chat"No hay cajita random para spawnear")
        }
    }
    
    
show_menu_BoxConfig(id)



Estructura base de datos:


Código PHP:
CREATE TABLE `zr2_boxs` (
  `
mapNamevarchar(32COLLATE ascii_bin NOT NULL,
  `
vecNewOrigin1double NOT NULL,
  `
vecNewOrigin2double NOT NULL,
  `
vecNewOrigin3double NOT NULL,
  `
Typeint(2NOT NULL,
  `
Rewardint(10NOT NULL
ENGINE=InnoDB DEFAULT CHARSET=ascii COLLATE=ascii_bin

Para que el spawn sea automatico y al azar (random), tienen que agregar esto donde ustedes quieran.. puede ser cuando empieza la ronda, cuando termina, cuando matan a un jugador, etc..

Código PHP:
spawnRandomBox() 

Seguro se puede mejorar un par de cositas. Salu2
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)