Class GuildSystem
- Namespace
- FishMMO.Server.Implementation.World.SceneServer
- Assembly
- FishMMO.Server.dll
Guild permission resolution: the single place the server decides what a character may do in a guild, and the lazy migration that gives a pre-permissions guild its rank ladder.
[CreateAssetMenu(fileName = "GuildSystem", menuName = "FishMMO/Server/SceneServer/Guild System", order = 1)]
[RequiresDataContainer(typeof(GuildSystemRuntimeData))]
[RequiresDataContainer(typeof(GuildCharacterMappingData))]
[RequiresDataContainer(typeof(GuildSystemMainThreadQueueData))]
[RequiresDataContainer(typeof(AsyncWorkerData))]
public class GuildSystem : ServerBehaviour, IServerBehaviour<INetworkManagerWrapper, ServerManager, NetworkConnection, IServerBehaviour>, IServerComponent<INetworkManagerWrapper, ServerManager, NetworkConnection, IServerBehaviour>, IGuildSystem<NetworkConnection>, IServerBehaviour, IServerComponent
- Inheritance
-
ObjectScriptableObjectGuildSystem
- Implements
-
IGuildSystem<NetworkConnection>
- Inherited Members
-
ScriptableObject.SetDirty()ScriptableObject.CreateInstance<T>()Object.GetEntityId()Object.GetInstanceID()Object.GetHashCode()Object.InstantiateAsync<T>(T)Object.InstantiateAsync<T>(T, Transform)Object.InstantiateAsync<T>(T, Vector3, Quaternion)Object.InstantiateAsync<T>(T, Transform, Vector3, Quaternion)Object.Instantiate(Object, Vector3, Quaternion)Object.Instantiate(Object, Vector3, Quaternion, Transform)Object.Instantiate(Object)Object.Instantiate(Object, Scene)Object.Instantiate<T>(T, InstantiateParameters)Object.Instantiate<T>(T, Vector3, Quaternion, InstantiateParameters)Object.Instantiate(Object, Transform)Object.Instantiate<T>(T)Object.Instantiate<T>(T, Vector3, Quaternion)Object.Instantiate<T>(T, Vector3, Quaternion, Transform)Object.Instantiate<T>(T, Transform)Object.Destroy(Object)Object.DestroyImmediate(Object)Object.DontDestroyOnLoad(Object)Object.DestroyObject(Object)Object.FindObjectsOfType<T>()Object.FindObjectsByType<T>(FindObjectsSortMode)Object.FindObjectsByType<T>(FindObjectsInactive, FindObjectsSortMode)Object.FindObjectOfType<T>()Object.FindFirstObjectByType<T>()Object.FindAnyObjectByType<T>()Object.FindFirstObjectByType<T>(FindObjectsInactive)Object.FindAnyObjectByType<T>(FindObjectsInactive)Object.FindObjectsByType<T>()Object.FindObjectsByType<T>(FindObjectsInactive)Object.ToString()Object.nameObject.hideFlags
Remarks
Split out of GuildSystem.cs because it is the security surface of the whole feature.
Every operation in the main file now funnels through
ResolveGuildAuthorityAsync(long, long), and a reviewer asking "can a member kick a
leader?" should be able to answer it from one file rather than from thirty scattered
comparisons.
The old model compared a GuildRank enum: Rank >= GuildRank.Officer and
friends. That is gone. A rank is a row a guild owns, carrying a name it chose and a
permission mask; the row's ORDER is used for seniority alone.
Fields
GuildCreateAchievementTemplate
[Header("Achievements")]
public AchievementTemplate GuildCreateAchievementTemplate
Field Value
GuildJoinAchievementTemplate
Achievement to increment when a player joins a guild.
public AchievementTemplate GuildJoinAchievementTemplate
Field Value
Properties
MaxGuildSize
Maximum number of members allowed in a guild.
public int MaxGuildSize { get; }
Property Value
UpdatePumpRate
Gets the update pump rate for guild synchronization.
public float UpdatePumpRate { get; }
Property Value
Methods
AddGuildCharacterTracker(long, long)
Adds a mapping for the Guild to Guild Members connected to this Scene Server.
public void AddGuildCharacterTracker(long guildID, long characterID)
Parameters
CharacterSystem_OnConnect(NetworkConnection, IPlayerCharacter)
Handles character connect event, adding the character to the guild tracker and persisting guild update.
public void CharacterSystem_OnConnect(NetworkConnection conn, IPlayerCharacter character)
Parameters
connNetworkConnectionNetwork connection of the character.
characterIPlayerCharacterThe character that connected.
CharacterSystem_OnDisconnect(NetworkConnection, IPlayerCharacter)
Handles character disconnect event, removing the character from the guild tracker and persisting guild update.
public void CharacterSystem_OnDisconnect(NetworkConnection conn, IPlayerCharacter character)
Parameters
connNetworkConnectionNetwork connection of the character.
characterIPlayerCharacterThe character that disconnected.
InitializeOnce()
Initializes the guild system, registering chat commands and broadcast handlers, and character events.
public override ServerComponentInitializationStatus InitializeOnce()
Returns
OnDeinitialize()
Cleans up the guild system, unregistering broadcast handlers and character events.
public override void OnDeinitialize()
OnGuildInvite(IPlayerCharacter, ChatBroadcast)
Handles guild invite chat commands.
public bool OnGuildInvite(IPlayerCharacter sender, ChatBroadcast msg)
Parameters
senderIPlayerCharacterThe character sending the invite.
msgChatBroadcastChat broadcast message containing the target character name.
Returns
- bool
True if invite was sent, false otherwise.
OnServerGuildAcceptInviteBroadcastReceived(NetworkConnection, GuildAcceptInviteBroadcast, Channel)
Handles acceptance of a guild invitation, validates the invite, fires an async task to check capacity, persist membership, and marshal results back to the main thread.
public void OnServerGuildAcceptInviteBroadcastReceived(NetworkConnection conn, GuildAcceptInviteBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the accepting character.
msgGuildAcceptInviteBroadcastGuildAcceptInviteBroadcast message containing acceptance details.
channelChannelNetwork channel used for the broadcast.
OnServerGuildApplicationListRequestBroadcastReceived(NetworkConnection, GuildApplicationListRequestBroadcast, Channel)
Handles a request for the guild's pending application queue.
public void OnServerGuildApplicationListRequestBroadcastReceived(NetworkConnection conn, GuildApplicationListRequestBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildApplicationListRequestBroadcastThe request. Carries nothing.
channelChannelNetwork channel used for the broadcast.
OnServerGuildApplyBroadcastReceived(NetworkConnection, GuildApplyBroadcast, Channel)
Handles a request to apply to a guild found in the directory.
public void OnServerGuildApplyBroadcastReceived(NetworkConnection conn, GuildApplyBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe applying connection.
msgGuildApplyBroadcastThe guild and the applicant's message.
channelChannelNetwork channel used for the broadcast.
Remarks
Refused for a character who is already in a guild — checked here on the cheap side, and again in the SQL, because the controller's guild ID is main-thread state and the membership row is the truth.
OnServerGuildChangeRankBroadcastReceived(NetworkConnection, GuildChangeRankBroadcast, Channel)
Handles guild rank change broadcast, validates leader and target, and fires an async task to update ranks in the database. Only guild leaders can promote another member to a new rank.
public void OnServerGuildChangeRankBroadcastReceived(NetworkConnection conn, GuildChangeRankBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildChangeRankBroadcastGuildChangeRankBroadcast message containing target member ID and new rank.
channelChannelNetwork channel used for the broadcast.
OnServerGuildCreateBroadcastReceived(NetworkConnection, GuildCreateBroadcast, Channel)
Handles guild creation broadcast, validates and creates a new guild for the requesting character. Fires an async task that checks name availability, creates the guild, persists membership, and marshals the result back to the main thread.
public void OnServerGuildCreateBroadcastReceived(NetworkConnection conn, GuildCreateBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildCreateBroadcastGuildCreateBroadcast message containing guild creation details.
channelChannelNetwork channel used for the broadcast.
OnServerGuildCreateRankBroadcastReceived(NetworkConnection, GuildCreateRankBroadcast, Channel)
Handles a request to add a rank to the ladder.
public void OnServerGuildCreateRankBroadcastReceived(NetworkConnection conn, GuildCreateRankBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildCreateRankBroadcastThe requested position, name and mask.
channelChannelNetwork channel used for the broadcast.
OnServerGuildDeclineInviteBroadcastReceived(NetworkConnection, GuildDeclineInviteBroadcast, Channel)
Handles decline of a guild invitation, removes pending invitation for the character.
public void OnServerGuildDeclineInviteBroadcastReceived(NetworkConnection conn, GuildDeclineInviteBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the declining character.
msgGuildDeclineInviteBroadcastGuildDeclineInviteBroadcast message containing decline details.
channelChannelNetwork channel used for the broadcast.
OnServerGuildDeleteRankBroadcastReceived(NetworkConnection, GuildDeleteRankBroadcast, Channel)
Handles a request to remove a rank from the ladder.
public void OnServerGuildDeleteRankBroadcastReceived(NetworkConnection conn, GuildDeleteRankBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildDeleteRankBroadcastThe rank to remove.
channelChannelNetwork channel used for the broadcast.
OnServerGuildDirectoryRequestBroadcastReceived(NetworkConnection, GuildDirectoryRequestBroadcast, Channel)
Handles a request for a page of the recruitment directory.
public void OnServerGuildDirectoryRequestBroadcastReceived(NetworkConnection conn, GuildDirectoryRequestBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildDirectoryRequestBroadcastThe optional search term.
channelChannelNetwork channel used for the broadcast.
Remarks
The ONE guild request a non-member may make, so it does not go through
TryBeginGuildRequest — which requires a guild — and instead does the
connection checks itself. Browsing is deliberately open to members too: a player
shopping for a new guild has not left their old one yet.
OnServerGuildDisbandBroadcastReceived(NetworkConnection, GuildDisbandBroadcast, Channel)
Handles a request to disband the guild.
public void OnServerGuildDisbandBroadcastReceived(NetworkConnection conn, GuildDisbandBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the leader.
msgGuildDisbandBroadcastThe broadcast carrying the confirmation name.
channelChannelNetwork channel used for the broadcast.
OnServerGuildEditRankBroadcastReceived(NetworkConnection, GuildEditRankBroadcast, Channel)
Handles a request to rename a rank or change its permissions.
public void OnServerGuildEditRankBroadcastReceived(NetworkConnection conn, GuildEditRankBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildEditRankBroadcastThe requested name and mask.
channelChannelNetwork channel used for the broadcast.
OnServerGuildInviteBroadcastReceived(NetworkConnection, GuildInviteBroadcast, Channel)
Handles guild invitation broadcast, validates inviter and target, and sends invitation to the target character. Only guild leaders or officers can invite, and invitations are tracked to prevent duplicates. Fires an async task to verify guild capacity before sending the invite.
public void OnServerGuildInviteBroadcastReceived(NetworkConnection conn, GuildInviteBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the inviter.
msgGuildInviteBroadcastGuildInviteBroadcast message containing inviter and target IDs.
channelChannelNetwork channel used for the broadcast.
OnServerGuildLeaveBroadcastReceived(NetworkConnection, GuildLeaveBroadcast, Channel)
Handles guild leave broadcast, validates character, captures necessary data, and fires an async task that handles leadership transfer, member removal, and guild cleanup.
public void OnServerGuildLeaveBroadcastReceived(NetworkConnection conn, GuildLeaveBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the leaving character.
msgGuildLeaveBroadcastGuildLeaveBroadcast message containing leave details.
channelChannelNetwork channel used for the broadcast.
OnServerGuildLogRequestBroadcastReceived(NetworkConnection, GuildLogRequestBroadcast, Channel)
Handles a request for the guild's recent activity log.
public void OnServerGuildLogRequestBroadcastReceived(NetworkConnection conn, GuildLogRequestBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildLogRequestBroadcastThe request broadcast.
channelChannelNetwork channel used for the broadcast.
Remarks
The guild is taken from the requester's SERVER-side controller, never from the message. The request carries no guild id precisely so that there is nothing to forge: a player can only ever ask for the log of the guild the server already believes they are in.
OnServerGuildRankListRequestBroadcastReceived(NetworkConnection, GuildRankListRequestBroadcast, Channel)
Handles a request for the guild's rank ladder.
public void OnServerGuildRankListRequestBroadcastReceived(NetworkConnection conn, GuildRankListRequestBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildRankListRequestBroadcastThe request. Carries nothing.
channelChannelNetwork channel used for the broadcast.
Remarks
Any member may read the ladder — a player cannot be expected to work within rules they are not allowed to see, and the permission masks in it are already implied by which buttons every other member visibly has.
OnServerGuildRemoveBroadcastReceived(NetworkConnection, GuildRemoveBroadcast, Channel)
Handles guild member removal broadcast, validates and removes a member from the guild. Only officers and leaders can remove other members.
public void OnServerGuildRemoveBroadcastReceived(NetworkConnection conn, GuildRemoveBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildRemoveBroadcastGuildRemoveBroadcast message containing member ID to remove.
channelChannelNetwork channel used for the broadcast.
OnServerGuildResolveApplicationBroadcastReceived(NetworkConnection, GuildResolveApplicationBroadcast, Channel)
Handles an accept or decline of one pending application.
public void OnServerGuildResolveApplicationBroadcastReceived(NetworkConnection conn, GuildResolveApplicationBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildResolveApplicationBroadcastThe application and the decision.
channelChannelNetwork channel used for the broadcast.
OnServerGuildSetMemberNoteBroadcastReceived(NetworkConnection, GuildSetMemberNoteBroadcast, Channel)
Handles a request to set one of a member's two notes.
public void OnServerGuildSetMemberNoteBroadcastReceived(NetworkConnection conn, GuildSetMemberNoteBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildSetMemberNoteBroadcastThe member, the note and which note it is.
channelChannelNetwork channel used for the broadcast.
Remarks
E6. The two notes are separately permissioned, and the officer note is separately permissioned for READING as well — a rank may be allowed to write public notes without being allowed to see the officer ones.
OnServerGuildSetMessageOfTheDayBroadcastReceived(NetworkConnection, GuildSetMessageOfTheDayBroadcast, Channel)
Handles a request to change the guild message of the day.
public void OnServerGuildSetMessageOfTheDayBroadcastReceived(NetworkConnection conn, GuildSetMessageOfTheDayBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildSetMessageOfTheDayBroadcastThe requested message of the day.
channelChannelNetwork channel used for the broadcast.
OnServerGuildSetNoticeBroadcastReceived(NetworkConnection, GuildSetNoticeBroadcast, Channel)
Handles a request to change the guild notice.
public void OnServerGuildSetNoticeBroadcastReceived(NetworkConnection conn, GuildSetNoticeBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the requester.
msgGuildSetNoticeBroadcastThe requested notice text.
channelChannelNetwork channel used for the broadcast.
OnServerGuildSetRecruitmentBroadcastReceived(NetworkConnection, GuildSetRecruitmentBroadcast, Channel)
Handles a request to change the guild's recruitment advertisement.
public void OnServerGuildSetRecruitmentBroadcastReceived(NetworkConnection conn, GuildSetRecruitmentBroadcast msg, Channel channel)
Parameters
connNetworkConnectionThe requesting connection.
msgGuildSetRecruitmentBroadcastThe proposed blurb, tags and recruiting flag.
channelChannelNetwork channel used for the broadcast.
OnServerGuildTransferLeadershipBroadcastReceived(NetworkConnection, GuildTransferLeadershipBroadcast, Channel)
Handles a request to transfer guild leadership to another member.
public void OnServerGuildTransferLeadershipBroadcastReceived(NetworkConnection conn, GuildTransferLeadershipBroadcast msg, Channel channel)
Parameters
connNetworkConnectionNetwork connection of the current leader.
msgGuildTransferLeadershipBroadcastThe broadcast naming the successor.
channelChannelNetwork channel used for the broadcast.
Remarks
The successor may be OFFLINE. Leadership is a database rank, not a session, and a guild whose leader can only hand over while the successor happens to be logged in is a guild that stays stuck for exactly the reason S5 describes.
OnUpdate(float)
Drains the main-thread queue each frame.
protected override void OnUpdate(float deltaTime)
Parameters
deltaTimefloat
RemoveGuildCharacterTracker(long, long)
Removes the mapping of Guild to Guild Members connected to this Scene Server.
public void RemoveGuildCharacterTracker(long guildID, long characterID)