Advertisement
lucasgautheron

serverside pick up (less... dirty)

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