#define PLUGINNAME "Automatic knife duel"
#define VERSION "0.3"
#define AUTHOR "JGHG"
/*
Copyleft 2005
AUTOMATIC KNIFE DUEL
====================
Where I come from, if you cut the wall repeteadly with your knife it means you're challenging your last opponent to a knife duel. <!-- s;-) --><img src=\"{SMILIES_PATH}/icon_e_wink.gif\" alt=\";-)\" title=\"kacsintás\" /><!-- s;-) -->
I decided to automate this process.
If only you and another person on the opposite team remain in the round, you can hit a wall (or another object) with your knife, THREE TIMES in fast succession.
By this action you challenge your opponent to a knife duel. The person you challenge gets a menu where he can accept/decline your
challenge. The challenged person has 10 seconds to decide his mind, else the challenge is automatically declined, and the menu should be closed automatically.
Should a knife duel start, it works out pretty much like a round of Knife Arena: you can only use the knife (and the C4!).
As soon as the round ends the Knife Arena mode is turned off.
/JGHG
VERSIONS
========
050421 0.3 You must now slash with your knife three times in fast succession to challenge someone.
050208 0.2 Fixed seconds display.
Bots should now respond correctly and a little human like. They will mostly accept challenges. <!-- s;-) --><img src=\"{SMILIES_PATH}/icon_e_wink.gif\" alt=\";-)\" title=\"kacsintás\" /><!-- s;-) -->
Small fixes here and there. <!-- s:-) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":-)\" title=\"mosoly\" /><!-- s:-) -->
050208 0.1 First version - largely untested
*/
#include <amxmodx>
#include <amxmisc>
#include <fakemeta>
#include <fun>
#include <hamsandwich>
#define DEBUG
#if defined DEBUG
#include <amxmisc>
#endif // defined DEBUG
#define MENUSELECT1 0
#define MENUSELECT2 1
#define TASKID_CHALLENGING 2348923
#define TASKID_BOTTHINK 3242321
#define DECIDESECONDS 20
#define ALLOWED_WEAPONS 2
#define KNIFESLASHES 3 // the nr of slashes within a short amount of time until a challenge starts...
// Globals below
new g_allowedWeapons[ALLOWED_WEAPONS] = {CSW_KNIFE, CSW_C4}
new g_MAXPLAYERS
new bool:g_challenging = false
new bool:g_knifeArena = false
new bool:g_noChallengingForAWhile = false
new g_challengemenu
new g_challenger
new g_challenged
new g_challenges[33]
// Globals above
new g_enable, knife_fight, g_maxplayers, g_IsBot[33],
g_msgsync, g_PlayerWeapons[33], g_playername[33][32],
g_msgCurWeapon, cvar_showhud, cvar_offnoadm
new gBuyCommands[][] =
{
"usp", "glock", "deagle", "p228", "elites", "fn57", "m3", "xm1014", "mp5", "tmp", "p90", "mac10", "ump45", "ak47",
"galil", "famas", "sg552", "m4a1", "aug", "scout", "awp", "g3sg1", "sg550", "m249", "vest", "vesthelm", "flash", "hegren",
"sgren", "defuser", "nvgs", "shield", "primammo", "secammo", "km45", "9x19mm", "nighthawk", "228compact", "12gauge",
"autoshotgun", "smg", "mp", "c90", "cv47", "defender", "clarion", "krieg552", "bullpup", "magnum", "d3au1", "krieg550",
"buyammo1", "buyammo2"
}
public plugin_modules()
{
require_module("fakemeta")
require_module("fun")
}
public forward_emitsound(const PIRATE, const Onceuponatimetherewasaverysmall, noise[], const Float:turtlewhoateabiggerturtleand, const Float:afterthatthesmallturtlegot, const veryveryverybig, const theend) {
if (g_noChallengingForAWhile || g_knifeArena || g_challenging || PIRATE < 1 || PIRATE > g_MAXPLAYERS || !is_user_alive(PIRATE) || !equal(noise, "weapons/knife_hitwall1.wav"))
return FMRES_IGNORED
new team = get_user_team(PIRATE), otherteam = 0, matchingOpponent = 0
// Make sure exactly one person on each team is alive.
for (new i = 1; i <= g_MAXPLAYERS; i++) {
if (!is_user_connected(i) || !is_user_alive(i) || PIRATE == i)
continue
if (get_user_team(i) == team) {
// No fun.
return FMRES_IGNORED
}
else {
if (++otherteam > 1) {
// No fun.
return FMRES_IGNORED
}
matchingOpponent = i
}
}
if (matchingOpponent == 0)
return FMRES_IGNORED
if (++g_challenges[PIRATE] >= KNIFESLASHES) {
Challenge(PIRATE, matchingOpponent)
if (is_user_bot(matchingOpponent)) {
new Float:val = float(DECIDESECONDS)
if (val < 2.0)
val = 2.0
remove_task(TASKID_BOTTHINK)
set_task(random_float(1.0, float(DECIDESECONDS) - 1.0), "BotDecides", TASKID_BOTTHINK)
}
g_challenges[PIRATE] = 0
}
else
set_task(1.0, "decreaseChallenges", PIRATE)
//client_print(PIRATE, print_chat, "Your challenges: %d", g_challenges[PIRATE])
return FMRES_IGNORED
}
public decreaseChallenges(id) {
if (--g_challenges[id] < 0)
g_challenges[id] = 0
}
public BotDecides() {
if (!g_challenging)
return
if (random_num(0,9) > 0)
Accept()
else {
DeclineMsg()
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
}
Challenge(challenger, challenged) {
g_challenger = challenger
g_challenged = challenged
g_challenging = true
new challenger_name[32], challenged_name[32]
get_user_name(challenger, challenger_name, 31)
get_user_name(challenged, challenged_name, 31)
client_print(challenger, print_chat, "Megakarsz kuzdeni %s -val egy kesparbajban? Varj a valaszara %d masodpercet...", challenged_name, DECIDESECONDS)
new menu[1024], keys = MENU_KEY_1 | MENU_KEY_2
format(menu, 1023, "Megakarsz kuzdeni %s egy kesparbajban?^n^nMit teszel? Van %d masodmeprced a valaszra!^n^n\y1\w. Vagjunk bele!^n\y2\w. Nem merek mert gyava kukac vagyok!", challenger_name, DECIDESECONDS)
show_menu(challenged, keys, menu, DECIDESECONDS, "JGHG's automatic knife duel")
set_task(float(DECIDESECONDS), "timed_toolate", TASKID_CHALLENGING)
}
public timed_toolate() {
if (g_challenging) {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s Nem v?laszolt %s a kihivasara eleg gyorsan...", challenged_name, challenger_name)
CancelAll()
}
}
public client_putinserver(id) {
set_task(25.0, "Announcement", id)
g_IsBot[id] = is_user_bot(id)
get_user_name(id, g_playername[id], charsmax(g_playername[]))
return PLUGIN_CONTINUE
}
public Announcement(id) {
client_print(id, print_chat, "Amikor mar csak te es egy ellenseged maradt ki tudod hivni ot egy kesparbajra, csak verd a kesed a falhoz! ")
}
public challenged_menu(id, key) {
switch (key) {
case MENUSELECT1: {
// Accept
Accept()
}
case MENUSELECT2: {
// Decline
DeclineMsg()
}
}
g_challenging = false
remove_task(TASKID_CHALLENGING)
return PLUGIN_HANDLED
}
DeclineMsg() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s Nem fogadta el %s a kihivasat...", challenged_name, challenger_name)
}
Accept() {
new challenger_name[32], challenged_name[32]
get_user_name(g_challenger, challenger_name, 31)
get_user_name(g_challenged, challenged_name, 31)
client_print(0, print_chat, "%s Elfogadta %s a kihivasat!", challenged_name, challenger_name)
g_knifeArena = true
give_item(g_challenger, "weapon_knife")
give_item(g_challenged, "weapon_knife")
engclient_cmd(g_challenger, "weapon_knife")
engclient_cmd(g_challenged, "weapon_knife")
}
public event_holdwpn(id) {
if (!g_knifeArena || !is_user_alive(id))
return PLUGIN_CONTINUE
new weaponType = read_data(2)
for (new i = 0; i < ALLOWED_WEAPONS; i++) {
if (weaponType == g_allowedWeapons[i])
return PLUGIN_CONTINUE
}
engclient_cmd(id, "weapon_knife")
return PLUGIN_CONTINUE
}
public event_roundend() {
if (g_challenging || g_knifeArena)
CancelAll()
g_noChallengingForAWhile = true
set_task(4.0, "NoChallengingForAWhileToFalse")
return PLUGIN_CONTINUE
}
public NoChallengingForAWhileToFalse() {
g_noChallengingForAWhile = false
}
CancelAll() {
if (g_challenging) {
g_challenging = false
// Close menu of challenged
if (is_user_connected(g_challenged)) {
new usermenu, userkeys
get_user_menu(g_challenged, usermenu, userkeys) // get user menu
// Hmm this ain't working :-/
if (usermenu == g_challengemenu) // Close it!
show_menu(g_challenged, 0, "blabla") // show empty menu
}
}
if (g_knifeArena) {
g_knifeArena = false
}
remove_task(TASKID_BOTTHINK)
remove_task(TASKID_CHALLENGING)
}
public event_death() {
if (g_challenging || g_knifeArena)
CancelAll()
return PLUGIN_CONTINUE
}
#if defined DEBUG
public challengefn(id, level, cid) {
if (!cmd_access(id, level, cid, 3))
return PLUGIN_HANDLED
new challenger[64], challenged[64]
read_argv(1, challenger, 63)
read_argv(2, challenged, 63)
console_print(id, "challenger: %s, challenged: %s", challenger, challenged)
new r = str_to_num(challenger)
new d = str_to_num(challenged)
Challenge(r, d)
if (is_user_bot(d))
Accept()
return PLUGIN_HANDLED
}
#endif // defined DEBUG
public plugin_init() {
register_plugin(PLUGINNAME, VERSION, AUTHOR)
register_event("CurWeapon", "event_holdwpn", "be", "1=1")
register_forward(FM_EmitSound, "forward_emitsound")
g_MAXPLAYERS = get_maxplayers()
g_challengemenu = register_menuid("JGHG's automatic knife duel"/*"You are challenged"*/)
register_menucmd(g_challengemenu, MENU_KEY_1 | MENU_KEY_2, "challenged_menu")
register_event("DeathMsg", "event_death", "a")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_terwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_ctwin")
register_event("SendAudio", "event_roundend", "a", "2&%!MRAD_rounddraw")
register_cvar("kf_version", VERSION, FCVAR_SERVER|FCVAR_SPONLY)
register_dictionary("Knife_Fight.txt")
g_enable = register_cvar("kf_enable", "1")
cvar_showhud = register_cvar("kf_showhud", "1")
cvar_offnoadm = register_cvar("kf_offnoadm", "1")
register_clcmd("say /kf", "cmdkf", ADMIN_KICK)
register_event("HLTV", "event_round_start", "a", "1=0", "2=0")
RegisterHam(Ham_Spawn, "player", "fw_PlayerSpawn_Post", 1)
RegisterHam(Ham_Touch, "weaponbox", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "armoury_entity", "fw_TouchWeapon")
RegisterHam(Ham_Touch, "weapon_shield", "fw_TouchWeapon")
g_msgsync = CreateHudSyncObj()
g_maxplayers = get_maxplayers()
for (new i; i < sizeof gBuyCommands; i++)
register_clcmd(gBuyCommands[i], "BlockBuyCommands")
register_event("CurWeapon", "event_cur_weapon", "b", "1=1")
g_msgCurWeapon = get_user_msgid("CurWeapon")
#if defined DEBUG
register_clcmd("0challenge", "challengefn", ADMIN_CFG, "<challenger> <challenged> - start knife duel challenge")
#endif // defined DEBUG
new Float:maptime = get_cvar_float("mp_timelimit")
if (maptime == 0.0)
maptime = 15.0
new Float:anntime = 60.0 * 5.0 // 5 minutes
if (maptime < 5.0)
anntime = maptime / 3.0
set_task(anntime, "Announcement", 0, "", 0, "b")
}
public cmdkf(id, level, cid)
{
if(get_pcvar_num(g_enable))
{
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
if(knife_fight)
{
if(get_pcvar_num(cvar_showhud))
{
set_hudmessage(255, 0, 0, 0.3, 0.0, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_msgsync, "[KF] %L", LANG_PLAYER, "HUD_DISABLE_ADM", g_playername[id])
}
knife_fight = false
for(new id = 1;id <= g_maxplayers;id++)
{
if(is_user_alive(id))
restore_weapons(id)
}
}
else
{
if(get_pcvar_num(cvar_showhud))
{
set_hudmessage(255, 0, 0, 0.3, 0.0, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_msgsync, "[KF] %L", LANG_PLAYER, "HUD_ENABLE", g_playername[id])
}
knife_fight = true
for(new id = 1;id <= g_maxplayers;id++)
{
if(is_user_alive(id))
{
g_PlayerWeapons[id] = pev(id , pev_weapons) &~ ( 1 << 31 )
strip_user_weapons(id)
give_item(id, "weapon_knife")
}
}
}
}
else
client_print(id, print_chat, "[KF] %L", id, "KF_DISABLE")
return PLUGIN_HANDLED
}
public event_round_start()
{
if(get_pcvar_num(cvar_offnoadm) && !fnGetAdms() && knife_fight)
{
knife_fight = false
if(get_pcvar_num(cvar_showhud))
{
set_hudmessage(255, 0, 0, 0.4, 0.0, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_msgsync, "[KF] %L", LANG_PLAYER, "HUD_DISABLE")
}
return PLUGIN_HANDLED
}
if(knife_fight)
{
if(get_pcvar_num(cvar_showhud))
{
set_hudmessage(255, 0, 0, 0.4, 0.0, 1, 0.0, 5.0, 1.0, 1.0, -1)
ShowSyncHudMsg(0, g_msgsync, "[KF] %L", LANG_PLAYER, "HUD_KF")
}
}
return PLUGIN_CONTINUE
}
public fw_PlayerSpawn_Post(id)
{
if (!is_user_alive(id))
return
if(get_pcvar_num(g_enable) && knife_fight)
{
strip_user_weapons(id)
give_item(id, "weapon_knife")
}
}
public fw_TouchWeapon(weapon, id)
{
if (knife_fight && (1 <= id <= g_maxplayers) && !g_IsBot[id])
return HAM_SUPERCEDE
return HAM_IGNORED
}
public client_infochanged(id)
get_user_name(id, g_playername[id], charsmax(g_playername[]))
public restore_weapons(id)
{
new iValue = g_PlayerWeapons[id]
for(new j = 1 ; j <= 30 ; j++)
{
if ((1 & (iValue >> j)) && (j != 2) && (j != CSW_C4) && (j != CSW_KNIFE))
{
static szWeapon[32]
get_weaponname(j, szWeapon, 31)
give_item(id, szWeapon)
}
}
}
fnGetAdms()
{
new adms, id
adms = 0
for(id = 1;id <= g_maxplayers;id++)
{
if(get_user_flags(id) & ADMIN_KICK)
adms++
}
return adms
}
public BlockBuyCommands(id)
return knife_fight ? PLUGIN_HANDLED : PLUGIN_CONTINUE
public event_cur_weapon(id)
{
if (!is_user_alive(id))
return;
if (knife_fight && !((1<<read_data(2)) & (1<<CSW_KNIFE)))
{
engclient_cmd(id, "weapon_knife")
emessage_begin(MSG_ONE, g_msgCurWeapon, _, id)
ewrite_byte(1)
ewrite_byte(CSW_KNIFE)
ewrite_byte(-1)
emessage_end()
}
}