/// <summary> /// Создает игровой объект. /// Если это пешка не колонист, то делаем его пиратом заключённым. /// Если freePirate=true, то делаем враждебными пиратами всех из фракции игрока. /// </summary> public static Thing PrepareSpawnThingEntry(ThingEntry thing, Faction factionPirate, bool freePirate = false) { var factionColonistLoadID = Find.FactionManager.OfPlayer.GetUniqueLoadID(); //var fractionRoyaltyLoadID = Find.FactionManager.FirstFactionOfDef(FactionDefOf.Empire)?.GetUniqueLoadID(); var fractionRoyalty = Find.FactionManager.FirstFactionOfDef(FactionDefOf.Empire); //if (string.IsNullOrEmpty(fractionRoyaltyLoadID)) Loger.Log("Client fractionRoyaltyLoadID is not find"); //var factionPirateLoadID = factionPirate.GetUniqueLoadID(); RegisterReferencing(Find.FactionManager.OfPlayer); //меняем фракцию на игрока для всех thing.SetFaction(factionColonistLoadID, () => { if (fractionRoyalty == null) { Loger.Log("Client fractionRoyalty is not find"); return(null); } Loger.Log("Client fractionRoyalty RegisterReferencing"); RegisterReferencing(fractionRoyalty); return(fractionRoyalty.GetUniqueLoadID()); }); Thing thin; thin = thing.CreateThing(false, 0, freePirate); return(thin); }
private List <ThingEntry> GetPawnsAndDeleteCaravan(Caravan caravan) { var select = caravan.PawnsListForReading.ToList(); //передаем выбранные товары из caravan к другому игроку в сaravanOnline var sendThings = new List <ThingEntry>(); foreach (var pair in select) { var thing = pair; sendThings.Add(ThingEntry.CreateEntry(thing, 1)); /* * if (thing is Pawn) * { * var pawn = thing as Pawn; * GameUtils.DeSpawnSetupOnCaravan(caravan, pawn); * }*/ } //пешки получины, остальное уничтожаем caravan.RemoveAllPawns(); if (caravan.Spawned) { Find.WorldObjects.Remove(caravan); } foreach (var pair in select) { pair.Destroy(DestroyMode.Vanish); } return(sendThings); }
/// <summary> /// Создает игровой объект. /// Если это пешка не колонист, то делаем его пиратом заключённым. /// Если freePirate=true, то делаем враждебными пиратами всех из фракции игрока. /// </summary> public static Thing PrepareSpawnThingEntry(ThingEntry thing, Faction factionPirate, bool freePirate = false) { var factionColonistLoadID = Find.FactionManager.OfPlayer.GetUniqueLoadID(); //var factionPirateLoadID = factionPirate.GetUniqueLoadID(); //меняем фракцию на игрока для всех thing.SetFaction(factionColonistLoadID); Thing thin; thin = thing.CreateThing(false, 0, freePirate); return(thin); }
private void exchangeOfGoods(Caravan caravan) { //Pawn bestNegotiator = CaravanVisitUtility.BestNegotiator(caravan); ThingOwner <Thing> сontainer = new ThingOwner <Thing>(); Dialog_TradeOnline form = null; if (сaravanOnline.OnlineWObject == null) { Log.Error("OCity_Caravan_LOGNoData".Translate()); return; } var goods = GameUtils.GetAllThings(caravan); form = new Dialog_TradeOnline(goods , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.FreeWeight , () => { if (!SessionClientController.Data.BackgroundSaveGameOff) { var select = form.GetSelect(); bool selectAllCaravan = caravan.PawnsListForReading.Count == select.Count(s => s.Key is Pawn); if (selectAllCaravan) { Log.Message("OCity_Caravan_LOGSwap".Translate()); select = new Dictionary <Thing, int>(); foreach (var pawn in caravan.PawnsListForReading) { foreach (var item in pawn.inventory.innerContainer.ToDictionary(t => t, t => t.stackCount)) { select.Add(item.Key, item.Value); } select.Add(pawn, 1); pawn.inventory.innerContainer.Clear(); } } //передаем выбранные товары из caravan к другому игроку в сaravanOnline var sendThings = new List <ThingEntry>(); foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //если отдали пешку, то выкладываем все другим и удаляемся из каравана var things = pawn.inventory.innerContainer.ToList(); pawn.inventory.innerContainer.Clear(); GameUtils.DeSpawnSetupOnCaravan(caravan, pawn); foreach (var thin in things) { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } sendThings.Add(ThingEntry.CreateEntry(thing, numToTake)); } if (selectAllCaravan) { //удаляем пешку из игры foreach (var pawn in caravan.PawnsListForReading) { GameUtils.PawnDestroy(pawn); } Find.WorldObjects.Remove(caravan); } else { foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //удаляем пешку из игры GameUtils.PawnDestroy(pawn); } else { //если отдали вешь, то находим кто её тащит и убираем с него Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(caravan, thing); ownerOf.inventory.innerContainer.TryTransferToContainer(thing, сontainer, numToTake); } } } //После передачи сохраняем, чтобы нельзя было обузить, после чего передаем вещи SessionClientController.SaveGameNowSingleAndCommandSafely( (connect) => { return(connect.SendThings(sendThings , SessionClientController.My.Login , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.ServerId , сaravanOnline.Tile )); }, null, null); //если не удалось отправить письмо, то жопа так как сейв уже прошел } }); Find.WindowStack.Add(form); }
/// <summary> /// Создает игровой объект. /// Если это пешка не колонист, то делаем его пиратом заключённым. /// Если freePirate=true, то делаем враждебными пиратами всех из фракции игрока. /// revertPirate=true включает freePirate, если это бы не пират, и делает игроком, если был пиратом /// </summary> public static Thing PrepareSpawnThingEntry(ThingEntry thing, Faction factionPirate, bool freePirate = false /*, bool revertPirate = false*/) { var factionColonistLoadID = Find.FactionManager.OfPlayer.GetUniqueLoadID(); var factionPirateLoadID = factionPirate.GetUniqueLoadID(); var prisoner = thing.SetFaction(factionColonistLoadID, factionPirateLoadID); Thing thin; thin = thing.CreateThing(false); if (MainHelper.DebugMode) { Loger.Log("SetFaction..."); } if (thin.def.CanHaveFaction) { if (MainHelper.DebugMode) { Loger.Log("SetFaction...1"); } /* * if (revertPirate) * { * if (thin is Pawn && thin.Faction == Find.FactionManager.OfPlayer) * { * thin.SetFaction(factionPirate); * var p = thin as Pawn; * if (!freePirate) p.guest.SetGuestStatus(factionPirate, true); * } * else * thin.SetFaction(Find.FactionManager.OfPlayer); * } * else*/ { if (thin is Pawn && (prisoner || freePirate && (/*((Pawn)thin).RaceProps.Humanlike ||*/ thin.Faction == Find.FactionManager.OfPlayer))) { if (MainHelper.DebugMode) { Loger.Log("SetFaction...2"); } thin.SetFaction(factionPirate); if (MainHelper.DebugMode) { Loger.Log("SetFaction...3"); } var p = thin as Pawn; if (MainHelper.DebugMode) { Loger.Log("SetFaction...4"); } if (!freePirate && p.guest != null) { p.guest.SetGuestStatus(factionPirate, true); } if (MainHelper.DebugMode) { Loger.Log("SetFaction...5"); } } else { if (MainHelper.DebugMode) { Loger.Log("SetFaction...6"); } thin.SetFaction(Find.FactionManager.OfPlayer); if (MainHelper.DebugMode) { Loger.Log("SetFaction...7"); } } } } return(thin); }
private void AttackUpdate() { bool inTimerEvent = false; try { if (InTimer) { return; } InTimer = true; AttackUpdateTick++; // Loger.Log("Client HostAttackUpdate #" + AttackUpdateTick.ToString()); SessionClientController.Command((connect) => { try { List <Pawn> mapPawns; AttackHostFromSrv toClient; lock (ToSendListsSync) { // Loger.Log("Client HostAttackUpdate 1"); //обновляем списки mapPawns = GameMap.mapPawns.AllPawnsSpawned; var mapPawnsId = new HashSet <int>(mapPawns.Select(p => p.thingIDNumber)); mapPawnsId.SymmetricExceptWith(SendedPawnsId); //новые пешки + те что на сервере, но их уже нет на карте if (mapPawnsId.Count > 0) { var toSendAddId = new HashSet <int>(mapPawnsId); toSendAddId.ExceptWith(SendedPawnsId); //только новые пешки if (toSendAddId.Count > 0) { toSendAddId.ExceptWith(ToSendAddId); //исключаем те, которые уже есть в списке ToSendAddId.AddRange(toSendAddId); } var toSendDeleteId = new HashSet <int>(mapPawnsId); toSendDeleteId.IntersectWith(SendedPawnsId); //только те, что на сервере но их уже нет на карте if (toSendDeleteId.Count > 0) { toSendDeleteId.ExceptWith(ToSendDeleteId); //исключаем те, которые уже есть в списке ToSendDeleteId.AddRange(toSendDeleteId); } } //посылаем пакеты с данными // Loger.Log("Client HostAttackUpdate 2"); var newPawns = new List <ThingEntry>(); var newPawnsId = new List <int>(); int cnt = ToSendAddId.Count < 3 || ToSendAddId.Count > 6 || AttackUpdateTick == 0 ? ToSendAddId.Count : 3; int i = 0; int[] added = new int[cnt]; foreach (int id in ToSendAddId) { if (i >= cnt) { break; } added[i++] = id; var thing = mapPawns.Where(p => p.thingIDNumber == id).FirstOrDefault(); var tt = ThingEntry.CreateEntry(thing, 1); //передаем те, что были исходные у атакуемого (хотя там используется только как признак TransportID != 0 - значит те кто атакует) if (AttackingPawnDic.ContainsKey(tt.OriginalID)) { tt.TransportID = AttackingPawnDic[tt.OriginalID]; } newPawns.Add(tt); newPawnsId.Add(id); } for (i = 0; i < cnt; i++) { ToSendAddId.Remove(added[i]); SendedPawnsId.Add(added[i]); } foreach (int id in ToSendDeleteId) { SendedPawnsId.Remove(id); } //вещи var newThings = ToSendThingAdd .Where(thing => !ToSendDeleteId.Any(d => thing.thingIDNumber == d)) .Select(thing => ThingEntry.CreateEntry(thing, thing.stackCount)) .ToList(); //передаем изменение местоположения и пр. по ID хоста var toSendState = new List <AttackThingState>(); var toSendStateId = new List <int>(); for (int imp = 0; imp < mapPawns.Count; imp++) { var mp = mapPawns[imp]; var mpID = mp.thingIDNumber; if (ToUpdateStateId.Contains(mpID)) { continue; } var mpHash = AttackThingState.GetHash(mp); int mpHS; if (!SendedState.TryGetValue(mpID, out mpHS) || mpHS != mpHash) { SendedState[mpID] = mpHash; toSendState.Add(new AttackThingState(mp)); } } for (int imp = 0; imp < ToUpdateState.Count; imp++) { var mp = ToUpdateState[imp]; var mpID = mp.thingIDNumber; if (ToSendDeleteId.Contains(mpID)) { continue; } if (mp is Pawn) { var mpHash = AttackThingState.GetHash(mp); SendedState[mpID] = mpHash; //заносим только для проверки выше } toSendState.Add(new AttackThingState(mp)); } //обновляем поколения вещей учавствующих в Job и отправляем нужные foreach (var mp in ThingPrepareChange0) { var mpID = mp.thingIDNumber; if (ToSendDeleteId.Contains(mpID)) { continue; } toSendState.Add(new AttackThingState(mp)); } Loger.Log("HostAttackUpdate UpdateCommand FromJob Count=" + ThingPrepareChange0.Count.ToString()); ThingPrepareChange0 = ThingPrepareChange1; ThingPrepareChange1 = new HashSet <Thing>(); //Loger.Log("Client HostAttackUpdate 3"); toClient = connect.AttackOnlineHost(new AttackHostToSrv() { State = 10, NewPawns = newPawns, NewPawnsId = newPawnsId, NewThings = newThings, NewThingsId = newThings.Select(th => th.OriginalID).ToList(), Delete = ToSendDeleteId.ToList(), UpdateState = toSendState }); ToSendThingAdd.Clear(); ToSendDeleteId.Clear(); ToUpdateStateId.Clear(); ToUpdateState.Clear(); } //принимаем обновление команд атакующих if (toClient.UpdateCommand.Count > 0) { Loger.Log("HostAttackUpdate UpdateCommand Count=" + toClient.UpdateCommand.Count.ToString()); UIEventNewJobDisable = true; for (int ii = 0; ii < toClient.UpdateCommand.Count; ii++) { var comm = toClient.UpdateCommand[ii]; var pawn = mapPawns.Where(p => p.thingIDNumber == comm.HostPawnID).FirstOrDefault() as Pawn; if (pawn == null) { Loger.Log("HostAttackUpdate UpdateCommand pawn == null " + comm.HostPawnID.ToString()); continue; } AttackingPawnJobDic[comm.HostPawnID] = comm; ApplyAttackingPawnJob(pawn); } UIEventNewJobDisable = false; } // Loger.Log("Client HostAttackUpdate 4"); } catch (Exception ext) { InTimer = false; Loger.Log("HostAttackUpdate Event Exception " + ext.ToString()); } finally { InTimer = false; } }); } catch (Exception ext) { Loger.Log("HostAttackUpdate Exception " + ext.ToString()); } if (!inTimerEvent) { InTimer = false; } }
//public override bool ShouldFail { get { return false; } } public override void Arrived(Caravan caravan) { if (mode == "exchangeOfGoods") { //Pawn bestNegotiator = CaravanVisitUtility.BestNegotiator(caravan); ThingOwner <Thing> сontainer = new ThingOwner <Thing>(); Dialog_TradeOnline form = null; if (сaravanOnline.OnlineWObject == null) { Log.Error("OCity_Caravan_LOGNoData".Translate()); return; } var goods = GameUtils.GetAllThings(caravan); form = new Dialog_TradeOnline(goods , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.FreeWeight , () => { var select = form.GetSelect(); bool selectAllCaravan = caravan.PawnsListForReading.Count == select.Count(s => s.Key is Pawn); if (selectAllCaravan) { Log.Message("OCity_Caravan_LOGSwap".Translate()); select = new Dictionary <Thing, int>(); foreach (var pawn in caravan.PawnsListForReading) { foreach (var item in pawn.inventory.innerContainer.ToDictionary(t => t, t => t.stackCount)) { select.Add(item.Key, item.Value); } select.Add(pawn, 1); pawn.inventory.innerContainer.Clear(); } } //передаем выбранные товары из caravan к другому игроку в сaravanOnline var sendThings = new List <ThingEntry>(); foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //если отдали пешку, то выкладываем все другим и удаляемся из каравана var things = pawn.inventory.innerContainer.ToList(); pawn.inventory.innerContainer.Clear(); GameUtils.DeSpawnSetupOnCaravan(caravan, pawn); foreach (var thin in things) { var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null); if (p != null) { p.inventory.innerContainer.TryAdd(thin, true); } } } sendThings.Add(ThingEntry.CreateEntry(thing, numToTake)); } SessionClientController.Command((connect) => { connect.SendThings(sendThings , SessionClientController.My.Login , сaravanOnline.OnlinePlayerLogin , сaravanOnline.OnlineWObject.ServerId , сaravanOnline.Tile ); }); if (selectAllCaravan) { //удаляем пешку из игры foreach (var pawn in caravan.PawnsListForReading) { pawn.Destroy(DestroyMode.Vanish); } Find.WorldObjects.Remove(caravan); } else { foreach (var pair in select) { var thing = pair.Key; var numToTake = pair.Value; if (thing is Pawn) { var pawn = thing as Pawn; //удаляем пешку из игры pawn.Destroy(DestroyMode.Vanish); //Find.WorldPawns.RemovePawn(pawn); не проверенное не полное удаление, если её вернут назад } else { //если отдали вешь, то находим кто её тащит и убираем с него Pawn ownerOf = CaravanInventoryUtility.GetOwnerOf(caravan, thing); ownerOf.inventory.innerContainer.TryTransferToContainer(thing, сontainer, numToTake); } } } }); Find.WindowStack.Add(form); } }
public bool Run() { /* * GameUtils.ShowDialodOKCancel("asdasda", * () => Log.Message("Test OK"), * () => Log.Message("Test Cancel") * ); * return true; */ /* * var formm = new Dialog_Exchenge(Find.Maps[0]); * Find.WindowStack.Add(formm); * return true; * // */ return(false); /* * var lll = ScenarioLister.ScenariosInCategory(ScenarioCategory.FromDef); * * File.WriteAllText(Loger.PathLog + @"ScenarioLister.txt", TextObj(lll), Encoding.UTF8); * return true; */ try { Log.Message("DevelopTest Run"); Loger.Log(""); Loger.Log("DevelopTest Run"); var pawns = Find.WorldPawns.AllPawnsAlive.ToList(); //Fedon,Huntsman,Ally,Lilith,Tater,Jesse,Kentucky //Log.Message(string.Join(",", pawns.Select(p => p.NameStringShort).ToArray())); var pawn = pawns.Where(p => p.Name.ToStringShort == "Huntsman").FirstOrDefault(); File.WriteAllText(Loger.PathLog + @"Huntsman.txt", TextObj(pawn), Encoding.UTF8); var msg = ""; var map = Find.Maps[0]; var pawnsMy = map.mapPawns.AllPawnsSpawned.First(); Thing thinXZ; var cell = GameUtils.GetTradeCell(map); var gx = new GameXMLUtils(); //var testPawn = Scribe.saver.DebugOutputFor(pawns[0]); var testPawn = gx.ToXml(pawnsMy); File.WriteAllText(@"c:\World\testPawn.xml", testPawn); gx.StartFromXml(@"c:\World\test.xml"); var thin0 = gx.Test <Thing>(); //PawnComponentsUtility.CreateInitialComponents((Pawn)thin0); gx.Finish(); thin0.ThingID += "555"; if (thin0 is Pawn) { var refugee = (Pawn)thin0; GenSpawn.Spawn(refugee, cell, map); //refugee.SetFaction(Faction.OfPlayer, null); refugee.PostMapInit(); //? //map.mapPawns.UpdateRegistryForPawn((Pawn)thin0); } else { GenDrop.TryDropSpawn(thin0, cell, map, ThingPlaceMode.Near, out thinXZ, null); } //MapComponentUtility.FinalizeInit(map); //???? return(true); File.WriteAllText(Loger.PathLog + @"map.txt", TextObj(map, false), Encoding.UTF8); List <Thing> listThing = CaravanFormingUtility.AllReachableColonyItems(Find.Maps[0]); Dialog_TradeOnline form = null; form = new Dialog_TradeOnline(listThing, "OCity_DevTest_Test".Translate(), 3, () => { var select = form.GetSelect(); Thing thin = null; var thins = select.Select(p => { return(ThingEntry.CreateEntry(thin = p.Key, p.Value)); }).ToList(); var outText = TextObj(thins, true); File.WriteAllText(Loger.PathLog + @"Car.txt", outText, Encoding.UTF8); var caravan = Find.WorldObjects.Caravans[0]; foreach (var t in select) { //t.Key //ThingEntry the = new ThingEntry(t.Key, t.Value); ///* //thin = the.CreateThing(); //var p = CaravanInventoryUtility.FindPawnToMoveInventoryTo(thin, caravan.PawnsListForReading, null); //p.inventory.innerContainer.TryAdd(thin, true); //*/ //thin = the.CreateThing(); GenDrop.TryDropSpawn(thin, cell, map, ThingPlaceMode.Near, out thinXZ, null); } /* * File.WriteAllText(Loger.PathLog + @"ThingIn.txt", TextObj(thin, true), Encoding.UTF8); * //if (thin.Spawned) thin.DeSpawn(); * ThingEntry the = new ThingEntry(thin, 1); * thin = the.CreateThing(); * GenDrop.TryDropSpawn(thin, GameUtils.GetTradeCell(map), map, ThingPlaceMode.Near, out thinXZ, null); * File.WriteAllText(Loger.PathLog + @"ThingXZ.txt", TextObj(thinXZ, true), Encoding.UTF8); * File.WriteAllText(Loger.PathLog + @"ThingOut.txt", TextObj(thin, true), Encoding.UTF8); */ /* * if (thin != null) * { * File.WriteAllText(Loger.PathLog + @"ThingIn.txt", TextObj(thin, true), Encoding.UTF8); * ThingEntry the = new ThingEntry(thin, 1); * File.WriteAllText(Loger.PathLog + @"ThingEntry.txt", TextObj(the, true), Encoding.UTF8); * File.WriteAllText(Loger.PathLog + @"ThingOut.txt", TextObj(the.CreateThing(), true), Encoding.UTF8); * }*/ }); Find.WindowStack.Add(form); return(true); pawn = pawns.Where(p => p.Name.ToStringShort == "Jesse").FirstOrDefault(); //msg += Find.Maps.Count.ToString() + Environment.NewLine; var pawnText = TextObj(pawn, true); File.WriteAllText(Loger.PathLog + @"Car.txt", pawnText, Encoding.UTF8); int directionTile = CaravanExitMapUtility.RandomBestExitTileFrom(Find.Maps[0]); //Find.Maps[0].Tile; //var destroyedFactionBase = (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.CaravanOnline); var destroyedFactionBase = (CaravanOnline)WorldObjectMaker.MakeWorldObject(ModDefOf.BaseOnline); destroyedFactionBase.Tile = directionTile; destroyedFactionBase.OnlineWObject = new Model.WorldObjectEntry() { LoginOwner = "OCity_DevTest_NameTestPlayer".Translate() }; destroyedFactionBase.SetFaction(Faction.OfPlayer); Find.WorldObjects.Add(destroyedFactionBase); var cars = Find.WorldObjects.AllWorldObjects.Where(o => o is Caravan).ToList(); var seeText = TextObj(cars); File.WriteAllText(Loger.PathLog + @"See.txt", seeText, Encoding.UTF8); Loger.Log(msg); } catch (Exception e) { Log.Error(e.ToString()); } return(true); }
/// <summary> /// Создает игровой объект. /// Если это пешка не колонист, то делаем его пиратом заключённым. /// Если freePirate=true, то делаем враждебными пиратами всех из фракции игрока. /// </summary> public static Thing PrepareSpawnThingEntry(ThingEntry thing, Faction factionPirate, bool freePirate = false) { var factionColonistLoadID = Find.FactionManager.OfPlayer.GetUniqueLoadID(); //var factionPirateLoadID = factionPirate.GetUniqueLoadID(); //меняем фракцию на игрока для всех var prisoner = thing.SetFaction(factionColonistLoadID); Thing thin; thin = thing.CreateThing(false); if (MainHelper.DebugMode) { Loger.Log("SetFaction..."); } if (thin.def.CanHaveFaction) { if (MainHelper.DebugMode) { Loger.Log("SetFaction...1"); } if (thin is Pawn && (prisoner || freePirate && thin.Faction == Find.FactionManager.OfPlayer)) { //а тут меняем фракцию на пиратов, для тех кому нужно if (MainHelper.DebugMode) { Loger.Log("SetFaction...2"); } thin.SetFaction(factionPirate); if (MainHelper.DebugMode) { Loger.Log("SetFaction...3"); } var p = thin as Pawn; if (MainHelper.DebugMode) { Loger.Log("SetFaction...4"); } if (!freePirate && p.guest != null) { p.guest.SetGuestStatus(factionPirate, true); } if (MainHelper.DebugMode) { Loger.Log("SetFaction...5"); } } else { if (MainHelper.DebugMode) { Loger.Log("SetFaction...6"); } thin.SetFaction(Find.FactionManager.OfPlayer); if (MainHelper.DebugMode) { Loger.Log("SetFaction...7"); } } } return(thin); }
public static string GenderString(this ThingEntry entry) { return(entry.gender.ToString().ToLower()); }