Don't just C&P code like that.
PHP Code:
#include <amxmodx>
#include <amxmisc>
#include <fun>
#include <fakemeta>
#include <engine>
#include <cstrike>
#include <nvault>
#include <played_time>
#include <hamsandwich>
#define PLUGIN "SoloGunner Mode"
#define VERSION "1.0"
#define AUTHOR "Khalid :)"
/* - - - - - - Edit Starts Here - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define ADMIN_FLAG ADMIN_BAN
#define GOLDEN_FLAG ADMIN_LEVEL_H
#define SILVER_FLAG ADMIN_LEVEL_G
#define ACTIVATE_DELAY 20.0
#define SOLO_AMMO 26
#define SOLO_MODEL "vip"
#define TASK_HUD 432548
// Times
#define MINS_FOR_SOLO_KILL 5
#define MINS_DECREMENT_SOLO_KNIFED 350
#define MINS_FOR_SOLO_KILLER 100
#define SOLO_SUICIDE_TIME_DECREMENT 350
#define SOLO_DISCONNECT_TIME_DECREMENT 350
// Limits
#define ADMIN_ACTIVATES 3
#define GOLDEN_ACTIVATES 2
#define SILVER_ACTIVATES 1
/* - - - - - - Edit Ends Here - - - - - - - - - - - - - - - - - - - - - - - - - - - */
#define FINAL (ADMIN_FLAG | SILVER_FLAG | GOLDEN_FLAG)
#define OFFSET_MAPZONES 235
#define IsValidPlayer(%1) (1 <= %1 <= g_iMaxPlayers)
new bool:g_bRunning = false
new g_iModeActivates[33], g_iSoloId, Float:g_flRoundStartGameTime
new gMsgIdCurWeapon
new g_szOldModel[20]
new gVault, g_iMaxPlayers
enum _:Levels
{
ADMIN,
GOLDEN,
SILVER
}
new g_iActivateTimes[Levels] = {
ADMIN_ACTIVATES,
GOLDEN_ACTIVATES,
SILVER_ACTIVATES
}
/*
The player who activates this mode becomes a Solo Gunner and the following happens:
The solo gunner will have a knife and a USP gun with 26 bullets only.
The rest of the players will only be able to carry a knife.
The solo gunner shall get 5 minutes added to his/her total time on every player he/she kills. -- wait
If the solo gunner gets knifed and killed, he/she will lose 350 minutes of his/her total time and a bell-like sound will be played to inform others. -- wait
If a player kills a solo gunner, 100 minutes will be added to his/her total time. -- wait
If the solo gunner disconnects from the server (to avoid being killed), he/she will lose 350 minutes. -- wait
Solo Gunner Mode is activated for one round only. Everything would return to normal by next round.
Silvers can activate this mode once per day, Goldens twice per day, and Administrators three times per day. However, to keep this mode interesting, the server will allow Solo Gunner mode to be activated a total of 3 times per map.
*/
public plugin_precache()
{
new szFile[60]
formatex(szFile, charsmax(szFile), "models/player/%s/%s.mdl", SOLO_MODEL, SOLO_MODEL)
precache_model(szFile)
precache_sound("bell.wav")
}
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
register_concmd("ad_solo", "AdminActivate", FINAL)
register_concmd("amx_reset_times", "AdminResetTimes", ADMIN_RCON, "<name> - Resets current mod activates")
register_touch("weaponbox", "player", "fw_BlockWeaponPickUp")
register_touch("armoury_entity", "player", "fw_BlockWeaponPickUp")
register_forward(FM_SetClientKeyValue, "fw_SetClientKeyValue")
register_event("CurWeapon", "eCurWeapon", "b")
register_event("HLTV", "eNewRound", "a", "1=0", "2=0")
register_event("DeathMsg", "eDeath", "a")
register_logevent("RoundEnd", 2, "1=Round_End")
register_message(get_user_msgid("StatusIcon"), "message_StatusIcon")
gMsgIdCurWeapon = get_user_msgid("CurWeapon")
g_iMaxPlayers = get_maxplayers()
// I was lazy to use files, nvault is faster and easier :D
gVault = nvault_open("SoloUses")
if(gVault == INVALID_HANDLE)
set_fail_state("Couldn't open Solo Activates vault file")
new szCurrentDay[6], szVaultDay[6], iSysTime
format_time(szCurrentDay, charsmax(szCurrentDay), "%j", (iSysTime = get_systime()))
nvault_get(gVault, "day", szVaultDay, charsmax(szVaultDay))
if(!equal(szCurrentDay, szVaultDay))
{
nvault_prune(gVault, 0, iSysTime + 28)
nvault_remove(gVault, "day")
nvault_set(gVault, "day", szCurrentDay)
log_amx("The day has changed! Reseting Ghost Activates")
}
}
public plugin_end()
{
nvault_close(gVault)
}
public client_putinserver(id)
{
if(get_user_flags(id) & FINAL)
g_iModeActivates[id] = LoadUses(id)
}
public client_disconnect(id)
{
if(g_bRunning && id == g_iSoloId)
{
set_user_playedtime(id, get_user_playedtime(id) - SOLO_DISCONNECT_TIME_DECREMENT)
}
if(get_user_flags(id) & FINAL)
SaveUses(id)
}
public AdminResetTimes(id, level, cid)
{
if(!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
static szArg[32]
read_argv(1, szArg, charsmax(szArg))
new iPlayer = cmd_target(id, szArg, CMDTARGET_ALLOW_SELF)
if(szArg[0] == '*' && !szArg[1])
{
console_print(id, "Reseted Solo Activates for this day for all connected players (admin\golden\silver)")
arrayset(g_iModeActivates, 0 , sizeof(g_iModeActivates))
return PLUGIN_HANDLED
}
if(!iPlayer)
{
console_print(id, "Player could not be found")
return PLUGIN_HANDLED
}
get_user_name(iPlayer, szArg, charsmax(szArg))
g_iModeActivates[id] = 0
console_print(id, "Reseted SoloGunner Activates for player %s", szArg)
return PLUGIN_HANDLED
}
public AdminActivate(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
if(g_bRunning)
{
console_print(id, "*** Mode is already running")
return PLUGIN_HANDLED
}
if(!is_user_alive(id))
{
console_print(id, "*** You must be alive to activate the mode")
return PLUGIN_HANDLED
}
new iFlags = get_user_flags(id)
if(!CanActivate(id, iFlags))
{
return PLUGIN_HANDLED
}
g_bRunning = true; g_iSoloId = id
new iPlayers[32], iNum, iPlayer
get_players(iPlayers, iNum, "ach")
for(new i; i < iNum; i++)
{
iPlayer = iPlayers[i]
strip_user_weapons(iPlayer)
give_item(iPlayer, "weapon_knife")
if(iPlayer == id)
{
give_item(iPlayer, "weapon_usp")
cs_set_user_bpammo(iPlayer, CSW_USP, SOLO_AMMO)
get_user_model(iPlayer, g_szOldModel, charsmax(g_szOldModel))
set_user_model(iPlayer, SOLO_MODEL)
}
}
new szName[32]
get_user_name(id, szName, charsmax(szName))
client_print(0, print_chat, "*** %s %s: Activated SoloGunner mode. Everything will return to normal next round.", ( iFlags & ADMIN_FLAG ? "Administrator" : ( iFlags & GOLDEN_FLAG ? "Golden Player" : "Silver Player" ) ), szName)
client_print(0, print_chat, "*** Everyone will only have a knife in this round and %s will only have one gun and a knife.", szName)
client_print(0, print_chat, "*** If %s gets killed in this round, 350 minutes will be deducted from his/her total time.", szName)
client_print(0, print_chat, "*** If you are in %s's team, try to help him/her by killing the opposing team.", szName)
set_task(1.0, "hud_message", id+TASK_HUD)
g_iModeActivates[id]++
return PLUGIN_HANDLED
}
public hud_message(taskid)
{
new id = taskid - TASK_HUD
if(!is_user_connected(id))
{
remove_task(taskid)
return
}
new iFlags = get_user_flags(id)
new szName[32]
get_user_name(id, szName, charsmax(szName))
set_hudmessage(255, 255, 0, -1.0, 0.25, 0, 6.0, 1.0)
show_hudmessage(0, "%s %s Activated SoloGunner mode^nBullets Remaining: %d", ( iFlags & ADMIN_FLAG ? "Administrator" : ( iFlags & GOLDEN_FLAG ? "Golden Player" : "Silver Player" ) ), szName, cs_get_user_bpammo(id, CSW_USP))
set_task(1.0, "hud_message", taskid)
}
public fw_BlockWeaponPickUp(iTouched, iToucher)
return g_bRunning ? PLUGIN_HANDLED : PLUGIN_CONTINUE
// Thanks to MeRcyLeZZ for model change stuff
public fw_SetClientKeyValue( id, const infobuffer[], const key[] )
{
if(!g_bRunning)
return FMRES_IGNORED
if ( id == g_iSoloId && equal( key, "model" ) )
{
static szCurrentModel[32]
get_user_model( id, szCurrentModel, charsmax( szCurrentModel ) )
if ( !equal( szCurrentModel, "vip" ) )
set_user_model( id, "vip")
return FMRES_SUPERCEDE;
}
return FMRES_IGNORED;
}
public eNewRound()
{
g_flRoundStartGameTime = get_gametime()
}
public eCurWeapon(id)
{
if(!is_user_alive(id) || !g_bRunning)
return;
new iWeaponId = read_data(2)
if(id != g_iSoloId && iWeaponId != CSW_KNIFE)
{
// Just in case
engclient_cmd(id, "weapon_knife")
message_begin(MSG_ONE, gMsgIdCurWeapon,_, id)
write_byte(1)
write_byte(CSW_KNIFE)
write_byte(-1)
message_end()
}
}
public RoundEnd()
{
g_bRunning = false
set_user_model(g_iSoloId, g_szOldModel)
}
public eDeath()
{
if(!g_bRunning)
return;
new iKiller = read_data(1)
new iVictim = read_data(2)
new szWeapon[25]
read_data(4, szWeapon, charsmax(szWeapon))
// Solo killed someone
if(iKiller == g_iSoloId && iVictim != g_iSoloId)
{
client_print(iKiller, print_chat, "*** You have gained %d minutes for killing", MINS_FOR_SOLO_KILL)
set_user_playedtime(iKiller, get_user_playedtime(iKiller) + MINS_FOR_SOLO_KILL)
}
// Suicide
else if( (!iKiller || !IsValidPlayer(iKiller) || iKiller == iVictim) && iVictim == g_iSoloId )
{
client_print(iVictim, print_chat, "*** %d minutes have been taken from you for suiciding", SOLO_SUICIDE_TIME_DECREMENT)
set_user_playedtime(iVictim, get_user_playedtime(iVictim) - SOLO_SUICIDE_TIME_DECREMENT)
}
// Someone killed solo
else if( iKiller != iVictim && iVictim == g_iSoloId && IsValidPlayer(iKiller) )
{
static szName[32]; get_user_name(iKiller, szName, charsmax(szName))
if(equal(szWeapon, "knife"))
{
// Play bell sound
client_cmd(0, "spk ^"bell^"")
client_print(iVictim, print_chat, "*** %d minutes have been taken from you for being knifed and killed", MINS_DECREMENT_SOLO_KNIFED)
set_user_playedtime(iVictim, get_user_playedtime(iVictim) - MINS_DECREMENT_SOLO_KNIFED)
}
client_print(0, print_chat, "*** %d minutes were added to %s for killing the SoloGunner", MINS_FOR_SOLO_KILLER, szName)
set_user_playedtime(iKiller, get_user_playedtime(iKiller) + MINS_FOR_SOLO_KILLER)
}
}
public message_StatusIcon(msgid, msgdest, id)
{
if(g_bRunning)
{
static szIcon[10]
get_msg_arg_string(2, szIcon, charsmax(szIcon))
if(equal(szIcon, "buyzone") && get_msg_arg_int(1))
{
set_pdata_int(id, OFFSET_MAPZONES, get_pdata_int(id, OFFSET_MAPZONES) & ~(1<<0))
return PLUGIN_HANDLED
}
}
return PLUGIN_CONTINUE
}
LoadUses(id)
{
static szAuthId[33]; get_user_authid(id, szAuthId, charsmax(szAuthId))
static szUses[4], iTimeStamp
if(nvault_lookup(gVault, szAuthId, szUses, charsmax(szUses), iTimeStamp))
{
return str_to_num(szUses)
}
return 0
}
SaveUses(id)
{
static szAuthId[33], szUses[4]; get_user_authid(id, szAuthId, charsmax(szAuthId))
nvault_remove(gVault, szAuthId)
formatex(szUses, charsmax(szUses), "%d", g_iModeActivates[id])
nvault_set(gVault, szAuthId, szUses)
}
CanActivate(id, iFlags)
{
if(get_gametime() - g_flRoundStartGameTime > ACTIVATE_DELAY)
{
console_print(id, "*** Mode connot be activated as more than %f seconds passed since round start", ACTIVATE_DELAY)
return 0
}
if( g_iModeActivates[id] > g_iActivateTimes[get_level(iFlags)] )
{
console_print(id, "*** You have exceeded the SoloGunner mode activates for this day")
return 0
}
return 1
}
get_level(iFlags)
{
if(iFlags & ADMIN_FLAG)
return ADMIN
if(iFlags & GOLDEN_FLAG)
return GOLDEN
if(iFlags & SILVER_FLAG)
return SILVER
return 0
}
// Thanks to MeRcyLeZZ for model change stuff
stock set_user_model( player, const modelname[] )
{
engfunc( EngFunc_SetClientKeyValue, player, engfunc( EngFunc_GetInfoKeyBuffer, player ), "model", modelname )
}
stock get_user_model( player, model[], len )
{
engfunc( EngFunc_InfoKeyValue, engfunc( EngFunc_GetInfoKeyBuffer, player ), "model", model, len )
}