2010-10-07 12:41:56 +02:00
/*
* Copyright (C) 2008-2010 TrinityCore <http://www.trinitycore.org/>
* Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along
* with this program. If not, see <http://www.gnu.org/licenses/>.
2008-10-02 16:23:55 -05:00
*/
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
#include "SkillExtraItems.h"
2010-06-08 17:01:03 -06:00
#include "DatabaseEnv.h"
2008-10-02 16:23:55 -05:00
#include "Log.h"
#include "ProgressBar.h"
#include "Player.h"
#include <map>
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// some type definitions
// no use putting them in the header file, they're only used in this .cpp
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// struct to store information about extra item creation
// one entry for every spell that is able to create an extra item
struct SkillExtraItemEntry
{
// the spell id of the specialization required to create extra items
uint32 requiredSpecialization ;
// the chance to create one additional item
float additionalCreateChance ;
// maximum number of extra items created per crafting
uint8 additionalMaxNum ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemEntry ()
: requiredSpecialization ( 0 ), additionalCreateChance ( 0.0f ), additionalMaxNum ( 0 ) {}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemEntry ( uint32 rS , float aCC , uint8 aMN )
: requiredSpecialization ( rS ), additionalCreateChance ( aCC ), additionalMaxNum ( aMN ) {}
};
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// map to store the extra item creation info, the key is the spellId of the creation spell, the mapped value is the assigned SkillExtraItemEntry
typedef std :: map < uint32 , SkillExtraItemEntry > SkillExtraItemMap ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemMap SkillExtraItemStore ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// loads the extra item creation info from DB
void LoadSkillExtraItemTable ()
{
uint32 count = 0 ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemStore . clear (); // need for reload
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// 0 1 2 3
2010-09-11 21:10:54 +02:00
QueryResult result = WorldDatabase . Query ( "SELECT spellId, requiredSpecialization, additionalCreateChance, additionalMaxNum FROM skill_extra_item_template" );
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
if ( result )
{
barGoLink bar ( result -> GetRowCount ());
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
do
{
Field * fields = result -> Fetch ();
bar . step ();
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 spellId = fields [ 0 ]. GetUInt32 ();
2009-10-17 15:51:44 -07:00
2010-04-07 19:14:10 +02:00
if ( ! sSpellStore . LookupEntry ( spellId ))
2008-10-02 16:23:55 -05:00
{
sLog . outError ( "Skill specialization %u has non-existent spell id in `skill_extra_item_template`!" , spellId );
continue ;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint32 requiredSpecialization = fields [ 1 ]. GetUInt32 ();
2010-04-07 19:14:10 +02:00
if ( ! sSpellStore . LookupEntry ( requiredSpecialization ))
2008-10-02 16:23:55 -05:00
{
sLog . outError ( "Skill specialization %u have not existed required specialization spell id %u in `skill_extra_item_template`!" , spellId , requiredSpecialization );
continue ;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
float additionalCreateChance = fields [ 2 ]. GetFloat ();
2010-04-07 19:14:10 +02:00
if ( additionalCreateChance <= 0.0f )
2008-10-02 16:23:55 -05:00
{
sLog . outError ( "Skill specialization %u has too low additional create chance in `skill_extra_item_template`!" , spellId );
continue ;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
uint8 additionalMaxNum = fields [ 3 ]. GetUInt8 ();
2010-04-07 19:14:10 +02:00
if ( ! additionalMaxNum )
2008-10-02 16:23:55 -05:00
{
sLog . outError ( "Skill specialization %u has 0 max number of extra items in `skill_extra_item_template`!" , spellId );
continue ;
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemEntry & skillExtraItemEntry = SkillExtraItemStore [ spellId ];
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
skillExtraItemEntry . requiredSpecialization = requiredSpecialization ;
skillExtraItemEntry . additionalCreateChance = additionalCreateChance ;
skillExtraItemEntry . additionalMaxNum = additionalMaxNum ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
++ count ;
} while ( result -> NextRow ());
2009-10-17 15:51:44 -07:00
2009-04-03 16:36:20 -06:00
sLog . outString ();
2010-04-07 22:59:46 +02:00
sLog . outString ( ">> Loaded %u spell specialization definitions" , count );
2008-10-02 16:23:55 -05:00
}
else
{
2009-04-03 16:36:20 -06:00
sLog . outString ();
2010-04-07 22:59:46 +02:00
sLog . outString ( ">> Loaded 0 spell specialization definitions. DB table `skill_extra_item_template` is empty." );
2008-10-02 16:23:55 -05:00
}
}
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
bool canCreateExtraItems ( Player * player , uint32 spellId , float & additionalChance , uint8 & additionalMax )
{
// get the info for the specified spell
SkillExtraItemMap :: const_iterator ret = SkillExtraItemStore . find ( spellId );
2010-04-07 23:25:02 +02:00
if ( ret == SkillExtraItemStore . end ())
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
SkillExtraItemEntry const * specEntry = & ret -> second ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// if no entry, then no extra items can be created
2010-04-07 19:14:10 +02:00
if ( ! specEntry )
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// the player doesn't have the required specialization, return false
2010-04-07 19:14:10 +02:00
if ( ! player -> HasSpell ( specEntry -> requiredSpecialization ))
2008-10-02 16:23:55 -05:00
return false ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// set the arguments to the appropriate values
additionalChance = specEntry -> additionalCreateChance ;
additionalMax = specEntry -> additionalMaxNum ;
2009-10-17 15:51:44 -07:00
2008-10-02 16:23:55 -05:00
// enable extra item creation
return true ;
}
2009-02-17 20:07:49 -06:00