aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Group.cpp21
-rw-r--r--src/game/Group.h3
-rw-r--r--src/game/GroupHandler.cpp2
-rw-r--r--src/game/Level3.cpp2
-rw-r--r--src/game/Object.cpp45
-rw-r--r--src/game/Object.h4
-rw-r--r--src/game/Pet.cpp6
-rw-r--r--src/game/Player.cpp2
-rw-r--r--src/game/Unit.h2
-rw-r--r--src/trinitycore/trinitycore.conf.dist1
10 files changed, 81 insertions, 7 deletions
diff --git a/src/game/Group.cpp b/src/game/Group.cpp
index 3e9dcff7d1b..85c707d41f0 100644
--- a/src/game/Group.cpp
+++ b/src/game/Group.cpp
@@ -295,12 +295,14 @@ bool Group::AddMember(const uint64 &guid, const char* name)
uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method)
{
+ BroadcastGroupUpdate();
+
// remove member and change leader (if need) only if strong more 2 members _before_ member remove
if(GetMembersCount() > (isBGGroup() ? 1 : 2)) // in BG group case allow 1 members group
{
bool leaderChanged = _removeMember(guid);
- Player *player = objmgr.GetPlayer( guid );
+ Player *player = objmgr.GetPlayer( guid ); // FG: TODO: could be removed, its just here for consistency
if (player)
{
WorldPacket data;
@@ -1517,3 +1519,20 @@ void Group::_homebindIfInstance(Player *player)
player->m_InstanceValid = false;
}
}
+
+void Group::BroadcastGroupUpdate(void)
+{
+ // FG: HACK: force flags update on group leave - for values update hack
+ // -- not very efficient but safe
+ for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
+ {
+
+ Player *pp = objmgr.GetPlayer(citr->guid);
+ if(pp && pp->IsInWorld())
+ {
+ pp->ForceValuesUpdateAtIndex(UNIT_FIELD_BYTES_2);
+ pp->ForceValuesUpdateAtIndex(UNIT_FIELD_FACTIONTEMPLATE);
+ DEBUG_LOG("-- Forced group value update for '%s'", pp->GetName());
+ }
+ }
+} \ No newline at end of file
diff --git a/src/game/Group.h b/src/game/Group.h
index 8417a145268..7cb37b17ff0 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -330,6 +330,9 @@ class TRINITY_DLL_SPEC Group
InstanceGroupBind* GetBoundInstance(uint32 mapid, uint8 difficulty);
BoundInstancesMap& GetBoundInstances(uint8 difficulty) { return m_boundInstances[difficulty]; }
+ // FG: evil hacks
+ void BroadcastGroupUpdate(void);
+
protected:
bool _addMember(const uint64 &guid, const char* name, bool isAssistant=false);
bool _addMember(const uint64 &guid, const char* name, bool isAssistant, uint8 group);
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp
index 02901f0bcc9..679c16ced58 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -215,6 +215,8 @@ void WorldSession::HandleGroupAcceptOpcode( WorldPacket & /*recv_data*/ )
uint8 subgroup = group->GetMemberGroup(GetPlayer()->GetGUID());
GetPlayer()->SetGroup(group, subgroup);
+
+ group->BroadcastGroupUpdate();
}
void WorldSession::HandleGroupDeclineOpcode( WorldPacket & /*recv_data*/ )
diff --git a/src/game/Level3.cpp b/src/game/Level3.cpp
index a825743481a..c14320fd68c 100644
--- a/src/game/Level3.cpp
+++ b/src/game/Level3.cpp
@@ -4465,7 +4465,7 @@ static bool HandleResetStatsOrLevelHelper(Player* player)
// set UNIT_FIELD_BYTES_1 to init state but preserve m_form value
player->SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
+ player->SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_UNK5 );
player->SetByteValue(UNIT_FIELD_BYTES_2, 3, player->m_form);
player->SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE);
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 6d6cbb4f865..d114d1e82ca 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -626,6 +626,38 @@ void Object::_BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask
else
*data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_OTHER_TAGGER);
}
+ // FG: pretend that OTHER players in own group are friendly ("blue")
+ else if(index == UNIT_FIELD_BYTES_2 || index == UNIT_FIELD_FACTIONTEMPLATE)
+ {
+ bool ch = false;
+ if(target->GetTypeId() == TYPEID_PLAYER && GetTypeId() == TYPEID_PLAYER && target != this)
+ {
+ if(target->IsInSameGroupWith((Player*)this) || target->IsInSameRaidWith((Player*)this))
+ {
+ if(index == UNIT_FIELD_BYTES_2)
+ {
+ DEBUG_LOG("-- VALUES_UPDATE: Sending '%s' the blue-group-fix from '%s' (flag)", target->GetName(), ((Player*)this)->GetName());
+ *data << ( m_uint32Values[ index ] & (UNIT_BYTE2_FLAG_SANCTUARY << 8) ); // this flag is at uint8 offset 1 !!
+ ch = true;
+ }
+ else if(index == UNIT_FIELD_FACTIONTEMPLATE)
+ {
+ FactionTemplateEntry const *ft1, *ft2;
+ ft1 = ((Player*)this)->getFactionTemplateEntry();
+ ft2 = ((Player*)target)->getFactionTemplateEntry();
+ if(ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
+ {
+ uint32 faction = ((Player*)target)->getFaction(); // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
+ DEBUG_LOG("-- VALUES_UPDATE: Sending '%s' the blue-group-fix from '%s' (faction %u)", target->GetName(), ((Player*)this)->GetName(), faction);
+ *data << uint32(faction);
+ ch = true;
+ }
+ }
+ }
+ }
+ if(!ch)
+ *data << m_uint32Values[ index ];
+ }
else
{
// send in current format (float as float, uint32 as uint32)
@@ -1297,6 +1329,19 @@ void WorldObject::SendPlaySound(uint32 Sound, bool OnlySelf)
SendMessageToSet( &data, true ); // ToSelf ignored in this case
}
+void Object::ForceValuesUpdateAtIndex(uint32 i)
+{
+ m_uint32Values_mirror[i] = GetUInt32Value(i) + 1; // makes server think the field changed
+ if(m_inWorld)
+ {
+ if(!m_objectUpdated)
+ {
+ ObjectAccessor::Instance().AddUpdateObject(this);
+ m_objectUpdated = true;
+ }
+ }
+}
+
namespace Trinity
{
class MessageChatLocaleCacheDo
diff --git a/src/game/Object.h b/src/game/Object.h
index ad56e687733..187092d5779 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -301,6 +301,10 @@ class TRINITY_DLL_SPEC Object
virtual bool hasQuest(uint32 /* quest_id */) const { return false; }
virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; }
+
+ // FG: some hacky helpers
+ void ForceValuesUpdateAtIndex(uint32);
+
protected:
Object ( );
diff --git a/src/game/Pet.cpp b/src/game/Pet.cpp
index d42ab2af746..fe532428251 100644
--- a/src/game/Pet.cpp
+++ b/src/game/Pet.cpp
@@ -231,7 +231,7 @@ bool Pet::LoadPetFromDB( Unit* owner, uint32 petentry, uint32 petnumber, bool cu
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
SetByteValue(UNIT_FIELD_BYTES_1, 1, fields[8].GetUInt32());
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
if(fields[12].GetBool())
SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_NOT_ALLOWED);
@@ -978,7 +978,7 @@ bool Pet::CreateBaseAtCreature(Creature* creature)
{
SetUInt32Value(UNIT_FIELD_BYTES_0, 0x02020100);
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
SetByteValue(UNIT_FIELD_BYTES_2, 2, UNIT_RENAME_ALLOWED);
SetUInt32Value(UNIT_MOD_CAST_SPEED, creature->GetUInt32Value(UNIT_MOD_CAST_SPEED) );
@@ -1760,7 +1760,7 @@ bool Pet::Create(uint32 guidlow, Map *map, uint32 Entry, uint32 pet_number)
return false;
SetByteValue(UNIT_FIELD_BYTES_2, 0, SHEATH_STATE_MELEE );
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5 );
if(getPetType() == MINI_PET) // always non-attackable
SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE);
diff --git a/src/game/Player.cpp b/src/game/Player.cpp
index daf589dd9aa..46d10e37b12 100644
--- a/src/game/Player.cpp
+++ b/src/game/Player.cpp
@@ -561,7 +561,7 @@ bool Player::Create( uint32 guidlow, const std::string& name, uint8 race, uint8
SetUInt32Value(UNIT_FIELD_BYTES_0, ( RaceClassGender | ( powertype << 24 ) ) );
SetUInt32Value(UNIT_FIELD_BYTES_1, unitfield);
- SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_UNK3 | UNIT_BYTE2_FLAG_UNK5 );
+ SetByteValue(UNIT_FIELD_BYTES_2, 1, UNIT_BYTE2_FLAG_SANCTUARY | UNIT_BYTE2_FLAG_UNK5 );
SetUInt32Value(UNIT_FIELD_FLAGS, UNIT_FLAG_PVP_ATTACKABLE );
SetFloatValue(UNIT_MOD_CAST_SPEED, 1.0f); // fix cast time showed in spell tooltip on client
diff --git a/src/game/Unit.h b/src/game/Unit.h
index ec192fe9428..5d5b0d492f6 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -171,7 +171,7 @@ enum UnitBytes2_Flags
UNIT_BYTE2_FLAG_UNK0 = 0x01,
UNIT_BYTE2_FLAG_UNK1 = 0x02,
UNIT_BYTE2_FLAG_UNK2 = 0x04,
- UNIT_BYTE2_FLAG_UNK3 = 0x08,
+ UNIT_BYTE2_FLAG_SANCTUARY = 0x08,
UNIT_BYTE2_FLAG_AURAS = 0x10, // show possitive auras as positive, and allow its dispel
UNIT_BYTE2_FLAG_UNK5 = 0x20,
UNIT_BYTE2_FLAG_UNK6 = 0x40,
diff --git a/src/trinitycore/trinitycore.conf.dist b/src/trinitycore/trinitycore.conf.dist
index 91b0209acd4..af81a84038f 100644
--- a/src/trinitycore/trinitycore.conf.dist
+++ b/src/trinitycore/trinitycore.conf.dist
@@ -670,6 +670,7 @@ AllowTwoSide.Interaction.Auction = 0
AllowTwoSide.Interaction.Mail = 0
AllowTwoSide.WhoList = 0
AllowTwoSide.AddFriend = 0
+AllowTwoSide.Trade = 0
TalentsInspecting = 1
###################################################################################################################