Advertisement
lucasgautheron

pickups and /pm

Aug 17th, 2011
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 20.42 KB | None | 0 0
  1. Index: config/resetbinds.cfg
  2. ===================================================================
  3. --- config/resetbinds.cfg   (revision 6592)
  4. +++ config/resetbinds.cfg   (working copy)
  5. @@ -67,7 +67,7 @@
  6.  bind K [ if $old_editbinds [ corner ] [ if $editing [ if (countwalls 1) [ solid 0 ] [ corner ] ] ] ] // Toggle corner/non-solid
  7.  bind L [ if $editing [ showmenu Lighting ] ]
  8.  bind M [ if $editing [ domodifier 6 ] ]
  9. -bind N ""
  10. +bind N [ quickanswer ]
  11.  bind O "editheight 2 -1"
  12.  bind P "editheight 2 1"
  13.  bind Q [ if $editing [ domodifier 1 ] ]
  14. Index: config/scripts.cfg
  15. ===================================================================
  16. --- config/scripts.cfg  (revision 6592)
  17. +++ config/scripts.cfg  (working copy)
  18. @@ -231,6 +231,10 @@
  19.      ]
  20.    ]
  21.  ]
  22. +
  23. +// answer last PM
  24. +const quickanswer [ if (>= $lastpm 0) [ saycommand (concat "/pm" $lastpm ""); ] ]
  25. +
  26.  // For those players who use IRC too much...
  27.  const join [ connect $arg1 $arg2 $arg3 ]
  28.  const add2alias [
  29. Index: source/src/client.cpp
  30. ===================================================================
  31. --- source/src/client.cpp   (revision 6592)
  32. +++ source/src/client.cpp   (working copy)
  33. @@ -275,17 +275,62 @@
  34.  void hudecho(char *text)
  35.  {
  36.      const char *s = strtok(text, "\n");
  37. +    void (*outf)(const char *s, ...) = allowhudechos ? hudoutf : conoutf;
  38.      do
  39.      {
  40. -        if(allowhudechos)
  41. -            hudoutf("%s", s ? s : "");
  42. -        else
  43. -            conoutf("%s", s ? s : "");
  44. +        outf("%s", s ? s : "");
  45.          s = strtok(NULL, "\n");
  46.      }
  47.      while(s);
  48.  }
  49.  
  50. +void pm(char *text)
  51. +{
  52. +    if(!text || !text[0]) return;
  53. +    int cn = -1;
  54. +    char digit;
  55. +    while ((digit = *text++) != '\0')
  56. +    {
  57. +        if (digit < '0' || digit > '9') break;
  58. +        if(cn < 0) cn = 0;
  59. +        else cn *= 10;
  60. +        cn += digit - '0';
  61. +    }
  62. +    playerent *to = getclient(cn);
  63. +    if(!to)
  64. +    {
  65. +        conoutf("invalid client number specified");
  66. +        return;
  67. +    }
  68. +
  69. +    if(!isspace(digit)) { --text; }
  70. +
  71. +    // FIXME:
  72. +    /*if(!text || !text[0] || !isdigit(text[0])) return;
  73. +    int cn = -1;
  74. +    char *numend = strpbrk(text, " \t");
  75. +    if(!numend) return;
  76. +    string cnbuf;
  77. +    copystring(cnbuf, text, min(numend-text+1, MAXSTRLEN));
  78. +    cn = atoi(cnbuf);
  79. +    playerent *to = getclient(cn);
  80. +    if(!to)
  81. +    {
  82. +        conoutf("invalid client number specified");
  83. +        return;
  84. +    }
  85. +
  86. +    if(*numend) numend++;*/
  87. +    // :FIXME
  88. +
  89. +    filtertext(text, text);
  90. +    trimtrailingwhitespace(text);
  91. +
  92. +    addmsg(SV_TEXTPRIVATE, "ris", cn, text);
  93. +    conoutf("to %s:\f9 %s", colorname(to), highlight(text));
  94. +}
  95. +COMMAND(pm, ARG_CONC);
  96. +
  97.  COMMAND(echo, ARG_CONC);
  98.  COMMAND(hudecho, ARG_CONC);
  99.  COMMANDN(say, toserver, ARG_CONC);
  100. Index: source/src/clientgame.cpp
  101. ===================================================================
  102. --- source/src/clientgame.cpp   (revision 6592)
  103. +++ source/src/clientgame.cpp   (working copy)
  104. @@ -489,8 +489,10 @@
  105.      }
  106.  }
  107.  
  108. +VAR(lastpm, -1, -1, -1);
  109.  void zapplayer(playerent *&d)
  110.  {
  111. +    if(d && d->clientnum == lastpm) lastpm = -1;
  112.      DELETEP(d);
  113.  }
  114.  
  115. Index: source/src/clients2c.cpp
  116. ===================================================================
  117. --- source/src/clients2c.cpp    (revision 6592)
  118. +++ source/src/clients2c.cpp    (working copy)
  119. @@ -243,6 +243,7 @@
  120.  int Mv = 0, Ma = 0, F2F = 1000 * MINFF; // moved up:, MA = 0;
  121.  float Mh = 0;
  122.  extern int connected;
  123. +extern int lastpm;
  124.  extern bool noflags;
  125.  bool item_fail = false;
  126.  int map_quality = MAP_IS_EDITABLE;
  127. @@ -497,6 +498,22 @@
  128.                  else return;
  129.                  break;
  130.  
  131. +            case SV_TEXTPRIVATE:
  132. +            {
  133. +                int cn = getint(p);
  134. +                getstring(text, p);
  135. +                filtertext(text, text);
  136. +                playerent *d = getclient(cn);
  137. +                if(!d) break;
  138. +                if(d->ignored) clientlogf("ignored: pm %s %s", colorname(d), text);
  139. +                else
  140. +                {
  141. +                    conoutf("%s (PM):\f9 %s", colorname(d), highlight(text));
  142. +                    lastpm = d->clientnum;
  143. +                }
  144. +                break;
  145. +            }
  146. +
  147.              case SV_MAPCHANGE:
  148.              {
  149.                  extern int spawnpermission;
  150. Index: source/src/entities.cpp
  151. ===================================================================
  152. --- source/src/entities.cpp (revision 6592)
  153. +++ source/src/entities.cpp (working copy)
  154. @@ -315,10 +315,10 @@
  155.      switch(e.type)
  156.      {
  157.          default:
  158. -            if( d->canpickup(e.type) && lastmillis > e.lastmillis + 250 && lastmillis > lastspawn + 500 )
  159. +            if( d->canpickup(e.type) && lastmillis > e.lastmillis + 250 && lastmillis > lastspawn + 500
  160. +                && !multiplayer(false) && serverpickup(n, -1))
  161.              {
  162. -                if(d->type==ENT_PLAYER) addmsg(SV_ITEMPICKUP, "ri", n);
  163. -                else if(d->type==ENT_BOT && serverpickup(n, -1)) pickupeffects(n, d);
  164. +                pickupeffects(n, d);
  165.                  e.lastmillis = lastmillis;
  166.              }
  167.              break;
  168. @@ -384,7 +384,7 @@
  169.              if(dist1<1.5f && dist2<e.attr1) trypickup(i, d);
  170.              continue;
  171.          }
  172. -
  173. +        if(multiplayer(false)) continue;
  174.          if(!e.spawned) continue;
  175.          if(OUTBORD(e.x, e.y)) continue;
  176.  
  177. Index: source/src/protocol.cpp
  178. ===================================================================
  179. --- source/src/protocol.cpp (revision 6592)
  180. +++ source/src/protocol.cpp (working copy)
  181. @@ -319,13 +319,13 @@
  182.  
  183.  static const int msgsizes[] =               // size inclusive message token, 0 for variable or not-checked sizes
  184.  {
  185. -    SV_SERVINFO, 5, SV_WELCOME, 2, SV_INITCLIENT, 0, SV_POS, 0, SV_POSC, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 0,
  186. +    SV_SERVINFO, 5, SV_WELCOME, 2, SV_INITCLIENT, 0, SV_POS, 0, SV_POSC, 0, SV_POSN, 0, SV_TEXT, 0, SV_TEAMTEXT, 0, SV_TEXTME, 0, SV_TEAMTEXTME, 0, SV_TEXTPRIVATE, 0,
  187.      SV_SOUND, 2, SV_VOICECOM, 2, SV_VOICECOMTEAM, 2, SV_CDIS, 2,
  188.      SV_SHOOT, 0, SV_EXPLODE, 0, SV_SUICIDE, 1, SV_AKIMBO, 2, SV_RELOAD, 3, SV_AUTHT, 0, SV_AUTHREQ, 0, SV_AUTHTRY, 0, SV_AUTHANS, 0, SV_AUTHCHAL, 0,
  189.      SV_GIBDIED, 5, SV_DIED, 5, SV_GIBDAMAGE, 7, SV_DAMAGE, 7, SV_HITPUSH, 6, SV_SHOTFX, 6, SV_THROWNADE, 8,
  190.      SV_TRYSPAWN, 1, SV_SPAWNSTATE, 23, SV_SPAWN, 3, SV_SPAWNDENY, 2, SV_FORCEDEATH, 2, SV_RESUME, 0,
  191.      SV_DISCSCORES, 0, SV_TIMEUP, 3, SV_EDITENT, 10, SV_ITEMACC, 2,
  192. -    SV_MAPCHANGE, 0, SV_ITEMSPAWN, 2, SV_ITEMPICKUP, 2,
  193. +    SV_MAPCHANGE, 0, SV_ITEMSPAWN, 2,
  194.      SV_PING, 2, SV_PONG, 2, SV_CLIENTPING, 2, SV_GAMEMODE, 2,
  195.      SV_EDITMODE, 2, SV_EDITH, 7, SV_EDITT, 7, SV_EDITS, 6, SV_EDITD, 6, SV_EDITE, 6, SV_NEWMAP, 2,
  196.      SV_SENDMAP, 0, SV_RECVMAP, 1, SV_REMOVEMAP, 0,
  197. Index: source/src/protocol.h
  198. ===================================================================
  199. --- source/src/protocol.h   (revision 6592)
  200. +++ source/src/protocol.h   (working copy)
  201. @@ -18,13 +18,13 @@
  202.  // network messages codes, c2s, c2c, s2c
  203.  enum
  204.  {
  205. -    SV_SERVINFO = 0, SV_WELCOME, SV_INITCLIENT, SV_POS, SV_POSC, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME,
  206. +    SV_SERVINFO = 0, SV_WELCOME, SV_INITCLIENT, SV_POS, SV_POSC, SV_POSN, SV_TEXT, SV_TEAMTEXT, SV_TEXTME, SV_TEAMTEXTME, SV_TEXTPRIVATE,
  207.      SV_SOUND, SV_VOICECOM, SV_VOICECOMTEAM, SV_CDIS,
  208.      SV_SHOOT, SV_EXPLODE, SV_SUICIDE, SV_AKIMBO, SV_RELOAD, SV_AUTHT, SV_AUTHREQ, SV_AUTHTRY, SV_AUTHANS, SV_AUTHCHAL,
  209.      SV_GIBDIED, SV_DIED, SV_GIBDAMAGE, SV_DAMAGE, SV_HITPUSH, SV_SHOTFX, SV_THROWNADE,
  210.      SV_TRYSPAWN, SV_SPAWNSTATE, SV_SPAWN, SV_SPAWNDENY, SV_FORCEDEATH, SV_RESUME,
  211.      SV_DISCSCORES, SV_TIMEUP, SV_EDITENT, SV_ITEMACC,
  212. -    SV_MAPCHANGE, SV_ITEMSPAWN, SV_ITEMPICKUP,
  213. +    SV_MAPCHANGE, SV_ITEMSPAWN,
  214.      SV_PING, SV_PONG, SV_CLIENTPING, SV_GAMEMODE,
  215.      SV_EDITMODE, SV_EDITH, SV_EDITT, SV_EDITS, SV_EDITD, SV_EDITE, SV_NEWMAP,
  216.      SV_SENDMAP, SV_RECVMAP, SV_REMOVEMAP,
  217. Index: source/src/server.cpp
  218. ===================================================================
  219. --- source/src/server.cpp   (revision 6592)
  220. +++ source/src/server.cpp   (working copy)
  221. @@ -1379,37 +1379,13 @@
  222.      return sec*1000;
  223.  }
  224.  
  225. -bool serverpickup(int i, int sender)         // server side item pickup, acknowledge first client that gets it
  226. +bool serverpickup(int i, int sender)
  227.  {
  228. -    const char *hn = sender >= 0 && clients[sender]->type == ST_TCPIP ? clients[sender]->hostname : NULL;
  229. -    if(!sents.inrange(i))
  230. -    {
  231. -        if(hn) logline(ACLOG_INFO, "[%s] tried to pick up entity #%d - doesn't exist on this map", hn, i);
  232. -        return false;
  233. -    }
  234.      server_entity &e = sents[i];
  235. -    if(!e.spawned)
  236. -    {
  237. -        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]);
  238. -        return false;
  239. -    }
  240.      if(sender>=0)
  241.      {
  242.          client *cl = clients[sender];
  243. -        if(cl->type==ST_TCPIP)
  244. -        {
  245. -            if( cl->state.state!=CS_ALIVE || !cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
  246. -            vec v(e.x, e.y, cl->state.o.z);
  247. -            float dist = cl->state.o.dist(v);
  248. -            int pdist = check_pdist(cl,dist);
  249. -            if (pdist)
  250. -            {
  251. -                cl->farpickups++;
  252. -                if (!m_demo) logline(ACLOG_INFO, "[%s] %s %s up entity #%d (%s), distance %.2f (%d)",
  253. -                     cl->hostname, cl->name, (pdist==2?"tried to pick":"picked"), i, entnames[e.type], dist, cl->farpickups);
  254. -                if (pdist==2) return false;
  255. -            }
  256. -        }
  257. +        if(!e.spawned || !cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
  258.          sendf(-1, 1, "ri3", SV_ITEMACC, i, sender);
  259.          cl->state.pickup(sents[i].type);
  260.          if (m_lss && sents[i].type == I_GRENADE) cl->state.pickup(sents[i].type); // get two nades at lss
  261. @@ -1946,7 +1922,7 @@
  262.              {
  263.                  e.type = smapstats.enttypes[i];
  264.                  e.transformtype(smode);
  265. -                server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1]};
  266. +                server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1], smapstats.entposs[i * 3 + 2] };
  267.                  sents.add(se);
  268.                  if(e.fitsmode(smode)) sents[i].spawned = sents[i].legalpickup = true;
  269.              }
  270. @@ -2821,6 +2797,43 @@
  271.                  break;
  272.              }
  273.  
  274. +            case SV_TEXTPRIVATE:
  275. +            {
  276. +                int targ = getint(p);
  277. +                getstring(text, p);
  278. +                filtertext(text, text);
  279. +                trimtrailingwhitespace(text);
  280. +
  281. +                if(!valid_client(targ)) break;
  282. +                client *target = clients[targ];
  283. +
  284. +                if(*text)
  285. +                {
  286. +                    bool canspeech = forbiddenlist.canspeech(text);
  287. +                    if(!spamdetect(cl, text) && canspeech)
  288. +                    {
  289. +                        bool allowed = !(mastermode == MM_MATCH && cl->team != target->team) && cl->role >= roleconf('T');
  290. +                        logline(ACLOG_INFO, "[%s] %s says to %s: '%s' (%s)", cl->hostname, cl->name, target->name, text, allowed ? "allowed":"disallowed");
  291. +                        if(allowed) sendf(target->clientnum, 1, "riis", SV_TEXTPRIVATE, cl->clientnum, text);
  292. +                    }
  293. +                    else
  294. +                    {
  295. +                        logline(ACLOG_INFO, "[%s] %s says to %s: '%s', %s", cl->hostname, cl->name, target->name, text, canspeech ? "SPAM detected" : "Forbidden speech");
  296. +                        if (canspeech)
  297. +                        {
  298. +                            sendservmsg("\f3please do not spam", sender);
  299. +                            if ( cl->spamcount > SPAMMAXREPEAT + 2 ) disconnect_client(cl->clientnum, DISC_ABUSE);
  300. +                        }
  301. +                        else
  302. +                        {
  303. +                            sendservmsg("\f3watch your language!", sender);
  304. +                            kick_abuser(cl->clientnum, cl->badmillis, cl->badspeech, 3);
  305. +                        }
  306. +                    }
  307. +                }
  308. +            }
  309. +            break;
  310. +
  311.              case SV_VOICECOM:
  312.              case SV_VOICECOMTEAM:
  313.              {
  314. @@ -2839,7 +2852,7 @@
  315.                      else sendvoicecomteam(s, sender);
  316.                  }
  317.              }
  318. -                break;
  319. +            break;
  320.  
  321.              case SV_MAPIDENT:
  322.              {
  323. @@ -2879,18 +2892,6 @@
  324.                  break;
  325.              }
  326.  
  327. -            case SV_ITEMPICKUP:
  328. -            {
  329. -                int n = getint(p);
  330. -                if(!arenaround || arenaround - gamemillis > 2000)
  331. -                {
  332. -                    gameevent &pickup = cl->addevent();
  333. -                    pickup.type = GE_PICKUP;
  334. -                    pickup.pickup.ent = n;
  335. -                }
  336. -                break;
  337. -            }
  338. -
  339.              case SV_WEAPCHANGE:
  340.              {
  341.                  int gunselect = getint(p);
  342. @@ -3732,6 +3733,7 @@
  343.  
  344.      if(minremain>0)
  345.      {
  346. +        checkitempickups();
  347.          processevents();
  348.          checkitemspawns(diff);
  349.          bool ktfflagingame = false;
  350. Index: source/src/server.h
  351. ===================================================================
  352. --- source/src/server.h (revision 6592)
  353. +++ source/src/server.h (working copy)
  354. @@ -379,7 +379,7 @@
  355.      int type;
  356.      bool spawned, legalpickup, twice;
  357.      int spawntime;
  358. -    short x, y;
  359. +    short x, y, elevation;
  360.  };
  361.  
  362.  struct demofile
  363. @@ -416,13 +416,13 @@
  364.  
  365.  const char *messagenames[SV_NUM] =
  366.  {
  367. -    "SV_SERVINFO", "SV_WELCOME", "SV_INITCLIENT", "SV_POS", "SV_POSC", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME",
  368. +    "SV_SERVINFO", "SV_WELCOME", "SV_INITCLIENT", "SV_POS", "SV_POSC", "SV_POSN", "SV_TEXT", "SV_TEAMTEXT", "SV_TEXTME", "SV_TEAMTEXTME", "SV_TEXTPRIVATE",
  369.      "SV_SOUND", "SV_VOICECOM", "SV_VOICECOMTEAM", "SV_CDIS",
  370.      "SV_SHOOT", "SV_EXPLODE", "SV_SUICIDE", "SV_AKIMBO", "SV_RELOAD", "SV_AUTHT", "SV_AUTHREQ", "SV_AUTHTRY", "SV_AUTHANS", "SV_AUTHCHAL",
  371.      "SV_GIBDIED", "SV_DIED", "SV_GIBDAMAGE", "SV_DAMAGE", "SV_HITPUSH", "SV_SHOTFX", "SV_THROWNADE",
  372.      "SV_TRYSPAWN", "SV_SPAWNSTATE", "SV_SPAWN", "SV_SPAWNDENY", "SV_FORCEDEATH", "SV_RESUME",
  373.      "SV_DISCSCORES", "SV_TIMEUP", "SV_EDITENT", "SV_ITEMACC",
  374. -    "SV_MAPCHANGE", "SV_ITEMSPAWN", "SV_ITEMPICKUP",
  375. +    "SV_MAPCHANGE", "SV_ITEMSPAWN",
  376.      "SV_PING", "SV_PONG", "SV_CLIENTPING", "SV_GAMEMODE",
  377.      "SV_EDITMODE", "SV_EDITH", "SV_EDITT", "SV_EDITS", "SV_EDITD", "SV_EDITE", "SV_NEWMAP",
  378.      "SV_SENDMAP", "SV_RECVMAP", "SV_REMOVEMAP",
  379. Index: source/src/serverchecks.h
  380. ===================================================================
  381. --- source/src/serverchecks.h   (revision 6592)
  382. +++ source/src/serverchecks.h   (working copy)
  383. @@ -21,6 +21,26 @@
  384.      }
  385.  }
  386.  
  387. +void checkitempickups()
  388. +{
  389. +    if(!isdedicated || m_noitems) return;
  390. +    loopv(clients) if(clients[i] && clients[i]->type != ST_EMPTY && clients[i]->state.isalive(gamemillis))
  391. +    {
  392. +        client *cl = clients[i];
  393. +        loopv(sents) if(sents[i].spawned)
  394. +        {
  395. +            server_entity *si = &sents[i];
  396. +            vec pos(si->x, si->y, (float)SS(si->x, si->y)->floor + (float)si->elevation);
  397. +            if(cl->state.o.dist(pos) < 2.5f)
  398. +            {
  399. +                gameevent &pickup = cl->addevent();
  400. +                pickup.type = GE_PICKUP;
  401. +                pickup.pickup.ent = i;
  402. +            }
  403. +        }
  404. +    }
  405. +}
  406. +
  407.  #define POW2XY(A,B) (pow2(A.x-B.x)+pow2(A.y-B.y))
  408.  
  409.  #ifdef ACAC
  410. Index: source/src/tools.cpp
  411. ===================================================================
  412. --- source/src/tools.cpp    (revision 6592)
  413. +++ source/src/tools.cpp    (working copy)
  414. @@ -71,7 +71,7 @@
  415.          if(e.type == CTF_FLAG && (e.attr2 == 0 || e.attr2 == 1)) { s.flags[e.attr2]++; s.flagents[e.attr2] = i; }
  416.          s.entcnt[e.type]++;
  417.          enttypes[i] = e.type;
  418. -        entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.z + e.attr1;
  419. +        entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.attr1/* + e.z*/;
  420.      }
  421.      DELETEA(testlayout);
  422.      int minfloor = 0;
  423. @@ -83,13 +83,15 @@
  424.          bool fail = false;
  425.          testlayout = new char[layoutsize + 256];
  426.          memset(testlayout, 0, layoutsize * sizeof(char));
  427. -        char *t = NULL;
  428. +        ssqr *t = NULL;
  429.          char floor = 0, ceil;
  430.          int diff = 0;
  431.          Mvolume = Marea = SHhits = 0;
  432. +        s.initworld();
  433.          loopk(layoutsize)
  434.          {
  435.              char *c = testlayout + k;
  436. +            ssqr *ss = &s.world[k];
  437.              int type = f->getchar();
  438.              int n = 1;
  439.              switch(type)
  440. @@ -97,20 +99,23 @@
  441.                  case 255:
  442.                  {
  443.                      if(!t || (n = f->getchar()) < 0) { fail = true; break; }
  444. -                    memset(c, *t, n);
  445. -                    k += n - 1;
  446. +                    char tmp = *(c-1);
  447. +                    memset(c, tmp, n);
  448. +                    for(int i = 0; i<n; i++, k++) memcpy(&s.world[k], t, sizeof(ssqr));
  449. +                    k--;
  450.                      break;
  451.                  }
  452.                  case 254: // only in MAPVERSION<=2
  453.                      if(!t) { fail = true; break; }
  454. -                    *c = *t;
  455. +                    *c = *(c-1);
  456.                      f->getchar(); f->getchar();
  457.                      break;
  458.                  default:
  459.                      if(type<0 || type>=MAXTYPE)  { fail = true; break; }
  460. -                    floor = f->getchar();
  461. -                    ceil = f->getchar();
  462. -                    if(floor >= ceil && ceil > -128) floor = ceil - 1;  // for pre 12_13
  463. +                    ss->type = type;
  464. +                    ss->floor = floor = f->getchar();
  465. +                    ss->ceil = ceil = f->getchar();
  466. +                    if(floor >= ceil && ceil > -128) ss->floor = floor = ceil - 1;  // for pre 12_13
  467.                      diff = ceil - floor;
  468.                      if(type == FHF) floor = -128;
  469.                      if(floor!=-128 && floor<minfloor) minfloor = floor;
  470. @@ -118,8 +123,10 @@
  471.                      f->getchar(); f->getchar();
  472.                      if(s.hdr.version>=2) f->getchar();
  473.                      if(s.hdr.version>=5) f->getchar();
  474. -
  475. +                    *c = ss->floor;
  476.                  case SOLID:
  477. +                    *c = 127;
  478. +                    ss->type = SOLID;
  479.                      *c = type == SOLID ? 127 : floor;
  480.                      f->getchar(); f->getchar();
  481.                      if(s.hdr.version<=2) { f->getchar(); f->getchar(); }
  482. @@ -132,7 +139,7 @@
  483.                  Mvolume += diff * n;
  484.              }
  485.              if(fail) break;
  486. -            t = c;
  487. +            t = ss;
  488.          }
  489.          if(fail) { DELETEA(testlayout); }
  490.          else
  491. Index: source/src/world.h
  492. ===================================================================
  493. --- source/src/world.h  (revision 6592)
  494. +++ source/src/world.h  (working copy)
  495. @@ -23,6 +23,13 @@
  496.      uchar reserved[2];
  497.  };
  498.  
  499. +// simplified square
  500. +struct ssqr
  501. +{
  502. +    uchar type;
  503. +    char floor, ceil;
  504. +};
  505. +
  506.  enum                            // hardcoded texture numbers
  507.  {
  508.      DEFAULT_SKY = 0,
  509. @@ -63,7 +70,30 @@
  510.      int flagents[2];
  511.      bool hasffaspawns;
  512.      bool hasteamspawns;
  513. -    bool hasflags;
  514. +    bool hasflags;
  515. +    ssqr *world;
  516. +
  517. +    void initworld()
  518. +    {
  519. +        DELETEA(world);
  520. +        int size = 1 << (hdr.sfactor*2);
  521. +        world = new ssqr[size];
  522. +        memset(world, 0, size*sizeof(ssqr));
  523. +        loopi(size)
  524. +        {
  525. +            ssqr *ss = &world[i];
  526. +            if(!ss) continue;
  527. +            ss->floor = 0;
  528. +            ss->ceil = 16;
  529. +            ss->type = SOLID;
  530. +        }
  531. +    }
  532. +
  533. +    ~mapstats()
  534. +    {
  535. +        DELETEA(world);
  536. +    }
  537. +
  538.  };
  539.  
  540.  #define TRANSFORMOLDENTITIES(headr) \
  541. @@ -117,6 +147,10 @@
  542.  #define SWS(w,x,y,s) (&(w)[((y)<<(s))+(x)])
  543.  #define SW(w,x,y) SWS(w,x,y,sfactor)
  544.  #define S(x,y) SW(world,x,y)            // convenient lookup of a lowest mip cube
  545. +
  546. +#define SSW(w,x,y) SWS(w,x,y,smapstats.hdr.sfactor)
  547. +#define SS(x,y) SSW(smapstats.world,x,y)
  548. +
  549.  #define SMALLEST_FACTOR 6               // determines number of mips there can be
  550.  #define DEFAULT_FACTOR 8
  551.  #define LARGEST_FACTOR 11               // 10 is already insane
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement