Merge branch 'master' into 303

This commit is contained in:
tomrus88 2008-12-01 08:21:10 +03:00
commit 518d7f6297
11 changed files with 86 additions and 97 deletions

View file

@ -152,6 +152,14 @@ class ArenaTeam
return NULL; return NULL;
} }
ArenaTeamMember* GetMember(std::string& name)
{
for (MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
if(itr->name==name)
return &(*itr);
return NULL;
}
bool LoadArenaTeamFromDB(uint32 ArenaTeamId); bool LoadArenaTeamFromDB(uint32 ArenaTeamId);
void LoadMembersFromDB(uint32 ArenaTeamId); void LoadMembersFromDB(uint32 ArenaTeamId);

View file

@ -289,25 +289,8 @@ void WorldSession::HandleArenaTeamRemoveFromTeamOpcode(WorldPacket & recv_data)
recv_data >> name; recv_data >> name;
ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId);
if(!at) if(!at) // arena team not found
{
// arena team not found
return; return;
}
uint64 guid = objmgr.GetPlayerGUIDByName(name);
if(!guid)
{
// player guid not found
return;
}
if(at->GetCaptain() == guid)
{
// unsure
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_PERMISSIONS);
return;
}
if(at->GetCaptain() != _player->GetGUID()) if(at->GetCaptain() != _player->GetGUID())
{ {
@ -315,13 +298,20 @@ void WorldSession::HandleArenaTeamRemoveFromTeamOpcode(WorldPacket & recv_data)
return; return;
} }
if(at->GetCaptain() == guid) if(!normalizePlayerName(name))
return;
ArenaTeamMember* member = at->GetMember(name);
if(!member) // member not found
return;
if(at->GetCaptain() == member->guid)
{ {
SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S); SendArenaTeamCommandResult(ERR_ARENA_TEAM_CREATE_S, "", "", ERR_ARENA_TEAM_LEADER_LEAVE_S);
return; return;
} }
at->DelMember(guid); at->DelMember(member->guid);
// event // event
WorldPacket data; WorldPacket data;
@ -343,24 +333,8 @@ void WorldSession::HandleArenaTeamPromoteToCaptainOpcode(WorldPacket & recv_data
recv_data >> name; recv_data >> name;
ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId); ArenaTeam *at = objmgr.GetArenaTeamById(ArenaTeamId);
if(!at) if(!at) // arena team not found
{
// arena team not found
return; return;
}
uint64 guid = objmgr.GetPlayerGUIDByName(name);
if(!guid)
{
// player guid not found
return;
}
if(at->GetCaptain() == guid)
{
// target player already captain
return;
}
if(at->GetCaptain() != _player->GetGUID()) if(at->GetCaptain() != _player->GetGUID())
{ {
@ -368,7 +342,17 @@ void WorldSession::HandleArenaTeamPromoteToCaptainOpcode(WorldPacket & recv_data
return; return;
} }
at->SetCaptain(guid); if(!normalizePlayerName(name))
return;
ArenaTeamMember* member = at->GetMember(name);
if(!member) // member not found
return;
if(at->GetCaptain() == member->guid) // target player already captain
return;
at->SetCaptain(member->guid);
// event // event
WorldPacket data; WorldPacket data;

View file

@ -158,18 +158,20 @@ void WorldSession::HandleCharEnumOpcode( WorldPacket & /*recv_data*/ )
// ------- Query Without Declined Names -------- // ------- Query Without Declined Names --------
// 0 1 2 3 4 5 6 7 8 // 0 1 2 3 4 5 6 7 8
"SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, "
// 9 10 11 12 // 9 10 11 12 13
"characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level " "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid "
"FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='0' " "FROM characters LEFT JOIN character_pet ON characters.guid=character_pet.owner AND character_pet.slot='0' "
"LEFT JOIN guild_member ON characters.guid = guild_member.guid "
"WHERE characters.account = '%u' ORDER BY characters.guid" "WHERE characters.account = '%u' ORDER BY characters.guid"
: :
// --------- Query With Declined Names --------- // --------- Query With Declined Names ---------
// 0 1 2 3 4 5 6 7 8 // 0 1 2 3 4 5 6 7 8
"SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, " "SELECT characters.guid, characters.data, characters.name, characters.position_x, characters.position_y, characters.position_z, characters.map, characters.totaltime, characters.leveltime, "
// 9 10 11 12 13 // 9 10 11 12 13 14
"characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, genitive " "characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, guild_member.guildid, genitive "
"FROM characters LEFT JOIN character_pet ON characters.guid = character_pet.owner AND character_pet.slot='0' " "FROM characters LEFT JOIN character_pet ON characters.guid = character_pet.owner AND character_pet.slot='0' "
"LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid " "LEFT JOIN character_declinedname ON characters.guid = character_declinedname.guid "
"LEFT JOIN guild_member ON characters.guid = guild_member.guid "
"WHERE characters.account = '%u' ORDER BY characters.guid", "WHERE characters.account = '%u' ORDER BY characters.guid",
GetAccountId()); GetAccountId());
} }
@ -569,6 +571,22 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
DEBUG_LOG( "WORLD: Sent motd (SMSG_MOTD)" ); DEBUG_LOG( "WORLD: Sent motd (SMSG_MOTD)" );
} }
//QueryResult *result = CharacterDatabase.PQuery("SELECT guildid,rank FROM guild_member WHERE guid = '%u'",pCurrChar->GetGUIDLow());
QueryResult *resultGuild = holder->GetResult(PLAYER_LOGIN_QUERY_LOADGUILD);
if(resultGuild)
{
Field *fields = resultGuild->Fetch();
pCurrChar->SetInGuild(fields[0].GetUInt32());
pCurrChar->SetRank(fields[1].GetUInt32());
delete resultGuild;
}
else if(pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership
{
pCurrChar->SetInGuild(0);
pCurrChar->SetRank(0);
}
if(pCurrChar->GetGuildId() != 0) if(pCurrChar->GetGuildId() != 0)
{ {
Guild* guild = objmgr.GetGuildById(pCurrChar->GetGuildId()); Guild* guild = objmgr.GetGuildById(pCurrChar->GetGuildId());
@ -627,22 +645,6 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder * holder)
} }
} }
//QueryResult *result = CharacterDatabase.PQuery("SELECT guildid,rank FROM guild_member WHERE guid = '%u'",pCurrChar->GetGUIDLow());
QueryResult *resultGuild = holder->GetResult(PLAYER_LOGIN_QUERY_LOADGUILD);
if(resultGuild)
{
Field *fields = resultGuild->Fetch();
pCurrChar->SetInGuild(fields[0].GetUInt32());
pCurrChar->SetRank(fields[1].GetUInt32());
delete resultGuild;
}
else if(pCurrChar->GetGuildId()) // clear guild related fields in case wrong data about non existed membership
{
pCurrChar->SetInGuild(0);
pCurrChar->SetRank(0);
}
if (!pCurrChar->GetMap()->Add(pCurrChar)) if (!pCurrChar->GetMap()->Add(pCurrChar))
{ {
AreaTrigger const* at = objmgr.GetGoBackTrigger(pCurrChar->GetMapId()); AreaTrigger const* at = objmgr.GetGoBackTrigger(pCurrChar->GetMapId());

View file

@ -1770,7 +1770,7 @@ bool Creature::IsOutOfThreatArea(Unit* pVictim) const
if(!pVictim->isInAccessablePlaceFor(this)) if(!pVictim->isInAccessablePlaceFor(this))
return true; return true;
if(sMapStore.LookupEntry(GetMapId())->Instanceable()) if(sMapStore.LookupEntry(GetMapId())->IsDungeon())
return false; return false;
float length = pVictim->GetDistance(CombatStartX,CombatStartY,CombatStartZ); float length = pVictim->GetDistance(CombatStartX,CombatStartY,CombatStartZ);

View file

@ -143,22 +143,13 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank)
CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')", CharacterDatabase.PExecute("INSERT INTO guild_member (guildid,guid,rank,pnote,offnote) VALUES ('%u', '%u', '%u','%s','%s')",
Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str()); Id, GUID_LOPART(plGuid), newmember.RankId, dbPnote.c_str(), dbOFFnote.c_str());
// If player not in game data in data field will be loaded from guild tables, no need to update it!!
if(pl) if(pl)
{ {
pl->SetInGuild(Id); pl->SetInGuild(Id);
pl->SetRank(newmember.RankId); pl->SetRank(newmember.RankId);
pl->SetGuildIdInvited(0); pl->SetGuildIdInvited(0);
} }
else
{
Tokens tokens;
if(Player::LoadValuesArrayFromDB(tokens,plGuid))
{
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, Id);
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, newmember.RankId);
Player::SaveValuesArrayInDB(tokens, plGuid);
}
}
return true; return true;
} }
@ -439,16 +430,15 @@ void Guild::DelMember(uint64 guid, bool isDisbanding)
SetLeader(newLeaderGUID); SetLeader(newLeaderGUID);
newLeader = objmgr.GetPlayer(newLeaderGUID); newLeader = objmgr.GetPlayer(newLeaderGUID);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if(newLeader) if(newLeader)
{ {
newLeader->SetRank(GR_GUILDMASTER); newLeader->SetRank(GR_GUILDMASTER);
newLeaderName = newLeader->GetName(); newLeaderName = newLeader->GetName();
} }
else else
{
Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, GR_GUILDMASTER, newLeaderGUID);
objmgr.GetPlayerNameByGUID(newLeaderGUID, newLeaderName); objmgr.GetPlayerNameByGUID(newLeaderGUID, newLeaderName);
}
// when leader non-exist (at guild load with deleted leader only) not send broadcasts // when leader non-exist (at guild load with deleted leader only) not send broadcasts
if(objmgr.GetPlayerNameByGUID(guid, oldLeaderName)) if(objmgr.GetPlayerNameByGUID(guid, oldLeaderName))
@ -479,21 +469,12 @@ void Guild::DelMember(uint64 guid, bool isDisbanding)
members.erase(GUID_LOPART(guid)); members.erase(GUID_LOPART(guid));
Player *player = objmgr.GetPlayer(guid); Player *player = objmgr.GetPlayer(guid);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if(player) if(player)
{ {
player->SetInGuild(0); player->SetInGuild(0);
player->SetRank(0); player->SetRank(0);
} }
else
{
Tokens tokens;
if(Player::LoadValuesArrayFromDB(tokens,guid))
{
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDID, 0);
Player::SetUInt32ValueInArray(tokens, PLAYER_GUILDRANK, GR_GUILDMASTER);
Player::SaveValuesArrayInDB(tokens, guid);
}
}
CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid)); CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guid = '%u'", GUID_LOPART(guid));
} }
@ -505,10 +486,9 @@ void Guild::ChangeRank(uint64 guid, uint32 newRank)
itr->second.RankId = newRank; itr->second.RankId = newRank;
Player *player = objmgr.GetPlayer(guid); Player *player = objmgr.GetPlayer(guid);
// If player not online data in data field will be loaded from guild tabs no need to update it !!
if(player) if(player)
player->SetRank(newRank); player->SetRank(newRank);
else
Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, newRank, guid);
CharacterDatabase.PExecute( "UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, GUID_LOPART(guid) ); CharacterDatabase.PExecute( "UPDATE guild_member SET rank='%u' WHERE guid='%u'", newRank, GUID_LOPART(guid) );
} }

View file

@ -977,7 +977,7 @@ void WorldSession::HandleGuildBankDeposit( WorldPacket & recv_data )
pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money); pGuild->SetBankMoney(pGuild->GetGuildBankMoney()+money);
GetPlayer()->ModifyMoney(-int(money)); GetPlayer()->ModifyMoney(-int(money));
GetPlayer()->SaveGoldToDB(); GetPlayer()->SaveDataFieldToDB(); //contains money
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
@ -1033,7 +1033,7 @@ void WorldSession::HandleGuildBankWithdraw( WorldPacket & recv_data )
} }
GetPlayer()->ModifyMoney(money); GetPlayer()->ModifyMoney(money);
GetPlayer()->SaveGoldToDB(); GetPlayer()->SaveDataFieldToDB(); // contains money
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();

View file

@ -517,7 +517,7 @@ void WorldSession::HandleTakeMoney(WorldPacket & recv_data )
// save money and mail to prevent cheating // save money and mail to prevent cheating
CharacterDatabase.BeginTransaction(); CharacterDatabase.BeginTransaction();
pl->SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,pl->GetMoney(),pl->GetGUID()); pl->SaveDataFieldToDB(); // contains money
pl->_SaveMail(); pl->_SaveMail();
CharacterDatabase.CommitTransaction(); CharacterDatabase.CommitTransaction();
} }

View file

@ -6400,7 +6400,7 @@ bool ObjectMgr::LoadMangosStrings(DatabaseType& db, char const* table, int32 min
bar.step(); bar.step();
sLog.outString(""); sLog.outString("");
if(min_value > 0) // error only in case internal strings if(min_value == MIN_MANGOS_STRING_ID) // error only in case internal strings
sLog.outErrorDb(">> Loaded 0 mangos strings. DB table `%s` is empty. Cannot continue.",table); sLog.outErrorDb(">> Loaded 0 mangos strings. DB table `%s` is empty. Cannot continue.",table);
else else
sLog.outString(">> Loaded 0 string templates. DB table `%s` is empty.",table); sLog.outString(">> Loaded 0 string templates. DB table `%s` is empty.",table);
@ -6466,7 +6466,7 @@ bool ObjectMgr::LoadMangosStrings(DatabaseType& db, char const* table, int32 min
delete result; delete result;
sLog.outString(); sLog.outString();
if(min_value > 0) // internal mangos strings if(min_value == MIN_MANGOS_STRING_ID) // error only in case internal strings
sLog.outString( ">> Loaded %u MaNGOS strings from table %s", count,table); sLog.outString( ">> Loaded %u MaNGOS strings from table %s", count,table);
else else
sLog.outString( ">> Loaded %u string templates from %s", count,table); sLog.outString( ">> Loaded %u string templates from %s", count,table);

View file

@ -1379,7 +1379,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
*p_data << GetPositionY(); *p_data << GetPositionY();
*p_data << GetPositionZ(); *p_data << GetPositionZ();
*p_data << GetUInt32Value(PLAYER_GUILDID); // guild id *p_data << (result ? result->Fetch()[13].GetUInt32() : 0);
uint32 char_flags = 0; uint32 char_flags = 0;
if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) if(HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM))
@ -1392,7 +1392,7 @@ void Player::BuildEnumData( QueryResult * result, WorldPacket * p_data )
char_flags |= CHARACTER_FLAG_RENAME; char_flags |= CHARACTER_FLAG_RENAME;
// always send the flag if declined names aren't used // always send the flag if declined names aren't used
// to let the client select a default method of declining the name // to let the client select a default method of declining the name
if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[13].GetCppString() != "")) if(!sWorld.getConfig(CONFIG_DECLINED_NAMES_USED) || (result && result->Fetch()[14].GetCppString() != ""))
char_flags |= CHARACTER_FLAG_DECLINED; char_flags |= CHARACTER_FLAG_DECLINED;
*p_data << (uint32)char_flags; // character flags *p_data << (uint32)char_flags; // character flags
@ -15357,7 +15357,8 @@ void Player::SaveToDB()
void Player::SaveInventoryAndGoldToDB() void Player::SaveInventoryAndGoldToDB()
{ {
_SaveInventory(); _SaveInventory();
SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID()); //money is in data field
SaveDataFieldToDB();
} }
void Player::_SaveActions() void Player::_SaveActions()
@ -15748,6 +15749,20 @@ void Player::SavePositionInDB(uint32 mapid, float x,float y,float z,float o,uint
CharacterDatabase.Execute(ss.str().c_str()); CharacterDatabase.Execute(ss.str().c_str());
} }
void Player::SaveDataFieldToDB()
{
std::ostringstream ss;
ss<<"UPDATE characters SET data='";
for(uint16 i = 0; i < m_valuesCount; i++ )
{
ss << GetUInt32Value(i) << " ";
}
ss<<"' WHERE guid='"<< GUID_LOPART(GetGUIDLow()) <<"'";
CharacterDatabase.Execute(ss.str().c_str());
}
bool Player::SaveValuesArrayInDB(Tokens const& tokens, uint64 guid) bool Player::SaveValuesArrayInDB(Tokens const& tokens, uint64 guid)
{ {
std::ostringstream ss2; std::ostringstream ss2;

View file

@ -1316,7 +1316,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void SaveToDB(); void SaveToDB();
void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing void SaveInventoryAndGoldToDB(); // fast save function for item/money cheating preventing
void SaveGoldToDB() { SetUInt32ValueInDB(PLAYER_FIELD_COINAGE,GetMoney(),GetGUID()); } void SaveDataFieldToDB();
static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid); static bool SaveValuesArrayInDB(Tokens const& data,uint64 guid);
static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value); static void SetUInt32ValueInArray(Tokens& data,uint16 index, uint32 value);
static void SetFloatValueInArray(Tokens& data,uint16 index, float value); static void SetFloatValueInArray(Tokens& data,uint16 index, float value);
@ -1561,8 +1561,8 @@ class MANGOS_DLL_SPEC Player : public Unit
void RemoveFromGroup() { RemoveFromGroup(GetGroup(),GetGUID()); } void RemoveFromGroup() { RemoveFromGroup(GetGroup(),GetGUID()); }
void SendUpdateToOutOfRangeGroupMembers(); void SendUpdateToOutOfRangeGroupMembers();
void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); Player::SetUInt32ValueInDB(PLAYER_GUILDID, GuildId, GetGUID()); } void SetInGuild(uint32 GuildId) { SetUInt32Value(PLAYER_GUILDID, GuildId); }
void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); Player::SetUInt32ValueInDB(PLAYER_GUILDRANK, rankId, GetGUID()); } void SetRank(uint32 rankId){ SetUInt32Value(PLAYER_GUILDRANK, rankId); }
void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; } void SetGuildIdInvited(uint32 GuildId) { m_GuildIdInvited = GuildId; }
uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); } uint32 GetGuildId() { return GetUInt32Value(PLAYER_GUILDID); }
static uint32 GetGuildIdFromDB(uint64 guid); static uint32 GetGuildIdFromDB(uint64 guid);
@ -1575,7 +1575,7 @@ class MANGOS_DLL_SPEC Player : public Unit
void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot) void SetInArenaTeam(uint32 ArenaTeamId, uint8 slot)
{ {
SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6), ArenaTeamId); SetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6), ArenaTeamId);
SetUInt32ValueInDB(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6), ArenaTeamId, GetGUID()); SaveDataFieldToDB(); // needed?
} }
uint32 GetArenaTeamId(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6)); } uint32 GetArenaTeamId(uint8 slot) { return GetUInt32Value(PLAYER_FIELD_ARENA_TEAM_INFO_1_1 + (slot * 6)); }
static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot); static uint32 GetArenaTeamIdFromDB(uint64 guid, uint8 slot);

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "6865" #define REVISION_NR "6870"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__