void DeleteMenu_handler(edict_t *ent, int option) { if (option - 777 > 0) { int i; //Delete item memset(&ent->myskills.items[option - 778], 0, sizeof(item_t)); //Re-apply equipment V_ResetAllStats(ent); for (i = 0; i < 3; ++i) V_ApplyRune(ent, &ent->myskills.items[i]); safe_cprintf(ent, PRINT_HIGH, "Item deleted.\n"); } else if (option - 666 > 0) { //Back to main ShowInventoryMenu(ent, option - 666, false); return; } else { //Closing menu closemenu(ent); return; } }
void SellConfirmMenu_handler(edict_t *ent, int option) { if (option - 777 > 0) { int i; item_t *slot = &ent->myskills.items[option - 778]; int value = GetSellValue(slot); //log the sale WriteToLogfile(ent, va("Selling rune for %d credits. [%s]", value, slot->id)); //Copy item to armory GiveRuneToArmory(slot); //Delete item memset(slot, 0, sizeof(item_t)); gi.cprintf(ent, PRINT_HIGH, "Item Sold for %d credits.\n", value); //Re-apply equipment V_ResetAllStats(ent); for (i = 0; i < 3; ++i) V_ApplyRune(ent, &ent->myskills.items[i]); //refund some credits ent->myskills.credits += value; gi.cprintf(ent, PRINT_HIGH, "You now have %d credits.\n", ent->myskills.credits); gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/gold.wav"), 1, ATTN_NORM, 0); //save the player file SaveCharacter(ent); } else if (option - 666 > 0) { //Back to select sell item OpenSellMenu(ent, option - 666); return; } else { //Closing menu closemenu(ent); return; } }
//*********************************************************************** // 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; }
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; }
void V_EquipItem(edict_t *ent, int index) { int i, wpts, apts, total_pts, clvl = ent->myskills.level; // calculate number of weapon and ability points separately wpts = V_GetRuneWeaponPts(ent, &ent->myskills.items[index]); apts = V_GetRuneAbilityPts(ent, &ent->myskills.items[index]); // calculate weighted total total_pts = ceil(0.5*wpts + 0.75*apts);//was 0.66,2.0 //gi.dprintf("wpts = %d, apts = %d, total = %d\n", wpts, apts, total_pts); if(index < 3) { //remove an item item_t *slot = V_FindFreeItemSlot(ent); if (slot == NULL) { safe_cprintf(ent, PRINT_HIGH, "Not enough room in your stash.\n"); return; } V_ItemSwap(&ent->myskills.items[index], slot); gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/boots.wav"), 1, ATTN_NORM, 0); safe_cprintf(ent, PRINT_HIGH, "Item successfully placed in your stash.\n"); } //Everyone but admins have a minimum level requirement to use a rune. (easier for rune testing) // vrxchile 2.0: only 999 admins are able to test runes. else if ((ent->myskills.administrator < 999) && (ent->myskills.level < total_pts)) { safe_cprintf(ent, PRINT_HIGH, "You need to be level %d to use this rune.\n", total_pts); return; } else if (index < MAX_VRXITEMS) { int type = ent->myskills.items[index].itemtype; if (type & ITEM_UNIQUE) type ^= ITEM_UNIQUE; //equip an item switch(type) { case ITEM_WEAPON: V_ItemSwap(&ent->myskills.items[index], &ent->myskills.items[0]); //put on hand slot if (eqSetItems(ent, &ent->myskills.items[0]) == 3) gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/blessedaim.wav"), 1, ATTN_NORM, 0); else gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/glovesmetal.wav"), 1, ATTN_NORM, 0); break; case ITEM_ABILITY: V_ItemSwap(&ent->myskills.items[index], &ent->myskills.items[1]); //put on neck slot if (eqSetItems(ent, &ent->myskills.items[0]) == 3) gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/blessedaim.wav"), 1, ATTN_NORM, 0); else gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/amulet.wav"), 1, ATTN_NORM, 0); break; case ITEM_COMBO: V_ItemSwap(&ent->myskills.items[index], &ent->myskills.items[2]); //put on neck slot if (eqSetItems(ent, &ent->myskills.items[0]) == 3) gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/blessedaim.wav"), 1, ATTN_NORM, 0); else gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/belt.wav"), 1, ATTN_NORM, 0); break; case ITEM_CLASSRUNE: V_ItemSwap(&ent->myskills.items[index], &ent->myskills.items[1]); //put on neck slot if (eqSetItems(ent, &ent->myskills.items[0]) == 3) gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/blessedaim.wav"), 1, ATTN_NORM, 0); else gi.sound(ent, CHAN_ITEM, gi.soundindex("misc/amulet.wav"), 1, ATTN_NORM, 0); break; } safe_cprintf(ent, PRINT_HIGH, "Item successfully equipped.\n"); } //Reset all rune info V_ResetAllStats(ent); for (i = 0; i < 3; ++i) { if (ent->myskills.items[i].itemtype != TYPE_NONE) V_ApplyRune(ent, &ent->myskills.items[i]); } }