public string ToSql(SqlGenerator generator) { var sb = new StringBuilder(); sb.Append("Select "); if (SelectPart.Any()) { sb = SelectPart.Aggregate(sb, (s, i) => s.AppendFormat("{0},", i.ToSql(generator))); sb.Remove(sb.Length - 1, 1); } else { sb.Append("*"); } sb.Append(" From "); sb = FromPart.Aggregate(sb, (s, i) => s.AppendFormat("{0} ", i.ToSql(generator))); if (WherePart != null) { sb.AppendFormat("Where {0}", WherePart.ToSql(generator)); } if (GroupPart.Any()) { sb.Append(" Group By "); sb = GroupPart.Aggregate(sb, (s, o) => s.AppendFormat("{0},", o.ToSql(generator, false))); sb.Remove(sb.Length - 1, 1); } if (OrderPart.Any()) { sb.Append(" Order By "); sb = OrderPart.Aggregate(sb, (s, o) => s.AppendFormat("{0},", o.ToSql(generator))); sb.Remove(sb.Length - 1, 1); } if (Take.HasValue) { sb.Append(" limit "); if (Skip.HasValue) { sb.AppendFormat("{0},", Skip.Value); } sb.Append(Take.Value); } return(sb.ToString()); }
internal void CrewTransferAction() { try { // Both parts have internal models... if (FromPart.internalModel != null && ToPart.internalModel != null) { if (ToSeat.taken) { // Remove the crew members from the part(s)... RemoveCrewMember(FromCrewMember, FromPart); // Swap places if there is no standing room available if (ToPart.CrewCapacity == ToPart.protoModuleCrew.Count) { RemoveCrewMember(ToCrewMember, ToPart); FromPart.AddCrewmemberAt(ToCrewMember, FromPart.internalModel.seats.IndexOf(FromSeat)); // Add the crew members back into the part(s) at their new seats. ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat)); } else { // Just move. RemoveCrewMember(FromCrewMember, FromPart); AddCrewMember(FromCrewMember, ToPart); } SMAddon.FireEventTriggers(); } else { // Just move. RemoveCrewMember(FromCrewMember, FromPart); ToPart.AddCrewmemberAt(FromCrewMember, ToPart.internalModel.seats.IndexOf(ToSeat)); SMAddon.FireEventTriggers(); } } else // one or both parts do not have an internal model { // no portraits, so let's just move kerbals... if (ToCrewMember != null) { RemoveCrewMember(FromCrewMember, FromPart); RemoveCrewMember(ToCrewMember, ToPart); AddCrewMember(FromCrewMember, ToPart); AddCrewMember(ToCrewMember, FromPart); } else { RemoveCrewMember(FromCrewMember, FromPart); AddCrewMember(FromCrewMember, ToPart); } SMAddon.FireEventTriggers(); } if (SMSettings.EnableStockCrewXfer) { // Now let's deal with third party mod support... SourceAction = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(FromCrewMember, FromPart, ToPart); FireSourceXferEvent = true; //If a swap, we need to handle that too... if (ToCrewMember != null) { TargetAction = new GameEvents.HostedFromToAction <ProtoCrewMember, Part>(ToCrewMember, ToPart, FromPart); FireTargetXferEvent = true; } } FromPart.vessel.SpawnCrew(); // not sure if these help. We have been experiencing issues with "ghost" kerbals & EVAs/docking/undocking after Crew Moves. // trying this to see if it "cleans up" any internal tracking inside of KSP... FromPart.RegisterCrew(); ToPart.RegisterCrew(); SMAddon.SmVessel.RespawnCrew(); SMAddon.SmVessel.TransferCrewObj.IvaDelayActive = true; } catch (Exception ex) { SmUtils.LogMessage( $"in CrewTransferAction. Error moving crewmember. Error: {ex.Message} \r\n\r\n{ex.StackTrace}", SmUtils.LogType.Error, true); } }