How do I give XP bonus to the zombie that killed the last Human
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <reapi>
#include <fakemeta>
#include <nvault>
#include <sqlx>
#include <hamsandwich>
#include <nvault_util>
#include <engine>
#include <fun>
#include <zombieplague>
// Defines
#define MAX_LEVEL 50
#define MAX_XP 500000
#define TASK_SHOWHUD 2020
#define MAXPLAYERS 32
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/ze_levelup.wav"
enum
{
Host = 0,
User,
Pass,
DB
}
// Constants
new const g_szLevelsVault[] = "Levels"
new const g_szRanksVault[] = "Ranks"
new const g_szLogFile[] = "Levels.log" // MySQL Errors log file
new const g_szTable[] =
" \
ALTER TABLE `test` \
ADD IF NOT EXISTS `Level` int(20) NOT NULL DEFAULT '0', \
ADD IF NOT EXISTS `XP` int(20) NOT NULL DEFAULT '0', \
ADD IF NOT EXISTS `Max_XP` int(20) NOT NULL DEFAULT '0'; \
"
// Messages
const Float:HUD_SPECT_X = -1.0
const Float:HUD_SPECT_Y = 0.70
const Float:HUD_STATS_X = -1.0
const Float:HUD_STATS_Y = 0.90
const HUD_STATS_ZOMBIE_R = 200
const HUD_STATS_ZOMBIE_G = 220
const HUD_STATS_ZOMBIE_B = 0
const HUD_STATS_HUMAN_R = 0
const HUD_STATS_HUMAN_G = 200
const HUD_STATS_HUMAN_B = 210
const HUD_STATS_SPEC_R = 100
const HUD_STATS_SPEC_G = 100
const HUD_STATS_SPEC_B = 100
// Variables
new g_iLevel[33],
g_iXP[33],
g_iMaxXP[33],
Float:g_fDamage[33],
//g_MsgSync,
g_iLevelsVaultHandle,
g_iRanksVaultHandle,
Handle:g_hTuple,
Fw_LevelUP,
ForwardReturn
// Cvars
new g_pCvarZombieInfect,
g_pCvariHumanWinEXP,
g_pCvarZombieSuccess,
g_pCvarEnableDamage,
//g_pCvarXPLastHuman,
g_pCvarRequiredDamage,
g_pCvarDamageAward,
g_pCvarStartXP,
g_pCvarMaxLevelsIncrement,
g_pCvarMaxXPFirstLevel,
//g_pCvarPercentageStyle,
g_pCvarStartFromZero,
//g_pCvarAddCommas,
g_pCvarLevelEffects,
g_pCvarSaveType,
g_pCvarDBInfo[4]
public plugin_natives()
{
register_native("ze_get_user_xp", "native_ze_get_user_xp", 1)
register_native("ze_set_user_xp", "native_ze_set_user_xp", 1)
register_native("ze_get_user_level", "native_ze_get_user_level", 1)
register_native("ze_set_user_level", "native_ze_set_user_level", 1)
register_native("ze_get_user_max_xp", "native_ze_get_user_max_xp", 1)
register_native("ze_set_user_max_xp", "native_ze_set_user_max_xp", 1)
}
public plugin_precache()
{
precache_sound(LEVELUP)
}
public plugin_init()
{
register_plugin("[ZE] Level-XP System", "1.9", "Raheem/JaCk")
// Hook Chains
RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
Fw_LevelUP = CreateMultiForward("ze_on_levelup", ET_IGNORE, FP_CELL)
// Cvars
g_pCvarZombieInfect = register_cvar("ze_zombie_infect", "3")
//g_pCvarEscapeSuccess = register_cvar("ze_escape_success", "5")
//g_pCvarXPLastHuman = register_cvar("ze_lasthuman", "5")
g_pCvariHumanWinEXP = register_cvar("ze_escape_success", "5")
g_pCvarZombieSuccess = register_cvar("ze_zombie_success", "10")
g_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "700.0")
g_pCvarDamageAward = register_cvar("ze_dmg_award", "1")
g_pCvarStartXP = register_cvar("ze_start_xp", "50")
g_pCvarMaxLevelsIncrement = register_cvar("ze_maxlevels_increment", "2.0")
g_pCvarMaxXPFirstLevel = register_cvar("ze_max_xp_first_level", "100")
//g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "1")
g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
//g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "1")
g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "1")
g_pCvarSaveType = register_cvar("ze_levels_save_type", "0")
g_pCvarDBInfo[Host] = register_cvar("ze_levels_host", "127.0.0.1")
g_pCvarDBInfo[User] = register_cvar("ze_levels_user", "root")
g_pCvarDBInfo[Pass] = register_cvar("ze_levels_pass", "password")
g_pCvarDBInfo[DB] = register_cvar("ze_levels_dbname", "levels_db")
// Messages
//g_MsgSync = CreateHudSyncObj()
if (get_pcvar_num(g_pCvarSaveType))
{
set_task(0.1, "Delay_MySQL_Init")
}
}
public plugin_end()
{
if (get_pcvar_num(g_pCvarSaveType))
{
if (g_hTuple != Empty_Handle)
{
SQL_FreeHandle(g_hTuple)
}
}
}
public Delay_MySQL_Init()
{
MySQL_Init()
}
public zp_user_infected_post(id, infector)
{
if(is_user_alive(infector) && infector != id)
{
g_iXP[infector] += get_pcvar_num(g_pCvarZombieInfect)
client_print_color(infector, print_team_default, "^4[Start] ^3Você ganhou!g ^4%d XP ^3por infectar um humano", get_pcvar_num(g_pCvarZombieInfect))
SaveData(id)
Check_User_Level(id)
}
}
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_hTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB)
// Let's ensure that the g_hTuple will be valid, we will access the database to make sure
new iErrorCode, szError[512], Handle:hSQLConnection
hSQLConnection = SQL_Connect(g_hTuple, iErrorCode, szError, charsmax(szError))
if (hSQLConnection != Empty_Handle)
{
log_amx("[MySQL][LVL] Successfully connected to host: %s (ALL IS OK).", szHost)
SQL_FreeHandle(hSQLConnection)
}
else
{
// Disable plugin
set_fail_state("[LVL] Failed to connect to MySQL database: %s.", szError)
}
SQL_ThreadQuery(g_hTuple, "QueryCreateTable", g_szTable)
}
public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
public client_putinserver(id)
{
//if(is_user_hltv(id) || is_user_bot(id))
// return
// Just 1 second delay
set_task(1.0, "DelayLoad", id)
// Other tasks
set_task(1.0, "Show_Hud", id+TASK_SHOWHUD, _, _, "b")
set_task(0.1, "Check_MaxXP", id, _, _, "b")
}
public DelayLoad(id)
{
// Load his data
LoadData(id)
}
public client_disconnected(id)
{
//if(is_user_hltv(id) || is_user_bot(id))
//return
remove_task(id+TASK_SHOWHUD)
remove_task(id)
}
public Check_MaxXP(id)
{
new iCurrentMaxXP = g_iMaxXP[id]
new iMaxXP = get_pcvar_num(g_pCvarMaxXPFirstLevel)
for (new i = 1; i <= g_iLevel[id]; i++)
{
iMaxXP = floatround(float(iMaxXP) * get_pcvar_float(g_pCvarMaxLevelsIncrement))
}
if (iCurrentMaxXP != iMaxXP)
{
g_iMaxXP[id] = iMaxXP
}
}
public zp_round_ended(iTeam)
{
new iPlayers[MAXPLAYERS], iPlayerCount, i, player
switch(iTeam)
{
case WIN_ZOMBIES:
{
get_players(iPlayers, iPlayerCount, "ac")
for(i = 0; i < iPlayerCount; i++)
{
player = iPlayers[i]
if(zp_get_user_zombie(player))
{
g_iXP[player] += get_pcvar_num(g_pCvarZombieSuccess)
client_print_color(player, print_team_default, "^4[Star] ^3Os zumbis receberam ^4%d XP ^3por infectar todos os humanos", get_pcvar_num(g_pCvarZombieSuccess))
SaveData(player)
Check_User_Level(player)
}
}
}
case WIN_HUMANS:
{
get_players(iPlayers, iPlayerCount, "ac")
for(i = 0; i < iPlayerCount; i++)
{
player = iPlayers[i]
if(!zp_get_user_zombie(player))
{
g_iXP[player] += get_pcvar_num(g_pCvariHumanWinEXP)
client_print_color(player, print_team_default, "^4[Star] ^3Os Humanos receberam ^4%d XP ^3por escapar", get_pcvar_num(g_pCvarZombieSuccess))
SaveData(player)
Check_User_Level(player)
}
}
}
case WIN_NO_ONE:
{
get_players(iPlayers, iPlayerCount, "ac")
for(i = 0; i < iPlayerCount; i++)
{
player = iPlayers[i]
if(!zp_get_user_zombie(player))
{
g_iXP[player] += get_pcvar_num(g_pCvariHumanWinEXP)
client_print_color(player, print_team_default, "^4[Star] ^3Os Humanos receberam ^4%d XP ^3por escapar", get_pcvar_num(g_pCvarZombieSuccess))
SaveData(player)
Check_User_Level(player)
}
}
}
}
}
/*public zp_round_ended()
{
new iAliveTRNum = GetPlayersNum(CsTeams:CS_TEAM_T)
new iAliveCTNum = GetPlayersNum(CsTeams:CS_TEAM_CT)
for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
{
if((iAliveCTNum > iAliveTRNum) && (iAliveTRNum == 0))
{
g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
client_print_color(id, print_team_default, "^4[Star] ^3Voce ganhou ^4%iXP por escapar", get_pcvar_num(g_pCvarEscapeSuccess))
SaveData(id)
Check_User_Level(id)
}
else if((iAliveTRNum > iAliveCTNum) && (iAliveCTNum == 0))
{
g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
client_print_color(id, print_team_default, "^4[Star] ^3Voce ganhou ^4%iXP Mata todo os humanos", get_pcvar_num(g_pCvarEscapeSuccess))
SaveData(id)
Check_User_Level(id)
}
}
}*/
public Check_User_Level(id)
{
if(!is_user_connected(id))
return
if(g_iXP[id] >= g_iMaxXP[id])
{
if (get_pcvar_num(g_pCvarStartFromZero) == 1)
{
g_iXP[id] = 0
}
new szName[32]
g_iLevel[id] ++
g_iMaxXP[id] = floatround(float(g_iMaxXP[id]) * get_pcvar_float(g_pCvarMaxLevelsIncrement))
get_user_name(id, szName, charsmax(szName))
zp_colored_print(id, "^4%s ^1Passou para level ^4%i!", szName, g_iLevel[id])
ExecuteForward(Fw_LevelUP, ForwardReturn, id)
SaveData(id)
PlaySound(id, LEVELUP)
if (get_pcvar_num(g_pCvarLevelEffects) != 0)
{
// Screen Fade
message_begin(MSG_ONE, get_user_msgid("ScreenFade"), {0,0,0}, id)
write_short(4096*2)
write_short(4096*5)
write_short(0x0001)
write_byte(random(256))
write_byte(random(256))
write_byte(random(256))
write_byte(150)
message_end()
// Screen Shake
message_begin(MSG_ONE, get_user_msgid("ScreenShake"), {0,0,0}, id)
write_short(255<<14)
write_short(10<<14)
write_short(255<<14)
message_end()
}
}
}
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
// Player Damage Himself
if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || zp_get_user_zombie(iAttacker) || !get_pcvar_num(g_pCvarEnableDamage))
return HC_CONTINUE
// Same Team?
if (get_member(iAttacker, m_iTeam) == get_member(iVictim, m_iTeam))
return HC_CONTINUE
// Store Damage For every Player
g_fDamage[iAttacker] += fDamage
// Damage Calculator Equal or Higher than needed damage
if (g_fDamage[iAttacker] >= get_pcvar_float(g_pCvarRequiredDamage))
{
// Give Player The Coins
g_iXP[iAttacker] += get_pcvar_num(g_pCvarDamageAward)
SaveData(iAttacker)
Check_User_Level(iAttacker)
// Rest The Damage Calculator
g_fDamage[iAttacker] = 0.0
}
return HC_CONTINUE
}
public SaveData(id)
{
new szAuthID[35], szName[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
get_user_name(id, szName, charsmax(szName))
// Set Him to max if he Higher than Max Value
if (g_iLevel[id] > MAX_LEVEL)
{
g_iLevel[id] = MAX_LEVEL
}
if (g_iXP[id] > MAX_XP)
{
g_iXP[id] = MAX_XP
}
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256]
formatex(szData , charsmax(szData), "%i %i %i", g_iLevel[id], g_iXP[id], g_iMaxXP[id])
// Open the Vaults
g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
g_iRanksVaultHandle = nvault_open(g_szRanksVault)
// Saves His Data
nvault_set(g_iLevelsVaultHandle, szAuthID, szData)
nvault_set(g_iRanksVaultHandle, szAuthID, szName)
// Close Vaults
nvault_close(g_iLevelsVaultHandle)
nvault_close(g_iRanksVaultHandle)
}
else
{
new szQuery[128]
formatex(szQuery, charsmax(szQuery), "UPDATE `zombie_escape` SET `Level` = '%d', `XP` = '%d', `Max_XP` = '%d' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[id], g_iMaxXP[id], szAuthID)
SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery)
}
}
public QuerySetData(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
public QuerySetData2(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime)
{
SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}
public LoadData(id)
{
new szData[256], szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
if (!get_pcvar_num(g_pCvarSaveType))
{
// Useless Variable
new iTimestamp, iExists
// Open the Vault
g_iLevelsVaultHandle = nvault_open(g_szLevelsVault)
iExists = nvault_lookup(g_iLevelsVaultHandle, szAuthID, szData, charsmax(szData), iTimestamp)
// Close Vault
nvault_close(g_iLevelsVaultHandle)
if (!iExists)
{
g_iLevel[id] = 0
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
SaveData(id)
}
else
{
new iLevel[32], iXP[32], iMaxLevel[32]
parse(szData, iLevel, 31, iXP, 31, iMaxLevel, 31)
g_iLevel[id] = str_to_num(iLevel)
g_iXP[id] = str_to_num(iXP)
g_iMaxXP[id] = str_to_num(iMaxLevel)
}
}
else
{
new szQuery[128], szData[5]
formatex(szQuery, charsmax(szQuery), "SELECT * FROM `Players_Information` WHERE ( `SteamID` = '%s' );", szAuthID)
num_to_str(id, szData, charsmax(szData))
SQL_ThreadQuery(g_hTuple, "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 this is new player
if (!SQL_NumResults(hQuery))
{
new szSteamId[36]
get_user_authid(id, szSteamId, charsmax(szSteamId))
g_iLevel[id] = 0
g_iXP[id] = 0
g_iMaxXP[id] = get_pcvar_num(g_pCvarMaxXPFirstLevel)
return
}
g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level"))
g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP"))
g_iMaxXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Max_XP"))
}
public native_ze_get_user_xp(id)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
return g_iXP[id]
}
public native_ze_set_user_xp(id, amount)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
g_iXP[id] = amount
Check_User_Level(id)
return true;
}
public native_ze_get_user_level(id)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
return g_iLevel[id]
}
public native_ze_set_user_level(id, amount)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
g_iLevel[id] = amount
if (get_pcvar_num(g_pCvarStartFromZero) == 1)
{
g_iXP[id] = 0
}
return true;
}
public native_ze_get_user_max_xp(id)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
return g_iMaxXP[id]
}
public native_ze_set_user_max_xp(id, amount)
{
if(!is_user_connected(id))
{
log_error(AMX_ERR_NATIVE, "[ZE] Invalid Player id (%d)", id)
return false;
}
g_iMaxXP[id] = amount
return true;
}
zp_colored_print(target, const message[], any:...)
{
static buffer[512], msg_SayText = 0
if( !msg_SayText ) msg_SayText = get_user_msgid("SayText")
// Send to everyone
if (!target)
{
static player, maxplayers, argscount
maxplayers = get_member_game(m_nMaxPlayers)
argscount = numargs()
for (player = 1; player <= maxplayers; player++)
{
// Not connected
if (!is_user_connected(player))
continue;
// Remember changed arguments
static arg_index, changed_args[20], changedcount // [20] = max LANG_PLAYER occurencies
changedcount = 0
// Replace LANG_PLAYER with player id
for (arg_index = 2; arg_index < argscount; arg_index++)
{
if (getarg(arg_index) == LANG_PLAYER && arg_index + 1 < argscount)
{
// Check if next param string is a registered language translation
static lang_key[64], arg_subindex
arg_subindex = 0
while ((lang_key[arg_subindex] = getarg(arg_index + 1, arg_subindex++))) { /* keep looping */ }
if (GetLangTransKey(lang_key) != TransKey_Bad)
{
setarg(arg_index, 0, player)
changed_args[changedcount++] = arg_index
arg_index++ // skip next argument since we know it's a translation key
}
}
}
// Format message for player (+add ZE prefix)
vformat(buffer, charsmax(buffer), message, 3)
format(buffer, charsmax(buffer), "%s%s", "[Star]", buffer)
replace_all(buffer, charsmax(buffer), "!g", "^x04"); // Green Color
replace_all(buffer, charsmax(buffer), "!y", "^x01"); // Yellow Color
replace_all(buffer, charsmax(buffer), "!t", "^x03"); // Team Color
// Send it
message_begin(MSG_ONE_UNRELIABLE, msg_SayText, _, player)
write_byte(player)
write_string(buffer)
message_end()
// Replace back player id's with LANG_PLAYER
for (arg_index = 0; arg_index < changedcount; arg_index++)
setarg(changed_args[arg_index], 0, LANG_PLAYER)
}
}
// Send to specific target
else
{
// Format message for player (+add ZE prefix)
vformat(buffer, charsmax(buffer), message, 3)
format(buffer, charsmax(buffer), "%s%s", "[Star]", buffer)
replace_all(buffer, charsmax(buffer), "!g", "^x04"); // Green Color
replace_all(buffer, charsmax(buffer), "!y", "^x01"); // Yellow Color
replace_all(buffer, charsmax(buffer), "!t", "^x03"); // Team Color
// Send it
message_begin(MSG_ONE, msg_SayText, _, target)
write_byte(target)
write_string(buffer)
message_end()
}
}
stock GetPlayersNum(CsTeams:iTeam) {
new iNum
for( new i = 1; i <= get_maxplayers(); i++ ) {
if(is_user_connected(i) && is_user_alive(i) && cs_get_user_team(i) == iTeam)
iNum++
}
return iNum
}
// Stop Sound