Advertisement
lucasgautheron

server side pickups

Aug 16th, 2011
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 9.93 KB | None | 0 0
  1. Index: entities.cpp
  2. ===================================================================
  3. --- entities.cpp    (revision 6581)
  4. +++ entities.cpp    (working copy)
  5. @@ -317,8 +317,7 @@
  6.          default:
  7.              if( d->canpickup(e.type) && lastmillis > e.lastmillis + 250 && lastmillis > lastspawn + 500 )
  8.              {
  9. -                if(d->type==ENT_PLAYER) addmsg(SV_ITEMPICKUP, "ri", n);
  10. -                else if(d->type==ENT_BOT && serverpickup(n, -1)) pickupeffects(n, d);
  11. +                if(d->type==ENT_BOT && serverpickup(n, -1)) pickupeffects(n, d);
  12.                  e.lastmillis = lastmillis;
  13.              }
  14.              break;
  15. Index: server.cpp
  16. ===================================================================
  17. --- server.cpp  (revision 6581)
  18. +++ server.cpp  (working copy)
  19. @@ -1379,37 +1379,13 @@
  20.      return sec*1000;
  21.  }
  22.  
  23. -bool serverpickup(int i, int sender)         // server side item pickup, acknowledge first client that gets it
  24. +bool serverpickup(int i, int sender)
  25.  {
  26. -    const char *hn = sender >= 0 && clients[sender]->type == ST_TCPIP ? clients[sender]->hostname : NULL;
  27. -    if(!sents.inrange(i))
  28. -    {
  29. -        if(hn) logline(ACLOG_INFO, "[%s] tried to pick up entity #%d - doesn't exist on this map", hn, i);
  30. -        return false;
  31. -    }
  32.      server_entity &e = sents[i];
  33. -    if(!e.spawned)
  34. -    {
  35. -        if(!e.legalpickup && hn && !m_demo) logline(ACLOG_INFO, "[%s] tried to pick up entity #%d (%s) - can't be picked up in this gamemode or at all", hn, i, entnames[e.type]);
  36. -        return false;
  37. -    }
  38.      if(sender>=0)
  39.      {
  40.          client *cl = clients[sender];
  41. -        if(cl->type==ST_TCPIP)
  42. -        {
  43. -            if( cl->state.state!=CS_ALIVE || !cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
  44. -            vec v(e.x, e.y, cl->state.o.z);
  45. -            float dist = cl->state.o.dist(v);
  46. -            int pdist = check_pdist(cl,dist);
  47. -            if (pdist)
  48. -            {
  49. -                cl->farpickups++;
  50. -                if (!m_demo) logline(ACLOG_INFO, "[%s] %s %s up entity #%d (%s), distance %.2f (%d)",
  51. -                     cl->hostname, cl->name, (pdist==2?"tried to pick":"picked"), i, entnames[e.type], dist, cl->farpickups);
  52. -                if (pdist==2) return false;
  53. -            }
  54. -        }
  55. +        if(!cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
  56.          sendf(-1, 1, "ri3", SV_ITEMACC, i, sender);
  57.          cl->state.pickup(sents[i].type);
  58.          if (m_lss && sents[i].type == I_GRENADE) cl->state.pickup(sents[i].type); // get two nades at lss
  59. @@ -1946,7 +1922,7 @@
  60.              {
  61.                  e.type = smapstats.enttypes[i];
  62.                  e.transformtype(smode);
  63. -                server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1]};
  64. +                server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1], smapstats.entposs[i * 3 + 2] };
  65.                  sents.add(se);
  66.                  if(e.fitsmode(smode)) sents[i].spawned = sents[i].legalpickup = true;
  67.              }
  68. @@ -2879,15 +2855,10 @@
  69.                  break;
  70.              }
  71.  
  72. +            // temporarily kept for compatibility
  73.              case SV_ITEMPICKUP:
  74.              {
  75.                  int n = getint(p);
  76. -                if(!arenaround || arenaround - gamemillis > 2000)
  77. -                {
  78. -                    gameevent &pickup = cl->addevent();
  79. -                    pickup.type = GE_PICKUP;
  80. -                    pickup.pickup.ent = n;
  81. -                }
  82.                  break;
  83.              }
  84.  
  85. @@ -3732,6 +3703,7 @@
  86.  
  87.      if(minremain>0)
  88.      {
  89. +        checkitempickups();
  90.          processevents();
  91.          checkitemspawns(diff);
  92.          bool ktfflagingame = false;
  93. Index: server.h
  94. ===================================================================
  95. --- server.h    (revision 6581)
  96. +++ server.h    (working copy)
  97. @@ -379,7 +379,7 @@
  98.      int type;
  99.      bool spawned, legalpickup, twice;
  100.      int spawntime;
  101. -    short x, y;
  102. +    short x, y, elevation;
  103.  };
  104.  
  105.  struct demofile
  106. Index: serverchecks.h
  107. ===================================================================
  108. --- serverchecks.h  (revision 6581)
  109. +++ serverchecks.h  (working copy)
  110. @@ -1,3 +1,5 @@
  111. +extern ssqr *serverworld;
  112. +
  113.  inline bool is_lagging(client *cl)
  114.  {
  115.      return ( cl->spj > 50 || cl->ping > 500 || cl->ldt > 80 ); // do not change this except if you really know what are you doing
  116. @@ -21,6 +23,26 @@
  117.      }
  118.  }
  119.  
  120. +void checkitempickups()
  121. +{
  122. +    if(m_noitems) return;
  123. +    loopv(clients) if(clients[i] && clients[i]->type != ST_EMPTY && clients[i]->state.state == CS_ALIVE)
  124. +    {
  125. +        client *cl = clients[i];
  126. +        loopv(sents) if(sents[i].spawned)
  127. +        {
  128. +            server_entity *si = &sents[i];
  129. +            vec pos(si->x, si->y, (float)SS(si->x, si->y)->floor + (float)si->elevation);
  130. +            if(cl->state.o.dist(pos) < 2.5f)
  131. +            {
  132. +                gameevent &pickup = cl->addevent();
  133. +                pickup.type = GE_PICKUP;
  134. +                pickup.pickup.ent = i;
  135. +            }
  136. +        }
  137. +    }
  138. +}
  139. +
  140.  #define POW2XY(A,B) (pow2(A.x-B.x)+pow2(A.y-B.y))
  141.  
  142.  #ifdef ACAC
  143. Index: tools.cpp
  144. ===================================================================
  145. --- tools.cpp   (revision 6581)
  146. +++ tools.cpp   (working copy)
  147. @@ -31,6 +31,31 @@
  148.  extern float Mheight;
  149.  extern int checkarea(int, char *);
  150.  
  151. +ssqr *ssqrdefault(ssqr *s)
  152. +{
  153. +    if(!s) return s;
  154. +    s->type = SOLID;
  155. +    s->floor = 0;
  156. +    s->ceil = 16;
  157. +    return s;
  158. +}
  159. +
  160. +ssqr *serverworld;
  161. +
  162. +void init_world(int factor)
  163. +{
  164. +    DELETEA(serverworld);
  165. +    int ssize = 1 << factor;
  166. +    int size = 1 << (factor*2);
  167. +    serverworld = new ssqr[size];
  168. +    memset(serverworld, 0, size*sizeof(ssqr));
  169. +    loop(x,ssize) loop(y,ssize)
  170. +    {
  171. +        ssqrdefault(SWS(serverworld, x, y, factor));
  172. +    }
  173. +}
  174. +
  175. +
  176.  mapstats *loadmapstats(const char *filename, bool getlayout)
  177.  {
  178.      static mapstats s;
  179. @@ -71,7 +96,7 @@
  180.          if(e.type == CTF_FLAG && (e.attr2 == 0 || e.attr2 == 1)) { s.flags[e.attr2]++; s.flagents[e.attr2] = i; }
  181.          s.entcnt[e.type]++;
  182.          enttypes[i] = e.type;
  183. -        entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.z + e.attr1;
  184. +        entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.attr1/* + e.z*/;
  185.      }
  186.      DELETEA(testlayout);
  187.      int minfloor = 0;
  188. @@ -83,13 +108,15 @@
  189.          bool fail = false;
  190.          testlayout = new char[layoutsize + 256];
  191.          memset(testlayout, 0, layoutsize * sizeof(char));
  192. -        char *t = NULL;
  193. +        ssqr *t = NULL;
  194.          char floor = 0, ceil;
  195.          int diff = 0;
  196.          Mvolume = Marea = SHhits = 0;
  197. +        init_world(s.hdr.sfactor);
  198.          loopk(layoutsize)
  199.          {
  200.              char *c = testlayout + k;
  201. +            ssqr *ss = &serverworld[k];
  202.              int type = f->getchar();
  203.              int n = 1;
  204.              switch(type)
  205. @@ -97,20 +124,23 @@
  206.                  case 255:
  207.                  {
  208.                      if(!t || (n = f->getchar()) < 0) { fail = true; break; }
  209. -                    memset(c, *t, n);
  210. -                    k += n - 1;
  211. +                    char tmp = *(c-1);
  212. +                    memset(c, tmp, n);
  213. +                    for(int i = 0; i<n; i++, k++) memcpy(&serverworld[k], t, sizeof(ssqr));
  214. +                    k--;
  215.                      break;
  216.                  }
  217.                  case 254: // only in MAPVERSION<=2
  218.                      if(!t) { fail = true; break; }
  219. -                    *c = *t;
  220. +                    *c = *(c-1);
  221.                      f->getchar(); f->getchar();
  222.                      break;
  223.                  default:
  224.                      if(type<0 || type>=MAXTYPE)  { fail = true; break; }
  225. -                    floor = f->getchar();
  226. -                    ceil = f->getchar();
  227. -                    if(floor >= ceil && ceil > -128) floor = ceil - 1;  // for pre 12_13
  228. +                    ss->type = type;
  229. +                    ss->floor = floor = f->getchar();
  230. +                    ss->ceil = ceil = f->getchar();
  231. +                    if(floor >= ceil && ceil > -128) ss->floor = floor = ceil - 1;  // for pre 12_13
  232.                      diff = ceil - floor;
  233.                      if(type == FHF) floor = -128;
  234.                      if(floor!=-128 && floor<minfloor) minfloor = floor;
  235. @@ -118,8 +148,10 @@
  236.                      f->getchar(); f->getchar();
  237.                      if(s.hdr.version>=2) f->getchar();
  238.                      if(s.hdr.version>=5) f->getchar();
  239. -
  240. +                    *c = ss->floor;
  241.                  case SOLID:
  242. +                    *c = 127;
  243. +                    ss->type = SOLID;
  244.                      *c = type == SOLID ? 127 : floor;
  245.                      f->getchar(); f->getchar();
  246.                      if(s.hdr.version<=2) { f->getchar(); f->getchar(); }
  247. @@ -132,7 +164,7 @@
  248.                  Mvolume += diff * n;
  249.              }
  250.              if(fail) break;
  251. -            t = c;
  252. +            t = ss;
  253.          }
  254.          if(fail) { DELETEA(testlayout); }
  255.          else
  256. Index: world.h
  257. ===================================================================
  258. --- world.h (revision 6581)
  259. +++ world.h (working copy)
  260. @@ -23,6 +23,13 @@
  261.      uchar reserved[2];
  262.  };
  263.  
  264. +// simplified square
  265. +struct ssqr
  266. +{
  267. +    uchar type;
  268. +    char floor, ceil;
  269. +};
  270. +
  271.  enum                            // hardcoded texture numbers
  272.  {
  273.      DEFAULT_SKY = 0,
  274. @@ -117,6 +124,10 @@
  275.  #define SWS(w,x,y,s) (&(w)[((y)<<(s))+(x)])
  276.  #define SW(w,x,y) SWS(w,x,y,sfactor)
  277.  #define S(x,y) SW(world,x,y)            // convenient lookup of a lowest mip cube
  278. +
  279. +#define SSW(w,x,y) SWS(w,x,y,smapstats.hdr.sfactor)
  280. +#define SS(x,y) SSW(serverworld,x,y)
  281. +
  282.  #define SMALLEST_FACTOR 6               // determines number of mips there can be
  283.  #define DEFAULT_FACTOR 8
  284.  #define LARGEST_FACTOR 11               // 10 is already insane
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement