Ejemplo n.º 1
0
/*----------------------------------------------------------------------
 Callback for remote player tables.  Only used if application requested
 object deltas for this session's players.
----------------------------------------------------------------------*/
int dp_PASCAL dp_rplayers_cb(dptab_t *dptab, dptab_table_t *table, playerHdl_t src, playerHdl_t dest, char *subkey, int subkeylen, void *buf, size_t sent, size_t total, int seconds_left, void *context, dp_result_t status)
{
	dp_t *dp = (dp_t *)context;
	dp_playerId_t player;
	dp_result_t err;
	dpid_t id;
	size_t len_used;

	/* current table handled specially in dp_player_notify */
	if (table == dp->players)
		return 0;

	memset(&player, 0, sizeof(player));
	id = (dpid_t) dpMAKESHORT(subkey[0], subkey[1]);
	len_used = dp_unpack_playerId(id, buf, &player);
	if (total != len_used) {
		DPRINT(("dp_rplayers_cb: err: can't unpack player %d (%d != %d).\n", id, total, len_used));
		dp_assertValid(dp);
		return dp_RES_BUG;
	}
	DPRINT(("dp_rplayers_cb: status %d, name %s\n", status, player.name));

	/* Inform caller via local message, if desired */
	err = dpSendObjectDelta(dp, status, (dp_object_t *) &player, table, subkey, subkeylen);
	if (err != dp_RES_OK) {
		DPRINT(("dp_rplayers_cb: can't send object delta, err:%d\n", err));
		return err;
	}

	return 0;
}
Ejemplo n.º 2
0
/*------------------------------------------------------------------------
 Convert a player id (dpid_t) to a user id (dp_uid_t).
 Returns dp_UID_NONE on any error.
------------------------------------------------------------------------*/
DP_API dp_uid_t DP_APIX dpGetPlayerUid(dp_t *dp, dpid_t id)
{
	dp_result_t err;
	dp_playerId_t player;
	char *playerbuf;
	size_t len_used;
	size_t len;
	char subkey[dptab_KEY_MAXLEN];
	int subkeylen;

	precondition(dp != NULL);
	dp_assertValid(dp);
	if (!dp->players) return dp_UID_NONE;
	if (!dp->groups) return dp_UID_NONE;

	subkey[0] = (char) dpGETSHORT_FIRSTBYTE(id);
	subkey[1] = (char) dpGETSHORT_SECONDBYTE(id);
	subkeylen = 2;

	if (id >= dp->firstGId && id < dp->firstGId + dp_MAX_GROUPS) {
		DPRINT(("dpGetPlayerUid: player groups don't have UIDs\n"));
		return dp_UID_NONE;
	}

	err = dptab_get_bykey(dp->players, subkey, subkeylen, (void **)&playerbuf, &len);
	if (err != dp_RES_OK) {
		DPRINT(("dpGetPlayerUid: dptab_get_bykey(players, id:%d) returns err:%d\n", id, err));
		dp_assertValid(dp);
		return dp_UID_NONE;
	}
	len_used = dp_unpack_playerId(id, playerbuf, &player);
	if (len != len_used) {
		DPRINT(("dpGetPlayerUid: can't unpack player %d.\n", id));
		dp_assertValid(dp);
		return dp_UID_NONE;
	}

	if ((unsigned long)player.karma == dp_UID_NONE)
		return dp_UID_NONE;  /* Better not let UID get to 131072! FIXME */

	/* Kludge: only the lower 16 bits of uid available at moment */
	return (dp_uid_t)(0x10000 + (unsigned long)(player.karma));
}