public List <SpacegameServer.Core.UserResearch> getPlayerResearch() { List <SpacegameServer.Core.UserResearch> researches = new List <UserResearch>(); foreach (var research in Core.Instance.Researchs.Where(e => e != null)) { UserResearch existingData = null; if (PlayerResearch.Any(pr => pr.researchId == research.id)) { existingData = PlayerResearch.First(pr => pr.researchId == research.id); } UserResearch userResearch = new UserResearch(); userResearch.researchId = research.id; userResearch.userId = this.id; //take data from existingData if possible userResearch.researchable = existingData != null ? existingData.researchable : (this.canResearch(research) ? (byte)1 : (byte)0); userResearch.isCompleted = existingData != null ? existingData.isCompleted : (byte)0; userResearch.investedResearchpoints = existingData != null ? existingData.investedResearchpoints : 0; userResearch.researchPriority = existingData != null ? existingData.researchPriority : (short)0; researches.Add(userResearch); } return(researches); }
public void AddSecondarySpecificationGain(Research research) { if (!research.IsSpecification()) { return; } var SpecData = research.GetSpecification(); if (SpecData.SecondaryResearchId == null) { return; } List <UserResearch> AllNewUserResearchs = new List <UserResearch>(); //Add to players having neither first nor second research var UserToUpdate = Core.Instance.users.Values.Where(user => user.allianceId == this.id && !user.PlayerResearch.Any(userResearch => userResearch.isCompleted == 1 && (userResearch.researchId == SpecData.ResearchId || userResearch.researchId == SpecData.SecondaryResearchId))); foreach (var User in UserToUpdate) { UserResearch NewUserResearch; if (User.PlayerResearch.Any(userResearch => userResearch.isCompleted == 1 && (userResearch.researchId == SpecData.ResearchId || userResearch.researchId == SpecData.SecondaryResearchId))) { NewUserResearch = User.PlayerResearch.First(userResearch => userResearch.isCompleted == 1 && (userResearch.researchId == SpecData.ResearchId || userResearch.researchId == SpecData.SecondaryResearchId)); } else { NewUserResearch = new UserResearch(User.id, (short)SpecData.SecondaryResearchId); } NewUserResearch.isCompleted = 1; NewUserResearch.research = research; User.PlayerResearch.Add(NewUserResearch); AllNewUserResearchs.Add(NewUserResearch); } if (AllNewUserResearchs.Count > 0) { try { Core.Instance.dataConnection.SaveResearch(AllNewUserResearchs); } catch (Exception ex) { SpacegameServer.Core.Core.Instance.writeExceptionToLog(ex); } } }
/// <summary> /// called after a user left the alliance, checks if some senodary gains should be removed /// </summary> /// <param name="user"></param> public void RemoveSecondarySpecificationGain(User user) { //check if the user has a research that is the primary research from a specResearch with a secondary research if (!user.PlayerResearch.Any(e => e.isCompleted == 1 && Core.Instance.SpecializationGroups.Any(specGroup => specGroup.SpecializationResearches.Any(SpecResearch => SpecResearch.ResearchId == e.researchId && SpecResearch.SecondaryResearchId != null)))) { return; } UserResearch PrimaryResearch = user.PlayerResearch.First(e => e.isCompleted == 1 && Core.Instance.SpecializationGroups.Any(specGroup => specGroup.SpecializationResearches.Any(SpecResearch => SpecResearch.ResearchId == e.researchId && SpecResearch.SecondaryResearchId != null))); //if someone in the alliance yet has the research, skip... if (Core.Instance.users.Values.Any(e => e.allianceId == this.id && e.PlayerResearch.Any(userResearch => userResearch.researchId == PrimaryResearch.researchId && userResearch.isCompleted == 1))) { return; } //now remove all Secondary gains of this research: short SecondaryResearchId = (short)PrimaryResearch.research.GetSpecification().SecondaryResearchId; List <UserResearch> AllNewUserResearchs = new List <UserResearch>(); var UserToUpdate = Core.Instance.users.Values.Where(u => u.allianceId == this.id && u.PlayerResearch.Any(userResearch => userResearch.researchId == SecondaryResearchId && userResearch.isCompleted == 1)); foreach (var User in UserToUpdate) { var PlayerResearch = User.PlayerResearch.First(e => e.researchId == SecondaryResearchId && e.isCompleted == 1); PlayerResearch.isCompleted = 0; AllNewUserResearchs.Add(PlayerResearch); } if (AllNewUserResearchs.Count > 0) { try { Core.Instance.dataConnection.SaveResearch(AllNewUserResearchs); } catch (Exception ex) { SpacegameServer.Core.Core.Instance.writeExceptionToLog(ex); } } }