Deathrun Timer [Edicion]
- SI | german
- Directivo Cyan
-
Nivel 2700
- Mensajes: 2721
- Registrado: 05 Feb 2015, 09:36
- Ubicación: Ciudad de Buenos Aires
- Contactar:
-
Insignia Moderador
Insignia Control
-
Loading…
Deathrun Timer [Edicion]
La idea es que el timer pueda tener un comando que le envie a la base de datos cada x cantidad de dias, y que las tablas se vacien
Osea que cada 1 mes los tops se reinicien solos
Osea que cada 1 mes los tops se reinicien solos
Código: Seleccionar todo
/*
+--------------------------------------+
| DeathRun Timer - 2015-2016 |
| |
| Author: |
| deniS[MD] a.k.a icimaro1337 |
| Credits: |
| xPaw[EE] |
| Mistrick[RU] |
| Keniski[RU] |
| Klippy[RS] |
+--------------------------------------+
de pus si city?
de scos de tot authid
*/
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <nvault>
#include <sqlx>
#include <geoip>
#include <fakemeta_util>
#include <dhudmessage>
//#pragma semicolon 1
// Here you can configure main settings
#define COLORCHAT
#define ADMIN_ACCESS ADMIN_LEVEL_A
new const g_szPrefix[] = " SIG ";
const MAX_PLAYERS = 32;
// Here you stop
#if defined COLORCHAT
#include <colorchat>
#endif
/* Macro */
#define set_bit(%1,%2) (%1 |= (1<<%2))
#define get_bit(%1,%2) (%1 & (1<<%2))
#define clr_bit(%1,%2) (%1 &= ~(1<<%2))
/* Macro */
new const g_szVersion[] = "0.1";
new const g_szTableName[] = "DEATHRUN_STATS";
new g_pWebLink;
new Handle:g_hSqlTuple;
new bool:g_bSqlite;
enum _:eTimer
{
START,
STOP
};
new g_szTimerModels[eTimer][] =
{
"models/deathrun/timer/timer_start.mdl",
"models/deathrun/timer/timer_stop.mdl"
};
new g_szTimerName[eTimer][] =
{
"Start",
"Stop"
};
new Float:g_flTimerAngles[4] =
{
0.0,
90.0,
180.0,
270.0
};
new g_iPlayerTimer[MAX_PLAYERS + 1],g_bConnected, g_bAlive, g_bStarted,Float:g_flStartTime[MAX_PLAYERS + 1],
Float:g_flFinishTime[MAX_PLAYERS + 1],g_iVault,g_iMsgRoundTime,g_iTimerAngles[eTimer],g_iTimer[eTimer],
Float:g_vTimerOrigin[eTimer][3],g_szMapName[64],Trie:g_tStarts, Trie:g_tStops,bool:g_bTimerFound;
//new g_iHudSyncObj;
public plugin_precache() for (new i = 0; i < eTimer; i++) precache_model(g_szTimerModels[i]);
public plugin_init()
{
register_plugin("DeathRun Timer", g_szVersion, "deniS");
g_pWebLink = register_cvar("dr_timer_web_link", "http://evils.ro/deathrun_timer_web");// link to web files
register_cvar("dr_timer_sql_host", "sql11.freesqldatabase.com");
register_cvar("dr_timer_sql_user", "sql11202240");
register_cvar("dr_timer_sql_pass", "vyS3IeWBCP");
register_cvar("dr_timer_sql_db", "sql11202240"); /* If you don't have web server, you can use local stats, just add .db like deathrun_stats.db and enable sqlite module! */
get_mapname(g_szMapName, charsmax(g_szMapName));
g_tStarts = TrieCreate();
g_tStops = TrieCreate();
new i, iSize;
new const szStarts[][] =
{
"counter_start", "clockstartbutton", "firsttimerelay", "but_start", "counter_start_button",
"multi_start", "timer_startbutton", "start_timer_emi", "gogogo"
};
iSize = sizeof(szStarts);
for (i = 0; i < iSize; i++) TrieSetCell(g_tStarts, szStarts[i], 1);
new const szStops[][] =
{
"counter_off", "clockstopbutton", "clockstop", "but_stop", "counter_stop_button",
"multi_stop", "stop_counter", "m_counter_end_emi"
};
iSize = sizeof(szStops);
for (i = 0; i < iSize; i++) TrieSetCell(g_tStops, szStops[i], 1);
new iEntity = -1;//de modificat..
while ((iEntity = find_ent_by_class(iEntity, "func_button")) != 0)
{
new szTargetName[64];
entity_get_string(iEntity, EV_SZ_targetname, szTargetName, charsmax(szTargetName));
if (TrieKeyExists(g_tStarts, szTargetName) && TrieKeyExists(g_tStops, szTargetName))
{
if (!g_bTimerFound) g_bTimerFound = true;
//else g_bTimerFound = false;
//g_bTimerFound = false + ! ^x2
//g_bTimerFound = true;
break;
}
}
if (!g_bTimerFound)
{
TrieDestroy(g_tStarts);
TrieDestroy(g_tStops);
/*new szDir[200],szFile[200];
formatex(szDir, charsmax(szDir), "addons/amxmodx/data/vault/deathrun/timer");
if(!dir_exists(szDir)) mkdir(szDir)
formatex(szFile, charsmax(szFile), "%s/%s.vault", szDir,g_szMapName);
if(!file_exists(szFile)) write_file(szFile,"",-1)*/
g_iVault = nvault_open(g_szMapName);
LoadTimers();
}
iEntity = create_entity("info_target");
if (iEntity)
{
entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + 0.5);
entity_set_string(iEntity, EV_SZ_classname, "_TimerThink");
register_think("_TimerThink", "TimerThink");
}
g_iMsgRoundTime = get_user_msgid("RoundTime");
RegisterHam(Ham_Spawn, "player", "HamSpawnPlayer_Post", true);
RegisterHam(Ham_Killed, "player", "HamKilledPlayer_Post", true);
RegisterHam(Ham_Use, "func_button", "HamUseFuncButton_Pre", false);
register_clcmd("say /timer", "ClCmdTimer");
register_clcmd("say_team /timer", "ClCmdTimer");
register_clcmd("say /timermenu", "ClCmdTimer");
register_clcmd("say_team /timermenu", "ClCmdTimer");
register_clcmd("say /drtimer", "ClCmdTimer");
register_clcmd("say_team /drtimer", "ClCmdTimer");
register_clcmd("say /drtimermenu", "ClCmdTimer");
register_clcmd("say_team /drtimermenu", "ClCmdTimer");
register_clcmd("say /best", "ClCmdBest");
register_clcmd("say_team /best", "ClCmdBest");
register_clcmd("say /record", "ClCmdBest");
register_clcmd("say_team /record", "ClCmdBest");
//g_iHudSyncObj = CreateHudSyncObj();
//set_msg_block(get_user_msgid("RoundTime"), BLOCK_SET)
}
public plugin_cfg() set_task(0.5, "DB_Init");
public DB_Init()
{
state mysql;
new szDB[64];
get_cvar_string("dr_timer_sql_db", szDB, charsmax(szDB));
if (contain(szDB, ".") > 0)
{
state sqlite;
g_bSqlite = true;
}
SQL_Init();
}
SQL_Init()<mysql>
{
new szHost[64], szUser[64], szPass[64], szDB[64];
get_cvar_string("dr_timer_sql_host", szHost, charsmax(szHost));
get_cvar_string("dr_timer_sql_user", szUser, charsmax(szUser));
get_cvar_string("dr_timer_sql_pass", szPass, charsmax(szPass));
get_cvar_string("dr_timer_sql_db", szDB, charsmax(szDB));
g_hSqlTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB);
new szQuery[512];
formatex
(
szQuery, charsmax(szQuery),
"CREATE TABLE IF NOT EXISTS `%s` \
( \
`ID` INT NOT NULL AUTO_INCREMENT, \
\
`MAPNAME` VARCHAR(64) NOT NULL, \
`AUTHID` VARCHAR(32) NOT NULL, \
`NICKNAME` VARCHAR(64) NOT NULL, \
`IP` VARCHAR(45) NOT NULL, \
`COUNTRY_FULL` VARCHAR(45) NOT NULL, \
`COUNTRY_SHORT` VARCHAR(3) NOT NULL, \
`TIME` DOUBLE NOT NULL, \
`DATE` DATETIME NOT NULL, \
\
PRIMARY KEY(`ID`) \
)",
g_szTableName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_IgnoredQuery_Handler", szQuery);
}
SQL_Init()<sqlite>
{
SQL_SetAffinity("sqlite");
new szDataDir[128];
get_localinfo("amxx_datadir", szDataDir, charsmax(szDataDir));
new szDB[64];
get_cvar_string("dr_timer_sql_db", szDB, charsmax(szDB));
new szFile[196];
formatex(szFile, charsmax(szFile), "%s/%s", szDataDir, szDB);
if (!file_exists(szFile))
{
new fp = fopen(szFile, "w");
if (!fp)
{
log_amx("[%s] SQL_Init()<sqlite>: File ^"%s^" not found and can't be created!", g_szPrefix, szFile);
return;
}
else fclose(fp);
}
g_hSqlTuple = SQL_MakeDbTuple("", "", "", szFile, 0);
new szQuery[512];
formatex
(
szQuery, charsmax(szQuery),
"CREATE TABLE IF NOT EXISTS `%s` \
( \
`MAPNAME` TEXT NOT NULL, \
`AUTHID` TEXT NOT NULL, \
`NICKNAME` TEXT NOT NULL, \
`IP` TEXT NOT NULL, \
`COUNTRY_FULL` TEXT NOT NULL, \
`COUNTRY_SHORT` TEXT NOT NULL, \
`TIME` REAL NOT NULL, \
`DATE` DATETIME NOT NULL \
)",
g_szTableName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_IgnoredQuery_Handler", szQuery);
}
public client_putinserver(id) set_bit(g_bConnected, id);
public client_disconnect(id)
{
clr_bit(g_bConnected, id);
if (get_bit(g_bAlive, id)) clr_bit(g_bAlive, id);
if (get_bit(g_bStarted, id)) clr_bit(g_bStarted, id);
if (g_flStartTime[id] != 0.0) g_flStartTime[id] = 0.0;
if (g_flFinishTime[id] != 0.0) g_flFinishTime[id] = 0.0;
}
public TimerThink(iEntity)
{
if (iEntity) entity_set_float(iEntity, EV_FL_nextthink, get_gametime() + 0.5);
for (new iAlivePlayer = 1; iAlivePlayer <= MAX_PLAYERS; iAlivePlayer++)
{
if (get_bit(g_bConnected, iAlivePlayer) && get_bit(g_bAlive, iAlivePlayer) && get_bit(g_bStarted, iAlivePlayer))
{
//set_msg_block(get_user_msgid("RoundTime"), BLOCK_NOT)
new Float:flGameTime = get_gametime();
//g_flStartTime[iAlivePlayer] / 60, g_flStartTime[iAlivePlayer] % 60
//new iMinutes = floatround(flGameTime - g_flStartTime[iAlivePlayer] / 60.0);
//new iSeconds = floatround(flGameTime - g_flStartTime[iAlivePlayer] - iMinutes * 60);
/*new sSMsg[32];
format(sSMsg, 31, "Timer: %02d:%02d", iMinutes, iSeconds);
message_begin(MSG_ONE, StatusText, {0,0,0}, iAlivePlayer);
write_byte(0);
write_string(sSMsg);
message_end();*/
//client_print(iAlivePlayer,print_center,"Timer: %02d:%02d", iMinutes, iSeconds)
message_begin(MSG_ONE_UNRELIABLE, g_iMsgRoundTime, _, iAlivePlayer);
write_short(floatround(flGameTime - g_flStartTime[iAlivePlayer], floatround_floor) + 1);
message_end();
for (new iDeadPlayer = 1; iDeadPlayer <= MAX_PLAYERS; iDeadPlayer++)//mai jos
{
if (get_bit(g_bConnected, iDeadPlayer) && !get_bit(g_bAlive, iDeadPlayer) && entity_get_int(iDeadPlayer, EV_INT_iuser2) == iAlivePlayer && entity_get_int(iDeadPlayer, EV_INT_iuser1) == 4)
{
new iMinutesx = floatround(g_flStartTime[iDeadPlayer] / 60.0, floatround_floor);
new iSecondsx = floatround(g_flStartTime[iDeadPlayer] - iMinutesx * 60, floatround_floor);
new name[32]
get_user_name(iDeadPlayer,name,charsmax(name))
// set_hudmessage(0, 255, 0, -1.0, 0.25, 0, _, 0.5, _, _, 1);
// ShowSyncHudMsg(iDeadPlayer, g_iHudSyncObj, "%02d:%02d", iMinutesx, iSecondsx);
client_print(iDeadPlayer,print_center,"Timer de %s : %02d:%02d", name, iMinutesx, iSecondsx);
}
}
}
}
}
public HamSpawnPlayer_Post(id)
{
/*
if(task_exists(id + TaskID))
remove_task(id + TaskID);
*/
set_bit(g_bAlive, id);
if (get_bit(g_bStarted, id))
{
clr_bit(g_bStarted, id);
g_flStartTime[id] = 0.0;
}
if(is_user_alive(id))
{
message_begin(MSG_ONE_UNRELIABLE, g_iMsgRoundTime, _, id);
write_short(1);
message_end();
}
}
public HamKilledPlayer_Post(id)
{
/*
if(task_exists(id + TaskID))
remove_task(id + TaskID);
*/
clr_bit(g_bAlive, id);
if (get_bit(g_bStarted, id))
{
clr_bit(g_bStarted, id);
g_flStartTime[id] = 0.0;
}
}
public HamUseFuncButton_Pre(iEntity, id)
{
if (!get_bit(g_bAlive, id)) return(HAM_IGNORED);
if (g_bTimerFound)
{
new szTarget[32];
entity_get_string(iEntity, EV_SZ_target, szTarget, charsmax(szTarget));
if (TrieKeyExists(g_tStarts, szTarget)) Timer_Start(id);
else if (TrieKeyExists(g_tStops, szTarget)) Timer_Stop(id);
}
else
{
if (iEntity == g_iTimer[START]) Timer_Start(id);
else if (iEntity == g_iTimer[STOP]) Timer_Stop(id);
}
return(HAM_IGNORED);
}
Timer_Start(id)
{
if (!get_bit(g_bStarted, id))
{
set_bit(g_bStarted, id);
set_dhudmessage(0, 255, 0, -1.0, 0.80, 0, _, 3.0, _, _, true);
//ShowSyncHudMsg(id, g_iHudSyncObj, "Timer started!");
show_dhudmessage(id, "Cronometro iniciado!");
}
else
{
set_dhudmessage(255, 0, 0, -1.0, 0.85, 1, _, 3.0, _, _, true);
show_dhudmessage(id, "Cronometro reiniciado!");//ShowSyncHudMsg(id, g_iHudSyncObj, "Timer re-started!");
}
g_flStartTime[id] = get_gametime();
}
Timer_Stop(id)
{
if (!get_bit(g_bStarted, id))
{
set_dhudmessage(0, 0, 255, -1.0, 0.85, 2, _, 3.0, _, _, true);
show_dhudmessage(id, "No iniciaste el cronometro!");
return;
}
//set_msg_block(get_user_msgid("RoundTime"), BLOCK_SET)
clr_bit(g_bStarted, id);
g_flFinishTime[id] = get_gametime() - g_flStartTime[id];
g_flStartTime[id] = 0.0;
message_begin(MSG_ONE_UNRELIABLE, g_iMsgRoundTime, _, id);
write_short(1);
message_end();
new szTime[17];
ClimbtimeToString(g_flFinishTime[id], szTime, charsmax(szTime));
new szName[32];
get_user_name(id, szName, charsmax(szName));
#if defined COLORCHAT
//ColorChat(id, RED, "^4[%s]^1 You finished map in^3 %s^1!", g_szPrefix, szTime);
ColorChat(0, RED, "^4[%s]^3 %s^1 termino el mapa en^3 %s^1!", g_szPrefix, szName, szTime);
#else
client_print(id, print_chat, "[%s] Terminaste el mapa en %s!", g_szPrefix, szTime);
client_print(0, print_chat, "[%s] %s termino el mapa en %s!", g_szPrefix, szName, szTime);
#endif
/*new iPlayers[MAX_PLAYERS], iNum;
get_players(iPlayers, iNum, "ch");
if (iNum)
{
new iPlayer;
for (new i = 0; i < iNum; i++)
{
iPlayer = iPlayers[i];
if (iPlayer == id) continue;
#if defined COLORCHAT
ColorChat(iPlayer, RED, "^4[%s]^3 %s^1 termino el mapa en^3 %s^1!", g_szPrefix, szName, szTime);
#else
client_print(iPlayer, print_chat, "[%s] %s termino el mapa en %s!", g_szPrefix, szName, szTime);
#endif
}
}*/
new szQuery[512], cData[1]; cData[0] = id;
formatex
(
szQuery, charsmax(szQuery),
"SELECT \
`TIME` \
FROM \
`%s` \
WHERE \
`MAPNAME` = '%s' \
AND \
`AUTHID` = '%s'",
g_szTableName,
g_szMapName,
szName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_QueryTop_Handler", szQuery, cData, sizeof(cData));
}
public Sql_QueryTop_Handler(iFailState, Handle:hQuery, szError[], iError, cData[], iSize)
{
if (iFailState != TQUERY_SUCCESS)
{
log_amx("[%s] Sql_IgnoredQuery_Handler(): SQL_Error #%d - %s", g_szPrefix, iError, szError);
return;
}
new id = cData[0];
if (!get_bit(g_bConnected, id)) return;
new szAuthID[32], szName[64], szIP[32], szCountryFull[45], szCountryShort[3], szDate[32];
get_user_authid(id, szAuthID, charsmax(szAuthID));
get_user_name(id, szName, charsmax(szName));
get_user_ip(id, szIP, charsmax(szIP), 1);
geoip_country(szIP, szCountryFull, charsmax(szCountryFull));
geoip_code2(szIP, szCountryShort);
get_time("%Y%m%d%H%M%S", szDate, charsmax(szDate));
SQL_PrepareString(szName, szName, charsmax(szName));
new szQuery[512];
if (SQL_NumResults(hQuery))
{
new Float:flOldTime, Float:flResult, szTime[17];
SQL_ReadResult(hQuery, 0, flOldTime);
if (g_flFinishTime[id] < flOldTime)
{
flResult = flOldTime - g_flFinishTime[id];
ClimbtimeToString(flResult, szTime, charsmax(szTime));
#if defined COLORCHAT
//ColorChat(id, RED, "^4[%s]^1 You improved your time for^3 %s^1 msec!", g_szPrefix, szTime);
ColorChat(0, RED, "^4[%s]^3 %s^1 mejoro su tiempo por^4 %s^1!", g_szPrefix,szName, szTime);
#else
client_print(id, print_chat, "[%s] Mejoraste tu tiempo por %s!", g_szPrefix, szTime);
#endif
formatex
(
szQuery, charsmax(szQuery),
"UPDATE `%s` \
SET \
`NICKNAME` = '%s', \
`IP` = '%s', \
`COUNTRY_FULL` = '%s', \
`COUNTRY_SHORT` = '%s', \
`TIME` = '%f', \
`DATE` = '%s' \
WHERE \
`MAPNAME` = '%s' \
AND \
`AUTHID` = '%s'",
g_szTableName,
szName,
szIP,
szCountryFull,
szCountryShort,
g_flFinishTime[id],
szDate,
g_szMapName,
szName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_IgnoredQuery_Handler", szQuery);
formatex
(
szQuery, charsmax(szQuery),
"SELECT \
`AUTHID` \
FROM \
`%s` \
WHERE \
MAPNAME='%s' \
ORDER BY \
`TIME` \
LIMIT 999",
g_szTableName,
g_szMapName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_GetPlaceQuery_Handler", szQuery, cData, sizeof(cData[]));
}
else
{
flResult = g_flFinishTime[id] - flOldTime;
ClimbtimeToString(flResult, szTime, charsmax(szTime));
#if defined COLORCHAT
//ColorChat(id, RED, "^4[%s]^1 You failed your time for^3 %s^1 msec!", g_szPrefix, szTime);
ColorChat(0, RED, "^4[%s]^3 %s^1 fallo mejorar su record por^4 %s^1!", g_szPrefix,szName, szTime);
//ColorChat(0, RED, "^4[%s]^1 It seems he failed to beat the record^3 %s^1 msec, owned by^4 %s", g_szPrefix, szTime);
#else
client_print(id, print_chat, "[%s] Fallaste mejorar tu tiempo por %s!", g_szPrefix, szTime);
#endif
}
}
else
{
formatex
(
szQuery, charsmax(szQuery),
"INSERT INTO `%s` \
( \
`MAPNAME`, \
`AUTHID`, \
`NICKNAME`, \
`IP`, \
`COUNTRY_FULL`, \
`COUNTRY_SHORT`, \
`TIME`, \
`DATE` \
) \
\
VALUES \
( \
'%s', \
'%s', \
'%s', \
'%s', \
'%s', \
'%s', \
'%f', \
'%s' \
)",
g_szTableName,
g_szMapName,
szName,
szName,
szIP,
szCountryFull,
szCountryShort,
g_flFinishTime[id],
szDate
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_IgnoredQuery_Handler", szQuery);
formatex
(
szQuery, charsmax(szQuery),
"SELECT \
`AUTHID` \
FROM \
`%s` \
WHERE \
MAPNAME='%s' \
ORDER BY \
`TIME` \
LIMIT 999",
g_szTableName,
g_szMapName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_GetPlaceQuery_Handler", szQuery, cData, sizeof(cData[]));
}
g_flFinishTime[id] = 0.0;
}
public Sql_GetPlaceQuery_Handler(iFailState, Handle:hQuery, szError, iError, cData[], iSize)
{
if (iFailState != TQUERY_SUCCESS)
{
log_amx("[%s] Sql_GetPlaceQuery_Handler(): SQL_Error #%d - %s", g_szPrefix, iError, szError);
return;
}
new id = cData[0];
if (!get_bit(g_bConnected, id)) return;
new szName[32];
get_user_name(id, szName, charsmax(szName));
new i, szAuthID_SQL[32];
while(SQL_MoreResults(hQuery))
{
i++;
SQL_ReadResult(hQuery, 0, szAuthID_SQL, charsmax(szAuthID_SQL));
if (equali(szName, szAuthID_SQL))//de pus la finish, fara equal asta..
{
#if defined COLORCHAT
//ColorChat(id, RED, "^4[%s]^1 You are now on^3 %d^1 place in map top!", g_szPrefix, i);
ColorChat(0, RED, "^4[%s]^3 %s^1 ahora estas^4 %d^1 en el map top!", g_szPrefix,szName, i);
#else
client_print(id, print_chat, "[%s] Ahora estas %d en el map top!", g_szPrefix, i);
#endif
/*new iPlayers[MAX_PLAYERS], iNum;
get_players(iPlayers, iNum, "ch");
if (iNum)
{
new iPlayer;
for (new i = 0; i < iNum; i++)
{
iPlayer = iPlayers[i];
if (iPlayer == id) continue;
#if defined COLORCHAT
ColorChat(iPlayer, RED, "^4[%s]^3 %s^1 esta ahora^3 %d^1 en el map top!", g_szPrefix, szName, i);
#else
client_print(iPlayer, print_chat, "[%s] %s esta ahora %d en el map top!", g_szPrefix, szName, i);
#endif
}
}*/
break;
}
SQL_NextRow(hQuery);
}
}
public Sql_IgnoredQuery_Handler(iFailState, Handle:hQuery, szError[], iError, cData[], iSize)
{
if (iFailState != TQUERY_SUCCESS)
{
log_amx("[%s] Sql_IgnoredQuery_Handler(): SQL_Error #%d - %s", g_szPrefix, iError, szError);
return;
}
}
public ClCmdBest(id)
{
/*if (!g_bTimerFound)
{
#if defined COLORCHAT
ColorChat(id, NORMAL, "^4[%s]^1 Este mapa no tiene el bloque de timer colocado!", g_szPrefix);
#else
client_print(id, print_chat, "[%s] Este mapa no tiene el bloque de timer colocado!", g_szPrefix);
#endif
return;
}*/
if (!g_bSqlite)
{
new szWebLink[128];
get_pcvar_string(g_pWebLink, szWebLink, charsmax(szWebLink));
new szMotd[256];
formatex(szMotd, charsmax(szMotd), "<META HTTP-EQUIV=^"REFRESH^" CONTENT=^"0;URL=%s/maptop.php?mapname=%s^">", szWebLink, g_szMapName);
show_motd(id, szMotd, "DRTIMER - Map Top");
}
else
{
new szQuery[512], cData[1]; cData[0] = id;
formatex
(
szQuery, charsmax(szQuery),
"SELECT \
`NICKNAME`, \
`TIME` \
FROM \
`%s` \
WHERE \
`MAPNAME` = '%s' \
ORDER BY \
`TIME` \
LIMIT 999",
g_szTableName,
g_szMapName
);
SQL_ThreadQuery(g_hSqlTuple, "Sql_LoadTopQuery_Handler", szQuery, cData, sizeof(cData));
}
}
public Sql_LoadTopQuery_Handler(iFailState, Handle:hQuery, szError, iError, cData[], iSize)
{
if (iFailState != TQUERY_SUCCESS)
{
log_amx("[%s] Sql_GetPlaceQuery_Handler(): SQL_Error #%d - %s", g_szPrefix, iError, szError);
return;
}
new id = cData[0];
if (!get_bit(g_bConnected, id)) return;
if(SQL_NumResults(hQuery)!=1)
{
#if defined COLORCHAT
ColorChat(id, NORMAL, "^4[%s]^1 Nadie termino este mapa aun. Se el primero!", g_szPrefix);
#else
client_print(id, print_chat, "[%s] Nadie termino este mapa aun. Se el primero!", g_szPrefix);
#endif
return;
}
new szMotd[1536], iSize = charsmax(szMotd);
new iLen = formatex
(
szMotd, iSize,
"<!DOCTYPE HTML> \
<html> \
<head> \
<style type=^"text/css^"> \
body \
{ \
background: #000; \
margin: 8px; \
color: #FFB000; \
font: normal 16px/20px Verdana, Tahoma, sans-serif; \
text-align: center; \
} \
th:nth-child(2){ text-align: left; } \
td:nth-child(2){ text-align: left; } \
</style> \
</head> \
<body>"
);
iLen += formatex
(
szMotd[iLen], iSize - iLen,
"<table align=^"center^" width=^"90%%^"> \
<tr> \
<th width=^"5%%^">#</th>\
<th width=^"40%%^">Player</th>\
<th width=^"20%%^">Time</th>\
</tr> \
"
);
new i = 1;
new Float:flTime, szName[32], szTime[32];
while (SQL_MoreResults(hQuery))
{
SQL_ReadResult(hQuery, 0, szName, 31);
SQL_ReadResult(hQuery, 1, flTime);
ClimbtimeToString(flTime, szTime, 16);
iLen += formatex
(
szMotd[iLen], iSize - iLen,
"<tr> \
<td>%d</td> \
<td>%s</td> \
<td>%s</td> \
</tr>",
i,
szName,
szTime
);
i++;
SQL_NextRow(hQuery);
}
formatex
(
szMotd[iLen], iSize - iLen,
"</table> \
</body> \
</html>"
);
show_motd(id, szMotd, "DRTIMER - Map Top");
}
stock SQL_PrepareString(const szQuery[], szOutPut[], iSize)
{
copy(szOutPut, iSize, szQuery);
replace_all(szOutPut, iSize, "'", "\'");
replace_all(szOutPut, iSize, "`", "\`");
replace_all(szOutPut, iSize, "\\", "\\\\");
}
ClimbtimeToString(Float:flClimbTime, szOutPut[], iLen)
{
new iMinutes = floatround(flClimbTime / 60.0, floatround_floor);
new iSeconds = floatround(flClimbTime - iMinutes * 60, floatround_floor);
new iMiliSeconds = floatround((flClimbTime - (iMinutes * 60 + iSeconds)) * 100, floatround_floor);
formatex(szOutPut, iLen, "%02i:%02i.%02i", iMinutes, iSeconds, iMiliSeconds);
}
public ClCmdTimer(id)
{
if (~get_user_flags(id) & ADMIN_ACCESS)
{
#if defined COLORCHAT
ColorChat(id, NORMAL, "^4[%s]^1 Prohibido el acceso!", g_szPrefix);
#else
client_print(id, print_chat, "[%s] Prohibido el acceso!", g_szPrefix);
#endif
return(PLUGIN_HANDLED);
}
if (g_bTimerFound)
{
#if defined COLORCHAT
ColorChat(id, NORMAL, "^4[%s]^1 Este mapa ya tiene el bloque timer colocado!", g_szPrefix);
#else
client_print(id, print_chat, "[%s] Este mapa ya tiene el bloque timer colocado!", g_szPrefix);
#endif
return(PLUGIN_HANDLED);
}
if (!get_bit(g_bAlive, id))
{
#if defined COLORCHAT
ColorChat(id, NORMAL, "^4[%s]^1 Tenes que estar vivo!", g_szPrefix);
#else
client_print(id, print_chat, "[%s] Tenes que estar vivo!", g_szPrefix);
#endif
return(PLUGIN_HANDLED);
}
TimerMenu(id);
return(PLUGIN_HANDLED);
}
public TimerMenu(id)
{
new iMenu = menu_create("\r[DeathRun]\y Timer Menu", "TimerMenu_Handler");
menu_additem(iMenu, "Create");
menu_additem(iMenu, "Rotate^n");
menu_additem(iMenu, "Save^n");
new szMenuItem[64];
formatex(szMenuItem, charsmax(szMenuItem), "Timer - (\y%s\w)", g_szTimerName[g_iPlayerTimer[id]]);
menu_additem(iMenu, szMenuItem);
menu_display(id, iMenu);
}
public TimerMenu_Handler(id, iMenu, iItem)
{
if (iItem == MENU_EXIT)
{
menu_destroy(iMenu);
return(PLUGIN_HANDLED);
}
switch (iItem)
{
case 0: create_timer(id, g_iPlayerTimer[id]);
case 1:
{
if (is_valid_ent(g_iTimer[g_iPlayerTimer[id]]))
{
switch (g_iTimerAngles[g_iPlayerTimer[id]])
{
case 3: g_iTimerAngles[g_iPlayerTimer[id]] = 0;
case 0, 1, 2: g_iTimerAngles[g_iPlayerTimer[id]]++;
}
new Float:vAngles[3];
vAngles[1] = g_flTimerAngles[g_iTimerAngles[g_iPlayerTimer[id]]];
entity_set_vector(g_iTimer[g_iPlayerTimer[id]], EV_VEC_angles, vAngles);
}
}
case 2:
{
if (is_valid_ent(g_iTimer[g_iPlayerTimer[id]]))
{
if (g_iVault == INVALID_HANDLE) return(PLUGIN_HANDLED);
new szData[128], iTimestamp;
if (nvault_lookup(g_iVault, g_szTimerName[g_iPlayerTimer[id]], szData, charsmax(szData), iTimestamp)) nvault_remove(g_iVault, g_szTimerName[g_iPlayerTimer[id]]);
formatex(szData, charsmax(szData), "^"%.1f^" ^"%.1f^" ^"%.1f^" ^"%d^"", g_vTimerOrigin[g_iPlayerTimer[id]][0], g_vTimerOrigin[g_iPlayerTimer[id]][1], g_vTimerOrigin[g_iPlayerTimer[id]][2], g_iTimerAngles[g_iPlayerTimer[id]]);
nvault_set(g_iVault, g_szTimerName[g_iPlayerTimer[id]], szData);
#if defined COLORCHAT
ColorChat(id, RED, "^4[%s]^1 Timer (^3%s^1) guardado!", g_szPrefix, g_szTimerName[g_iPlayerTimer[id]]);
#else
client_print(id, print_chat, "[%s] Timer (%s) guardado!", g_szPrefix, g_szTimerName[g_iPlayerTimer[id]]);
#endif
}
}
case 3:
{
switch (g_iPlayerTimer[id])
{
case START: g_iPlayerTimer[id] = STOP;
case STOP: g_iPlayerTimer[id] = START;
}
}
}
ClCmdTimer(id);
return(PLUGIN_HANDLED);
}
LoadTimers()
{
if (g_iVault == INVALID_HANDLE) return;
for (new i = 0; i < 2; i++)
{
new szData[128], iTimestamp;
if (nvault_lookup(g_iVault, g_szTimerName[i], szData, charsmax(szData), iTimestamp))
{
new szOrigin[3][17], szAngles[2];
parse(szData, szOrigin[0], charsmax(szOrigin[]), szOrigin[1], charsmax(szOrigin[]), szOrigin[2], charsmax(szOrigin[]), szAngles, charsmax(szAngles));
for (new x = 0; x < 3; x++) g_vTimerOrigin[i][x] = str_to_float(szOrigin[x]);
g_iTimerAngles[i] = str_to_num(szAngles);
create_timer(0, i, g_vTimerOrigin[i]);
}
else continue;
}
}
stock create_timer(id, iType, Float:vOrigin[3] = {0.0, 0.0, 0.0})
{
if (!g_iTimer[iType])
{
new iEntity = create_entity("func_button");
if (!is_valid_ent(iEntity)) return;
new szClassName[32];
formatex(szClassName, charsmax(szClassName), "Timer_%s", g_szTimerName[iType]);
entity_set_string(iEntity, EV_SZ_classname, szClassName);
entity_set_int(iEntity, EV_INT_solid, SOLID_BBOX);
entity_set_int(iEntity, EV_INT_movetype, MOVETYPE_NONE);
//set_pev(ent, pev_target, iType ? "timer_end" : "timer_start"); STOP/START?
entity_set_model(iEntity, g_szTimerModels[iType]);
entity_set_size(iEntity, Float:{-16.0, -16.0, 0.0}, Float:{16.0, 16.0, 60.0});
g_iTimer[iType] = iEntity;
}
if (id)
{
new vOriginI[3];
get_user_origin(id, vOriginI, 3);
new Float:vOriginF[3];
IVecFVec(vOriginI, vOriginF);
entity_set_origin(g_iTimer[iType], vOriginF);
for (new i = 0; i < 3; i++) g_vTimerOrigin[iType][i] = vOriginF[i];
}
else entity_set_origin(g_iTimer[iType], vOrigin);
new Float:vAngles[3];
vAngles[1] = g_flTimerAngles[g_iTimerAngles[iType]];
entity_set_vector(g_iTimer[iType], EV_VEC_angles, vAngles);
drop_to_floor(g_iTimer[iType]);
switch(iType)
{
case 0: fm_set_rendering(g_iTimer[iType], kRenderFxGlowShell, 0, 255, 0, kRenderNormal, 100);
case 1: fm_set_rendering(g_iTimer[iType], kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 100);
}
}
public plugin_end()
{
if (g_bTimerFound)
{
TrieDestroy(g_tStarts);
TrieDestroy(g_tStops);
}
else if (g_iVault != INVALID_HANDLE) nvault_close(g_iVault);
SQL_FreeHandle(g_hSqlTuple);
}
Reglas del foro denuncias: rules
Reglas de administración: viewtopic.php?f=5&t=11
Reglas de usuario: viewtopic.php?f=5&t=3
Reglas de administración: viewtopic.php?f=5&t=11
Reglas de usuario: viewtopic.php?f=5&t=3
Re: Deathrun Timer [Edicion]
Interesante