04/04/2019, 09:06 AM
(Última modificación: 04/04/2019, 09:23 AM por Ipolito. Edited 6 times in total.)
Descripcion:
Modo de uso:
Info:
Modulo:
[Modulo] MySQL Threads 1.2
Imagenes:
Codigo:
Estructura base de datos:
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..
Seguro se puede mejorar un par de cositas. Salu2
- 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:
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 szMapName[ 32 ]
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_makehost( MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DATABASE );
new error[256], errnum
g_Connection = mysql_connect(g_hTuple, errnum, error, 255)
if(errnum)
log_to_file("mysqlt.log", "ERROR1: [%d]- [%s]", errnum, error)
mysql_performance(50, 50, 6)
Load_BoxsCoords()
}
Load_BoxsCoords() {
get_mapname( szMapName, 31)
formatex(g_szQuery, charsmax( g_szQuery ), "SELECT * FROM `%s` WHERE `mapName`=^"%s^"", szTableBoxs, szMapName)
mysql_query(g_Connection, "boxs__Coords", g_szQuery)
}
public boxs__Coords(failstate, error[], errnum, data[], size, Float:queuetime) {
if(failstate == TQUERY_CONNECT_FAILED || failstate == TQUERY_QUERY_FAILED) {
log_to_file( "SQL_SentrLogs.txt", "Error en la consulta al MySQL [%i]: %s", errnum, error );
return
}
else {
if(mysql_num_results()) {
static idBox; idBox = 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(failstate, error[], errnum, data[], size, Float: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", errnum, error );
return
}
}
public createBox(const Float:vecOrigin[3])
{
new iEnt; iEnt = create_entity("info_target");
if(is_valid_ent(iEnt))
{
entity_set_string(iEnt, EV_SZ_classname, ENT_BOX);
if(g_BoxVars[SPAWN_MANUALLY])
{
g_BoxVars[SPAWN_MANUALLY] = 0
entity_set_int( iEnt, BOX_TYPE, STRUCT_BOXS[g_BoxVars[SELECT_TYPE]][TYPE] );
entity_set_int( iEnt, BOX_REWARD, g_BoxVars[GIVE_AWARD] );
}
else
{
entity_set_int( iEnt, BOX_TYPE, STRUCT_BOXS[g_BoxType[g_BoxVars[RANDOM_SPAWN]]][TYPE] );
entity_set_int( iEnt, BOX_REWARD, g_BoxReward[g_BoxVars[RANDOM_SPAWN]] );
}
entity_set_model(iEnt, MODEL_BOX);
entity_set_int(iEnt, EV_INT_solid, SOLID_BBOX);
entity_set_int(iEnt, EV_INT_movetype, MOVETYPE_PUSHSTEP);
new Float:vecMins[3] = {-2.79, -0.0, -6.14}
new Float:vecMax[3] = {2.42, 1.99, 6.35}
entity_set_size(iEnt, vecMins, vecMax);
entity_set_origin(iEnt, vecOrigin);
set_rendering(iEnt, kRenderFxGlowShell, 200, 200, 200, kRenderNormal, 10);
}
}
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(box, EV_SZ_classname, sClassName, 31);
if (equali(sClassName, ENT_BOX))
{
static Reward; Reward = entity_get_int( box, BOX_REWARD)
new szPlayerName[32]
get_user_name(id, szPlayerName, charsmax(szPlayerName))
switch( entity_get_int( box, BOX_TYPE ) )
{
case BOX_AMMOPACKS:
{
// g_ammopacks[id] += Reward
client_print(0, print_chat, "[AM-ES] El jugador %s agarro un cofre con %d AP's", szPlayerName, Reward)
}
case BOX_HUMANS:
{
//g_puntos[id][HUMAN] += Reward
client_print(0, print_chat, "[AM-ES] El jugador %s agarro un cofre con %d puntos humanos", szPlayerName, Reward)
}
case BOX_ZOMBIE:
{
//g_puntos[id][ZOMBIE] += Reward
client_print(0, print_chat, "[AM-ES] El jugador %s agarro un cofre con %d puntos zombies", szPlayerName, Reward)
}
case BOX_GOLDS:
{
//g_puntos[id][GOLD] += Reward
client_print(0, print_chat, "[AM-ES] El jugador %s agarro un cofre con %d puntos golds", szPlayerName, Reward)
}
case BOX_DEAD:
{
user_kill(id)
client_print(0, print_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(0, g_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(szText, charsmax(szText), "\yConfiguracion de cajas^n^n\wMapa:\y %s^n\wCantidad de cajas:\y %d / %d^n^n\wRecompensa:\y %d", szMapName, g_BoxVars[BOXS_INMAP], MAX_BOXS, g_BoxVars[GIVE_AWARD])
menu = menu_create(szText, "menu_config_boxs")
formatex(szText, charsmax(szText), "Tipo de caja:\y %s", STRUCT_BOXS[g_BoxVars[SELECT_TYPE]][NAME_TYPE])
menu_additem(menu, szText, "1")
menu_additem(menu, "Aumentar recompensa", "2")
menu_additem(menu, "Resetear recompensa^n", "3")
formatex(szText, charsmax(szText), "Tirar cajita")
menu_additem(menu, szText, "4")
formatex(szText, charsmax(szText), "%sPoner caja en estas cordenadas y guardar", g_BoxVars[BOXS_INMAP] >= MAX_BOXS ? "\d" : "\w")
menu_additem(menu, szText, "5")
formatex(szText, charsmax(szText), "%sEliminar todas las cajas de este mapa", g_BoxVars[BOXS_INMAP] < 1 ? "\d" : "\w")
menu_additem(menu, szText, "6")
formatex(szText, charsmax(szText), "%sSpawnear cajita random", g_BoxVars[BOXS_INMAP] < 1 ? "\d" : "\w")
menu_additem(menu, szText, "7")
menu_setprop(menu, MPROP_EXITNAME, "Salir")
menu_display(id, menu, 0)
}
public menu_config_boxs(id, menu, item) {
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 2: g_BoxVars[GIVE_AWARD] = 0
case 3:
{
g_BoxVars[SPAWN_MANUALLY] = 1
entity_get_vector(id, EV_VEC_origin, vecOrigin);
velocity_by_aim(id, 64, vecTraceDirection);
vecTraceEnd[0] = vecTraceDirection[0] + vecOrigin[0];
vecTraceEnd[1] = vecTraceDirection[1] + vecOrigin[1];
vecTraceEnd[2] = vecTraceDirection[2] + vecOrigin[2];
trace_line(id, vecOrigin, vecTraceEnd, vecTraceResult);
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(id, EV_VEC_origin, vecOrigin);
velocity_by_aim(id, 64, vecTraceDirection);
vecTraceEnd[0] = vecTraceDirection[0] + vecOrigin[0];
vecTraceEnd[1] = vecTraceDirection[1] + vecOrigin[1];
vecTraceEnd[2] = vecTraceDirection[2] + vecOrigin[2];
trace_line(id, vecOrigin, vecTraceEnd, vecTraceResult);
vecNewOrigin[0] = vecTraceResult[0];
vecNewOrigin[1] = vecTraceResult[1];
vecNewOrigin[2] = vecOrigin[2];
createBox(vecNewOrigin)
g_BoxVars[BOXS_INMAP]++
client_print(0, print_chat, "Spawn de caja guardado en las cordenadas: (%f) - (%f) - (%f)", vecNewOrigin[0], vecNewOrigin[1], vecNewOrigin[2])
formatex( g_szQuery, charsmax(g_szQuery), "INSERT INTO `%s` (`mapName`, `vecNewOrigin1`, `vecNewOrigin2`, `vecNewOrigin3`, `Type`, `Reward`) VALUES (^"%s^", '%f', '%f', '%f', '%d', '%d')",
szTableBoxs, szMapName, vecNewOrigin[0], vecNewOrigin[1], vecNewOrigin[2], g_BoxVars[SELECT_TYPE], g_BoxVars[GIVE_AWARD]);
mysql_query(g_Connection, "IgnoreHandle", g_szQuery);
}
else
client_print(0, print_chat, "No podes guardar mas cajitas")
}
case 5:
{
if(g_BoxVars[BOXS_INMAP])
{
formatex(g_szQuery, charsmax( g_szQuery ), "DELETE FROM `%s` WHERE `mapName`=^"%s^"", szTableBoxs, szMapName)
mysql_query(g_Connection, "IgnoreHandle", g_szQuery );
client_print(0, print_chat, " Todas las cajas (%d) del mapa %s fueron eliminadas", g_BoxVars[BOXS_INMAP], szMapName)
g_BoxVars[BOXS_INMAP] = 0
}
else
client_print(0, print_chat, "No hay cajas guardadas")
}
case 6:
{
if(g_BoxVars[BOXS_INMAP])
{
g_BoxVars[SPAWN_MANUALLY] = 0
spawnRandomBox()
}
else
client_print(0, print_chat, "No hay cajita random para spawnear")
}
}
show_menu_BoxConfig(id)
}
Estructura base de datos:
Código PHP:
CREATE TABLE `zr2_boxs` (
`mapName` varchar(32) COLLATE ascii_bin NOT NULL,
`vecNewOrigin1` double NOT NULL,
`vecNewOrigin2` double NOT NULL,
`vecNewOrigin3` double NOT NULL,
`Type` int(2) NOT NULL,
`Reward` int(10) NOT 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..
Seguro se puede mejorar un par de cositas. Salu2