03/08/2021, 08:27 PM
(Última modificación: 03/08/2021, 08:30 PM por samueldmq. Edited 1 time in total.
Razón: La anterior la publique con logs
)
Buenas noches familia, le dejo esta parte de código de un balanceo por puntos, no es la mejor forma de balancear, pero balancea, si alguien busca uno y le da flojera hacer uno use este, besos y no insulten mi primer aporte, un beso <3
Código PHP:
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <tag>
#define PLUGIN "Balanceodemierda bugeado de mierda porque no se porque imerda a veces no sirve si alguien lo averigua quedeselo mamaenmel el guebo"
#define VERSION "1.0"
#define AUTHOR "Samueldmq"
new Float:diffe;
new Float:promedios[2] = {0.0, 0.0}; // Inicialización de promedios
new teammayor, teammenor; // Variables para saber que equipo es mayor / menor
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR)
register_srvcmd("balance", "balanceTeams")
}
public balanceTeams()
{
new players[2][32], counts[2] = {0, 0};
get_players(players[1], counts[1], "e", "CT");
if(counts[1] < 5) {
client_print_color(0, 0, "^4%s^1 No se puede continuar con menos de^4 5^1 en el equipo ^3CT", TAG)
PugNextVote();
return 0
}
get_players(players[0], counts[0], "e", "TERRORIST");
if(counts[0] < 5) {
client_print_color(0, 0, "^4%s^1 No se puede continuar con menos de^4 5^1 en el equipo ^3TT", TAG)
PugNextVote();
return 0
}
new Float:userteaminfo[2][5][2];
for(new team = 0; team < 2; team++) {
for(new player = 0; player < 5; player++) {
userteaminfo[team][player][0] = StatsGetPlayerAdr(players[team][player])
userteaminfo[team][player][1] = float(players[team][player])
}
}
new Float:tempmayor = 0.0;
new postempmayor; // tempmayor para guardar el adr mayor, y postempmayor para guardar el usuario con dicho adr
new bool:bFinish = false, bool:isEncontrado = false;
for(new team = 0; team <= 1; team++) { // Recorrido de los usuarios de cada equipo para sacar el promedio
for(new player = 0; player <= 4; player++) {
if(userteaminfo[team][player][0] < 1) {
continue;
}
promedios[team] += userteaminfo[team][player][0]; // team i, usuario j, adr
}
promedios[team] /= 5.0; // promedio
}
diffe = diff(promedios[0], promedios[1]); // obtenemos la diferencia entre ambos equipos
if(promedios[0] < promedios[1]) { // Obtenemos el equipo mayor y menor
teammayor = 1; teammenor = 0;
} else if(promedios[0] > promedios[1]) {
teammayor = 0; teammenor = 1;
} else {
return 0; // en caso de que sean iguales significa que ya está perfectamente balanceado entonces sale de la funcion
}
while(!bFinish) { // Bucle de balanceo
bFinish = true; // Cambiamos la variable de finish a true
for(new playertt = 0; playertt <= 4; playertt++) { // Bucle para comparar cada usuario del equipo tt con los otros 5 ct
tempmayor = 0.0;
for(new playerct = 0; playerct <= 4; playerct++) { // bucle para comparar con los otros 5 ct
if(userteaminfo[teammayor][playertt][0] > userteaminfo[teammenor][playerct][0]) { // Para conseguir un efecto de balanceo buscamos el jugador con más adr del equipo ct que sea menor que el jugador tt a comparar
if(userteaminfo[teammenor][playerct][0] > tempmayor) { // obtenemos temporalmente cual es el que cumple los requisitos
tempmayor = userteaminfo[teammenor][playerct][0]; // guardamos el adr del compa
postempmayor = playerct; // la posicion en el arreglo del compa
isEncontrado = true; // Marcamos que encontro un posible jugador a balancear
}
}
} // al salir de aqui tendremos ya la posicion del usuario y el adr que mejor balancea
// Chequeamos si luego del cambio realmente disminuyó la diferencia de adr entre ambos equipos
// Si si mejoro la diferencia se intercambian los usuarios y adr en el array
if(isEncontrado && isOptimization(promedios[teammenor], promedios[teammayor], userteaminfo[teammenor][postempmayor][0], userteaminfo[teammayor][playertt][0])) {
new Float:aux = userteaminfo[teammayor][playertt][0]; // intercambio del adr
userteaminfo[teammayor][playertt][0] = userteaminfo[teammenor][postempmayor][0];
userteaminfo[teammenor][postempmayor][0] = aux;
aux = userteaminfo[teammayor][playertt][1]; // intercambio de las id
userteaminfo[teammayor][playertt][1] = userteaminfo[teammenor][postempmayor][1];
userteaminfo[teammenor][postempmayor][1] = aux;
bFinish = false; // Como hubo un cambio cambiamos marcamos que quiza necesitaremos otra vuelta del while
}
isEncontrado = false; // volvemos a cambiar la variable que marca si se encontro o no
}
if(promedios[0] < promedios[1]) { // Volvemos a calcular los promedios para saber que equipo es mayor y menor
teammayor = 1; teammenor = 0;
} else if(promedios[0] > promedios[1]) {
teammayor = 0; teammenor = 1;
} else {
bFinish = true; // en caso de que sean iguales entonces marcamos el final del while poq ya no hay nada que balancear
}
}
counts[0] = 0
counts[1] = 0
for(new i = 0; i < 2; i++) { // Ahora procedemos a hacer valer el balanceo y seteamos los equipos de cada player segun lo hecho en el while
for(new j = 0; j < 5; j++) {
if(!is_user_connected(floatround(userteaminfo[i][j][1]))) {
counts[i]++
continue
}
cs_set_user_team(floatround(userteaminfo[i][j][1]), i+1) // userteaminfo[i][j][1] es la id del usuario, y con i+1 marcamos si es TT(1) o CT (2)
}
}
new count
if(counts[0] >= 1 || counts[1] >= 1) {
get_players(players[0], count, "e", "SPECTATOR");
if(count > 0 && count >= (counts[0]+counts[1])) {
new user = 0;
while(counts[0] > 0 && counts[1] > 0) {
cs_set_user_team(players[0][user], (counts[0] > 0) ? 1:2)
counts[(counts[0] > 0) ? 0:1]--
user++
}
balanceTeams()
return -1
} else {
client_print_color(0, -1, "^4%s^1 No hay jugadores suficientes para jugar balanceado", TAG)
return 0
}
}
client_print_color(0, -1, "^4%s^1 Balanceo XD TT = %0.02f, CT = %0.02f", TAG, promedios[0], promedios[1])
PugNextVote();
return 1; // Returnamos 1 poq aja todo bien XD
}
Float:diff(Float:promedio1, Float:promedio2) { // Funcion pa obtener la diferencia entre dos promedios
if(promedio1 > promedio2) {
return promedio1 - promedio2;
} else {
return promedio2 - promedio1;
}
}
bool:isOptimization(Float:promedio1, Float:promedio2, Float:cambio1, Float:cambio2) { // Funcion pa chequear si es optimo o no el cambio
new Float:prom[2]; // promedios de ambos equipos
new Float:dif; // variable para obtener la diferencia obtenida
prom[teammenor] = promedio1-(cambio1/5)+(cambio2/5); // el promedio1 le restamos el adr del jugador que le cambiaremos y le sumamos el adr del jugador que se unira
prom[teammayor] = promedio2-(cambio2/5)+(cambio1/5); // Lo mismo que lo de arriba pero con el promedio2
dif = diff(prom[teammenor], prom[teammayor]); // Calcular la diferencia entre ambos promedios
if(dif < diffe) { // Si la diferencia obtenida es menor que la diferencia que habia previamente significa que mejora el balanceo
diffe = dif; // Colocamos que ahora la nueva diferencia sera la obtenida aqui
promedios[teammenor] = prom[teammenor];
promedios[teammayor] = prom[teammayor];
return true; // devolvemos que efectivamente es más optimo
} else {
return false; // en caso de que no pos, no es optimo XD
}
}
Estoy cansado de este sufrimiento llamado vivir en Venezuela