//************************************************ //************************************************ 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(); }
//*********************************************************************** // 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); }
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); }