Advertisement
lucasgautheron

regenupdate

Jun 28th, 2013
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. void regenupdate()
  2. {
  3.     loopv(clients) clients[i]->state.inbase = false;
  4.     loopi(MAXBASES) if(sbaseinfos[i].valid)
  5.     {
  6.         sbaseinfo &b = sbaseinfos[i];
  7.  
  8.         // calculate the amount of players in this base
  9.         vector<int> playersinbase[2];
  10.         loopvj(clients) if(clients[j]->type == ST_TCPIP && clients[j]->isauthed
  11.             && clients[j]->state.state == CS_ALIVE && team_isactive(clients[j]->team)
  12.             && !clients[j]->state.inbase)
  13.         {
  14.             client *cl = clients[j];
  15.             clientstate &cs = cl->state;
  16.             float sqrdist = ((cs.o.x - b.x) * (cs.o.x - b.x) + (cs.o.y - b.y) * (cs.o.y - b.y));
  17.             cs.basesdist[i] = (int)fSqrt(sqrdist); // do some little caching
  18.             bool inbase = sqrdist <= (b.radius * b.radius);
  19.             if(inbase)
  20.             {
  21.                 cs.inbase = true;
  22.                 playersinbase[cl->team].add(cl->clientnum);
  23.                 if(cs.curbase != &b)
  24.                 {
  25.                     cs.lastbaseaction = gamemillis;
  26.                     cs.curbase = &b;
  27.                 }
  28.             }
  29.         }
  30.  
  31.         int dp = playersinbase[0].length() - playersinbase[1].length();
  32.         int powerdt = max(700 - 175 * (abs(dp)-1), 200); // interval between 2 power updates
  33.         int dominant = dp == 0 ? -1 : (dp > 0 ? 0 : 1);
  34.         // if the dominant team changed, we reset lastaction
  35.         if(dominant != b.dominant) b.lastaction = gamemillis;
  36.        
  37.         // capture management
  38.         if(dp && b.power[dominant] < 100 && gamemillis - b.lastaction > powerdt) // if a team has been dominating long enough...
  39.         {
  40.             // update lastaction and power
  41.             b.lastaction = gamemillis;
  42.             b.power[dominant] += 5;
  43.             b.power[team_opposite(dominant)] -= 5;
  44.             loopvj(playersinbase[dominant])
  45.             {
  46.                 clients[j]->state.basespts[i] += RGCAPTPT;
  47.                 addpt(clients[j], RGCAPTPT);
  48.             }
  49.  
  50.             if(b.power[dominant] > 50)
  51.             {
  52.                 if(dominant != b.curowner && b.state != BASE_CAPTURING)
  53.                 {
  54.                     if(b.curowner != -1)
  55.                     {
  56.                         logline(ACLOG_INFO, "team %s lost base %d", team_basestring(b.curowner), i);
  57.                         // reset player contribution when their team lost the base
  58.                         loopvj(clients) if(clients[j]->type == ST_TCPIP && clients[j]->isauthed && clients[j]->team == b.curowner)
  59.                             clients[j]->state.basespts[i] = 0;
  60.                     }
  61.                     logline(ACLOG_INFO, "team %s is capturing base %d", team_basestring(dominant), i);
  62.                     sendf(-1, 1, "riiii", SV_BASECAPTURING, i, b.curowner, dominant);
  63.  
  64.                     b.curowner = -1;
  65.                     b.state = BASE_CAPTURING;
  66.                 }
  67.                 if(b.power[dominant] >= 100) // base captured
  68.                 {
  69.                     b.power[dominant] = 100;
  70.                     b.state = BASE_CAPTURED;
  71.                     b.lastscore = gamemillis;
  72.  
  73.                     if(b.curowner != dominant)
  74.                     {
  75.                         logline(ACLOG_INFO, "team %s captured base %d", team_basestring(dominant), i);
  76.                         sendf(-1, 1, "riii", SV_BASECAPTURED, i, dominant);
  77.                     }
  78.                     b.curowner = dominant;
  79.                 }
  80.             }
  81.  
  82.             if(b.power[team_opposite(dominant)] < 0) b.power[team_opposite(dominant)] = 0;
  83.             sendf(-1, 1, "riiii", SV_BASESTATE, i, b.power[0], b.power[1]);
  84.         }
  85.         b.dominant = dominant;
  86.         b.players[0] = playersinbase[0].length();
  87.         b.players[1] = playersinbase[1].length();
  88.  
  89.         if(b.state == BASE_CAPTURED)
  90.         {
  91.             // score every 15 seconds
  92.             if(gamemillis - b.lastscore > 15000)
  93.             {
  94.                 // in AC team scores are just sums of individual scores
  95.                 // so we have to find who should be given the flag when a base scores
  96.                 // it should be the player who contributed the most to the current base
  97.                 vector<int> clientnums;
  98.                 int maxpoints = 0;
  99.                 loopvj(clients) if(clients[j]->type == ST_TCPIP && clients[j]->isauthed
  100.                     && clients[j]->team == b.curowner)
  101.                 {
  102.                     int points =  clients[j]->state.basespts[i];
  103.                     if(!clientnums.length() || points > maxpoints)
  104.                     {
  105.                         clientnums.shrink(0);
  106.                         maxpoints = points;
  107.                         clientnums.add(clients[j]->clientnum);
  108.                     }
  109.                     else if(points == maxpoints) clientnums.add(j);
  110.                 }
  111.                 if(clientnums.length())
  112.                 {
  113.                     int cn = clientnums[rnd(clientnums.length())];
  114.                     int cnumber = totalclients < 13 ? totalclients : 12;
  115.                     clientstate &cs = clients[cn]->state;
  116.                     cs.flagscore++;
  117.                     addpt(clients[cn], RGSCOREPT);
  118.                     logline(ACLOG_INFO, "team %s scored (%d)", team_basestring(b.curowner), cs.flagscore);
  119.                     sendf(-1, 1, "riii", SV_FLAGCNT, cn, cs.flagscore);
  120.                 }
  121.                 b.lastscore = gamemillis;
  122.             }
  123.  
  124.             // regen
  125.             if(!b.players[team_opposite(b.curowner)])
  126.             loopvj(playersinbase[b.curowner])
  127.             {
  128.                 clientstate &cs = clients[j]->state;
  129.                 if(gamemillis - cs.lastbaseaction > 2000
  130.                     && (cs.health < 100 || cs.armour < 100))
  131.                 {
  132.                     cs.health = min(cs.health + 10, powerupstats[0].max);
  133.                     cs.armour = min(cs.armour + 10, powerupstats[I_ARMOUR-I_HEALTH].max);
  134.                     cs.lastbaseaction = gamemillis;
  135.                     sendf(-1, 1, "riiii", SV_BASEFEED, j, cs.health, cs.armour);
  136.                 }
  137.             }
  138.         }
  139.     }
  140.     loopv(clients) if(!clients[i]->state.inbase) clients[i]->state.curbase = NULL;
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement