#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fun>
// ---------- Adjust below settings to your liking ---------------------------------------
//#define DEBUGMODE // remove this comment to compile in debugmode
#define IWANTPRIZES // comment this if you don't want prizes
#define XTRA_HEALTHBOOST 100 // how much extra health a health boost prize should give
// When you win money over $16000, the plugin automatically "buys" you prizes for that money until that money is all used up.
// You can change these values. Ie by default an extra life costs 1000, extra health 100 and armour 10. The plugin first tries to buy you as many extra lives
// it can (ie until less than $1000 remains), then goes on to buy extra health, and then extra armour. With that said, make sure extra life is still the most expensive
// and extra armour the cheapest prize, or you will run into trouble.
#define PRIZEPRICE_EXTRALIFE 1000
#define PRIZEPRICE_EXTRAHEALTH 100
#define PRIZEPRICE_EXTRAARMOUR 10
#define HUDCHANNEL_T 2 // Hud channels. You probably don't need to change these, but you can if you find that some of hud-displaying plugins are interfered
#define HUDCHANNEL_CT 3 // by the red/blue messages telling how much each player was bet on.
#define HUDMESSAGE_HOLDTIME 25.0 // For how many seconds (after last placed bet) should the red/blue messages stay onscreen. Must be a float (end with a decimal) value.
// __________________Bot settings here (you don't need to touch these)__________________
// A bot can be a "gambler", betting on the person with the lowest sum of HP and armour, else he's playing it "safe". To become a gambler
// each bot needs to get a random value below a certain (individual) value. This value in turn is gotten by choosing a random value between BOTGAMBLERMIN and BOTGAMBLERMAX.
// Ie the bot gamble value could end up as 0.3, and then it's a 30% chance that the bot will bet on the weaker remaining player.
#define BOTGAMBLERMAX 0.4
#define BOTGAMBLERMIN 0.1
// A random float from 0.0 to 1.0 decides how much $ a bot will bet. A setting will be used if the random float ends at least this value.
#define RATIO_HIGH 0.9
#define RATIO_MEDIUM 0.6
// Depending on ratio, this is how much of the bot's current money the bot will bet. MAXBET_LOW can at most let the bot set about one third of his total money sum.
#define MAXBET_LOW 0.3 // about one third here
#define MAXBET_MEDIUM 0.5 // half money maximum here
#define MAXBET_HIGH 1.0 // bot could bet all of his money here
// ---------- Adjust above settings to your liking ---------------------------------------
#define MENUBUTTON1 (1<<0)
#define MENUBUTTON2 (1<<1)
#define MENUBUTTON3 (1<<2)
#define MENUBUTTON4 (1<<3)
#define MENUBUTTON5 (1<<4)
#define MENUBUTTON6 (1<<5)
#define MENUBUTTON7 (1<<6)
#define MENUBUTTON8 (1<<7)
#define MENUBUTTON9 (1<<8)
#define MENUBUTTON0 (1<<9)
#define MENUSELECT1 0
#define MENUSELECT2 1
#define MENUSELECT3 2
#define MENUSELECT4 3
#define MENUSELECT5 4
#define MENUSELECT6 5
#define MENUSELECT7 6
#define MENUSELECT8 7
#define MENUSELECT9 8
#define MENUSELECT0 9
#define TEAM_T 1
#define TEAM_CT 2
// Time in seconds (must be float) from 1vs1 situation appears until bettings start - if the player that died when it was 2vs1 has respawned, the betting will be called off.
#define INITBETTINGSTIME 1.0
// Time in seconds (must be float) from a player dies until respawn, if having any extra lives. If round ended during this time, respawn will be called off. Must be lower than INITBETTINGSTIME.
#define RESPAWNTIME 0.5
#define TASKID_RESPAWN 100 // just some value. don't change
#define TASKID_BETTINGS 200 // don't change
#define TASKID_BETTIMER 300 // don't change
#define TASKID_BETTIMERDISPLAY 400 // don't change
// Hud settings
#define TRED 200
#define TGREEN 0
#define TBLUE 0
#define TX 0.25
#define CTRED 0
#define CTGREEN 0
#define CTBLUE 200
#define CTX 0.75
#define Y 0.35
#define EFFECTS 0
#define FXTIME 6.0
#define FADEINTIME 0.1
#define FADEOUTTIME 0.2
// Global vars below
//new const CT[] = "CT"
//new const T[] = "TERRORIST"
new const OVERRIDEPREVIOUSMENU[] = "lastmanbets_overridemenus"
new const CVAR_DEFAULTBET[] = "lastmanbets_defaultbet"
new const CVAR_BETTIME[] = "lastmanbets_bettime"
new const VAULTKEY_POT[] = "lastmanbets_pot"
new g_names[3][33]
new g_betperson[33]
new g_betamount[33]
new g_t
new g_ct
new bool:g_betting = false
new g_pot = 0
new g_betmenu
new bool:g_round
enum BETSETTING {BET_LOW, BET_MEDIUM, BET_HIGH}
#if defined IWANTPRIZES
new g_extralives[33] = {0, ...}
new g_extrahealth[33] = {0, ...}
new g_extraarmour[33] = {0, ...}
new bool:g_freezenewround[33] = {false, ...} // to prevent from giving prizes several times on newround (could happen ~2 times for some reason)
#endif
// Global vars above
public death_event() {
#if defined IWANTPRIZES
new victim = read_data(2) // victim needed by IWANTPRIZES and DEBUGMODE, else not
//client_print(0, print_chat, "death_event, victim: %d, g_round: %d, g_extralives[victim]: %d", victim, g_round, g_extralives[victim])
if (g_extralives[victim]) {
new team = get_user_team(victim)
if (team == TEAM_T || team == TEAM_CT) {
new idd[1]
idd[0] = victim
set_task(RESPAWNTIME, "respawn", TASKID_RESPAWN + victim, idd, 1)
// Return here. If victim died and can respawn, this means a 1vs1 has not happened yet. Victim will not respawn if round ended - and if round ended, bet shouldn't start anyway.
//client_print(0, print_chat, "death_event, end 1")
return PLUGIN_CONTINUE
}
}
#endif // defined IWANTPRIZES
if (!g_round) {
//client_print(0, print_chat, "death_event, end 2")
return PLUGIN_CONTINUE
}
new cts[32], ts[32], ctsnum = 0, tsnum = 0
new const MAXPLAYERS = get_maxplayers()
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || !is_user_alive(i))
continue
switch (cs_get_user_team(i)) {
case TEAM_T: ts[tsnum++] = i
case TEAM_CT: cts[ctsnum++] = i
default: {
// A user that is not alive but not on T _or_ CT, who is he anyway?? <img src='https://amxx.pl/public/style_emoticons/<#EMO_DIR#>/biggrin.gif' class='bbc_emoticon' alt=':-)' />
return PLUGIN_CONTINUE
}
}
if (tsnum > 1 || ctsnum > 1) {
//client_print(0, print_chat, "Deathevent ends in loop, not 1vs1: CT: %d, T: %d", ctsnum, tsnum)
return PLUGIN_CONTINUE
}
}
// (These two get_players had problems in earlier versions, they are now replaced by manual code finding players)
//get_players(cts, ctsnum, "ae", CT) // match alive and team
//get_players(ts, tsnum, "ae", T) // match alive and team
if (ctsnum != 1 || tsnum != 1) {
//client_print(0, print_chat, "death_event, end 3, CT: %d, T: %d", ctsnum, tsnum)
return PLUGIN_CONTINUE
}
get_user_name(ts[0], g_names[TEAM_T], 32)
get_user_name(cts[0], g_names[TEAM_CT], 32)
g_t = ts[0]
g_ct = cts[0]
#if defined DEBUGMODE
new victimdebug = read_data(2) // victim needed by IWANTPRIZES and DEBUGMODE, else not
new victimname[32]
get_user_name(victimdebug, victimname, 31)
log_amx("Betting will maybe start in %f seconds (if %s that just died does not respawn, or the round ends)", INITBETTINGSTIME, victimname)
#endif
set_task(INITBETTINGSTIME, "initbettings", TASKID_BETTINGS)
return PLUGIN_CONTINUE
}
displaybetshud() {
//client_print(0, print_chat, "%s obstawil $%d na %s.", name, g_betamount[id], g_names[g_betperson[id]])
new const MAXPLAYERS = get_maxplayers()
// First calculate how much each player has been bet on.
new betamounts[2] = {0, 0}, betcount[2] = {0, 0} // t, ct
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) // no one can win money from a player that has disconnected, even though he bet...
|| g_betperson[i] == 0) // this player didn't bet yet
continue
betamounts[g_betperson[i] - 1] += g_betamount[i] // -1 because person will be a team number, either 1 (t) or 2 (ct).
betcount[g_betperson[i] - 1]++
}
const MESSAGESIZE = 511
new tMessage[MESSAGESIZE + 1], ctMessage[MESSAGESIZE + 1]
format(tMessage, MESSAGESIZE, "%s^n$%d from %d bets", g_names[TEAM_T], betamounts[0], betcount[0])
format(ctMessage, MESSAGESIZE, "%s^n$%d from %d bets", g_names[TEAM_CT], betamounts[1], betcount[1])
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || is_user_bot(i))
continue
// display hud stuff to this person
set_hudmessage(TRED, TGREEN, TBLUE, TX, Y, EFFECTS, FXTIME, HUDMESSAGE_HOLDTIME, FADEINTIME, FADEOUTTIME, HUDCHANNEL_T)
show_hudmessage(i, tMessage)
set_hudmessage(CTRED, CTGREEN, CTBLUE, CTX, Y, EFFECTS, FXTIME, HUDMESSAGE_HOLDTIME, FADEINTIME, FADEOUTTIME, HUDCHANNEL_CT)
show_hudmessage(i, ctMessage)
}
}
#if defined IWANTPRIZES // keeping all prizes-only functions within this big block, don't forget to move fns out of it when they are used by nonprize compiles
public respawn(idd[1]) {
new team = get_user_team(idd[0])
if (team != TEAM_T && team != TEAM_CT)
return
// Call any bets off. If we have a respawner, a 1vs1 situation is impossible.
#if defined DEBUGMODE
new name[32]
get_user_name(idd[0], name, 31)
log_amx("%s %s %s", name, g_round ? "respawns!" : "would've respawned if the round didn't just end... no respawn this time!", task_exists(TASKID_BETTINGS) ? "A betting was about to happen but will called off." : "A betting wasn't about to happen anyway, no action taken.")
#endif
if (task_exists(TASKID_BETTINGS)) // probably not entirely necessary
remove_task(TASKID_BETTINGS) // this should be necessary, though
if (!g_round)
return
g_extralives[idd[0]]--
spawn(idd[0])
new name2[32]
get_user_name(idd[0], name2, 31)
client_print(0, print_chat, "%s odrodzil sie, majac %d jeszcze li%s zyc extra!", name2, g_extralives[idd[0]], g_extralives[idd[0]] == 1 ? "fe" : "ves")
}
public client_connect(id) {
resetprizes(id)
return PLUGIN_CONTINUE
}
prize(id, moneyover16k) {
new lives = 0, healths = 0, armours = 0, origmoney = moneyover16k
while (moneyover16k >= PRIZEPRICE_EXTRALIFE) {
g_extralives[id]++
moneyover16k -= PRIZEPRICE_EXTRALIFE
lives++
}
while (moneyover16k >= PRIZEPRICE_EXTRAHEALTH) {
g_extrahealth[id]++
moneyover16k -= PRIZEPRICE_EXTRAHEALTH
healths++
}
while (moneyover16k >= PRIZEPRICE_EXTRAARMOUR) {
g_extraarmour[id]++
moneyover16k -= PRIZEPRICE_EXTRAARMOUR
armours++
}
client_print(id, print_chat, "For winning $%d over $16000, you win these prizes: %d Xtra lives, %d health boosts, %d assault suits", origmoney, lives, healths, armours)
}
setprizes(id) {
new bool:extrahealthused = false, bool:extraarmourused = false
// Add extra health
if (g_extrahealth[id] > 0) {
g_extrahealth[id]--
new idd[1]
idd[0] = id
set_task(0.5, "delayedhealthboost", 0, idd, 1)
extrahealthused = true
}
// Add extra armour
new userarmour = get_user_armor(id)
if (g_extraarmour[id] > 0 && userarmour < 100) {
g_extraarmour[id]--
give_item(id, "item_assaultsuit")
extraarmourused = true
}
if (g_extralives[id] + g_extrahealth[id] + g_extraarmour[id] != 0)
client_print(id, print_chat, "Pozostalo nagrod: %d Extra zyc, %d Regeneracji zycia%s, %d Szybkich atakow%s", g_extralives[id], g_extrahealth[id], extrahealthused ? " (1 just used)" : "", g_extraarmour[id], extraarmourused ? " (1 just used)" : "")
}
public delayedhealthboost(idd[1]) {
set_user_health(idd[0], get_user_health(idd[0]) + XTRA_HEALTHBOOST)
}
remove_respawntasks() {
for (new i = 1; i < 33; i++)
remove_task(TASKID_RESPAWN + i)
}
public unsetfreeze(idd[1]) {
g_freezenewround[idd[0]] = false
}
public restartgame_event() {
for (new i = 1; i < 33; i++)
resetprizes(i)
return PLUGIN_CONTINUE
}
resetprizes(id) {
g_extralives[id] = 0
g_extrahealth[id] = 0
g_extraarmour[id] = 0
g_freezenewround[id] = false
}
#if defined DEBUGMODE
public giveprize(id, level, cid) {
if (!cmd_access(id, level, cid, 4)) {
return PLUGIN_HANDLED
}
new giveto, theprize, prizes
new buffer[10]
read_argv(1, buffer, 9)
giveto = str_to_num(buffer)
read_argv(2, buffer, 9)
theprize = str_to_num(buffer)
read_argv(3, buffer, 9)
prizes = str_to_num(buffer)
switch (theprize) {
case 1: {
g_extralives[giveto] += prizes
}
case 2: {
g_extrahealth[giveto] += prizes
}
case 3: {
g_extraarmour[giveto] += prizes
}
default: {
console_print(id, "Only 1-3 works...")
return PLUGIN_HANDLED
}
}
console_print(id, "Dal %d nagrode z puli %d dla %d.", prizes, theprize, giveto)
return PLUGIN_HANDLED
}
public giveprizeall(id, level, cid) {
if (!cmd_access(id, level, cid, 3)) {
return PLUGIN_HANDLED
}
new theprize, prizes
new buffer[10]
read_argv(1, buffer, 9)
theprize = str_to_num(buffer)
read_argv(2, buffer, 9)
prizes = str_to_num(buffer)
new const MAXCLIENTS = get_maxplayers()
for (new i = 1; i <= MAXCLIENTS; i++) {
if (!is_user_connected(i))
continue
switch (theprize) {
case 1: {
g_extralives[i] = prizes
}
case 2: {
g_extrahealth[i] = prizes
}
case 3: {
g_extraarmour[i] = prizes
}
default: {
console_print(id, "Only 1-3 works...")
return PLUGIN_HANDLED
}
}
}
console_print(id, "Ustawil %d nagrode z puli %d dla wszystkich.", prizes, theprize)
return PLUGIN_HANDLED
}
#endif // defined DEBUGMODE
#endif // defined IWANTPRIZES
public newround_event(id) {
#if defined IWANTPRIZES
if (g_freezenewround[id])
return PLUGIN_CONTINUE
//log_amx("newround_event called for %d", id)
g_freezenewround[id] = true
new idd[1]
idd[0] = id
set_task(1.0, "unsetfreeze", 0, idd, 1)
setprizes(id)
#endif // defined IWANTPRIZES
if (!g_round)
g_round = true
return PLUGIN_CONTINUE
}
hudtimerstarter() {
new timeend[1]
timeend[0] = get_systime() + get_cvar_num(CVAR_BETTIME)
hudtimerdisplay(timeend)
set_task(1.0, "hudtimerdisplay", TASKID_BETTIMERDISPLAY, timeend, 1, "b")
}
public hudtimerdisplay(timeend[1]) {
new const MAXPLAYERS = get_maxplayers()
new secondsleft = timeend[0] - get_systime()
new msg[64]
if (secondsleft > 0) {
msg = "Obstawianie jest jeszcze mozliwe przez %d sekund"
format(msg, 63, msg, secondsleft)
}
else
msg = "Nie udalo Ci sie obstawic..."
new usermenu, userkeys, bool:nooneisinmenu = true
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || is_user_alive(i) || is_user_bot(i))
continue
else
nooneisinmenu = false
get_user_menu(i, usermenu, userkeys) // get user menu
if (usermenu == g_betmenu) {
// Display time left here
client_print(i, print_center, msg)
}
}
// End loops if no one is in menu...
if (nooneisinmenu) {
remove_task(TASKID_BETTIMER)
remove_task(TASKID_BETTIMERDISPLAY)
}
}
public initbettings() {
if (!g_round) { // if round already ended, call bets off
#if defined DEBUGMODE
log_amx("Bettings was about to start, but the round ended, so no bettings will occur this time.")
#endif
return
}
// Start timer here
set_task(get_cvar_float(CVAR_BETTIME), "closebetmenu", TASKID_BETTIMER)
hudtimerstarter()
new const DEFAULTBET = get_cvar_num(CVAR_DEFAULTBET)
g_betting = true
for (new i = 1; i < 33; i++) // Reset votes
g_betperson[i] = 0
new bool:overridepreviousmenu, bool:bot, currentmenu, CsTeams:team, keys
if (get_cvar_num(OVERRIDEPREVIOUSMENU))
overridepreviousmenu = true
else
overridepreviousmenu = false
new const MAXPLAYERS = get_maxplayers()
#if defined DEBUGMODE
log_amx("Bettings will now start. This server supports %d players.", MAXPLAYERS)
new name[32]
#endif
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || is_user_alive(i)) { // Online, dead players only
#if defined DEBUGMODE
if (!is_user_connected(i)) {
//log_amx("Player #%d is not connected and will not be able to vote.", i)
}
else {
get_user_name(i, name, 31)
log_amx("Player #%d (%s) is alive and will not be able to vote.", i, name)
}
#endif
continue
}
bot = bool:is_user_bot(i)
if (!bot && !overridepreviousmenu) {
// If already in a menu, don't bother. This isn't that important...
get_user_menu(i, currentmenu, keys) // currentmenu should be 0 when user is in no menu, only then it's ok to show a bet menu :-]
if (currentmenu > 0) {
#if defined DEBUGMODE
get_user_name(i, name, 31)
log_amx("Player #%d (%s) is already in another menu (%d) - your %s cvar is defined to not show bet menu to ppl who already have a menu open. (Bet menu has id %d)", i, name, currentmenu, OVERRIDEPREVIOUSMENU, g_betmenu)
#endif
continue
}
}
// Must be on T or CT team
team = cs_get_user_team(i)
if (team != CS_TEAM_T && team != CS_TEAM_CT) {
#if defined DEBUGMODE
get_user_name(i, name, 31)
log_amx("Player #%d (%s) is not on team 1 (T) or 2 (CT). Actually the player is on team %d and thus can't bet.", i, name, int:team)
#endif
continue
}
// Must have at least DEFAULTBET dollars to participate...
if (cs_get_user_money(i) < DEFAULTBET) {
#if defined DEBUGMODE
get_user_name(i, name, 31)
log_amx("Player #%d (%s) does only have $%d, which is below the $%d needed to be able to vote.", i, name, cs_get_user_money(i), DEFAULTBET)
#endif
client_print(i, print_chat, "Nie posiadasz $%d potrzebnych do minimalnego obstawienia zakladu.", DEFAULTBET)
continue
}
g_betamount[i] = DEFAULTBET
if (bot) {
// Bots "bet"
//client_print(0, print_chat, "%d should vote and is a bot!", deadplayers[i])
new botid[1]
botid[0] = i
set_task(random_float(1.0, 5.0), "botbet", 0, botid, 1)
#if defined DEBUGMODE
get_user_name(i, name, 31)
log_amx("Player #%d (%s) is a bot and will bet...", i, name)
#endif
}
else {
//client_print(deadplayers[i], print_chat, "starting bet for you")
#if defined DEBUGMODE
get_user_name(i, name, 31)
log_amx("Player #%d (%s) is a normal player and IS shown the bet menu and thus gets the chance to bet this time...", i, name)
#endif
startbet(i)
}
}
displaybetshud()
}
public botbet(botid[1]) {
if (!g_betting || !is_user_connected(botid[0])) // bot may have been disconnected during the time...
return PLUGIN_CONTINUE
// Bot will bet.
// Bot can bet any even $100 value... and should choose the player with most hp+armour, and possibly best frags/deaths ratio, and then it could turn all over to the other guy for
// gambling purpose.
// Gambling ratio could be set somewhere between 0.1 and 0.5...
new const Float:GAMBLER_RATIO = random_float(BOTGAMBLERMIN, BOTGAMBLERMAX)
new bool:gambler = false // this bot is not a gambler... yet
if (random_float(0.0, 1.0) <= GAMBLER_RATIO)
gambler = true // ok, this bot wants to be a gambler <img src='https://amxx.pl/public/style_emoticons/<#EMO_DIR#>/biggrin.gif' class='bbc_emoticon' alt=':-)' />
new nongamblerschoice = getnongamblerschoice()
new choice = gambler ? (nongamblerschoice == TEAM_T ? TEAM_CT : TEAM_T) : nongamblerschoice
/*if (gambler) {
if (nongamblerschoice == TEAM_T)
choice = TEAM_CT
else
choice = TEAM_T
}*/
new money = cs_get_user_money(botid[0])
money -= money % 100 // 553 - (553 % 100) would be 553 - (53) would be 500, ie even amount in hundreds...
money = botbetmoney(money)
if (money == 0) // Bot didn't bet this time...
return PLUGIN_CONTINUE
g_betamount[botid[0]] = money
placebet(botid[0], choice)
return PLUGIN_CONTINUE
}
// Decides how much money the will bot bet.
botbetmoney(money) {
// Low (0.0 > 0.6), medium (0.6 > 0.9), high (0.9 > 1.0)
// Low == max 30% of money
// Medium == max 50% of money
// High == max 100% of money
new const Float:RATIO = random_float(0.0, 1.0)
new BETSETTING:betSetting = BET_LOW
if (RATIO >= RATIO_HIGH)
betSetting = BET_HIGH
else if (RATIO >= RATIO_MEDIUM)
betSetting = BET_MEDIUM
new Float:pctOfMoneyToBet
switch (betSetting) {
case BET_LOW: pctOfMoneyToBet = random_float(0.0, MAXBET_LOW) // MAXBET_LOW 0.3
case BET_MEDIUM: pctOfMoneyToBet = random_float(0.0, MAXBET_MEDIUM) // MAXBET_MEDIUM 0.5
//case BET_HIGH: pctOfMoneyToBet = random_float(0.0, MAXBET_HIGH) // MAXBET_HIGH 1.0
default: pctOfMoneyToBet = random_float(0.0, MAXBET_HIGH) // MAXBET_HIGH 1.0
}
money = floatround(money * pctOfMoneyToBet)
money -= money % 100 // to have equal 100s...
return money
}
getnongamblerschoice() {
new choice
new t_hp = get_user_health(g_t), ct_hp = get_user_health(g_ct), t_armour = get_user_armor(g_t), ct_armour = get_user_armor(g_ct)
if (t_hp + t_armour > ct_hp + ct_armour)
choice = TEAM_T
else if (t_hp + t_armour < ct_hp + ct_armour)
choice = TEAM_CT
else // They're equal
choice = random_num(TEAM_T, TEAM_CT)
return choice
}
startbet(id) {
if (!g_betting) {
client_print(id, print_center, "Obstawiles za pozno!")
return
}
new menuBody[512], flags = MENUBUTTON1|MENUBUTTON2|MENUBUTTON0, money = cs_get_user_money(id)
new t_hp = get_user_health(g_t), ct_hp = get_user_health(g_ct), t_armour = get_user_armor(g_t), ct_armour = get_user_armor(g_ct)
new len = format(menuBody, 511, "Obstawiamy walke: y%sw vs. y%sw! Wplacajcie pieniadze! Kto wygra?^n^n1. %s (HP: %d, Kamizelka: %d)^n2. %s (HP: %d, Kamizelka: %d)^n^nAktualne zaklady: $y%dw^n", g_names[TEAM_T], g_names[TEAM_CT], g_names[TEAM_T], t_hp, t_armour, g_names[TEAM_CT], ct_hp, ct_armour, g_betamount[id])
if (g_pot > 0)
len += format(menuBody[len], 511 - len, "^nAktualna stawka $y%dw^n", g_pot)
new const DEFAULTBET = get_cvar_num(CVAR_DEFAULTBET)
// +1x
if (money >= g_betamount[id] + DEFAULTBET) {
flags |= MENUBUTTON3
len += format(menuBody[len], 511 - len, "w")
}
else
len += format(menuBody[len], 511 - len, "d")
len += format(menuBody[len], 511 - len, "3. Obstaw $%d na^n", DEFAULTBET)
// +10x
if (money >= g_betamount[id] + DEFAULTBET * 10) {
flags |= MENUBUTTON4
len += format(menuBody[len], 511 - len, "w")
}
else
len += format(menuBody[len], 511 - len, "d")
len += format(menuBody[len], 511 - len, "4. Obstaw $%d na^n", DEFAULTBET * 10)
// -1x
if (g_betamount[id] - DEFAULTBET >= DEFAULTBET) {
flags |= MENUBUTTON5
len += format(menuBody[len], 511 - len, "w")
}
else
len += format(menuBody[len], 511 - len, "d")
len += format(menuBody[len], 511 - len, "5. Zmniejsz stawke $%d na^n", DEFAULTBET)
// -10x
if (g_betamount[id] - DEFAULTBET * 10 >= DEFAULTBET) {
flags |= MENUBUTTON6
len += format(menuBody[len], 511 - len, "w")
}
else
len += format(menuBody[len], 511 - len, "d")
len += format(menuBody[len], 511 - len, "6. Zmniejsza stawke $%d na^nw", DEFAULTBET * 10)
len += format(menuBody[len], 511 - len, "7. Obstaw wszystko!")
flags |= MENUBUTTON7
len += format(menuBody[len], 511 - len, "^n^n0. Nie dzięki, nie ryzykuje")
show_menu(id, flags, menuBody)
//client_print(id, print_chat, "Menu dostepne dla Ciebie:")
}
public menu_fn(id, key) {
//client_print(id, print_chat, "Wybierz odpowiedni klawisz: %d", key)
new bool:stayinmenu = true
new const DEFAULTBET = get_cvar_num(CVAR_DEFAULTBET)
switch (key) {
case MENUSELECT1: {
// bet on t
placebet(id, TEAM_T)
stayinmenu = false
}
case MENUSELECT2: {
// bet on ct
placebet(id, TEAM_CT)
stayinmenu = false
}
case MENUSELECT3: {
// raise bet
alterbet(id, DEFAULTBET)
}
case MENUSELECT4: {
// lower bet
alterbet(id, DEFAULTBET * 10)
}
case MENUSELECT5: {
// raise bet
alterbet(id, -DEFAULTBET)
}
case MENUSELECT6: {
// lower bet
alterbet(id, -DEFAULTBET * 10)
}
case MENUSELECT7: {
// bet all
betall(id)
}
case MENUSELECT0: {
// no bet
if (g_betting)
client_print(id, print_chat, "Racja, nie obstawiaj nic. Pilnuj swojej kasy!")
stayinmenu = false
}
}
if (stayinmenu)
startbet(id)
return PLUGIN_HANDLED
}
placebet(id, choice) {
if (!is_user_connected(id))
return
if (g_betting) {
g_betperson[id] = choice
altermoney(id, -g_betamount[id])
new name[33]
get_user_name(id, name, 32)
client_print(0, print_chat, "%s obstawil $%d na %s.", name, g_betamount[id], g_names[g_betperson[id]])
displaybetshud()
}
else
client_print(id, print_center, "Za pozno, nie bedzie z Ciebie zaden hazardzista!")
}
alterbet(id, money) {
g_betamount[id] += money
}
betall(id) {
g_betamount[id] = cs_get_user_money(id)
}
altermoney(id, money) { // calc 16000+ bonuses here?
new newmoney = cs_get_user_money(id) + money
#if defined IWANTPRIZES
if (newmoney > 16000)
prize(id, newmoney - 16000)
#endif
cs_set_user_money(id, newmoney, 1)
}
roundendtasks(const TEAM) {
#if defined IWANTPRIZES
remove_respawntasks()
#endif
g_round = false
if (g_betting) {
closebetmenu()
remove_task(TASKID_BETTIMER) // stop the timer that will close the menu...
remove_task(TASKID_BETTIMERDISPLAY) // stop the timer that displays the time left until menu closes...
if (TEAM == TEAM_T || TEAM == TEAM_CT)
calculatebets(TEAM)
else // round ended in a draw... payback all bet money
payback()
}
}
public roundend_t_event() {
roundendtasks(TEAM_T)
}
public roundend_ct_event() {
roundendtasks(TEAM_CT)
}
public roundend_draw_event() {
roundendtasks(0)
}
public closebetmenu() {
new const MAXPLAYERS = get_maxplayers()
new usermenu, userkeys
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || is_user_alive(i) || is_user_bot(i))
continue
get_user_menu(i, usermenu, userkeys) // get user menu
if (usermenu == g_betmenu) // Hide it here!
client_cmd(i, "slot10") // client_print(players[i], print_chat, "Hey, round's over and you didn't bet yet... close that menu!")
}
}
payback() {
// End betting here
g_betting = false
for (new i = 1; i < 33; i++) {
if (i == g_t || i == g_ct || !is_user_connected(i) || g_betperson[i] == 0) // the remaining players didn't bet, and don't interact with disconnected players, and don't give anything to those who didn't bet
continue
altermoney(i, g_betamount[i])
client_print(i, print_chat, "Runda zakonczona. Trzymaj swoje $%d z powrotem.", g_betamount[i])
}
}
calculatebets(result) {
// End betting here
g_betting = false
// Find all who voted for right player, store how much they voted
new totalrightbets = 0, overallbets = 0
for (new i = 1; i < 33; i++) {
if (g_betperson[i] == result)
totalrightbets += g_betamount[i]
if (g_betperson[i] == TEAM_T || g_betperson[i] == TEAM_CT)
overallbets += g_betamount[i]
}
// Did anyone make a bet at all?
if (overallbets == 0) {
client_print(0, print_chat, "Nikt nie obstawial, graly 2 cieniasy...?")
return
}
// Print total bets.
client_print(0, print_chat, "Total bets: $%d ($%d on winning team)", overallbets, totalrightbets)
// Now hand out money...
new Float:wonmoney, name[33], Float:highestwonmoney = -1.0, nr_of_highestwinners = 0, highestwinners[32],CsTeams:team
for (new i = 1; i < 33; i++) {
if (i == g_t || i == g_ct || !is_user_connected(i)) // the remaining players didn't bet, and don't interact with disconnected players...
continue
team = cs_get_user_team(i)
if (team != CS_TEAM_T && team != CS_TEAM_CT) // spectators don't get anything
continue
get_user_name(i, name, 32)
if (totalrightbets > 0 && g_betperson[i] == result) { // Just to avoid divison by 0 (which shouldn't happen, but...)
// This player should have money. How much? ((g_betamount[i] / totalrightbets) * overallbets)
wonmoney = (float(g_betamount[i]) / float(totalrightbets)) * float(overallbets)
client_print(i, print_chat, "Wygrales!! Dostajesz tyle ile obstawiles, $%d, a dodatkowo jeszcze $%d!", g_betamount[i], floatround(wonmoney) - g_betamount[i])
server_print("%s Wygral zaklad! otrzymal swoja wplate, $%d, a dodatkowo jeszcze $%d!", name, g_betamount[i], floatround(wonmoney) - g_betamount[i])
altermoney(i, floatround(wonmoney))
if (wonmoney - g_betamount[i] > highestwonmoney) {
nr_of_highestwinners = 0
highestwinners[nr_of_highestwinners++] = i
highestwonmoney = wonmoney - g_betamount[i]
}
else if (wonmoney - g_betamount[i] == highestwonmoney) {
highestwinners[nr_of_highestwinners++] = i
}
}
else if (g_betperson[i] == 0) {
client_print(i, print_chat, "Tym razem nie obstawiasz.")
server_print("%s nie ma szmalu...", name)
}
else {
client_print(i, print_chat, "Szybko straciles $%d !", g_betamount[i])
server_print("%s przegral $%d zakladajac sie...", name, g_betamount[i])
}
}
//statsworker(highestwinners, nr_of_highestwinners, highestwonmoney)
if (nr_of_highestwinners == 0) { // Did anyone make the right bet? If not, move the bet money to the pot.
client_print(0, print_chat, "Nikt nie wygral zakldu. Suma $%d zostala dodana do banku. Wartosc banku: $%d", overallbets, g_pot += overallbets)
set_vaultpot(g_pot)
return
}
else if (nr_of_highestwinners == 1) { // Winner takes it all.
get_user_name(highestwinners[0], name, 32)
if (g_pot != 0) {
client_print(0, print_chat, "%s wygral $%d i spustoszyl bank zabierajac jeszcze $%d z banku, wyjal $%d!", name, floatround(highestwonmoney), g_betamount[highestwinners[0]], g_pot)
give_pot(nr_of_highestwinners, highestwinners)
}
else {
if (highestwonmoney >= 1.0)
client_print(0, print_chat, "%s wygral $%d $%d z zakladu, bank zastal pusty.", name, floatround(highestwonmoney), g_betamount[highestwinners[0]])
}
}
else { // Winners share it all.
new msg[128], len = 0
if (g_pot > 0) {
len += format(msg[len], 127 - len, "Podzielila sie pula z banku, $%d: ", g_pot)
give_pot(nr_of_highestwinners, highestwinners)
}
else
len += format(msg[len], 127 - len, "Najwieksi szczesciarze: ")
for (new i = 0; i < nr_of_highestwinners; i++) {
get_user_name(highestwinners[i], name, 32)
len += format(msg[len], 127 - len, "%s ", name)
}
}
}
/*
statsworker(highestwinners[32], const NROFHIGHESTWINNERS, Float:highestwonmoney) {
// Build result table of last bet
}
*/
set_vaultpot(value) {
new potstr[16]
num_to_str(value, potstr, 15)
set_vaultdata(VAULTKEY_POT, potstr)
}
give_pot(nr_of_winners, winners[32]) {
new pot = g_pot
g_pot = 0
set_vaultpot(0) // empty pot in vault
if (nr_of_winners == 1) {
altermoney(winners[0], pot)
return
}
if (nr_of_winners == 0) {
log_amx("%s: Error in script - division by zero error in give_pot! nr_of_winners: %d", nr_of_winners)
return
}
new share = pot/nr_of_winners
for (new i = 0; i < nr_of_winners; i++)
altermoney(winners[i], share)
}
/*
public killtest(id, level, cid) {
if (!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new const MAXPLAYERS = get_maxplayers()
new bool:tSkonad = false, bool:ctSkonad = false, team
for (new i = 1; i <= MAXPLAYERS; i++) {
if (!is_user_connected(i) || !is_user_alive(i))
continue
if (tSkonad && ctSkonad) {
user_kill(i, 1)
continue
}
team = cs_get_user_team(i)
if (team == TEAM_T) {
if (tSkonad || i == id)
user_kill(i, 1)
else
tSkonad = true
}
else if (team == TEAM_CT) {
if (ctSkonad || i == id)
user_kill(i, 1)
else
ctSkonad = true
}
else {
// Some odd team... just kill!
user_kill(i, 1)
}
}
return PLUGIN_HANDLED
}
*/
public plugin_init() {
register_event("DeathMsg", "death_event", "a")
register_event("SendAudio", "roundend_t_event", "a", "2&%!MRAD_terwin")
register_event("SendAudio", "roundend_ct_event", "a", "2&%!MRAD_ctwin")
register_event("SendAudio", "roundend_draw_event", "a", "2&%!MRAD_rounddraw")
register_event("ResetHUD", "newround_event", "b")
#if defined IWANTPRIZES
register_event("TextMsg", "restartgame_event", "a", "2Game_C","2Game_w")
register_event("TextMsg", "restartgame_event", "a", "2Game_will_restart_in")
#if defined DEBUGMODE
register_concmd("0gp", "giveprize", ADMIN_CFG, "<id> <1-3> <#> - give # 1-3 prizes to id")
register_concmd("0gpa", "giveprizeall", ADMIN_CFG, "<1-3> <#> - give # 1-3 prizes to all")
#endif
#endif
//register_clcmd("0killtest", "killtest", ADMIN_CFG, "- kills you and leaves two people alive on each team...")
register_cvar(OVERRIDEPREVIOUSMENU, "1")
register_cvar(CVAR_DEFAULTBET, "100")
register_cvar(CVAR_BETTIME, "20")
g_betmenu = register_menuid("It's")
register_menucmd(g_betmenu, 1023, "menu_fn")
if (vaultdata_exists(VAULTKEY_POT))
g_pot = get_vaultdata(VAULTKEY_POT)
}i gdy skompiluje ten sma po zmianie mapy gdy wpisze amx_plugins dostaje komunikat
unknown unknown unknown lastmanbets.amx running
przez co zaklady wylaczaja mi sie przy samym obstawianiu czy ktos moglby to uzupelnic?[/code]


Dodatki SourceMod



Temat jest zamknięty








