private void RefreshContextForPartyMembers(ICharacter character) { if (!this.IsSharedWithPartyAndFactionMembers) { return; } var partyMembers = PartySystem.ServerGetPartyMembersReadOnly(character); if (partyMembers.Count <= 1) { // no party or single-player party return; } var currentCharacterName = character.Name; foreach (var partyMemberName in partyMembers) { if (partyMemberName == currentCharacterName) { continue; } var partyMember = Api.Server.Characters .GetPlayerCharacter(partyMemberName); if (partyMember is not null) { var context = this.GetActiveContext(partyMember, out _); context?.Refresh(); } } }
public override IEnumerable <ICharacter> ServerEnumerateMessageRecepients(ICharacter forPlayer) { var members = PartySystem.ServerGetPartyMembersReadOnly(this.Party); foreach (var member in members) { var character = CharactersServerService.GetPlayerCharacter(member); if (character != null) { yield return(character); } } }
private void ServerPartyClanTagChanged(ILogicObject party) { var serverCharacters = Server.Characters; foreach (var playerCharacterName in PartySystem.ServerGetPartyMembersReadOnly(party)) { var playerCharacter = serverCharacters.GetPlayerCharacter(playerCharacterName); if (playerCharacter != null) { this.ServerForceRefreshPlayerEntry(playerCharacter); } } }
protected override bool ServerIsCompleted(ICharacter character, PlayerTaskStateWithCount state) { if (base.ServerIsCompleted(character, state)) { return(true); } if (!this.IsSharedWithPartyMembers || !(this.TaskTarget is IProtoQuest)) { return(false); } // check whether any of the other party members has this requirement satisfied var partyMembers = PartySystem.ServerGetPartyMembersReadOnly(character); if (partyMembers.Count <= 1) { // no party or single-player party return(false); } var currentCharacterName = character.Name; foreach (var partyMemberName in partyMembers) { if (partyMemberName == currentCharacterName) { continue; } var partyMember = Api.Server.Characters .GetPlayerCharacter(partyMemberName); if (partyMember == null) { continue; } if (partyMember.SharedGetQuests() .SharedHasCompletedTask(this)) { // party member has satisfied this requirement return(true); } } return(false); }
private void ServerPartyClanTagChanged(ILogicObject party) { // notify other players that have this player in the online players list var serverCharacters = Server.Characters; foreach (var playerCharacterName in PartySystem.ServerGetPartyMembersReadOnly(party)) { var playerCharacter = serverCharacters.GetPlayerCharacter(playerCharacterName); if (playerCharacter is null || !playerCharacter.ServerIsOnline) { continue; } var onlineStatusChangeReceivers = ServerGetOnlineStatusChangeReceivers(playerCharacter); this.CallClient(onlineStatusChangeReceivers, _ => _.ClientRemote_OnlinePlayerClanTagChanged( new Entry(playerCharacter.Name, ServerGetClanTag(playerCharacter)))); } }
public string Execute(ICharacter player) { var party = PartySystem.ServerGetParty(player); if (party is null) { return($"Player \"{player.Name}\" has no party"); } var memberNames = PartySystem.ServerGetPartyMembersReadOnly(party); var sb = new StringBuilder("Player \"") .Append(player.Name) .AppendLine("\" - party info:") .AppendLine("Members list: "); foreach (var memberName in memberNames) { sb.Append(" * ").AppendLine(memberName); } return(sb.ToString()); }
private void ServerCharacterJoinedOrLeftPartyHandler( ICharacter playerCharacter, ILogicObject party, bool isJoined) { if (!playerCharacter.ServerIsOnline) { // it's not in online players list so no notifications necessary return; } var onlineStatusChangeReceivers = ServerGetOnlineStatusChangeReceivers(playerCharacter); this.CallClient(onlineStatusChangeReceivers, _ => _.ClientRemote_OnlinePlayerClanTagChanged( new Entry(playerCharacter.Name, ServerGetClanTag(playerCharacter)))); if (!ServerIsListHidden) { return; } // refresh online lists completely for the party members var serverCharacters = Api.Server.Characters; foreach (var characterName in PartySystem.ServerGetPartyMembersReadOnly(party)) { var character = serverCharacters.GetPlayerCharacter(characterName); if (character is not null && character.ServerIsOnline) { this.ServerSendOnlineListAndOtherInfo(character); } } }
public void ServerOnSkillExperienceAdded( ICharacter character, double experienceAdded, byte currentLevel) { var multiplier = this.ExperienceToLearningPointsConversionMultiplier * TechConstants.ServerSkillExperienceToLearningPointsConversionMultiplier; // apply reversed experience gain multiplier so faster/slower skill exp gain speed will not affect LP gain speed multiplier /= TechConstants.ServerSkillExperienceGainMultiplier; if (multiplier <= 0 || double.IsNaN(multiplier)) { return; } // reduce LP gain proportionally to the skill level var lpRateMultiplier = MathHelper.Lerp(1, TechConstants.SkillLearningPointMultiplierAtMaximumLevel, currentLevel / (double)this.MaxLevel); multiplier *= lpRateMultiplier; if (multiplier <= 0) { return; } var learningPointsToAdd = experienceAdded * multiplier; var partyMembersNames = this.IsSharingLearningPointsWithPartyMembers ? PartySystem.ServerGetPartyMembersReadOnly(character) : Array.Empty <string>(); if (partyMembersNames.Count <= 1) { // no experience share, no party or a single member party - add all LP to the current character character.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsToAdd); return; } using var onlinePartyMembers = Api.Shared.GetTempList <ICharacter>(); foreach (var partyMemberName in partyMembersNames) { var partyMember = Server.Characters.GetPlayerCharacter(partyMemberName); if (partyMember is null) { continue; } if (ReferenceEquals(partyMember, character) || (partyMember.ServerIsOnline && !CharacterIdleSystem.ServerIsIdlePlayer(partyMember))) { onlinePartyMembers.Add(partyMember); } } if (onlinePartyMembers.Count <= 1 || PartyConstants.PartyLearningPointsSharePercent == 0) { // no party, or a single member party, or no party share % // - add all LP to the current character character.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsToAdd); return; } // player has a party // add only a share of LP to current character var currentCharacterLearningPointsShare = learningPointsToAdd * (1 - PartyConstants.PartyLearningPointsSharePercent); character.SharedGetTechnologies() .ServerAddLearningPoints(currentCharacterLearningPointsShare); // distribute the rest equally to the other party members var learningPointsShare = learningPointsToAdd * PartyConstants.PartyLearningPointsSharePercent / (onlinePartyMembers.Count - 1); foreach (var partyMember in onlinePartyMembers.AsList()) { if (!ReferenceEquals(partyMember, character)) { partyMember.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsShare); } } }
protected override bool ServerIsCompleted(ICharacter character, PlayerTaskStateWithCount state) { if (base.ServerIsCompleted(character, state)) { return(true); } if (!this.IsSharedWithPartyAndFactionMembers || this.TaskTarget is not IProtoQuest) { return(false); } // check whether any of the other party members has this requirement satisfied var currentCharacterName = character.Name; var partyMembers = PartySystem.ServerGetPartyMembersReadOnly(character); if (partyMembers.Count > 1) { foreach (var partyMemberName in partyMembers) { if (partyMemberName == currentCharacterName) { continue; } var partyMember = Api.Server.Characters .GetPlayerCharacter(partyMemberName); if (partyMember is null) { continue; } if (partyMember.SharedGetQuests() .SharedHasCompletedTask(this)) { // party member has satisfied this requirement return(true); } } } // check whether any of the other faction members has this requirement satisfied if (FactionSystem.ServerGetFaction(character) is { } faction && FactionSystem.SharedGetFactionKind(faction) != FactionKind.Public) { var factionMembers = FactionSystem.ServerGetFactionMembersReadOnly(faction); if (factionMembers.Count > 1) { foreach (var factionMemberEntry in factionMembers) { var factionMemberName = factionMemberEntry.Name; if (factionMemberName == currentCharacterName) { continue; } var factionMember = Api.Server.Characters .GetPlayerCharacter(factionMemberName); if (factionMember is null) { continue; } if (factionMember.SharedGetQuests() .SharedHasCompletedTask(this)) { // faction member has satisfied this requirement return(true); } } } } return(false); }
public void ServerOnSkillExperienceAdded( ICharacter character, double experienceAdded, byte currentLevel) { var multiplier = this.ExperienceToLearningPointsConversionMultiplier * TechConstants.SkillExperienceToLearningPointsConversionMultiplier; if (multiplier <= 0) { return; } // reduce LP gain proportionally to the skill level var lpRateMultiplier = MathHelper.Lerp(1, TechConstants.SkillLearningPointMultiplierAtMaximumLevel, currentLevel / (double)this.MaxLevel); multiplier *= lpRateMultiplier; if (multiplier <= 0) { return; } var learningPointsToAdd = experienceAdded * multiplier; var partyMembersNames = this.IsSharingLearningPointsWithPartyMembers ? PartySystem.ServerGetPartyMembersReadOnly(character) : Array.Empty <string>(); if (partyMembersNames.Count <= 1) { // no experience share, no party or a single member party - add all LP to the current character character.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsToAdd); return; } using (var onlinePartyMembers = Api.Shared.GetTempList <ICharacter>()) { foreach (var partyMemberName in partyMembersNames) { var partyMember = Server.Characters.GetPlayerCharacter(partyMemberName); if (partyMember != null && (partyMember == character || partyMember.IsOnline)) { onlinePartyMembers.Add(partyMember); } } if (onlinePartyMembers.Count <= 1) { // no party or a single member party - add all LP to the current character character.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsToAdd); return; } // player has a party // add only a share of LP to current character var learningPointsSharePercent = MathHelper.Clamp(PartyConstants.PartyLearningPointsSharePercent, 0, 1); var currentCharacterLearningPointsShare = learningPointsToAdd * (1 - learningPointsSharePercent); character.SharedGetTechnologies() .ServerAddLearningPoints(currentCharacterLearningPointsShare); // distribute the rest equally to the other party members var learningPointsShare = learningPointsToAdd * learningPointsSharePercent / (onlinePartyMembers.Count - 1); foreach (var partyMember in onlinePartyMembers) { if (partyMember != character) { partyMember.SharedGetTechnologies() .ServerAddLearningPoints(learningPointsShare); } } } }