diff --git a/source/src/server.cpp b/source/src/server.cpp index 1c726dee..6405cd79 100644 --- a/source/src/server.cpp +++ b/source/src/server.cpp @@ -1513,9 +1513,7 @@ void serverdamage(client *target, client *actor, int damage, int gun, bool gib, actor->state.teamkills * 30 * 1000 > gamemillis && actor->state.frags < 4 * actor->state.teamkills ) ) { - ban b = { actor->peer->address, servmillis+scl.ban_time }; - bans.add(b); - disconnect_client(actor->clientnum, DISC_AUTOBAN); + addban(actor, DISC_AUTOBAN); } else if( actor->state.frags < scl.kickthreshold || /** teamkilling more than 5 (defaults), more than 1 tk per minute and less than 4 frags per tk */ @@ -2039,6 +2037,14 @@ void addgban(const char *name) } } +void addban(client *cl, int reason) +{ + if(!cl) return; + ban b = { cl->peer->address, servmillis+scl.ban_time }; + bans.add(b); + disconnect_client(cl->clientnum, reason); +} + int getbantype(int cn) { if(!valid_client(cn)) return BAN_NONE; diff --git a/source/src/serveractions.h b/source/src/serveractions.h index 6d9a2235..98bbb798 100644 --- a/source/src/serveractions.h +++ b/source/src/serveractions.h @@ -200,9 +200,8 @@ struct banaction : playeraction bool wasvalid; void perform() { - ban b = { address, servmillis+scl.ban_time }; - bans.add(b); - disconnect(DISC_MBAN); + int i = findcnbyaddress(&address); + if(i >= 0) addban(clients[i], DISC_MBAN); } virtual bool isvalid() { return wasvalid || playeraction::isvalid(); } banaction(int cn, char *reason) : playeraction(cn) diff --git a/source/src/serverchecks.h b/source/src/serverchecks.h index c577a768..86cef81b 100644 --- a/source/src/serverchecks.h +++ b/source/src/serverchecks.h @@ -23,6 +23,8 @@ inline void checkclientpos(client *cl) #define POW2XY(A,B) (pow2(A.x-B.x)+pow2(A.y-B.y)) +extern void addban(client *cl, int reason); + #ifdef ACAC #include "anticheat.h" #endif diff --git a/source/src/serverevents.h b/source/src/serverevents.h index 16d1c223..5c335450 100644 --- a/source/src/serverevents.h +++ b/source/src/serverevents.h @@ -65,17 +65,46 @@ void processevent(client *c, shotevent &e) client *target = clients[h.target]; if(target->type==ST_EMPTY || target->state.state!=CS_ALIVE || h.lifesequence!=target->state.lifesequence) continue; - int rays = e.gun==GUN_SHOTGUN ? ((h.info & 0xFF00) >> 8) : 1; - if(rays<1) continue; - totalrays += rays; - if(totalrays>maxrays) continue; - - int damage = e.gun==GUN_SHOTGUN ? h.info&0xFF : rays*guns[e.gun].damage; + int rays = 1, damage = 0; bool gib = false; - if(e.gun==GUN_KNIFE || (e.gun==GUN_SHOTGUN && rays == maxrays)) gib = true; - - else if(e.gun==GUN_SNIPER) gib = h.info!=0; - if(e.gun==GUN_SNIPER && gib) damage *= 3; + if(e.gun == GUN_SHOTGUN) + { + h.info = isbigendian() ? endianswap(h.info) : h.info; + int bonusdist = h.info&0xFF; + int numhits_c = (h.info & 0x0000FF00) >> 8; + int numhits_m = (h.info & 0x00FF0000) >> 16; + int numhits_o = (h.info & 0xFF000000) >> 24; + rays = numhits_c + numhits_m + numhits_o; + + if(rays < 1) continue; + + if(numhits_c > SGRAYS || numhits_m > SGRAYS || numhits_o > SGRAYS || bonusdist > SGDMGBONUS) + { + addban(c, DISC_CHEAT); + continue; + } + + gib = rays == maxrays; + float fdamage = (SGDMGTOTAL/(21*100.0f)) * (numhits_o * SGCOdmg/10.0f + numhits_m * SGCMdmg/10.0f + numhits_c * SGCCdmg/10.0f); + fdamage += (float)bonusdist; + damage = (int)ceil(fdamage); +#ifdef ACAC + if (!sg_engine(target, c, numhits_c, numhits_m, numhits_o, bonusdist)) continue; +#endif + } + else + { + damage = rays*guns[e.gun].damage; + gib = e.gun == GUN_KNIFE; + if(e.gun == GUN_SNIPER && h.info != 0) + { + gib = true; + damage *= 3; + } + } + totalrays += rays; + + if(totalrays>maxrays) continue; serverdamage(target, c, damage, e.gun, gib, h.dir); } break; diff --git a/source/src/weapon.cpp b/source/src/weapon.cpp index 7894478a..c12b728a 100644 --- a/source/src/weapon.cpp +++ b/source/src/weapon.cpp @@ -661,7 +661,8 @@ void raydamage(vec &from, vec &to, playerent *d) lastsgs_hits = numhits; lastsgs_dmgt = dmgreal; // conoutf("%d [%.3f%s] DMG with %d hits", lastsgs_dmgt, dmg4r, withBONUS ? "\fs\f3+\fr" : "", lastsgs_hits); - if(numhits) hitpush( dmgreal, o, d, from, to, d->weaponsel->type, lastsgs_hits == SGRAYS*3, dmgreal | (lastsgs_hits << 8)); + int info = (withBONUS ? SGDMGBONUS : 0) | (numhits_c << 8) | (numhits_m << 16) | (numhits_o << 24); + if(numhits) hitpush( dmgreal, o, d, from, to, d->weaponsel->type, lastsgs_hits == SGRAYS*3, isbigendian() ? endianswap(info) : info); // if(numhits) hitpush( dmgreal, o, d, from, to, d->weaponsel->type, dmgreal == SGMAXDMGABS, dmgreal); if(d==player1) hitted = true;