Пример #1
0
//************************************************
//************************************************
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();
}
Пример #2
0
//***********************************************************************
//	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
void mech_unjam_ammo_event(EVENT * objEvent)
{
    MECH *objMech = (MECH *) objEvent->data;	/* get the mech */
    int wWeapNum = (int) objEvent->data2;	/* and now the weapon number */
    int wSect, wSlot, wWeapStatus, wWeapIdx;
    int ammoLoc, ammoCrit, ammoLeft;
    int wRoll = 0;
    int wRollNeeded = 0;

    if (Uncon(objMech) || !Started(objMech))
	return;

    wWeapStatus =
	FindWeaponNumberOnMech(objMech, wWeapNum, &wSect, &wSlot);

    if (wWeapStatus == TIC_NUM_DESTROYED)	/* return if the weapon has been destroyed */
	return;

    wWeapIdx = FindWeaponIndex(objMech, wWeapNum);
    ammoLeft =
	FindAmmoForWeapon_sub(objMech, wSect, wSlot, wWeapIdx, 0, &ammoLoc,
	&ammoCrit, 0, 0);

    if (!ammoLeft) {
	SetPartTempNuke(objMech, wSect, wSlot, 0);

	mech_notify(objMech, MECHALL,
	    tprintf
	    ("You finish bouncing around and realize you nolonger have ammo for your %s!",
		get_parts_long_name(I2Weapon(wWeapIdx), 0)));
	return;
    }

    if (MechWeapons[wWeapStatus].special & RAC) {
	wRoll = Roll();
	wRollNeeded = FindPilotGunnery(objMech, wWeapStatus) + 3;

	mech_notify(objMech, MECHPILOT,
	    "You make a roll to unjam the weapon!");
	mech_notify(objMech, MECHPILOT,
	    tprintf("Modified Gunnery Skill: BTH %d\tRoll: %d",
		wRollNeeded, wRoll));

	if (wRoll < wRollNeeded) {
	    mech_notify(objMech, MECHALL,
		"Your attempt to remove the jammed slug fails. You'll need to try again to clear it.");
	    return;
	}
    } else {
	if (!MadePilotSkillRoll(objMech, 0)) {
	    mech_notify(objMech, MECHALL,
		"Your attempt to remove the jammed slug fails. You'll need to try again to clear it.");
	    return;
	}
    }

    SetPartTempNuke(objMech, wSect, wSlot, 0);
    mech_notify(objMech, MECHALL,
	tprintf("You manage to clear the jam on your %s!",
	    get_parts_long_name(I2Weapon(wWeapIdx), 0)));
    MechLOSBroadcast(objMech, "ejects a mangled shell!");

    SetPartData(objMech, ammoLoc, ammoCrit, GetPartData(objMech, ammoLoc,
	    ammoCrit) - 1);
}