#include <zombie_escape>
#include <nvault>
new const g_szLogFile[] = "PlayedTime.log" // MySQL Errors log file
// MySQL Table
new const g_szTable[] =
" \
CREATE TABLE IF NOT EXISTS `time_played` \
( \
`SteamID` varchar(34) NOT NULL, \
`PlayedTime` int(16) NOT NULL, \
PRIMARY KEY (`SteamID`) \
); \
"
#define PLAYED_TIME_TASK 9100
new const g_szVault_Name[] = "Played_Time"
new g_iPlayedTime[33], g_iVaultHandler, Handle:g_hTupleHandler
new g_pCvarSaveType, g_pCvarDBInfo[4]
// Database
enum
{
Host = 0,
User,
Pass,
DB
}
public plugin_natives()
{
// Native to return played time in seconds, plugin will save using nVault
register_native("ze_get_played_time", "native_ze_get_played_time", 1)
}
public plugin_init()
{
register_plugin("Played Time", "1.0", "Raheem")
// Cvars
g_pCvarSaveType = register_cvar("ze_played_time_save_type", "1") // 0 = nVault, 1 = SQL
g_pCvarDBInfo[Host] = register_cvar("ze_played_time_host", "localhost")
g_pCvarDBInfo[User] = register_cvar("ze_played_time_user", "user")
g_pCvarDBInfo[Pass] = register_cvar("ze_played_time_pass", "pass")
g_pCvarDBInfo[DB] = register_cvar("ze_played_time_dbname", "dbname")
// Commands
register_clcmd("say /played", "ShowPlayedTime")
register_clcmd("say_team /played", "ShowPlayedTime")
// Initialize MySQL - Delay 0.1 second required so we make sure that our zombie_escape.cfg already executed and cvars values loaded from it
set_task(0.1, "Delay_MySQL_Init")
}
public Delay_MySQL_Init()
{
MySQL_Init()
}
public MySQL_Init()
{
if (!get_pcvar_num(g_pCvarSaveType))
return
new szHost[64], szUser[32], szPass[32], szDB[128]
get_pcvar_string(g_pCvarDBInfo[Host], szHost, charsmax(szHost))
get_pcvar_string(g_pCvarDBInfo[User], szUser, charsmax(szUser))
get_pcvar_string(g_pCvarDBInfo[Pass], szPass, charsmax(szPass))
get_pcvar_string(g_pCvarDBInfo[DB], szDB, charsmax(szDB))
g_hTupleHandler = SQL_MakeDbTuple(szHost, szUser, szPass, szDB)
// Let's ensure that the g_hTupleHandler will be valid, we will access the database to make sure
new iErrorCode, szError[512], Handle:hSQLConnection
hSQLConnection = SQL_Connect(g_hTupleHandler, iErrorCode, szError, charsmax(szError))
if(hSQLConnection != Empty_Handle)
{
log_amx("[MySQL] Successfully connected to host: %s (ALL IS OK).", szHost)
SQL_FreeHandle(hSQLConnection)
}
else
{
// Disable plugin, and display the error
set_fail_state("Failed to connect to MySQL database: %s", szError)
}
// Create our table
SQL_ThreadQuery(g_hTupleHandler, "QueryCreateTable", g_szTable)
}
public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
public ShowPlayedTime(id)
{
ze_colored_print(id, "!tYour played time!y: !g%i !tMinutes!y!", g_iPlayedTime[id]/60)
}
public client_putinserver(id)
{
if(is_user_hltv(id) || is_user_bot(id))
return
// Just 1 second delay
set_task(0.5, "DelayLoad", id)
// Save played seconds
set_task(1.0, "IncreaseTimePlayed", id+PLAYED_TIME_TASK, _, _, "b")
}
public DelayLoad(id)
{
// Load his time played
LoadPlayedTime(id)
}
public IncreaseTimePlayed(taskid)
{
new id = taskid - PLAYED_TIME_TASK
g_iPlayedTime[id]++
}
public client_disconnected(id)
{
if(is_user_hltv(id) || is_user_bot(id))
return
// Save played time
SavePlayedTime(id)
remove_task(id+PLAYED_TIME_TASK)
remove_task(id)
g_iPlayedTime[id] = 0
}
SavePlayedTime(id)
{
new szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
new szData[128]
num_to_str(g_iPlayedTime[id], szData, charsmax(szData))
if (!get_pcvar_num(g_pCvarSaveType))
{
// Open the Vaults
g_iVaultHandler = nvault_open(g_szVault_Name)
// Saves His Data
nvault_set(g_iVaultHandler, szAuthID, szData)
// Close Vaults
nvault_close(g_iVaultHandler)
}
else
{
new szQuery[128]
formatex(szQuery, charsmax(szQuery), "UPDATE `time_played` SET `PlayedTime` = '%d' WHERE `SteamID` = '%s';", g_iPlayedTime[id], szAuthID)
SQL_ThreadQuery(g_hTupleHandler, "QueryUpdateData", szQuery)
}
}
public plugin_end()
{
if (get_pcvar_num(g_pCvarSaveType))
{
if (g_hTupleHandler != Empty_Handle)
{
SQL_FreeHandle(g_hTupleHandler)
}
}
}
public QueryUpdateData(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
LoadPlayedTime(id)
{
new szData[128], szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
if (!get_pcvar_num(g_pCvarSaveType))
{
// Useless Variable
new iTimestamp, iExists
// Open the Vault
g_iVaultHandler = nvault_open(g_szVault_Name)
iExists = nvault_lookup(g_iVaultHandler, szAuthID, szData, charsmax(szData), iTimestamp)
// Close Vault
nvault_close(g_iVaultHandler)
if (!iExists)
{
g_iPlayedTime[id] = 0
SavePlayedTime(id)
}
else
{
g_iPlayedTime[id] = str_to_num(szData)
}
}
else
{
new szQuery[128], szData[5]
formatex(szQuery, charsmax(szQuery), "SELECT `PlayedTime` FROM `time_played` WHERE ( `SteamID` = '%s' );", szAuthID)
num_to_str(id, szData, charsmax(szData))
SQL_ThreadQuery(g_hTupleHandler, "QuerySelectData", szQuery, szData, charsmax(szData))
}
}
public QuerySelectData(iFailState, Handle:hQuery, szError[], iError, szData[])
{
if(SQL_IsFail(iFailState, iError, szError, g_szLogFile))
return
new id = str_to_num(szData)
// No results for this query means that player not saved before
if(!SQL_NumResults(hQuery))
{
// This is new player
g_iPlayedTime[id] = 0
// Get user steamid
new szAuthID[36]
get_user_authid(id, szAuthID, charsmax(szAuthID))
// Insert his data to our database
new szQuery[128]
formatex(szQuery, charsmax(szQuery), "INSERT INTO `time_played` (`SteamID`, `PlayedTime`) VALUES ('%s', '%d');", szAuthID, g_iPlayedTime[id])
SQL_ThreadQuery(g_hTupleHandler, "QueryInsertData", szQuery)
return
}
new iPlayedTimeColumn = SQL_FieldNameToNum(hQuery, "PlayedTime")
// Read the played time for this player
g_iPlayedTime[id] = SQL_ReadResult(hQuery, iPlayedTimeColumn)
}
public QueryInsertData(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
public native_ze_get_played_time(id)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return -1;
}
return g_iPlayedTime[id]
}