1
0

Added support for the spawn_anim to be converted and accurate for earlier clients like KoS and DoF, when spawning skeletons, zombies so on their animation is now present

This commit is contained in:
Emagi 2025-05-23 17:11:57 -04:00
parent ab41124e73
commit f47896f5b8
3 changed files with 39 additions and 4 deletions

View File

@ -221,10 +221,20 @@ void Spawn::InitializeHeaderPacketData(Player* player, PacketStruct* header, int
header->setDataByName("index", index);
if (GetSpawnAnim() > 0 && Timer::GetCurrentTime2() < (GetAddedToWorldTimestamp() + GetSpawnAnimLeeway())) {
int32 spawn_anim = GetSpawnAnim();
if (header->GetVersion() <= 561) { // spell's spell_visual field is based on newer clients, DoF has to convert
Emote* spellVisualEmote = visual_states.FindEmoteByID(spawn_anim, 60085);
if (spellVisualEmote != nullptr && spellVisualEmote->GetMessageString().size() > 0) {
spellVisualEmote = visual_states.FindEmote(spellVisualEmote->GetMessageString(), header->GetVersion());
if (spellVisualEmote) {
spawn_anim = (int32)spellVisualEmote->GetVisualState();
}
}
}
if (header->GetVersion() >= 57080)
header->setDataByName("spawn_anim", GetSpawnAnim());
header->setDataByName("spawn_anim", spawn_anim);
else
header->setDataByName("spawn_anim", (int16)GetSpawnAnim());
header->setDataByName("spawn_anim", (int16)spawn_anim);
}
else {
if (header->GetVersion() >= 57080)

View File

@ -172,6 +172,7 @@ public:
for(map_list = emoteMap.begin(); map_list != emoteMap.end(); map_list++ )
safe_delete(map_list->second);
emoteMap.clear();
emoteMapID.clear();
}
void ClearVisualStates(){
@ -191,8 +192,9 @@ public:
return 0;
}
void InsertEmoteRange(EmoteVersionRange* emote) {
void InsertEmoteRange(EmoteVersionRange* emote, int32 animation_id) {
emoteMap[emote->GetName()] = emote;
emoteMapID[animation_id] = emote;
}
EmoteVersionRange* FindEmoteRange(string var) {
@ -217,6 +219,28 @@ public:
return 0;
}
EmoteVersionRange* FindEmoteRangeByID(int32 id) {
if (emoteMapID.count(id) > 0)
{
return emoteMapID[id];
}
return 0;
}
Emote* FindEmoteByID(int32 visual_id, int32 version){
if (emoteMapID.count(visual_id) > 0)
{
map<VersionRange*,Emote*>::iterator itr = emoteMapID[visual_id]->FindEmoteVersion(version);
if (itr != emoteMapID[visual_id]->GetRangeEnd())
{
Emote* emote = itr->second;
return emote;
}
}
return 0;
}
void InsertSpellVisualRange(EmoteVersionRange* emote, int32 spell_visual_id) {
spellMap[emote->GetName()] = emote;
spellMapID[spell_visual_id] = emote;
@ -276,6 +300,7 @@ public:
private:
map<string,VisualState*> visualStateMap;
map<string,EmoteVersionRange*> emoteMap;
map<int32,EmoteVersionRange*> emoteMapID;
map<string,EmoteVersionRange*> spellMap;
map<int32,EmoteVersionRange*> spellMapID;
};

View File

@ -460,7 +460,7 @@ void WorldDatabase::LoadVisualStates()
if ((range = visual_states.FindEmoteRange(string(row2[0]))) == NULL)
{
range = new EmoteVersionRange(row2[0]);
visual_states.InsertEmoteRange(range);
visual_states.InsertEmoteRange(range, atoul(row2[1]));
}
range->AddVersionRange(atoul(row2[4]),atoul(row2[5]), row2[0], atoul(row2[1]), row2[2], row2[3]);