1. Pro15 motd shows only 7 players
2. Pro15 motd points are 0 or incorrect
3. Pro15 only updates after map change
PHP Code:
/* Plugin generated by AMXX-Studio */
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <fun>
#include <cstrike>
#include <colorchat>
#include <nvault_util>
#define PLUGIN "Pro Surfers"
#define VERSION "1.0"
#define AUTHOR "Kia"
#define TASK_ID_LEFT 6492
// Prefix for Messages
#define GAME_PREFIX "[ProSurfers]"
//Top number
#define TopNumber 15
// Points per Frame while Flying
#define FLY_POINTS_PER_FRAME 0.003
// Points per Frame while Surfing
#define SURF_POINTS_PER_FRAME 0.005
// Frequency of HUD being updated
#define HUD_FREQ 0.1
// Points for playing Impressive Sound
#define POINTS_IMPRESSIVE 10000
// Points for playing Perfect Sound
#define POINTS_PERFECT 30000
// Points for playing Holy Shit Sound
#define POINTS_HOLYSHIT 50000
// Points for playing Godlike Sound
#define POINTS_WICKEDSICK 70000
// Points for playing Godlike Sound
#define POINTS_GODLIKE 100000
// Comment if you don't want the points to be reseted after touching a teleport Entity
#define RESET_ON_TP
new Float:g_flTempFlyPoints[33]
new Float:g_flTempSurfPoints[33]
new Float:g_flTempTotalPoints[33]
new Float:g_flTempAngle[33]
new Float:g_flPreTempAngle[33]
new Float:g_flPoints[33]
new g_SyncObj2
new iPoints
new const SPECIAL_CHAR[2] = "-"
new g_iVault
new g_szTopMotd[1024]
new const szImpressive[] = "prosurfers/impressive.wav"
new const szPerfect[] = "prosurfers/perfect.wav"
new const szHolyShit[] = "prosurfers/holyshit.wav"
new const szWickedsick[] = "prosurfers/wickedsick.wav"
new const szGodlike[] = "prosurfers/godlike.wav"
public plugin_precache()
{
precache_sound("ambience/particle_suck1.wav")
precache_sound(szImpressive)
precache_sound(szPerfect)
precache_sound(szHolyShit)
precache_sound(szWickedsick)
precache_sound(szGodlike)
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_clcmd("say", "Cmd_Say")
register_clcmd("say_team", "Cmd_Say")
g_SyncObj2 = CreateHudSyncObj()
g_iVault = nvault_open("prosurf")
FormatTop(TopNumber)
/* Events */
register_event("DeathMsg", "Event_DeathMsg", "a")
/* Hamsandwich */
RegisterHam(Ham_Spawn, "player", "func_HamSpawn", 1)
#if defined RESET_ON_TP
/* Touches */
RegisterHam(Ham_Touch, "trigger_teleport", "Touch_EntTouch")
#endif
}
public plugin_end()
nvault_close(g_iVault)
public Cmd_Say(id)
{
new args[101], arg1[10], arg2[64]
read_args(args, charsmax(args))
remove_quotes(args)
parse(args, arg1, charsmax(args), arg2, charsmax(arg2))
if(equali(arg1, "/pro15"))
{
show_motd( id, g_szTopMotd, "Top Points" )
}
}
stock FormatTop(iNum)
{
if(g_iVault == INVALID_HANDLE)
set_fail_state("nVault returned invalid handle")
enum _:VaultData
{
VD_Key[33],
VD_Value,
VD_szName[33]
};
new Vault2 = nvault_util_open("prosurf")
new iSize = nvault_util_count(Vault2)
new Array:entries = ArrayCreate(VaultData);
new sizeEntries
new data[VaultData], value[256], data2[VaultData]
for(new i = 0, pos, timestamp; i < iSize; i++)
{
pos = nvault_util_read(Vault2, pos, data[VD_Key], charsmax(data[VD_Key]), value, charsmax(value), timestamp);
if(contain(data[VD_Key], SPECIAL_CHAR) != -1)
continue;
else
{
formatex(data[VD_szName], charsmax(data[VD_szName]), "%s%s", data[VD_Key], SPECIAL_CHAR)
nvault_get(g_iVault, data[VD_szName], data[VD_szName], charsmax(data[VD_szName]))
}
data[VD_Value] = str_to_num(value);
if(sizeEntries == 0)
{
ArrayPushArray(entries, data);
sizeEntries++;
continue;
}
else
{
for(timestamp = 0; timestamp <= sizeEntries; timestamp++)
{
if(timestamp == sizeEntries)
{
if(sizeEntries < iNum)
{
ArrayPushArray(entries, data);
sizeEntries++;
}
break;
}
ArrayGetArray(entries, timestamp, data2);
if(data[VD_Value] >= data2[VD_Value])
{
ArrayInsertArrayBefore(entries, timestamp, data);
if(sizeEntries < iNum)
{
sizeEntries++;
}
else
{
ArrayDeleteItem(entries, sizeEntries);
}
break;
}
}
}
}
new iLen
new len = charsmax(g_szTopMotd)
iLen = formatex(g_szTopMotd, len, "<STYLE>body{background:#212121;color:#d1d1d1;font-family:Arial}table{width:100%%;font-size:28px}</STYLE><table cellpadding=1 cellspacing=1 border=0>")
iLen += formatex(g_szTopMotd[iLen], len - iLen, "<tr bgcolor=#333333><th width=1%%><align=left font color=white> %s <th width=5%%> %-22.22s <th width=5%%> %s", "#", "Name", "Points")
new i
for(i = 0; i < sizeEntries; i++)
{
ArrayGetArray(entries, i, data);
data[VD_Key][32] = 0;
data[VD_szName][32] = 0
replace_all(data[VD_szName], charsmax(data[VD_szName]), "<", "<")
replace_all(data[VD_szName], charsmax(data[VD_szName]), ">", ">")
iLen += formatex(g_szTopMotd[iLen], len - iLen, "<tr align=left%s><td align=left><font color=white> %d. <td> %-22.22s <td> %d", " bgcolor=#2b5b95", (i+1), data[VD_szName], data[VD_Value])
}
ArrayDestroy(entries);
iLen += formatex(g_szTopMotd[iLen], len - iLen, "</table></body>")
}
public client_putinserver(id)
{
if( is_user_hltv(id) || is_user_bot(id) )
return;
Load(id)
g_flPoints[id] = 0.0
g_flTempFlyPoints[id] = 0.0
g_flTempSurfPoints[id] = 0.0
g_flTempTotalPoints[id] = 0.0
g_flTempAngle[id] = 0.0
}
public client_disconnect(id)
{
if( is_user_hltv(id) || is_user_bot(id) )
return;
Save(id)
}
stock Save(id)
{
if(g_iVault == INVALID_HANDLE)
set_fail_state("nVault returned invalid handle")
new szAuthId[35];
get_user_authid(id, szAuthId, charsmax(szAuthId))
new szName[32];
get_user_name(id, szName, 31)
new szData[256];
formatex(szData, charsmax(szData), "%i", iPoints);
nvault_remove(g_iVault, szAuthId)
nvault_set(g_iVault, szAuthId, szData)
format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
nvault_remove(g_iVault, szAuthId)
nvault_set(g_iVault, szAuthId, szName)
}
stock Load(id)
{
if(g_iVault == INVALID_HANDLE)
set_fail_state("nVault returned invalid handle")
new szSavedName[32]
new szName[32]; get_user_name(id, szName, charsmax(szName))
new szAuthId[33]; get_user_authid(id, szAuthId, charsmax(szAuthId))
new szData[256], iTimeStamp
if( !nvault_lookup(g_iVault, szAuthId, szData, charsmax(szData), iTimeStamp) )
{
nvault_set(g_iVault, szAuthId, "0")
format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
nvault_set(g_iVault, szAuthId, szName)
return 0
}
ParseLoadData(szData);
format(szAuthId, charsmax(szAuthId), "%s%s", szAuthId, SPECIAL_CHAR)
nvault_get(g_iVault, szAuthId, szSavedName)
if(!equal(szName, szSavedName))
{
nvault_remove(g_iVault, szAuthId)
nvault_set(g_iVault, szAuthId, szName)
}
return 0
}
ParseLoadData(szData[256])
{
static szNum[11];
strbreak(szData, szNum, charsmax(szNum), szData, charsmax(szData));
iPoints = str_to_num(szNum);
}
public client_PreThink(id)
{
/* Angle */
new Float:flAngle[3]
pev(id, pev_angles, flAngle)
g_flPreTempAngle[id] = flAngle[1]
/* Speed */
new Float:flVelocity[3]
new Float:flSpeed
pev(id, pev_velocity, flVelocity)
flSpeed = vector_length(flVelocity)
/* Origin */
new Float:origin[3], Float:dest[3];
entity_get_vector(id, EV_VEC_origin, origin);
dest[0] = origin[0];
dest[1] = origin[1];
dest[2] = origin[2] - 1.0;
/* TR */
new flags = entity_get_int(id, EV_INT_flags);
new ptr = create_tr2();
engfunc(EngFunc_TraceHull, origin, dest, 0, flags & FL_DUCKING ? HULL_HEAD : HULL_HUMAN, id, ptr);
new Float:flFraction;
get_tr2(ptr, TR_flFraction, flFraction);
if( flFraction >= 1.0 )
{
g_flTempFlyPoints[id] += FLY_POINTS_PER_FRAME * flSpeed
free_tr2(ptr);
}
}
public client_PostThink(id)
{
if(is_user_alive(id))
{
new szMessage[256]
/* Ground */
new flags = entity_get_int(id, EV_INT_flags);
if( flags & FL_ONGROUND )
{
if(g_flTempFlyPoints[id] > 0.0)
g_flPoints[id] += g_flTempFlyPoints[id]
if(g_flTempSurfPoints[id] > 0.0)
g_flPoints[id] += g_flTempSurfPoints[id]
if(g_flTempTotalPoints[id] > 0.0)
g_flPoints[id] += (g_flTempFlyPoints[id] + g_flTempSurfPoints[id])
iPoints = floatround(g_flTempFlyPoints[id] + g_flTempSurfPoints[id])
if(iPoints)
check_for_sound(id, iPoints)
g_flTempAngle[id] = 0.0
}
/* Velocity */
new Float:flVelocity[3]
new Float:flSpeed
pev(id, pev_velocity, flVelocity)
flSpeed = vector_length(flVelocity)
/* HUD */
set_hudmessage(255, 255, 255, 0.45, 0.8, 0, _, HUD_FREQ, 0.0, 0.0, -1)
if(IsUserSurfing(id))
{
g_flTempSurfPoints[id] += SURF_POINTS_PER_FRAME * flSpeed
}
new szFlyHUD[64]
formatex(szFlyHUD, charsmax(szFlyHUD), "^n^tFly points: +%i", floatround(g_flTempFlyPoints[id]))
add(szMessage, charsmax(szMessage), szFlyHUD)
new szSurfHUD[64]
formatex(szSurfHUD, charsmax(szSurfHUD), "^n^tSurf points: +%i", floatround(g_flTempSurfPoints[id]))
add(szMessage, charsmax(szMessage), szSurfHUD)
new szTotalHUD[64]
formatex(szTotalHUD, charsmax(szTotalHUD), "^n^tTotal points: +%i", floatround(g_flTempSurfPoints[id] + g_flTempFlyPoints[id]))
add(szMessage, charsmax(szMessage), szTotalHUD)
ShowSyncHudMsg(id, g_SyncObj2, szMessage)
}
}
public check_for_sound(id, iPoints)
{
new szName[33]
get_user_name(id, szName, charsmax(szName))
if(iPoints > POINTS_GODLIKE)
{
PlaySound(0, szGodlike)
ColorChat(0, RED,"%s Godlike! %s collected %i points!", GAME_PREFIX, szName, iPoints)
}
else if(iPoints > POINTS_WICKEDSICK)
{
PlaySound(0, szWickedsick)
ColorChat(0, RED,"%s Wicked Sick! %s collected %i points!", GAME_PREFIX, szName, iPoints)
}
else if(iPoints > POINTS_HOLYSHIT)
{
PlaySound(0, szHolyShit)
ColorChat(0, BLUE,"%s Holy Shit! %s collected %i points!", GAME_PREFIX, szName, iPoints)
}
else if(iPoints > POINTS_PERFECT)
{
PlaySound(0, szPerfect)
ColorChat(0, GREEN,"%s Perfect! %s collected %i points!", GAME_PREFIX, szName, iPoints)
}
else if(iPoints > POINTS_IMPRESSIVE)
{
PlaySound(0, szImpressive)
ColorChat(0, GREY,"%s Impressive! %s collected %i points!", GAME_PREFIX, szName, iPoints)
}
g_flTempFlyPoints[id] = 0.0
g_flTempSurfPoints[id] = 0.0
g_flTempTotalPoints[id] = 0.0
}
public Touch_EntTouch(iEnt, id)
{
if(is_user_alive(id))
{
g_flTempFlyPoints[id] = 0.0
g_flTempSurfPoints[id] = 0.0
g_flTempTotalPoints[id] = 0.0
}
}
public IsUserSurfing(id)
{
if( is_user_alive(id) )
{
new flags = entity_get_int(id, EV_INT_flags);
if( flags & FL_ONGROUND )
{
return 0;
}
new Float:origin[3], Float:dest[3];
entity_get_vector(id, EV_VEC_origin, origin);
dest[0] = origin[0];
dest[1] = origin[1];
dest[2] = origin[2] - 1.0;
new ptr = create_tr2();
engfunc(EngFunc_TraceHull, origin, dest, 0, flags & FL_DUCKING ? HULL_HEAD : HULL_HUMAN, id, ptr);
new Float:flFraction;
get_tr2(ptr, TR_flFraction, flFraction);
if( flFraction >= 1.0 )
{
free_tr2(ptr);
return 0;
}
get_tr2(ptr, TR_vecPlaneNormal, dest);
free_tr2(ptr);
return dest[2] <= 0.7;
}
return 0
}
stock PlaySound(id, const sound[])
{
if (equal(sound[strlen(sound)-4], ".mp3"))
client_cmd(id, "mp3 play ^"%s^"", sound)
else
client_cmd(id, "spk ^"%s^"", sound)
}
public print_color(id, cid, color, const message[], any:...)
{
new msg[192]
vformat(msg, charsmax(msg), message, 5)
/* //if you want to use ML, enable
replace_all(msg, charsmax(msg), "!g", "^x04")
replace_all(msg, charsmax(msg), "!n", "^x01")
replace_all(msg, charsmax(msg), "!t", "^x03")*/
new param
if (!cid)
return
else
param = cid
new team[32]
get_user_team(param, team, 31)
switch (color)
{
case 0: msg_teaminfo(param, team)
case 1: msg_teaminfo(param, "TERRORIST")
case 2: msg_teaminfo(param, "CT")
case 3: msg_teaminfo(param, "SPECTATOR")
}
if (id)
msg_saytext(id, param, msg)
else
msg_saytext(0, param, msg)
if (color != 0)
msg_teaminfo(param, team)
}
msg_saytext(id, cid, msg[])
{
message_begin(id?MSG_ONE:MSG_ALL, get_user_msgid("SayText"), {0,0,0}, id)
write_byte(cid)
write_string(msg)
message_end()
}
msg_teaminfo(id, team[])
{
message_begin(MSG_ONE, get_user_msgid("TeamInfo"), {0,0,0}, id)
write_byte(id)
write_string(team)
message_end()
}