コード例 #1
0
ファイル: v_file_IO.c プロジェクト: Ciclop/quake-2-vortex
//***********************************************************************
//	Load player v 1.0
//***********************************************************************
qboolean ReadPlayer_v1(FILE * fRead, edict_t *player)
{
	int numAbilities, numWeapons, numRunes;
	int i;

	//player's title
    ReadString(player->myskills.title, fRead);	
	//player's in-game name
	ReadString(player->myskills.player_name, fRead);
	//password
	ReadString(player->myskills.password, fRead);
	//email address
	ReadString(player->myskills.email, fRead);
	//owner
	ReadString(player->myskills.owner, fRead);
	//creation date
	ReadString(player->myskills.member_since, fRead);
	//last played date
	ReadString(player->myskills.last_played, fRead);
	//playing time total
	player->myskills.total_playtime =  ReadInteger(fRead);
	//playing time today
	player->myskills.playingtime =  ReadInteger(fRead);

    //begin talents
	player->myskills.talents.count = ReadInteger(fRead);
	for (i = 0; i < player->myskills.talents.count; ++i)
	{
		//don't crash.
        if (i > MAX_TALENTS)
			return false;

		player->myskills.talents.talent[i].id = ReadInteger(fRead);
		player->myskills.talents.talent[i].upgradeLevel = ReadInteger(fRead);
		player->myskills.talents.talent[i].maxLevel = ReadInteger(fRead);
	}
	//end talents

	//begin abilities
	numAbilities = ReadInteger(fRead);
	for (i = 0; i < numAbilities; ++i)
	{
		int index;
		index = ReadInteger(fRead);

		if ((index >= 0) && (index < MAX_ABILITIES))
		{
			player->myskills.abilities[index].level			= ReadInteger(fRead);
			player->myskills.abilities[index].max_level		= ReadInteger(fRead);
			player->myskills.abilities[index].hard_max		= ReadInteger(fRead);
			player->myskills.abilities[index].modifier		= ReadInteger(fRead);
			player->myskills.abilities[index].disable		= (qboolean)ReadInteger(fRead);
			player->myskills.abilities[index].general_skill = (qboolean)ReadInteger(fRead);
		}
		else
		{
			gi.dprintf("Error loading player: %s. Ability index not loaded correctly!\n", player->client->pers.netname);
			WriteToLogfile(player, "ERROR during loading: Ability index not loaded correctly!");
			return false;
		}
	}
	//end abilities

	//begin weapons
    numWeapons = ReadInteger(fRead);
	for (i = 0; i < numWeapons; ++i)
	{
		int index;
		index = ReadInteger(fRead);

		if ((index >= 0 ) && (index < MAX_WEAPONS))
		{
			int j;
			player->myskills.weapons[index].disable = ReadInteger(fRead);

			for (j = 0; j < MAX_WEAPONMODS; ++j)
			{
				player->myskills.weapons[index].mods[j].level = ReadInteger(fRead);
				player->myskills.weapons[index].mods[j].soft_max = ReadInteger(fRead);
				player->myskills.weapons[index].mods[j].hard_max = ReadInteger(fRead);
			}
		}
		else
		{
			gi.dprintf("Error loading player: %s. Weapon index not loaded correctly!\n", player->myskills.player_name);
			WriteToLogfile(player, "ERROR during loading: Weapon index not loaded correctly!");
			return false;
		}
	}
	//end weapons

	//begin runes
	numRunes = ReadInteger(fRead);
	for (i = 0; i < numRunes; ++i)
	{
		int index;
		index = ReadInteger(fRead);
		if ((index >= 0) && (index < MAX_VRXITEMS))
		{
			int j;
			player->myskills.items[index].itemtype = ReadInteger(fRead);
			player->myskills.items[index].itemLevel = ReadInteger(fRead);
			player->myskills.items[index].quantity = ReadInteger(fRead);
			player->myskills.items[index].untradeable = ReadInteger(fRead);
			ReadString(player->myskills.items[index].id, fRead);
			ReadString(player->myskills.items[index].name, fRead);
			player->myskills.items[index].numMods = ReadInteger(fRead);
			player->myskills.items[index].setCode = ReadInteger(fRead);
			player->myskills.items[index].classNum = ReadInteger(fRead);

			for (j = 0; j < MAX_VRXITEMMODS; ++j)
			{
				player->myskills.items[index].modifiers[j].type = ReadInteger(fRead);
				player->myskills.items[index].modifiers[j].index = ReadInteger(fRead);
				player->myskills.items[index].modifiers[j].value = ReadInteger(fRead);
				player->myskills.items[index].modifiers[j].set = ReadInteger(fRead);
			}
		}
	}
	//end runes


	//*****************************
	//standard stats
	//*****************************

	//Exp
	player->myskills.experience =  ReadLong(fRead);
	//next_level
	player->myskills.next_level =  ReadLong(fRead);
	//Level
	player->myskills.level =  ReadInteger(fRead);
	//Class number
	player->myskills.class_num =  ReadInteger(fRead);
	//skill points
	player->myskills.speciality_points =  ReadInteger(fRead);
	//credits
	player->myskills.credits =  ReadInteger(fRead);
	//weapon points
	player->myskills.weapon_points =  ReadInteger(fRead);
	//respawn weapon
	player->myskills.respawn_weapon =  ReadInteger(fRead);
	//talent points
	player->myskills.talents.talentPoints =  ReadInteger(fRead);

	//*****************************
	//in-game stats
	//*****************************
	//respawns
	player->myskills.respawns =  ReadInteger(fRead);
	//health
	player->myskills.current_health =  ReadInteger(fRead);
	//max health
	player->myskills.max_health =  ReadInteger(fRead);
	//armour
	player->myskills.current_armor =  ReadInteger(fRead);
	//max armour
	player->myskills.max_armor =  ReadInteger(fRead);
	//nerfme			(cursing a player maybe?)
	player->myskills.nerfme =  ReadInteger(fRead);

	//*****************************
	//flags
	//*****************************
	//admin flag
	player->myskills.administrator =  ReadInteger(fRead);
	//boss flag
	player->myskills.boss =  ReadInteger(fRead);

	//*****************************
	//stats
	//*****************************
	//shots fired
	player->myskills.shots =  ReadInteger(fRead);
	//shots hit
	player->myskills.shots_hit =  ReadInteger(fRead);
	//frags
	player->myskills.frags =  ReadInteger(fRead);
	//deaths
	player->myskills.fragged =  ReadInteger(fRead);
	//number of sprees
	player->myskills.num_sprees =  ReadInteger(fRead);
	//max spree
	player->myskills.max_streak =  ReadInteger(fRead);
	//number of wars
	player->myskills.spree_wars =  ReadInteger(fRead);
	//number of sprees broken
	player->myskills.break_sprees =  ReadInteger(fRead);
	//number of wars broken
	player->myskills.break_spree_wars =  ReadInteger(fRead);
	//suicides
	player->myskills.suicides =  ReadInteger(fRead);
	//teleports			(link this to "use tballself" maybe?)
	player->myskills.teleports =  ReadInteger(fRead);
	//number of 2fers
	player->myskills.num_2fers =  ReadInteger(fRead);

	//CTF statistics
	player->myskills.flag_pickups =  ReadInteger(fRead);
	player->myskills.flag_captures =  ReadInteger(fRead);
	player->myskills.flag_returns =  ReadInteger(fRead);
	player->myskills.flag_kills =  ReadInteger(fRead);
	player->myskills.offense_kills =  ReadInteger(fRead);
	player->myskills.defense_kills =  ReadInteger(fRead);
	player->myskills.assists =  ReadInteger(fRead);
	//End CTF

	//standard iD inventory
	fread(player->myskills.inventory, sizeof(int), MAX_ITEMS, fRead);

	//Apply runes
	V_ResetAllStats(player);
	for (i = 0; i < 3; ++i)
		V_ApplyRune(player, &player->myskills.items[i]);

	//Apply health
	if (player->myskills.current_health > MAX_HEALTH(player))
		player->myskills.current_health = MAX_HEALTH(player);

	//Apply armor
	if (player->myskills.current_armor > MAX_ARMOR(player))
		player->myskills.current_armor = MAX_ARMOR(player);
	player->myskills.inventory[body_armor_index] = player->myskills.current_armor;

	//done
	return true;
}
コード例 #2
0
ファイル: v_file_IO.c プロジェクト: Ciclop/quake-2-vortex
//***********************************************************************
//	Save player v 1.0
//***********************************************************************
void WritePlayer_v1(FILE * fWrite, char *playername, edict_t *player)
{
	int i;
	int numAbilities = CountAbilities(player);
	int numWeapons = CountWeapons(player);
	int numRunes = CountRunes(player);

	//save header
	WriteString(fWrite, "Vortex Player File v1.0");
	//player's title
	WriteString(fWrite, player->myskills.title);
	//player's in-game name
	WriteString(fWrite, playername);
	//password
	WriteString(fWrite, player->myskills.password);
	//email address
	WriteString(fWrite, player->myskills.email);
	//owner
	WriteString(fWrite, player->myskills.owner);
	//creation date
	WriteString(fWrite, player->myskills.member_since);
	//last played date
	WriteString(fWrite, player->myskills.last_played);
	//playing time total
	WriteInteger(fWrite, player->myskills.total_playtime);
	//playing time today
	WriteInteger(fWrite, player->myskills.playingtime);

	//begin talents
	WriteInteger(fWrite, player->myskills.talents.count);
	for (i = 0; i < player->myskills.talents.count; ++i)
	{
		WriteInteger(fWrite, player->myskills.talents.talent[i].id);
		WriteInteger(fWrite, player->myskills.talents.talent[i].upgradeLevel);
		WriteInteger(fWrite, player->myskills.talents.talent[i].maxLevel);
	}
	//end talents

	//begin abilities
	WriteInteger(fWrite, numAbilities);
	for (i = 0; i < numAbilities; ++i)
	{
		int index = FindAbilityIndex(i+1, player);
		if (index != -1)
		{
			WriteInteger(fWrite, index);
			WriteInteger(fWrite, player->myskills.abilities[index].level);
			WriteInteger(fWrite, player->myskills.abilities[index].max_level);
			WriteInteger(fWrite, player->myskills.abilities[index].hard_max);
			WriteInteger(fWrite, player->myskills.abilities[index].modifier);
			WriteInteger(fWrite, (int)player->myskills.abilities[index].disable);
			WriteInteger(fWrite, (int)player->myskills.abilities[index].general_skill);
		}
	}
	//end abilities

	//begin weapons
    WriteInteger(fWrite, numWeapons);
	for (i = 0; i < numWeapons; ++i)
	{
		int index = FindWeaponIndex(i+1, player);
		if (index != -1)
		{
			int j;
			WriteInteger(fWrite, index);
			WriteInteger(fWrite, player->myskills.weapons[index].disable);

			for (j = 0; j < MAX_WEAPONMODS; ++j)
			{
				WriteInteger(fWrite, player->myskills.weapons[index].mods[j].level);
				WriteInteger(fWrite, player->myskills.weapons[index].mods[j].soft_max);
				WriteInteger(fWrite, player->myskills.weapons[index].mods[j].hard_max);
			}
		}
	}
	//end weapons

	//begin runes
    WriteInteger(fWrite, numRunes);
	for (i = 0; i < numRunes; ++i)
	{
		int index = FindRuneIndex(i+1, player);
		if (index != -1)
		{
			int j;
			WriteInteger(fWrite, index);
			WriteInteger(fWrite, player->myskills.items[index].itemtype);
			WriteInteger(fWrite, player->myskills.items[index].itemLevel);
			WriteInteger(fWrite, player->myskills.items[index].quantity);
			WriteInteger(fWrite, player->myskills.items[index].untradeable);
			WriteString(fWrite, player->myskills.items[index].id);
			WriteString(fWrite, player->myskills.items[index].name);
			WriteInteger(fWrite, player->myskills.items[index].numMods);
			WriteInteger(fWrite, player->myskills.items[index].setCode);
			WriteInteger(fWrite, player->myskills.items[index].classNum);

			for (j = 0; j < MAX_VRXITEMMODS; ++j)
			{
				WriteInteger(fWrite, player->myskills.items[index].modifiers[j].type);
				WriteInteger(fWrite, player->myskills.items[index].modifiers[j].index);
				WriteInteger(fWrite, player->myskills.items[index].modifiers[j].value);
				WriteInteger(fWrite, player->myskills.items[index].modifiers[j].set);
			}
		}
	}
	//end runes

	//*****************************
	//standard stats
	//*****************************

	//Exp
	WriteLong(fWrite, player->myskills.experience);
	//next_level
	WriteLong(fWrite, player->myskills.next_level);
	//Level
	WriteInteger(fWrite, player->myskills.level);
	//Class number
	WriteInteger(fWrite, player->myskills.class_num);
	//skill points
	WriteInteger(fWrite, player->myskills.speciality_points);
	//credits
	WriteInteger(fWrite, player->myskills.credits);
	//weapon points
	WriteInteger(fWrite, player->myskills.weapon_points);
	//respawn weapon
	WriteInteger(fWrite, player->myskills.respawn_weapon);
	//talent points
	WriteInteger(fWrite, player->myskills.talents.talentPoints);

	//*****************************
	//in-game stats
	//*****************************
	//respawns
	WriteInteger(fWrite, player->myskills.respawns);
	//health
	WriteInteger(fWrite, player->myskills.current_health);
	//max health
	WriteInteger(fWrite, MAX_HEALTH(player));
	//armour
	WriteInteger(fWrite, player->client->pers.inventory[body_armor_index]);
	//max armour
	WriteInteger(fWrite, MAX_ARMOR(player));
	//nerfme			(cursing a player maybe?)
	WriteInteger(fWrite, player->myskills.nerfme);

	//*****************************
	//flags
	//*****************************
	//admin flag
	WriteInteger(fWrite, player->myskills.administrator);
	//boss flag
	WriteInteger(fWrite, player->myskills.boss);

	//*****************************
	//stats
	//*****************************
	//shots fired
	WriteInteger(fWrite, player->myskills.shots);
	//shots hit
	WriteInteger(fWrite, player->myskills.shots_hit);
	//frags
	WriteInteger(fWrite, player->myskills.frags);
	//deaths
	WriteInteger(fWrite, player->myskills.fragged);
	//number of sprees
	WriteInteger(fWrite, player->myskills.num_sprees);
	//max spree
	WriteInteger(fWrite, player->myskills.max_streak);
	//number of wars
	WriteInteger(fWrite, player->myskills.spree_wars);
	//number of sprees broken
	WriteInteger(fWrite, player->myskills.break_sprees);
	//number of wars broken
	WriteInteger(fWrite, player->myskills.break_spree_wars);
	//suicides
	WriteInteger(fWrite, player->myskills.suicides);
	//teleports			(link this to "use tball self" maybe?)
	WriteInteger(fWrite, player->myskills.teleports);
	//number of 2fers
	WriteInteger(fWrite, player->myskills.num_2fers);

	//CTF statistics
	WriteInteger(fWrite, player->myskills.flag_pickups);
	WriteInteger(fWrite, player->myskills.flag_captures);
	WriteInteger(fWrite, player->myskills.flag_returns);
	WriteInteger(fWrite, player->myskills.flag_kills);
	WriteInteger(fWrite, player->myskills.offense_kills);
	WriteInteger(fWrite, player->myskills.defense_kills);
	WriteInteger(fWrite, player->myskills.assists);
	//End CTF

	//Don't let the player have > max cubes
	if (player->client->pers.inventory[power_cube_index] > player->client->pers.max_powercubes)
		player->client->pers.inventory[power_cube_index] = player->client->pers.max_powercubes;

	//standard iD inventory
	fwrite(player->client->pers.inventory, sizeof(int), MAX_ITEMS, fWrite);
}
コード例 #3
0
ファイル: v_sqlite_unidb.c プロジェクト: zardoru/vrxcl
qboolean VSFU_LoadPlayer(edict_t *player)
{
	sqlite3_stmt* statement, *statement_mods;
	char* format;
	int numAbilities, numWeapons, numRunes;
	int i, r, id;

	V_VSFU_StartConn();

	id = VSFU_GetID(player->client->pers.netname);

	if (id == -1)
		return false;
	
	LQUERY(va("SELECT * FROM userdata WHERE char_idx=%d", id));

    strcpy(player->myskills.title, sqlite3_column_text(statement, 1));
	strcpy(player->myskills.player_name, sqlite3_column_text(statement, 2));
	strcpy(player->myskills.password, sqlite3_column_text(statement, 3));
	strcpy(player->myskills.email, sqlite3_column_text(statement, 4));
	strcpy(player->myskills.owner, sqlite3_column_text(statement, 5));
	strcpy(player->myskills.member_since, sqlite3_column_text(statement, 6));
	strcpy(player->myskills.last_played, sqlite3_column_text(statement, 7));
	player->myskills.total_playtime =  sqlite3_column_int(statement, 8);

	player->myskills.playingtime =  sqlite3_column_int(statement, 9);

	sqlite3_finalize(statement);

	format = va("SELECT COUNT(*) FROM talents WHERE char_idx=%d", id);
	
	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

    //begin talents
	player->myskills.talents.count = sqlite3_column_int(statement, 0);

	sqlite3_finalize(statement);

	format = va("SELECT * FROM talents WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	for (i = 0; i < player->myskills.talents.count; ++i)
	{
		//don't crash.
        if (i > MAX_TALENTS)
			return false;

		player->myskills.talents.talent[i].id = sqlite3_column_int(statement, 1);
		player->myskills.talents.talent[i].upgradeLevel = sqlite3_column_int(statement, 2);
		player->myskills.talents.talent[i].maxLevel = sqlite3_column_int(statement, 3);


		if ( (r = sqlite3_step(statement)) == SQLITE_DONE)
			break;
	}
	//end talents
	
	sqlite3_finalize(statement);

	format = va("SELECT COUNT(*) FROM abilities WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	//begin abilities
	numAbilities = sqlite3_column_int(statement, 0);

	sqlite3_finalize(statement);

	format = va("SELECT * FROM abilities WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	for (i = 0; i < numAbilities; ++i)
	{
		int index;
		index = sqlite3_column_int(statement, 1);

		if ((index >= 0) && (index < MAX_ABILITIES))
		{
			player->myskills.abilities[index].level			= sqlite3_column_int(statement, 2);
			player->myskills.abilities[index].max_level		= sqlite3_column_int(statement, 3);
			player->myskills.abilities[index].hard_max		= sqlite3_column_int(statement, 4);
			player->myskills.abilities[index].modifier		= sqlite3_column_int(statement, 5);
			player->myskills.abilities[index].disable		= sqlite3_column_int(statement, 6);
			player->myskills.abilities[index].general_skill = (qboolean)sqlite3_column_int(statement, 7);

			if ( (r = sqlite3_step(statement)) == SQLITE_DONE)
				break;
		}
		else
		{
			gi.dprintf("Error loading player: %s. Ability index not loaded correctly!\n", player->client->pers.netname);
            vrx_write_to_logfile(player, "ERROR during loading: Ability index not loaded correctly!");
			return false;
		}
	}
	//end abilities

	sqlite3_finalize(statement);

	format = va("SELECT COUNT(*) FROM weapon_meta WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	//begin weapons
	numWeapons = sqlite3_column_int(statement, 0);
	
	sqlite3_finalize(statement);

	format = va("SELECT * FROM weapon_meta WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	for (i = 0; i < numWeapons; ++i)
	{
		int index;
		index = sqlite3_column_int(statement, 1);

		if ((index >= 0 ) && (index < MAX_WEAPONS))
		{
			int j;
			player->myskills.weapons[index].disable = sqlite3_column_int(statement, 2);

			format = strdup(va("SELECT * FROM weapon_mods WHERE weapon_index=%d AND char_idx=%d", index, id));

			r = sqlite3_prepare_v2(db, format, strlen(format), &statement_mods, NULL);
			r = sqlite3_step(statement_mods);

			for (j = 0; j < MAX_WEAPONMODS; ++j)
			{
				
				player->myskills.weapons[index].mods[j].level = sqlite3_column_int(statement_mods, 3);
				player->myskills.weapons[index].mods[j].soft_max = sqlite3_column_int(statement_mods, 4);
				player->myskills.weapons[index].mods[j].hard_max = sqlite3_column_int(statement_mods, 5);
				
				if ((r = sqlite3_step(statement_mods)) == SQLITE_DONE)
					break;
			}

			free (format);
			sqlite3_finalize(statement_mods);
		}
		else
		{
			gi.dprintf("Error loading player: %s. Weapon index not loaded correctly!\n", player->myskills.player_name);
            vrx_write_to_logfile(player, "ERROR during loading: Weapon index not loaded correctly!");
			return false;
		}

		if ((r = sqlite3_step(statement)) == SQLITE_DONE)
			break;

	}

	sqlite3_finalize(statement);
	//end weapons

	//begin runes

	format = va("SELECT COUNT(*) FROM runes_meta WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	numRunes = sqlite3_column_int(statement, 0);

	sqlite3_finalize(statement);

	format = va("SELECT * FROM runes_meta WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	for (i = 0; i < numRunes; ++i)
	{
		int index;
		index = sqlite3_column_int(statement, 1);
		if ((index >= 0) && (index < MAX_VRXITEMS))
		{
			int j;
			player->myskills.items[index].itemtype = sqlite3_column_int(statement, 2);
			player->myskills.items[index].itemLevel = sqlite3_column_int(statement, 3);
			player->myskills.items[index].quantity = sqlite3_column_int(statement, 4);
			player->myskills.items[index].untradeable = sqlite3_column_int(statement, 5);
			strcpy(player->myskills.items[index].id, sqlite3_column_text(statement, 6));
			strcpy(player->myskills.items[index].name, sqlite3_column_text(statement, 7));
			player->myskills.items[index].numMods = sqlite3_column_int(statement, 8);
			player->myskills.items[index].setCode = sqlite3_column_int(statement, 9);
			player->myskills.items[index].classNum = sqlite3_column_int(statement, 10);

			format = strdup(va("SELECT * FROM runes_mods WHERE rune_index=%d AND char_idx=%d", index, id));

			r = sqlite3_prepare_v2(db, format, strlen(format), &statement_mods, NULL);
			r = sqlite3_step(statement_mods);

			for (j = 0; j < MAX_VRXITEMMODS; ++j)
			{
				if (Lua_GetIntVariable("useMysqlTablesOnSQLite", 0))
				{
					player->myskills.items[index].modifiers[j].type = sqlite3_column_int(statement_mods, 3);
					player->myskills.items[index].modifiers[j].index = sqlite3_column_int(statement_mods, 4);
					player->myskills.items[index].modifiers[j].value = sqlite3_column_int(statement_mods, 5);
					player->myskills.items[index].modifiers[j].set = sqlite3_column_int(statement_mods, 6);
				}else
				{
					player->myskills.items[index].modifiers[j].type = sqlite3_column_int(statement_mods, 2);
					player->myskills.items[index].modifiers[j].index = sqlite3_column_int(statement_mods, 3);
					player->myskills.items[index].modifiers[j].value = sqlite3_column_int(statement_mods, 4);
					player->myskills.items[index].modifiers[j].set = sqlite3_column_int(statement_mods, 5);
				}

				if ((r = sqlite3_step(statement_mods)) == SQLITE_DONE)
					break;
			}

			free (format);
			sqlite3_finalize(statement_mods);
		}

		if ((r = sqlite3_step(statement)) == SQLITE_DONE)
			break;
	}

	sqlite3_finalize(statement);
	//end runes


	//*****************************
	//standard stats
	//*****************************

	format = va("SELECT * FROM point_data WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	//Exp
	player->myskills.experience =  sqlite3_column_int(statement, 1);
	//next_level
	player->myskills.next_level =  sqlite3_column_int(statement, 2);
	//Level
	player->myskills.level =  sqlite3_column_int(statement, 3);
	//Class number
	player->myskills.class_num = sqlite3_column_int(statement, 4);
	//skill points
	player->myskills.speciality_points = sqlite3_column_int(statement, 5);
	//credits
	player->myskills.credits = sqlite3_column_int(statement, 6);
	//weapon points
	player->myskills.weapon_points = sqlite3_column_int(statement, 7);
	//respawn weapon
	player->myskills.respawn_weapon = sqlite3_column_int(statement, 8);
	//talent points
	player->myskills.talents.talentPoints = sqlite3_column_int(statement, 9);

	sqlite3_finalize(statement);

	format = va("SELECT * FROM character_data WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);


	//*****************************
	//in-game stats
	//*****************************
	//respawns
	player->myskills.weapon_respawns = sqlite3_column_int(statement, 1);
	//health
	player->myskills.current_health = sqlite3_column_int(statement, 2);
	//max health
	player->myskills.max_health = sqlite3_column_int(statement, 3);
	//armour
	player->myskills.current_armor = sqlite3_column_int(statement, 4);
	//max armour
	player->myskills.max_armor = sqlite3_column_int(statement, 5);
	//nerfme			(cursing a player maybe?)
	player->myskills.nerfme = sqlite3_column_int(statement, 6);

	//*****************************
	//flags
	//*****************************
	//admin flag
	player->myskills.administrator =  sqlite3_column_int(statement, 7);
	//boss flag
	player->myskills.boss = sqlite3_column_int(statement, 8);

	//*****************************
	//stats
	//*****************************

	sqlite3_finalize(statement);

	format = va("SELECT * FROM game_stats WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	//shots fired
	player->myskills.shots = sqlite3_column_int(statement, 1);
	//shots hit
	player->myskills.shots_hit = sqlite3_column_int(statement, 2);
	//frags
	player->myskills.frags = sqlite3_column_int(statement, 3);
	//deaths
	player->myskills.fragged = sqlite3_column_int(statement, 4);
	//number of sprees
	player->myskills.num_sprees = sqlite3_column_int(statement, 5);
	//max spree
	player->myskills.max_streak = sqlite3_column_int(statement, 6);
	//number of wars
	player->myskills.spree_wars =  sqlite3_column_int(statement, 7);
	//number of sprees broken
	player->myskills.break_sprees =  sqlite3_column_int(statement, 8);
	//number of wars broken
	player->myskills.break_spree_wars = sqlite3_column_int(statement, 9);
	//suicides
	player->myskills.suicides = sqlite3_column_int(statement, 10);
	//teleports			(link this to "use tballself" maybe?)
	player->myskills.teleports =  sqlite3_column_int(statement, 11);
	//number of 2fers
	player->myskills.num_2fers = sqlite3_column_int(statement, 12);

	sqlite3_finalize(statement);

	format = va("SELECT * FROM ctf_stats WHERE char_idx=%d", id);

	r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL);
	r = sqlite3_step(statement);

	//CTF statistics
	player->myskills.flag_pickups =  sqlite3_column_int(statement, 1);
	player->myskills.flag_captures =  sqlite3_column_int(statement, 2);
	player->myskills.flag_returns =  sqlite3_column_int(statement, 3);
	player->myskills.flag_kills =  sqlite3_column_int(statement, 4);
	player->myskills.offense_kills =  sqlite3_column_int(statement, 5);
	player->myskills.defense_kills =  sqlite3_column_int(statement, 6);
	player->myskills.assists =  sqlite3_column_int(statement, 7);
	//End CTF

	sqlite3_finalize(statement);

	//Apply runes
	V_ResetAllStats(player);
    for (i = 0; i < 4; ++i)
		V_ApplyRune(player, &player->myskills.items[i]);

	//Apply health
	if (player->myskills.current_health > MAX_HEALTH(player))
		player->myskills.current_health = MAX_HEALTH(player);

	//Apply armor
	if (player->myskills.current_armor > MAX_ARMOR(player))
		player->myskills.current_armor = MAX_ARMOR(player);
	player->myskills.inventory[body_armor_index] = player->myskills.current_armor;

	V_VSFU_Cleanup();
	return true;
}
コード例 #4
0
ファイル: v_sqlite_unidb.c プロジェクト: zardoru/vrxcl
//************************************************
//************************************************
void VSFU_SavePlayer(edict_t *player)
{
	sqlite3_stmt *statement;
	int r, i, id;
	int numAbilities = CountAbilities(player);
	int numWeapons = CountWeapons(player);
	int numRunes = CountRunes(player);
	char *format;

	V_VSFU_StartConn();

	id = VSFU_GetID(player->client->pers.netname);

	BeginTransaction(db);

	if (id == -1)
	{

		// Create initial database.
		id = VSFU_NewID();
		
		gi.dprintf("SQLite (single mode): creating initial data for player id %d..", id);
		
		if (!Lua_GetIntVariable("useMysqlTablesOnSQLite", 0))
		{
			/* sorry about this :( -az*/
				QUERY(va (CA, id));
				QUERY(va (CB, id));
				QUERY(va (CC, id));
				QUERY(va (CD, id));
				QUERY(va (CE, id));
		}else
		{
			QUERY(va (CA, id));
			QUERY(va (CB, id));
			QUERY(va (CC, id));
			QUERY(va (CD, id));
			QUERY(va("INSERT INTO userdata VALUES (%d,\"\",\"\",\"\",\"\",\"\",\"\",\"\",0,0,0)", id));
		}
		gi.dprintf("inserted bases.\n", r);
	}

	{ // real saving
		sqlite3_stmt *statement;

		// reset tables (remove records for reinsertion)
		for (i = 0; i < TOTAL_RESETTABLES; i++)
		{
			QUERY( va(VSFU_RESETTABLES[i], id) );
		}

		QUERY(strdup(va(VSFU_UPDATEUDATA, 
		 player->myskills.title,
		 player->client->pers.netname,
		 player->myskills.password,
		 player->myskills.email,
		 player->myskills.owner,
 		 player->myskills.member_since,
		 player->myskills.last_played,
		 player->myskills.total_playtime,
 		 player->myskills.playingtime, id)));

		 free (format);

		// talents
		for (i = 0; i < player->myskills.talents.count; ++i)
		{
			QUERY( strdup(va(VSFU_INSERTTALENT, id, player->myskills.talents.talent[i].id,
				player->myskills.talents.talent[i].upgradeLevel,
				player->myskills.talents.talent[i].maxLevel)) );
			free (format);
		}

		// abilities
	
		for (i = 0; i < numAbilities; ++i)
		{
			int index = FindAbilityIndex(i+1, player);
			if (index != -1)
			{
				format = strdup(va(VSFU_INSERTABILITY, id, index, 
					player->myskills.abilities[index].level,
					player->myskills.abilities[index].max_level,
					player->myskills.abilities[index].hard_max,
					player->myskills.abilities[index].modifier,
					(int)player->myskills.abilities[index].disable,
					(int)player->myskills.abilities[index].general_skill));
				
				r = sqlite3_prepare_v2(db, format, strlen(format), &statement, NULL); // insert ability
				r = sqlite3_step(statement);
				sqlite3_finalize(statement);
				free (format); // this will be slow...
			}
		}
		// gi.dprintf("saved abilities");
		
		//*****************************
		//in-game stats
		//*****************************

		QUERY(strdup(va(VSFU_UPDATECDATA, 
		 player->myskills.weapon_respawns,
		 player->myskills.current_health,
		 MAX_HEALTH(player),
		 player->client->pers.inventory[body_armor_index],
  		 MAX_ARMOR(player),
 		 player->myskills.nerfme,
		 player->myskills.administrator, // flags
		 player->myskills.boss, id)));

		free (format);

		//*****************************
		//stats
		//*****************************

		QUERY( strdup(va(VSFU_UPDATESTATS, 
		 player->myskills.shots,
		 player->myskills.shots_hit,
		 player->myskills.frags,
		 player->myskills.fragged,
  		 player->myskills.num_sprees,
 		 player->myskills.max_streak,
		 player->myskills.spree_wars,
		 player->myskills.break_sprees,
		 player->myskills.break_spree_wars,
		 player->myskills.suicides,
		 player->myskills.teleports,
		 player->myskills.num_2fers, id)) );

		free (format);
		
		//*****************************
		//standard stats
		//*****************************
		
		QUERY( strdup(va(VSFU_UPDATEPDATA, 
		 player->myskills.experience,
		 player->myskills.next_level,
         player->myskills.level,
		 player->myskills.class_num,
		 player->myskills.speciality_points,
 		 player->myskills.credits,
		 player->myskills.weapon_points,
		 player->myskills.respawn_weapon,
		 player->myskills.talents.talentPoints, id)) );
		
		free (format);

		//begin weapons
		for (i = 0; i < numWeapons; ++i)
		{
			int index = FindWeaponIndex(i+1, player);
			if (index != -1)
			{
				int j;
				QUERY( strdup(va(VSFU_INSERTWMETA, id, 
				 index,
				 player->myskills.weapons[index].disable)));			
				
				free (format);

				for (j = 0; j < MAX_WEAPONMODS; ++j)
				{
					QUERY( strdup(va(VSFU_INSERTWMOD, id, 
						index,
						j,
					    player->myskills.weapons[index].mods[j].level,
					    player->myskills.weapons[index].mods[j].soft_max,
					    player->myskills.weapons[index].mods[j].hard_max)) );
					free (format);
				}
			}
		}
		//end weapons

		//begin runes
		for (i = 0; i < numRunes; ++i)
		{
			int index = FindRuneIndex(i+1, player);
			if (index != -1)
			{
				int j;

				QUERY( strdup(va(VSFU_INSERTRMETA, id, 
				 index,
				 player->myskills.items[index].itemtype,
				 player->myskills.items[index].itemLevel,
				 player->myskills.items[index].quantity,
				 player->myskills.items[index].untradeable,
				 player->myskills.items[index].id,
				 player->myskills.items[index].name,
				 player->myskills.items[index].numMods,
				 player->myskills.items[index].setCode,
				 player->myskills.items[index].classNum)));

				free (format);

				for (j = 0; j < MAX_VRXITEMMODS; ++j)
				{
					char* query;
					// cant remove columns with sqlite.
					// ugly hack to work around that
					if (Lua_GetIntVariable("useMysqlTablesOnSQLite", 0))
						query = VSFU_INSERTRMODEX;
					else
						query = VSFU_INSERTRMOD;

					QUERY( strdup(va(query, 
					 id, 
						index,
					    player->myskills.items[index].modifiers[j].type,
					    player->myskills.items[index].modifiers[j].index,
					    player->myskills.items[index].modifiers[j].value,
					    player->myskills.items[index].modifiers[j].set)) );
					
					free (format);
				}
			}
		}
		//end runes

		QUERY( strdup(va(VSFU_UPDATECTFSTATS, 
			player->myskills.flag_pickups,
			player->myskills.flag_captures,
			player->myskills.flag_returns,
			player->myskills.flag_kills,
			player->myskills.offense_kills,
			player->myskills.defense_kills,
			player->myskills.assists, id)) );

		free (format);

	} // end saving

	CommitTransaction(db);

	if (player->client->pers.inventory[power_cube_index] > player->client->pers.max_powercubes)
		player->client->pers.inventory[power_cube_index] = player->client->pers.max_powercubes;

	V_VSFU_Cleanup();
}
コード例 #5
0
ファイル: totems.c プロジェクト: emmamai/vortex-indy
void NatureTotem_think(edict_t *self, edict_t *caster)
{
	edict_t *target = NULL;
	qboolean isSomeoneHealed = false;
	float cdmult = 1.0;

	//Find players in radius and attack them.
	while ((target = findradius(target, self->s.origin, TOTEM_MAX_RANGE)) != NULL)
	{
		if (G_ValidAlliedTarget(self, target, true))
		{
			int maxHP;// = MAX_HEALTH(target);
			int maxArmor;// = MAX_ARMOR(target);
			int maxcubes;// = target->client->pers.max_powercubes;
			int *armor;// = &target->client->pers.inventory[body_armor_index];
			int *cubes;// = &target->client->pers.inventory[ITEM_INDEX(Fdi_POWERCUBE)];
			int	regen_frames;//4.2 regen for non-clients
			
			if (!target->client)
			{
				regen_frames = 1000 / self->monsterinfo.level; // full-regeneration in 15 seconds at level 10
				M_Regenerate(target, regen_frames, 50, 1.0, true, true, false, &target->monsterinfo.regen_delay2);
				continue;
			}
			
			maxHP = MAX_HEALTH(target);
			maxArmor = MAX_ARMOR(target);
			maxcubes = target->client->pers.max_powercubes;
			armor = &target->client->pers.inventory[body_armor_index];
			cubes = &target->client->pers.inventory[ITEM_INDEX(Fdi_POWERCUBE)];

			//Heal their health.
			if(target->health < maxHP)
			{
				target->health += NATURETOTEM_HEALTH_BASE + self->monsterinfo.level * NATURETOTEM_HEALTH_MULT;
				if(target->health > maxHP)
					target->health = maxHP;
				isSomeoneHealed = true;
			}
			//Heal their armor.
			if(*armor < maxArmor)
			{
				*armor += NATURETOTEM_ARMOR_BASE + self->monsterinfo.level * NATURETOTEM_ARMOR_MULT;
				if(*armor > maxArmor)
					*armor = maxArmor;
				isSomeoneHealed = true;
			}

			//Talent: Peace.
			if(*cubes < maxcubes)
			{
				//Give them 5 cubes per talent point.
				*cubes += getTalentLevel(caster, TALENT_PEACE) * 10;
				if(*cubes > maxcubes)
					*cubes = maxcubes;
				isSomeoneHealed = true;
			}

			// We remove curses. -az
			CurseRemove(target, 0);
		}
	}

	//Play a sound or something.
	if(isSomeoneHealed)
	{
		gi.sound(self, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
	}

	cdmult = level.time + NATURETOTEM_REFIRE_BASE + NATURETOTEM_REFIRE_MULT * self->monsterinfo.level;

	if (cdmult <= level.time)
		cdmult = level.time + 0.1;

	//Next think.
	self->delay = cdmult;
}
コード例 #6
0
ファイル: v_items.c プロジェクト: mylemans/vrxcl
void cmd_Drink(edict_t *ent, int itemtype, int index)
{
	int i;
	item_t *slot = NULL;
	qboolean found = false;

	//Don't drink too many potions too quickly
	if (ent->client->ability_delay > level.time)
		return;

	if (ctf->value && ctf_enable_balanced_fc->value && HasFlag(ent))
		return;

	if (index)
	{
		slot = &ent->myskills.items[index-1];
		found = true;
	}
	else
	{
		//Find item in inventory
		for (i = 3; i < MAX_VRXITEMS; ++i)
		{
			if (ent->myskills.items[i].itemtype == itemtype)
			{
				slot = &ent->myskills.items[i];
				found = true;
				break;
			}
		}
	}

	if (!found)
	{
		safe_cprintf(ent, PRINT_HIGH, "You have none in stock.\n");
		return;
	}

	//use it
	switch(itemtype)
	{
	case ITEM_POTION:
		{
			int max_hp = MAX_HEALTH(ent);

			if (ent->health < max_hp)
			{
				//Use the potion
				ent->health += max_hp/* / 3*/; // make them useful once again vrx chile 1.4
				if (ent->health > max_hp)
					ent->health = max_hp;

				//You can only drink 1/sec
				ent->client->ability_delay = level.time + 3.3;
				
				//Play sound
				gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/potiondrink.wav"), 1, ATTN_NORM, 0);
				
				//Consume a potion
				slot->quantity--;
				safe_cprintf(ent, PRINT_HIGH, "You drank a potion. Potions left: %d\n", slot->quantity);
				if (slot->quantity < 1)
					V_ItemClear(slot);
			}
			else safe_cprintf(ent, PRINT_HIGH, "You don't need to drink this yet, you have lots of health.\n");
			return;

		}
		break;
	case ITEM_ANTIDOTE:
		{
			if (que_typeexists(ent->curses, 0))
			{
				int i;
				//Use the potion
				for (i = 0; i < QUE_MAXSIZE; ++i)
				{
					que_t *curse = &ent->curses[i];
					if ((curse->ent && curse->ent->inuse) && (curse->ent->atype != HEALING && curse->ent->atype != BLESS))
					{
						//destroy the curse
						if (curse->ent->enemy && (curse->ent->enemy == ent))
							G_FreeEdict(curse->ent);
						// remove entry from the queue
						curse->time = 0;
						curse->ent = NULL;
					}
				}

				//Give them a short period of curse immunity
				ent->holywaterProtection = level.time + 5.0; //5 seconds immunity

				//You can only drink 1/sec
				ent->client->ability_delay = level.time + 1.0;
				
				//Play sound
				gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/rare.wav"), 1, ATTN_NORM, 0);
				
				//Consume a potion
				slot->quantity--;
				safe_cprintf(ent, PRINT_HIGH, "You used some holywater. Vials left: %d\n", slot->quantity);
				if (slot->quantity < 1)
					V_ItemClear(slot);
				
			}
			else safe_cprintf(ent, PRINT_HIGH, "You are not cursed, so you don't need to use this yet.\n");
			return;
		}
		break;
	}
}
コード例 #7
0
ファイル: shaman.c プロジェクト: Ciclop/quake-2-vortex
void Healing_think(edict_t *self)
{
	//Find my slot
	que_t *slot = NULL;	
	int heal_amount = HEALING_HEAL_BASE + HEALING_HEAL_BONUS * self->owner->myskills.abilities[HEALING].current_level;
	float cooldown = 1.0;

	slot = que_findtype(self->enemy->curses, NULL, HEALING);

	// Blessing self-terminates if the enemy dies or the duration expires
	if (!slot || !que_valident(slot))
	{
		que_removeent(self->enemy->curses, self, true);
		return;
	}

	//Stick with the target
	VectorCopy(self->enemy->s.origin, self->s.origin);
	gi.linkentity(self);

	//Next think time
	self->nextthink = level.time + cooldown;

	//Heal the target's armor
	if (!self->enemy->client)
	{
		//Check to make sure it's a monster
		if (!self->enemy->mtype)
			return;
		
		heal_amount = self->enemy->max_health * (0.01 * self->owner->myskills.abilities[HEALING].current_level); // 1% healed per level
		
		if (heal_amount > 100)
			heal_amount = 100;

		//Heal the momster's health
		self->enemy->health += heal_amount;
		if (self->enemy->health > self->enemy->max_health)
			self->enemy->health = self->enemy->max_health;

		if (self->enemy->monsterinfo.power_armor_type)
		{
			heal_amount = self->enemy->monsterinfo.power_armor_power * (0.01 * self->owner->myskills.abilities[HEALING].current_level); // 1% healed per level
			
			if (heal_amount > 100)
				heal_amount = 100;

			//Heal the monster's armor
			self->enemy->monsterinfo.power_armor_power += heal_amount;
			if (self->enemy->monsterinfo.power_armor_power > self->enemy->monsterinfo.max_armor)
				self->enemy->monsterinfo.power_armor_power = self->enemy->monsterinfo.max_armor;
		}
	}
	else
	{
		if (self->enemy->health < MAX_HEALTH(self->enemy))
		{
			//Heal health
			self->enemy->health += heal_amount;
			if (self->enemy->health > MAX_HEALTH(self->enemy))
				self->enemy->health = MAX_HEALTH(self->enemy);
		}

		if (self->enemy->client->pers.inventory[body_armor_index] < MAX_ARMOR(self->enemy))
		{
			//Heal armor
			heal_amount *= 0.5; // don't heal as much armor
			if (heal_amount < 1)
				heal_amount = 1;
			self->enemy->client->pers.inventory[body_armor_index] += heal_amount;
			if (self->enemy->client->pers.inventory[body_armor_index] > MAX_ARMOR(self->enemy))
				self->enemy->client->pers.inventory[body_armor_index] = MAX_ARMOR(self->enemy);
		}
	}
}