void WorldGuildManager::ProcessZonePacket(ServerPacket *pack) { switch(pack->opcode) { case ServerOP_RefreshGuild: { if(pack->size != sizeof(ServerGuildRefresh_Struct)) { Log(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRefresh_Struct)); return; } ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer; Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild refresh for %d, changes: name=%d, motd=%d, rank=d, relation=%d", s->guild_id, s->name_change, s->motd_change, s->rank_change, s->relation_change); //broadcast this packet to all zones. zoneserver_list.SendPacket(pack); //preform a local refresh. if(!RefreshGuild(s->guild_id)) { Log(Logs::Detail, Logs::Guilds, "Unable to preform local refresh on guild %d", s->guild_id); //can we do anything? } break; } case ServerOP_GuildCharRefresh: { if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) { Log(Logs::Detail, Logs::Guilds, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildCharRefresh_Struct)); return; } ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer; Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild member refresh for char %d to all zones with members of guild %d", s->char_id, s->guild_id); //preform the local update client_list.UpdateClientGuild(s->char_id, s->guild_id); //broadcast this update to any zone with a member in this guild. //client_list.SendGuildPacket(s->guild_id, pack); //because im sick of this not working, sending it to all zones, just spends a bit more bandwidth. zoneserver_list.SendPacket(pack); break; } case ServerOP_DeleteGuild: { if(pack->size != sizeof(ServerGuildID_Struct)) { Log(Logs::Detail, Logs::Guilds, "Received ServerOP_DeleteGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildID_Struct)); return; } ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer; Log(Logs::Detail, Logs::Guilds, "Received and broadcasting guild delete for guild %d", s->guild_id); //broadcast this packet to all zones. zoneserver_list.SendPacket(pack); //preform a local refresh. if(!LocalDeleteGuild(s->guild_id)) { Log(Logs::Detail, Logs::Guilds, "Unable to preform local delete on guild %d", s->guild_id); //can we do anything? } break; } case ServerOP_GuildMemberUpdate: { if(pack->size != sizeof(ServerGuildMemberUpdate_Struct)) { Log(Logs::Detail, Logs::Guilds, "Received ServerOP_GuildMemberUpdate of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildMemberUpdate_Struct)); return; } zoneserver_list.SendPacket(pack); break; } default: Log(Logs::Detail, Logs::Guilds, "Unknown packet 0x%x received from zone??", pack->opcode); break; } }
void ZoneGuildManager::ProcessWorldPacket(ServerPacket *pack) { switch(pack->opcode) { case ServerOP_RefreshGuild: { if(pack->size != sizeof(ServerGuildRefresh_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRefresh_Struct)); return; } ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild refresh from world for %d, changes: name=%d, motd=%d, rank=%d, relation=%d", s->guild_id, s->name_change, s->motd_change, s->rank_change, s->relation_change); //reload all the guild details from the database. RefreshGuild(s->guild_id); if(s->motd_change) { //resend guild MOTD to all guild members in this zone. entity_list.SendGuildMOTD(s->guild_id); } if(s->name_change) { //until we figure out the guild update packet, we resend the whole guild list. entity_list.SendGuildList(); } if(s->rank_change) { //we need to send spawn appearance packets for all members of this guild in the zone, to everybody. entity_list.SendGuildSpawnAppearance(s->guild_id); } if(s->relation_change) { //unknown until we implement guild relations. } break; } case ServerOP_GuildCharRefresh: { if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildCharRefresh_Struct)); return; } ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild member refresh from world for char %d from guild %d", s->char_id, s->guild_id); Client *c = entity_list.GetClientByCharID(s->char_id); if(c != nullptr) { //this reloads the char's guild info from the database and sends appearance updates c->RefreshGuildInfo(); } if(c != nullptr && s->guild_id != GUILD_NONE) { //char is in zone, and has changed into a new guild, send MOTD. c->SendGuildMOTD(); } break; } case ServerOP_DeleteGuild: { if(pack->size != sizeof(ServerGuildID_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_DeleteGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildID_Struct)); return; } ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild delete from world for guild %d", s->guild_id); //clear all the guild tags. entity_list.RefreshAllGuildInfo(s->guild_id); //remove the guild data from the local guild manager guild_mgr.LocalDeleteGuild(s->guild_id); //if we stop forcing guild list to send on guild create, we need to do this: //in the case that we delete a guild and add a new one. //entity_list.SendGuildList(); break; } case ServerOP_OnlineGuildMembersResponse: if (ZoneLoaded) { char *Buffer = (char *)pack->pBuffer; uint32 FromID = VARSTRUCT_DECODE_TYPE(uint32, Buffer); uint32 Count = VARSTRUCT_DECODE_TYPE(uint32, Buffer); Client *c = entity_list.GetClientByCharID(FromID); if (!c || !c->IsInAGuild()) { Log.Out(Logs::Detail, Logs::Guilds,"Invalid Client or not in guild. ID=%i", FromID); break; } Log.Out(Logs::Detail, Logs::Guilds,"Processing ServerOP_OnlineGuildMembersResponse"); } break; } }
void ZoneGuildManager::ProcessWorldPacket(ServerPacket *pack) { switch(pack->opcode) { case ServerOP_RefreshGuild: { if(pack->size != sizeof(ServerGuildRefresh_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRefresh_Struct)); return; } ServerGuildRefresh_Struct *s = (ServerGuildRefresh_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild refresh from world for %d, changes: name=%d, motd=%d, rank=%d, relation=%d", s->guild_id, s->name_change, s->motd_change, s->rank_change, s->relation_change); //reload all the guild details from the database. RefreshGuild(s->guild_id); if(s->motd_change) { //resend guild MOTD to all guild members in this zone. entity_list.SendGuildMOTD(s->guild_id); } if(s->name_change) { //until we figure out the guild update packet, we resend the whole guild list. entity_list.SendGuildList(); } if(s->rank_change) { //we need to send spawn appearance packets for all members of this guild in the zone, to everybody. entity_list.SendGuildSpawnAppearance(s->guild_id); } if(s->relation_change) { //unknown until we implement guild relations. } break; } case ServerOP_GuildCharRefresh: { if(pack->size != sizeof(ServerGuildCharRefresh_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_RefreshGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildCharRefresh_Struct)); return; } ServerGuildCharRefresh_Struct *s = (ServerGuildCharRefresh_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild member refresh from world for char %d from guild %d", s->char_id, s->guild_id); Client *c = entity_list.GetClientByCharID(s->char_id); if(c != nullptr) { //this reloads the char's guild info from the database and sends appearance updates c->RefreshGuildInfo(); } //it would be nice if we had the packet to send just a one-person update if(s->guild_id == GUILD_NONE) { if(c != nullptr) c->SendGuildMembers(); //only need to update this player's list (trying to clear it) } else { entity_list.SendGuildMembers(s->guild_id); //even send GUILD_NONE (empty) } if(s->old_guild_id != 0 && s->old_guild_id != GUILD_NONE && s->old_guild_id != s->guild_id) entity_list.SendGuildMembers(s->old_guild_id); else if(c != nullptr && s->guild_id != GUILD_NONE) { //char is in zone, and has changed into a new guild, send MOTD. c->SendGuildMOTD(); if(c->GetClientVersion() >= ClientVersion::RoF) { c->SendGuildRanks(); } } break; } case ServerOP_GuildRankUpdate: { if(ZoneLoaded) { if(pack->size != sizeof(ServerGuildRankUpdate_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_RankUpdate of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildRankUpdate_Struct)); return; } ServerGuildRankUpdate_Struct *sgrus = (ServerGuildRankUpdate_Struct*)pack->pBuffer; EQApplicationPacket *outapp = new EQApplicationPacket(OP_SetGuildRank, sizeof(GuildSetRank_Struct)); GuildSetRank_Struct *gsrs = (GuildSetRank_Struct*)outapp->pBuffer; gsrs->Rank = sgrus->Rank; strn0cpy(gsrs->MemberName, sgrus->MemberName, sizeof(gsrs->MemberName)); gsrs->Banker = sgrus->Banker; entity_list.QueueClientsGuild(nullptr, outapp, false, sgrus->GuildID); safe_delete(outapp); } break; } case ServerOP_DeleteGuild: { if(pack->size != sizeof(ServerGuildID_Struct)) { Log.Out(Logs::General, Logs::Error, "Received ServerOP_DeleteGuild of incorrect size %d, expected %d", pack->size, sizeof(ServerGuildID_Struct)); return; } ServerGuildID_Struct *s = (ServerGuildID_Struct *) pack->pBuffer; Log.Out(Logs::Detail, Logs::Guilds, "Received guild delete from world for guild %d", s->guild_id); //clear all the guild tags. entity_list.RefreshAllGuildInfo(s->guild_id); //remove the guild data from the local guild manager guild_mgr.LocalDeleteGuild(s->guild_id); //if we stop forcing guild list to send on guild create, we need to do this: //in the case that we delete a guild and add a new one. //entity_list.SendGuildList(); break; } case ServerOP_GuildMemberUpdate: { ServerGuildMemberUpdate_Struct *sgmus = (ServerGuildMemberUpdate_Struct*)pack->pBuffer; if(ZoneLoaded) { EQApplicationPacket *outapp = new EQApplicationPacket(OP_GuildMemberUpdate, sizeof(GuildMemberUpdate_Struct)); GuildMemberUpdate_Struct *gmus = (GuildMemberUpdate_Struct*)outapp->pBuffer; gmus->GuildID = sgmus->GuildID; strn0cpy(gmus->MemberName, sgmus->MemberName, sizeof(gmus->MemberName)); gmus->ZoneID = sgmus->ZoneID; gmus->InstanceID = 0; // I don't think we care what Instance they are in, for the Guild Management Window. gmus->LastSeen = sgmus->LastSeen; entity_list.QueueClientsGuild(nullptr, outapp, false, sgmus->GuildID); safe_delete(outapp); } break; } case ServerOP_OnlineGuildMembersResponse: if (ZoneLoaded) { char *Buffer = (char *)pack->pBuffer; uint32 FromID = VARSTRUCT_DECODE_TYPE(uint32, Buffer); uint32 Count = VARSTRUCT_DECODE_TYPE(uint32, Buffer); Client *c = entity_list.GetClientByCharID(FromID); if (!c || !c->IsInAGuild()) { Log.Out(Logs::Detail, Logs::Guilds,"Invalid Client or not in guild. ID=%i", FromID); break; } Log.Out(Logs::Detail, Logs::Guilds,"Processing ServerOP_OnlineGuildMembersResponse"); EQApplicationPacket *outapp = new EQApplicationPacket(OP_GuildMemberUpdate, sizeof(GuildMemberUpdate_Struct)); GuildMemberUpdate_Struct *gmus = (GuildMemberUpdate_Struct*)outapp->pBuffer; char Name[64]; gmus->LastSeen = time(nullptr); gmus->InstanceID = 0; gmus->GuildID = c->GuildID(); for (int i=0;i<Count;i++) { // Just make the packet once and swap out name/zone and send VARSTRUCT_DECODE_STRING(Name, Buffer); strn0cpy(gmus->MemberName, Name, sizeof(gmus->MemberName)); gmus->ZoneID = VARSTRUCT_DECODE_TYPE(uint32, Buffer); Log.Out(Logs::Detail, Logs::Guilds,"Sending OP_GuildMemberUpdate to %i. Name=%s ZoneID=%i",FromID,Name,gmus->ZoneID); c->QueuePacket(outapp); } safe_delete(outapp); } break; case ServerOP_LFGuildUpdate: { if(ZoneLoaded) { char GuildName[33]; char Comments[257]; uint32 FromLevel, ToLevel, Classes, AACount, TimeZone, TimePosted, Toggle; pack->ReadString(GuildName); pack->ReadString(Comments); FromLevel = pack->ReadUInt32(); ToLevel = pack->ReadUInt32(); Classes = pack->ReadUInt32(); AACount = pack->ReadUInt32(); TimeZone = pack->ReadUInt32(); TimePosted = pack->ReadUInt32(); Toggle = pack->ReadUInt32(); uint32 GuildID = GetGuildIDByName(GuildName); if(GuildID == GUILD_NONE) break; EQApplicationPacket *outapp = new EQApplicationPacket(OP_LFGuild, sizeof(LFGuild_GuildToggle_Struct)); LFGuild_GuildToggle_Struct *gts = (LFGuild_GuildToggle_Struct *)outapp->pBuffer; gts->Command = 1; strcpy(gts->Comment, Comments); gts->FromLevel = FromLevel; gts->ToLevel = ToLevel; gts->Classes = Classes; gts->AACount = AACount; gts->TimeZone = TimeZone; gts->Toggle = Toggle; gts->TimePosted = TimePosted; gts->Name[0] = 0; entity_list.QueueClientsGuild(nullptr, outapp, false, GuildID); safe_delete(outapp); break; } } } }