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
This commit is contained in:
@@ -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<authkey *> 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
|
||||
|
||||
@@ -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;
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
+2
-2
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 (<OK_NUM && isspect: change to active team allowed)
|
||||
enum { HE_COMBO, HE_COMBO2, HE_COMBO3, HE_COMBO4, HE_COMBO5, HE_TEAMWORK, HE_FLAGDEFENDED, HE_FLAGCOVERED, HE_COVER, HE_NUM };
|
||||
|
||||
+23
-18
@@ -1925,8 +1925,9 @@ struct voteinfo
|
||||
char text[MAXTRANS];
|
||||
serveraction *action;
|
||||
bool gonext;
|
||||
enet_uint32 host;
|
||||
|
||||
voteinfo() : boot(0), owner(0), callmillis(0), result(VOTE_NEUTRAL), action(NULL), gonext(false) {}
|
||||
voteinfo() : boot(0), owner(0), callmillis(0), result(VOTE_NEUTRAL), action(NULL), gonext(false), host(0) {}
|
||||
~voteinfo() { delete action; }
|
||||
|
||||
void end(int result)
|
||||
@@ -1961,13 +1962,16 @@ struct voteinfo
|
||||
bool admin = clients[owner]->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);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user