Compatible : MaNGOS 8827
[code=diff]
diff --git a/src/game/Group.cpp b/src/game/Group.cpp
index bf4d5d3..4773d73 100644
--- a/src/game/Group.cpp
+++ b/src/game/Group.cpp
@@ -338,10 +338,22 @@ bool Group::AddMember(const uint64 &guid, const char* name)
uint32 Group::RemoveMember(const uint64 &guid, const uint8 &method)
{
+ // Monkey
+ if (sWorld.getConfig(CONFIG_INTERFACTION)) {
+ BroadcastGroupUpdate();
+ }
+ // Monkey
+
// 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);
+
+ // Monkey
+ if (sWorld.getConfig(CONFIG_INTERFACTION)) {
+ // Player *player = sObjectMgr.GetPlayer(guid);
+ }
+ // Monkey
if(Player *player = sObjectMgr.GetPlayer( guid ))
{
@@ -1686,3 +1698,18 @@ void Group::_homebindIfInstance(Player *player)
player->m_InstanceValid = false;
}
}
+
+// Monkey
+void Group::BroadcastGroupUpdate(void)
+{
+ for(member_citerator citr = m_memberSlots.begin(); citr != m_memberSlots.end(); ++citr)
+ {
+ Player *pp = sObjectMgr.GetPlayer(citr->guid);
+ if(pp && pp->IsInWorld())
+ {
+ pp->ForceValuesUpdateAtIndex(UNIT_FIELD_BYTES_2);
+ pp->ForceValuesUpdateAtIndex(UNIT_FIELD_FACTIONTEMPLATE);
+ }
+ }
+}
+// Monkey
\ No newline at end of file
diff --git a/src/game/Group.h b/src/game/Group.h
index 0411036..6678ea0 100644
--- a/src/game/Group.h
+++ b/src/game/Group.h
@@ -336,6 +336,10 @@ class MANGOS_DLL_SPEC Group
InstanceGroupBind* GetBoundInstance(Player* player);
InstanceGroupBind* GetBoundInstance(Map* aMap);
BoundInstancesMap& GetBoundInstances(Difficulty difficulty) { return m_boundInstances[difficulty]; }
+
+ // Monkey
+ void BroadcastGroupUpdate(void);
+ // Monkey
protected:
bool _addMember(const uint64 &guid, const char* name, bool isAssistant=false);
diff --git a/src/game/GroupHandler.cpp b/src/game/GroupHandler.cpp
index 74c9e04..f7381cc 100644
--- a/src/game/GroupHandler.cpp
+++ b/src/game/GroupHandler.cpp
@@ -196,6 +196,14 @@ void WorldSession::HandleGroupAcceptOpcode( WorldPacket & /*recv_data*/ )
if(!group->AddMember(GetPlayer()->GetGUID(), GetPlayer()->GetName()))
return;
+ uint8 subgroup = group->GetMemberGroup(GetPlayer()->GetGUID());
+ // Monkey
+ if (sWorld.getConfig(CONFIG_INTERFACTION)) {
+ GetPlayer()->SetGroup(group, subgroup); // Defunct line added for test
+ group->BroadcastGroupUpdate();
+ }
+ // Monkey
+
}
void WorldSession::HandleGroupDeclineOpcode( WorldPacket & /*recv_data*/ )
diff --git a/src/game/Object.cpp b/src/game/Object.cpp
index 4c1ca17..b446a67 100644
--- a/src/game/Object.cpp
+++ b/src/game/Object.cpp
@@ -687,6 +687,54 @@ void Object::BuildValuesUpdate(uint8 updatetype, ByteBuffer * data, UpdateMask *
else
*data << (m_uint32Values[ index ] & ~UNIT_DYNFLAG_OTHER_TAGGER);
}
+ // Monkey
+ else if(sWorld.getConfig(CONFIG_INTERFACTION) && (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)
+ {
+ DEBUG_LOG("-- VALUES_UPDATE: Sending '%s' the blue-group-fix from '%s' (faction)", target->GetName(), ((Player*)this)->GetName());
+ if(target->getRace() == RACE_HUMAN)
+ *data << uint32(1);
+ else if(target->getRace() == RACE_ORC)
+ *data << uint32(2);
+ else if(target->getRace() == RACE_DWARF)
+ *data << uint32(3);
+ else if(target->getRace() == RACE_NIGHTELF)
+ *data << uint32(4);
+ else if(target->getRace() == RACE_UNDEAD_PLAYER)
+ *data << uint32(5);
+ else if(target->getRace() == RACE_TAUREN)
+ *data << uint32(6);
+ else if(target->getRace() == RACE_GNOME)
+ *data << uint32(115);
+ else if(target->getRace() == RACE_TROLL)
+ *data << uint32(116);
+ else if(target->getRace() == RACE_BLOODELF)
+ *data << uint32(1610);
+ else if(target->getRace() == RACE_DRAENEI)
+ *data << uint32(1629);
+ ch = true;
+ }
+
+ }
+ }
+ if(!ch)
+ *data << m_uint32Values[ index ];
+
+ }
+ // Monkey
+
else
{
// send in current format (float as float, uint32 as uint32)
@@ -1664,6 +1712,22 @@ Creature* WorldObject::SummonCreature(uint32 id, float x, float y, float z, floa
return pCreature;
}
+// Monkey
+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);
+ AddToClientUpdateList();
+ m_objectUpdated = true;
+ }
+ }
+}
+// Monkey
+
namespace MaNGOS
{
class NearUsedPosDo
diff --git a/src/game/Object.h b/src/game/Object.h
index 4707f47..7525ad5 100644
--- a/src/game/Object.h
+++ b/src/game/Object.h
@@ -301,6 +301,11 @@ class MANGOS_DLL_SPEC Object
virtual bool hasQuest(uint32 /* quest_id */) const { return false; }
virtual bool hasInvolvedQuest(uint32 /* quest_id */) const { return false; }
+
+ // Monkey
+ void ForceValuesUpdateAtIndex(uint32);
+ // Monkey
+
protected:
Object ( );
diff --git a/src/game/TradeHandler.cpp b/src/game/TradeHandler.cpp
index 6662545..fcc3393 100644
--- a/src/game/TradeHandler.cpp
+++ b/src/game/TradeHandler.cpp
@@ -532,11 +532,13 @@ void WorldSession::HandleInitiateTradeOpcode(WorldPacket& recvPacket)
return;
}
- if (pOther->GetTeam() !=_player->GetTeam() )
+ //Monkey
+ if (!sWorld.getConfig(CONFIG_INTERFACTION) && pOther->GetTeam() !=_player->GetTeam() )
{
SendTradeStatus(TRADE_STATUS_WRONG_FACTION);
return;
}
+ //Monkey
if (!pOther->IsWithinDistInMap(_player,10.0f,false))
{
diff --git a/src/game/World.cpp b/src/game/World.cpp
index 7811a95..a8db425 100644
--- a/src/game/World.cpp
+++ b/src/game/World.cpp
@@ -632,6 +632,14 @@ void World::LoadConfigSettings(bool reload)
m_configs[CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL] = sConfig.GetBoolDefault("AllowTwoSide.Interaction.Mail",false);
m_configs[CONFIG_ALLOW_TWO_SIDE_WHO_LIST] = sConfig.GetBoolDefault("AllowTwoSide.WhoList", false);
m_configs[CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND] = sConfig.GetBoolDefault("AllowTwoSide.AddFriend", false);
+
+ //Monkey
+ m_configs[CONFIG_INTERFACTION] = sConfig.GetBoolDefault("Interfaction", false);
+ if(m_configs[CONFIG_INTERFACTION]) {
+ sLog.outString( "Interfaction Allowed" );
+ }
+ //Monkey
+
m_configs[CONFIG_STRICT_PLAYER_NAMES] = sConfig.GetIntDefault ("StrictPlayerNames", 0);
m_configs[CONFIG_STRICT_CHARTER_NAMES] = sConfig.GetIntDefault ("StrictCharterNames", 0);
m_configs[CONFIG_STRICT_PET_NAMES] = sConfig.GetIntDefault ("StrictPetNames", 0);
diff --git a/src/game/World.h b/src/game/World.h
index fd8fa61..1649e57 100644
--- a/src/game/World.h
+++ b/src/game/World.h
@@ -105,6 +105,7 @@ enum WorldConfigs
CONFIG_ALLOW_TWO_SIDE_INTERACTION_MAIL,
CONFIG_ALLOW_TWO_SIDE_WHO_LIST,
CONFIG_ALLOW_TWO_SIDE_ADD_FRIEND,
+ CONFIG_INTERFACTION,
CONFIG_STRICT_PLAYER_NAMES,
CONFIG_STRICT_CHARTER_NAMES,
CONFIG_STRICT_PET_NAMES,
diff --git a/src/mangosd/mangosd.conf.dist.in b/src/mangosd/mangosd.conf.dist.in
index 6751cee..ba91902 100644
--- a/src/mangosd/mangosd.conf.dist.in
+++ b/src/mangosd/mangosd.conf.dist.in
@@ -784,6 +784,11 @@ Motd = "Welcome to the Massive Network Game Object Server."
# Default: 0 (Not allowed)
# 1 (Allowed)
#
+# Interfaction
+# Allow Group, Raid, Heal, Buff, and other between both factions
+# Default: 0 (Not Allowed)
+# 1 (Allowed)
+#
# TalentsInspecting
# Allow other players see character talents in inspect dialog (Characters in Gamemaster mode can
# inspect talents always)
@@ -801,6 +806,7 @@ AllowTwoSide.Interaction.Auction = 0
AllowTwoSide.Interaction.Mail = 0
AllowTwoSide.WhoList = 0
AllowTwoSide.AddFriend = 0
+Interfaction = 0
TalentsInspecting = 1
###################################################################################################################
[/code]
interfaction_8827.diff (Taille : 9.6 Ko)