compact pos packets are now parseable out of context; all-whitespace chat gets suppressed

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@4620 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
ac_stef
2009-08-09 20:34:09 +00:00
parent df7176e9af
commit 9fca17a7a9
5 changed files with 68 additions and 39 deletions
+13 -6
View File
@@ -220,10 +220,15 @@ void _toserver(char *text, int msg, int msgt)
bool toteam = text && text[0] == '%' && (m_teammode || team_isspect(player1->team));
if(!toteam && text[0] == '%' && strlen(text) > 1) text++; // convert team-text to normal-text if no team-mode is active
if(toteam) text++;
filtertext(text, text);
trimtrailingwhitespace(text);
if(servstate.mastermode == MM_MATCH && servstate.matchteamsize && !team_isactive(player1->team) && !(player1->team == TEAM_SPECT && player1->clientrole == CR_ADMIN)) toteam = true; // spect chat
if(msg == SV_TEXTME) conoutf("\f%d%s %s", toteam ? 1 : 0, colorname(player1), highlight(text));
else conoutf("%s:\f%d %s", colorname(player1), toteam ? 1 : 0, highlight(text));
addmsg(toteam ? msgt : msg, "rs", text);
if(*text)
{
if(msg == SV_TEXTME) conoutf("\f%d%s %s", toteam ? 1 : 0, colorname(player1), highlight(text));
else conoutf("%s:\f%d %s", colorname(player1), toteam ? 1 : 0, highlight(text));
addmsg(toteam ? msgt : msg, "rs", text);
}
}
void toserver(char *text)
@@ -353,8 +358,9 @@ void c2sinfo(playerent *d) // send update to the server
dz = (int)(d->vel.z*DVELF),
// pack rest in 1 int: strafe:2, move:2, onfloor:1, onladder: 1
f = (d->strafe&3) | ((d->move&3)<<2) | (((int)d->onfloor)<<4) | (((int)d->onladder)<<5) | ((d->lifesequence&1)<<6) | (((int)d->crouching)<<7);
int sizexy = 1 << (sfactor + 4);
int usefactor = sfactor < 7 ? 7 : sfactor, sizexy = 1 << (usefactor + 4);
if(cn >= 0 && cn < 32 &&
usefactor <= 7 + 3 && // map size 7..10
x >= 0 && x < sizexy &&
y >= 0 && y < sizexy &&
z >= -2047 && z <= 2047 &&
@@ -369,8 +375,9 @@ void c2sinfo(playerent *d) // send update to the server
bitbuf b(&q);
putint(q, SV_POSC);
b.putbits(5, cn);
b.putbits(sfactor + 4, x);
b.putbits(sfactor + 4, y);
b.putbits(2, usefactor - 7);
b.putbits(usefactor + 4, x);
b.putbits(usefactor + 4, y);
b.putbits(9, ya);
b.putbits(8, pi + 128);
b.putbits(1, noroll ? 1 : 0);
+3 -2
View File
@@ -116,8 +116,9 @@ void parsepositions(ucharbuf &p)
{
bitbuf q(&p);
cn = q.getbits(5);
o.x = q.getbits(sfactor + 4) / DMF;
o.y = q.getbits(sfactor + 4) / DMF;
int usefactor = q.getbits(2) + 7;
o.x = q.getbits(usefactor + 4) / DMF;
o.y = q.getbits(usefactor + 4) / DMF;
yaw = q.getbits(9) * 360.0f / 512;
pitch = (q.getbits(8) - 128) * 90.0f / 127;
roll = !q.getbits(1) ? (q.getbits(6) - 32) * 20.0f / 31 : 0.0f;
+8 -2
View File
@@ -94,7 +94,7 @@ void getstring(char *text, ucharbuf &p, int len)
#define follower(x) (((x) & 0xc0) == 0x80)
int getutf8char(const unsigned char *&s)
int getutf8char(const uchar *&s)
{
int res = *s++;
if(res < 0x80) return res;
@@ -140,7 +140,7 @@ int getutf8char(const unsigned char *&s)
return -1;
}
int pututf8char(unsigned char *&d, int s)
int pututf8char(uchar *&d, int s)
{
if(s < 0 || s > 0x1fffff) return 0;
if(s < 0x80)
@@ -246,6 +246,12 @@ void filterlang(char *d, const char *s)
*d = '\0';
}
void trimtrailingwhitespace(char *s)
{
for(int n = strlen(s) - 1; n >= 0 && isspace(s[n]); n--)
s[n] = '\0';
}
void cutcolorstring(char *text, int len)
{ // limit string length, ignore color codes
while(*text)
+1
View File
@@ -704,6 +704,7 @@ extern void filtertext(char *dst, const char *src, int whitespace = 1, int len =
extern void filterrichtext(char *dst, const char *src, int len = sizeof(string)-1);
extern void filterservdesc(char *dst, const char *src, int len = sizeof(string)-1);
extern void filterlang(char *d, const char *s);
extern void trimtrailingwhitespace(char *s);
extern void cutcolorstring(char *text, int len);
extern void startintermission();
extern void restoreserverstate(vector<entity> &ents);
+43 -29
View File
@@ -2344,15 +2344,19 @@ void process(ENetPacket *packet, int sender, int chan)
case SV_TEAMTEXT:
getstring(text, p);
filtertext(text, text);
if(!spamdetect(cl, text))
{ // team chat
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s'", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendteamtext(text, sender, type);
}
else
trimtrailingwhitespace(text);
if(*text)
{
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s', SPAM detected", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendservmsg("\f3please do not spam", sender);
if(!spamdetect(cl, text))
{ // team chat
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s'", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendteamtext(text, sender, type);
}
else
{
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s', SPAM detected", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendservmsg("\f3please do not spam", sender);
}
}
break;
@@ -2362,25 +2366,29 @@ void process(ENetPacket *packet, int sender, int chan)
int mid1 = curmsg, mid2 = p.length();
getstring(text, p);
filtertext(text, text);
if(!spamdetect(cl, text))
trimtrailingwhitespace(text);
if(*text)
{
if(mastermode != MM_MATCH || !matchteamsize || team_isactive(cl->team) || (cl->team == TEAM_SPECT && cl->role == CR_ADMIN))
{ // common chat
logline(ACLOG_INFO, "[%s] %s%s says: '%s'", cl->hostname, type == SV_TEXTME ? "(me) " : "", cl->name, text);
if(cl->type==ST_TCPIP) while(mid1<mid2) cl->messages.add(p.buf[mid1++]);
QUEUE_STR(text);
if(!spamdetect(cl, text))
{
if(mastermode != MM_MATCH || !matchteamsize || team_isactive(cl->team) || (cl->team == TEAM_SPECT && cl->role == CR_ADMIN))
{ // common chat
logline(ACLOG_INFO, "[%s] %s%s says: '%s'", cl->hostname, type == SV_TEXTME ? "(me) " : "", cl->name, text);
if(cl->type==ST_TCPIP) while(mid1<mid2) cl->messages.add(p.buf[mid1++]);
QUEUE_STR(text);
}
else
{ // spect chat
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s'", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendteamtext(text, sender, type == SV_TEXTME ? SV_TEAMTEXTME : SV_TEAMTEXT);
}
}
else
{ // spect chat
logline(ACLOG_INFO, "[%s] %s%s says to team %s: '%s'", cl->hostname, type == SV_TEAMTEXTME ? "(me) " : "", cl->name, team_string(cl->team), text);
sendteamtext(text, sender, type == SV_TEXTME ? SV_TEAMTEXTME : SV_TEAMTEXT);
{
logline(ACLOG_INFO, "[%s] %s%s says: '%s', SPAM detected", cl->hostname, type == SV_TEXTME ? "(me) " : "", cl->name, text);
sendservmsg("\f3please do not spam", sender);
}
}
else
{
logline(ACLOG_INFO, "[%s] %s%s says: '%s', SPAM detected", cl->hostname, type == SV_TEXTME ? "(me) " : "", cl->name, text);
sendservmsg("\f3please do not spam", sender);
}
break;
}
@@ -2677,20 +2685,26 @@ void process(ENetPacket *packet, int sender, int chan)
#endif
return;
}
loopi(2) cl->state.o[i] = q.getbits(smapstats.hdr.sfactor + 4)/DMF;
int usefactor = q.getbits(2) + 7;
int xt = q.getbits(usefactor + 4);
int yt = q.getbits(usefactor + 4);
q.getbits(9 + 8);
if(!q.getbits(1)) q.getbits(6);
if(!q.getbits(1)) q.getbits(4 + 4 + 4);
q.getbits(8);
int f = q.getbits(8);
int negz = q.getbits(1);
int full = q.getbits(1);
int zfull = q.getbits(1);
int s = q.rembits();
if(s < 3) s += 8;
if(full) s = 11;
int z = q.getbits(s);
if(negz) z = -z;
cl->state.o[2] = z/DMF;
if(zfull) s = 11;
int zt = q.getbits(s);
if(negz) zt = -zt;
if(!cl->isonrightmap || p.remaining() || p.overread()) { p.flags = 0; break; }
if(((f >> 6) & 1) != (cl->state.lifesequence & 1) || usefactor != (smapstats.hdr.sfactor < 7 ? 7 : smapstats.hdr.sfactor)) break;
cl->state.o[0] = xt / DMF;
cl->state.o[1] = yt / DMF;
cl->state.o[2] = zt / DMF;
if(cl->type==ST_TCPIP && (cl->state.state==CS_ALIVE || cl->state.state==CS_EDITING))
{
cl->position.setsizenodelete(0);