rendered paste bodybool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool current ){ uint32 ownerid = owner->GetGUIDLow(); QueryResult *result; 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 21 22 result = sDatabase.PQuery("SELECT `id`,`entry`,`owner`,`modelid`,`level`,`exp`,`nextlvlexp`,`Reactstate`,`Commandstate`,`loyaltypoints`,`loyalty`,`trainpoint`,`slot`,`name`,`renamed`,`curhealth`,`curmana`,`curhappiness`,`ABData`,`TeachSpelldata`,`savetime`,`resettalents_cost`,`resettalents_time` FROM `character_pet` WHERE `owner` = '%u' AND `slot` = '0'",ownerid ); else 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 21 22 result = sDatabase.PQuery("SELECT `id`,`entry`,`owner`,`modelid`,`level`,`exp`,`nextlvlexp`,`Reactstate`,`Commandstate`,`loyaltypoints`,`loyalty`,`trainpoint`,`slot`,`name`,`renamed`,`curhealth`,`curmana`,`curhappiness`,`ABData`,`TeachSpelldata`,`savetime`,`resettalents_cost`,`resettalents_time` FROM `character_pet` WHERE `owner` = '%u' AND `id` = '%u'",ownerid, petnumber); else if(petentry) // 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 21 22 result = sDatabase.PQuery("SELECT `id`,`entry`,`owner`,`modelid`,`level`,`exp`,`nextlvlexp`,`Reactstate`,`Commandstate`,`loyaltypoints`,`loyalty`,`trainpoint`,`slot`,`name`,`renamed`,`curhealth`,`curmana`,`curhappiness`,`ABData`,`TeachSpelldata`,`savetime`,`resettalents_cost`,`resettalents_time` FROM `character_pet` WHERE `owner` = '%u' AND `entry` = '%u' AND (`slot` = '0' OR `slot` = '3') ",ownerid, petentry ); else // 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 21 22 result = sDatabase.PQuery("SELECT `id`,`entry`,`owner`,`modelid`,`level`,`exp`,`nextlvlexp`,`Reactstate`,`Commandstate`,`loyaltypoints`,`loyalty`,`trainpoint`,`slot`,`name`,`renamed`,`curhealth`,`curmana`,`curhappiness`,`ABData`,`TeachSpelldata`,`savetime`,`resettalents_cost`,`resettalents_time` FROM `character_pet` WHERE `owner` = '%u' AND (`slot` = '0' OR `slot` = '3') ",ownerid); if(!result) return false; Field *fields = result->Fetch(); // update for case of current pet "slot = 0" petentry = fields[1].GetUInt32(); if(!petentry) return false; float px, py, pz; owner->GetClosePoint(NULL, px, py, pz,PET_FOLLOW_DIST,PET_FOLLOW_ANGLE); uint32 guid=objmgr.GenerateLowGuid(HIGHGUID_UNIT); if(!Create(guid, owner->GetMapId(), px, py, pz, owner->GetOrientation(), petentry)) { delete result; return false; } SetUInt32Value(UNIT_FIELD_FACTIONTEMPLATE,owner->getFaction()); CreatureInfo const *cinfo = GetCreatureInfo(); if(cinfo->type == CREATURE_TYPE_CRITTER) { AIM_Initialize(); AddToWorld(); MapManager::Instance().GetMap(owner->GetMapId(), owner)->Add((Creature*)this); return true; } SetUInt32Value(UNIT_FIELD_PETNUMBER, fields[0].GetUInt32() ); SetUInt64Value(UNIT_FIELD_SUMMONEDBY, owner->GetGUID()); SetUInt64Value(UNIT_FIELD_DISPLAYID, fields[3].GetUInt32()); SetUInt64Value(UNIT_FIELD_NATIVEDISPLAYID, fields[3].GetUInt32()); uint32 petlevel=fields[4].GetUInt32(); SetUInt32Value(UNIT_NPC_FLAGS , 0); SetName(fields[13].GetString()); switch(getPetType()) { case SUMMON_PET: petlevel=owner->getLevel(); SetUInt32Value(UNIT_FIELD_BYTES_0,2048); SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN1); // this enables popup window (pet dismiss, cancel) break; case HUNTER_PET: SetUInt32Value(UNIT_FIELD_BYTES_0, 0x2020100); //?? SetUInt32Value(UNIT_FIELD_BYTES_1,(fields[10].GetUInt32()<<8)); SetUInt32Value(UNIT_FIELD_BYTES_2, 0x00022801); // can't be renamed (byte (0x02)) SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN1);// + UNIT_FLAG_RESTING); // this enables popup window (pet abandon, cancel) // pet not renamed yet, let rename if wont if(!fields[14].GetBool()) { //SetUInt32Value(UNIT_FIELD_BYTES_2, uint32(0x03 << 16)); // check it... SetUInt32Value(UNIT_FIELD_BYTES_2, 0x00032801); // 0x03 //SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_RENAME); // old, not working... } SetTP(fields[11].GetInt32()); SetMaxPower(POWER_HAPPINESS,1000000); SetPower( POWER_HAPPINESS,fields[17].GetUInt32()); setPowerType(POWER_FOCUS); break; default: sLog.outError("Pet have incorrect type (%u) for pet loading.",getPetType()); } InitStatsForLevel( petlevel); SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL)); SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32()); SetUInt32Value(UNIT_FIELD_PETNEXTLEVELEXP, fields[6].GetUInt32()); SetUInt64Value(UNIT_FIELD_CREATEDBY, owner->GetGUID()); m_ReactSate = fields[7].GetUInt32(); m_CommandState = fields[8].GetUInt32(); m_loyaltyPoints = fields[9].GetInt32(); uint32 savedhealth = fields[15].GetUInt32(); uint32 savedmana = fields[16].GetUInt32(); // set current pet as current if(fields[12].GetUInt32() != 0) { sDatabase.BeginTransaction(); sDatabase.PExecute("UPDATE `character_pet` SET `slot` = '3' WHERE `owner` = '%u' AND `slot` = '0' AND `id` <=> '%u'",ownerid, GetPetNumber()); sDatabase.PExecute("UPDATE `character_pet` SET `slot` = '0' WHERE `owner` = '%u' AND `id` = '%u'",ownerid, GetPetNumber()); sDatabase.CommitTransaction(); } //init AB vector<string> tokens = StrSplit(fields[18].GetString(), " "); if(tokens.size() != 20) return false; vector<string>::iterator iter; int index; for (iter = tokens.begin(), index = 0; index < 10; ++iter, ++index) { PetActionBar[index].Type = atol((*iter).c_str()); ++iter; PetActionBar[index].SpellOrAction = atol((*iter).c_str()); } //init teach spells tokens = StrSplit(fields[19].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; } delete result; //load spells/cooldowns/auras // since last save (in seconds) uint32 timediff = (time(NULL) - fields[20].GetUInt32()); //InitStatsForLevel(getLevel()); _ApplyAllOwnerMods(); _LoadAuras(timediff); _LoadSpells(timediff); _LoadSpellCooldowns(); if(getPetType() == SUMMON_PET && !current) //all (?) summon pets come with full health when called, but not when they are current { SetHealth(GetMaxHealth()); SetPower(POWER_MANA, GetMaxPower(POWER_MANA)); } else { SetHealth(savedhealth > GetMaxHealth() ? GetMaxHealth() : savedhealth); SetPower(POWER_MANA, savedmana > GetMaxPower(POWER_MANA) ? GetMaxPower(POWER_MANA) : savedmana); } ObjectAccessor::Instance().AddPet(this); AIM_Initialize(); AddToWorld(); MapManager::Instance().GetMap(owner->GetMapId(), owner)->Add((Creature*)this); owner->SetPet(this); // in DB stored only full controlled creature sLog.outDebug("New Pet has guid %u", GetGUIDLow()); if(owner->GetTypeId() == TYPEID_PLAYER) ((Player*)owner)->PetSpellInitialize(); return true;}