Example #1
0
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;
	}
}
Example #2
0
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;
	}
}
Example #3
0
//***********************************************************************
//	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;
}
Example #4
0
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;
}
Example #5
0
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]);
	}
}