diff --git a/ServerTools/ServerTools.csproj b/ServerTools/ServerTools.csproj
index 7a01a9df..149ac669 100644
--- a/ServerTools/ServerTools.csproj
+++ b/ServerTools/ServerTools.csproj
@@ -293,7 +293,7 @@
False
- ..\..\7dtd-ServerTools-master-18.0.3\7dtd-binaries\Pathfinding.Ionic.Zip.Reduced.dll
+ ..\7dtd-binaries\Pathfinding.Ionic.Zip.Reduced.dll
False
diff --git a/ServerTools/src/Api.cs b/ServerTools/src/Api.cs
index 2a5be7d1..c0581a28 100644
--- a/ServerTools/src/Api.cs
+++ b/ServerTools/src/Api.cs
@@ -105,7 +105,7 @@ private static bool PlayerLogin(ClientInfo _cInfo, string _message, StringBuilde
private static void PlayerSpawning(ClientInfo _cInfo, int _chunkViewDim, PlayerProfile _playerProfile)//Setting player view and profile
{
-
+
}
private static void PlayerSpawnedInWorld(ClientInfo _cInfo, RespawnType _respawnReason, Vector3i _pos)//Spawning player
@@ -605,6 +605,8 @@ public static void OldPlayerJoined(ClientInfo _cInfo, EntityPlayer _player)
}
}
}
+ //If they are in a clan, check if we should get them into a party
+ ClanManager.checkClanParty(_cInfo, _player);
if (Event.Open && Event.Teams.ContainsKey(_cInfo.playerId) && PersistentContainer.Instance.Players[_cInfo.playerId].EventSpawn)
{
Event.Spawn(_cInfo);
@@ -672,4 +674,4 @@ public static void PlayerDied(ClientInfo _cInfo)
}
}
}
-}
\ No newline at end of file
+}
diff --git a/ServerTools/src/Tools/ClanManager/ClanManager.cs b/ServerTools/src/Tools/ClanManager/ClanManager.cs
index 8db26e2d..d1e7c4d2 100644
--- a/ServerTools/src/Tools/ClanManager/ClanManager.cs
+++ b/ServerTools/src/Tools/ClanManager/ClanManager.cs
@@ -13,6 +13,7 @@ public class ClanManager
public static string Private_Chat_Color = "[00FF00]";
public static List ClanMember = new List();
public static Dictionary Clans = new Dictionary();
+ public static Dictionary ClanParties = new Dictionary();
public static string GetClanList()
{
@@ -353,6 +354,8 @@ public static void InviteAccept(ClientInfo _cInfo)
}
}
}
+ //Check if they need to be added to the party
+ checkClanParty(_cInfo, GameManager.Instance.World.Players.dict[_cInfo.entityId]);
}
}
else
@@ -785,6 +788,116 @@ public static void DeclineClanRequest(ClientInfo _cInfo)
}
+ public static void checkClanParty(ClientInfo _cInfo, EntityPlayer _player)
+ {
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties for player: {0}", _player.GetDebugName()));
+ //First, check if there is a party for this clan already
+ string _clanName = PersistentContainer.Instance.Players[_cInfo.playerId].ClanName;
+ if (string.IsNullOrEmpty(_clanName))
+ //Clan-less, can't do anything for this player
+ return;
+
+ Party clanParty = null;
+ if(!ClanParties.TryGetValue(_clanName, out clanParty))
+ {
+ //No party. Check to see if at least one other clan member is online, and if they're more priveleged
+ List otherPlayerIDs = new List();
+ for (int i = 0; i < ClanMember.Count; i++)
+ {
+ string _clanMember = ClanMember[i];
+ string _clanNameOther = PersistentContainer.Instance.Players[_clanMember].ClanName;
+ if (!string.IsNullOrEmpty(_clanNameOther) && _clanName == _clanNameOther)
+ {
+ ClientInfo _cInfo2 = ConnectionManager.Instance.Clients.ForPlayerId(_clanMember);
+ if (_cInfo2 != null)
+ {
+ //They're a member and online, add to the list!
+ otherPlayerIDs.Add(_cInfo2.entityId);
+ }
+ }
+ }
+ //Did we find enough online from the clan?
+ if(otherPlayerIDs.Count > 1)
+ {
+ //Enough to make a party!
+ try
+ {
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties creating new party for {0} players.", otherPlayerIDs.Count));
+ PartyManager.Current.CreateParty().AddPlayer(_player);
+ clanParty = _player.Party;
+ clanParty.PartyMemberRemoved += ClanParty_PartyMemberRemoved;
+ //Invite everyone to the party
+ foreach (int entityId in otherPlayerIDs)
+ {
+ EntityPlayer foundPlayer = GameManager.Instance.World.Players.dict[entityId];
+
+ if (foundPlayer != null)
+ {
+ if (clanParty.AddPlayer(foundPlayer))
+ {
+ Party.ServerHandleAcceptInvite(_player, foundPlayer);
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties Added player {0} to new party: {1}", foundPlayer.entityId, clanParty.PartyID));
+ }
+ else
+ {
+ foundPlayer.HandleOnPartyJoined();
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties Did not add player to party? {0}", foundPlayer.entityId));
+ }
+ }
+ else
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties could not find player for entityId: {0}", entityId));
+ }
+ }
+ catch (Exception e)
+ {
+
+ Log.Out(string.Format("[SERVERTOOLS] Error in ClanManager.checkClanParties creating new party: {0}", e.Message));
+ }
+ if (clanParty != null)
+ ClanParties.Add(_clanName, clanParty);
+ }
+ else
+ {
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties Not enough clan online."));
+ return;
+ }
+
+ }
+ if (clanParty != null)
+ {
+
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties party used: {0}", clanParty.PartyID));
+ //Check if they're already in the party
+ if (!clanParty.ContainsMember(_player) && clanParty.MemberList.Count < 8)
+ {
+ clanParty.AddPlayer(_player);
+ Party.ServerHandleAcceptInvite(clanParty.Leader, _player);
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties Adding member to party: {0}", clanParty.PartyID));
+ } else
+ {
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties Party full or already has player: {0}", clanParty.PartyID));
+ }
+ }
+ else
+ {
+
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.checkClanParties no new party or not enough clan online?"));
+ }
+
+ }
+
+ private static void ClanParty_PartyMemberRemoved(EntityPlayer player)
+ {
+
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.ClanParty_PartyMemberRemoved party {0} lost a member: {1} and there are {2} left.", player.Party?.PartyID ?? 0, player.entityId, player.Party.MemberList.Count));
+ if(player.Party?.MemberList.Count < 2)
+ {
+ //Party must be disbanding, remove it from our list
+ Log.Out(string.Format("[SERVERTOOLS] ClanManager.ClanParty_PartyMemberRemoved closing party {0}", player.Party.PartyID));
+ ClanParties.RemoveAll(x => x == player.Party);
+ }
+ }
+
public static string GetChatCommands(ClientInfo _cInfo)
{
string _clanName = PersistentContainer.Instance.Players[_cInfo.playerId].ClanName;