#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <cstrike>
#include <hamsandwich>
#include <sqlx>
#include <geoip>
#include <colorchat>
#include <dhudmessage>
#define PLUGIN "Deathrun Stats"
#define VERSION "0.6"
#define AUTHOR "R3X"
new gszChatPrefix[32];
new gszTop15Redirect[128];
new gszMotd[1024];
new gszMapname[64];
new gMid
#pragma unused giGames
new giGames; //Poki co nie uzywana zmienna
new gszQuery[512];
new Handle:gTuple;
new gbAuthorized[33];
new giPid[33];
new giPlayedTime[33];
new giBestTime[33];
new giPlayedGames[33];
new giDeaths[33];
new gszRecordTime[33][32];
new giBestTimeofMap;
new Float:gfLastInfo[33];
new Float:gfStartRun[33];
new giLastTime[33];
new bool:gbFinished[33];
new gEntFinish = 0;
new bool:gbEntityMoved = false;
new gcvarSave, gcvarTimer, gcvarTimerType, gcvarDrawFinish;
new gcvarPrintResult;
new gcvarRoundTime;
new Float:gfEndRoundTime;
new giMaxPlayers;
new gsprite;
getFormatedTime(iTime, szTime[], size){
formatex(szTime, size, "%d:%02d.%03ds", iTime/60000, (iTime/1000)%60, iTime%1000);
}
#include "drstats/db.inl"
#include "drstats/sqlite.inl"
#include "drstats/mysql.inl"
#include "drstats/finish.inl"
#include "drstats/stats.inl"
public plugin_init() {
state mysql;
register_plugin(PLUGIN, VERSION, AUTHOR);
register_dictionary("deathrun_stats.txt");
register_cvar("amx_drstats_host", "localhost");
register_cvar("amx_drstats_user", "root");
register_cvar("amx_drstats_pass", "root");
register_cvar("amx_drstats_db", "drstats");
gcvarSave = register_cvar("amx_drstats_save", "1");
gcvarTimer = register_cvar("amx_drstats_timer", "1");
gcvarTimerType = register_cvar("amx_drstats_timer_type", "0");
gcvarDrawFinish = register_cvar("amx_drstats_draw_finish", "1");
gcvarPrintResult = register_cvar("amx_drstats_print_result", "1");
//0-wcale
//1-HUD+konsola
//2-chat
gcvarRoundTime = get_cvar_pointer("mp_roundtime");
register_cvar("amx_drstats_chat_prefix", "[Speedrun]");
register_cvar("amx_drstats_top15_page", "");
register_logevent( "eventRoundEnd",2, "1=Round_End");
register_logevent( "eventRoundStart",2, "1=Round_Start");
register_forward(FM_PlayerPreThink, "fwPreThink", 1);
RegisterHam(Ham_Spawn, "player", "fwSpawn", 1);
register_touch(gszFinish, "player", "fwTouch");
register_touch("player", gszFinish, "fwTouch2");
register_think(gszFinish, "fwThink");
register_clcmd("dr_finish", "cmdFinish", ADMIN_CFG, ": spawn finish round");
register_fullclcmd("rank", "showRank");
register_fullclcmd("top15", "showTop15");
register_fullclcmd("last", "cmdLast");
register_fullclcmd("best", "cmdBest");
gfwCreateFinish = CreateMultiForward("fwFinishCreate", ET_STOP, FP_CELL, FP_ARRAY, FP_CELL);
gfwFinished = CreateMultiForward("fwPlayerFinished", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
gfwStarted = CreateMultiForward("fwPlayerStarted", ET_IGNORE, FP_CELL);
giMaxPlayers = get_maxplayers();
}
public plugin_precache(){
gsprite = precache_model("sprites/white.spr");
}
public plugin_cfg(){
DB_Init();
get_cvar_string("amx_drstats_chat_prefix", gszChatPrefix, charsmax(gszChatPrefix));
get_cvar_string("amx_drstats_top15_page", gszTop15Redirect, charsmax(gszTop15Redirect));
}
public plugin_natives(){
register_library("DeathrunStats");
register_native("playerFinished", "_playerFinished", 1);
}
public _playerFinished(id){
fwFinished(id);
}
public plugin_end(){
if(gbEntityMoved)
saveFinishOrigin();
SQL_FreeHandle(gTuple);
}
public client_putinserver(id){
if(is_user_bot(id) || is_user_hltv(id))
return;
loadPlayerId(id);
}
public client_authorized_db(id, pid){
giPid[id] = pid;
gbAuthorized[id] = true;
giPlayedTime[id] = 0;
giBestTime[id] = 0;
giPlayedGames[id] = 0;
giDeaths[id] = 0;
loadRunnerData(id);
}
public client_connect(id){
gbAuthorized[id] = false;
giPid[id] = 0;
giLastTime[id] = 0;
}
public client_disconnect(id){
saveRunnerData(id);
}
getPlayerDeaths(id){
return giDeaths[id]+get_user_deaths(id);
}
getPlayedTime(id){
return giPlayedTime[id] + get_user_time(id, 1);
}
getRunningTime(id){
return floatround( (get_gametime()-gfStartRun[id])*1000, floatround_ceil);
}
public eventRoundStart(){
new Float:fRoundTime = get_pcvar_float(gcvarRoundTime)*60;
gfEndRoundTime = get_gametime()+fRoundTime;
}
public eventRoundEnd(){
for(new i=1;i<33;i++)
if(is_user_connected(i))
saveRunnerData(i);
}
public fwSpawn(id){
if(!is_user_alive(id) || !gbAuthorized[id])
return HAM_IGNORED;
if(!gEntFinish){
client_print(id, print_chat, "%L", id, "FINISH_NOT_EXISTS");
if(get_user_flags(id)&ADMIN_CFG)
client_print(id, print_chat, "%L", id, "BUT_YOU_CAN_SPAWN_IT");
}
gbFinished[id] = false;
gfStartRun[id] = -1.0;
if(cs_get_user_team(id) == CS_TEAM_CT){
gfStartRun[id] = get_gametime();
new iRet;
ExecuteForward(gfwStarted, iRet, id);
}
return HAM_IGNORED;
}
show_status(id, const szMsg[], any:...){
new szStatus[128];
vformat(szStatus, 127, szMsg, 3);
static msgStatusText=0;
if(!msgStatusText)
msgStatusText = get_user_msgid("StatusText");
message_begin(MSG_ONE_UNRELIABLE, msgStatusText, _, id);
write_byte(0);
write_string(szStatus);
message_end();
}
Send_RoundTime(id, iTime){
static msgRoundTime=0;
if(!msgRoundTime)
msgRoundTime = get_user_msgid("RoundTime");
message_begin(MSG_ONE_UNRELIABLE, msgRoundTime, _, id);
write_short(iTime);
message_end();
}
hideTime(id){
if(get_pcvar_num(gcvarTimerType)){
Send_RoundTime(id, floatround(gfEndRoundTime - get_gametime()));
}else{
show_status(id, "");
}
}
displayTime(id, iTime){
if(get_pcvar_num(gcvarTimerType)){
Send_RoundTime(id, iTime);
}else{
show_status(id, "%L: %d:%02ds", id, "WORD_TIME", iTime/60, iTime%60);
}
}
public fwPreThink(id){
if(!is_user_alive(id) || gfStartRun[id] <= 0.0)
return FMRES_IGNORED;
new iTimer = get_pcvar_num(gcvarTimer);
if(!iTimer)
return FMRES_IGNORED;
if(iTimer == 2 && !(pev(id, pev_button) & IN_SCORE)){
if(pev(id, pev_oldbuttons) & IN_SCORE)
hideTime(id);
return FMRES_IGNORED;
}
static Float:fNow;
if(!gbFinished[id]){
fNow = get_gametime();
if((fNow-gfLastInfo[id]) <= 0.5) return FMRES_IGNORED;
displayTime(id, getRunningTime(id) / 1000);
}
return FMRES_IGNORED;
}
public cmdBest(id){
if(!gbAuthorized[id]){
ColorChat(id, GREEN, "%s^x01 %L", gszChatPrefix, id, "NOT_AVAILABLE_NOW");
return PLUGIN_CONTINUE;
}
if(giBestTime[id] == 0)
ColorChat(id, GREEN, "%s^x01 %L", gszChatPrefix, id, "NEVER_REACH_FINISH");
else{
new szTime[32];
getFormatedTime(giBestTime[id], szTime, charsmax(szTime));
ColorChat(id, GREEN, "%s^x01 %L: ^x04 %s", gszChatPrefix, id, "YOUR_BEST_TIME", szTime);
}
return PLUGIN_CONTINUE;
}
public cmdLast(id){
if(!gbAuthorized[id]){
ColorChat(id, GREEN, "%s^x01 %L", gszChatPrefix, id, "NOT_AVAILABLE_NOW");
return PLUGIN_CONTINUE;
}
if(giLastTime[id] == 0)
ColorChat(id, GREEN, "%s^x01 %L", gszChatPrefix, id, "NEVER_REACH_FINISH");
else{
new szTime[32];
getFormatedTime(giLastTime[id], szTime, charsmax(szTime));
ColorChat(id, GREEN, "%s^x01 %L: ^x04 %s", gszChatPrefix, szTime, id, "YOUR_LAST_TIME", szTime);
}
return PLUGIN_CONTINUE;
}
printInfo(id, const szInfo[], ...){
new printResult = get_pcvar_num(gcvarPrintResult);
if(printResult == 0) return;
new szMsg[64];
vformat(szMsg, charsmax(szMsg), szInfo, 3);
if(printResult == 1){
show_dhudmessage(id, "%s", szMsg);
client_print(id, print_console, "%s", szMsg);
}
else if(printResult == 2){
ColorChat(id, GREEN, "%s^x01 %s", gszChatPrefix, szMsg);
}
}
public fwFinished(id){
if(!is_user_alive(id))
return;
new bool:record=false;
new iTime = getRunningTime(id);
giLastTime[id] = iTime;
gbFinished[id] = true;
new szTime[32];
getFormatedTime(iTime, szTime, charsmax(szTime));
set_dhudmessage(42, 43, 255, -1.0, 0.6, 1, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L: %s", id, "RUNNING_TIME", szTime);
if(giBestTime[id] == 0){
set_dhudmessage(255, 42, 255, -1.0, 0.7, 0, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L", id, "RUNNING_FIRST_FINISH");
saveRunnerData(id, iTime);
}
else if(giBestTime[id] > iTime){
getFormatedTime(giBestTime[id]-iTime, szTime, charsmax(szTime));
set_dhudmessage(255, 42, 42, -1.0, 0.7, 0, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L: -%s!", id, "RUNNING_OWN_RECORD", szTime);
saveRunnerData(id, iTime);
}else if(giBestTime[id] < iTime){
getFormatedTime(iTime-giBestTime[id], szTime, charsmax(szTime));
set_dhudmessage(120, 120, 120, -1.0, 0.7, 0, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L: +%s", id, "RUNNING_OWN_RECORD", szTime);
}else{
set_dhudmessage(42, 255, 42, -1.0, 0.7, 0, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L", id, "RUNNING_OWN_RECORD_EQUAL");
}
if(giBestTimeofMap == 0 || giBestTimeofMap>iTime){
giBestTimeofMap = iTime;
new szName[32];
get_user_name(id, szName, 31);
set_dhudmessage(42, 255, 42, -1.0, 0.8, 2, 6.0, 5.0, 0.0, 0.0);
for(new i=1;i<=giMaxPlayers;i++)
if(is_user_connected(i))
printInfo(i, "%L", i, "RUNNING_MAP_RECORD_BREAK", szName);
record = true;
}
if(giBestTimeofMap != 0 && giBestTimeofMap<iTime){
new szTime[32];
getFormatedTime(iTime-giBestTimeofMap, szTime, 31);
set_dhudmessage(120, 120, 120, -1.0, 0.8, 2, 6.0, 5.0, 0.0, 0.0);
printInfo(id, "%L: +%s", id, "RUNNING_MAP_RECORD", szTime);
}
hideTime(id)
new iRet;
ExecuteForward(gfwFinished, iRet, id, iTime, record);
}