[Commands] Add #unmemspell and #unmemspells Commands. (#1867)

- Add #unmemspell [Spell ID] command to unmemorize a spell by ID from you or your target.
- Add #unmemspells command to unmemorize all spells from you or your target.
- Cleanup #memspell command and change arguments from #memspell [Slot] [Spell ID] to #memspell [Spell ID] [Spell Gem] for easier use.
- Add #memspell [Spell ID] functionality to memorize to first open spell gem if there are any using FindEmptyMemSlot helper method.
- Rename client->FindMemmedSpellByID(spell_id) to FindMemmedSpellBySpellID(spell_id).
- Add client->FindEmptyMemSlot() helper method.
- Add $client->FindEmptyMemSlot() to Perl.
- Add client:FindEmptyMemSlot() to Lua.
- Add $client->FindMemmedSpellBySpellID(spell_id) to Perl.
- Add client:FindMemmedSpellBySpellID(spell_id) to Lua.
This commit is contained in:
Kinglykrab
2021-12-08 18:18:14 -05:00
committed by GitHub
parent 1a1c3abc24
commit 94166e0f95
11 changed files with 265 additions and 54 deletions
+42 -32
View File
@@ -5246,7 +5246,7 @@ void Mob::SendSpellBarEnable(uint16 spell_id)
manachange->spell_id = spell_id;
manachange->stamina = CastToClient()->GetEndurance();
manachange->keepcasting = 0;
manachange->slot = CastToClient()->FindMemmedSpellByID(spell_id);
manachange->slot = CastToClient()->FindMemmedSpellBySpellID(spell_id);
outapp->priority = 6;
CastToClient()->QueuePacket(outapp);
safe_delete(outapp);
@@ -5377,88 +5377,98 @@ void Client::MakeBuffFadePacket(uint16 spell_id, int slot_id, bool send_message)
void Client::MemSpell(uint16 spell_id, int slot, bool update_client)
{
if(slot >= EQ::spells::SPELL_GEM_COUNT || slot < 0)
if (slot >= EQ::spells::SPELL_GEM_COUNT || slot < 0) {
return;
}
if(update_client)
{
if(m_pp.mem_spells[slot] != 0xFFFFFFFF)
if(update_client) {
if (IsValidSpell(m_pp.mem_spells[slot])) {
UnmemSpell(slot, update_client);
}
}
m_pp.mem_spells[slot] = spell_id;
LogSpells("Spell [{}] memorized into slot [{}]", spell_id, slot);
database.SaveCharacterMemorizedSpell(this->CharacterID(), m_pp.mem_spells[slot], slot);
database.SaveCharacterMemorizedSpell(CharacterID(), m_pp.mem_spells[slot], slot);
if(update_client)
{
if(update_client) {
MemorizeSpell(slot, spell_id, memSpellMemorize);
}
}
void Client::UnmemSpell(int slot, bool update_client)
{
if(slot > EQ::spells::SPELL_GEM_COUNT || slot < 0)
if (slot >= EQ::spells::SPELL_GEM_COUNT || slot < 0) {
return;
}
LogSpells("Spell [{}] forgotten from slot [{}]", m_pp.mem_spells[slot], slot);
m_pp.mem_spells[slot] = 0xFFFFFFFF;
database.DeleteCharacterMemorizedSpell(this->CharacterID(), m_pp.mem_spells[slot], slot);
database.DeleteCharacterMemorizedSpell(CharacterID(), m_pp.mem_spells[slot], slot);
if(update_client)
{
if(update_client) {
MemorizeSpell(slot, m_pp.mem_spells[slot], memSpellForget);
}
}
void Client::UnmemSpellBySpellID(int32 spell_id)
{
for(int i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) {
if(m_pp.mem_spells[i] == spell_id) {
UnmemSpell(i, true);
break;
}
auto spell_gem = FindMemmedSpellBySpellID(spell_id);
if (spell_gem >= EQ::spells::SPELL_GEM_COUNT || spell_gem < 0) {
return;
}
UnmemSpell(spell_gem);
}
void Client::UnmemSpellAll(bool update_client)
{
int i;
for(i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++)
if(m_pp.mem_spells[i] != 0xFFFFFFFF)
UnmemSpell(i, update_client);
for (int spell_gem = 0; spell_gem < EQ::spells::SPELL_GEM_COUNT; spell_gem++) {
if (IsValidSpell(m_pp.mem_spells[spell_gem])) {
UnmemSpell(spell_gem, update_client);
}
}
}
uint32 Client::GetSpellIDByBookSlot(int book_slot) {
if (book_slot <= EQ::spells::SPELLBOOK_SIZE) {
return GetSpellByBookSlot(book_slot);
}
return -1; //default
return -1;
}
int Client::FindEmptyMemSlot() {
for (int spell_gem = 0; spell_gem < EQ::spells::SPELL_GEM_COUNT; spell_gem++) {
if (!IsValidSpell(m_pp.mem_spells[spell_gem])) {
return spell_gem;
}
}
return -1;
}
uint16 Client::FindMemmedSpellBySlot(int slot) {
if (m_pp.mem_spells[slot] != 0xFFFFFFFF)
if (IsValidSpell(m_pp.mem_spells[slot])) {
return m_pp.mem_spells[slot];
}
return 0;
}
int Client::MemmedCount() {
int memmed_count = 0;
for (int i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++)
if (m_pp.mem_spells[i] != 0xFFFFFFFF)
for (int spell_gem = 0; spell_gem < EQ::spells::SPELL_GEM_COUNT; spell_gem++) {
if (IsValidSpell(m_pp.mem_spells[spell_gem])) {
memmed_count++;
}
}
return memmed_count;
}
int Client::FindMemmedSpellByID(uint16 spell_id) {
for (int i = 0; i < EQ::spells::SPELL_GEM_COUNT; i++) {
if (m_pp.mem_spells[i] == spell_id) {
return i;
int Client::FindMemmedSpellBySpellID(uint16 spell_id) {
for (int spell_gem = 0; spell_gem < EQ::spells::SPELL_GEM_COUNT; spell_gem++) {
if (IsValidSpell(m_pp.mem_spells[spell_gem]) && m_pp.mem_spells[spell_gem] == spell_id) {
return spell_gem;
}
}
return -1;