diff --git a/sql/characters.sql b/sql/characters.sql index 6bff1691c..ee289d2d0 100644 --- a/sql/characters.sql +++ b/sql/characters.sql @@ -21,7 +21,7 @@ DROP TABLE IF EXISTS `character_db_version`; CREATE TABLE `character_db_version` ( - `required_8402_02_characters_guild_bank_eventlog` bit(1) default NULL + `required_8409_01_characters_guild` bit(1) default NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB'; -- @@ -915,7 +915,7 @@ CREATE TABLE `guild` ( `BackgroundColor` int(5) NOT NULL default '0', `info` text NOT NULL, `motd` varchar(255) NOT NULL default '', - `createdate` datetime default NULL, + `createdate` bigint(20) NOT NULL default '0', `BankMoney` bigint(20) NOT NULL default '0', PRIMARY KEY (`guildid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC COMMENT='Guild System'; diff --git a/sql/updates/8409_01_characters_guild.sql b/sql/updates/8409_01_characters_guild.sql new file mode 100644 index 000000000..f08f861bb --- /dev/null +++ b/sql/updates/8409_01_characters_guild.sql @@ -0,0 +1,17 @@ +ALTER TABLE character_db_version CHANGE COLUMN required_8402_02_characters_guild_bank_eventlog required_8409_01_characters_guild bit; + + +-- Change createdate column type from datetime to bigint(20) + +-- add temporary column +ALTER TABLE guild ADD COLUMN created_temp bigint(20) default '0'; +-- update temporary columns data +UPDATE guild SET created_temp = UNIX_TIMESTAMP(createdate); +-- drop current column +ALTER TABLE guild DROP COLUMN createdate; +-- create new column with correct type +ALTER TABLE guild ADD COLUMN createdate bigint(20) NOT NULL default '0' AFTER motd; +-- copy data to new column +UPDATE guild set createdate = created_temp; +-- remove old column +ALTER TABLE guild DROP COLUMN created_temp; \ No newline at end of file diff --git a/sql/updates/Makefile.am b/sql/updates/Makefile.am index c07c1b667..ffb0148bc 100644 --- a/sql/updates/Makefile.am +++ b/sql/updates/Makefile.am @@ -92,6 +92,7 @@ pkgdata_DATA = \ 8399_01_mangos_spell_elixir.sql \ 8402_01_characters_guild_eventlog.sql \ 8402_02_characters_guild_bank_eventlog.sql \ + 8409_01_characters_guild.sql \ README ## Additional files to include when running 'make dist' @@ -164,4 +165,5 @@ EXTRA_DIST = \ 8399_01_mangos_spell_elixir.sql \ 8402_01_characters_guild_eventlog.sql \ 8402_02_characters_guild_bank_eventlog.sql \ + 8409_01_characters_guild.sql \ README diff --git a/src/game/Guild.cpp b/src/game/Guild.cpp index 761e834bd..0148a42a2 100644 --- a/src/game/Guild.cpp +++ b/src/game/Guild.cpp @@ -93,7 +93,7 @@ bool Guild::Create(Player* leader, std::string gname) // CharacterDatabase.PExecute("DELETE FROM guild WHERE guildid='%u'", Id); - MAX(guildid)+1 not exist CharacterDatabase.PExecute("DELETE FROM guild_member WHERE guildid='%u'", m_Id); CharacterDatabase.PExecute("INSERT INTO guild (guildid,name,leaderguid,info,motd,createdate,EmblemStyle,EmblemColor,BorderStyle,BorderColor,BackgroundColor,BankMoney) " - "VALUES('%u','%s','%u', '%s', '%s', NOW(),'%u','%u','%u','%u','%u','" UI64FMTD "')", + "VALUES('%u','%s','%u', '%s', '%s', UNIX_TIMESTAMP(NOW()),'%u','%u','%u','%u','%u','" UI64FMTD "')", m_Id, gname.c_str(), GUID_LOPART(m_LeaderGuid), dbGINFO.c_str(), dbMOTD.c_str(), m_EmblemStyle, m_EmblemColor, m_BorderStyle, m_BorderColor, m_BackgroundColor, m_GuildBankMoney); CharacterDatabase.CommitTransaction(); @@ -155,7 +155,6 @@ bool Guild::AddMember(uint64 plGuid, uint32 plRank) newmember.Class = fields[3].GetUInt32(); delete result; if(newmember.level < 1 || newmember.level > STRONG_MAX_LEVEL - || !newmember.zoneId || newmember.Class < CLASS_WARRIOR || newmember.Class >= MAX_CLASSES) { sLog.outError("Player (GUID: %u) has a broken data in field `characters` table, cannot add him to guild.",GUID_LOPART(plGuid)); @@ -213,11 +212,11 @@ bool Guild::LoadGuildFromDB(uint32 GuildId) //set m_Id in case guild data are broken in DB and Guild will be Disbanded (deleted from DB) m_Id = GuildId; - QueryResult *result = CharacterDatabase.PQuery("SELECT MAX(TabId) FROM guild_bank_tab WHERE guildid='%u'", GuildId); + QueryResult *result = CharacterDatabase.PQuery("SELECT COUNT(TabId) FROM guild_bank_tab WHERE guildid='%u'", GuildId); if(result) { Field *fields = result->Fetch(); - m_PurchasedTabs = fields[0].GetUInt8() + 1; // Because TabId begins at 0 + m_PurchasedTabs = fields[0].GetUInt32(); if (m_PurchasedTabs > GUILD_BANK_MAX_TABS) m_PurchasedTabs = GUILD_BANK_MAX_TABS; delete result; @@ -231,9 +230,9 @@ bool Guild::LoadGuildFromDB(uint32 GuildId) LoadBankRightsFromDB(GuildId); // Must be after LoadRanksFromDB because it populates rank struct - // 0 1 2 3 4 5 6 - result = CharacterDatabase.PQuery("SELECT guildid, name, leaderguid, EmblemStyle, EmblemColor, BorderStyle, BorderColor," - // 7 8 9 10 11 + // 0 1 2 3 4 5 + result = CharacterDatabase.PQuery("SELECT name, leaderguid, EmblemStyle, EmblemColor, BorderStyle, BorderColor," + // 6 7 8 9 10 "BackgroundColor, info, motd, createdate, BankMoney FROM guild WHERE guildid = '%u'", GuildId); if(!result) @@ -241,32 +240,34 @@ bool Guild::LoadGuildFromDB(uint32 GuildId) Field *fields = result->Fetch(); - m_Id = fields[0].GetUInt32(); - m_Name = fields[1].GetCppString(); - m_LeaderGuid = MAKE_NEW_GUID(fields[2].GetUInt32(), 0, HIGHGUID_PLAYER); + m_Name = fields[0].GetCppString(); + m_LeaderGuid = MAKE_NEW_GUID(fields[1].GetUInt32(), 0, HIGHGUID_PLAYER); - m_EmblemStyle = fields[3].GetUInt32(); - m_EmblemColor = fields[4].GetUInt32(); - m_BorderStyle = fields[5].GetUInt32(); - m_BorderColor = fields[6].GetUInt32(); - m_BackgroundColor = fields[7].GetUInt32(); - GINFO = fields[8].GetCppString(); - MOTD = fields[9].GetCppString(); - uint64 time = fields[10].GetUInt64(); //datetime is uint64 type ... YYYYmmdd:hh:mm:ss - m_GuildBankMoney = fields[11].GetUInt64(); + m_EmblemStyle = fields[2].GetUInt32(); + m_EmblemColor = fields[3].GetUInt32(); + m_BorderStyle = fields[4].GetUInt32(); + m_BorderColor = fields[5].GetUInt32(); + m_BackgroundColor = fields[6].GetUInt32(); + GINFO = fields[7].GetCppString(); + MOTD = fields[8].GetCppString(); + time_t time = fields[9].GetUInt64(); + m_GuildBankMoney = fields[10].GetUInt64(); delete result; - uint64 dTime = time /1000000; - m_CreatedDay = dTime%100; - m_CreatedMonth = (dTime/100)%100; - m_CreatedYear = (dTime/10000)%10000; + if (time > 0) + { + tm local = *(localtime(&time)); // dereference and assign + m_CreatedDay = local.tm_mday; + m_CreatedMonth = local.tm_mon + 1; + m_CreatedYear = local.tm_year + 1900; + } // Repair the structure of guild - // If the guildmaster does not exist attempt to promote another member - // or guildmaster isn't present in guild + // If the guildmaster doesn't exist or isn't the member of guild + // attempt to promote another member int32 GM_rights = GetRank(GUID_LOPART(m_LeaderGuid)); - if(!objmgr.GetPlayerAccountIdByGUID(m_LeaderGuid) || GM_rights == -1) + if(GM_rights == -1) { DelMember(m_LeaderGuid); // check no members case (disbanded) @@ -393,6 +394,7 @@ bool Guild::LoadMembersFromDB(uint32 GuildId) newmember.Class = fields[21].GetUInt32(); newmember.logout_time = fields[22].GetUInt64(); + //this code will remove unexisting character guids from guild if(newmember.level < 1 || newmember.level > STRONG_MAX_LEVEL) // can be at broken `data` field { sLog.outError("Player (GUID: %u) has a broken data in field `characters`.`data`, deleting him from guild!",GUID_LOPART(guid)); diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 8ee3a8d3e..a4185350c 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -6191,7 +6191,8 @@ uint32 Player::GetZoneIdFromDB(uint64 guid) zone = MapManager::Instance().GetZoneId(map,posx,posy,posz); - CharacterDatabase.PExecute("UPDATE characters SET zone='%u' WHERE guid='%u'", zone, guidLow); + if (zone > 0) + CharacterDatabase.PExecute("UPDATE characters SET zone='%u' WHERE guid='%u'", zone, guidLow); } return zone; diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index 9b27ec841..fc6d8bbf5 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -175,6 +175,7 @@ SpellSpecific GetSpellSpecific(uint32 spellId) if ((spellInfo->AttributesEx2 & SPELL_ATTR_EX2_FOOD_BUFF) || spellInfo->SpellIconID == 2560) return SPELL_WELL_FED; } + break; } case SPELLFAMILY_MAGE: { @@ -295,6 +296,7 @@ bool IsSingleFromSpellSpecificPerCaster(SpellSpecific spellSpec1,SpellSpecific s case SPELL_PRESENCE: case SPELL_HAND: case SPELL_WELL_FED: + return spellSpec1==spellSpec2; case SPELL_FOOD: return spellSpec2==SPELL_FOOD || spellSpec2==SPELL_FOOD_AND_DRINK; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 366fb0af2..34ff53d61 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8408" + #define REVISION_NR "8411" #endif // __REVISION_NR_H__