mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 10:37:02 +00:00
[8987] Allow swap spell and command/reaction in pet action bar.
* Also prevent command/action drop from action bar * Pet action bar will recetn at this revision use single time for all pets. Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
parent
b59052ab42
commit
4e55757a94
4 changed files with 51 additions and 16 deletions
|
|
@ -414,8 +414,7 @@ void Pet::SavePetToDB(PetSaveMode mode)
|
||||||
<< curmana << ", "
|
<< curmana << ", "
|
||||||
<< GetPower(POWER_HAPPINESS) << ", '";
|
<< GetPower(POWER_HAPPINESS) << ", '";
|
||||||
|
|
||||||
// save only spell slots from action bar
|
for(uint32 i = ACTION_BAR_INDEX_START; i < ACTION_BAR_INDEX_END; ++i)
|
||||||
for(uint32 i = ACTION_BAR_INDEX_PET_SPELL_START; i < ACTION_BAR_INDEX_PET_SPELL_END; ++i)
|
|
||||||
{
|
{
|
||||||
ss << uint32(m_charmInfo->GetActionBarEntry(i)->GetType()) << " "
|
ss << uint32(m_charmInfo->GetActionBarEntry(i)->GetType()) << " "
|
||||||
<< uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << " ";
|
<< uint32(m_charmInfo->GetActionBarEntry(i)->GetAction()) << " ";
|
||||||
|
|
|
||||||
|
|
@ -324,23 +324,59 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
|
||||||
}
|
}
|
||||||
|
|
||||||
count = (recv_data.size() == 24) ? 2 : 1;
|
count = (recv_data.size() == 24) ? 2 : 1;
|
||||||
|
|
||||||
|
uint32 position[2];
|
||||||
|
uint32 data[2];
|
||||||
|
bool move_command = false;
|
||||||
|
|
||||||
for(uint8 i = 0; i < count; ++i)
|
for(uint8 i = 0; i < count; ++i)
|
||||||
{
|
{
|
||||||
uint32 position;
|
recv_data >> position[i];
|
||||||
uint32 data;
|
recv_data >> data[i];
|
||||||
|
|
||||||
recv_data >> position;
|
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
|
||||||
recv_data >> data;
|
|
||||||
|
|
||||||
uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data);
|
|
||||||
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data);
|
|
||||||
|
|
||||||
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", _player->GetName(), position, spell_id, uint32(act_state));
|
|
||||||
|
|
||||||
//ignore invalid position
|
//ignore invalid position
|
||||||
if(position >= MAX_UNIT_ACTION_BAR_INDEX)
|
if(position[i] >= MAX_UNIT_ACTION_BAR_INDEX)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// in the normal case, command and reaction buttons can only be moved, not removed
|
||||||
|
// at moving count ==2, at removing count == 1
|
||||||
|
// ignore attempt to remove command|reaction buttons (not possible at normal case)
|
||||||
|
if (act_state == ACT_COMMAND || act_state == ACT_REACTION)
|
||||||
|
{
|
||||||
|
if (count == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
|
move_command = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check swap
|
||||||
|
if (move_command)
|
||||||
|
{
|
||||||
|
uint8 act_state_0 = UNIT_ACTION_BUTTON_TYPE(data[0]);
|
||||||
|
uint32 spell_id_0 = UNIT_ACTION_BUTTON_ACTION(data[0]);
|
||||||
|
UnitActionBarEntry const* actionEntry_1 = charmInfo->GetActionBarEntry(position[1]);
|
||||||
|
if (!actionEntry_1 || spell_id_0 != actionEntry_1->GetAction() ||
|
||||||
|
act_state_0 != actionEntry_1->GetType())
|
||||||
|
return;
|
||||||
|
|
||||||
|
uint8 act_state_1 = UNIT_ACTION_BUTTON_TYPE(data[1]);
|
||||||
|
uint32 spell_id_1 = UNIT_ACTION_BUTTON_ACTION(data[1]);
|
||||||
|
UnitActionBarEntry const* actionEntry_0 = charmInfo->GetActionBarEntry(position[0]);
|
||||||
|
if (!actionEntry_0 || spell_id_1 != actionEntry_0->GetAction() ||
|
||||||
|
act_state_1 != actionEntry_0->GetType())
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(uint8 i = 0; i < count; ++i)
|
||||||
|
{
|
||||||
|
uint32 spell_id = UNIT_ACTION_BUTTON_ACTION(data[i]);
|
||||||
|
uint8 act_state = UNIT_ACTION_BUTTON_TYPE(data[i]);
|
||||||
|
|
||||||
|
sLog.outDetail( "Player %s has changed pet spell action. Position: %u, Spell: %u, State: 0x%X", _player->GetName(), position[i], spell_id, uint32(act_state));
|
||||||
|
|
||||||
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
|
//if it's act for spell (en/disable/cast) and there is a spell given (0 = remove spell) which pet doesn't know, don't add
|
||||||
if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
|
if(!((act_state == ACT_ENABLED || act_state == ACT_DISABLED || act_state == ACT_PASSIVE) && spell_id && !pet->HasSpell(spell_id)))
|
||||||
{
|
{
|
||||||
|
|
@ -361,7 +397,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
|
||||||
((Pet*)pet)->ToggleAutocast(spell_id, false);
|
((Pet*)pet)->ToggleAutocast(spell_id, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
charmInfo->SetActionBar(position,spell_id,ActiveStates(act_state));
|
charmInfo->SetActionBar(position[i],spell_id,ActiveStates(act_state));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11658,12 +11658,12 @@ void CharmInfo::LoadPetActionBar(const std::string& data )
|
||||||
|
|
||||||
Tokens tokens = StrSplit(data, " ");
|
Tokens tokens = StrSplit(data, " ");
|
||||||
|
|
||||||
if (tokens.size() != (ACTION_BAR_INDEX_PET_SPELL_END-ACTION_BAR_INDEX_PET_SPELL_START)*2)
|
if (tokens.size() != (ACTION_BAR_INDEX_END-ACTION_BAR_INDEX_START)*2)
|
||||||
return; // non critical, will reset to default
|
return; // non critical, will reset to default
|
||||||
|
|
||||||
int index;
|
int index;
|
||||||
Tokens::iterator iter;
|
Tokens::iterator iter;
|
||||||
for(iter = tokens.begin(), index = ACTION_BAR_INDEX_PET_SPELL_START; index < ACTION_BAR_INDEX_PET_SPELL_END; ++iter, ++index )
|
for(iter = tokens.begin(), index = ACTION_BAR_INDEX_START; index < ACTION_BAR_INDEX_END; ++iter, ++index )
|
||||||
{
|
{
|
||||||
// use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion
|
// use unsigned cast to avoid sign negative format use at long-> ActiveStates (int) conversion
|
||||||
uint8 type = atol((*iter).c_str());
|
uint8 type = atol((*iter).c_str());
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8986"
|
#define REVISION_NR "8987"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue