/****************************************************************************\
========================================
* || Gold Member 3.0 || *
========================================
------------------------
*|| Licensing Info ||*
------------------------
Gold Member 3.0
Copyright (C) 2014 by zmd94
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
In addition, as a special exception, the author gives permission to
link the code of this program with the Half-Life Game Engine ("HL
Engine") and Modified Game Libraries ("MODs") developed by Valve,
L.L.C ("Valve"). You must obey the GNU General Public License in all
respects for all of the code used other than the HL Engine and MODs
from Valve. If you modify this file, you may extend this exception
to your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from your
version.
------------------
*||Change Log||*
------------------
(17/7/2014):
v1.0 - First release
v1.1 - [FIXED] Only human will get health bonus and armor bonus when respawn and the rewards for killing.
(18/7/2014):
v2.0 - [ADDED] Gold Member can do multi-jumps.
v2.1 - [ADDED] Gold Member can have their own model.
v3.0 - [ADDED] Gold Member can have unlimited clip for any weapons.
v3.1 - [ADDED] Gold Member will not get damage when falling.
v4.0 - [ADDED] Gold Member can have damage multiply.
(19/7/2014)
v4.1 - [FIXED] Only Gold Member can have unlimited clip.
v4.2 - [FIXED] Only Gold Member can do multi-jumps.
v4.3 - [FIXED] Only Gold Member will get health bonus and armor bonus when respawn and the rewards for killing.
v4.4 - [ADDED] Option for player to disable the hud message.
v4.5 - [FIXED] Only Gold Member will get the green hud message.
v4.6 - [FIXED] Health bonus will works perfectly after gold member killing a zombie.
v5.0 - [ADDED] Health bonus when killing zombie with a head shot.
v5.1 - [ADDED] Armor bonus when killing zombie with a head shot.
v5.2 - [ADDED] HE grenade/ fire grenade bonus when killing zombie
v5.3 - [ADDED] Hud message will appear when there is a gold member connected to the server
(15/8/2014)
Beta v1.0.1 - [FIXED] Fully recoded and optimized the plugin
- [FIXED] Removed unnecessary code
- [ADDED] New colourful hud message
(9/9/2014)
Beta v2.0 - [ADDED] Glow feature.
[ADDED] Aura Glow feature.
[ADDED] goldmember.cfg file. So, you just need to edit the file instead the code.
[ADDED] Custom model for player and knife.
[FIXED] The notification message when a gold member is connected to the server will be displayed as a message instead of hud message.
(2/11/2014)
Beta v2.1 - [FIXED] Optimized the code.
(11/10/2015)
v3.0 - Full rewritten the code.
\************************************************************************************/
#include
#include
#include
#include
// if you are using this Custom Level for ZPA,
// just change line below into #include
#include
#define RecieveOption(%1,%2) g_Options[%1]&%2
#define AddOption(%1,%2) g_Options[%1]|=%2
#define RemoveOption(%1,%2) g_Options[%1]&=~%2
const DMG_FALL = (1<<5)
enum
{
SCOREATTRIB_ARG_PLAYERID = 1,
SCOREATTRIB_ARG_FLAGS
}
enum(<<= 1)
{
SCOREATTRIB_FLAG_NONE = 0,
SCOREATTRIB_FLAG_DEAD = 1,
SCOREATTRIB_FLAG_BOMB,
SCOREATTRIB_FLAG_VIP
}
enum(<<=1)
{
PremMem = 1
}
new const VERSION[] = "3.0"
new const VAULTNAME[] = "premium_member"
new bool:g_bGivePremium, bool:g_bRemovePremium
new Float:g_fDamageDealt[33]
new g_Options[33]
new g_sCurrentFlag[15]
new g_szAuthID[33][34], g_szName[33][34]
new g_sAdminFlag, g_iSaveType, g_iDataExpired, g_iAnnounce
new g_iNoFallDamage, g_iDamageMultiply, g_iDamageAmount
new g_iAPBonus, g_iAPNemesisBonus, g_iAPSurvivorBonus, g_iAPZombieBonus, g_iAPHumanBonus
new g_iFireNade, g_iFrostNade, g_iZombieHP, g_iZombieSpeed, g_iZombieMultiJump
new g_iHumanHP, g_iHumanArmor, g_iHumanNoRecoil, g_iHumanSpeed, g_iHumanMultiJump, g_iHumanUnlimited
new g_VaultID, g_iMsgTxt
public plugin_init()
{
register_plugin("Premium Member", VERSION, "zmd94")
register_clcmd("say /giveprem", "give_premium")
register_clcmd("say_team /giveprem", "give_premium")
register_clcmd("say /removeprem", "remove_premium")
register_clcmd("say_team /removeprem", "remove_premium")
RegisterHam(Ham_Spawn, "player", "fw_PremiumRespawn", 1)
RegisterHam(Ham_TakeDamage, "player", "fw_PremiumDamage")
RegisterHam(Ham_Killed, "player", "fw_PremiumKilled")
g_sAdminFlag = register_cvar("pm_admin_flag", "j") // Configure access flag to open premium member menu
g_iSaveType = register_cvar("pm_save_type", "2") // 1; Save premium member via player steamID | 2; Save premium member via player name
g_iDataExpired = register_cvar("pm_data_expired", "5") // This will remove all entries in the vault that are X days old
g_iAnnounce = register_cvar("pm_connect_announce", "1") // Announce connecting premium member
g_iNoFallDamage = register_cvar("pm_no_fall_damage", "1") // No fall damage for premium member
g_iDamageMultiply = register_cvar("pm_damage_multiply", "2") // Multiply damage by X number
g_iDamageAmount = register_cvar("pm_damage_amount", "600") // Amount of damage required to get X AP bonus
g_iAPBonus = register_cvar("pm_AP_dealt_bonus", "2") // Amount of AP bonus after dealt X damage
g_iAPNemesisBonus = register_cvar("pm_AP_nem_bonus", "5") // Amount of AP bonus for killed nemesis
g_iAPSurvivorBonus = register_cvar("pm_AP_sur_bonus", "10") // Amount of AP bonus for killed survivor
g_iAPZombieBonus = register_cvar("pm_AP_zombie_bonus", "3") // Amount of AP bonus for killed zombie
g_iAPHumanBonus = register_cvar("pm_AP_human_bonus", "1") // Amount of AP bonus for infect human
g_iFireNade = register_cvar("pm_free_fire_nade", "2") // Amount of free fire nade when killing
g_iFrostNade = register_cvar("pm_free_frost_nade", "2") // Amount of free frost nade when killing
g_iZombieHP = register_cvar("pm_zombie_HP", "1000") // Extra HP for zombie
g_iZombieSpeed = register_cvar("pm_zombie_speed", "150") // Extra speed for zombie
g_iZombieMultiJump = register_cvar("pm_zombie_jump", "3") // Amount of multi-jump for zombie
g_iHumanHP = register_cvar("pm_human_HP", "100") // Extra HP for human
g_iHumanArmor = register_cvar("pm_human_armor", "100") // Extra armor for human
g_iHumanNoRecoil = register_cvar("pm_human_no_recoil", "1") // Enable no-recoil for human
g_iHumanSpeed = register_cvar("pm_human_speed", "3") // Extra speed for human
g_iHumanMultiJump = register_cvar("pm_human_jump", "3") // Amount of multi-jump for human
g_iHumanUnlimited = register_cvar("pm_human_unlimit", "2") // 1; Unlimited clip || 2; Unlimited BP ammo
register_message(get_user_msgid("ScoreAttrib"), "MessageScoreAttrib")
g_iMsgTxt = get_user_msgid("SayText")
}
public plugin_cfg()
{
g_VaultID = nvault_open(VAULTNAME)
if(g_VaultID == INVALID_HANDLE)
{
new szText[128]; formatex(szText, 127, "Error opening Premium Member database [%s]!", VAULTNAME);
set_fail_state(szText)
}
server_print("Premium Member database [%s] [%s] successfully loaded!", VAULTNAME)
if(get_pcvar_num(g_iDataExpired))
{
nvault_prune(g_VaultID, 0, get_systime() - (86400 * get_pcvar_num(g_iDataExpired)))
}
}
public plugin_end()
{
nvault_close(g_VaultID)
}
public client_authorized(id)
{
switch(get_pcvar_num(g_iSaveType))
{
case 1:
{
get_user_authid(id, g_szAuthID[id], charsmax(g_szAuthID[]))
}
case 2:
{
get_user_name(id, g_szName[id], charsmax(g_szName[]))
}
}
LoadFlags(id)
if(get_pcvar_num(g_iAnnounce))
{
set_task(5.0, "PremiumConect", id)
}
}
public client_disconnect(id)
{
SaveFlags(id)
}
public SaveFlags(id)
{
new szData[15]
num_to_str(g_Options[id], szData, charsmax(szData))
switch(get_pcvar_num(g_iSaveType))
{
case 1:
{
nvault_set(g_VaultID, g_szAuthID[id], szData)
}
case 2:
{
nvault_set(g_VaultID, g_szName[id], szData)
}
}
}
public LoadFlags(id)
{
switch(get_pcvar_num(g_iSaveType))
{
case 1:
{
g_Options[id] = nvault_get(g_VaultID, g_szAuthID[id])
}
case 2:
{
g_Options[id] = nvault_get(g_VaultID, g_szName[id])
}
}
}
public give_premium(id)
{
get_pcvar_string(g_sAdminFlag, g_sCurrentFlag, charsmax(g_sCurrentFlag))
new iFlags = read_flags(g_sCurrentFlag)
if(get_user_flags(id) & iFlags)
{
if(g_bGivePremium || g_bRemovePremium)
{
print_colored(id, "!g[PM] !tSomeone is opening premium menu. !yPlease try again later!")
}
else
{
g_bGivePremium = true
new iMenu = menu_create("\yGive Premium Member!", "premium_handler")
new iPlayers[32], iPlayerCount, Player
new szName[32], szUserID[32]
get_players(iPlayers, iPlayerCount, "c")
for(new i; i < iPlayerCount; i++)
{
Player = iPlayers[i]
get_user_name(Player, szName, charsmax(szName))
formatex(szUserID, charsmax(szUserID), "%d", get_user_userid(Player))
menu_additem(iMenu, szName, szUserID, 0)
}
menu_display(id, iMenu, 0)
}
}
}
public remove_premium(id)
{
get_pcvar_string(g_sAdminFlag, g_sCurrentFlag, charsmax(g_sCurrentFlag))
new iFlags = read_flags(g_sCurrentFlag)
if(get_user_flags(id) & iFlags)
{
if(g_bRemovePremium || g_bGivePremium)
{
print_colored(id, "!g[PM] !tSomeone is opening premium menu. !yPlease try again later!")
}
else
{
g_bRemovePremium = true
new iMenu = menu_create("\rRemove Premium Member!", "premium_handler")
new iPlayers[32], iPlayerCount, Player
new szName[32], szUserID[32]
get_players(iPlayers, iPlayerCount, "c")
for(new i; i < iPlayerCount; i++)
{
Player = iPlayers[i]
if(RecieveOption(id, Player))
{
get_user_name(Player, szName, charsmax(szName))
formatex(szUserID, charsmax(szUserID), "%d", get_user_userid(Player))
menu_additem(iMenu, szName, szUserID, 0)
}
}
menu_display(id, iMenu, 0)
}
}
}
public premium_handler(id, menu, item)
{
if(item == MENU_EXIT)
{
g_bGivePremium = false
g_bRemovePremium = false
menu_destroy(menu)
return PLUGIN_HANDLED
}
new szData[6], szName[64]
new iAccess, iItemCall
menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iItemCall)
new sUserID = str_to_num(szData)
new sPlayer = find_player("k", sUserID)
if(sPlayer)
{
get_user_name(sPlayer, szName, charsmax(szName))
if(g_bGivePremium && !g_bRemovePremium)
{
if(RecieveOption(id, sPlayer))
{
print_colored(id, "!g[PM] !t%s is !yalready a premium member!", szName)
g_bGivePremium = false
}
else
{
AddOption(sPlayer, PremMem)
print_colored(id, "!g[PM] !tNow, %s is !ypremium member!", szName)
SetPremiumMember(sPlayer)
g_bGivePremium = false
}
}
else if(g_bRemovePremium && !g_bGivePremium)
{
if(RecieveOption(id, sPlayer))
{
RemoveOption(sPlayer, PremMem)
print_colored(id, "!g[PM] !t%s is no longer !ypremium member!", szName)
ResetPremiumMember(sPlayer)
g_bRemovePremium = false
}
else
{
print_colored(id, "!g[PM] !t%s is !ynot a premium member!", szName)
g_bRemovePremium = false
}
}
}
menu_destroy(menu)
return PLUGIN_HANDLED
}
public fw_PremiumRespawn(id)
{
if(is_user_alive(id) && RecieveOption(id, PremMem))
{
set_task(2.0, "SetPremiumMember", id)
}
}
public fw_PremiumDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if(!is_user_alive(attacker) || victim == attacker)
return HAM_IGNORED
if(zp_get_user_zombie(attacker) || zp_get_user_survivor(attacker) || zp_get_user_nemesis(attacker))
return HAM_IGNORED
if(RecieveOption(attacker, PremMem))
{
if(get_pcvar_num(g_iDamageMultiply))
{
damage *= get_pcvar_float(g_iDamageMultiply)
SetHamParamFloat(4, damage)
}
if(get_pcvar_num(g_iDamageAmount))
{
g_fDamageDealt[attacker] += damage
new APRewards = floatround(g_fDamageDealt[attacker] / get_pcvar_float(g_iDamageAmount), floatround_floor)
if(APRewards > 0)
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_iAPBonus) * APRewards)
g_fDamageDealt[attacker] -= get_pcvar_float(g_iDamageAmount) * APRewards
print_colored(attacker, "!g[PM] !tFree !y%d AP bonus !tfor dealing %d damage!", get_pcvar_num(g_iAPBonus), get_pcvar_num(g_iDamageAmount))
}
}
}
if(RecieveOption(victim, PremMem) && get_pcvar_num(g_iNoFallDamage))
{
if(damage_type & DMG_FALL)
{
return HAM_SUPERCEDE;
}
}
return HAM_IGNORED
}
public fw_PremiumKilled(victim, attacker)
{
if(!is_user_alive(attacker) || victim == attacker)
return HAM_IGNORED
if(RecieveOption(attacker, PremMem))
{
if(zp_get_user_zombie(attacker) && !zp_get_user_nemesis(attacker))
{
if(zp_get_user_survivor(victim) && get_pcvar_num(g_iAPSurvivorBonus))
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_iAPSurvivorBonus))
print_colored(attacker, "!g[PM] !tFree !y%d AP bonus !tfor killing survivor!", get_pcvar_num(g_iAPSurvivorBonus))
}
if(!zp_get_user_zombie(victim) && get_pcvar_num(g_iAPHumanBonus))
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_iAPHumanBonus))
print_colored(attacker, "!g[PM] !tFree !y%d AP bonus !tfor infecting or killing human!", get_pcvar_num(g_iAPHumanBonus))
}
}
else if(!zp_get_user_zombie(attacker) && !zp_get_user_survivor(attacker))
{
if(get_pcvar_num(g_iFireNade))
{
cs_grenade_reward(attacker, get_pcvar_num(g_iFireNade), 0)
}
if(get_pcvar_num(g_iFrostNade))
{
cs_grenade_reward(attacker, get_pcvar_num(g_iFrostNade), 1)
}
if(zp_get_user_nemesis(victim) && get_pcvar_num(g_iAPNemesisBonus))
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_iAPNemesisBonus))
print_colored(attacker, "!g[PM] !tFree !y%d AP bonus !tfor killing nemesis!", get_pcvar_num(g_iAPNemesisBonus))
}
else if(zp_get_user_zombie(victim) && get_pcvar_num(g_iAPZombieBonus))
{
zp_set_user_ammo_packs(attacker, zp_get_user_ammo_packs(attacker) + get_pcvar_num(g_iAPZombieBonus))
print_colored(attacker, "!g[PM] !tFree !y%d AP bonus !tfor killing zombie!", get_pcvar_num(g_iAPZombieBonus))
}
}
}
return HAM_IGNORED
}
public SetPremiumMember(id)
{
if(is_user_alive(id) && RecieveOption(id, PremMem))
{
if(zp_get_user_zombie(id) && !zp_get_user_nemesis(id))
{
if(get_pcvar_num(g_iZombieHP))
{
cs_health_reward(id, get_pcvar_float(g_iZombieHP), 1)
}
if(get_pcvar_num(g_iZombieSpeed))
{
cs_speed_reward(id, 1, get_pcvar_num(g_iZombieSpeed), 0, 0.0)
}
if(get_pcvar_num(g_iZombieMultiJump))
{
cs_jump_reward(id, 1, get_pcvar_num(g_iZombieMultiJump), 0, 0.0)
}
}
else if(!zp_get_user_zombie(id) && !zp_get_user_survivor(id))
{
if(get_pcvar_num(g_iHumanHP))
{
cs_health_reward(id, get_pcvar_float(g_iHumanHP), 1)
}
if(get_pcvar_num(g_iHumanArmor))
{
cs_armor_reward(id, get_pcvar_float(g_iHumanArmor), 1)
}
if(get_pcvar_num(g_iHumanNoRecoil))
{
cs_norecoil_reward(id, 1, 0, 0.0)
}
if(get_pcvar_num(g_iHumanSpeed))
{
cs_speed_reward(id, 1, 150, 0, 0.0)
}
if(get_pcvar_num(g_iHumanMultiJump))
{
cs_jump_reward(id, 1, 3, 0, 0.0)
}
switch(get_pcvar_num(g_iHumanUnlimited))
{
case 1: cs_unlimited_reward(id, 1, 0, 0.0)
case 2: cs_unlimited_reward(id, 2, 0, 0.0)
}
}
}
}
public ResetPremiumMember(id)
{
if(is_user_alive(id))
{
cs_speed_reward(id, 0, 0, 0, 0.0)
cs_unlimited_reward(id, 0, 0, 0.0)
cs_jump_reward(id, 0, 0, 0, 0.0)
cs_norecoil_reward(id, 0, 0, 0.0)
}
}
public PremiumConect(id)
{
if(is_user_alive(id) && RecieveOption(id, PremMem))
{
new sName[32]
get_user_name(id, sName, charsmax(sName))
print_colored(0, "!g[PM] !tPremium member !y%s !tis connected to the server!", sName)
}
}
public MessageScoreAttrib(iMsgId, iDest, iReceiver)
{
new iPlayer = get_msg_arg_int(SCOREATTRIB_ARG_PLAYERID)
if(RecieveOption(iPlayer, PremMem))
{
set_msg_arg_int(SCOREATTRIB_ARG_FLAGS, ARG_BYTE, SCOREATTRIB_FLAG_VIP)
}
}
stock print_colored(const index, const input[], const any:... )
{
new players[32], message[191]
new count, i, player
count = 1
vformat(message, 190, input, 3)
replace_all(message, 190, "!y", "^1")
replace_all(message, 190, "!t", "^3")
replace_all(message, 190, "!g", "^4")
if(index)
{
players [0] = index
}
else
{
get_players(players, count, "ch")
}
for( i = 0; i < count; i ++ )
{
player = players[i]
if(is_user_connected(player))
{
message_begin(MSG_ONE_UNRELIABLE, g_iMsgTxt, _, player)
write_byte(player)
write_string(message)
message_end()
}
}
}