mirror of
https://github.com/mangosfour/server.git
synced 2025-12-16 13:37:00 +00:00
[7903] Load and save for pets only talents. Not store unused (in fact) free talent point amount.
* Other pet spell types auto-learned at level setup/load. * Code will cleanup pet_spell table from non-talents spell if detect any at load. * Free talents points recalculated at loading and levelup so store its in DB useless. Note: bug with not highlighting learned pet talents (except first line) until learn one more talent not fixed.
This commit is contained in:
parent
c87e51dae5
commit
0614a9eb75
6 changed files with 48 additions and 29 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_7887_01_characters_character_pet` bit(1) default NULL
|
`required_7903_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';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -472,7 +472,6 @@ CREATE TABLE `character_pet` (
|
||||||
`level` int(11) unsigned NOT NULL default '1',
|
`level` int(11) unsigned NOT NULL default '1',
|
||||||
`exp` int(11) unsigned NOT NULL default '0',
|
`exp` int(11) unsigned NOT NULL default '0',
|
||||||
`Reactstate` tinyint(1) unsigned NOT NULL default '0',
|
`Reactstate` tinyint(1) unsigned NOT NULL default '0',
|
||||||
`talentpoints` int(11) unsigned NOT NULL default '0',
|
|
||||||
`name` varchar(100) default 'Pet',
|
`name` varchar(100) default 'Pet',
|
||||||
`renamed` tinyint(1) unsigned NOT NULL default '0',
|
`renamed` tinyint(1) unsigned NOT NULL default '0',
|
||||||
`slot` int(11) unsigned NOT NULL default '0',
|
`slot` int(11) unsigned NOT NULL default '0',
|
||||||
|
|
|
||||||
4
sql/updates/7903_01_characters_character_pet.sql
Normal file
4
sql/updates/7903_01_characters_character_pet.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE character_db_version CHANGE COLUMN required_7887_01_characters_character_pet required_7903_01_characters_character_pet bit;
|
||||||
|
|
||||||
|
ALTER TABLE `character_pet`
|
||||||
|
DROP `talentpoints`;
|
||||||
|
|
@ -203,6 +203,7 @@ pkgdata_DATA = \
|
||||||
7896_01_mangos_creature_template.sql \
|
7896_01_mangos_creature_template.sql \
|
||||||
7902_01_mangos_pool_creature.sql \
|
7902_01_mangos_pool_creature.sql \
|
||||||
7902_02_mangos_pool_gameobject.sql \
|
7902_02_mangos_pool_gameobject.sql \
|
||||||
|
7903_01_characters_character_pet.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -386,4 +387,5 @@ EXTRA_DIST = \
|
||||||
7896_01_mangos_creature_template.sql \
|
7896_01_mangos_creature_template.sql \
|
||||||
7902_01_mangos_pool_creature.sql \
|
7902_01_mangos_pool_creature.sql \
|
||||||
7902_02_mangos_pool_gameobject.sql \
|
7902_02_mangos_pool_gameobject.sql \
|
||||||
|
7903_01_characters_character_pet.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -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
|
// known petnumber entry 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
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 "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, 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
|
// current pet (slot 0) 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
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 "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, 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
|
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
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 "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, 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
|
// 0 1 2(?) 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
||||||
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 "
|
result = CharacterDatabase.PQuery("SELECT id, entry, owner, modelid, level, exp, Reactstate, 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[18].GetUInt32();
|
uint32 summon_spell_id = fields[17].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[19].GetUInt8()));
|
setPetType(PetType(fields[18].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);
|
||||||
|
|
||||||
|
|
@ -184,7 +184,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
SetNativeDisplayId(fields[3].GetUInt32());
|
SetNativeDisplayId(fields[3].GetUInt32());
|
||||||
uint32 petlevel = fields[4].GetUInt32();
|
uint32 petlevel = fields[4].GetUInt32();
|
||||||
SetUInt32Value(UNIT_NPC_FLAGS, 0);
|
SetUInt32Value(UNIT_NPC_FLAGS, 0);
|
||||||
SetName(fields[9].GetString());
|
SetName(fields[8].GetString());
|
||||||
|
|
||||||
switch (getPetType())
|
switch (getPetType())
|
||||||
{
|
{
|
||||||
|
|
@ -197,14 +197,13 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
break;
|
break;
|
||||||
case HUNTER_PET:
|
case HUNTER_PET:
|
||||||
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
|
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
|
||||||
SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[7].GetUInt32());
|
|
||||||
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
|
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE);
|
||||||
SetByteValue(UNIT_FIELD_BYTES_2, 2, fields[10].GetBool() ? UNIT_RENAME_NOT_ALLOWED : UNIT_RENAME_ALLOWED);
|
SetByteValue(UNIT_FIELD_BYTES_2, 2, fields[9].GetBool() ? UNIT_RENAME_NOT_ALLOWED : UNIT_RENAME_ALLOWED);
|
||||||
|
|
||||||
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
||||||
// this enables popup window (pet abandon, cancel)
|
// this enables popup window (pet abandon, cancel)
|
||||||
SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS));
|
SetMaxPower(POWER_HAPPINESS, GetCreatePowers(POWER_HAPPINESS));
|
||||||
SetPower(POWER_HAPPINESS, fields[13].GetUInt32());
|
SetPower(POWER_HAPPINESS, fields[12].GetUInt32());
|
||||||
setPowerType(POWER_FOCUS);
|
setPowerType(POWER_FOCUS);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -215,20 +214,22 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
SetPvP(true);
|
SetPvP(true);
|
||||||
|
|
||||||
InitStatsForLevel(petlevel);
|
InitStatsForLevel(petlevel);
|
||||||
|
InitTalentForLevel(); // set original talents points before spell loading
|
||||||
|
|
||||||
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
|
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
|
||||||
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
|
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
|
||||||
SetCreatorGUID(owner->GetGUID());
|
SetCreatorGUID(owner->GetGUID());
|
||||||
|
|
||||||
m_charmInfo->SetReactState(ReactStates(fields[6].GetUInt8()));
|
m_charmInfo->SetReactState(ReactStates(fields[6].GetUInt8()));
|
||||||
|
|
||||||
uint32 savedhealth = fields[11].GetUInt32();
|
uint32 savedhealth = fields[10].GetUInt32();
|
||||||
uint32 savedmana = fields[12].GetUInt32();
|
uint32 savedmana = fields[11].GetUInt32();
|
||||||
|
|
||||||
// set current pet as current
|
// set current pet as current
|
||||||
// 0=current
|
// 0=current
|
||||||
// 1..MAX_PET_STABLES in stable slot
|
// 1..MAX_PET_STABLES in stable slot
|
||||||
// PET_SAVE_NOT_IN_SLOT(100) = not stable slot (summoning))
|
// PET_SAVE_NOT_IN_SLOT(100) = not stable slot (summoning))
|
||||||
if (fields[8].GetUInt32() != 0)
|
if (fields[7].GetUInt32() != 0)
|
||||||
{
|
{
|
||||||
CharacterDatabase.BeginTransaction();
|
CharacterDatabase.BeginTransaction();
|
||||||
CharacterDatabase.PExecute("UPDATE character_pet SET slot = '%u' WHERE owner = '%u' AND slot = '%u' AND id <> '%u'",
|
CharacterDatabase.PExecute("UPDATE character_pet SET slot = '%u' WHERE owner = '%u' AND slot = '%u' AND id <> '%u'",
|
||||||
|
|
@ -240,7 +241,7 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
|
|
||||||
if (!is_temporary_summoned)
|
if (!is_temporary_summoned)
|
||||||
{
|
{
|
||||||
if(!m_charmInfo->LoadActionBar(fields[14].GetCppString()))
|
if(!m_charmInfo->LoadActionBar(fields[13].GetCppString()))
|
||||||
{
|
{
|
||||||
delete result;
|
delete result;
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -248,10 +249,10 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// since last save (in seconds)
|
// since last save (in seconds)
|
||||||
uint32 timediff = (time(NULL) - fields[15].GetUInt32());
|
uint32 timediff = (time(NULL) - fields[14].GetUInt32());
|
||||||
|
|
||||||
m_resetTalentsCost = fields[16].GetUInt32();
|
m_resetTalentsCost = fields[15].GetUInt32();
|
||||||
m_resetTalentsTime = fields[17].GetUInt64();
|
m_resetTalentsTime = fields[16].GetUInt64();
|
||||||
|
|
||||||
delete result;
|
delete result;
|
||||||
|
|
||||||
|
|
@ -394,7 +395,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, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
|
ss << "INSERT INTO character_pet ( id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, curhappiness, abdata, savetime, resettalents_cost, resettalents_time, CreatedBySpell, PetType) "
|
||||||
<< "VALUES ("
|
<< "VALUES ("
|
||||||
<< m_charmInfo->GetPetNumber() << ", "
|
<< m_charmInfo->GetPetNumber() << ", "
|
||||||
<< GetEntry() << ", "
|
<< GetEntry() << ", "
|
||||||
|
|
@ -403,7 +404,6 @@ void Pet::SavePetToDB(PetSaveMode mode)
|
||||||
<< getLevel() << ", "
|
<< getLevel() << ", "
|
||||||
<< GetUInt32Value(UNIT_FIELD_PETEXPERIENCE) << ", "
|
<< GetUInt32Value(UNIT_FIELD_PETEXPERIENCE) << ", "
|
||||||
<< uint32(m_charmInfo->GetReactState()) << ", "
|
<< uint32(m_charmInfo->GetReactState()) << ", "
|
||||||
<< uint32(GetFreeTalentPoints()) << ", "
|
|
||||||
<< uint32(mode) << ", '"
|
<< uint32(mode) << ", '"
|
||||||
<< name.c_str() << "', "
|
<< name.c_str() << "', "
|
||||||
<< uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", "
|
<< uint32((GetByteValue(UNIT_FIELD_BYTES_2, 2) == UNIT_RENAME_ALLOWED)?0:1) << ", "
|
||||||
|
|
@ -1093,7 +1093,17 @@ void Pet::_LoadSpells()
|
||||||
{
|
{
|
||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
|
|
||||||
addSpell(fields[0].GetUInt32(), ActiveStates(fields[1].GetUInt16()), PETSPELL_UNCHANGED);
|
uint32 spell_id = fields[0].GetUInt32();
|
||||||
|
|
||||||
|
// load only pet talents, other spell types auto-learned
|
||||||
|
if(GetTalentSpellCost(spell_id)==0)
|
||||||
|
{
|
||||||
|
CharacterDatabase.PExecute("DELETE FROM pet_spell WHERE spell = '%u'",spell_id);
|
||||||
|
sLog.outError("Table `pet_spell` have non-talent spell %u , spell removed from table for all pets.",spell_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
addSpell(spell_id, ActiveStates(fields[1].GetUInt16()), PETSPELL_UNCHANGED,PETSPELL_TALENT);
|
||||||
}
|
}
|
||||||
while( result->NextRow() );
|
while( result->NextRow() );
|
||||||
|
|
||||||
|
|
@ -1107,8 +1117,8 @@ void Pet::_SaveSpells()
|
||||||
{
|
{
|
||||||
++next;
|
++next;
|
||||||
|
|
||||||
// prevent saving family passives to DB
|
// save only talent spells for pets, other spells auto-applied
|
||||||
if (itr->second.type == PETSPELL_FAMILY)
|
if (itr->second.type != PETSPELL_TALENT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
switch(itr->second.state)
|
switch(itr->second.state)
|
||||||
|
|
@ -1319,6 +1329,9 @@ bool Pet::addSpell(uint32 spell_id,ActiveStates active /*= ACT_DECIDE*/, PetSpel
|
||||||
// talent: unlearn all other talent ranks (high and low)
|
// talent: unlearn all other talent ranks (high and low)
|
||||||
if(TalentSpellPos const* talentPos = GetTalentSpellPos(spell_id))
|
if(TalentSpellPos const* talentPos = GetTalentSpellPos(spell_id))
|
||||||
{
|
{
|
||||||
|
// propertly mark spell for allow save
|
||||||
|
newspell.type = PETSPELL_TALENT;
|
||||||
|
|
||||||
if(TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentPos->talent_id ))
|
if(TalentEntry const *talentInfo = sTalentStore.LookupEntry( talentPos->talent_id ))
|
||||||
{
|
{
|
||||||
for(int i=0; i < MAX_TALENT_RANK; ++i)
|
for(int i=0; i < MAX_TALENT_RANK; ++i)
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,7 @@ enum PetSpellType
|
||||||
{
|
{
|
||||||
PETSPELL_NORMAL = 0,
|
PETSPELL_NORMAL = 0,
|
||||||
PETSPELL_FAMILY = 1,
|
PETSPELL_FAMILY = 1,
|
||||||
|
PETSPELL_TALENT = 2,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct PetSpell
|
struct PetSpell
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7902"
|
#define REVISION_NR "7903"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue