mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-22 08:51:13 +00:00
- whoops, forgot to add this file. kinda important :)
This commit is contained in:
parent
4e45592439
commit
417bf41353
1 changed files with 215 additions and 0 deletions
215
qw/source/sv_entmap.c
Normal file
215
qw/source/sv_entmap.c
Normal file
|
@ -0,0 +1,215 @@
|
||||||
|
/*
|
||||||
|
sv_entmap.c
|
||||||
|
|
||||||
|
(description)
|
||||||
|
|
||||||
|
Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program; if not, write to:
|
||||||
|
|
||||||
|
Free Software Foundation, Inc.
|
||||||
|
59 Temple Place - Suite 330
|
||||||
|
Boston, MA 02111-1307, USA
|
||||||
|
|
||||||
|
*/
|
||||||
|
static const char rcsid[] =
|
||||||
|
"$Id$";
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <QF/sys.h>
|
||||||
|
|
||||||
|
#include "server.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
SV_EntMap_Get
|
||||||
|
|
||||||
|
Returns the network version of a given entity number for the given
|
||||||
|
client, allocating one if necesary, or -1 if none are available.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SV_EntMap_Get (entmap_t *entmap, int entnum)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// return entnum; // FIXME: hack hack hack
|
||||||
|
|
||||||
|
if (entnum < 0 || entnum >= MAX_EDICTS)
|
||||||
|
Sys_Error ("SV_EntMap_Get: invalid entnum: %d", entnum);
|
||||||
|
|
||||||
|
i = entmap->internal[entnum];
|
||||||
|
if (i != ENTMAP_INVALID) { // check if already mapped
|
||||||
|
entmap->network[i].usedtime = realtime;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
// not mapped, so try to find an available number to map to
|
||||||
|
for (i = 0; entmap->network[i].internal != ENTMAP_INVALID; i++)
|
||||||
|
;
|
||||||
|
if (i == sizeof (entmap->network) / sizeof (entmap_item_t) - 1)
|
||||||
|
return ENTMAP_INVALID; // no mappings available (ugh)
|
||||||
|
|
||||||
|
SV_EntMap_Add (entmap, entnum, i);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_LookupByNetwork
|
||||||
|
|
||||||
|
Returns the internal entity number assosiated with a network
|
||||||
|
number, or ENTMAP_INVALID if there isn't one.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SV_EntMap_LookupByNetwork (entmap_t *entmap, int netnum)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (netnum < 0 || netnum >= MAX_NET_EDICTS)
|
||||||
|
Sys_Error ("SV_EntMap_LookupByNetwork: invalid netnum: %d", netnum);
|
||||||
|
|
||||||
|
i = entmap->network[netnum].internal;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_LookupByInternal
|
||||||
|
|
||||||
|
Returns the network entity number assosiated with an internal
|
||||||
|
number, or ENTMAP_INVALID if there isn't one.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
SV_EntMap_LookupByInternal (entmap_t *entmap, int entnum)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (entnum < 0 || entnum >= MAX_EDICTS)
|
||||||
|
Sys_Error ("SV_EntMap_LookupByInternal: invalid entnum: %d", entnum);
|
||||||
|
|
||||||
|
i = entmap->internal[entnum];
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Init
|
||||||
|
|
||||||
|
Initializes an entmap. It does NOT release any previously
|
||||||
|
allocated memory
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Init (entmap_t *entmap)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
// setup world/clients
|
||||||
|
for (i = 0; i <= MAX_CLIENTS; i++) {
|
||||||
|
entmap->internal[i] = i;
|
||||||
|
entmap->network[i].internal = i;
|
||||||
|
entmap->network[i].usedtime = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear the rest
|
||||||
|
for (i = MAX_CLIENTS + 1; i < MAX_EDICTS; i++)
|
||||||
|
entmap->internal[i] = ENTMAP_INVALID;
|
||||||
|
for (i = MAX_CLIENTS + 1;
|
||||||
|
i < sizeof (entmap->network) / sizeof (entmap_item_t); i++) {
|
||||||
|
entmap->network[i].internal = ENTMAP_INVALID;
|
||||||
|
entmap->network[i].usedtime = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Copy
|
||||||
|
|
||||||
|
Copys the contents of one entmap to another. It does NOT release
|
||||||
|
any previously allocated memory in the destination entmap.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Copy (entmap_t *dest, entmap_t *src)
|
||||||
|
{
|
||||||
|
// XXX: this'll be more useful when we dynamically allocate memory
|
||||||
|
memcpy (dest, src, sizeof (entmap_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Delete
|
||||||
|
|
||||||
|
Releases all memory that was allocated in the entmap
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Delete (entmap_t *entmap)
|
||||||
|
{
|
||||||
|
// XXX: make useful
|
||||||
|
memset (entmap, 0xAF, sizeof (entmap_t)); // for debugging
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Add
|
||||||
|
|
||||||
|
Makes the given network number map to the given internal number
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Add (entmap_t *entmap, int entnum, int netnum)
|
||||||
|
{
|
||||||
|
if (entnum < 0 || entnum >= MAX_EDICTS ||
|
||||||
|
netnum < 0 || netnum >= MAX_NET_EDICTS)
|
||||||
|
Sys_Error ("SV_EntMap_Add: invalid entnum/netnum: %d/%d",
|
||||||
|
entnum, netnum);
|
||||||
|
|
||||||
|
entmap->network[netnum].internal = entnum;
|
||||||
|
entmap->internal[entnum] = netnum;
|
||||||
|
entmap->network[netnum].usedtime = realtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Touch
|
||||||
|
|
||||||
|
Updates the "last used" time on the mapping
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Touch (entmap_t *entmap, int netnum)
|
||||||
|
{
|
||||||
|
if (netnum < 0 || netnum >= MAX_NET_EDICTS)
|
||||||
|
Sys_Error ("SV_EntMap_Touch: invalid netnum: %d", netnum);
|
||||||
|
|
||||||
|
if (entmap->network[netnum].internal == ENTMAP_INVALID)
|
||||||
|
Sys_Error ("SV_EntMap_Touch: netnum not mapped: %d", netnum);
|
||||||
|
|
||||||
|
entmap->network[netnum].usedtime = realtime;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
SV_EntMap_Clean
|
||||||
|
|
||||||
|
Removes all mappings that havn't been used in the given number of
|
||||||
|
seconds
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
SV_EntMap_Clean (entmap_t *entmap, float window)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = MAX_CLIENTS + 1;
|
||||||
|
i < sizeof (entmap->network) / sizeof (entmap_item_t); i++)
|
||||||
|
if (entmap->network[i].internal != ENTMAP_INVALID &&
|
||||||
|
entmap->network[i].usedtime + window < realtime) {
|
||||||
|
entmap->internal[entmap->network[i].internal] = ENTMAP_INVALID;
|
||||||
|
entmap->network[i].internal = ENTMAP_INVALID;
|
||||||
|
entmap->network[i].usedtime = 0;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue