From 1cc7d22a4403edea5a72a36564ba27967325637f Mon Sep 17 00:00:00 2001 From: Emagi Date: Sat, 4 Jan 2025 15:24:02 -0500 Subject: [PATCH] support flight paths in KoS and earlier clients, also start of showing loot to other group/raid members --- server/WorldStructs.xml | 14 +++---- source/WorldServer/PlayerGroups.cpp | 2 +- source/WorldServer/Spawn.cpp | 6 ++- source/WorldServer/Spawn.h | 1 + source/WorldServer/client.cpp | 59 ++++++++++++++++++----------- source/WorldServer/zoneserver.cpp | 13 ------- 6 files changed, 48 insertions(+), 47 deletions(-) diff --git a/server/WorldStructs.xml b/server/WorldStructs.xml index 6d20f36..ef8c4ae 100644 --- a/server/WorldStructs.xml +++ b/server/WorldStructs.xml @@ -19224,6 +19224,8 @@ to zero and treated like placeholders." /> + + @@ -20914,15 +20916,6 @@ to zero and treated like placeholders." /> - - - - - - - - - @@ -21035,4 +21028,7 @@ to zero and treated like placeholders." /> + + + diff --git a/source/WorldServer/PlayerGroups.cpp b/source/WorldServer/PlayerGroups.cpp index 8a218e3..ab94fc2 100644 --- a/source/WorldServer/PlayerGroups.cpp +++ b/source/WorldServer/PlayerGroups.cpp @@ -1035,7 +1035,7 @@ void PlayerGroupManager::SendGroupChatMessage(int32 group_id, int16 channel, con if (m_groups.count(group_id) > 0) { std::vector raidGroups; - if (channel == CHANNEL_RAID_SAY || channel == CHANNEL_LOOT_ROLLS) + if (channel == CHANNEL_RAID_SAY || channel == CHANNEL_LOOT_ROLLS || channel == CHANNEL_LOOT) m_groups[group_id]->GetRaidGroups(&raidGroups); if (raidGroups.size() < 1) diff --git a/source/WorldServer/Spawn.cpp b/source/WorldServer/Spawn.cpp index b0c8f9b..e62f77b 100644 --- a/source/WorldServer/Spawn.cpp +++ b/source/WorldServer/Spawn.cpp @@ -2648,7 +2648,11 @@ void Spawn::InitializeInfoPacketData(Player* spawn, PacketStruct* packet) { if(!vis_hide_hood && appearance.hide_hood && version > 561) { vis_flag += INFO_VIS_FLAG_HIDE_HOOD; } - + + if(spawn == this && IsPlayer() && ((Player*)this)->GetClient() && ((Player*)this)->GetClient()->GetOnAutoMount()) { + classicFlags += INFO_CLASSIC_FLAG_AUTOMOUNT; + } + if(version <= 561) { packet->setDataByName("flags", classicFlags); } diff --git a/source/WorldServer/Spawn.h b/source/WorldServer/Spawn.h index 8c3e0ed..c09fb92 100644 --- a/source/WorldServer/Spawn.h +++ b/source/WorldServer/Spawn.h @@ -201,6 +201,7 @@ #define INFO_CLASSIC_FLAG_SHOW_HOOD 2 #define INFO_CLASSIC_FLAG_NOLOOK 4 #define INFO_CLASSIC_FLAG_CROUCH 8 +#define INFO_CLASSIC_FLAG_AUTOMOUNT 32 using namespace std; class Spell; diff --git a/source/WorldServer/client.cpp b/source/WorldServer/client.cpp index 78bb85d..0d860b9 100644 --- a/source/WorldServer/client.cpp +++ b/source/WorldServer/client.cpp @@ -2920,6 +2920,10 @@ bool Client::HandleLootItem(Spawn* entity, Item* item, Spawn* target, bool overr int8 type = CHANNEL_LOOT; if (entity) { lootingClient->Message(type, "You loot %s from the corpse of %s", item->CreateItemLink(GetVersion()).c_str(), entity->GetName()); + if(entity->GetLootGroupID()) { + // TODO: Item link for each client + world.GetGroupManager()->SendGroupChatMessage(entity->GetLootGroupID(), CHANNEL_LOOT, "%s looted %s from the corpse of %s.", lootingPlayer->GetName(), item->name.c_str(), entity->GetName()); + } } else { lootingClient->Message(type, "You found a %s.", item->CreateItemLink(GetVersion()).c_str()); @@ -11637,31 +11641,41 @@ void Client::AttemptStartAutoMount() { } void Client::EndAutoMount() { - PacketStruct* packet = configReader.getStruct("WS_ServerControlFlags", GetVersion()); - if (packet) { - packet->setDataByName("parameter1", 128); - packet->setDataByName("parameter2", 64); - packet->setDataByName("value", 1); - QueuePacket(packet->serialize()); - safe_delete(packet); + PacketStruct* packet = nullptr; + if(GetVersion() > 561) { + packet = configReader.getStruct("WS_ServerControlFlags", GetVersion()); + if (packet) { + packet->setDataByName("parameter1", 128); + packet->setDataByName("parameter2", 64); + packet->setDataByName("value", 1); + QueuePacket(packet->serialize()); + safe_delete(packet); + } + + packet = configReader.getStruct("WS_ServerControlFlags", GetVersion()); + if (packet) { + packet->setDataByName("parameter3", 4); + packet->setDataByName("parameter5", 2); + packet->setDataByName("value", 0); + QueuePacket(packet->serialize()); + safe_delete(packet); + } + + packet = configReader.getStruct("WS_ClearForLanding", GetVersion()); + if (packet) { + packet->setDataByName("spawn_id", GetPlayer()->GetIDWithPlayerSpawn(GetPlayer())); + QueuePacket(packet->serialize()); + safe_delete(packet); + } } - packet = configReader.getStruct("WS_ServerControlFlags", GetVersion()); - if (packet) { - packet->setDataByName("parameter3", 4); - packet->setDataByName("parameter5", 2); - packet->setDataByName("value", 0); - QueuePacket(packet->serialize()); - safe_delete(packet); + if(GetVersion() <= 561) { + packet = configReader.getStruct("WS_CreateBoatTransportMsg", GetVersion()); + if (packet) { + QueuePacket(packet->serialize()); + safe_delete(packet); + } } - - packet = configReader.getStruct("WS_ClearForLanding", GetVersion()); - if (packet) { - packet->setDataByName("spawn_id", GetPlayer()->GetIDWithPlayerSpawn(GetPlayer())); - QueuePacket(packet->serialize()); - safe_delete(packet); - } - on_auto_mount = false; player->SetMount(((Player*)player)->GetTempMount()); @@ -12244,7 +12258,6 @@ void Client::SendMoveObjectMode(Spawn* spawn, uint8 placementMode, float unknown void Client::SendFlightAutoMount(int32 path_id, int16 mount_id, int8 mount_red_color, int8 mount_green_color, int8 mount_blue_color) { SetPendingFlightPath(path_id); - ((Player*)player)->SetTempMount(((Entity*)player)->GetMount()); ((Player*)player)->SetTempMountColor(((Entity*)player)->GetMountColor()); ((Player*)player)->SetTempMountSaddleColor(((Entity*)player)->GetMountSaddleColor()); diff --git a/source/WorldServer/zoneserver.cpp b/source/WorldServer/zoneserver.cpp index 3ea502b..79b82f8 100644 --- a/source/WorldServer/zoneserver.cpp +++ b/source/WorldServer/zoneserver.cpp @@ -8738,39 +8738,26 @@ void ZoneServer::SendFlightPathsPackets(Client* client) { if (m_flightPathRoutes.size() > 0) { PacketStruct* packet = configReader.getStruct("WS_FlightPathsMsg", client->GetVersion()); if (packet) { - int32 num_routes = m_flightPaths.size(); packet->setArrayLengthByName("number_of_routes", num_routes); packet->setArrayLengthByName("number_of_routes2", num_routes); packet->setArrayLengthByName("number_of_routes3", num_routes); packet->setArrayLengthByName("number_of_routes4", num_routes); - map::iterator itr; int32 i = 0; for (itr = m_flightPaths.begin(); itr != m_flightPaths.end(); itr++, i++) { packet->setArrayDataByName("route_length", m_flightPathRoutes[itr->first].size(), i); packet->setArrayDataByName("ground_mount", itr->second->flying ? 0 : 1, i); packet->setArrayDataByName("allow_dismount", itr->second->dismount ? 1 : 0, i); - - packet->setSubArrayLengthByName("route_length2", m_flightPathRoutes[itr->first].size(), i); vector::iterator itr2; int32 j = 0; for (itr2 = m_flightPathRoutes[itr->first].begin(); itr2 != m_flightPathRoutes[itr->first].end(); itr2++, j++) { - if(client->GetVersion() <= 561) { - std::string fieldNum = std::to_string(i) + "_" + std::to_string(j); - packet->setDataByName(("x" + fieldNum).c_str(), (*itr2)->X); - packet->setDataByName(("y" + fieldNum).c_str(), (*itr2)->Y); - packet->setDataByName(("z" + fieldNum).c_str(), (*itr2)->Z); - } - else { packet->setSubArrayDataByName("x", (*itr2)->X, i, j); packet->setSubArrayDataByName("y", (*itr2)->Y, i, j); packet->setSubArrayDataByName("z", (*itr2)->Z, i, j); - } } } - //packet->PrintPacket(); client->QueuePacket(packet->serialize()); safe_delete(packet); }