diff --git a/src/Perpetuum/Groups/Gangs/GangManager.cs b/src/Perpetuum/Groups/Gangs/GangManager.cs index 06141cb1f..82ad511ee 100644 --- a/src/Perpetuum/Groups/Gangs/GangManager.cs +++ b/src/Perpetuum/Groups/Gangs/GangManager.cs @@ -56,11 +56,21 @@ public Gang CreateGang(string gangName,Character leader) gang.Id = Guid.NewGuid(); gang.Name = gangName; gang.Leader = leader; - gang.SetMember(leader); + // In addition to leadership, an assistant role is also needed + // so that when the leader changes, the creator does not lose + // control over the gang + gang.SetMember(leader, GangRole.Assistant); _gangRepository.Insert(gang); - void Finish() => _channelManager.CreateAndJoinChannel(ChannelType.Gang, gang.ChannelName, gang.Leader); + void Finish() + { + // In addition to the DB repository, need to add a new gang to the dictionary + _gangs.Add(gang.Id, gang); + _channelManager.CreateAndJoinChannel(ChannelType.Gang, gang.ChannelName, gang.Leader); + // Perform actions upon completion of the gang creation + GangCreate?.Invoke(gang, leader); + } if (Transaction.Current != null) Transaction.Current.OnCommited(Finish); @@ -212,6 +222,7 @@ void Finish() Finish(); } + public event Action GangCreate; public event Action GangMemberJoined; public event Action GangMemberRemoved; diff --git a/src/Perpetuum/Groups/Gangs/IGangManager.cs b/src/Perpetuum/Groups/Gangs/IGangManager.cs index c8f20645a..fa95825d5 100644 --- a/src/Perpetuum/Groups/Gangs/IGangManager.cs +++ b/src/Perpetuum/Groups/Gangs/IGangManager.cs @@ -20,6 +20,11 @@ public interface IGangManager void ChangeLeader(Gang gang, Character newLeader); void SetRole(Gang gang, Character member, GangRole newRole); + /// + /// An action performed after a gang is created + /// + event Action GangCreate; + event Action GangMemberJoined; event Action GangMemberRemoved; event Action GangDisbanded; diff --git a/src/Perpetuum/Zones/Zone.cs b/src/Perpetuum/Zones/Zone.cs index 7220bc092..64b6156d6 100644 --- a/src/Perpetuum/Zones/Zone.cs +++ b/src/Perpetuum/Zones/Zone.cs @@ -94,6 +94,7 @@ protected Zone(ISessionManager sessionManager, IGangManager gangManager) IsLayerEditLocked = true; sessionManager.CharacterDeselected += OnCharacterDeselected; _gangManager = gangManager; + _gangManager.GangCreate += OnGangCreate; _gangManager.GangMemberJoined += OnGangMemberJoined; _gangManager.GangMemberRemoved += OnGangMemberRemoved; _gangManager.GangDisbanded += OnGangDisbanded; @@ -129,6 +130,13 @@ public override void Stop() SaveUnitsToDb(); } + /// + /// Perform the necessary actions for the zone after creating the gang. + /// + /// Newly formed gang + /// The creator of the gang + private void OnGangCreate(Gang gang, Character character) => OnGangMemberJoined(gang, character); + private void OnGangMemberJoined(Gang gang, Character character) { if (this.TryGetPlayer(character, out Player player))