2010-10-07 15:35:36 +02:00
/*
2012-01-01 00:32:13 +01:00
* Copyright (C) 2008-2012 TrinityCore <http://www.trinitycore.org/>
2010-10-07 15:35:36 +02:00
* 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 "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
2011-04-29 20:47:02 +02:00
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 ()
{
2010-12-19 17:06:33 +01:00
uint32 oldMSTime = getMSTime ();
2008-10-02 16:23:55 -05:00
SkillExtraItemStore . clear (); // need for reload
2009-10-17 15:51:44 -07:00
2012-03-27 21:36:16 +01: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
2010-12-19 17:06:33 +01:00
if ( ! result )
{
2010-12-23 23:25:44 +01:00
sLog -> outErrorDb ( ">> Loaded 0 spell specialization definitions. DB table `skill_extra_item_template` is empty." );
sLog -> outString ();
2010-12-19 17:06:33 +01:00
return ;
}
uint32 count = 0 ;
do
2008-10-02 16:23:55 -05:00
{
2011-09-15 14:08:17 +02:00
Field * fields = result -> Fetch ();
2010-12-06 02:07:53 +01:00
2010-12-19 17:06:33 +01:00
uint32 spellId = fields [ 0 ]. GetUInt32 ();
2009-10-17 15:51:44 -07:00
2011-07-26 23:09:28 +02:00
if ( ! sSpellMgr -> GetSpellInfo ( spellId ))
2008-10-02 16:23:55 -05:00
{
2010-12-23 23:25:44 +01:00
sLog -> outError ( "Skill specialization %u has non-existent spell id in `skill_extra_item_template`!" , spellId );
2010-12-19 17:06:33 +01:00
continue ;
}
2009-10-17 15:51:44 -07:00
2010-12-19 17:06:33 +01:00
uint32 requiredSpecialization = fields [ 1 ]. GetUInt32 ();
2011-07-26 23:09:28 +02:00
if ( ! sSpellMgr -> GetSpellInfo ( requiredSpecialization ))
2010-12-19 17:06:33 +01:00
{
2011-04-29 20:47:02 +02:00
sLog -> outError ( "Skill specialization %u have not existed required specialization spell id %u in `skill_extra_item_template`!" , spellId , requiredSpecialization );
2010-12-19 17:06:33 +01:00
continue ;
}
float additionalCreateChance = fields [ 2 ]. GetFloat ();
if ( additionalCreateChance <= 0.0f )
{
2010-12-23 23:25:44 +01:00
sLog -> outError ( "Skill specialization %u has too low additional create chance in `skill_extra_item_template`!" , spellId );
2010-12-19 17:06:33 +01:00
continue ;
}
uint8 additionalMaxNum = fields [ 3 ]. GetUInt8 ();
if ( ! additionalMaxNum )
{
2010-12-23 23:25:44 +01:00
sLog -> outError ( "Skill specialization %u has 0 max number of extra items in `skill_extra_item_template`!" , spellId );
2010-12-19 17:06:33 +01:00
continue ;
}
SkillExtraItemEntry & skillExtraItemEntry = SkillExtraItemStore [ spellId ];
skillExtraItemEntry . requiredSpecialization = requiredSpecialization ;
skillExtraItemEntry . additionalCreateChance = additionalCreateChance ;
skillExtraItemEntry . additionalMaxNum = additionalMaxNum ;
++ count ;
2008-10-02 16:23:55 -05:00
}
2010-12-19 17:06:33 +01:00
while ( result -> NextRow ());
2010-12-23 23:25:44 +01:00
sLog -> outString ( ">> Loaded %u spell specialization definitions in %u ms" , count , GetMSTimeDiffToNow ( oldMSTime ));
sLog -> outString ();
2008-10-02 16:23:55 -05:00
}
2009-10-17 15:51:44 -07:00
2011-06-11 22:35:29 +02:00
bool canCreateExtraItems ( Player * player , uint32 spellId , float & additionalChance , uint8 & additionalMax )
2008-10-02 16:23:55 -05:00
{
// 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 ;
}