mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 07:37:01 +00:00
Merge commit 'origin/master' into 310
This commit is contained in:
commit
f72a8bc6dc
21 changed files with 161 additions and 62 deletions
1
NEWS
1
NEWS
|
|
@ -17,6 +17,7 @@ Version 0.13
|
||||||
* Under discussion.
|
* Under discussion.
|
||||||
* OpenSSL lib upgrade to OpenSSL 0.9.8k
|
* OpenSSL lib upgrade to OpenSSL 0.9.8k
|
||||||
* ZThread replaced by similar ACE framework functionality. ZThread use dropped.
|
* ZThread replaced by similar ACE framework functionality. ZThread use dropped.
|
||||||
|
* Visual Studio 2003 (VC71) support dropped
|
||||||
* Upgrade to client version 3.0.9 (build 9551).
|
* Upgrade to client version 3.0.9 (build 9551).
|
||||||
|
|
||||||
Version 0.12
|
Version 0.12
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `realmd_db_version`;
|
DROP TABLE IF EXISTS `realmd_db_version`;
|
||||||
CREATE TABLE `realmd_db_version` (
|
CREATE TABLE `realmd_db_version` (
|
||||||
`required_7546_02_realmd_uptime` bit(1) default NULL
|
`required_7867_01_realmd_account` bit(1) default NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=FIXED COMMENT='Last applied sql update to DB';
|
||||||
|
|
||||||
--
|
--
|
||||||
|
|
@ -50,7 +50,7 @@ CREATE TABLE `account` (
|
||||||
`s` longtext,
|
`s` longtext,
|
||||||
`email` text,
|
`email` text,
|
||||||
`joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
|
`joindate` timestamp NOT NULL default CURRENT_TIMESTAMP,
|
||||||
`last_ip` varchar(30) NOT NULL default '127.0.0.1',
|
`last_ip` varchar(30) NOT NULL default '0.0.0.0',
|
||||||
`failed_logins` int(11) unsigned NOT NULL default '0',
|
`failed_logins` int(11) unsigned NOT NULL default '0',
|
||||||
`locked` tinyint(3) unsigned NOT NULL default '0',
|
`locked` tinyint(3) unsigned NOT NULL default '0',
|
||||||
`last_login` timestamp NOT NULL default '0000-00-00 00:00:00',
|
`last_login` timestamp NOT NULL default '0000-00-00 00:00:00',
|
||||||
|
|
@ -107,7 +107,7 @@ UNLOCK TABLES;
|
||||||
|
|
||||||
DROP TABLE IF EXISTS `ip_banned`;
|
DROP TABLE IF EXISTS `ip_banned`;
|
||||||
CREATE TABLE `ip_banned` (
|
CREATE TABLE `ip_banned` (
|
||||||
`ip` varchar(32) NOT NULL default '127.0.0.1',
|
`ip` varchar(32) NOT NULL default '0.0.0.0',
|
||||||
`bandate` bigint(40) NOT NULL,
|
`bandate` bigint(40) NOT NULL,
|
||||||
`unbandate` bigint(40) NOT NULL,
|
`unbandate` bigint(40) NOT NULL,
|
||||||
`bannedby` varchar(50) NOT NULL default '[Console]',
|
`bannedby` varchar(50) NOT NULL default '[Console]',
|
||||||
|
|
|
||||||
4
sql/updates/7867_01_realmd_account.sql
Normal file
4
sql/updates/7867_01_realmd_account.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
ALTER TABLE realmd_db_version CHANGE COLUMN required_7546_02_realmd_uptime required_7867_01_realmd_account bit;
|
||||||
|
|
||||||
|
ALTER TABLE `account` CHANGE COLUMN `last_ip` `last_ip` varchar(30) NOT NULL default '0.0.0.0';
|
||||||
|
ALTER TABLE `ip_banned` CHANGE COLUMN `ip` `ip` varchar(32) NOT NULL default '0.0.0.0';
|
||||||
|
|
@ -190,6 +190,7 @@ pkgdata_DATA = \
|
||||||
7839_02_mangos_command.sql \
|
7839_02_mangos_command.sql \
|
||||||
7850_01_mangos_command.sql \
|
7850_01_mangos_command.sql \
|
||||||
7855_01_mangos_pools.sql \
|
7855_01_mangos_pools.sql \
|
||||||
|
7867_01_realmd_account.sql \
|
||||||
README
|
README
|
||||||
|
|
||||||
## Additional files to include when running 'make dist'
|
## Additional files to include when running 'make dist'
|
||||||
|
|
@ -360,4 +361,5 @@ EXTRA_DIST = \
|
||||||
7839_02_mangos_command.sql \
|
7839_02_mangos_command.sql \
|
||||||
7850_01_mangos_command.sql \
|
7850_01_mangos_command.sql \
|
||||||
7855_01_mangos_pools.sql \
|
7855_01_mangos_pools.sql \
|
||||||
|
7867_01_realmd_account.sql \
|
||||||
README
|
README
|
||||||
|
|
|
||||||
|
|
@ -1297,7 +1297,7 @@ bool Creature::CreateFromProto(uint32 guidlow, uint32 Entry, uint32 team, const
|
||||||
Map *map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId());
|
Map *map = MapManager::Instance().FindMap(GetMapId(), GetInstanceId());
|
||||||
if(map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData())
|
if(map && map->IsDungeon() && ((InstanceMap*)map)->GetInstanceData())
|
||||||
{
|
{
|
||||||
((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this, Entry);
|
((InstanceMap*)map)->GetInstanceData()->OnCreatureCreate(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -946,7 +946,7 @@ struct ItemEntry
|
||||||
{
|
{
|
||||||
uint32 ID; // 0
|
uint32 ID; // 0
|
||||||
uint32 Class; // 1
|
uint32 Class; // 1
|
||||||
//uint32 SubClass; // 2 some items have strnage subclasses
|
uint32 SubClass; // 2 some items have strnage subclasses
|
||||||
int32 Unk0; // 3
|
int32 Unk0; // 3
|
||||||
int32 Material; // 4
|
int32 Material; // 4
|
||||||
uint32 DisplayId; // 5
|
uint32 DisplayId; // 5
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ const char GtOCTRegenHPfmt[]="f";
|
||||||
const char GtRegenHPPerSptfmt[]="f";
|
const char GtRegenHPPerSptfmt[]="f";
|
||||||
const char GtRegenMPPerSptfmt[]="f";
|
const char GtRegenMPPerSptfmt[]="f";
|
||||||
const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
const char Holidaysfmt[]="nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
|
||||||
const char Itemfmt[]="nixiiiii";
|
const char Itemfmt[]="niiiiiii";
|
||||||
const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx";
|
const char ItemBagFamilyfmt[]="nxxxxxxxxxxxxxxxxx";
|
||||||
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
|
//const char ItemDisplayTemplateEntryfmt[]="nxxxxxxxxxxixxxxxxxxxxx";
|
||||||
//const char ItemCondExtCostsEntryfmt[]="xiii";
|
//const char ItemCondExtCostsEntryfmt[]="xiii";
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ class MANGOS_DLL_SPEC InstanceData
|
||||||
virtual void OnObjectCreate(GameObject *) {}
|
virtual void OnObjectCreate(GameObject *) {}
|
||||||
|
|
||||||
//called on creature creation
|
//called on creature creation
|
||||||
virtual void OnCreatureCreate(Creature * /*creature*/, uint32 /*creature_entry*/) {}
|
virtual void OnCreatureCreate(Creature * /*creature*/) {}
|
||||||
|
|
||||||
//All-purpose data storage 64 bit
|
//All-purpose data storage 64 bit
|
||||||
virtual uint64 GetData64(uint32 /*Data*/) { return 0; }
|
virtual uint64 GetData64(uint32 /*Data*/) { return 0; }
|
||||||
|
|
|
||||||
|
|
@ -4599,7 +4599,7 @@ bool ChatHandler::HandleResetSpellsCommand(const char * args)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(target_guid));
|
CharacterDatabase.PExecute("UPDATE characters SET at_login = at_login | '%u' WHERE guid = '%u'",uint32(AT_LOGIN_RESET_SPELLS), GUID_LOPART(target_guid));
|
||||||
PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,target_name);
|
PSendSysMessage(LANG_RESET_SPELLS_OFFLINE,target_name.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
|
|
@ -788,8 +788,8 @@ void ObjectMgr::LoadEquipmentTemplates()
|
||||||
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
|
sLog.outString( ">> Loaded %u equipment template", sEquipmentStorage.RecordCount );
|
||||||
sLog.outString();
|
sLog.outString();
|
||||||
|
|
||||||
// This DBC is currently only used for item templates and creature equipments checks.
|
// Creature items can be not listed in item_template
|
||||||
sItemStore.Clear();
|
//sItemStore.Clear(); -- so used in spell casting
|
||||||
}
|
}
|
||||||
|
|
||||||
CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid)
|
CreatureModelInfo const* ObjectMgr::GetCreatureModelInfo(uint32 modelid)
|
||||||
|
|
|
||||||
|
|
@ -211,6 +211,9 @@ bool Pet::LoadPetFromDB( Player* owner, uint32 petentry, uint32 petnumber, bool
|
||||||
sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
|
sLog.outError("Pet have incorrect type (%u) for pet loading.", getPetType());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(owner->IsPvP())
|
||||||
|
SetPvP(true);
|
||||||
|
|
||||||
InitStatsForLevel(petlevel);
|
InitStatsForLevel(petlevel);
|
||||||
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
|
SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, time(NULL));
|
||||||
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
|
SetUInt32Value(UNIT_FIELD_PETEXPERIENCE, fields[5].GetUInt32());
|
||||||
|
|
|
||||||
|
|
@ -2079,6 +2079,11 @@ void Player::SetGameMaster(bool on)
|
||||||
pet->getHostilRefManager().setOnlineOfflineState(false);
|
pet->getHostilRefManager().setOnlineOfflineState(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int8 i = 0; i < MAX_TOTEM; ++i)
|
||||||
|
if(m_TotemSlot[i])
|
||||||
|
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
|
||||||
|
totem->setFaction(35);
|
||||||
|
|
||||||
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
||||||
ResetContestedPvP();
|
ResetContestedPvP();
|
||||||
|
|
||||||
|
|
@ -2103,6 +2108,11 @@ void Player::SetGameMaster(bool on)
|
||||||
pet->getHostilRefManager().setOnlineOfflineState(true);
|
pet->getHostilRefManager().setOnlineOfflineState(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (int8 i = 0; i < MAX_TOTEM; ++i)
|
||||||
|
if(m_TotemSlot[i])
|
||||||
|
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
|
||||||
|
totem->setFaction(getFaction());
|
||||||
|
|
||||||
// restore FFA PvP Server state
|
// restore FFA PvP Server state
|
||||||
if(sWorld.IsFFAPvPRealm())
|
if(sWorld.IsFFAPvPRealm())
|
||||||
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_FFA_PVP);
|
||||||
|
|
@ -17311,11 +17321,6 @@ void Player::UpdatePvP(bool state, bool ovrride)
|
||||||
if(!state || ovrride)
|
if(!state || ovrride)
|
||||||
{
|
{
|
||||||
SetPvP(state);
|
SetPvP(state);
|
||||||
if(Pet* pet = GetPet())
|
|
||||||
pet->SetPvP(state);
|
|
||||||
if(Unit* charmed = GetCharm())
|
|
||||||
charmed->SetPvP(state);
|
|
||||||
|
|
||||||
pvpInfo.endTimer = 0;
|
pvpInfo.endTimer = 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -17323,14 +17328,7 @@ void Player::UpdatePvP(bool state, bool ovrride)
|
||||||
if(pvpInfo.endTimer != 0)
|
if(pvpInfo.endTimer != 0)
|
||||||
pvpInfo.endTimer = time(NULL);
|
pvpInfo.endTimer = time(NULL);
|
||||||
else
|
else
|
||||||
{
|
|
||||||
SetPvP(state);
|
SetPvP(state);
|
||||||
|
|
||||||
if(Pet* pet = GetPet())
|
|
||||||
pet->SetPvP(state);
|
|
||||||
if(Unit* charmed = GetCharm())
|
|
||||||
charmed->SetPvP(state);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1737,6 +1737,33 @@ void Spell::SetTargetMap(uint32 i,uint32 cur,UnitList& TagUnitMap)
|
||||||
TagUnitMap.push_back(pet);
|
TagUnitMap.push_back(pet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (m_spellInfo->Id==52759) //Ancestral Awakening (special target selection)
|
||||||
|
{
|
||||||
|
float lowestPerc = (float)m_caster->GetHealth() / (float)m_caster->GetMaxHealth();
|
||||||
|
Unit* lowestTarget = m_caster;
|
||||||
|
|
||||||
|
if (pGroup)
|
||||||
|
{
|
||||||
|
Group::MemberSlotList const& members = pGroup->GetMemberSlots();
|
||||||
|
Group::MemberSlotList::const_iterator itr = members.begin();
|
||||||
|
for(; itr != members.end(); ++itr)
|
||||||
|
{
|
||||||
|
if (Unit* member = ObjectAccessor::GetPlayer(*m_caster, (*itr).guid))
|
||||||
|
{
|
||||||
|
if (member == m_caster || member->isDead() || m_caster->IsHostileTo(member) || !m_caster->IsWithinDistInMap(member, radius))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
float perc = (float)member->GetHealth() / (float)member->GetMaxHealth();
|
||||||
|
if (perc <= lowestPerc)
|
||||||
|
{
|
||||||
|
lowestPerc = perc;
|
||||||
|
lowestTarget = member;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
TagUnitMap.push_back(lowestTarget);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if(pGroup)
|
if(pGroup)
|
||||||
|
|
@ -3048,7 +3075,40 @@ void Spell::WriteAmmoToPacket( WorldPacket * data )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// TODO: implement selection ammo data based at ranged weapon stored in equipmodel/equipinfo/equipslot fields
|
else
|
||||||
|
{
|
||||||
|
for (uint8 i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
if(uint32 item_id = m_caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i))
|
||||||
|
{
|
||||||
|
if(ItemEntry const * itemEntry = sItemStore.LookupEntry(item_id))
|
||||||
|
{
|
||||||
|
if(itemEntry->Class==ITEM_CLASS_WEAPON)
|
||||||
|
{
|
||||||
|
switch(itemEntry->SubClass)
|
||||||
|
{
|
||||||
|
case ITEM_SUBCLASS_WEAPON_THROWN:
|
||||||
|
ammoDisplayID = itemEntry->DisplayId;
|
||||||
|
ammoInventoryType = itemEntry->InventoryType;
|
||||||
|
break;
|
||||||
|
case ITEM_SUBCLASS_WEAPON_BOW:
|
||||||
|
case ITEM_SUBCLASS_WEAPON_CROSSBOW:
|
||||||
|
ammoDisplayID = 5996; // is this need fixing?
|
||||||
|
ammoInventoryType = INVTYPE_AMMO;
|
||||||
|
break;
|
||||||
|
case ITEM_SUBCLASS_WEAPON_GUN:
|
||||||
|
ammoDisplayID = 5998; // is this need fixing?
|
||||||
|
ammoInventoryType = INVTYPE_AMMO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ammoDisplayID)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
*data << uint32(ammoDisplayID);
|
*data << uint32(ammoDisplayID);
|
||||||
*data << uint32(ammoInventoryType);
|
*data << uint32(ammoInventoryType);
|
||||||
|
|
|
||||||
|
|
@ -3968,12 +3968,6 @@ void Aura::HandleAuraModUseNormalSpeed(bool /*apply*/, bool Real)
|
||||||
|
|
||||||
void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
|
void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
|
||||||
{
|
{
|
||||||
uint32 mechanic = 1 << m_modifier.m_miscvalue;
|
|
||||||
|
|
||||||
//immune movement impairment and loss of control
|
|
||||||
if(GetId() == 42292 || GetId() == 59752)
|
|
||||||
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
|
||||||
|
|
||||||
// cache values in local vars for prevent access to possible deleted aura data
|
// cache values in local vars for prevent access to possible deleted aura data
|
||||||
SpellEntry const* spellInfo = GetSpellProto();
|
SpellEntry const* spellInfo = GetSpellProto();
|
||||||
uint32 misc = m_modifier.m_miscvalue;
|
uint32 misc = m_modifier.m_miscvalue;
|
||||||
|
|
@ -3981,6 +3975,12 @@ void Aura::HandleModMechanicImmunity(bool apply, bool /*Real*/)
|
||||||
|
|
||||||
if(apply && spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
if(apply && spellInfo->AttributesEx & SPELL_ATTR_EX_DISPEL_AURAS_ON_IMMUNITY)
|
||||||
{
|
{
|
||||||
|
uint32 mechanic = 1 << m_modifier.m_miscvalue;
|
||||||
|
|
||||||
|
//immune movement impairment and loss of control
|
||||||
|
if(GetId()==42292 || GetId()==59752)
|
||||||
|
mechanic=IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
||||||
|
|
||||||
Unit::AuraMap& Auras = target->GetAuras();
|
Unit::AuraMap& Auras = target->GetAuras();
|
||||||
for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
|
for(Unit::AuraMap::iterator iter = Auras.begin(), next; iter != Auras.end(); iter = next)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -1141,6 +1141,11 @@ void Spell::EffectDummy(uint32 i)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
case 52759: // Ancestral Awakening
|
||||||
|
if (!unitTarget)
|
||||||
|
return;
|
||||||
|
m_caster->CastCustomSpell(unitTarget, 52752, &damage, NULL, NULL, true);
|
||||||
|
return;
|
||||||
case 53341:
|
case 53341:
|
||||||
case 53343:
|
case 53343:
|
||||||
{
|
{
|
||||||
|
|
@ -1690,6 +1695,12 @@ void Spell::EffectDummy(uint32 i)
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Cleansing Totem
|
||||||
|
if(m_spellInfo->SpellFamilyFlags & 0x0000000004000000LL && m_spellInfo->SpellIconID==1673)
|
||||||
|
{
|
||||||
|
m_caster->CastSpell(unitTarget, 52025, true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
// Healing Stream Totem
|
// Healing Stream Totem
|
||||||
if(m_spellInfo->SpellFamilyFlags & 0x0000000000002000LL)
|
if(m_spellInfo->SpellFamilyFlags & 0x0000000000002000LL)
|
||||||
{
|
{
|
||||||
|
|
@ -4173,6 +4184,9 @@ void Spell::EffectSummonPet(uint32 i)
|
||||||
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||||
NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
|
NewSummon->SetUInt32Value(UNIT_FIELD_FLAGS,UNIT_FLAG_PVP_ATTACKABLE);
|
||||||
|
|
||||||
|
if(m_caster->IsPvP())
|
||||||
|
NewSummon->SetPvP(true);
|
||||||
|
|
||||||
NewSummon->InitStatsForLevel(petlevel);
|
NewSummon->InitStatsForLevel(petlevel);
|
||||||
NewSummon->InitPetCreateSpells();
|
NewSummon->InitPetCreateSpells();
|
||||||
NewSummon->InitLevelupSpellsForLevel();
|
NewSummon->InitLevelupSpellsForLevel();
|
||||||
|
|
@ -5511,6 +5525,9 @@ void Spell::EffectSummonTotem(uint32 i)
|
||||||
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||||
pTotem->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
pTotem->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
||||||
|
|
||||||
|
if(m_caster->IsPvP())
|
||||||
|
pTotem->SetPvP(true);
|
||||||
|
|
||||||
pTotem->Summon(m_caster);
|
pTotem->Summon(m_caster);
|
||||||
|
|
||||||
if(slot < MAX_TOTEM && m_caster->GetTypeId() == TYPEID_PLAYER)
|
if(slot < MAX_TOTEM && m_caster->GetTypeId() == TYPEID_PLAYER)
|
||||||
|
|
|
||||||
|
|
@ -5765,7 +5765,6 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||||
// Ancestral Awakening
|
// Ancestral Awakening
|
||||||
if (dummySpell->SpellIconID == 3065)
|
if (dummySpell->SpellIconID == 3065)
|
||||||
{
|
{
|
||||||
// TODO: frite dummy fot triggered spell
|
|
||||||
triggered_spell_id = 52759;
|
triggered_spell_id = 52759;
|
||||||
basepoints0 = triggerAmount * damage / 100;
|
basepoints0 = triggerAmount * damage / 100;
|
||||||
target = this;
|
target = this;
|
||||||
|
|
@ -11353,6 +11352,9 @@ Pet* Unit::CreateTamedPetFrom(Creature* creatureTarget,uint32 spell_id)
|
||||||
if(GetTypeId()==TYPEID_PLAYER)
|
if(GetTypeId()==TYPEID_PLAYER)
|
||||||
pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
pet->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
|
||||||
|
|
||||||
|
if(IsPvP())
|
||||||
|
pet->SetPvP(true);
|
||||||
|
|
||||||
uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
|
uint32 level = (creatureTarget->getLevel() < (getLevel() - 5)) ? (getLevel() - 5) : creatureTarget->getLevel();
|
||||||
|
|
||||||
if(!pet->InitStatsForLevel(level))
|
if(!pet->InitStatsForLevel(level))
|
||||||
|
|
@ -11557,3 +11559,21 @@ void Unit::NearTeleportTo( float x, float y, float z, float orientation, bool ca
|
||||||
SendMessageToSet(&data, false);
|
SendMessageToSet(&data, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Unit::SetPvP( bool state )
|
||||||
|
{
|
||||||
|
if(state)
|
||||||
|
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
|
||||||
|
else
|
||||||
|
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
|
||||||
|
|
||||||
|
if(Pet* pet = GetPet())
|
||||||
|
pet->SetPvP(state);
|
||||||
|
if(Unit* charmed = GetCharm())
|
||||||
|
charmed->SetPvP(state);
|
||||||
|
|
||||||
|
for (int8 i = 0; i < MAX_TOTEM; ++i)
|
||||||
|
if(m_TotemSlot[i])
|
||||||
|
if(Creature *totem = GetMap()->GetCreature(m_TotemSlot[i]))
|
||||||
|
totem->SetPvP(state);
|
||||||
|
}
|
||||||
|
|
@ -960,13 +960,7 @@ class MANGOS_DLL_SPEC Unit : public WorldObject
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
|
bool IsPvP() const { return HasByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP); }
|
||||||
void SetPvP(bool state)
|
void SetPvP(bool state);
|
||||||
{
|
|
||||||
if(state)
|
|
||||||
SetByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
|
|
||||||
else
|
|
||||||
RemoveByteFlag(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_PVP);
|
|
||||||
}
|
|
||||||
uint32 GetCreatureType() const;
|
uint32 GetCreatureType() const;
|
||||||
uint32 GetCreatureTypeMask() const
|
uint32 GetCreatureTypeMask() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
extern RealmList m_realmList;
|
extern RealmList m_realmList;
|
||||||
|
|
||||||
extern DatabaseType dbRealmServer;
|
extern DatabaseType loginDatabase;
|
||||||
|
|
||||||
#define ChunkSize 2048
|
#define ChunkSize 2048
|
||||||
|
|
||||||
|
|
@ -323,7 +323,7 @@ void AuthSocket::_SetVSFields(const std::string& rI)
|
||||||
const char *v_hex, *s_hex;
|
const char *v_hex, *s_hex;
|
||||||
v_hex = v.AsHexStr();
|
v_hex = v.AsHexStr();
|
||||||
s_hex = s.AsHexStr();
|
s_hex = s.AsHexStr();
|
||||||
dbRealmServer.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() );
|
loginDatabase.PExecute("UPDATE account SET v = '%s', s = '%s' WHERE username = '%s'",v_hex,s_hex, _safelogin.c_str() );
|
||||||
OPENSSL_free((void*)v_hex);
|
OPENSSL_free((void*)v_hex);
|
||||||
OPENSSL_free((void*)s_hex);
|
OPENSSL_free((void*)s_hex);
|
||||||
}
|
}
|
||||||
|
|
@ -379,18 +379,18 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||||
//Escape the user login to avoid further SQL injection
|
//Escape the user login to avoid further SQL injection
|
||||||
//Memory will be freed on AuthSocket object destruction
|
//Memory will be freed on AuthSocket object destruction
|
||||||
_safelogin=_login;
|
_safelogin=_login;
|
||||||
dbRealmServer.escape_string(_safelogin);
|
loginDatabase.escape_string(_safelogin);
|
||||||
|
|
||||||
pkt << (uint8) AUTH_LOGON_CHALLENGE;
|
pkt << (uint8) AUTH_LOGON_CHALLENGE;
|
||||||
pkt << (uint8) 0x00;
|
pkt << (uint8) 0x00;
|
||||||
|
|
||||||
///- Verify that this IP is not in the ip_banned table
|
///- Verify that this IP is not in the ip_banned table
|
||||||
// No SQL injection possible (paste the IP address as passed by the socket)
|
// No SQL injection possible (paste the IP address as passed by the socket)
|
||||||
dbRealmServer.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
loginDatabase.Execute("DELETE FROM ip_banned WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||||
|
|
||||||
std::string address = GetRemoteAddress();
|
std::string address = GetRemoteAddress();
|
||||||
dbRealmServer.escape_string(address);
|
loginDatabase.escape_string(address);
|
||||||
QueryResult *result = dbRealmServer.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str());
|
QueryResult *result = loginDatabase.PQuery( "SELECT * FROM ip_banned WHERE ip = '%s'",address.c_str());
|
||||||
if(result)
|
if(result)
|
||||||
{
|
{
|
||||||
pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
|
pkt << (uint8)REALM_AUTH_ACCOUNT_BANNED;
|
||||||
|
|
@ -402,7 +402,7 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||||
///- Get the account details from the account table
|
///- Get the account details from the account table
|
||||||
// No SQL injection (escaped user name)
|
// No SQL injection (escaped user name)
|
||||||
|
|
||||||
result = dbRealmServer.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ());
|
result = loginDatabase.PQuery("SELECT sha_pass_hash,id,locked,last_ip,gmlevel FROM account WHERE username = '%s'",_safelogin.c_str ());
|
||||||
if( result )
|
if( result )
|
||||||
{
|
{
|
||||||
///- If the IP is 'locked', check that the player comes indeed from the correct IP address
|
///- If the IP is 'locked', check that the player comes indeed from the correct IP address
|
||||||
|
|
@ -430,9 +430,9 @@ bool AuthSocket::_HandleLogonChallenge()
|
||||||
if (!locked)
|
if (!locked)
|
||||||
{
|
{
|
||||||
//set expired bans to inactive
|
//set expired bans to inactive
|
||||||
dbRealmServer.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
loginDatabase.Execute("UPDATE account_banned SET active = 0 WHERE unbandate<=UNIX_TIMESTAMP() AND unbandate<>bandate");
|
||||||
///- If the account is banned, reject the logon attempt
|
///- If the account is banned, reject the logon attempt
|
||||||
QueryResult *banresult = dbRealmServer.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32());
|
QueryResult *banresult = loginDatabase.PQuery("SELECT bandate,unbandate FROM account_banned WHERE id = %u AND active = 1", (*result)[1].GetUInt32());
|
||||||
if(banresult)
|
if(banresult)
|
||||||
{
|
{
|
||||||
if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64())
|
if((*banresult)[0].GetUInt64() == (*banresult)[1].GetUInt64())
|
||||||
|
|
@ -651,7 +651,7 @@ bool AuthSocket::_HandleLogonProof()
|
||||||
///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account
|
///- Update the sessionkey, last_ip, last login time and reset number of failed logins in the account table for this account
|
||||||
// No SQL injection (escaped user name) and IP address as received by socket
|
// No SQL injection (escaped user name) and IP address as received by socket
|
||||||
const char* K_hex = K.AsHexStr();
|
const char* K_hex = K.AsHexStr();
|
||||||
dbRealmServer.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() );
|
loginDatabase.PExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = '%u', failed_logins = 0 WHERE username = '%s'", K_hex, GetRemoteAddress().c_str(), GetLocaleByName(_localizationName), _safelogin.c_str() );
|
||||||
OPENSSL_free((void*)K_hex);
|
OPENSSL_free((void*)K_hex);
|
||||||
|
|
||||||
///- Finish SRP6 and send the final result to the client
|
///- Finish SRP6 and send the final result to the client
|
||||||
|
|
@ -682,9 +682,9 @@ bool AuthSocket::_HandleLogonProof()
|
||||||
if(MaxWrongPassCount > 0)
|
if(MaxWrongPassCount > 0)
|
||||||
{
|
{
|
||||||
//Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP
|
//Increment number of failed logins by one and if it reaches the limit temporarily ban that account or IP
|
||||||
dbRealmServer.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str());
|
loginDatabase.PExecute("UPDATE account SET failed_logins = failed_logins + 1 WHERE username = '%s'",_safelogin.c_str());
|
||||||
|
|
||||||
if(QueryResult *loginfail = dbRealmServer.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str()))
|
if(QueryResult *loginfail = loginDatabase.PQuery("SELECT id, failed_logins FROM account WHERE username = '%s'", _safelogin.c_str()))
|
||||||
{
|
{
|
||||||
Field* fields = loginfail->Fetch();
|
Field* fields = loginfail->Fetch();
|
||||||
uint32 failed_logins = fields[1].GetUInt32();
|
uint32 failed_logins = fields[1].GetUInt32();
|
||||||
|
|
@ -697,7 +697,7 @@ bool AuthSocket::_HandleLogonProof()
|
||||||
if(WrongPassBanType)
|
if(WrongPassBanType)
|
||||||
{
|
{
|
||||||
uint32 acc_id = fields[0].GetUInt32();
|
uint32 acc_id = fields[0].GetUInt32();
|
||||||
dbRealmServer.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban',1)",
|
loginDatabase.PExecute("INSERT INTO account_banned VALUES ('%u',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban',1)",
|
||||||
acc_id, WrongPassBanTime);
|
acc_id, WrongPassBanTime);
|
||||||
sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times",
|
sLog.outBasic("[AuthChallenge] account %s got banned for '%u' seconds because it failed to authenticate '%u' times",
|
||||||
_login.c_str(), WrongPassBanTime, failed_logins);
|
_login.c_str(), WrongPassBanTime, failed_logins);
|
||||||
|
|
@ -705,8 +705,8 @@ bool AuthSocket::_HandleLogonProof()
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
std::string current_ip = GetRemoteAddress();
|
std::string current_ip = GetRemoteAddress();
|
||||||
dbRealmServer.escape_string(current_ip);
|
loginDatabase.escape_string(current_ip);
|
||||||
dbRealmServer.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban')",
|
loginDatabase.PExecute("INSERT INTO ip_banned VALUES ('%s',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+'%u','MaNGOS realmd','Failed login autoban')",
|
||||||
current_ip.c_str(), WrongPassBanTime);
|
current_ip.c_str(), WrongPassBanTime);
|
||||||
sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times",
|
sLog.outBasic("[AuthChallenge] IP %s got banned for '%u' seconds because account %s failed to authenticate '%u' times",
|
||||||
current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins);
|
current_ip.c_str(), WrongPassBanTime, _login.c_str(), failed_logins);
|
||||||
|
|
@ -752,7 +752,7 @@ bool AuthSocket::_HandleReconnectChallenge()
|
||||||
_login = (const char*)ch->I;
|
_login = (const char*)ch->I;
|
||||||
_safelogin = _login;
|
_safelogin = _login;
|
||||||
|
|
||||||
QueryResult *result = dbRealmServer.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ());
|
QueryResult *result = loginDatabase.PQuery ("SELECT sessionkey FROM account WHERE username = '%s'", _safelogin.c_str ());
|
||||||
|
|
||||||
// Stop if the account is not found
|
// Stop if the account is not found
|
||||||
if (!result)
|
if (!result)
|
||||||
|
|
@ -832,7 +832,7 @@ bool AuthSocket::_HandleRealmList()
|
||||||
///- Get the user id (else close the connection)
|
///- Get the user id (else close the connection)
|
||||||
// No SQL injection (escaped user name)
|
// No SQL injection (escaped user name)
|
||||||
|
|
||||||
QueryResult *result = dbRealmServer.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str());
|
QueryResult *result = loginDatabase.PQuery("SELECT id,sha_pass_hash FROM account WHERE username = '%s'",_safelogin.c_str());
|
||||||
if(!result)
|
if(!result)
|
||||||
{
|
{
|
||||||
sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str());
|
sLog.outError("[ERROR] user %s tried to login and we cannot find him in the database.",_login.c_str());
|
||||||
|
|
@ -857,7 +857,7 @@ bool AuthSocket::_HandleRealmList()
|
||||||
uint8 AmountOfCharacters;
|
uint8 AmountOfCharacters;
|
||||||
|
|
||||||
// No SQL injection. id of realm is controlled by the database.
|
// No SQL injection. id of realm is controlled by the database.
|
||||||
result = dbRealmServer.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id);
|
result = loginDatabase.PQuery( "SELECT numchars FROM realmcharacters WHERE realmid = '%d' AND acctid='%u'",i->second.m_ID,id);
|
||||||
if( result )
|
if( result )
|
||||||
{
|
{
|
||||||
Field *fields = result->Fetch();
|
Field *fields = result->Fetch();
|
||||||
|
|
|
||||||
|
|
@ -54,7 +54,7 @@ void HookSignals();
|
||||||
bool stopEvent = false; ///< Setting it to true stops the server
|
bool stopEvent = false; ///< Setting it to true stops the server
|
||||||
RealmList m_realmList; ///< Holds the list of realms for this server
|
RealmList m_realmList; ///< Holds the list of realms for this server
|
||||||
|
|
||||||
DatabaseType dbRealmServer; ///< Accessor to the realm server database
|
DatabaseType loginDatabase; ///< Accessor to the realm server database
|
||||||
|
|
||||||
/// Print out the usage string for this program on the console.
|
/// Print out the usage string for this program on the console.
|
||||||
void usage(const char *prog)
|
void usage(const char *prog)
|
||||||
|
|
@ -262,7 +262,7 @@ extern int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
loopCounter = 0;
|
loopCounter = 0;
|
||||||
sLog.outDetail("Ping MySQL to keep connection alive");
|
sLog.outDetail("Ping MySQL to keep connection alive");
|
||||||
delete dbRealmServer.Query("SELECT 1 FROM realmlist LIMIT 1");
|
delete loginDatabase.Query("SELECT 1 FROM realmlist LIMIT 1");
|
||||||
}
|
}
|
||||||
#ifdef WIN32
|
#ifdef WIN32
|
||||||
if (m_ServiceStatus == 0) stopEvent = true;
|
if (m_ServiceStatus == 0) stopEvent = true;
|
||||||
|
|
@ -271,7 +271,7 @@ extern int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
///- Wait for the delay thread to exit
|
///- Wait for the delay thread to exit
|
||||||
dbRealmServer.HaltDelayThread();
|
loginDatabase.HaltDelayThread();
|
||||||
|
|
||||||
///- Remove signal handling before leaving
|
///- Remove signal handling before leaving
|
||||||
UnhookSignals();
|
UnhookSignals();
|
||||||
|
|
@ -310,7 +310,7 @@ bool StartDB(std::string &dbstring)
|
||||||
}
|
}
|
||||||
|
|
||||||
sLog.outString("Database: %s", dbstring.c_str() );
|
sLog.outString("Database: %s", dbstring.c_str() );
|
||||||
if(!dbRealmServer.Initialize(dbstring.c_str()))
|
if(!loginDatabase.Initialize(dbstring.c_str()))
|
||||||
{
|
{
|
||||||
sLog.outError("Cannot connect to database");
|
sLog.outError("Cannot connect to database");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
INSTANTIATE_SINGLETON_1( RealmList );
|
INSTANTIATE_SINGLETON_1( RealmList );
|
||||||
|
|
||||||
extern DatabaseType dbRealmServer;
|
extern DatabaseType loginDatabase;
|
||||||
|
|
||||||
RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL))
|
RealmList::RealmList( ) : m_UpdateInterval(0), m_NextUpdateTime(time(NULL))
|
||||||
{
|
{
|
||||||
|
|
@ -79,7 +79,7 @@ void RealmList::UpdateRealms(bool init)
|
||||||
{
|
{
|
||||||
sLog.outDetail("Updating Realm List...");
|
sLog.outDetail("Updating Realm List...");
|
||||||
|
|
||||||
QueryResult *result = dbRealmServer.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" );
|
QueryResult *result = loginDatabase.Query( "SELECT id, name, address, port, icon, color, timezone, allowedSecurityLevel, population FROM realmlist WHERE color <> 3 ORDER BY name" );
|
||||||
|
|
||||||
///- Circle through results and add them to the realm map
|
///- Circle through results and add them to the realm map
|
||||||
if(result)
|
if(result)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "7866"
|
#define REVISION_NR "7877"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue