Skip to content

Commit

Permalink
[z2821] Creature: Add CharmedSpellList shorthand during charm
Browse files Browse the repository at this point in the history
Common and confirmed on reference
  • Loading branch information
killerwife committed Apr 25, 2024
1 parent 1e4842e commit 538edf8
Show file tree
Hide file tree
Showing 7 changed files with 37 additions and 9 deletions.
5 changes: 3 additions & 2 deletions sql/base/mangos.sql
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ DROP TABLE IF EXISTS `db_version`;
CREATE TABLE `db_version` (
`version` varchar(120) DEFAULT NULL,
`creature_ai_version` varchar(120) DEFAULT NULL,
`required_z2818_01_mangos_spell_template_ap` bit(1) DEFAULT NULL
`required_z2821_01_mangos_charmed_spell_list` bit(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Used DB version notes';

--
Expand Down Expand Up @@ -1297,6 +1297,7 @@ CREATE TABLE `creature_template` (
`Civilian` tinyint(3) unsigned NOT NULL DEFAULT '0',
`CorpseDecay` INT UNSIGNED NOT NULL DEFAULT '0' COMMENT 'Time before corpse despawns',
`SpellList` INT NOT NULL DEFAULT '0' COMMENT 'creature_spell_list_entry',
`CharmedSpellList` INT NOT NULL DEFAULT '0' COMMENT 'creature_spell_list_entry during charm',
`StringId1` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`StringId2` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`AIName` char(64) NOT NULL DEFAULT '',
Expand All @@ -1311,7 +1312,7 @@ CREATE TABLE `creature_template` (
LOCK TABLES `creature_template` WRITE;
/*!40000 ALTER TABLE `creature_template` DISABLE KEYS */;
INSERT INTO `creature_template` VALUES
(1,'Waypoint (Only GM can see it)','Visual',63,63,10045,0,0,0,35,0,8,8,7,1,0,0,4096,0,130,5242886,0,0,0,0,0.91,1.14286,20,0,0,0,0,0,3,1,1,1,1,1,1,9999,9999,0,0,7,7,1.76,2.42,0,3,100,2000,2200,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,'','');
(1,'Waypoint (Only GM can see it)','Visual',63,63,10045,0,0,0,35,0,8,8,7,1,0,0,4096,0,130,5242886,0,0,0,0,0.91,1.14286,20,0,0,0,0,0,3,1,1,1,1,1,1,9999,9999,0,0,7,7,1.76,2.42,0,3,100,2000,2200,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,0,0,0,0,0,'','');
/*!40000 ALTER TABLE `creature_template` ENABLE KEYS */;
UNLOCK TABLES;

Expand Down
5 changes: 5 additions & 0 deletions sql/updates/mangos/z2821_01_mangos_charmed_spell_list.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ALTER TABLE db_version CHANGE COLUMN required_z2818_01_mangos_spell_template_ap required_z2821_01_mangos_charmed_spell_list bit;

ALTER TABLE `creature_template` ADD COLUMN `CharmedSpellList` INT NOT NULL DEFAULT '0' COMMENT 'creature_spell_list_entry during charm' AFTER `SpellList`;


10 changes: 10 additions & 0 deletions src/game/Entities/Creature.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2282,6 +2282,16 @@ void Creature::UpdateSpell(int32 index, int32 newSpellId)

void Creature::SetSpellList(uint32 spellSet)
{
if (spellSet == 0)
{
m_spellList.Disabled = true;
m_spellList.Spells.clear();

if (AI())
AI()->SpellListChanged();
return;
}

// Try difficulty dependent version before falling back to base entry
auto spellList = GetMap()->GetMapDataContainer().GetCreatureSpellList(spellSet);
if (!spellList)
Expand Down
1 change: 1 addition & 0 deletions src/game/Entities/Creature.h
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,7 @@ struct CreatureInfo
uint32 InteractionPauseTimer;
uint32 CorpseDelay;
uint32 SpellList;
uint32 CharmedSpellList;
uint32 StringID1;
uint32 StringID2;
uint32 EquipmentTemplateId;
Expand Down
19 changes: 15 additions & 4 deletions src/game/Entities/Unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11070,6 +11070,8 @@ Unit* Unit::TakePossessOf(SpellEntry const* spellEntry, uint32 effIdx, float x,
if (player)
{
// Initialize pet bar
if (uint32 charmedSpellList = possessed->GetCreatureInfo()->CharmedSpellList)
possessed->SetSpellList(charmedSpellList);
charmInfo->InitPossessCreateSpells();
player->PossessSpellInitialize();

Expand Down Expand Up @@ -11137,6 +11139,9 @@ bool Unit::TakePossessOf(Unit* possessed)
charmInfo->SetCharmState("PossessedAI");
possessedCreature->SetWalk(IsWalking(), true);
getHostileRefManager().deleteReference(possessedCreature);

if (uint32 charmedSpellList = possessedCreature->GetCreatureInfo()->CharmedSpellList)
possessedCreature->SetSpellList(charmedSpellList);
}
else if (possessed->GetTypeId() == TYPEID_PLAYER)
{
Expand Down Expand Up @@ -11242,7 +11247,7 @@ bool Unit::TakeCharmOf(Unit* charmed, uint32 spellId, bool advertised /*= true*/

Position combatStartPosition;

if (charmed->GetTypeId() == TYPEID_PLAYER)
if (charmed->IsPlayer())
{
Player* charmedPlayer = static_cast<Player*>(charmed);
if (charmerPlayer && charmerPlayer->IsInDuelWith(charmedPlayer))
Expand All @@ -11267,7 +11272,7 @@ bool Unit::TakeCharmOf(Unit* charmed, uint32 spellId, bool advertised /*= true*/

charmedPlayer->SendForcedObjectUpdate();
}
else if (charmed->GetTypeId() == TYPEID_UNIT)
else if (charmed->IsCreature())
{
Creature* charmedCreature = static_cast<Creature*>(charmed);

Expand All @@ -11284,6 +11289,9 @@ bool Unit::TakeCharmOf(Unit* charmed, uint32 spellId, bool advertised /*= true*/

charmedCreature->SetFactionTemporary(GetFaction(), TEMPFACTION_NONE);

if (uint32 charmedSpellList = charmedCreature->GetCreatureInfo()->CharmedSpellList)
charmedCreature->SetSpellList(charmedSpellList);

if (isPossessCharm)
charmInfo->InitPossessCreateSpells();
else
Expand Down Expand Up @@ -11467,7 +11475,7 @@ void Unit::Uncharm(Unit* charmed, uint32 spellId)
// TODO: maybe should be done on HomeMovementGenerator::MovementExpires
charmed->GetCombatManager().SetEvadeState(EVADE_NONE);

if (charmed->GetTypeId() == TYPEID_UNIT)
if (charmed->IsCreature())
{
// now we have to clean threat list to be able to restore normal creature behavior
Creature* charmedCreature = static_cast<Creature*>(charmed);
Expand Down Expand Up @@ -11499,9 +11507,12 @@ void Unit::Uncharm(Unit* charmed, uint32 spellId)
charmed->DeleteCharmInfo();
}

if (charmedCreature->GetCreatureInfo()->CharmedSpellList)
charmedCreature->SetSpellList(charmedCreature->GetCreatureInfo()->SpellList);

charmed->SetTarget(charmed->GetVictim());
}
else if (charmed->GetTypeId() == TYPEID_PLAYER)
else if (charmed->IsPlayer())
{
charmed->AttackStop(true, true);

Expand Down
4 changes: 2 additions & 2 deletions src/game/Server/SQLStorages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@

#include "Server/SQLStorages.h"

const char CreatureInfosrcfmt[] = "issiiiiiiifiiiiliiiiiiiiiffiiiiiiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiss";
const char CreatureInfodstfmt[] = "issiiiiiiifiiiiliiiiiiiiiffiiiiiiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisi";
const char CreatureInfosrcfmt[] = "issiiiiiiifiiiiliiiiiiiiiffiiiiiiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiss";
const char CreatureInfodstfmt[] = "issiiiiiiifiiiiliiiiiiiiiffiiiiiiiffffffiiiiffffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisi";
const char CreatureDataAddonInfofmt[] = "iibbiis";
const char CreatureConditionalSpawnSrcFmt[] = "iiix";
const char CreatureConditionalSpawnDstFmt[] = "iii";
Expand Down
2 changes: 1 addition & 1 deletion src/shared/revision_sql.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@
#define REVISION_DB_REALMD "required_z2820_01_realmd_joindate_datetime"
#define REVISION_DB_LOGS "required_z2778_01_logs_anticheat"
#define REVISION_DB_CHARACTERS "required_z2819_01_characters_item_instance_text_id_fix"
#define REVISION_DB_MANGOS "required_z2818_01_mangos_spell_template_ap"
#define REVISION_DB_MANGOS "required_z2821_01_mangos_charmed_spell_list"
#endif // __REVISION_SQL_H__

0 comments on commit 538edf8

Please sign in to comment.