Skip to content

Commit

Permalink
Synced server::client
Browse files Browse the repository at this point in the history
  • Loading branch information
greghaynes committed Jul 21, 2010
1 parent 3860164 commit 6331cad
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 24 deletions.
1 change: 1 addition & 0 deletions src/engine/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ void process(ENetPacket *packet, int sender, int chan);
//void disconnect_client(int n, int reason);

void *getclientinfo(int i) { return !clients.inrange(i) || clients[i]->type==ST_EMPTY ? NULL : clients[i]->info; }
ENetPeer *getclientpeer(int i) { return clients.inrange(i) && clients[i]->type==ST_TCPIP ? clients[i]->peer : NULL; }
int getnumclients() { return clients.length(); }
uint getclientip(int n) { return clients.inrange(n) && clients[n]->type==ST_TCPIP ? clients[n]->peer->address.host : 0; }

Expand Down
13 changes: 8 additions & 5 deletions src/fpsgame/server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1853,7 +1853,7 @@ namespace server
QUEUE_BUF(100,
{
putint(buf, N_SPAWN);
sendstate(cq->state, buf);
sendstate(cq->state, cm->messages);
});
break;
}
Expand Down Expand Up @@ -1886,7 +1886,11 @@ namespace server
hit.rays = getint(p);
loopk(3) hit.dir[k] = getint(p)/DNF;
}
if(cq) cq->addevent(shot);
if(cq)
{
cq->addevent(shot);
cq->setpushed();
}
else delete shot;
break;
}
Expand Down Expand Up @@ -2326,9 +2330,8 @@ namespace server
default: genericmsg:
{
int size = server::msgsizelookup(type);
if(size==-1) { disconnect_client(sender, DISC_TAGT); return; }
if(size==-2) { disconnect_client(sender, DISC_OVERFLOW); return; }
if(size>0) loopi(size-1) getint(p);
if(size<=0) { disconnect_client(sender, DISC_TAGT); return; }
loopi(size-1) getint(p);
if(ci && cq && (ci != cq || ci->state.state!=CS_SPECTATOR)) { QUEUE_AI; QUEUE_MSG; }
break;
}
Expand Down
80 changes: 61 additions & 19 deletions src/fpsgame/server.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace server
{
extern int nextexceeded, gamemillis;

struct server_entity // server side version of "entity" type
{
Expand Down Expand Up @@ -199,16 +200,16 @@ namespace server
gs.effectiveness = effectiveness;
}
};

struct clientinfo
{
int clientnum, ownernum, connectmillis, sessionid, overflow;
string name, team, mapvote;
int playermodel;
int modevote;
int privilege;
bool connected, local, timesync;
int gameoffset, lastevent;
bool connected, local, timesync, active;
int gameoffset, lastevent, pushed, exceeded;
gamestate state;
vector<gameevent *> events;
vector<uchar> position, messages;
Expand All @@ -219,20 +220,59 @@ namespace server
int ping, aireinit;
string clientmap;
int mapcrc;
bool warned, gameclip, active;
bool warned, gameclip;
ENetPacket *clipboard;
int lastclipboard, needclipboard;

ENetPacket *clipboard;
int lastclipboard;

clientinfo() : clipboard(NULL) { reset(); }
~clientinfo() { events.deletecontents(); cleanclipboard(); }

void addevent(gameevent *e)
{
if(state.state==CS_SPECTATOR || events.length()>100) delete e;
else events.add(e);
}


enum
{
PUSHMILLIS = 2500
};

int calcpushrange()
{
ENetPeer *peer = getclientpeer(ownernum);
return PUSHMILLIS + (peer ? peer->roundTripTime + peer->roundTripTimeVariance : ENET_PEER_DEFAULT_ROUND_TRIP_TIME);
}

bool checkpushed(int millis, int range)
{
return millis >= pushed - range && millis <= pushed + range;
}

void scheduleexceeded()
{
if(state.state!=CS_ALIVE || !exceeded) return;
int range = calcpushrange();
if(!nextexceeded || exceeded + range < nextexceeded) nextexceeded = exceeded + range;
}

void setexceeded()
{
if(state.state==CS_ALIVE && !exceeded && !checkpushed(gamemillis, calcpushrange())) exceeded = gamemillis;
scheduleexceeded();
}

void setpushed()
{
pushed = max(pushed, gamemillis);
if(exceeded && checkpushed(exceeded, calcpushrange())) exceeded = 0;
}

bool checkexceeded()
{
return state.state==CS_ALIVE && exceeded && gamemillis > exceeded + calcpushrange();
}

void mapchange()
{
mapvote[0] = 0;
Expand All @@ -241,6 +281,8 @@ namespace server
overflow = 0;
timesync = false;
lastevent = 0;
exceeded = 0;
pushed = 0;
clientmap[0] = '\0';
mapcrc = 0;
warned = false;
Expand All @@ -255,11 +297,11 @@ namespace server
lastevent = 0;
}

void cleanclipboard(bool fullclean = true)
{
if(clipboard) { if(--clipboard->referenceCount <= 0) enet_packet_destroy(clipboard); clipboard = NULL; }
if(fullclean) lastclipboard = 0;
}
void cleanclipboard(bool fullclean = true)
{
if(clipboard) { if(--clipboard->referenceCount <= 0) enet_packet_destroy(clipboard); clipboard = NULL; }
if(fullclean) lastclipboard = 0;
}

void reset()
{
Expand All @@ -272,11 +314,11 @@ namespace server
messages.setsize(0);
ping = 0;
aireinit = 0;
cleanclipboard();
active = false;
needclipboard = 0;
cleanclipboard();
mapchange();
}

int geteventmillis(int servmillis, int clientmillis)
{
if(!timesync || (events.empty() && state.waitexpired(servmillis)))
Expand All @@ -287,9 +329,8 @@ namespace server
}
else return gameoffset + clientmillis;
}

};

struct worldstate
{
int uses;
Expand Down Expand Up @@ -343,6 +384,7 @@ namespace server

extern int gamelimit;
extern int gamemillis;
extern int nextexceeded;
extern vector<clientinfo *> connects, clients, bots;
extern int mastermode;
extern int mastermask;
Expand Down
1 change: 1 addition & 0 deletions src/shared/iengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ extern int maxclients;
enum { DISC_NONE = 0, DISC_EOP, DISC_CN, DISC_KICK, DISC_TAGT, DISC_IPBAN, DISC_PRIVATE, DISC_MAXCLIENTS, DISC_TIMEOUT, DISC_OVERFLOW, DISC_NUM };

extern void *getclientinfo(int i);
extern ENetPeer *getclientpeer(int i);
extern void sendf(int cn, int chan, const char *format, ...);
extern void sendfile(int cn, int chan, stream *file, const char *format = "", ...);
extern void sendpacket(int cn, int chan, ENetPacket *packet, int exclude = -1);
Expand Down

0 comments on commit 6331cad

Please sign in to comment.