Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Index: entities.cpp
- ===================================================================
- --- entities.cpp (revision 6581)
- +++ entities.cpp (working copy)
- @@ -317,8 +317,7 @@
- default:
- if( d->canpickup(e.type) && lastmillis > e.lastmillis + 250 && lastmillis > lastspawn + 500 )
- {
- - if(d->type==ENT_PLAYER) addmsg(SV_ITEMPICKUP, "ri", n);
- - else if(d->type==ENT_BOT && serverpickup(n, -1)) pickupeffects(n, d);
- + if(d->type==ENT_BOT && serverpickup(n, -1)) pickupeffects(n, d);
- e.lastmillis = lastmillis;
- }
- break;
- Index: server.cpp
- ===================================================================
- --- server.cpp (revision 6581)
- +++ server.cpp (working copy)
- @@ -1379,37 +1379,13 @@
- return sec*1000;
- }
- -bool serverpickup(int i, int sender) // server side item pickup, acknowledge first client that gets it
- +bool serverpickup(int i, int sender)
- {
- - const char *hn = sender >= 0 && clients[sender]->type == ST_TCPIP ? clients[sender]->hostname : NULL;
- - if(!sents.inrange(i))
- - {
- - if(hn) logline(ACLOG_INFO, "[%s] tried to pick up entity #%d - doesn't exist on this map", hn, i);
- - return false;
- - }
- server_entity &e = sents[i];
- - if(!e.spawned)
- - {
- - 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]);
- - return false;
- - }
- if(sender>=0)
- {
- client *cl = clients[sender];
- - if(cl->type==ST_TCPIP)
- - {
- - if( cl->state.state!=CS_ALIVE || !cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
- - vec v(e.x, e.y, cl->state.o.z);
- - float dist = cl->state.o.dist(v);
- - int pdist = check_pdist(cl,dist);
- - if (pdist)
- - {
- - cl->farpickups++;
- - if (!m_demo) logline(ACLOG_INFO, "[%s] %s %s up entity #%d (%s), distance %.2f (%d)",
- - cl->hostname, cl->name, (pdist==2?"tried to pick":"picked"), i, entnames[e.type], dist, cl->farpickups);
- - if (pdist==2) return false;
- - }
- - }
- + if(!cl->state.canpickup(e.type) || ( m_arena && !free_items(sender) ) ) return false;
- sendf(-1, 1, "ri3", SV_ITEMACC, i, sender);
- cl->state.pickup(sents[i].type);
- if (m_lss && sents[i].type == I_GRENADE) cl->state.pickup(sents[i].type); // get two nades at lss
- @@ -1946,7 +1922,7 @@
- {
- e.type = smapstats.enttypes[i];
- e.transformtype(smode);
- - server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1]};
- + server_entity se = { e.type, false, false, false, 0, smapstats.entposs[i * 3], smapstats.entposs[i * 3 + 1], smapstats.entposs[i * 3 + 2] };
- sents.add(se);
- if(e.fitsmode(smode)) sents[i].spawned = sents[i].legalpickup = true;
- }
- @@ -2879,15 +2855,10 @@
- break;
- }
- + // temporarily kept for compatibility
- case SV_ITEMPICKUP:
- {
- int n = getint(p);
- - if(!arenaround || arenaround - gamemillis > 2000)
- - {
- - gameevent &pickup = cl->addevent();
- - pickup.type = GE_PICKUP;
- - pickup.pickup.ent = n;
- - }
- break;
- }
- @@ -3732,6 +3703,7 @@
- if(minremain>0)
- {
- + checkitempickups();
- processevents();
- checkitemspawns(diff);
- bool ktfflagingame = false;
- Index: server.h
- ===================================================================
- --- server.h (revision 6581)
- +++ server.h (working copy)
- @@ -379,7 +379,7 @@
- int type;
- bool spawned, legalpickup, twice;
- int spawntime;
- - short x, y;
- + short x, y, elevation;
- };
- struct demofile
- Index: serverchecks.h
- ===================================================================
- --- serverchecks.h (revision 6581)
- +++ serverchecks.h (working copy)
- @@ -1,3 +1,5 @@
- +extern ssqr *serverworld;
- +
- inline bool is_lagging(client *cl)
- {
- return ( cl->spj > 50 || cl->ping > 500 || cl->ldt > 80 ); // do not change this except if you really know what are you doing
- @@ -21,6 +23,26 @@
- }
- }
- +void checkitempickups()
- +{
- + if(m_noitems) return;
- + loopv(clients) if(clients[i] && clients[i]->type != ST_EMPTY && clients[i]->state.state == CS_ALIVE)
- + {
- + client *cl = clients[i];
- + loopv(sents) if(sents[i].spawned)
- + {
- + server_entity *si = &sents[i];
- + vec pos(si->x, si->y, (float)SS(si->x, si->y)->floor + (float)si->elevation);
- + if(cl->state.o.dist(pos) < 2.5f)
- + {
- + gameevent &pickup = cl->addevent();
- + pickup.type = GE_PICKUP;
- + pickup.pickup.ent = i;
- + }
- + }
- + }
- +}
- +
- #define POW2XY(A,B) (pow2(A.x-B.x)+pow2(A.y-B.y))
- #ifdef ACAC
- Index: tools.cpp
- ===================================================================
- --- tools.cpp (revision 6581)
- +++ tools.cpp (working copy)
- @@ -31,6 +31,31 @@
- extern float Mheight;
- extern int checkarea(int, char *);
- +ssqr *ssqrdefault(ssqr *s)
- +{
- + if(!s) return s;
- + s->type = SOLID;
- + s->floor = 0;
- + s->ceil = 16;
- + return s;
- +}
- +
- +ssqr *serverworld;
- +
- +void init_world(int factor)
- +{
- + DELETEA(serverworld);
- + int ssize = 1 << factor;
- + int size = 1 << (factor*2);
- + serverworld = new ssqr[size];
- + memset(serverworld, 0, size*sizeof(ssqr));
- + loop(x,ssize) loop(y,ssize)
- + {
- + ssqrdefault(SWS(serverworld, x, y, factor));
- + }
- +}
- +
- +
- mapstats *loadmapstats(const char *filename, bool getlayout)
- {
- static mapstats s;
- @@ -71,7 +96,7 @@
- if(e.type == CTF_FLAG && (e.attr2 == 0 || e.attr2 == 1)) { s.flags[e.attr2]++; s.flagents[e.attr2] = i; }
- s.entcnt[e.type]++;
- enttypes[i] = e.type;
- - entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.z + e.attr1;
- + entposs[i * 3] = e.x; entposs[i * 3 + 1] = e.y; entposs[i * 3 + 2] = e.attr1/* + e.z*/;
- }
- DELETEA(testlayout);
- int minfloor = 0;
- @@ -83,13 +108,15 @@
- bool fail = false;
- testlayout = new char[layoutsize + 256];
- memset(testlayout, 0, layoutsize * sizeof(char));
- - char *t = NULL;
- + ssqr *t = NULL;
- char floor = 0, ceil;
- int diff = 0;
- Mvolume = Marea = SHhits = 0;
- + init_world(s.hdr.sfactor);
- loopk(layoutsize)
- {
- char *c = testlayout + k;
- + ssqr *ss = &serverworld[k];
- int type = f->getchar();
- int n = 1;
- switch(type)
- @@ -97,20 +124,23 @@
- case 255:
- {
- if(!t || (n = f->getchar()) < 0) { fail = true; break; }
- - memset(c, *t, n);
- - k += n - 1;
- + char tmp = *(c-1);
- + memset(c, tmp, n);
- + for(int i = 0; i<n; i++, k++) memcpy(&serverworld[k], t, sizeof(ssqr));
- + k--;
- break;
- }
- case 254: // only in MAPVERSION<=2
- if(!t) { fail = true; break; }
- - *c = *t;
- + *c = *(c-1);
- f->getchar(); f->getchar();
- break;
- default:
- if(type<0 || type>=MAXTYPE) { fail = true; break; }
- - floor = f->getchar();
- - ceil = f->getchar();
- - if(floor >= ceil && ceil > -128) floor = ceil - 1; // for pre 12_13
- + ss->type = type;
- + ss->floor = floor = f->getchar();
- + ss->ceil = ceil = f->getchar();
- + if(floor >= ceil && ceil > -128) ss->floor = floor = ceil - 1; // for pre 12_13
- diff = ceil - floor;
- if(type == FHF) floor = -128;
- if(floor!=-128 && floor<minfloor) minfloor = floor;
- @@ -118,8 +148,10 @@
- f->getchar(); f->getchar();
- if(s.hdr.version>=2) f->getchar();
- if(s.hdr.version>=5) f->getchar();
- -
- + *c = ss->floor;
- case SOLID:
- + *c = 127;
- + ss->type = SOLID;
- *c = type == SOLID ? 127 : floor;
- f->getchar(); f->getchar();
- if(s.hdr.version<=2) { f->getchar(); f->getchar(); }
- @@ -132,7 +164,7 @@
- Mvolume += diff * n;
- }
- if(fail) break;
- - t = c;
- + t = ss;
- }
- if(fail) { DELETEA(testlayout); }
- else
- Index: world.h
- ===================================================================
- --- world.h (revision 6581)
- +++ world.h (working copy)
- @@ -23,6 +23,13 @@
- uchar reserved[2];
- };
- +// simplified square
- +struct ssqr
- +{
- + uchar type;
- + char floor, ceil;
- +};
- +
- enum // hardcoded texture numbers
- {
- DEFAULT_SKY = 0,
- @@ -117,6 +124,10 @@
- #define SWS(w,x,y,s) (&(w)[((y)<<(s))+(x)])
- #define SW(w,x,y) SWS(w,x,y,sfactor)
- #define S(x,y) SW(world,x,y) // convenient lookup of a lowest mip cube
- +
- +#define SSW(w,x,y) SWS(w,x,y,smapstats.hdr.sfactor)
- +#define SS(x,y) SSW(serverworld,x,y)
- +
- #define SMALLEST_FACTOR 6 // determines number of mips there can be
- #define DEFAULT_FACTOR 8
- #define LARGEST_FACTOR 11 // 10 is already insane
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement