Ir al contenido
  • Crear una cuenta

(#11 Fruta) Most VALUE Player


gianco

Posts recomendados

Most VALUE Player Plugin v1.1

Bueno otra vez más con un plugin sencillo, pero que me gusto hacer para darle más picante a los servidores, creo que se podría implementar tanto como en el fruta o en el pub ya que es un plugin que genera un TOP y RANK a partir de un daño hecho: ¿Qué quiere decir? Que a cada final de ronda el plugin selecciona a un jugador que fue el Most Value Player (mejor jugador de la ronda) a partir del daño que ha causado en esa ronda específica.
También se podria hacer por kills, es decir, evaluar también los kills que un jugador hizo en una ronda ya que puede dar el caso de que un jugador haga mucho daño pero sin matar a ningun jugador, y aún asi se consagra como MVP de la ronda, pero en este caso solo lo puse por daño causado.

El plugin contiene dos cvars para la modificación de dicho plugin:
1) mvp_hud_colors <X=red|X=green|X=blue> - DEFAULT: 0 | 255 | 0 (VERDE) con este comando podemos cambiar el color del hud que aparecera al final de cada ronda.
2) mvp_on <1|0> - DEFAULT: 1 Sirve para activar/desactivar el funcionamiento del plugin.

En el hud se mostraran los datos del jugador que se coronó MVP de la ronda mostrando cantidad de rondas ganadas en dicho mapa, también la cantidad de MVP's que consiguió en su totalidad en el servidor (datos guardados por ADV_VAULT) y por último el daño causado en su totalidad y un porcentaje exacto de la influencia de su daño en el daño total de la ronda. También le agregue un guardado de todo el daño que va causando el jugador a lo largo de su estadía en el servidor.

Para mostrar el ranking se usaran los comandos: !top y !rank los cuales mostrarán un listado de jugadores con sus determinados datos (daño causado y cantidad de MVP's) y el ranking que ocupas dentro del servidor (si sos un usuario nuevo, el servidor te mandará un mensaje de que todavía no formas parte del ranking)

Creo que eso fue todo les dejo el code para que lo miren y si alguno lo entiende y quiere dejar una sugerencia, encantando.
Mi idea siempre es tratar de innovar un poco los servidores para que no sea siempre lo mismo y darle mas diversión.

#include <amxmodx>
#include <adv_vault>
#include <hamsandwich>
#include <dhudmessage>
#include <colorchat>

#define MAXPLAYERS 32
#pragma semicolon 1

new const szPlugInfo[] = { "Most Value Player", "1.1", "gianco" };

enum
{
	CAMPO_RONDASTOTAL,
	CAMPO_TOTALDMG,
	CAMPO_NOMBRE,
	VAULT_DATA
};

new gDatos[VAULT_DATA];
new gVault;
new gSort;

new Float:fMyTotalDMG[MAXPLAYERS+1];
new Float:fDamage[MAXPLAYERS+1];
new Float:fRoundDamage;
new iRoundsMVP[MAXPLAYERS+1];
new iMapMVP[MAXPLAYERS+1];

new iMVPName;

new iColors;
new iMVP;

new iRoundPlayed;
new iMaxPlayers;

public plugin_init()
{
	register_plugin(szPlugInfo[0], szPlugInfo[1], szPlugInfo[2]);
	
	register_clcmd("say !top", "MVPTop");
	register_clcmd("say_team !top", "MVPTop");
	register_clcmd("say !rank", "MVPMyRank");
	register_clcmd("say_team !rank", "MVPMyRank");
	
	iColors = register_cvar("mvp_hud_colors", "0 255 0"); // Colores del hud. DEF: 0 (red) 255 (green) 0 (blue)
	iMVP = register_cvar("mvp_on", "1"); // Activado/Desactivado del plugin. DEF: 1
	
	RegisterHam(Ham_TakeDamage, "player", "fw_TakeDamage", 1);
	register_logevent("Round_End", 2, "1=Round_End");
	
	iMaxPlayers = get_maxplayers();
	
	gVault = adv_vault_open("mvp_data", false);
	
	gDatos[CAMPO_RONDASTOTAL] = adv_vault_register_field(gVault, "RONDASTOTAL");
	gDatos[CAMPO_TOTALDMG] = adv_vault_register_field(gVault, "TOTALDMG");
	gDatos[CAMPO_NOMBRE] = adv_vault_register_field(gVault, "NOMBRE", DATATYPE_STRING, 32);
	
	adv_vault_init(gVault);
	
	gSort = adv_vault_sort_create(gVault, ORDER_DESC, 60, 2000, gDatos[CAMPO_RONDASTOTAL], gDatos[CAMPO_TOTALDMG], gDatos[CAMPO_NOMBRE]);
	
	set_task(180.0, "ShowPlugInfo");
}

public ShowPlugInfo()
{
	for(new i = 1; i <= iMaxPlayers; i++)
		ColorChat(i, GREEN, "^x04[NostalgiaGamers] ¡Utiliza^x04 !top^x01 y^x04 !rank^x01 para ver tus estadisticas de MVP!");
}

public fw_TakeDamage(victim, inflictor, attacker, Float:damage, damage_type)
{
	if(!get_pcvar_num(iMVP))
		return HAM_IGNORED;
	
	if(!is_user_connected(attacker) || !is_user_alive(attacker) || victim == attacker)
		return HAM_IGNORED;
	
	fRoundDamage += floatround(damage);
	fDamage[attacker] += floatround(damage);
	fMyTotalDMG[attacker] += floatround(damage);
	
	MVP_GuardarDatos(attacker);
	
	return HAM_IGNORED;
}

public Round_End()
{
	if(!get_pcvar_num(iMVP))
		return;
	
	CheckMVPS();
	
	for(new i = 1; i <= iMaxPlayers; i++)
		if(is_user_connected(i))
			MVP_GuardarDatos(i);
	
	arrayset(_:fDamage, _:0, sizeof(fDamage));
	fRoundDamage = 0.0;
	
	++iRoundPlayed;
	
	return;
}

public client_putinserver(id)
{
	new PlayerName[32];
	get_user_name(id, PlayerName, charsmax(PlayerName));
	if(adv_vault_get_prepare(gVault, _, PlayerName))
	{
		MVP_CargarDatos(id); // Le cargamos los datos
	}
	else
	{
		iMapMVP[id] = 0; // Rondas MVP en un mapa
		fDamage[id] = 0.0; // Daño hecho en un mapa (se resetea por cada ronda)
		iRoundsMVP[id] = 0; // Rondas MVP en todo el servidor (datos guardados en adv vault)
		fRoundDamage = 0.0; // Daño hecho en una ronda (se restea por cada ronda)
		iRoundPlayed = 0; // Contador de rondas en un mapa
		fMyTotalDMG[id] = 0.0; // Guardamos todo el daño que ha hecho dentro del servidor
	}
}

public CheckMVPS()
{
	new iPlayers[32], iNum, id;
	get_players(iPlayers, iNum);
	
	if(iNum < 2)
		return;
		
	new iColores[12], iRojo[4], iVerde[4], iAzul[4], rojo, verde, azul;
	
	get_pcvar_string(iColors, iColores, sizeof(iColores) - 1);
	parse(iColores, iRojo, sizeof(iRojo) - 1, iVerde, sizeof(iVerde) - 1, iAzul, sizeof(iAzul) - 1);
	
	rojo = str_to_num(iRojo);
	verde = str_to_num(iVerde);
	azul = str_to_num(iAzul);
	
	if(fRoundDamage > 0)
	{
		iMVPName = iPlayers[0];
	
		for(new i = 1; i <= iNum; i++)
		{
			id = iPlayers[i];
			if(fDamage[id] > fDamage[iMVPName])
				iMVPName = id;
		}
	
		new MVPName[32];
		get_user_name(iMVPName, MVPName, charsmax(MVPName));
	
		iRoundsMVP[iMVPName]++;
		iMapMVP[iMVPName]++;
		
		set_dhudmessage(rojo, verde, azul, -1.0, 0.00, 1, 6.0, 3.0, 0.1, 5.0);
		show_dhudmessage(0, "¡El MVP de esta ronda fue: %s!^nñDaño causado: %2.f (%2.f%%)!^n¡Ha logrado ser %d %s MVP de %d ronda%s^n¡Consiguió %d MVP's!", MVPName, fDamage[iMVPName], GetPercentDamage(iMVPName), iMapMVP[iMVPName], iMapMVP[iMVPName] > 1 ? "veces" : "vez", iRoundPlayed, iRoundPlayed > 1 ? "s" : "", iRoundsMVP);
	}
	else
	{
		set_dhudmessage(rojo, verde, azul, -1.0, 0.05, 1, 6.0, 3.0, 0.1, 5.0);
		show_dhudmessage(0, "¡No hubo daño esta ronda!");
	}
}

public Float:GetPercentDamage(player)
	return Float:(((fDamage[player]) * 100.0) / (fRoundDamage));

public MVPTop(id)
{
	new RondasWIN, TotalDMG, key, name[32];
	static szBuffer[150];
	
	new kItems = min(adv_vault_sort_numresult(gVault, gSort), 15);
	
	new menu = menu_create("\yLista de jugadores MVP'S", "TOP_Handler");
	for(new pos = 1; pos <= kItems; pos++)
	{
		key = adv_vault_sort_position(gVault, gSort, pos);
		if(!adv_vault_get_prepare(gVault, key)) continue;
		
		RondasWIN = adv_vault_get_field(gVault, gDatos[CAMPO_RONDASTOTAL]);
		TotalDMG = adv_vault_get_field(gVault, gDatos[CAMPO_TOTALDMG]);
		
		adv_vault_get_field(gVault, gDatos[CAMPO_NOMBRE], name, charsmax(name));
		
		formatex(szBuffer, charsmax(szBuffer), "\w%s \yMVPs: \w%d\y - DAÑO: \w%d", name, RondasWIN, TotalDMG);
		menu_additem(menu, szBuffer);
		
		menu_setprop(menu, MPROP_NEXTNAME, "Siguiente");
		menu_setprop(menu, MPROP_BACKNAME, "Atras");
		menu_setprop(menu, MPROP_EXITNAME, "Salir");
		menu_display(id, menu, 0);
	}
}

public TOP_Handler(id, menu, item) 
{ 
	if (item == MENU_EXIT)
	{
		menu_destroy(menu);
		return PLUGIN_HANDLED;
	}
	
	MVPTop(id);
	return PLUGIN_HANDLED;
} 

public MVPMyRank(id)
{
	new Player[32];
	get_user_name(id, Player, charsmax(Player));
	
	new myRank = adv_vault_sort_key(gVault, gSort, 0, Player);
	
	if(!myRank)
		ColorChat(id, GREEN, "^x04[NostalgiaGamers]^x01 ¡Todavia no formas parte del ranking!");
	else
		ColorChat(id, GREEN, "^x04[NostalgiaGamers]^x01 ¡Tu ranking en el servidor es de^x04 %d^x01 de^x04 %d^x01.", myRank, adv_vault_sort_numresult(gVault, gSort));
	
}

public MVP_CargarDatos(id)
{
	static PlayerName[32];
	get_user_name(id, PlayerName, charsmax(PlayerName));
	
	if(!adv_vault_get_prepare(gVault, _, PlayerName)) // Fixeamos un posible bug que se cambie el nombre mientras se le cargan los datos
		return;
	
	iRoundsMVP[id] = adv_vault_get_field(gVault, gDatos[CAMPO_RONDASTOTAL]);
	fMyTotalDMG[id] = float(adv_vault_get_field(gVault, gDatos[CAMPO_TOTALDMG]));
}

public MVP_GuardarDatos(id)
{
	static PlayerName[32];
	get_user_name(id, PlayerName, charsmax(PlayerName));
	
	adv_vault_set_start(gVault);
	
	adv_vault_set_field(gVault, gDatos[CAMPO_RONDASTOTAL], iRoundsMVP[id]);
	adv_vault_set_field(gVault, gDatos[CAMPO_TOTALDMG], fMyTotalDMG[id]);
	adv_vault_set_field(gVault, gDatos[CAMPO_NOMBRE], PlayerName);
	
	adv_vault_set_end(gVault, 0, PlayerName);
}

PD: No fue testeado en su totalidad ya que con BOTS algunas funciones no andan correctamente, pero aún asi todo parece funcionar correctamente.
Actualización v1.1: Corregi un par de cositas y el top ahora se muestra por un menu y no por consola.

Saludos.

Editado por gianco
Enlace al comentario
Compartir en otros sitios

  • 2 meses después...
  • Respuestas 1
  • Creado
  • Última respuesta

Top posteadores en este tema

  • shiobi

    1

  • gianco

    1

Días populares

Top posteadores en este tema

  • shiobi bloqueó este tema
Invitado
Este tema se encuentra cerrado a nuevas respuestas.
  • Navegando Recientemente   0 miembros

    • No hay usuarios registrados viendo esta página

×
×
  • Crear nuevo...