void WorldSession::HandleCharterRename(WorldPacket & recv_data) { uint64 guid; string name; recv_data >> guid >> name; Charter * pCharter = objmgr.GetCharterByItemGuid(guid); if(pCharter == 0) return; Guild * g = objmgr.GetGuildByGuildName(name); Charter * c = objmgr.GetCharterByName(name, (CharterTypes)pCharter->CharterType); if(c || g) { SendNotification("That name is in use by another guild."); return; } c = pCharter; c->GuildName = name; c->SaveToDB(); WorldPacket data(MSG_PETITION_RENAME, 100); data << guid << name; SendPacket(&data); }
void WorldSession::HandleCharterSign( WorldPacket & recv_data ) { uint64 item_guid; recv_data >> item_guid; if( !_player->IsInWorld() ) return; Charter * c = objmgr.GetCharterByItemGuid(item_guid); if(c == 0) return; if( _player->m_playerInfo->charterId[c->CharterType] != 0 ) { SendNotification("You cannot sign two charters of the same type."); return; } for(uint32 i = 0; i < 9; ++i) { if(c->Signatures[i] == _player->GetGUID()) { SendNotification("You have already signed that charter."); return; } } if(c->IsFull()) return; c->AddSignature(_player->GetLowGUID()); c->SaveToDB(); _player->m_playerInfo->charterId[c->CharterType] = c->GetID(); _player->SaveToDB(false); Player * l = _player->GetMapMgr()->GetPlayer(c->GetLeader()); if(l == 0) return; WorldPacket data(SMSG_PETITION_SIGN_RESULTS, 100); data << item_guid << _player->GetGUID() << uint32(0); l->GetSession()->SendPacket(&data); data.clear(); data << item_guid << (uint64)c->GetLeader() << uint32(0); SendPacket(&data); }
void WorldSession::HandleCharterSign( WorldPacket & recv_data ) { uint64 item_guid; recv_data >> item_guid; Charter * c = objmgr.GetCharterByItemGuid(item_guid); if( c == NULL ) return; for(uint32 i = 0; i < c->SignatureCount; ++i) { if(c->Signatures[i] == _player->GetGUID()) { SendNotification(_player->GetSession()->LocalizedWorldSrv(79)); return; } } if(c->IsFull()) return; c->AddSignature(_player->GetLowGUID()); c->SaveToDB(); _player->m_charters[c->CharterType] = c; _player->SaveToDB(false); Player * l = _player->GetMapMgr()->GetPlayer(c->GetLeader()); if(l == 0) return; WorldPacket data(SMSG_PETITION_SIGN_RESULTS, 100); data << item_guid << _player->GetGUID() << uint32(0); l->GetSession()->SendPacket(&data); data.clear(); data << item_guid << (uint64)c->GetLeader() << uint32(0); SendPacket(&data); }
// Charter part void WorldSession::HandleCharterBuy(WorldPacket & recv_data) { /* {CLIENT} Packet: (0x01BD) CMSG_PETITION_BUY PacketSize = 85 |------------------------------------------------|----------------| |00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |0123456789ABCDEF| |------------------------------------------------|----------------| |50 91 00 00 6E 13 01 F0 00 00 00 00 00 00 00 00 |P...n...........| |00 00 00 00 53 74 6F 72 6D 62 72 69 6E 67 65 72 |....Stormbringer| |73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |s...............| |00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| |00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 |................| |00 00 00 00 00 |..... | ------------------------------------------------------------------- */ uint64 creature_guid; uint64 crap; uint32 crap2; string name; uint8 error; uint32 crap3,crap4,crap5,crap6,crap7,crap8,crap9,crap10,crap11,arena_index,crap12; uint16 crap13; uint8 crap14; uint32 crap15; recv_data >> creature_guid >> crap >> crap2 >> name; recv_data >> crap3 >> crap4 >> crap5 >> crap6 >> crap7 >> crap8 >> crap9 >> crap10 >> crap11 >> crap12 >> crap13 >> crap14 >> arena_index >> crap15; Creature * crt = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(creature_guid)); if(!crt) { Disconnect(); return; } if( arena_index >= NUM_CHARTER_TYPES ) return; if(crt->GetEntry()==19861 || crt->GetEntry()==18897 || crt->GetEntry()==19856) /* i am lazy! */ { uint32 arena_type = arena_index - 1; if(arena_type > 2) return; if(_player->m_playerInfo->arenaTeam[arena_type]) { SendNotification("You are already in an arena team."); return; } if(_player->m_playerInfo->charterId[arena_index] != 0) { SendNotification("You already have an arena charter of this type."); return; } ArenaTeam * t = objmgr.GetArenaTeamByName(name, arena_type); if(t != NULL) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } if(objmgr.GetCharterByName(name, (CharterTypes)arena_index)) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } static uint32 item_ids[] = {ARENA_TEAM_CHARTER_2v2, ARENA_TEAM_CHARTER_3v3, ARENA_TEAM_CHARTER_5v5}; static uint32 costs[] = {ARENA_TEAM_CHARTER_2v2_COST,ARENA_TEAM_CHARTER_3v3_COST,ARENA_TEAM_CHARTER_5v5_COST}; if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < costs[arena_type] && !sWorld.free_arena_teams) return; // error message needed here ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(item_ids[arena_type]); ASSERT(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(0, 0, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ip,1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error); } else { // Create the item and charter Item * i = objmgr.CreateItem(item_ids[arena_type], _player); Charter * c = objmgr.CreateCharter(_player->GetLowGUID(), (CharterTypes)arena_index); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_FLAGS, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); delete i; return; } c->SaveToDB(); /*WorldPacket data(45); BuildItemPushResult(&data, _player->GetGUID(), ITEM_PUSH_TYPE_RECEIVE, 1, item_ids[arena_type], 0); SendPacket(&data);*/ SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); if(!sWorld.free_arena_teams) _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)costs[arena_type]); _player->m_playerInfo->charterId[arena_index] = c->GetID(); _player->SaveToDB(false); } } else { if( _player->GetUInt32Value(PLAYER_FIELD_COINAGE) < 1000 && !sWorld.free_guild_charters ) { SendNotification("You don't have enough money."); return; } if(_player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] != 0) { SendNotification("You already have a guild charter."); return; } Guild * g = objmgr.GetGuildByGuildName(name); Charter * c = objmgr.GetCharterByName(name, CHARTER_TYPE_GUILD); if(g != 0 || c != 0) { SendNotification("A guild with that name already exists."); return; } ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER); assert(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(0, 0, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER),1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error); } else { // Meh... WorldPacket data(SMSG_PLAY_OBJECT_SOUND, 12); data << uint32(0x000019C2); data << creature_guid; SendPacket(&data); // Create the item and charter Item * i = objmgr.CreateItem(ITEM_ENTRY_GUILD_CHARTER, _player); c = objmgr.CreateCharter(_player->GetLowGUID(), CHARTER_TYPE_GUILD); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_FLAGS, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); delete i; return; } c->SaveToDB(); /*data.clear(); data.resize(45); BuildItemPushResult(&data, _player->GetGUID(), ITEM_PUSH_TYPE_RECEIVE, 1, ITEM_ENTRY_GUILD_CHARTER, 0); SendPacket(&data);*/ SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); _player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] = c->GetID(); // 10 silver if(!sWorld.free_guild_charters) _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -1000); _player->SaveToDB(false); } } }
// Charter part void WorldSession::HandleCharterBuy(WorldPacket & recv_data) { uint8 error; uint64 creature_guid; uint32 crap; uint64 crap2; string name, unkstr; uint32 Data[7]; uint16 crap10; uint32 crap11; uint32 crap12, PetitionSignerCount; string crap13; uint32 arena_index; recv_data >> creature_guid; recv_data >> crap >> crap2; recv_data >> name >> unkstr; recv_data >> Data[0] >> Data[1] >> Data[2] >> Data[3] >> Data[4] >> Data[5] >> Data[6]; recv_data >> crap10; recv_data >> crap11 >> crap12 >> PetitionSignerCount; for(uint32 s = 0; s < 10; ++s) recv_data >> crap13; recv_data >> arena_index; Creature* crt = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(creature_guid)); if(!crt) { Disconnect(); return; } if( arena_index >= NUM_CHARTER_TYPES ) return; //All arena organizers should be allowed to create arena charter's if( !crt->ArenaOrganizersFlags() ) { uint32 arena_type = arena_index - 1; if(arena_type > 2) return; if(_player->m_playerInfo->arenaTeam[arena_type]) { SendNotification("You are already in an arena team."); return; } if(_player->m_playerInfo->charterId[arena_index] != 0) { SendNotification("You already have an arena charter of this type."); return; } if(!sWorld.VerifyName(name.c_str(), name.length())) { SendNotification("That name is invalid or contains invalid characters."); return; } ArenaTeam * t = objmgr.GetArenaTeamByName(name, arena_type); if(t != NULL) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } if(objmgr.GetCharterByName(name, (CharterTypes)arena_index)) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } static uint32 item_ids[] = {ARENA_TEAM_CHARTER_2v2, ARENA_TEAM_CHARTER_3v3, ARENA_TEAM_CHARTER_5v5}; static uint32 costs[] = {ARENA_TEAM_CHARTER_2v2_COST,ARENA_TEAM_CHARTER_3v3_COST,ARENA_TEAM_CHARTER_5v5_COST}; if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < costs[arena_type]) { sChatHandler.SystemMessage(this,"You don't have enough money!"); return; // error message needed here } ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(item_ids[arena_type]); ASSERT(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ip,1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM,error); } else { // Create the item and charter Item* i = objmgr.CreateItem(item_ids[arena_type], _player); Charter * c = objmgr.CreateCharter(_player->GetLowGUID(), (CharterTypes)arena_index); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->Bind(ITEM_BIND_ON_PICKUP); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); c = NULL; i->DeleteMe(); i = NULL; return; } c->SaveToDB(); SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)costs[arena_type]); _player->m_playerInfo->charterId[arena_index] = c->GetID(); _player->SaveToDB(false); } } else { if( _player->GetUInt32Value(PLAYER_FIELD_COINAGE) < 1000) { SendNotification("You don't have enough money."); return; } if(_player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] != 0) { SendNotification("You already have a guild charter."); return; } if(!sWorld.VerifyName(name.c_str(), name.length())) { SendNotification("That name is invalid or contains invalid characters."); return; } Guild * g = objmgr.GetGuildByGuildName(name); Charter * c = objmgr.GetCharterByName(name, CHARTER_TYPE_GUILD); if(g != 0 || c != 0) { SendNotification("A guild with that name already exists."); return; } ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER); assert(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER),1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULLITEM, NULLITEM,error); } else { // Meh... WorldPacket data(SMSG_PLAY_OBJECT_SOUND, 12); data << uint32(0x000019C2); data << creature_guid; SendPacket(&data); // Create the item and charter Item * i = objmgr.CreateItem(ITEM_ENTRY_GUILD_CHARTER, _player); c = objmgr.CreateCharter(_player->GetLowGUID(), CHARTER_TYPE_GUILD); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->Bind(ITEM_BIND_ON_PICKUP); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); c = NULL; i->DeleteMe(); i = NULL; return; } c->SaveToDB(); SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); _player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] = c->GetID(); // 10 silver _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -1000); _player->SaveToDB(false); } } }
// Charter part void WorldSession::HandleCharterBuy(WorldPacket & recv_data) { CHECK_PACKET_SIZE(recv_data, 8+8+4+1+5*8+2+1+4+4); uint64 creature_guid; uint64 unk1, unk3, unk4, unk5, unk6, unk7; uint32 unk2; std::string name; uint16 unk8; uint8 unk9; uint32 arena_index; uint32 unk10; uint8 error; recv_data >> creature_guid; // NPC GUID recv_data >> unk1; // 0 recv_data >> unk2; // 0 recv_data >> name; // name // recheck CHECK_PACKET_SIZE(recv_data, 8+8+4+(name.size()+1)+5*8+2+1+4+4); recv_data >> unk3; // 0 recv_data >> unk4; // 0 recv_data >> unk5; // 0 recv_data >> unk6; // 0 recv_data >> unk7; // 0 recv_data >> unk8; // 0 recv_data >> unk9; // 0 recv_data >> arena_index; // index recv_data >> unk10; // 0 Creature* crt = _player->GetMapMgr()->GetCreature(GET_LOWGUID_PART(creature_guid)); if(!crt) { Disconnect(); return; } if( arena_index >= NUM_CHARTER_TYPES ) return; if( crt->IsArenaOrganizer() ) // All arena organizers should be allowed to create arena charter's { uint32 arena_type = arena_index - 1; if(arena_type > 2) return; if(_player->m_playerInfo->arenaTeam[arena_type]) { SendNotification("You are already in an arena team."); return; } if(_player->m_playerInfo->charterId[arena_index] != 0) { SendNotification("You already have an arena charter of this type."); return; } ArenaTeam * t = objmgr.GetArenaTeamByName(name, arena_type); if(t != NULL) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } if(objmgr.GetCharterByName(name, (CharterTypes)arena_index)) { sChatHandler.SystemMessage(this,"That name is already in use."); return; } static uint32 item_ids[] = {ARENA_TEAM_CHARTER_2v2, ARENA_TEAM_CHARTER_3v3, ARENA_TEAM_CHARTER_5v5}; static uint32 costs[] = {ARENA_TEAM_CHARTER_2v2_COST,ARENA_TEAM_CHARTER_3v3_COST,ARENA_TEAM_CHARTER_5v5_COST}; if(_player->GetUInt32Value(PLAYER_FIELD_COINAGE) < costs[arena_type] && !sWorld.free_arena_teams) return; // error message needed here ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(item_ids[arena_type]); ASSERT(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ip,1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error); } else { // Create the item and charter Item* i = objmgr.CreateItem(item_ids[arena_type], _player); Charter * c = objmgr.CreateCharter(_player->GetLowGUID(), (CharterTypes)arena_index); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_FLAGS, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); c = NULL; i->Destructor(); i = NULL; return; } c->SaveToDB(); SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); if(!sWorld.free_arena_teams) _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -(int32)costs[arena_type]); _player->m_playerInfo->charterId[arena_index] = c->GetID(); _player->SaveToDB(false); } } else { if( _player->GetUInt32Value(PLAYER_FIELD_COINAGE) < 1000 && !sWorld.free_guild_charters ) { SendNotification("You don't have enough money."); return; } if(_player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] != 0) { SendNotification("You already have a guild charter."); return; } Guild * g = objmgr.GetGuildByGuildName(name); Charter * c = objmgr.GetCharterByName(name, CHARTER_TYPE_GUILD); if(g != 0 || c != 0) { SendNotification("A guild with that name already exists."); return; } ItemPrototype * ip = ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER); assert(ip); SlotResult res = _player->GetItemInterface()->FindFreeInventorySlot(ip); if(res.Result == 0) { _player->GetItemInterface()->BuildInventoryChangeError(NULL, NULL, INV_ERR_INVENTORY_FULL); return; } error = _player->GetItemInterface()->CanReceiveItem(ItemPrototypeStorage.LookupEntry(ITEM_ENTRY_GUILD_CHARTER),1, NULL); if(error) { _player->GetItemInterface()->BuildInventoryChangeError(NULL,NULL,error); } else { // Meh... WorldPacket data(SMSG_PLAY_OBJECT_SOUND, 12); data << uint32(0x000019C2); data << creature_guid; SendPacket(&data); // Create the item and charter Item* i = objmgr.CreateItem(ITEM_ENTRY_GUILD_CHARTER, _player); c = objmgr.CreateCharter(_player->GetLowGUID(), CHARTER_TYPE_GUILD); c->GuildName = name; c->ItemGuid = i->GetGUID(); i->SetUInt32Value(ITEM_FIELD_STACK_COUNT, 1); i->SetUInt32Value(ITEM_FIELD_FLAGS, 1); i->SetUInt32Value(ITEM_FIELD_ENCHANTMENT_1_1, c->GetID()); i->SetUInt32Value(ITEM_FIELD_PROPERTY_SEED, 57813883); if( !_player->GetItemInterface()->AddItemToFreeSlot(i) ) { c->Destroy(); i->Destructor(); return; } c->SaveToDB(); SendItemPushResult(i, false, true, false, true, _player->GetItemInterface()->LastSearchItemBagSlot(), _player->GetItemInterface()->LastSearchItemSlot(), 1); _player->m_playerInfo->charterId[CHARTER_TYPE_GUILD] = c->GetID(); // 10 silver if(!sWorld.free_guild_charters) _player->ModUnsigned32Value(PLAYER_FIELD_COINAGE, -1000); _player->SaveToDB(false); } } }