#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <cstrike>
#include <engine>
#include <fakemeta>
#pragma semicolon 1
#define SZPREFIX "!g[AMXX Mision]"
#define SHOWHUD_CLASSNAME "classname_showhud"
#define is_user_valid_connected(%1) (1 <= %1 <= g_maxplayers && g_connected[%1])
#define is_user_valid_alive(%1) (1 <= %1 <= g_maxplayers && g_alive[%1])
enum _:MISIONS_STRUCT
{
MISION_PLAYERS,
MISION_NAME[32],
MISION_DESCRIPTION[100],
MISION_ROUNDS,
MISION_TYPE,
MISION_CHECK,
MISION_LIMIT,
MISION_REWARD
};
enum _:MISION_INT
{
PLOMO_POR_1,
PLOMO_POR_5,
PLOMO_POR_10,
PLOMO_POR_20,
HEAD_X5,
HEAD_X10,
SIN_CASCO,
ACUCHILLANDO,
FILO_X5,
FILO_A_LA_DECIMA_POTENCIA,
FILO_AL_VEINTE_VEINTE,
DANIO_PASIVO,
DANIO_PROLONGADO,
DANIO_EXTENDIDO,
DANIO_MASIVO,
DANIO_ULTRA,
DANIO_COLATERAL,
DANIO_DEVASTADOR
};
enum _:MISION_STATS
{
MISION_KILLED,
MISION_KILLED_HS_PER_ROUND,
MISION_KILLED_PER_KNIFE,
MISION_DAMAGE_PER_ROUND
};
enum _:MISION_CLASS
{
MISION_MONEY = 0,
MISION_HEALTH,
MISION_AP
};
enum _:MISION_TYPE_CHECK
{
TYPE_KILL = 0,
TYPE_KILL_HS,
TYPE_KNIFE,
TYPE_DAMAGE
};
new const MISIONS_CLASS[][] =
{
"plata",
"vida",
"chaleco"
};
new const MISIONS[][MISIONS_STRUCT] =
{
/*
* Jugadores de la misión
* Nombre de la misión
* Rondas de la misión
* Tipo de misión,
* Tipo de frag de la misión
* Frags de la misión
* Recompensa de la misión
*/
{ 10, "Plomo por 1", "Mata a 1 jugador en 1 ronda", 1, MISION_MONEY, TYPE_KILL, 1, 250 },
{ 12, "Plomo por 5", "Mata a 5 jugadores en 3 rondas", 3, MISION_MONEY, TYPE_KILL, 5, 500 },
{ 12, "Plomo por 10", "Mata a 10 jugadores en 3 rondas", 3, MISION_MONEY, TYPE_KILL, 10, 1000 },
{ 14, "Plomo por 20", "Mata a 20 jugadores 5 rondas", 5, MISION_MONEY, TYPE_KILL, 20, 2500 },
{ 12, "Head x5", "Mata a 5 jugadores con disparos en la cabeza en 3 ronda", 1, MISION_MONEY, TYPE_KILL_HS, 5, 25 },
{ 12, "Head x10", "Mata a 10 jugadores con disparos en la cabeza en 5 ronda", 3, MISION_MONEY, TYPE_KILL_HS, 10, 30 },
{ 14, "Sin casco", "Mata a 20 jugadores con disparos en la cabeza en 3 ronda", 5, MISION_MONEY, TYPE_KILL_HS, 20, 40 },
{ 12, "Acuchillando", "Mata a 3 jugadores con cuchillo en 1 ronda", 1, MISION_HEALTH, TYPE_KNIFE, 3, 25 },
{ 14, "Filo x5", "Mata a 5 jugadores con cuchillo en 2 ronda", 2, MISION_HEALTH, TYPE_KNIFE, 5, 35 },
{ 12, "Filo a la décima potencia", "Mata a 10 jugadores con cuchillo en 5 ronda", 5, MISION_HEALTH, TYPE_KNIFE, 10, 45 },
{ 14, "Filo al 20/20", "Mata a 20 jugadores con cuchillo en 10 ronda", 10, MISION_HEALTH, TYPE_KNIFE, 20, 100 },
{ 14, "Daño pasivo", "Realiza 250 de daño en 1 ronda", 1, MISION_AP, TYPE_DAMAGE, 250, 10 },
{ 12, "Daño prolongado", "Realiza 500 de daño en 1 ronda", 1, MISION_AP, TYPE_DAMAGE, 500, 15 },
{ 12, "Daño extendido", "Realiza 1.000 de daño en 2 rondas", 2, MISION_AP, TYPE_DAMAGE, 1000, 20 },
{ 10, "Daño masivo", "Realiza 2.000 de daño en 3 rondas", 3, MISION_AP, TYPE_DAMAGE, 2000, 25 },
{ 10, "Daño ultra", "Realiza 3.500 de daño en 6 rondas", 4, MISION_AP, TYPE_DAMAGE, 3500, 30 },
{ 10, "Daño colateral", "Realiza 5.000 de daño en 6 rondas", 6, MISION_AP, TYPE_DAMAGE, 5000, 35 },
{ 10, "Daño devastador", "Realiza 10.000 de daño en 10 rondas", 10, MISION_AP, TYPE_DAMAGE, 10000, 50 }
};
new g_mision_started[33];
new g_mision[33][MISION_INT];
new g_mision_stats[33][MISION_STATS];
new g_mision_select[33];
new g_mision_round[33];
new g_menu_mision_int[33];
new g_connected[33];
new g_alive[33];
new g_maxplayers;
new g_syncobj;
public plugin_init()
{
register_plugin("Misiones", "1.0", "Cristian'");
register_clcmd("say /mision", "clcmd_show_mision");
register_event("HLTV", "event_round_start", "a", "1=0", "2=0");
register_menu("Show Menu Misions Description", (1<<0)|(1<<9), "handled_show_menu_mision_description");
register_menu("Show Mision Struct", (1<<0)|(1<<9), "handled_clcmd_show_mision_struct");
register_menu("Show Cancel Mision", (1<<0)|(1<<1), "handled_show_menu_cancel_mision");
RegisterHam(Ham_Spawn, "player", "ham_PlayerSpawn_Post", true);
RegisterHam(Ham_Killed, "player", "ham_PlayerKilled");
RegisterHam(Ham_TakeDamage, "player", "ham_TakeDamage");
g_maxplayers = get_maxplayers();
g_syncobj = CreateHudSyncObj();
new showhud;
showhud = create_entity("info_target");
if (is_valid_ent(showhud))
{
entity_set_string(showhud, EV_SZ_classname, SHOWHUD_CLASSNAME);
entity_set_float(showhud, EV_FL_nextthink, get_gametime() + 1.0);
register_think(SHOWHUD_CLASSNAME, "ent_showHUD");
}
set_task(30.0, "print_mision");
}
public print_mision()
{
chat_color(0, "%s !yEscribí !g/mision!y para comenzar una misión.", SZPREFIX);
set_task(random_float(60.0, 180.0), "print_mision");
}
public client_putinserver(id)
{
g_connected[id] = 1;
}
public client_disconnect(id)
{
g_connected[id] = 0;
g_alive[id] = 0;
}
public event_round_start()
{
static id;
for (id = 1; id <= g_maxplayers; id++)
{
if (!g_connected[id])
continue;
if (g_mision_started[id])
{
g_mision_round[id]++;
if (g_mision_round[id] == MISIONS[g_mision_select[id]][MISION_ROUNDS])
{
chat_color(id, "%s !yLa misión !g%s!y fue finalizada.", SZPREFIX, MISIONS[g_mision_select[id]][MISION_NAME]);
reset_check_mision(id);
}
}
}
}
public ent_showHUD(ent)
{
static id, user;
for (id = 1; id <= g_maxplayers; id++)
{
if (!g_connected[id])
continue;
user = id;
if (id == user)
{
static mision[200];
if (g_mision_started[id])
{
static text[58];
switch(MISIONS[g_mision_select[id]][MISION_CHECK])
{
case TYPE_KILL: format(text, charsmax(text), "Asesinatos: %d / %d", g_mision_stats[id][MISION_KILLED], MISIONS[g_mision_select[id]][MISION_LIMIT]);
case TYPE_KILL_HS: format(text, charsmax(text), "Asesinados con headshot: %d / %d", g_mision_stats[id][MISION_KILLED_HS_PER_ROUND], MISIONS[g_mision_select[id]][MISION_LIMIT]);
case TYPE_KNIFE: format(text, charsmax(text), "Asesinados con cuhillo: %d / %d", g_mision_stats[id][MISION_KILLED_PER_KNIFE], MISIONS[g_mision_select[id]][MISION_LIMIT]);
case TYPE_DAMAGE:
{
static dmg_mision[15], dmg_limit[15];
addpoint(g_mision_stats[id][MISION_DAMAGE_PER_ROUND], dmg_mision, 14);
addpoint(MISIONS[g_mision_select[id]][MISION_LIMIT], dmg_limit, 14);
format(text, charsmax(text), "Daño: %s / %s", dmg_mision, dmg_limit);
}
}
format(mision, charsmax(mision), "Misión: %s^nRondas: %d / %d^nRecompensa: +%d %s^n%s", MISIONS[g_mision_select[id]][MISION_NAME], g_mision_round[id], MISIONS[g_mision_select[id]][MISION_ROUNDS], MISIONS[g_mision_select[id]][MISION_REWARD], MISIONS_CLASS[g_menu_mision_int[id]], text);
}
set_hudmessage(0, 255, 0, 0.08, 0.08, 1, 6.0, 1.1, 0.0, 0.0, -1);
ShowSyncHudMsg(id, g_syncobj, "%s", (g_mision_started[id]) ? mision : "No se seleccionó ninguna misión");
}
}
entity_set_float(ent, EV_FL_nextthink, get_gametime() + 1.0);
}
public ham_PlayerSpawn_Post(id)
{
if (!is_user_alive(id) || cs_get_user_team(id) == CS_TEAM_SPECTATOR || cs_get_user_team(id) == CS_TEAM_UNASSIGNED)
return HAM_IGNORED;
g_alive[id] = _:is_user_alive(id);
return HAM_IGNORED;
}
public ham_PlayerKilled(victim, attacker, shouldgib)
{
if (victim == attacker || !is_user_valid_connected(attacker))
return;
g_alive[victim] = 0;
if (g_mision_started[attacker])
{
switch(g_mision_select[attacker])
{
case PLOMO_POR_1: { g_mision_stats[attacker][MISION_KILLED]++; if (g_mision_stats[attacker][MISION_KILLED] == 1) set_mision(attacker, PLOMO_POR_1); }
case PLOMO_POR_5: { g_mision_stats[attacker][MISION_KILLED]++; if (g_mision_stats[attacker][MISION_KILLED] == 5) set_mision(attacker, PLOMO_POR_5); }
case PLOMO_POR_10: { g_mision_stats[attacker][MISION_KILLED]++; if (g_mision_stats[attacker][MISION_KILLED] == 10) set_mision(attacker, PLOMO_POR_10); }
case PLOMO_POR_20: { g_mision_stats[attacker][MISION_KILLED]++; if (g_mision_stats[attacker][MISION_KILLED] == 20) set_mision(attacker, PLOMO_POR_20); }
case HEAD_X5: { if (get_pdata_int(victim, 75) == HIT_HEAD) { g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND]++; if (g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND] == 5) set_mision(attacker, HEAD_X5); }}
case HEAD_X10: { if (get_pdata_int(victim, 75) == HIT_HEAD) { g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND]++; if (g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND] == 10) set_mision(attacker, HEAD_X10); }}
case SIN_CASCO: { if (get_pdata_int(victim, 75) == HIT_HEAD) { g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND]++; if (g_mision_stats[attacker][MISION_KILLED_HS_PER_ROUND] == 20) set_mision(attacker, SIN_CASCO); }}
case ACUCHILLANDO: { if (get_user_weapon(attacker) == CSW_KNIFE) { g_mision_stats[attacker][MISION_KILLED_PER_KNIFE]++; if (g_mision_stats[attacker][MISION_KILLED_PER_KNIFE] == 3) set_mision(attacker, ACUCHILLANDO); }}
case FILO_X5: { if (get_user_weapon(attacker) == CSW_KNIFE) { g_mision_stats[attacker][MISION_KILLED_PER_KNIFE]++; if (g_mision_stats[attacker][MISION_KILLED_PER_KNIFE] == 5) set_mision(attacker, FILO_X5); }}
case FILO_A_LA_DECIMA_POTENCIA: { if (get_user_weapon(attacker) == CSW_KNIFE) { g_mision_stats[attacker][MISION_KILLED_PER_KNIFE]++; if (g_mision_stats[attacker][MISION_KILLED_PER_KNIFE] == 10) set_mision(attacker, FILO_A_LA_DECIMA_POTENCIA); }}
case FILO_AL_VEINTE_VEINTE: { if (get_user_weapon(attacker) == CSW_KNIFE) { g_mision_stats[attacker][MISION_KILLED_PER_KNIFE]++; if (g_mision_stats[attacker][MISION_KILLED_PER_KNIFE] == 20) set_mision(attacker, FILO_AL_VEINTE_VEINTE); }}
}
}
}
public ham_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
if (victim == attacker || !is_user_valid_connected(attacker))
return HAM_IGNORED;
if (g_mision_started[attacker] && MISIONS[g_mision_select[attacker]][MISION_CHECK] == TYPE_DAMAGE)
{
g_mision_stats[attacker][MISION_DAMAGE_PER_ROUND] += floatround(damage);
static i;
for (i = 0; i < sizeof(MISIONS); i++)
{
if (MISIONS[g_mision_select[attacker]][MISION_CHECK] != TYPE_DAMAGE)
continue;
if (g_mision_select[attacker] >= MISIONS[g_mision_select[attacker]][MISION_REWARD])
set_mision(attacker, g_mision_select[attacker]);
}
}
return HAM_IGNORED;
}
public clcmd_show_mision(id)
{
if (g_mision_started[id])
{
static menu[256];
formatex(menu, charsmax(menu), "\yMisiones^n^n\yMisión: \w%s^n\yRondas: \w%d \y/ \w%d^n\yRecompensa: \w+%d %s^n^n\r1. \wCancelar la misión^n\r0. \wVolver",
MISIONS[g_mision_select[id]][MISION_NAME], g_mision_round[id], MISIONS[g_mision_select[id]][MISION_ROUNDS], MISIONS[g_mision_select[id]][MISION_REWARD], MISIONS_CLASS[g_menu_mision_int[id]]);
show_menu(id, (1<<0)|(1<<9), menu, -1, "Show Mision Struct");
return PLUGIN_HANDLED;
}
static position[3], menu, i, text[32];
menu = menu_create("\yMisiones", "handled_clcmd_show_misions");
for (i = 0; i < sizeof(MISIONS_CLASS); i++)
{
format(text, charsmax(text), "Misión por %s", MISIONS_CLASS[i]);
num_to_str(i, position, 2);
menu_additem(menu, text, position);
}
menu_setprop(menu, MPROP_BACKNAME, "Atrás");
menu_setprop(menu, MPROP_NEXTNAME, "Siguiente");
menu_setprop(menu, MPROP_EXITNAME, "Volver");
menu_display(id, menu);
return PLUGIN_HANDLED;
}
public handled_clcmd_show_mision_struct(id, key)
{
if (!key)
show_menu_cancel_mision(id);
return PLUGIN_HANDLED;
}
show_menu_cancel_mision(id)
{
static menu[128];
formatex(menu, charsmax(menu), "\y¿Estás seguro de cancelar la misión \w%s\y?^n^n\r1. \wSí, cancelar la misión^n\r2. \wNo^n", MISIONS[g_mision_select[id]][MISION_NAME]);
show_menu(id, (1<<0)|(1<<1), menu, -1, "Show Cancel Mision");
}
public handled_show_menu_cancel_mision(id, key)
{
if (!key)
{
static name[32];
get_user_name(id, name, charsmax(name));
chat_color(0, "%s !g%s!y canceló la misión !g%s!y.", SZPREFIX, name, MISIONS[g_mision_select[id]][MISION_NAME]);
reset_check_mision(id);
}
else
return PLUGIN_HANDLED;
return PLUGIN_HANDLED;
}
public handled_clcmd_show_misions(id, menu, item)
{
if (!g_connected[id])
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
if (item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
static buffer[3], dummy, itemid;
menu_item_getinfo(menu, item, dummy, buffer, charsmax(buffer), _, _, dummy);
itemid = str_to_num(buffer);
menu_destroy(menu);
show_menu_misions(id, itemid);
return PLUGIN_HANDLED;
}
show_menu_misions(id, iclass)
{
static text[128], position[4], menu, i;
formatex(text, charsmax(text), "\yMisión por \w%s", MISIONS_CLASS[iclass]);
menu = menu_create(text, "handled_show_menu_misions");
for (i = 0; i < sizeof(MISIONS); i++)
{
if (iclass != MISIONS[i][MISION_TYPE])
continue;
num_to_str(i, position, 3);
formatex(text, charsmax(text), "%s%s %s", (!g_mision[id][i]) ? "\w" : "\d", MISIONS[i][MISION_NAME], (!g_mision[id][i]) ? "" : "\y[COMPLETADA]");
menu_additem(menu, text, position);
}
menu_setprop(menu, MPROP_BACKNAME, "Atrás");
menu_setprop(menu, MPROP_NEXTNAME, "Siguiente");
menu_setprop(menu, MPROP_EXITNAME, "Volver");
g_menu_mision_int[id] = iclass;
menu_display(id, menu);
}
public handled_show_menu_misions(id, menu, item)
{
if (!g_connected[id])
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
if (item == MENU_EXIT)
{
menu_destroy(menu);
clcmd_show_mision(id);
return PLUGIN_HANDLED;
}
static buffer[4], dummy, itemid;
menu_item_getinfo(menu, item, dummy, buffer, charsmax(buffer), _, _, dummy);
menu_destroy(menu);
itemid = str_to_num(buffer);
show_menu_misions_description(id, itemid);
return PLUGIN_HANDLED;
}
public show_menu_misions_description(id, mision)
{
static users[128];
static menu[300];
static len;
len = 0;
if (MISIONS[mision][MISION_PLAYERS])
formatex(users, 51, "\yRequisitos: \w+%d jugadores conectados^n", MISIONS[mision][MISION_PLAYERS]);
len += formatex(menu[len], charsmax(menu) - len, "%s%s^n^n^n\yDescripción:^n\w%s^n%s^n\yRondas: \w%d^n\yRecompensa: \w+%d %s^n^n^n\r1. \wComenzar misión^n\r0. \wVolver",
(!g_mision[id][mision]) ? "\d" : "\y", MISIONS[mision][MISION_NAME], MISIONS[mision][MISION_DESCRIPTION],
(!MISIONS[mision][MISION_PLAYERS]) ? "" : users, MISIONS[mision][MISION_ROUNDS], MISIONS[mision][MISION_REWARD], MISIONS_CLASS[g_menu_mision_int[id]]);
show_menu(id, (1<<0)|(1<<9), menu, -1, "Show Menu Misions Description");
g_mision_select[id] = mision;
return PLUGIN_HANDLED;
}
public handled_show_menu_mision_description(id, key)
{
if (!g_connected[id])
return PLUGIN_HANDLED;
if (key == 0)
{
static mision;
mision = g_mision_select[id];
if (g_mision[id][mision])
{
chat_color(id, "%s !yEsta misión ya está completada.", SZPREFIX);
show_menu_misions_description(id, mision);
return PLUGIN_HANDLED;
}
if (get_playing() < MISIONS[mision][MISION_PLAYERS])
{
chat_color(id, "%s !yNo hay suficientes jugadores para comenzar esta misión.", SZPREFIX);
show_menu_misions_description(id, mision);
return PLUGIN_HANDLED;
}
static name[32];
get_user_name(id, name, charsmax(name));
chat_color(0, "%s !g%s!y comenzó la misión !g%s!y.", SZPREFIX, name, MISIONS[mision][MISION_NAME]);
chat_color(id, "%s !yComenzaste la misión !g%s!y, Tenés !g%d ronda%s!y para completarla.", SZPREFIX, MISIONS[mision][MISION_NAME], MISIONS[mision][MISION_ROUNDS], (MISIONS[mision][MISION_ROUNDS] == 1) ? "" : "s");
g_mision_started[id] = 1;
}
else if (key == 9)
show_menu_misions(id, g_menu_mision_int[id]);
return PLUGIN_HANDLED;
}
set_mision(id, mision, users = 1)
{
if (g_mision[id][mision])
return;
if (MISIONS[mision][MISION_PLAYERS] && users)
{
if (get_playing() < MISIONS[mision][MISION_PLAYERS])
return;
}
static name[32];
get_user_name(id, name, charsmax(name));
g_mision[id][mision] = 1;
switch(g_menu_mision_int[id])
{
case MISION_MONEY: cs_set_user_money(id, cs_get_user_money(id) + MISIONS[mision][MISION_REWARD]);
case MISION_HEALTH: entity_set_float(id, EV_FL_health, entity_get_float(id, EV_FL_health) + MISIONS[mision][MISION_REWARD]);
case MISION_AP: entity_set_float(id, EV_FL_armorvalue, entity_get_float(id, EV_FL_armorvalue) + MISIONS[mision][MISION_REWARD]);
}
chat_color(0, "%s !t%s!y completó la misión !g%s!y !t(+%d %s).", SZPREFIX, name, MISIONS[mision][MISION_NAME], MISIONS[mision][MISION_REWARD], MISIONS_CLASS[g_menu_mision_int[id]]);
reset_check_mision(id);
}
reset_check_mision(id)
{
g_mision_round[id] = 0;
g_mision_select[id] = 0;
g_mision_started[id] = 0;
static i;
for (i = 0; i < MISION_STATS; i++)
g_mision_stats[id][i] = 0;
}
get_playing()
{
static playing, id, CsTeams:team;
playing = 0;
for (id = 1; id <= g_maxplayers; id++)
{
if (g_connected[id])
{
team = cs_get_user_team(id);
if (team != CS_TEAM_SPECTATOR && team != CS_TEAM_UNASSIGNED)
playing++;
}
}
return playing;
}
stock addpoint(const number, sOutPut[], const len)
{
new sTemp[15];
new iOutputPos;
new iNumPos;
new iNumLen = num_to_str(number, sTemp, 14);
while((iNumPos < iNumLen) && (iOutputPos < len))
{
sOutPut[iOutputPos++] = sTemp[iNumPos++];
if ((iNumLen - iNumPos) && !((iNumLen - iNumPos) % 3))
sOutPut[iOutputPos++] = '.';
}
sOutPut[iOutputPos] = EOS;
return iOutputPos;
}
stock chat_color(id, const input[], any:...)
{
static message[191];
vformat(message, 190, input, 3);
replace_all(message, 190, "!g", "^4");
replace_all(message, 190, "!t", "^3");
replace_all(message, 190, "!y", "^1");
message_begin((id) ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, get_user_msgid("SayText"), .player = id);
write_byte((id) ? id : 33);
write_string(message);
message_end();
}