Advertisement
lucasgautheron

Untitled

Jun 23rd, 2013
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.32 KB | None | 0 0
  1. void regenupdate()
  2. {
  3.     loopi(MAXBASES)
  4.     {
  5.         sbaseinfo &b = sbaseinfos[i];
  6.         if(b.radius == 0) continue;
  7.  
  8.         // calculate the amount of players in this base
  9.         int playersinbase[2] = { 0, 0 };
  10.         loopvj(clients) if(clients[j]->state.state == CS_ALIVE && team_isactive(clients[j]->team))
  11.         {
  12.             client *cl = clients[j];
  13.             clientstate &cs = cl->state;
  14.             bool inbase = ((cs.o.x - b.x) * (cs.o.x - b.x) + (cs.o.y - b.y) * (cs.o.y - b.y)) <= (b.radius * b.radius);
  15.             if(inbase)
  16.             {
  17.                 ++playersinbase[cl->team];
  18.             }
  19.             //if(playersinbase[cl->team] >= playersinbase[team_opposite(cl->team)]) b.commander = j;
  20.             if(inbase != cs.inbase) cs.lastbaseaction = gamemillis;
  21.             cs.inbase = inbase;
  22.             if(inbase) cs.curbase = &b;
  23.         }
  24.  
  25.         int dp = playersinbase[0] - playersinbase[1];
  26.         int powerdt = max(700 + 50 * (abs(dp)-1), 450); // interval between 2 power updates
  27.         int dominant = dp == 0 ? -1 : (dp > 0 ? 0 : 1);
  28.         // if the dominant team changed, we reset lastaction
  29.         if(dominant != b.dominant) b.lastaction = gamemillis;
  30.            
  31.         if(dp && b.power[dominant] < 100 && gamemillis - b.lastaction > powerdt) // if a team has been dominating for 500+ ms...
  32.         {
  33.             // update lastaction and power
  34.             b.lastaction = gamemillis;
  35.             b.power[dominant] += 5;
  36.             b.power[team_opposite(dominant)] -= 5;
  37.  
  38.             if(b.power[dominant] > 50)
  39.             {
  40.                 if(dominant != b.curowner && b.state != BASE_CAPTURING)
  41.                 {
  42.                     if(b.curowner != -1) logline(ACLOG_INFO, "team %s lost base %d", teamnames[b.curowner], i);
  43.                     logline(ACLOG_INFO, "team %s is capturing base %d", teamnames[dominant], i);
  44.                     sendf(-1, 1, "riiii", SV_BASECAPTURING, i, b.curowner, dominant);
  45.  
  46.                     b.curowner = -1;
  47.                     b.state = BASE_CAPTURING;
  48.                 }
  49.                 if(b.power[dominant] >= 100)
  50.                 {
  51.                     b.power[dominant] = 100;
  52.                     b.curowner = dominant;
  53.                     b.state = BASE_CAPTURED;
  54.                     b.lastscore = gamemillis;
  55.  
  56.                     logline(ACLOG_INFO, "team %s captured base %d", teamnames[dominant], i);
  57.                     sendf(-1, 1, "riii", SV_BASECAPTURED, i, dominant);
  58.                 }
  59.             }
  60.  
  61.             if(b.power[team_opposite(dominant)] < 0) b.power[team_opposite(dominant)] = 0;
  62.             sendf(-1, 1, "riiii", SV_BASESTATE, i, b.power[0], b.power[1]);
  63.         }
  64.         b.dominant = dominant;
  65.         b.players[0] = playersinbase[0];
  66.         b.players[1] = playersinbase[1];
  67.  
  68.         if(b.state == BASE_CAPTURED)
  69.         {
  70.             // score every 15 seconds w/o any enemy in the base.
  71.             if(gamemillis - b.lastscore > 15000)
  72.             {
  73.                 vector<int> clientnums;
  74.                 loopvj(clients) if(clients[j]->type == ST_TCPIP && clients[j]->isauthed
  75.                     && clients[j]->team == b.curowner) clientnums.add(clients[j]->clientnum);
  76.                 if(clientnums.length())
  77.                 {
  78.                     int cn = clientnums[rnd(clientnums.length())];
  79.                     ++clients[cn]->state.flagscore;
  80.                     logline(ACLOG_INFO, "team %s scored", teamnames[b.curowner]);
  81.                     sendf(-1, 1, "riii", SV_FLAGCNT, cn, clients[cn]->state.flagscore);
  82.                 }
  83.                 b.lastscore = gamemillis;
  84.             }
  85.  
  86.             loopvj(clients) if(clients[j]->state.state == CS_ALIVE && clients[j]->state.inbase
  87.                 && clients[j]->state.curbase == &b && clients[j]->team == b.curowner)
  88.             {
  89.                 clientstate &cs = clients[j]->state;
  90.                 if(gamemillis - cs.lastbaseaction > 2500
  91.                     && (cs.health < 100 || cs.armour < 100))
  92.                 {
  93.                     cs.health = min(clients[j]->state.health + 10, 100);
  94.                     cs.armour = min(clients[j]->state.armour + 10, 100);
  95.                     cs.lastbaseaction = gamemillis;
  96.                     sendf(-1, 1, "riiii", SV_BASEFEED, j, cs.health, cs.armour);
  97.                 }
  98.             }
  99.         }
  100.     }
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement