Index: src/game/Creature.h =================================================================== --- src/game/Creature.h (revision 4097) +++ src/game/Creature.h (working copy) @@ -218,6 +218,7 @@ char const* AIName; uint32 MovementType; uint32 InhabitType; + uint32 SpellDataId; char const* ScriptName; uint32 randomDisplayID() const; Index: src/game/ObjectMgr.cpp =================================================================== --- src/game/ObjectMgr.cpp (revision 4097) +++ src/game/ObjectMgr.cpp (working copy) @@ -1973,7 +1973,7 @@ { if(db_node->skill != dbc_node.skill) sLog.outErrorDb("Spell %u auto-learn skill %u in spell.dbc but learn skill %u in `spell_learn_skill`, fix DB.", - spell,dbc_node.skill,db_node->skill); + spell,dbc_node.skill,db_node->skill); continue; // skip already added spell-skill pair } @@ -2091,6 +2091,7 @@ void ObjectMgr::LoadPetCreateSpells() { + /* QueryResult *result = sDatabase.PQuery("SELECT `entry`, `Spell1`, `Spell2`, `Spell3`, `Spell4`,`FamilyPassive` FROM `petcreateinfo_spell`"); if(!result) { @@ -2140,7 +2141,7 @@ delete result; sLog.outString( "" ); - sLog.outString( ">> Loaded %u pet create spells", count ); + sLog.outString( ">> Loaded %u pet create spells", count );*/ } void ObjectMgr::LoadScripts(ScriptMapMap& scripts, char const* tablename) Index: src/game/Pet.cpp =================================================================== --- src/game/Pet.cpp (revision 4097) +++ src/game/Pet.cpp (working copy) @@ -405,36 +405,6 @@ } } -/*void Pet::SendPetQuery() -{ - Unit *player = GetOwner(); - if(player->GetTypeId() != TYPEID_PLAYER) - return; - char *subname = "Pet"; - CreatureInfo *ci = objmgr.GetCreatureTemplate(GetEntry()); - - WorldPacket data( SMSG_CREATURE_QUERY_RESPONSE, 4+m_name.size()+1+3+strlen(subname)+1+4+4+4+4+4+4+4+2); - data << (uint32)GetEntry(); - data << m_name.c_str(); - data << uint8(0) << uint8(0) << uint8(0); - data << subname; - - uint32 wdbFeild11=0,wdbFeild12=0; - - data << ci->flag1; //flags wdbFeild7=wad flags1 - data << uint32(ci->type); //creatureType wdbFeild8 - data << (uint32)ci->family; //family wdbFeild9 - data << (uint32)ci->rank; //rank wdbFeild10 - data << (uint32)wdbFeild11; //unknow wdbFeild11 - data << (uint32)wdbFeild12; //unknow wdbFeild12 - data << ci->DisplayID; //DisplayID wdbFeild13 - - data << (uint16)ci->civilian; //wdbFeild14 - - player->GetSession()->SendPacket( &data ); -} -*/ - void Pet::setDeathState(DeathState s) // overwrite virtual Creature::setDeathState and Unit::setDeathState { Creature::setDeathState(s); @@ -1492,61 +1462,57 @@ void Pet::InitPetCreateSpells() { - for(uint32 i = 0; i < 3; i++) //init pet action bar + for(uint32 i = 0; i < 3; i++) //init pet action bar { - PetActionBar[i].Type = ACT_COMMAND; - PetActionBar[i].SpellOrAction = 2 - i; + PetActionBar[i].Type = ACT_COMMAND; + PetActionBar[i].SpellOrAction = 2 - i; - PetActionBar[i + 7].Type = ACT_REACTION; - PetActionBar[i + 7].SpellOrAction = 2 - i; - } - for(uint32 i=0; i < 4; i++) //init pet action bar - { + PetActionBar[i + 7].Type = ACT_REACTION; + PetActionBar[i + 7].SpellOrAction = 2 - i; + } + + for(uint32 i=0; i < 4; i++) //init pet action bar + { PetActionBar[i + 3].Type = ACT_DISABLED; PetActionBar[i + 3].SpellOrAction = 0; - } + } - m_spells.clear(); - int32 usedtrainpoints = 0, petspellid; - PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(GetEntry()); - if(CreateSpells) - { - for(uint8 i = 0; i < 4; i++) - { - if(!CreateSpells->spellid[i]) - break; + m_spells.clear(); + int32 usedtrainpoints = 0, petspellid; + CreatureInfo const* cInfo = sCreatureStorage.LookupEntry(GetEntry()); + if(cInfo) + { + CreatureSpellDataEntry const* CreateSpells = sCreatureSpellDataStore.LookupEntry(cInfo->SpellDataId); + if (CreateSpells) + { + for(uint8 i = 0; i < 4; i++) + { + SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(CreateSpells->spellid[i]); + if(!learn_spellproto) + continue; - SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(CreateSpells->spellid[i]); - if(!learn_spellproto) - continue; + petspellid = learn_spellproto->Id; + if(GetOwner()->GetTypeId() == TYPEID_PLAYER && !((Player*)GetOwner())->HasSpell(petspellid)) + { + AddTeachSpell(petspellid, CreateSpells->spellid[i]); + } + PetActionBar[i + 3].Type = ACT_ENABLED; + PetActionBar[i + 3].SpellOrAction = petspellid; + addSpell(petspellid,ACT_ENABLED); - if(learn_spellproto->Effect[0] == SPELL_EFFECT_LEARN_SPELL || learn_spellproto->Effect[0] == SPELL_EFFECT_LEARN_PET_SPELL) - { - petspellid = learn_spellproto->EffectTriggerSpell[0]; - if(GetOwner()->GetTypeId() == TYPEID_PLAYER && !((Player*)GetOwner())->HasSpell(learn_spellproto->Id)) - { - if(IsPassiveSpell(petspellid)) //learn passive skills when tamed, not sure if thats right - ((Player*)GetOwner())->learnSpell(learn_spellproto->Id); - else - AddTeachSpell(learn_spellproto->EffectTriggerSpell[0], learn_spellproto->Id); - } - } - else - petspellid = learn_spellproto->Id; - - addSpell(petspellid); - - SkillLineAbilityEntry const *Ability = sSkillLineAbilityStore.LookupEntry(learn_spellproto->EffectTriggerSpell[0]); - if(Ability) - usedtrainpoints += Ability->reqtrainpoints; - } - - //family passive - SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(CreateSpells->familypassive); - if(learn_spellproto) - addSpell(CreateSpells->familypassive); - } - SetTP(-usedtrainpoints); + SkillLineAbilityEntry const *Ability = sSkillLineAbilityStore.LookupEntry(petspellid); + if(Ability) + usedtrainpoints += Ability->reqtrainpoints; + } + + //family passive + uint32 familypassive = FamilyToPassiveSpell(cInfo->family); + SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(familypassive); + if(learn_spellproto) + addSpell(familypassive); + } + } + SetTP(-usedtrainpoints); } void Pet::CheckLearning(uint32 spellid) Index: src/game/Pet.h =================================================================== --- src/game/Pet.h (revision 4097) +++ src/game/Pet.h (working copy) @@ -112,6 +112,44 @@ PET_TALK_ATTACK = 1 }; +inline uint32 FamilyToPassiveSpell(uint8 family) +{ + switch(family) + { + case CREATURE_FAMILY_WOLF: return 17223; + case CREATURE_FAMILY_CAT: return 17210; + case CREATURE_FAMILY_SPIDER: return 17219; + case CREATURE_FAMILY_BEAR: return 17208; + case CREATURE_FAMILY_BOAR: return 7000; + case CREATURE_FAMILY_CROCILISK: return 17212; + case CREATURE_FAMILY_CARRION_BIRD: return 17209; + case CREATURE_FAMILY_CRAB: return 17211; + case CREATURE_FAMILY_GORILLA: return 17214; + case CREATURE_FAMILY_RAPTOR: return 17217; + case CREATURE_FAMILY_TALLSTRIDER: return 17220; + case CREATURE_FAMILY_FELHUNTER: return 0; + case CREATURE_FAMILY_VOIDWALKER: return 0; + case CREATURE_FAMILY_SUCCUBUS: return 0; + case CREATURE_FAMILY_DOOMGUARD: return 0; + case CREATURE_FAMILY_SCORPID: return 17218; + case CREATURE_FAMILY_TURTLE: return 17221; + case CREATURE_FAMILY_IMP: return 0; + case CREATURE_FAMILY_BAT: return 17206; + case CREATURE_FAMILY_HYENA: return 17215; + case CREATURE_FAMILY_OWL: return 17216; + case CREATURE_FAMILY_WIND_SERPENT: return 17222; + case CREATURE_FAMILY_REMOTE_CONTROL: return 0; + case CREATURE_FAMILY_FELGUARD: return 0; + case CREATURE_FAMILY_DRAGONHAWK: return 34887; + case CREATURE_FAMILY_RAVAGER: return 35257; + case CREATURE_FAMILY_WARP_STALKER: return 35254; + case CREATURE_FAMILY_SPOREBAT: return 35258; + case CREATURE_FAMILY_NETHER_RAY: return 35253; + case CREATURE_FAMILY_SERPENT: return 35386; + } + return 0; +} + typedef HM_NAMESPACE::hash_map PetSpellMap; typedef std::map TeachSpellMap; typedef std::set AutoSpellList; Index: src/game/PetHandler.cpp =================================================================== --- src/game/PetHandler.cpp (revision 4097) +++ src/game/PetHandler.cpp (working copy) @@ -457,15 +457,15 @@ ((Pet*)pet)->PetActionBar[i].SpellOrAction = 0; } - //still keep passive + /*//still keep passive PetCreateSpellEntry const* CreateSpells = objmgr.GetPetCreateSpellEntry(pet->GetEntry()); SpellEntry const *learn_spellproto = sSpellStore.LookupEntry(CreateSpells->familypassive); if(learn_spellproto) - ((Pet*)pet)->addSpell(CreateSpells->familypassive); - + ((Pet*)pet)->addSpell(CreateSpells->familypassive);*/ ((Pet*)pet)->m_resetTalentsTime = time(NULL); ((Pet*)pet)->m_resetTalentsCost = cost; GetPlayer()->ModifyMoney(-(int32)cost); + ((Pet*)pet)->InitPetCreateSpells(); GetPlayer()->PetSpellInitialize(); } Index: src/game/QueryHandler.cpp =================================================================== --- src/game/QueryHandler.cpp (revision 4097) +++ src/game/QueryHandler.cpp (working copy) @@ -148,13 +148,15 @@ data << (uint32)ci->family; // family wdbFeild9 data << (uint32)(unit && unit->isPet() ? 0 : ci->rank); // rank wdbFeild10 data << uint32(0); // unknown wdbFeild11 - data << uint32(0); // unknown wdbFeild12 + data << (uint32)ci->SpellDataId; // SpellDataId wdbFeild12 + data << (uint32)ci->DisplayID_f; //DisplayID wdbFeild13 + /*wrong: in offi creaturecache.wdb DisplayID == ci->DisplayID_f if (unit) data << unit->GetUInt32Value(UNIT_FIELD_DISPLAYID); //DisplayID wdbFeild13 else - data << (uint32)ci->randomDisplayID(); - + data << (uint32)ci->randomDisplayID();*/ + data << (float)1; // unk data << (float)1; // unk data << uint8(ci->civilian); Index: src/shared/Database/Database.cpp =================================================================== --- src/shared/Database/Database.cpp (revision 4097) +++ src/shared/Database/Database.cpp (working copy) @@ -101,4 +101,4 @@ } return Execute(szQuery); -} \ No newline at end of file +} Index: src/shared/Database/DatabaseMysql.cpp =================================================================== --- src/shared/Database/DatabaseMysql.cpp (revision 4097) +++ src/shared/Database/DatabaseMysql.cpp (working copy) @@ -383,4 +383,4 @@ m_delayThread->wait(); //Wait for flush to DB delete m_delayThread; //This also deletes m_threadBody m_delayThread = NULL; -} \ No newline at end of file +} Index: src/shared/Database/DBCfmt.cpp =================================================================== --- src/shared/Database/DBCfmt.cpp (revision 4097) +++ src/shared/Database/DBCfmt.cpp (working copy) @@ -23,6 +23,7 @@ const char ChrClassesEntryfmt[]="nxixxxxxxxxxxxxxxxxxxxxx"; const char ChrRacesEntryfmt[]="nxixiixxixxxxissssssssssssssssxxxxx"; const char CreatureFamilyfmt[]="nxxxxxiissssssssssssssssxx"; +const char CreatureSpellDatafmt[]="niiiixxxx"; const char DurabilityCostsfmt[]="niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; const char DurabilityQualityfmt[]="nf"; const char EmoteEntryfmt[]="nxixxxxxxxxxxxxxxxx"; Index: src/shared/Database/DBCStores.cpp =================================================================== --- src/shared/Database/DBCStores.cpp (revision 4097) +++ src/shared/Database/DBCStores.cpp (working copy) @@ -39,6 +39,7 @@ DBCStorage sChrClassesStore(ChrClassesEntryfmt); DBCStorage sChrRacesStore(ChrRacesEntryfmt); DBCStorage sCreatureFamilyStore(CreatureFamilyfmt); +DBCStorage sCreatureSpellDataStore(CreatureSpellDatafmt); DBCStorage sDurabilityQualityStore(DurabilityQualityfmt); DBCStorage sDurabilityCostsStore(DurabilityCostsfmt); @@ -145,7 +146,7 @@ { std::string tmpPath=""; - const uint32 DBCFilesCount = 35; + const uint32 DBCFilesCount = 36; barGoLink bar( DBCFilesCount ); @@ -158,6 +159,7 @@ LoadDBC(bar,bad_dbc_files,sChrClassesStore, dataPath+"dbc/ChrClasses.dbc"); LoadDBC(bar,bad_dbc_files,sChrRacesStore, dataPath+"dbc/ChrRaces.dbc"); LoadDBC(bar,bad_dbc_files,sCreatureFamilyStore, dataPath+"dbc/CreatureFamily.dbc"); + LoadDBC(bar,bad_dbc_files,sCreatureSpellDataStore, dataPath+"dbc/CreatureSpellData.dbc"); LoadDBC(bar,bad_dbc_files,sDurabilityCostsStore, dataPath+"dbc/DurabilityCosts.dbc"); LoadDBC(bar,bad_dbc_files,sDurabilityQualityStore, dataPath+"dbc/DurabilityQuality.dbc"); LoadDBC(bar,bad_dbc_files,sEmotesTextStore, dataPath+"dbc/EmotesText.dbc"); Index: src/shared/Database/DBCStores.h =================================================================== --- src/shared/Database/DBCStores.h (revision 4097) +++ src/shared/Database/DBCStores.h (working copy) @@ -140,6 +140,7 @@ extern DBCStorage sChrClassesStore; extern DBCStorage sChrRacesStore; extern DBCStorage sCreatureFamilyStore; +extern DBCStorage sCreatureSpellDataStore; extern DBCStorage sDurabilityCostsStore; extern DBCStorage sDurabilityQualityStore; extern DBCStorage sCastTimesStore; Index: src/shared/Database/DBCStructure.h =================================================================== --- src/shared/Database/DBCStructure.h (revision 4097) +++ src/shared/Database/DBCStructure.h (working copy) @@ -116,6 +116,12 @@ // 24 string flags, unused }; +struct CreatureSpellDataEntry +{ + uint32 ID; // 0 + uint32 spellid[4]; // 1-4 spells + // 4-7 unused +}; struct DurabilityCostsEntry { uint32 Itemlvl; // 0 Index: src/shared/Database/SQLStorage.cpp =================================================================== --- src/shared/Database/SQLStorage.cpp (revision 4097) +++ src/shared/Database/SQLStorage.cpp (working copy) @@ -23,7 +23,7 @@ extern DatabaseMysql sDatabase; -const char CreatureInfofmt[]="iiissiiiiiiiiififfiiiiififiiiiffifiiiiiiiiiiiiiiiiiiiiiiiiiiisiis"; +const char CreatureInfofmt[]="iiissiiiiiiiiififfiiiiififiiiiffifiiiiiiiiiiiiiiiiiiiiiiiiiiisiiis"; const char CreatureDataAddonInfofmt[]="iiiiiiiiiiii"; const char GameObjectInfofmt[]="iiisiifiiiiiiiiiiiiiiiiiiiiiiiis"; const char ItemPrototypefmt[]="iiiisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffiffiffiffiffiiiiiiiiiifiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiiiiiiiiiiiiiiiiiiiiiiiiiifsi";