mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
[7887] Drop pet spell teaching code, including field in character_pet.
This commit is contained in:
parent
8171bb57dd
commit
c56ef09fa3
10 changed files with 23 additions and 210 deletions
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `character_db_version`;
|
DROP TABLE IF EXISTS `character_db_version`;
|
||||||
CREATE TABLE `character_db_version` (
|
CREATE TABLE `character_db_version` (
|
||||||
`required_7884_05_characters_character_action` bit(1) default NULL
|
`required_7887_01_characters_character_pet` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -483,7 +483,6 @@ CREATE TABLE `character_pet` (
|
||||||
`resettalents_cost` int(11) unsigned NOT NULL default '0',
|
`resettalents_cost` int(11) unsigned NOT NULL default '0',
|
||||||
`resettalents_time` bigint(20) unsigned NOT NULL default '0',
|
`resettalents_time` bigint(20) unsigned NOT NULL default '0',
|
||||||
`abdata` longtext,
|
`abdata` longtext,
|
||||||
`teachspelldata` longtext,
|
|
||||||
PRIMARY KEY (`id`),
|
PRIMARY KEY (`id`),
|
||||||
KEY `owner` (`owner`)
|
KEY `owner` (`owner`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Pet System';
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Pet System';
|
||||||
|
|
|
||||||
4
sql/updates/7887_01_characters_character_pet.sql
Normal file
4
sql/updates/7887_01_characters_character_pet.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE character_db_version CHANGE COLUMN required_7884_05_characters_character_action required_7887_01_characters_character_pet bit;
|
||||||
|
|
||||||
|
ALTER TABLE `character_pet`
|
||||||
|
DROP TeachSpelldata;
|
||||||
|
|
@ -198,6 +198,7 @@ pkgdata_DATA = \
|
||||||
7884_04_characters_character_aura.sql \
|
7884_04_characters_character_aura.sql \
|
||||||
7884_05_characters_character_action.sql \
|
7884_05_characters_character_action.sql \
|
||||||
7886_01_mangos_petcreateinfo_spell.sql \
|
7886_01_mangos_petcreateinfo_spell.sql \
|
||||||
|
7887_01_characters_character_pet.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -376,4 +377,5 @@ EXTRA_DIST = \
|
||||||
7884_04_characters_character_aura.sql \
|
7884_04_characters_character_aura.sql \
|
||||||
7884_05_characters_character_action.sql \
|
7884_05_characters_character_action.sql \
|
||||||
7886_01_mangos_petcreateinfo_spell.sql \
|
7886_01_mangos_petcreateinfo_spell.sql \
|
||||||
|
7887_01_characters_character_pet.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -3562,91 +3562,6 @@ void ObjectMgr::LoadQuestLocales()
|
||||||
sLog.outString( ">> Loaded %lu Quest locale strings", (unsigned long)mQuestLocaleMap.size() );
|
sLog.outString( ">> Loaded %lu Quest locale strings", (unsigned long)mQuestLocaleMap.size() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ObjectMgr::LoadPetCreateSpells()
|
|
||||||
{
|
|
||||||
QueryResult *result = WorldDatabase.Query("SELECT entry, Spell1, Spell2, Spell3, Spell4 FROM petcreateinfo_spell");
|
|
||||||
if(!result)
|
|
||||||
{
|
|
||||||
barGoLink bar( 1 );
|
|
||||||
bar.step();
|
|
||||||
|
|
||||||
sLog.outString();
|
|
||||||
sLog.outString( ">> Loaded 0 pet create spells" );
|
|
||||||
//sLog.outErrorDb("`petcreateinfo_spell` table is empty!");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32 count = 0;
|
|
||||||
|
|
||||||
barGoLink bar( result->GetRowCount() );
|
|
||||||
|
|
||||||
mPetCreateSpell.clear();
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
Field *fields = result->Fetch();
|
|
||||||
bar.step();
|
|
||||||
|
|
||||||
uint32 creature_id = fields[0].GetUInt32();
|
|
||||||
|
|
||||||
if(!creature_id)
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Creature id %u listed in `petcreateinfo_spell` not exist.",creature_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
CreatureInfo const* cInfo = sCreatureStorage.LookupEntry<CreatureInfo>(creature_id);
|
|
||||||
if(!cInfo)
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Creature id %u listed in `petcreateinfo_spell` not exist.",creature_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
PetCreateSpellEntry PetCreateSpell;
|
|
||||||
|
|
||||||
bool have_spell = false;
|
|
||||||
bool have_spell_db = false;
|
|
||||||
for(int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
PetCreateSpell.spellid[i] = fields[i + 1].GetUInt32();
|
|
||||||
|
|
||||||
if(!PetCreateSpell.spellid[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
have_spell_db = true;
|
|
||||||
|
|
||||||
SpellEntry const* i_spell = sSpellStore.LookupEntry(PetCreateSpell.spellid[i]);
|
|
||||||
if(!i_spell)
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Spell %u listed in `petcreateinfo_spell` does not exist",PetCreateSpell.spellid[i]);
|
|
||||||
PetCreateSpell.spellid[i] = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
have_spell = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!have_spell_db)
|
|
||||||
{
|
|
||||||
sLog.outErrorDb("Creature %u listed in `petcreateinfo_spell` have only 0 spell data, why it listed?",creature_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!have_spell)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
mPetCreateSpell[creature_id] = PetCreateSpell;
|
|
||||||
++count;
|
|
||||||
}
|
|
||||||
while (result->NextRow());
|
|
||||||
|
|
||||||
delete result;
|
|
||||||
|
|
||||||
sLog.outString();
|
|
||||||
sLog.outString( ">> Loaded %u pet create spells", count );
|
|
||||||
sLog.outErrorDb("`petcreateinfo_spell` table use deprecated! Must be empty!");
|
|
||||||
}
|
|
||||||
|
|
||||||
void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename)
|
void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename)
|
||||||
{
|
{
|
||||||
if(sWorld.IsScriptScheduled()) // function don't must be called in time scripts use.
|
if(sWorld.IsScriptScheduled()) // function don't must be called in time scripts use.
|
||||||
|
|
|
||||||
|
|
@ -196,11 +196,6 @@ struct PointOfInterest
|
||||||
std::string icon_name;
|
std::string icon_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PetCreateSpellEntry
|
|
||||||
{
|
|
||||||
uint32 spellid[4];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define WEATHER_SEASONS 4
|
#define WEATHER_SEASONS 4
|
||||||
struct WeatherSeasonChances
|
struct WeatherSeasonChances
|
||||||
{
|
{
|
||||||
|
|
@ -320,8 +315,6 @@ class ObjectMgr
|
||||||
|
|
||||||
typedef UNORDERED_MAP<uint32, WeatherZoneChances> WeatherZoneMap;
|
typedef UNORDERED_MAP<uint32, WeatherZoneChances> WeatherZoneMap;
|
||||||
|
|
||||||
typedef UNORDERED_MAP<uint32, PetCreateSpellEntry> PetCreateSpellMap;
|
|
||||||
|
|
||||||
typedef std::vector<std::string> ScriptNameMap;
|
typedef std::vector<std::string> ScriptNameMap;
|
||||||
|
|
||||||
Player* GetPlayer(const char* name) const { return ObjectAccessor::Instance().FindPlayerByName(name);}
|
Player* GetPlayer(const char* name) const { return ObjectAccessor::Instance().FindPlayerByName(name);}
|
||||||
|
|
@ -464,14 +457,6 @@ class ObjectMgr
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
PetCreateSpellEntry const* GetPetCreateSpellEntry(uint32 id) const
|
|
||||||
{
|
|
||||||
PetCreateSpellMap::const_iterator itr = mPetCreateSpell.find(id);
|
|
||||||
if(itr != mPetCreateSpell.end())
|
|
||||||
return &itr->second;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
void LoadGuilds();
|
void LoadGuilds();
|
||||||
void LoadArenaTeams();
|
void LoadArenaTeams();
|
||||||
void LoadGroups();
|
void LoadGroups();
|
||||||
|
|
@ -502,7 +487,6 @@ class ObjectMgr
|
||||||
bool LoadMangosStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value);
|
bool LoadMangosStrings(DatabaseType& db, char const* table, int32 min_value, int32 max_value);
|
||||||
bool LoadMangosStrings() { return LoadMangosStrings(WorldDatabase,"mangos_string",MIN_MANGOS_STRING_ID,MAX_MANGOS_STRING_ID); }
|
bool LoadMangosStrings() { return LoadMangosStrings(WorldDatabase,"mangos_string",MIN_MANGOS_STRING_ID,MAX_MANGOS_STRING_ID); }
|
||||||
void LoadDbScriptStrings();
|
void LoadDbScriptStrings();
|
||||||
void LoadPetCreateSpells();
|
|
||||||
void LoadCreatureLocales();
|
void LoadCreatureLocales();
|
||||||
void LoadCreatureTemplates();
|
void LoadCreatureTemplates();
|
||||||
void LoadCreatures();
|
void LoadCreatures();
|
||||||
|
|
@ -814,8 +798,6 @@ class ObjectMgr
|
||||||
|
|
||||||
WeatherZoneMap mWeatherZoneMap;
|
WeatherZoneMap mWeatherZoneMap;
|
||||||
|
|
||||||
PetCreateSpellMap mPetCreateSpell;
|
|
||||||
|
|
||||||
//character reserved names
|
//character reserved names
|
||||||
typedef std::set<std::wstring> ReservedNamesMap;
|
typedef std::set<std::wstring> ReservedNamesMap;
|
||||||
ReservedNamesMap m_ReservedNames;
|
ReservedNamesMap m_ReservedNames;
|
||||||
|
|
|
||||||
107
src/game/Pet.cpp
107
src/game/Pet.cpp
|
|
@ -87,25 +87,25 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
QueryResult *result;
|
QueryResult *result;
|
||||||
|
|
||||||
if (petnumber)
|
if (petnumber)
|
||||||
// known petnumber entry 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// known petnumber entry 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||||
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
||||||
"FROM character_pet WHERE owner = '%u' AND id = '%u'",
|
"FROM character_pet WHERE owner = '%u' AND id = '%u'",
|
||||||
ownerid, petnumber);
|
ownerid, petnumber);
|
||||||
else if (current)
|
else if (current)
|
||||||
// current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||||
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
||||||
"FROM character_pet WHERE owner = '%u' AND slot = '%u'",
|
"FROM character_pet WHERE owner = '%u' AND slot = '%u'",
|
||||||
ownerid, PET_SAVE_AS_CURRENT );
|
ownerid, PET_SAVE_AS_CURRENT );
|
||||||
else if (petentry)
|
else if (petentry)
|
||||||
// known petentry entry (unique for summoned pet, but non unique for hunter pet (only from current or not stabled pets)
|
// known petentry entry (unique for summoned pet, but non unique for hunter pet (only from current or not stabled pets)
|
||||||
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||||
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
||||||
"FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '%u' OR slot > '%u') ",
|
"FROM character_pet WHERE owner = '%u' AND entry = '%u' AND (slot = '%u' OR slot > '%u') ",
|
||||||
ownerid, petentry,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
ownerid, petentry,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
||||||
else
|
else
|
||||||
// any current or other non-stabled pet (for hunter "call pet")
|
// any current or other non-stabled pet (for hunter "call pet")
|
||||||
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
||||||
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType "
|
||||||
"FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot > '%u') ",
|
"FROM character_pet WHERE owner = '%u' AND (slot = '%u' OR slot > '%u') ",
|
||||||
ownerid,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
ownerid,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
||||||
|
|
||||||
|
|
@ -122,7 +122,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32 summon_spell_id = fields[19].GetUInt32();
|
uint32 summon_spell_id = fields[18].GetUInt32();
|
||||||
SpellEntry const* spellInfo = sSpellStore.LookupEntry(summon_spell_id);
|
SpellEntry const* spellInfo = sSpellStore.LookupEntry(summon_spell_id);
|
||||||
|
|
||||||
bool is_temporary_summoned = spellInfo && GetSpellDuration(spellInfo) > 0;
|
bool is_temporary_summoned = spellInfo && GetSpellDuration(spellInfo) > 0;
|
||||||
|
|
@ -164,7 +164,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
setPetType(PetType(fields[20].GetUInt8()));
|
setPetType(PetType(fields[19].GetUInt8()));
|
||||||
SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->getFaction());
|
SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE, owner->getFaction());
|
||||||
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
|
SetUInt32Value(UNIT_CREATED_BY_SPELL, summon_spell_id);
|
||||||
|
|
||||||
|
|
@ -257,27 +257,13 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
++iter;
|
++iter;
|
||||||
m_charmInfo->GetActionBarEntry(index)->SpellOrAction = atol((*iter).c_str());
|
m_charmInfo->GetActionBarEntry(index)->SpellOrAction = atol((*iter).c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
//init teach spells
|
|
||||||
tokens = StrSplit(fields[15].GetString(), " ");
|
|
||||||
for (iter = tokens.begin(), index = 0; index < 4; ++iter, ++index)
|
|
||||||
{
|
|
||||||
uint32 tmp = atol((*iter).c_str());
|
|
||||||
|
|
||||||
++iter;
|
|
||||||
|
|
||||||
if(tmp)
|
|
||||||
AddTeachSpell(tmp, atol((*iter).c_str()));
|
|
||||||
else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// since last save (in seconds)
|
// since last save (in seconds)
|
||||||
uint32 timediff = (time(NULL) - fields[16].GetUInt32());
|
uint32 timediff = (time(NULL) - fields[15].GetUInt32());
|
||||||
|
|
||||||
m_resetTalentsCost = fields[17].GetUInt32();
|
m_resetTalentsCost = fields[16].GetUInt32();
|
||||||
m_resetTalentsTime = fields[18].GetUInt64();
|
m_resetTalentsTime = fields[17].GetUInt64();
|
||||||
|
|
||||||
delete result;
|
delete result;
|
||||||
|
|
||||||
|
|
@ -418,7 +404,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
|
||||||
owner,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
owner,PET_SAVE_AS_CURRENT,PET_SAVE_LAST_STABLE_SLOT);
|
||||||
// save pet
|
// save pet
|
||||||
std::ostringstream ss;
|
std::ostringstream ss;
|
||||||
ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, TeachSpelldata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
|
ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, talentpoints, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
|
||||||
<< "VALUES ("
|
<< "VALUES ("
|
||||||
<< m_charmInfo->GetPetNumber() << ", "
|
<< m_charmInfo->GetPetNumber() << ", "
|
||||||
<< GetEntry() << ", "
|
<< GetEntry() << ", "
|
||||||
|
|
@ -437,17 +423,6 @@ void Pet::SavePetToDB(PetSaveMode mode)
|
||||||
|
|
||||||
for(uint32 i = 0; i < 10; ++i)
|
for(uint32 i = 0; i < 10; ++i)
|
||||||
ss << uint32(m_charmInfo->GetActionBarEntry(i)->Type) << " " << uint32(m_charmInfo->GetActionBarEntry(i)->SpellOrAction) << " ";
|
ss << uint32(m_charmInfo->GetActionBarEntry(i)->Type) << " " << uint32(m_charmInfo->GetActionBarEntry(i)->SpellOrAction) << " ";
|
||||||
ss << "', '";
|
|
||||||
|
|
||||||
//save spells the pet can teach to it's Master
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
for(TeachSpellMap::const_iterator itr = m_teachspells.begin(); i < 4 && itr != m_teachspells.end(); ++i, ++itr)
|
|
||||||
ss << itr->first << " " << itr->second << " ";
|
|
||||||
for(; i < 4; ++i)
|
|
||||||
ss << uint32(0) << " " << uint32(0) << " ";
|
|
||||||
}
|
|
||||||
|
|
||||||
ss << "', "
|
ss << "', "
|
||||||
<< time(NULL) << ", "
|
<< time(NULL) << ", "
|
||||||
<< uint32(m_resetTalentsCost) << ", "
|
<< uint32(m_resetTalentsCost) << ", "
|
||||||
|
|
@ -1551,65 +1526,11 @@ void Pet::InitPetCreateSpells()
|
||||||
m_charmInfo->InitPetActionBar();
|
m_charmInfo->InitPetActionBar();
|
||||||
m_spells.clear();
|
m_spells.clear();
|
||||||
|
|
||||||
uint32 petspellid;
|
|
||||||
PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(GetEntry());
|
|
||||||
if(CreateSpells)
|
|
||||||
{
|
|
||||||
for(uint8 i = 0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
if(!CreateSpells->spellid[i])
|
|
||||||
break;
|
|
||||||
|
|
||||||
SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(CreateSpells->spellid[i]);
|
|
||||||
if(!learn_spellproto)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if(learn_spellproto->Effect[0] == SPELL_EFFECT_LEARN_SPELL || learn_spellproto->Effect[0] == SPELL_EFFECT_LEARN_PET_SPELL)
|
|
||||||
{
|
|
||||||
petspellid = learn_spellproto->EffectTriggerSpell[0];
|
|
||||||
Unit* owner = GetOwner();
|
|
||||||
if(owner->GetTypeId() == TYPEID_PLAYER && !((Player*)owner)->HasSpell(learn_spellproto->Id))
|
|
||||||
{
|
|
||||||
if(IsPassiveSpell(petspellid)) //learn passive skills when tamed, not sure if thats right
|
|
||||||
((Player*)owner)->learnSpell(learn_spellproto->Id,false);
|
|
||||||
else
|
|
||||||
AddTeachSpell(learn_spellproto->EffectTriggerSpell[0], learn_spellproto->Id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
petspellid = learn_spellproto->Id;
|
|
||||||
|
|
||||||
addSpell(petspellid);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LearnPetPassives();
|
LearnPetPassives();
|
||||||
|
|
||||||
CastPetAuras(false);
|
CastPetAuras(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Pet::CheckLearning(uint32 spellid)
|
|
||||||
{
|
|
||||||
//charmed case -> prevent crash
|
|
||||||
if(GetTypeId() == TYPEID_PLAYER || getPetType() != HUNTER_PET)
|
|
||||||
return;
|
|
||||||
|
|
||||||
Unit* owner = GetOwner();
|
|
||||||
|
|
||||||
if(m_teachspells.empty() || !owner || owner->GetTypeId() != TYPEID_PLAYER)
|
|
||||||
return;
|
|
||||||
|
|
||||||
TeachSpellMap::iterator itr = m_teachspells.find(spellid);
|
|
||||||
if(itr == m_teachspells.end())
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(urand(0, 100) < 10)
|
|
||||||
{
|
|
||||||
((Player*)owner)->learnSpell(itr->second,false);
|
|
||||||
m_teachspells.erase(itr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Pet::resetTalents(bool no_cost)
|
bool Pet::resetTalents(bool no_cost)
|
||||||
{
|
{
|
||||||
Unit *owner = GetOwner();
|
Unit *owner = GetOwner();
|
||||||
|
|
|
||||||
|
|
@ -107,7 +107,6 @@ enum PetNameInvalidReason
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef UNORDERED_MAP<uint32, PetSpell> PetSpellMap;
|
typedef UNORDERED_MAP<uint32, PetSpell> PetSpellMap;
|
||||||
typedef std::map<uint32,uint32> TeachSpellMap;
|
|
||||||
typedef std::vector<uint32> AutoSpellList;
|
typedef std::vector<uint32> AutoSpellList;
|
||||||
|
|
||||||
#define HAPPINESS_LEVEL_SIZE 333000
|
#define HAPPINESS_LEVEL_SIZE 333000
|
||||||
|
|
@ -183,7 +182,6 @@ class Pet : public Creature
|
||||||
void ToggleAutocast(uint32 spellid, bool apply);
|
void ToggleAutocast(uint32 spellid, bool apply);
|
||||||
|
|
||||||
bool HasSpell(uint32 spell) const;
|
bool HasSpell(uint32 spell) const;
|
||||||
void AddTeachSpell(uint32 learned_id, uint32 source_id) { m_teachspells[learned_id] = source_id; }
|
|
||||||
|
|
||||||
void LearnPetPassives();
|
void LearnPetPassives();
|
||||||
void CastPetAuras(bool current);
|
void CastPetAuras(bool current);
|
||||||
|
|
@ -204,11 +202,9 @@ class Pet : public Creature
|
||||||
bool removeSpell(uint32 spell_id, bool learn_prev);
|
bool removeSpell(uint32 spell_id, bool learn_prev);
|
||||||
|
|
||||||
PetSpellMap m_spells;
|
PetSpellMap m_spells;
|
||||||
TeachSpellMap m_teachspells;
|
|
||||||
AutoSpellList m_autospells;
|
AutoSpellList m_autospells;
|
||||||
|
|
||||||
void InitPetCreateSpells();
|
void InitPetCreateSpells();
|
||||||
void CheckLearning(uint32 spellid);
|
|
||||||
|
|
||||||
bool resetTalents(bool no_cost = false);
|
bool resetTalents(bool no_cost = false);
|
||||||
uint32 resetTalentsCost() const;
|
uint32 resetTalentsCost() const;
|
||||||
|
|
|
||||||
|
|
@ -273,8 +273,6 @@ void PetAI::UpdateAI(const uint32 diff)
|
||||||
}
|
}
|
||||||
|
|
||||||
m_creature->AddCreatureSpellCooldown(spell->m_spellInfo->Id);
|
m_creature->AddCreatureSpellCooldown(spell->m_spellInfo->Id);
|
||||||
if (m_creature->isPet())
|
|
||||||
((Pet*)m_creature)->CheckLearning(spell->m_spellInfo->Id);
|
|
||||||
|
|
||||||
spell->prepare(&targets);
|
spell->prepare(&targets);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -215,8 +215,6 @@ void WorldSession::HandlePetAction( WorldPacket & recv_data )
|
||||||
if(result == SPELL_CAST_OK)
|
if(result == SPELL_CAST_OK)
|
||||||
{
|
{
|
||||||
((Creature*)pet)->AddCreatureSpellCooldown(spellid);
|
((Creature*)pet)->AddCreatureSpellCooldown(spellid);
|
||||||
if (((Creature*)pet)->isPet())
|
|
||||||
((Pet*)pet)->CheckLearning(spellid);
|
|
||||||
|
|
||||||
unit_target = spell->m_targets.getUnitTarget();
|
unit_target = spell->m_targets.getUnitTarget();
|
||||||
|
|
||||||
|
|
@ -627,11 +625,9 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
|
||||||
pet->AddCreatureSpellCooldown(spellid);
|
pet->AddCreatureSpellCooldown(spellid);
|
||||||
if(pet->isPet())
|
if(pet->isPet())
|
||||||
{
|
{
|
||||||
Pet* p = (Pet*)pet;
|
|
||||||
p->CheckLearning(spellid);
|
|
||||||
//10% chance to play special pet attack talk, else growl
|
//10% chance to play special pet attack talk, else growl
|
||||||
//actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell
|
//actually this only seems to happen on special spells, fire shield for imp, torment for voidwalker, but it's stupid to check every spell
|
||||||
if(p->getPetType() == SUMMON_PET && (urand(0, 100) < 10))
|
if(((Pet*)pet)->getPetType() == SUMMON_PET && (urand(0, 100) < 10))
|
||||||
pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL);
|
pet->SendPetTalk((uint32)PET_TALK_SPECIAL_SPELL);
|
||||||
else
|
else
|
||||||
pet->SendPetAIReaction(guid);
|
pet->SendPetAIReaction(guid);
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7886"
|
#define REVISION_NR "7887"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue