From 0c0cc2c97c1b7c150b82a73184c5dad63cc6c4e5 Mon Sep 17 00:00:00 2001 From: Rafael Barreto Date: Sun, 22 Aug 2010 19:17:09 +0000 Subject: [PATCH] version 1.1.0.3 (protocol update), inclusion of the auth things, server vote fixes, client side warning about version updates git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@5671 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- source/src/client.cpp | 11 +++++++++-- source/src/clients2c.cpp | 27 ++------------------------ source/src/cube.h | 2 +- source/src/entity.h | 4 ++-- source/src/protocol.cpp | 4 ++-- source/src/protocol.h | 7 +++---- source/src/server.cpp | 41 ++++++++++++++++++++++------------------ source/src/server.h | 4 ++-- 8 files changed, 44 insertions(+), 56 deletions(-) diff --git a/source/src/client.cpp b/source/src/client.cpp index 98c76c99..a5c237cf 100644 --- a/source/src/client.cpp +++ b/source/src/client.cpp @@ -278,6 +278,13 @@ COMMANDN(disconnect, trydisconnect, ARG_NONE); COMMAND(whereami, ARG_NONE); COMMAND(go_to, ARG_2STR); +void current_version(char *text) +{ + int version = atoi(text); + if (version < AC_VERSION) conoutf("UPDATE YOUR CLIENT\ngo to %s for more information",AC_MASTER_URI); +} +COMMAND(current_version, ARG_1STR); + void cleanupclient() { abortconnect(); @@ -571,7 +578,7 @@ void gets2c() // get updates from the server } // for AUTH: -/* + vector authkeys; VARP(autoauth, 0, 1, 1); @@ -632,7 +639,7 @@ ICOMMANDF(hasauthkey, ARG_2EST, (char *name, char *desc) { return (_hasauthkey(n COMMAND(genauthkey, ARG_1STR); COMMAND(saveauthkeys, ARG_NONE); ICOMMANDF(auth, ARG_1EST, (char *desc) { return tryauth(desc); }); -*/ + // :for AUTH // sendmap/getmap commands, should be replaced by more intuitive map downloading diff --git a/source/src/clients2c.cpp b/source/src/clients2c.cpp index 7688502a..37d5781a 100644 --- a/source/src/clients2c.cpp +++ b/source/src/clients2c.cpp @@ -632,7 +632,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } // for AUTH: WIP - /* + case SV_AUTHREQ: { extern int autoauth; @@ -656,7 +656,7 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) } break; } - */ + // :for AUTH case SV_GIBDAMAGE: @@ -940,29 +940,6 @@ void parsemessages(int cn, playerent *d, ucharbuf &p) break; } - case SV_LMSITEM: - { - const char *names[] = { "no items", "pistol clips", "ammoboxes", "grenades", "health packs", "helmet", "armour", "akimbo" }; - const int types[] = { NOTUSED, I_CLIPS, I_AMMO, I_GRENADE, I_HEALTH, I_HELMET, I_ARMOUR, I_AKIMBO }, types_n = sizeof(types) / sizeof(types[0]); - int cmd = getint(p), typ = getint(p); - int n = 0; - loopi(types_n) if(typ == types[i]) n = i; - switch(cmd) - { - case LMSITEM_CLEAR: - resetspawns(n > 0 ? typ : -1); - break; - case LMSITEM_ANNOUNCE: - hudoutf("%s will spawn%s", names[n], typ != NOTUSED ? " in 10 seconds" : ""); // sound? - break; - case LMSITEM_SPAWN: - loopv(ents) if(ents[i].type == typ) setspawn(i, true); - hudonlyf("\f3%s spawned", names[n]); // sound? - break; - } - break; - } - case SV_SPAWNDENY: { extern int spawnpermission; diff --git a/source/src/cube.h b/source/src/cube.h index d1e5972b..82cd9911 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -52,7 +52,7 @@ extern int verbose; #include "protos.h" // external function decls -#define AC_VERSION 1102 +#define AC_VERSION 1003 #define AC_MASTER_URI "assault.cubers.net" #define AC_MASTER_PORT 28760 #define MAXCL 20 diff --git a/source/src/entity.h b/source/src/entity.h index 271f246c..d206ae8d 100644 --- a/source/src/entity.h +++ b/source/src/entity.h @@ -329,8 +329,8 @@ public: // just subtract damage here, can set death, etc. later in code calling this int dodamage(int damage) { - /* 4-level armor - continous approach: 20%, 28%, 36%, 44% */ - int ad = damage * ( 1200 + 32 * armour ) / 10000; // let armour absorb when possible + /* 4-level armor - continous approach: 28%, 32%, 36%, 40% */ + int ad = damage * ( 2400 + 16 * armour ) / 10000; // let armour absorb when possible if(ad>armour) ad = armour; armour -= ad; damage -= ad; diff --git a/source/src/protocol.cpp b/source/src/protocol.cpp index 89245d2e..4e74f533 100644 --- a/source/src/protocol.cpp +++ b/source/src/protocol.cpp @@ -319,7 +319,7 @@ static const int msgsizes[] = // size inclusive message token, 0 f { SV_SERVINFO, 5, SV_WELCOME, 2, SV_INITCLIENT, 0, SV_POS, 0, SV_POSC, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 0, SV_SOUND, 2, SV_VOICECOM, 2, SV_VOICECOMTEAM, 2, SV_CDIS, 2, - SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_AUTHT, 0, /*SV_AUTHREQ, 0, SV_AUTHTRY, 0, SV_AUTHANS, 0, SV_AUTHCHAL, 0,*/ + SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_AUTHT, 0, SV_AUTHREQ, 0, SV_AUTHTRY, 0, SV_AUTHANS, 0, SV_AUTHCHAL, 0, SV_GIBDIED, 5, SV_DIED, 5, SV_GIBDAMAGE, 6, SV_DAMAGE, 6, SV_HITPUSH, 6, SV_SHOTFX, 6, SV_THROWNADE, 8, SV_TRYSPAWN, 1, SV_SPAWNSTATE, 23, SV_SPAWN, 3, SV_SPAWNDENY, 2, SV_FORCEDEATH, 2, SV_RESUME, 0, SV_DISCSCORES, 0, SV_TIMEUP, 2, SV_EDITENT, 10, SV_ITEMACC, 2, @@ -329,7 +329,7 @@ static const int msgsizes[] = // size inclusive message token, 0 f SV_SENDMAP, 0, SV_RECVMAP, 1, SV_REMOVEMAP, 0, SV_SERVMSG, 0, SV_ITEMLIST, 0, SV_WEAPCHANGE, 2, SV_PRIMARYWEAP, 2, SV_FLAGACTION, 3, SV_FLAGINFO, 0, SV_FLAGMSG, 0, SV_FLAGCNT, 3, - SV_ARENAWIN, 2, SV_LMSITEM, 3, + SV_ARENAWIN, 2, SV_SETADMIN, 0, SV_SERVOPINFO, 3, SV_CALLVOTE, 0, SV_CALLVOTESUC, 1, SV_CALLVOTEERR, 2, SV_VOTE, 2, SV_VOTERESULT, 2, SV_SETTEAM, 3, SV_TEAMDENY, 2, SV_SERVERMODE, 2, diff --git a/source/src/protocol.h b/source/src/protocol.h index fc357293..28358049 100644 --- a/source/src/protocol.h +++ b/source/src/protocol.h @@ -5,7 +5,7 @@ #define CUBE_SERVINFO_PORT_LAN 28762 #define CUBE_SERVINFO_PORT(serverport) (serverport+1) #define CUBE_SERVINFO_TO_SERV_PORT(servinfoport) (servinfoport-1) -#define PROTOCOL_VERSION 1130 // bump when protocol changes (use negative numbers for mods!) +#define PROTOCOL_VERSION 1131 // bump when protocol changes (use negative numbers for mods!) #define DEMO_VERSION 2 // bump when demo format changes #define DEMO_MAGIC "ASSAULTCUBE_DEMO" #define DEMO_MINTIME 10000 // don't keep demo recordings with less than 10 seconds @@ -20,7 +20,7 @@ enum { SV_SERVINFO = 0, SV_WELCOME, SV_INITCLIENT, SV_POS, SV_POSC, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME, SV_SOUND, SV_VOICECOM, SV_VOICECOMTEAM, SV_CDIS, - SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_AUTHT, /*SV_AUTHREQ, SV_AUTHTRY, SV_AUTHANS, SV_AUTHCHAL,*/ + SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_AUTHT, SV_AUTHREQ, SV_AUTHTRY, SV_AUTHANS, SV_AUTHCHAL, SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_THROWNADE, SV_TRYSPAWN, SV_SPAWNSTATE, SV_SPAWN, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME, SV_DISCSCORES, SV_TIMEUP, SV_EDITENT, SV_ITEMACC, @@ -30,7 +30,7 @@ enum SV_SENDMAP, SV_RECVMAP, SV_REMOVEMAP, SV_SERVMSG, SV_ITEMLIST, SV_WEAPCHANGE, SV_PRIMARYWEAP, SV_FLAGACTION, SV_FLAGINFO, SV_FLAGMSG, SV_FLAGCNT, - SV_ARENAWIN, SV_LMSITEM, + SV_ARENAWIN, SV_SETADMIN, SV_SERVOPINFO, SV_CALLVOTE, SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTE, SV_VOTERESULT, SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, @@ -58,7 +58,6 @@ enum { MM_OPEN = 0, MM_PRIVATE, MM_MATCH, MM_NUM }; enum { MM_MASK = 0x03 }; enum { AT_DISABLED = 0, AT_ENABLED = 1, AT_SHUFFLE = 2, AT_NUM }; enum { FA_PICKUP = 0, FA_STEAL, FA_DROP, FA_LOST, FA_RETURN, FA_SCORE, FA_NUM, FA_RESET }; enum { FM_PICKUP = 0, FM_DROP, FM_LOST, FM_RETURN, FM_SCORE, FM_KTFSCORE, FM_SCOREFAIL, FM_RESET, FM_NUM }; -enum { LMSITEM_CLEAR = 0, LMSITEM_ANNOUNCE, LMSITEM_SPAWN, LMSITEM_NUM }; enum { FTR_INFO = 0, FTR_PLAYERWISH, FTR_AUTOTEAM, FTR_SILENTFORCE, FTR_NUM }; // forceteam-reasons enum { SP_OK = 0, SP_REFILLMATCH, SP_OK_NUM, SP_WRONGMAP, SP_SPECT, SP_NUM }; // spawn permission (role==CR_ADMIN || (!isdedicated && clients[owner]->type==ST_LOCAL); int total = stats[VOTE_NO]+stats[VOTE_YES]+stats[VOTE_NEUTRAL]; const float requiredcount = 0.51f; - if( ( servmillis - callmillis > 10*1000 && stats[VOTE_YES] - stats[VOTE_NO] > 0.34f*total && totalclients > 4 ) || - stats[VOTE_YES] > requiredcount*total || admin || adminvote == VOTE_YES ) - end(VOTE_YES); - else if(forceend || !valid_client(owner) || (boot && !valid_client(boot)) || - stats[VOTE_NO] >= stats[VOTE_YES]+stats[VOTE_NEUTRAL] || adminvote == VOTE_NO) - end(VOTE_NO); + bool min_time = servmillis - callmillis > 10*1000; +#define yes_condition ((min_time && stats[VOTE_YES] - stats[VOTE_NO] > 0.34f*total && totalclients > 4) || stats[VOTE_YES] > requiredcount*total) +#define no_condition (forceend || !valid_client(owner) || stats[VOTE_NO] >= stats[VOTE_YES]+stats[VOTE_NEUTRAL] || adminvote == VOTE_NO) +#define boot_condition (!boot || (boot && valid_client(num) && clients[num]->peer->address.host == host)) + if( (yes_condition || admin || adminvote == VOTE_YES) && boot_condition ) end(VOTE_YES); + else if( no_condition || (min_time && !boot_condition)) end(VOTE_NO); else return; +#undef boot_condition +#undef no_condition +#undef yes_condition } }; @@ -2018,13 +2022,14 @@ bool scallvote(voteinfo *v, ENetPacket *msg) // true if a regular vote was calle int area = isdedicated ? EE_DED_SERV : EE_LOCAL_SERV; int error = -1; client *c = clients[v->owner], *b = ( v->boot ? clients[cn2boot] : NULL ); + v->host = v->boot ? b->peer->address.host : 0; int time = servmillis - c->lastvotecall; if ( c->nvotes > 0 && time > 4*60*1000 ) c->nvotes -= time/(4*60*1000); if ( c->nvotes < 0 || c->role == CR_ADMIN ) c->nvotes = 0; c->nvotes++; - if( !v || !v->isvalid() || (v->boot && !b) ) error = VOTEE_INVALID; + if( !v || !v->isvalid() || (v->boot && (!b || cn2boot == v->owner) ) ) error = VOTEE_INVALID; else if( v->action->role > c->role ) error = VOTEE_PERMISSION; else if( !(area & v->action->area) ) error = VOTEE_AREA; else if( curvote && curvote->result==VOTE_NEUTRAL ) error = VOTEE_CUR; @@ -2182,7 +2187,7 @@ void disconnect_client(int n, int reason) } // for AUTH: WIP -/* + client *findauth(uint id) { loopv(clients) if(clients[i]->authreq == id) return clients[i]; @@ -2240,7 +2245,7 @@ void answerchallenge(client *cl, uint id, char *val) sendf(cl->clientnum, 1, "ris", SV_SERVMSG, "not connected to authentication server"); } } -*/ + // :for AUTH void sendwhois(int sender, int cn) @@ -2416,11 +2421,11 @@ int checktype(int type, client *cl) if(type < 0 || type >= SV_NUM) return -1; // server only messages static int servtypes[] = { SV_SERVINFO, SV_WELCOME, SV_INITCLIENT, SV_POSN, SV_CDIS, SV_GIBDIED, SV_DIED, - SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, + SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_AUTHREQ, SV_AUTHCHAL, SV_SPAWNSTATE, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME, SV_DISCSCORES, SV_TIMEUP, SV_ITEMACC, SV_MAPCHANGE, SV_ITEMSPAWN, SV_PONG, SV_SERVMSG, SV_ITEMLIST, SV_FLAGINFO, SV_FLAGMSG, SV_FLAGCNT, - SV_ARENAWIN, SV_LMSITEM, SV_SERVOPINFO, + SV_ARENAWIN, SV_SERVOPINFO, SV_CALLVOTESUC, SV_CALLVOTEERR, SV_VOTERESULT, SV_SETTEAM, SV_TEAMDENY, SV_SERVERMODE, SV_WHOISINFO, SV_SENDDEMOLIST, SV_SENDDEMO, SV_DEMOPLAYBACK, @@ -2915,7 +2920,7 @@ void process(ENetPacket *packet, int sender, int chan) } // for AUTH: - /* + case SV_AUTHTRY: { string desc, name; @@ -2934,13 +2939,13 @@ void process(ENetPacket *packet, int sender, int chan) if(!desc[0]) answerchallenge(cl, id, ans); break; } - */ + case SV_AUTHT: { /* int n = getint(p); loopi(n) getint(p);*/ - if (cl) disconnect_client(cl->clientnum, DISC_TAGT); // remove this in the future, when auth is complete +// if (cl) disconnect_client(cl->clientnum, DISC_TAGT); // remove this in the future, when auth is complete break; } // :for AUTH @@ -3844,12 +3849,12 @@ void localconnect() void processmasterinput(const char *cmd, int cmdlen, const char *args) { // AUTH WiP -// uint id; + uint id; string val; -/* if(sscanf(cmd, "failauth %u", &id) == 1) authfailed(id); + if(sscanf(cmd, "failauth %u", &id) == 1) authfailed(id); else if(sscanf(cmd, "succauth %u", &id) == 1) authsucceeded(id); else if(sscanf(cmd, "chalauth %u %s", &id, val) == 2) authchallenged(id, val); - else*/ if(!strncmp(cmd, "cleargbans", cmdlen)) cleargbans(); + else if(!strncmp(cmd, "cleargbans", cmdlen)) cleargbans(); else if(sscanf(cmd, "addgban %s", val) == 1) addgban(val); } diff --git a/source/src/server.h b/source/src/server.h index 642e3750..44e504e2 100644 --- a/source/src/server.h +++ b/source/src/server.h @@ -407,7 +407,7 @@ const char *messagenames[SV_NUM] = { "SV_SERVINFO", "SV_WELCOME", "SV_INITCLIENT", "SV_POS", "SV_POSC", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME", "SV_SOUND", "SV_VOICECOM", "SV_VOICECOMTEAM", "SV_CDIS", - "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_AUTHT", /*"SV_AUTHREQ", "SV_AUTHTRY", "SV_AUTHANS", "SV_AUTHCHAL",*/ + "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_AUTHT", "SV_AUTHREQ", "SV_AUTHTRY", "SV_AUTHANS", "SV_AUTHCHAL", "SV_GIBDIED", "SV_DIED", "SV_GIBDAMAGE", "SV_DAMAGE", "SV_HITPUSH", "SV_SHOTFX", "SV_THROWNADE", "SV_TRYSPAWN", "SV_SPAWNSTATE", "SV_SPAWN", "SV_SPAWNDENY", "SV_FORCEDEATH", "SV_RESUME", "SV_DISCSCORES", "SV_TIMEUP", "SV_EDITENT", "SV_ITEMACC", @@ -417,7 +417,7 @@ const char *messagenames[SV_NUM] = "SV_SENDMAP", "SV_RECVMAP", "SV_REMOVEMAP", "SV_SERVMSG", "SV_ITEMLIST", "SV_WEAPCHANGE", "SV_PRIMARYWEAP", "SV_FLAGACTION", "SV_FLAGINFO", "SV_FLAGMSG", "SV_FLAGCNT", - "SV_ARENAWIN", "SV_LMSITEM", + "SV_ARENAWIN", "SV_SETADMIN", "SV_SERVOPINFO", "SV_CALLVOTE", "SV_CALLVOTESUC", "SV_CALLVOTEERR", "SV_VOTE", "SV_VOTERESULT", "SV_SETTEAM", "SV_TEAMDENY", "SV_SERVERMODE",