Ok so how do I know how much xp I need for 30 lvl without ze_maxlevels_increment? I want use like 35 levels. Dont tell me about this viewtopic.php?f=7&t=3422 because its not working or check my 10th post there and tell me how to set thisMohamed Alaa wrote: ↑4 years agoHave you checked the main topic?czirimbolo wrote: ↑4 years ago You mean manual max xp for each level? And where is the second version? At the moment I have problem only with this because its horrible to set manually ze_maxlevels_increment
What problems do you face?
Levels-XP System
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Edit this array:czirimbolo wrote: ↑4 years ago Ok so how do I know how much xp I need for 30 lvl without ze_maxlevels_increment? I want use like 35 levels. Dont tell me about this viewtopic.php?f=7&t=3422 because its not working or check my 10th post there and tell me how to set this
- new const g_iMaxLevelsXP[MAX_LEVEL] =
- {
- "10",
- "20",
- "30",
- "40",
- "50"
- }
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Ok I use double exp in my old level_system code. Can you add this to your new code?Mohamed Alaa wrote: ↑4 years agoEdit this array:czirimbolo wrote: ↑4 years ago Ok so how do I know how much xp I need for 30 lvl without ze_maxlevels_increment? I want use like 35 levels. Dont tell me about this viewtopic.php?f=7&t=3422 because its not working or check my 10th post there and tell me how to set this
new const g_iMaxLevelsXP[MAX_LEVEL] = { "10", "20", "30", "40", "50" }
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
And your default code for level system with MAX xp is not compiling. Have you ever tested it?
//// ze_level_system.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(25) : error 018: initialization data exceeds declared size
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(512) : warning 204: symbol is assigned a value that is never used: "szQuery"
//
// 1 Error.
// Could not locate output file compiled\ze_level_system.amx (compile failed).
//
// Compilation Time: 0,91 sec
EDIt:
I changed new const g_iMaxLevelsXP[MAX_LEVEL] to new const g_iMaxLevelsXP[MAX_XP] and compiled.
//// ze_level_system.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(25) : error 018: initialization data exceeds declared size
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(512) : warning 204: symbol is assigned a value that is never used: "szQuery"
//
// 1 Error.
// Could not locate output file compiled\ze_level_system.amx (compile failed).
//
// Compilation Time: 0,91 sec
EDIt:
I changed new const g_iMaxLevelsXP[MAX_LEVEL] to new const g_iMaxLevelsXP[MAX_XP] and compiled.
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Ok to sum up:
1. Setting MAX XP for each level not working or I dont know how to set this.
example:
I set this: 600xp - 1 lvl
1000xp - 2 lvl
1500xp - 3 lvl
but on server it looks like: 1 level - 54 exp required ( I am starting from 0 level set by cvar and ze_start_xp 0)
2 level - 48 exp... funny
3 level - 48 exp...
next levels - 0 exp = every shot in zombie gives me next level till MAX LEVEL
2. XP counting is not working and its REALLY BAD
I am talking about this:
I make 100 damage by 1 shot - it gives me 5 xp (dont know why 5, not 3) but when I make damage 5000 damage per 1 shot it gives me also ONLY 5 xp. It must be fixed. This problem appears in your two versions of level system. Raheem fixed this problem for me in older version so he can help here.
These are 2 serious problems which make this level system useless
1. Setting MAX XP for each level not working or I dont know how to set this.
example:
I set this: 600xp - 1 lvl
1000xp - 2 lvl
1500xp - 3 lvl
but on server it looks like: 1 level - 54 exp required ( I am starting from 0 level set by cvar and ze_start_xp 0)
2 level - 48 exp... funny
3 level - 48 exp...
next levels - 0 exp = every shot in zombie gives me next level till MAX LEVEL
2. XP counting is not working and its REALLY BAD
I am talking about this:
Code: Select all
ze_required_dmg 100.0 Damage Required so Player get XP?
ze_dmg_award 3 How much XP Human get for make the Required damage?
These are 2 serious problems which make this level system useless
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
czirimbolo wrote: ↑4 years ago And your default code for level system with MAX xp is not compiling. Have you ever tested it?
//// ze_level_system.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(25) : error 018: initialization data exceeds declared size
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(512) : warning 204: symbol is assigned a value that is never used: "szQuery"
//
// 1 Error.
// Could not locate output file compiled\ze_level_system.amx (compile failed).
//
// Compilation Time: 0,91 sec
EDIt:
I changed new const g_iMaxLevelsXP[MAX_LEVEL] to new const g_iMaxLevelsXP[MAX_XP] and compiled.
Do you even know that your edit is wrong?
Cause when i use MAX_level and then later i pass to it the level number which will be like index to that array so it can return max XP for player's current level.
Anyway, replace your array with this:
- new const g_iMaxLevelsXP[MAX_LEVEL] =
- {
- 10,
- 20,
- 30,
- 40,
- 50
- }
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
It seems that its working well. Then you can fix problem nr 2 and add double exp time?Mohamed Alaa wrote: ↑4 years agoczirimbolo wrote: ↑4 years ago And your default code for level system with MAX xp is not compiling. Have you ever tested it?
//// ze_level_system.sma
//
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(25) : error 018: initialization data exceeds declared size
// C:\Users\macie\Documents\Compiler v1.8.3\scripting\ze_level_system.sma(512) : warning 204: symbol is assigned a value that is never used: "szQuery"
//
// 1 Error.
// Could not locate output file compiled\ze_level_system.amx (compile failed).
//
// Compilation Time: 0,91 sec
EDIt:
I changed new const g_iMaxLevelsXP[MAX_LEVEL] to new const g_iMaxLevelsXP[MAX_XP] and compiled.
Do you even know that your edit is wrong?
Cause when i use MAX_level and then later i pass to it the level number which will be like index to that array so it can return max XP for player's current level.
Anyway, replace your array with this:
Tell me whether your first problem (you said below ) is fixed or no.
new const g_iMaxLevelsXP[MAX_LEVEL] = { 10, 20, 30, 40, 50 }
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
L 09/03/2019 - 21:19:01: [AMXX] Displaying debug trace (plugin "ze_level_system.amxx", version "1.9")
L 09/03/2019 - 21:19:01: [AMXX] Run time error 4: index out of bounds
L 09/03/2019 - 21:19:01: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 335)
L 09/03/2019 - 21:19:01: [AMXX] [1] ze_level_system.sma::Fw_TakeDamage_Post (line 396)
L 09/03/2019 - 21:19:09: [AMXX] Displaying debug trace (plugin "ze_level_system.amxx", version "1.9")
L 09/03/2019 - 21:19:09: [AMXX] Run time error 4: index out of bounds
L 09/03/2019 - 21:19:09: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 335)
L 09/03/2019 - 21:19:09: [AMXX] [1] ze_level_system.sma::native_ze_set_user_xp (line 547)
L 09/03/2019 - 21:19:01: [AMXX] Run time error 4: index out of bounds
L 09/03/2019 - 21:19:01: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 335)
L 09/03/2019 - 21:19:01: [AMXX] [1] ze_level_system.sma::Fw_TakeDamage_Post (line 396)
L 09/03/2019 - 21:19:09: [AMXX] Displaying debug trace (plugin "ze_level_system.amxx", version "1.9")
L 09/03/2019 - 21:19:09: [AMXX] Run time error 4: index out of bounds
L 09/03/2019 - 21:19:09: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 335)
L 09/03/2019 - 21:19:09: [AMXX] [1] ze_level_system.sma::native_ze_set_user_xp (line 547)
Fix this problem is all player have level
i reset level
there player infect one player and get 1 Level
+
in begin work 100% but in v1.5 appear this problem
-
- Veteran Member
- Posts: 407
- Joined: 5 years ago
- Contact:
problem is in your needed xp for first level, not from modlizoumapper wrote: ↑4 years ago
Fix this problem is all player have level
i reset level
there player infect one player and get 1 Level
+
in begin work 100% but in v1.5 appear this problem
or it can be in your infect xp amount
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Sorry for the late reply.
I have updated the code, just make sure you set g_iMaxLevelsXP indexes equally to MAX_LEVEL. So for example if set MAX_LEVEL to 20, there must be 20 indexes like this:
Try this code:
I have updated the code, just make sure you set g_iMaxLevelsXP indexes equally to MAX_LEVEL. So for example if set MAX_LEVEL to 20, there must be 20 indexes like this:
Code: Select all
#define MAX_LEVEL 10
Code: Select all
new const g_iMaxLevelsXP[MAX_LEVEL] =
{
10, // 1
20, // 2
30, // 3
40, // 4
50, // 5
60, // 6
70, // 7
80, // 8
90, // 9
100 // 10
}
Code: Select all
#include <zombie_escape>
// Defines
#define MAX_LEVEL 10
#define TASK_SHOWHUD 2020
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/ze_levelup.wav"
enum
{
Host = 0,
User,
Pass,
DB
}
new const g_iMaxLevelsXP[MAX_LEVEL] =
{
10, // 1
20, // 2
30, // 3
40, // 4
50, // 5
60, // 6
70, // 7
80, // 8
90, // 9
100 // 10
}
// 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'; \
"
// 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_pCvarEscapeSuccess,
g_pCvarEnableDamage,
g_pCvarRequiredDamage,
g_pCvarDamageAward,
g_pCvarStartXP,
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)
}
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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
g_pCvarStartXP = register_cvar("ze_start_xp", "0")
g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0")
g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0")
g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0")
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 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")
}
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 Show_Hud(taskid)
{
new iPlayer = ID_SHOWHUD
if (!is_user_alive(iPlayer))
{
iPlayer = pev(iPlayer, pev_iuser2)
if (!is_user_alive(iPlayer))
return
}
if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
{
if(iPlayer != ID_SHOWHUD)
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
}
else if (ze_is_user_zombie(iPlayer))
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
}
else
{
if(iPlayer != ID_SHOWHUD)
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szSpecXP[15], szSpecMaxXP[15]
AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
}
else
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
}
}
else if (ze_is_user_zombie(iPlayer))
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szZombieXP[15], szZombieMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
}
else
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
else
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szHumanXP[15], szHumanMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
}
}
public ze_roundend(WinTeam)
{
if (WinTeam == ZE_TEAM_HUMAN)
{
for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
{
if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST)
continue
Reward(id, (g_iXP[id] + get_pcvar_num(g_pCvarEscapeSuccess)))
}
}
remove_task(TASK_SHOWHUD)
}
public Check_User_Level(id)
{
if (!is_user_connected(id))
return
if (g_iLevel[id] <= MAX_LEVEL)
{
while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1]
get_user_name(id, szName, charsmax(szName))
ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector)
{
if (iInfector == 0)
return
Reward(iInfector, (g_iXP[iInfector] + get_pcvar_num(g_pCvarZombieInfect)))
}
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
// Player Damage Himself
if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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
Reward(iAttacker, (g_iXP[iAttacker] + get_pcvar_num(g_pCvarDamageAward)))
// Rest The Damage Calculator
g_fDamage[iAttacker] = 0.0
}
return HC_CONTINUE
}
public Reward(id, XP)
{
if (g_iLevel[id] <= MAX_LEVEL)
{
if (g_iLevel[id] == MAX_LEVEL)
{
if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1])
{
g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1]
SaveData(id)
return
}
}
g_iXP[id] = XP
SaveData(id)
Check_User_Level(id)
}
}
public SaveData(id)
{
new szAuthID[35], szName[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
get_user_name(id, szName, charsmax(szName))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256]
formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256], 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] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
SaveData(id)
}
else
{
new iLevel[32], iXP[32]
parse(szData, iLevel, 31, iXP, 31)
g_iLevel[id] = str_to_num(iLevel)
g_iXP[id] = str_to_num(iXP)
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
else
{
new szQuery[128], szData[5]
formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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))
{
g_iLevel[id] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
}
else
{
g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level"))
g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP"))
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
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
}
Reward(id, amount)
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
}
if (amount > MAX_LEVEL)
{
log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL)
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]
}
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Working good. Can you make 2 things:Mohamed Alaa wrote: ↑4 years ago Sorry for the late reply.
I have updated the code, just make sure you set g_iMaxLevelsXP indexes equally to MAX_LEVEL. So for example if set MAX_LEVEL to 20, there must be 20 indexes like this:
Code: Select all
#define MAX_LEVEL 10
Try this code:Code: Select all
new const g_iMaxLevelsXP[MAX_LEVEL] = { 10, // 1 20, // 2 30, // 3 40, // 4 50, // 5 60, // 6 70, // 7 80, // 8 90, // 9 100 // 10 }
Code: Select all
#include <zombie_escape> // Defines #define MAX_LEVEL 10 #define TASK_SHOWHUD 2020 #define ID_SHOWHUD (taskid - TASK_SHOWHUD) #define LEVELUP "levelup_ZE/ze_levelup.wav" enum { Host = 0, User, Pass, DB } new const g_iMaxLevelsXP[MAX_LEVEL] = { 10, // 1 20, // 2 30, // 3 40, // 4 50, // 5 60, // 6 70, // 7 80, // 8 90, // 9 100 // 10 } // 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'; \ " // 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_pCvarEscapeSuccess, g_pCvarEnableDamage, g_pCvarRequiredDamage, g_pCvarDamageAward, g_pCvarStartXP, 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) } 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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1") g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0") g_pCvarDamageAward = register_cvar("ze_dmg_award", "3") g_pCvarStartXP = register_cvar("ze_start_xp", "0") g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0") g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0") g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0") g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0") 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 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") } 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 Show_Hud(taskid) { new iPlayer = ID_SHOWHUD if (!is_user_alive(iPlayer)) { iPlayer = pev(iPlayer, pev_iuser2) if (!is_user_alive(iPlayer)) return } if (get_pcvar_num(g_pCvarPercentageStyle) != 0) { if(iPlayer != ID_SHOWHUD) { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0) } else if (ze_is_user_zombie(iPlayer)) { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } } else { if(iPlayer != ID_SHOWHUD) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szSpecXP[15], szSpecMaxXP[15] AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP)) AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP)) set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP) } else { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer]) } } else if (ze_is_user_zombie(iPlayer)) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szZombieXP[15], szZombieMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP)) set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP) } else { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } else { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szHumanXP[15], szHumanMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP)) set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } } } public ze_roundend(WinTeam) { if (WinTeam == ZE_TEAM_HUMAN) { for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++) { if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST) continue Reward(id, (g_iXP[id] + get_pcvar_num(g_pCvarEscapeSuccess))) } } remove_task(TASK_SHOWHUD) } public Check_User_Level(id) { if (!is_user_connected(id)) return if (g_iLevel[id] <= MAX_LEVEL) { while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1] get_user_name(id, szName, charsmax(szName)) ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector) { if (iInfector == 0) return Reward(iInfector, (g_iXP[iInfector] + get_pcvar_num(g_pCvarZombieInfect))) } public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType) { // Player Damage Himself if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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 Reward(iAttacker, (g_iXP[iAttacker] + get_pcvar_num(g_pCvarDamageAward))) // Rest The Damage Calculator g_fDamage[iAttacker] = 0.0 } return HC_CONTINUE } public Reward(id, XP) { if (g_iLevel[id] <= MAX_LEVEL) { if (g_iLevel[id] == MAX_LEVEL) { if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1]) { g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1] SaveData(id) return } } g_iXP[id] = XP SaveData(id) Check_User_Level(id) } } public SaveData(id) { new szAuthID[35], szName[32] get_user_authid(id, szAuthID, charsmax(szAuthID)) get_user_name(id, szName, charsmax(szName)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256] formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35] get_user_authid(id, szAuthID, charsmax(szAuthID)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256], 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] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) SaveData(id) } else { new iLevel[32], iXP[32] parse(szData, iLevel, 31, iXP, 31) g_iLevel[id] = str_to_num(iLevel) g_iXP[id] = str_to_num(iXP) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } else { new szQuery[128], szData[5] formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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)) { g_iLevel[id] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) } else { g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level")) g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP")) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } 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 } Reward(id, amount) 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 } if (amount > MAX_LEVEL) { log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL) 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] }
1. THING
Fix this:
XP counting is not working and its REALLY BAD
I am talking about this:
Code: Select all
ze_required_dmg 100.0 Damage Required so Player get XP?
ze_dmg_award 5 How much XP Human get for make the Required damage?
2. THING:
Can you add double exp and MESSAGE DOUBLE EXP TIME on screen?
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Provide the code Raheem fixed it for you.
Provide more information about double XP you want.
Provide more information about double XP you want.
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Mohamed Alaa wrote: ↑4 years ago Provide the code Raheem fixed it for you.
Provide more information about double XP you want.
Code: Select all
#include <zombie_escape>
// Defines
#define MAX_LEVEL 50
#define MAX_XP 5000000000
#define TASK_SHOWHUD 2020
#define TASK_DOUBLE 1133
#define REPEAT_TIME 60.0
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/yougot.wav"
// Constants
new const g_szLevelsVault[] = "Levels"
new const g_szRanksVault[] = "Ranks"
// Messages
const Float:HUD_SPECT_X = -1.0
const Float:HUD_SPECT_Y = 0.70
const Float:HUD_STATS_X = 0.01
const Float:HUD_STATS_Y = 0.15
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,
bool:g_bIsDoubleHours
// Cvars
new g_pCvarZombieInfect,
g_pCvarEscapeSuccess,
g_pCvarEnableDamage,
g_pCvarRequiredDamage,
g_pCvarDamageAward,
g_pCvarStartXP,
g_pCvarMaxLevelsIncrement,
g_pCvarMaxXPFirstLevel,
g_pCvarPercentageStyle,
g_pCvarStartFromZero,
g_pCvarAddCommas,
g_pCvarLevelEffects,
g_pCvarDoubleXP,
g_pCvarDamage
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.8", "Raheem/JaCk")
// Hook Chains
RegisterHookChain(RG_CBasePlayer_TakeDamage, "Fw_TakeDamage_Post", 1)
// Cvars
g_pCvarZombieInfect = register_cvar("ze_zombie_infect", "3")
g_pCvarEscapeSuccess = register_cvar("ze_escape_success", "5")
g_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "80.0")
g_pCvarDamageAward = register_cvar("ze_dmg_award", "5")
g_pCvarStartXP = register_cvar("ze_start_xp", "50")
g_pCvarMaxLevelsIncrement = register_cvar("ze_maxlevels_increment", "1.8")
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_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12")
// Messages
g_MsgSync = CreateHudSyncObj()
}
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")
// Message task
DoubleHours()
if (g_bIsDoubleHours)
{
set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b")
}
}
public HappyHours(taskid)
{
new id = taskid - TASK_DOUBLE
DoubleHours()
if (!g_bIsDoubleHours)
remove_task(taskid)
new szDoubleHours[32]
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 0.0, 10.0)
show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours)
}
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 Show_Hud(taskid)
{
new iPlayer = ID_SHOWHUD
if (!is_user_alive(iPlayer))
{
iPlayer = pev(iPlayer, pev_iuser2)
if (!is_user_alive(iPlayer))
return
}
if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
{
if(iPlayer != ID_SHOWHUD)
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
}
else if (ze_is_user_zombie(iPlayer))
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
}
else
{
if(iPlayer != ID_SHOWHUD)
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szSpecXP[15], szSpecMaxXP[15]
AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
}
else
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
}
}
else if (ze_is_user_zombie(iPlayer))
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szZombieXP[15], szZombieMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
}
else
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
else
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szHumanXP[15], szHumanMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
}
}
public ze_roundend(WinTeam)
{
if (WinTeam == ZE_TEAM_HUMAN)
{
for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
{
if (!is_user_alive(id) || get_member(id, m_iTeam) == TEAM_TERRORIST)
continue
g_iXP[id] += get_pcvar_num(g_pCvarEscapeSuccess)
SaveData(id)
Check_User_Level(id)
}
}
remove_task(TASK_SHOWHUD)
}
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))
ze_colored_print(0, "!g%s !tNow in Level %i!y!", szName, g_iLevel[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 ze_user_infected(iVictim, iInfector)
{
if (iInfector == 0)
return
g_iXP[iInfector] += get_pcvar_num(g_pCvarZombieInfect)
SaveData(iInfector)
Check_User_Level(iInfector)
}
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
// Player Damage Himself
if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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))
{
// Player did damage that a multiplication of the cvar? Increase coins by this factor
new iMultiplier = floatround(g_fDamage[iAttacker] / get_pcvar_float(g_pCvarRequiredDamage))
// If this multiplier is more than or equal 2, then multiply it with original coins reward
if (iMultiplier >= 2)
{
// Give player coins * multiplier
g_iXP[iAttacker] += (get_pcvar_num(g_pCvarDamageAward) * iMultiplier)
SaveData(iAttacker)
Check_User_Level(iAttacker)
}
else
{
// Give player The coins, without multiplier
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
}
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)
}
public LoadData(id)
{
new szData[256], szAuthID[35], szName[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
get_user_name(id, szName, charsmax(szName))
// 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)
}
}
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;
}
DoubleHours()
new iAddedAmount = amount - g_iXP[id]
if (g_bIsDoubleHours)
{
g_iXP[id] = g_iXP[id] + (iAddedAmount * 2)
}
else
{
g_iXP[id] = amount
}
Check_User_Level(id)
SaveData(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
}
SaveData(id)
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
SaveData(id)
return true;
}
stock DoubleHours()
{
new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32]
get_time("%H", szTime, charsmax(szTime))
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
for (new ch = 0; ch <= charsmax(szDoubleHours); ch++)
{
if (szDoubleHours[ch] == '-')
szDoubleHours[ch] = ' '
}
parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End))
new iTime, iDoubleHourStart, iDoubleHourEnd
iTime = str_to_num(szTime)
iDoubleHourStart = str_to_num(szDoubleHours_Start)
iDoubleHourEnd = str_to_num(szDoubleHours_End)
if(iDoubleHourEnd > iTime >= iDoubleHourStart)
{
g_bIsDoubleHours = true
}
else
{
g_bIsDoubleHours = false
}
}
Here is fix and double exp. For example I would like doube exp from 15 to 22 and when there is Double EXP ACTIVE, I can see message on screen
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Not tested:
Code: Select all
#include <zombie_escape>
// Defines
#define MAX_LEVEL 10
#define TASK_SHOWHUD 2020
#define TASK_DOUBLE 1133
#define REPEAT_TIME 60.0
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/ze_levelup.wav"
enum
{
Host = 0,
User,
Pass,
DB
}
new const g_iMaxLevelsXP[MAX_LEVEL] =
{
10, // 1
20, // 2
30, // 3
40, // 4
50, // 5
60, // 6
70, // 7
80, // 8
90, // 9
100 // 10
}
// 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'; \
"
// 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,
bool:g_bIsDoubleHours
// Cvars
new g_pCvarZombieInfect,
g_pCvarEscapeSuccess,
g_pCvarEnableDamage,
g_pCvarRequiredDamage,
g_pCvarDamageAward,
g_pCvarStartXP,
g_pCvarPercentageStyle,
g_pCvarStartFromZero,
g_pCvarAddCommas,
g_pCvarLevelEffects,
g_pCvarSaveType,
g_pCvarDBInfo[4],
g_pCvarDoubleXP
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)
}
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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
g_pCvarStartXP = register_cvar("ze_start_xp", "0")
g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0")
g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0")
g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0")
g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12")
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 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")
// Message task
DoubleHours()
if (g_bIsDoubleHours)
{
set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b")
}
}
public HappyHours(taskid)
{
new id = taskid - TASK_DOUBLE
DoubleHours()
if (!g_bIsDoubleHours)
remove_task(taskid)
new szDoubleHours[32]
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 0.0, 10.0)
show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours)
}
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 Show_Hud(taskid)
{
new iPlayer = ID_SHOWHUD
if (!is_user_alive(iPlayer))
{
iPlayer = pev(iPlayer, pev_iuser2)
if (!is_user_alive(iPlayer))
return
}
if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
{
if(iPlayer != ID_SHOWHUD)
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
}
else if (ze_is_user_zombie(iPlayer))
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
}
else
{
if(iPlayer != ID_SHOWHUD)
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szSpecXP[15], szSpecMaxXP[15]
AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
}
else
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
}
}
else if (ze_is_user_zombie(iPlayer))
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szZombieXP[15], szZombieMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
}
else
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
else
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szHumanXP[15], szHumanMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
}
}
public ze_roundend(WinTeam)
{
if (WinTeam == ZE_TEAM_HUMAN)
{
for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
{
if (!is_user_alive(id) || ze_is_user_zombie(id))
continue
Reward(id, (g_iXP[id] + get_pcvar_num(g_pCvarEscapeSuccess)))
}
}
remove_task(TASK_SHOWHUD)
}
public Check_User_Level(id)
{
if (!is_user_connected(id))
return
if (g_iLevel[id] <= MAX_LEVEL)
{
while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1]
get_user_name(id, szName, charsmax(szName))
ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector)
{
if (iInfector == 0)
return
Reward(iInfector, (g_iXP[iInfector] + get_pcvar_num(g_pCvarZombieInfect)))
}
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
// Player Damage Himself
if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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))
{
// Player did damage that a multiplication of the cvar? Increase coins by this factor
new iMultiplier = floatround(g_fDamage[iAttacker] / get_pcvar_float(g_pCvarRequiredDamage))
// If this multiplier is more than or equal 2, then multiply it with original coins reward
if (iMultiplier >= 2)
{
// Give player coins * multiplier
Reward(iAttacker, (g_iXP[iAttacker] + (get_pcvar_num(g_pCvarDamageAward) * iMultiplier)))
}
else
{
// Give player The coins, without multiplier
Reward(iAttacker, (g_iXP[iAttacker] + get_pcvar_num(g_pCvarDamageAward)))
}
// Rest The Damage Calculator
g_fDamage[iAttacker] = 0.0
}
return HC_CONTINUE
}
public Reward(id, XP)
{
if (g_iLevel[id] <= MAX_LEVEL)
{
if (g_iLevel[id] == MAX_LEVEL)
{
if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1])
{
g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1]
SaveData(id)
return
}
}
g_iXP[id] = XP
SaveData(id)
Check_User_Level(id)
}
}
public SaveData(id)
{
new szAuthID[35], szName[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
get_user_name(id, szName, charsmax(szName))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256]
formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256], 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] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
SaveData(id)
}
else
{
new iLevel[32], iXP[32]
parse(szData, iLevel, 31, iXP, 31)
g_iLevel[id] = str_to_num(iLevel)
g_iXP[id] = str_to_num(iXP)
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
else
{
new szQuery[128], szData[5]
formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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))
{
g_iLevel[id] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
}
else
{
g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level"))
g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP"))
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
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
}
Reward(id, amount)
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
}
if (amount > MAX_LEVEL)
{
log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL)
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]
}
stock DoubleHours()
{
new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32]
get_time("%H", szTime, charsmax(szTime))
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
for (new ch = 0; ch <= charsmax(szDoubleHours); ch++)
{
if (szDoubleHours[ch] == '-')
szDoubleHours[ch] = ' '
}
parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End))
new iTime, iDoubleHourStart, iDoubleHourEnd
iTime = str_to_num(szTime)
iDoubleHourStart = str_to_num(szDoubleHours_Start)
iDoubleHourEnd = str_to_num(szDoubleHours_End)
if(iDoubleHourEnd > iTime >= iDoubleHourStart)
{
g_bIsDoubleHours = true
}
else
{
g_bIsDoubleHours = false
}
}
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Ok you fixed XP counting, but DOUBLE EXP still does not work. And I have this errorMohamed Alaa wrote: ↑4 years ago Not tested:
Code: Select all
#include <zombie_escape> // Defines #define MAX_LEVEL 10 #define TASK_SHOWHUD 2020 #define TASK_DOUBLE 1133 #define REPEAT_TIME 60.0 #define ID_SHOWHUD (taskid - TASK_SHOWHUD) #define LEVELUP "levelup_ZE/ze_levelup.wav" enum { Host = 0, User, Pass, DB } new const g_iMaxLevelsXP[MAX_LEVEL] = { 10, // 1 20, // 2 30, // 3 40, // 4 50, // 5 60, // 6 70, // 7 80, // 8 90, // 9 100 // 10 } // 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'; \ " // 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, bool:g_bIsDoubleHours // Cvars new g_pCvarZombieInfect, g_pCvarEscapeSuccess, g_pCvarEnableDamage, g_pCvarRequiredDamage, g_pCvarDamageAward, g_pCvarStartXP, g_pCvarPercentageStyle, g_pCvarStartFromZero, g_pCvarAddCommas, g_pCvarLevelEffects, g_pCvarSaveType, g_pCvarDBInfo[4], g_pCvarDoubleXP 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) } 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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1") g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0") g_pCvarDamageAward = register_cvar("ze_dmg_award", "3") g_pCvarStartXP = register_cvar("ze_start_xp", "0") g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0") g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0") g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0") g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0") g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12") 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 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") // Message task DoubleHours() if (g_bIsDoubleHours) { set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b") } } public HappyHours(taskid) { new id = taskid - TASK_DOUBLE DoubleHours() if (!g_bIsDoubleHours) remove_task(taskid) new szDoubleHours[32] get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours)) set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 0.0, 10.0) show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours) } 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 Show_Hud(taskid) { new iPlayer = ID_SHOWHUD if (!is_user_alive(iPlayer)) { iPlayer = pev(iPlayer, pev_iuser2) if (!is_user_alive(iPlayer)) return } if (get_pcvar_num(g_pCvarPercentageStyle) != 0) { if(iPlayer != ID_SHOWHUD) { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0) } else if (ze_is_user_zombie(iPlayer)) { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } } else { if(iPlayer != ID_SHOWHUD) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szSpecXP[15], szSpecMaxXP[15] AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP)) AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP)) set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP) } else { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer]) } } else if (ze_is_user_zombie(iPlayer)) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szZombieXP[15], szZombieMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP)) set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP) } else { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } else { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szHumanXP[15], szHumanMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP)) set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } } } public ze_roundend(WinTeam) { if (WinTeam == ZE_TEAM_HUMAN) { for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++) { if (!is_user_alive(id) || ze_is_user_zombie(id)) continue Reward(id, (g_iXP[id] + get_pcvar_num(g_pCvarEscapeSuccess))) } } remove_task(TASK_SHOWHUD) } public Check_User_Level(id) { if (!is_user_connected(id)) return if (g_iLevel[id] <= MAX_LEVEL) { while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1] get_user_name(id, szName, charsmax(szName)) ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector) { if (iInfector == 0) return Reward(iInfector, (g_iXP[iInfector] + get_pcvar_num(g_pCvarZombieInfect))) } public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType) { // Player Damage Himself if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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)) { // Player did damage that a multiplication of the cvar? Increase coins by this factor new iMultiplier = floatround(g_fDamage[iAttacker] / get_pcvar_float(g_pCvarRequiredDamage)) // If this multiplier is more than or equal 2, then multiply it with original coins reward if (iMultiplier >= 2) { // Give player coins * multiplier Reward(iAttacker, (g_iXP[iAttacker] + (get_pcvar_num(g_pCvarDamageAward) * iMultiplier))) } else { // Give player The coins, without multiplier Reward(iAttacker, (g_iXP[iAttacker] + get_pcvar_num(g_pCvarDamageAward))) } // Rest The Damage Calculator g_fDamage[iAttacker] = 0.0 } return HC_CONTINUE } public Reward(id, XP) { if (g_iLevel[id] <= MAX_LEVEL) { if (g_iLevel[id] == MAX_LEVEL) { if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1]) { g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1] SaveData(id) return } } g_iXP[id] = XP SaveData(id) Check_User_Level(id) } } public SaveData(id) { new szAuthID[35], szName[32] get_user_authid(id, szAuthID, charsmax(szAuthID)) get_user_name(id, szName, charsmax(szName)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256] formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35] get_user_authid(id, szAuthID, charsmax(szAuthID)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256], 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] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) SaveData(id) } else { new iLevel[32], iXP[32] parse(szData, iLevel, 31, iXP, 31) g_iLevel[id] = str_to_num(iLevel) g_iXP[id] = str_to_num(iXP) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } else { new szQuery[128], szData[5] formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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)) { g_iLevel[id] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) } else { g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level")) g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP")) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } 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 } Reward(id, amount) 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 } if (amount > MAX_LEVEL) { log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL) 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] } stock DoubleHours() { new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32] get_time("%H", szTime, charsmax(szTime)) get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours)) for (new ch = 0; ch <= charsmax(szDoubleHours); ch++) { if (szDoubleHours[ch] == '-') szDoubleHours[ch] = ' ' } parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End)) new iTime, iDoubleHourStart, iDoubleHourEnd iTime = str_to_num(szTime) iDoubleHourStart = str_to_num(szDoubleHours_Start) iDoubleHourEnd = str_to_num(szDoubleHours_End) if(iDoubleHourEnd > iTime >= iDoubleHourStart) { g_bIsDoubleHours = true } else { g_bIsDoubleHours = false } }
L 09/13/2019 - 17:06:25: [AMXX] Displaying debug trace (plugin "ze_level_system.amxx", version "1.9")
L 09/13/2019 - 17:06:25: [AMXX] Run time error 4: index out of bounds
L 09/13/2019 - 17:06:25: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 368)
L 09/13/2019 - 17:06:25: [AMXX] [1] ze_level_system.sma::Reward (line 462)
L 09/13/2019 - 17:06:25: [AMXX] [2] ze_level_system.sma::native_ze_set_user_xp (line 593)
L 09/13/2019 - 17:06:25: Unhandled dynamic native error
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
Try:
Code: Select all
#include <zombie_escape>
// Defines
#define MAX_LEVEL 10
#define TASK_SHOWHUD 2020
#define TASK_DOUBLE 1133
#define REPEAT_TIME 60.0
#define ID_SHOWHUD (taskid - TASK_SHOWHUD)
#define LEVELUP "levelup_ZE/ze_levelup.wav"
enum
{
Host = 0,
User,
Pass,
DB
}
new const g_iMaxLevelsXP[MAX_LEVEL] =
{
10, // 1
20, // 2
30, // 3
40, // 4
50, // 5
60, // 6
70, // 7
80, // 8
90, // 9
100 // 10
}
// 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'; \
"
// 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,
bool:g_bIsDoubleHours
// Cvars
new g_pCvarZombieInfect,
g_pCvarEscapeSuccess,
g_pCvarEnableDamage,
g_pCvarRequiredDamage,
g_pCvarDamageAward,
g_pCvarStartXP,
g_pCvarPercentageStyle,
g_pCvarStartFromZero,
g_pCvarAddCommas,
g_pCvarLevelEffects,
g_pCvarSaveType,
g_pCvarDBInfo[4],
g_pCvarDoubleXP
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)
}
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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1")
g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0")
g_pCvarDamageAward = register_cvar("ze_dmg_award", "3")
g_pCvarStartXP = register_cvar("ze_start_xp", "0")
g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0")
g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0")
g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0")
g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0")
g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12")
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 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")
// Message task
DoubleHours()
if (g_bIsDoubleHours)
{
set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b")
}
}
public HappyHours(taskid)
{
new id = taskid - TASK_DOUBLE
DoubleHours()
if (!g_bIsDoubleHours)
remove_task(taskid)
new szDoubleHours[32]
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 0.0, 10.0)
show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours)
}
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 Show_Hud(taskid)
{
new iPlayer = ID_SHOWHUD
if (!is_user_alive(iPlayer))
{
iPlayer = pev(iPlayer, pev_iuser2)
if (!is_user_alive(iPlayer))
return
}
if (get_pcvar_num(g_pCvarPercentageStyle) != 0)
{
if(iPlayer != ID_SHOWHUD)
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0)
}
else if (ze_is_user_zombie(iPlayer))
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0)
}
}
else
{
if(iPlayer != ID_SHOWHUD)
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szSpecXP[15], szSpecMaxXP[15]
AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP))
AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP))
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP)
}
else
{
set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer])
}
}
else if (ze_is_user_zombie(iPlayer))
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szZombieXP[15], szZombieMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP))
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP)
}
else
{
set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
else
{
if (get_pcvar_num(g_pCvarAddCommas) == 1)
{
new szHumanXP[15], szHumanMaxXP[15]
AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP))
AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP))
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP)
}
else
{
set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1)
ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD])
}
}
}
}
public ze_roundend(WinTeam)
{
if (WinTeam == ZE_TEAM_HUMAN)
{
new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarEscapeSuccess) * 2) : get_pcvar_num(g_pCvarEscapeSuccess)
for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++)
{
if (!is_user_alive(id) || ze_is_user_zombie(id))
continue
Reward(id, (g_iXP[id] + iXP))
}
}
remove_task(TASK_SHOWHUD)
}
public Check_User_Level(id)
{
if (!is_user_connected(id))
return
if (g_iLevel[id] <= MAX_LEVEL)
{
while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1]
get_user_name(id, szName, charsmax(szName))
ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector)
{
if (iInfector == 0)
return
new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarZombieInfect) * 2) : get_pcvar_num(g_pCvarZombieInfect)
Reward(iInfector, (g_iXP[iInfector] + iXP))
}
public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType)
{
// Player Damage Himself
if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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))
{
// Player did damage that a multiplication of the cvar? Increase coins by this factor
new iMultiplier = floatround(g_fDamage[iAttacker] / get_pcvar_float(g_pCvarRequiredDamage))
new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarDamageAward) * 2) : get_pcvar_num(g_pCvarDamageAward)
// If this multiplier is more than or equal 2, then multiply it with original coins reward
if (iMultiplier >= 2)
{
// Give player coins * multiplier
iXP *= iMultiplier
}
else
{
// Give player The coins, without multiplier
iXP *= 1
}
Reward(iAttacker, (g_iXP[iAttacker] + iXP))
// Rest The Damage Calculator
g_fDamage[iAttacker] = 0.0
}
return HC_CONTINUE
}
public Reward(id, XP)
{
if (g_iLevel[id] <= MAX_LEVEL)
{
if (g_iLevel[id] == MAX_LEVEL)
{
if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1])
{
g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1]
SaveData(id)
return
}
}
g_iXP[id] = XP
SaveData(id)
Check_User_Level(id)
}
}
public SaveData(id)
{
new szAuthID[35], szName[32]
get_user_authid(id, szAuthID, charsmax(szAuthID))
get_user_name(id, szName, charsmax(szName))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256]
formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35]
get_user_authid(id, szAuthID, charsmax(szAuthID))
if (!get_pcvar_num(g_pCvarSaveType))
{
new szData[256], 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] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
SaveData(id)
}
else
{
new iLevel[32], iXP[32]
parse(szData, iLevel, 31, iXP, 31)
g_iLevel[id] = str_to_num(iLevel)
g_iXP[id] = str_to_num(iXP)
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
else
{
new szQuery[128], szData[5]
formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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))
{
g_iLevel[id] = 1
g_iXP[id] = get_pcvar_num(g_pCvarStartXP)
}
else
{
g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level"))
g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP"))
}
g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1]
}
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
}
Reward(id, amount)
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
}
if (amount > MAX_LEVEL)
{
log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL)
return false
}
g_iLevel[id] = amount
if (get_pcvar_num(g_pCvarStartFromZero) == 1)
{
g_iXP[id] = 0
}
SaveData(id)
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]
}
stock DoubleHours()
{
new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32]
get_time("%H", szTime, charsmax(szTime))
get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours))
for (new ch = 0; ch <= charsmax(szDoubleHours); ch++)
{
if (szDoubleHours[ch] == '-')
szDoubleHours[ch] = ' '
}
parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End))
new iTime, iDoubleHourStart, iDoubleHourEnd
iTime = str_to_num(szTime)
iDoubleHourStart = str_to_num(szDoubleHours_Start)
iDoubleHourEnd = str_to_num(szDoubleHours_End)
if(iDoubleHourEnd > iTime >= iDoubleHourStart)
{
g_bIsDoubleHours = true
}
else
{
g_bIsDoubleHours = false
}
}
-
- Veteran Member
- Posts: 598
- Joined: 7 years ago
- Contact:
Seems to work but now I cant give XP to anyone and have this error:Mohamed Alaa wrote: ↑4 years ago Try:
Code: Select all
#include <zombie_escape> // Defines #define MAX_LEVEL 10 #define TASK_SHOWHUD 2020 #define TASK_DOUBLE 1133 #define REPEAT_TIME 60.0 #define ID_SHOWHUD (taskid - TASK_SHOWHUD) #define LEVELUP "levelup_ZE/ze_levelup.wav" enum { Host = 0, User, Pass, DB } new const g_iMaxLevelsXP[MAX_LEVEL] = { 10, // 1 20, // 2 30, // 3 40, // 4 50, // 5 60, // 6 70, // 7 80, // 8 90, // 9 100 // 10 } // 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'; \ " // 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, bool:g_bIsDoubleHours // Cvars new g_pCvarZombieInfect, g_pCvarEscapeSuccess, g_pCvarEnableDamage, g_pCvarRequiredDamage, g_pCvarDamageAward, g_pCvarStartXP, g_pCvarPercentageStyle, g_pCvarStartFromZero, g_pCvarAddCommas, g_pCvarLevelEffects, g_pCvarSaveType, g_pCvarDBInfo[4], g_pCvarDoubleXP 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) } 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_pCvarEnableDamage = register_cvar("ze_enable_dmg", "1") g_pCvarRequiredDamage = register_cvar("ze_required_dmg", "50.0") g_pCvarDamageAward = register_cvar("ze_dmg_award", "3") g_pCvarStartXP = register_cvar("ze_start_xp", "0") g_pCvarPercentageStyle = register_cvar("ze_enable_percentage_style", "0") g_pCvarStartFromZero = register_cvar("ze_new_level_zero_xp", "0") g_pCvarAddCommas = register_cvar("ze_add_commas_to_xp", "0") g_pCvarLevelEffects = register_cvar("ze_level_up_effects", "0") g_pCvarDoubleXP = register_cvar("ze_double_xp", "9-12") 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 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") // Message task DoubleHours() if (g_bIsDoubleHours) { set_task(REPEAT_TIME, "HappyHours", id+TASK_DOUBLE, _, _, "b") } } public HappyHours(taskid) { new id = taskid - TASK_DOUBLE DoubleHours() if (!g_bIsDoubleHours) remove_task(taskid) new szDoubleHours[32] get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours)) set_dhudmessage(0, 255, 0, -1.0, 0.20, 0, 0.0, 10.0) show_dhudmessage(id, "DOUBLE XP: %s", szDoubleHours) } 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 Show_Hud(taskid) { new iPlayer = ID_SHOWHUD if (!is_user_alive(iPlayer)) { iPlayer = pev(iPlayer, pev_iuser2) if (!is_user_alive(iPlayer)) return } if (get_pcvar_num(g_pCvarPercentageStyle) != 0) { if(iPlayer != ID_SHOWHUD) { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[iPlayer], (float(g_iXP[iPlayer])/float(g_iMaxXP[iPlayer])) * 100.0) } else if (ze_is_user_zombie(iPlayer)) { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %0.2f %", g_iLevel[ID_SHOWHUD], (float(g_iXP[ID_SHOWHUD])/float(g_iMaxXP[ID_SHOWHUD])) * 100.0) } } else { if(iPlayer != ID_SHOWHUD) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szSpecXP[15], szSpecMaxXP[15] AddCommas(g_iXP[iPlayer], szSpecXP, charsmax(szSpecXP)) AddCommas(g_iMaxXP[iPlayer], szSpecMaxXP, charsmax(szSpecMaxXP)) set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[iPlayer], szSpecXP, szSpecMaxXP) } else { set_hudmessage(HUD_STATS_SPEC_R, HUD_STATS_SPEC_G, HUD_STATS_SPEC_B, HUD_SPECT_X, HUD_SPECT_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[iPlayer], g_iXP[iPlayer], g_iMaxXP[iPlayer]) } } else if (ze_is_user_zombie(iPlayer)) { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szZombieXP[15], szZombieMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szZombieXP, charsmax(szZombieXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szZombieMaxXP, charsmax(szZombieMaxXP)) set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szZombieXP, szZombieMaxXP) } else { set_hudmessage(HUD_STATS_ZOMBIE_R, HUD_STATS_ZOMBIE_G, HUD_STATS_ZOMBIE_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } else { if (get_pcvar_num(g_pCvarAddCommas) == 1) { new szHumanXP[15], szHumanMaxXP[15] AddCommas(g_iXP[ID_SHOWHUD], szHumanXP, charsmax(szHumanXP)) AddCommas(g_iMaxXP[ID_SHOWHUD], szHumanMaxXP, charsmax(szHumanMaxXP)) set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %s/%s", g_iLevel[ID_SHOWHUD], szHumanXP, szHumanMaxXP) } else { set_hudmessage(HUD_STATS_HUMAN_R, HUD_STATS_HUMAN_G, HUD_STATS_HUMAN_B, HUD_STATS_X, HUD_STATS_Y, 0, 6.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(ID_SHOWHUD, g_MsgSync, "Level: %d | XP: %d/%d", g_iLevel[ID_SHOWHUD], g_iXP[ID_SHOWHUD], g_iMaxXP[ID_SHOWHUD]) } } } } public ze_roundend(WinTeam) { if (WinTeam == ZE_TEAM_HUMAN) { new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarEscapeSuccess) * 2) : get_pcvar_num(g_pCvarEscapeSuccess) for(new id = 1; id <= get_member_game(m_nMaxPlayers); id++) { if (!is_user_alive(id) || ze_is_user_zombie(id)) continue Reward(id, (g_iXP[id] + iXP)) } } remove_task(TASK_SHOWHUD) } public Check_User_Level(id) { if (!is_user_connected(id)) return if (g_iLevel[id] <= MAX_LEVEL) { while (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] = g_iMaxLevelsXP[g_iLevel[id] - 1] get_user_name(id, szName, charsmax(szName)) ze_colored_print(0, "!g%s !tNow in Level %i!y!", 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 ze_user_infected(iVictim, iInfector) { if (iInfector == 0) return new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarZombieInfect) * 2) : get_pcvar_num(g_pCvarZombieInfect) Reward(iInfector, (g_iXP[iInfector] + iXP)) } public Fw_TakeDamage_Post(iVictim, iInflictor, iAttacker, Float:fDamage, bitsDamageType) { // Player Damage Himself if (iVictim == iAttacker || !is_user_alive(iVictim) || !is_user_alive(iAttacker) || ze_is_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)) { // Player did damage that a multiplication of the cvar? Increase coins by this factor new iMultiplier = floatround(g_fDamage[iAttacker] / get_pcvar_float(g_pCvarRequiredDamage)) new iXP = g_bIsDoubleHours ? (get_pcvar_num(g_pCvarDamageAward) * 2) : get_pcvar_num(g_pCvarDamageAward) // If this multiplier is more than or equal 2, then multiply it with original coins reward if (iMultiplier >= 2) { // Give player coins * multiplier iXP *= iMultiplier } else { // Give player The coins, without multiplier iXP *= 1 } Reward(iAttacker, (g_iXP[iAttacker] + iXP)) // Rest The Damage Calculator g_fDamage[iAttacker] = 0.0 } return HC_CONTINUE } public Reward(id, XP) { if (g_iLevel[id] <= MAX_LEVEL) { if (g_iLevel[id] == MAX_LEVEL) { if ((g_iXP[id] + XP) >= g_iMaxLevelsXP[MAX_LEVEL - 1]) { g_iXP[id] = g_iMaxLevelsXP[MAX_LEVEL - 1] SaveData(id) return } } g_iXP[id] = XP SaveData(id) Check_User_Level(id) } } public SaveData(id) { new szAuthID[35], szName[32] get_user_authid(id, szAuthID, charsmax(szAuthID)) get_user_name(id, szName, charsmax(szName)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256] formatex(szData , charsmax(szData), "%i %i", g_iLevel[id], g_iXP[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' WHERE ( `SteamID` = '%s' );", g_iLevel[id], g_iXP[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 szAuthID[35] get_user_authid(id, szAuthID, charsmax(szAuthID)) if (!get_pcvar_num(g_pCvarSaveType)) { new szData[256], 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] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) SaveData(id) } else { new iLevel[32], iXP[32] parse(szData, iLevel, 31, iXP, 31) g_iLevel[id] = str_to_num(iLevel) g_iXP[id] = str_to_num(iXP) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } else { new szQuery[128], szData[5] formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zombie_escape` 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)) { g_iLevel[id] = 1 g_iXP[id] = get_pcvar_num(g_pCvarStartXP) } else { g_iLevel[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "Level")) g_iXP[id] = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "XP")) } g_iMaxXP[id] = g_iMaxLevelsXP[g_iLevel[id] - 1] } 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 } Reward(id, amount) 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 } if (amount > MAX_LEVEL) { log_error(AMX_ERR_NATIVE, "Level must be less than or equal to MAX_LEVEL (%d)", MAX_LEVEL) return false } g_iLevel[id] = amount if (get_pcvar_num(g_pCvarStartFromZero) == 1) { g_iXP[id] = 0 } SaveData(id) 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] } stock DoubleHours() { new szTime[3], szDoubleHours[32], szDoubleHours_Start[32], szDoubleHours_End[32] get_time("%H", szTime, charsmax(szTime)) get_pcvar_string(g_pCvarDoubleXP, szDoubleHours, charsmax(szDoubleHours)) for (new ch = 0; ch <= charsmax(szDoubleHours); ch++) { if (szDoubleHours[ch] == '-') szDoubleHours[ch] = ' ' } parse(szDoubleHours, szDoubleHours_Start, charsmax(szDoubleHours_Start), szDoubleHours_End, charsmax(szDoubleHours_End)) new iTime, iDoubleHourStart, iDoubleHourEnd iTime = str_to_num(szTime) iDoubleHourStart = str_to_num(szDoubleHours_Start) iDoubleHourEnd = str_to_num(szDoubleHours_End) if(iDoubleHourEnd > iTime >= iDoubleHourStart) { g_bIsDoubleHours = true } else { g_bIsDoubleHours = false } }
L 09/14/2019 - 15:58:06: [AMXX] Displaying debug trace (plugin "ze_level_system.amxx", version "1.9")
L 09/14/2019 - 15:58:06: [AMXX] Run time error 4: index out of bounds
L 09/14/2019 - 15:58:06: [AMXX] [0] ze_level_system.sma::Check_User_Level (line 369)
L 09/14/2019 - 15:58:06: [AMXX] [1] ze_level_system.sma::Reward (line 467)
L 09/14/2019 - 15:58:06: [AMXX] [2] ze_level_system.sma::native_ze_set_user_xp (line 598)
L 09/14/2019 - 15:58:06: Unhandled dynamic native error
I use this plugin to give XP
viewtopic.php?f=17&t=3373
Last edited by czirimbolo 4 years ago, edited 1 time in total.
- Night Fury
- Mod Developer
- Posts: 677
- Joined: 7 years ago
- Contact:
What do you mean you can't give XP?
Create an account or sign in to join the discussion
You need to be a member in order to post a reply
Create an account
Not a member? register to join our community
Members can start their own topics & subscribe to topics
It’s free and only takes a minute
Sign in
Who is online
Users browsing this forum: No registered users and 1 guest