match & flag state fixes

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@4609 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
ac_stef
2009-08-08 19:38:45 +00:00
parent 71e190c98c
commit ea6d5b3263
2 changed files with 28 additions and 14 deletions
+5 -1
View File
@@ -187,7 +187,11 @@ void renderscores(void *menu, bool init)
if(multiplayer(false))
{
serverinfo *s = getconnectedserverinfo();
if(s) s_sprintf(serverline)("%s:%d %s", s->name, s->port, s->sdesc);
if(s)
{
if(servstate.mastermode > MM_OPEN) s_strcatf(serverline, servstate.mastermode == MM_MATCH ? "M%d " : "P ", servstate.matchteamsize);
s_strcatf(serverline, "%s:%d %s", s->name, s->port, s->sdesc);
}
}
if(m_teammode)
+23 -13
View File
@@ -233,8 +233,11 @@ int sendservermode(bool send = true)
void changematchteamsize(int newteamsize)
{
if(newteamsize < 0) return;
if(matchteamsize != newteamsize) sendservermode();
matchteamsize = newteamsize;
if(matchteamsize != newteamsize)
{
matchteamsize = newteamsize;
sendservermode();
}
if(mastermode == MM_MATCH && matchteamsize && m_teammode)
{
int size[2] = { 0 };
@@ -764,7 +767,8 @@ void flagaction(int flag, int action, int actor)
if(!valid_flag(flag)) return;
sflaginfo &f = sflaginfos[flag];
sflaginfo &of = sflaginfos[team_opposite(flag)];
bool deadactor = valid_client(actor) ? clients[actor]->state.state != CS_ALIVE : true;
bool deadactor = valid_client(actor) ? clients[actor]->state.state != CS_ALIVE || team_isspect(clients[actor]->team): true;
int abort = 0;
int score = 0;
int message = -1;
@@ -775,11 +779,11 @@ void flagaction(int flag, int action, int actor)
case FA_PICKUP: // ctf: f = enemy team htf: f = own team
case FA_STEAL:
{
if(deadactor || f.state != (action == FA_STEAL ? CTFF_INBASE : CTFF_DROPPED)) return;
if(deadactor || f.state != (action == FA_STEAL ? CTFF_INBASE : CTFF_DROPPED)) { abort = 10; break; }
flagdistance(f, actor);
int team = team_base(clients[actor]->team);
if(m_ctf) team = team_opposite(team);
if(team != flag) return;
if(team != flag) { abort = 11; break; }
f.state = CTFF_STOLEN;
f.actor_cn = actor;
message = FM_PICKUP;
@@ -788,27 +792,27 @@ void flagaction(int flag, int action, int actor)
case FA_LOST:
if(actor == -1) actor = f.actor_cn;
case FA_DROP:
if(f.state!=CTFF_STOLEN || f.actor_cn != actor) return;
if(f.state!=CTFF_STOLEN || f.actor_cn != actor) { abort = 12; break; }
f.state = CTFF_DROPPED;
loopi(3) f.pos[i] = clients[actor]->state.o[i];
message = action == FA_LOST ? FM_LOST : FM_DROP;
break;
case FA_RETURN:
if(f.state!=CTFF_DROPPED || m_htf) return;
if(f.state!=CTFF_DROPPED || m_htf) { abort = 13; break; }
f.state = CTFF_INBASE;
message = FM_RETURN;
break;
case FA_SCORE: // ctf: f = carried by actor flag, htf: f = hunted flag (run over by actor)
if(m_ctf)
{
if(f.state != CTFF_STOLEN || f.actor_cn != actor || of.state != CTFF_INBASE) return;
if(f.state != CTFF_STOLEN || f.actor_cn != actor || of.state != CTFF_INBASE) { abort = 14; break; }
flagdistance(of, actor);
score = 1;
message = FM_SCORE;
}
else // m_htf
{
if(f.state != CTFF_DROPPED) return;
if(f.state != CTFF_DROPPED) { abort = 15; break; }
flagdistance(f, actor);
score = (of.state == CTFF_STOLEN) ? 1 : 0;
message = score ? FM_SCORE : FM_SCOREFAIL;
@@ -828,7 +832,7 @@ void flagaction(int flag, int action, int actor)
switch(action)
{
case FA_STEAL:
if(deadactor || f.state != CTFF_INBASE) return;
if(deadactor || f.state != CTFF_INBASE) { abort = 20; break; }
flagdistance(f, actor);
f.state = CTFF_STOLEN;
f.actor_cn = actor;
@@ -836,8 +840,8 @@ void flagaction(int flag, int action, int actor)
message = FM_PICKUP;
break;
case FA_SCORE: // f = carried by actor flag
if(actor != -1 || f.state != CTFF_STOLEN) return; // no client msg allowed here
if(valid_client(f.actor_cn) && clients[f.actor_cn]->state.state == CS_ALIVE)
if(actor != -1 || f.state != CTFF_STOLEN) { abort = 21; break; } // no client msg allowed here
if(valid_client(f.actor_cn) && clients[f.actor_cn]->state.state == CS_ALIVE && !team_isspect(clients[f.actor_cn]->team))
{
actor = f.actor_cn;
score = 1;
@@ -847,7 +851,7 @@ void flagaction(int flag, int action, int actor)
case FA_LOST:
if(actor == -1) actor = f.actor_cn;
case FA_DROP:
if(f.actor_cn != actor || f.state != CTFF_STOLEN) return;
if(f.actor_cn != actor || f.state != CTFF_STOLEN) { abort = 22; break; }
case FA_RESET:
if(f.state == CTFF_STOLEN)
{
@@ -860,6 +864,12 @@ void flagaction(int flag, int action, int actor)
break;
}
}
if(abort)
{
logline(ACLOG_DEBUG,"aborting flagaction(flag %d, action %d, actor %d), reason %d, resending flag states", flag, action, actor, abort); // FIXME: remove this logline after some time - it will only show a few bad ping effects
sendflaginfo();
return;
}
if(score)
{
clients[actor]->state.flagscore += score;