/// <summary> /// Ustawia synchronizowane dane dla danego gracza. /// </summary> /// <param name="player"></param> /// <param name="dataName"></param> /// <param name="dataValue"></param> public static void SetPlayerSyncedData(Client player, string dataName, object dataValue) { if (!PlayersData.ContainsKey(player.Value)) { PlayersData.Add(player.Value, new Dictionary <string, object>()); } if (PlayersData[player.Value].ContainsKey(dataName)) { PlayersData[player.Value].Remove(dataName); } PlayersData[player.Value].Add(dataName, dataValue); foreach (Client entry in NAPI.Pools.GetAllPlayers()) { NAPI.ClientEvent.TriggerClientEvent(entry, "client.syncmanager.loadplayerdata", player.Value, dataName, dataValue); } Log.ConsoleLog("SYNC", $"Ustawiono dla gracza {Player.GetPlayerDebugName(player)} [dataName: {dataName} " + $"dataValue: {dataValue}]", LogType.Debug); }
public void Command_Acorner(Client player, string args = "") { var charData = Account.GetPlayerData(player); if (charData == null) { return; } if (!Admin.Library.DoesPlayerHasAdminPerm(charData, "corners", true)) { return; } const string legend = "/acorner [stworz, usun, goto, lista, highrisk]"; string[] arguments = Command.GetCommandArguments(args); if (arguments.Length < 1) { Ui.ShowUsage(player, legend); return; } string option = arguments[0].ToLower(); if (option == "stworz") { if (arguments.Length < 2) { Ui.ShowUsage(player, "/acorner stworz [nazwa]"); return; } string name = Command.GetConcatString(arguments, 1); Log.ConsoleLog("debug", name); var pos = player.Position; var corner = Library.CreateCorner(name, pos.X, pos.Y, pos.Z, (int)player.Dimension); Ui.ShowInfo(player, $"Pomyslnie stworzono corner {corner.Name} [UID: {corner.Id}]"); } else if (option == "goto") { if (arguments.Length < 2) { Ui.ShowUsage(player, "/acorner goto [UID]"); return; } int cornerId = Command.GetNumberFromString(arguments[1]); if (cornerId == Command.InvalidNumber) { Ui.ShowError(player, "Niepoprawne id cornera"); return; } var corner = Library.GetCornerData(cornerId); if (corner == null) { Ui.ShowError(player, "Nie znaleziono cornera o podanym id"); return; } player.Position = corner.GetPosition(); player.Dimension = (uint)corner.Dimension; } else if (option == "usun") { if (arguments.Length < 2) { Ui.ShowUsage(player, "/acorner usun [UID]"); return; } int cornerId = Command.GetNumberFromString(arguments[1]); if (cornerId == Command.InvalidNumber) { Ui.ShowError(player, "Niepoprawne id cornera"); return; } var corner = Library.GetCornerData(cornerId); if (corner == null) { Ui.ShowError(player, "Nie znaleziono cornera o podanym id"); return; } Library.DeleteCorner(corner); Ui.ShowInfo(player, $"Usunąleś corner UID: {cornerId}"); } else if (option == "lista") { var allCorners = Library.GetCorners(); List <DialogRow> dialogRows = new List <DialogRow>(); List <DialogColumn> dialogColumns = new List <DialogColumn> { new DialogColumn("UID", 20), new DialogColumn("Nazwa", 50), new DialogColumn("HighRisk", 20) }; foreach (var entry in allCorners) { var c = entry.Value; dialogRows.Add(new DialogRow(c.Id, new[] { c.Id.ToString(), c.Name, c.HighRisk ? "Tak" : "-" })); } string[] dialogButtons = { "OK" }; Dialogs.Library.CreateDialog(charData.PlayerHandle, DialogId.None, "Lista cornerów", dialogColumns, dialogRows, dialogButtons); } else if (option == "highrisk") { if (arguments.Length < 3) { Ui.ShowUsage(player, "/acorner highrisk [UID] [0/1]"); return; } int cornerId = Command.GetNumberFromString(arguments[1]); int arg = Command.GetNumberFromString(arguments[2]); bool highRisk = arg > 0 && arg != Command.InvalidNumber; if (cornerId == Command.InvalidNumber) { Ui.ShowError(player, "Niepoprawne id cornera"); return; } var corner = Library.GetCornerData(cornerId); if (corner == null) { Ui.ShowError(player, "Nie znaleziono cornera o podanym id"); return; } corner.HighRisk = highRisk; corner.Save(); Ui.ShowInfo(player, $"Zmieniłeś status highrisk cornera UID: {cornerId} na {highRisk}"); } }
/// <summary> /// Liczy i wypłaca wypłatę za przepracowane godziny. /// </summary> public static void CountPayday() { Log.ConsoleLog("PAYDAY", "Rozpoczynam dzialanie."); using (Database.Database db = new Database.Database()) { // Usunięcie duty które EndTime mają na 0. IQueryable <GroupDuty> endTime = db.GroupDuties.Where(t => t.EndTime == 0); int endTimeCount = endTime.Count(); db.GroupDuties.RemoveRange(endTime); db.SaveChanges(); Log.ConsoleLog("PAYDAY", $"Usunieto {endTimeCount} rekordow zawierajacych EndTime 0."); long yesterdayTimestamp = ((DateTimeOffset)DateTime.Now.AddHours(-24)).ToUnixTimeSeconds(); Log.ConsoleLog("PAYDAY", $"Szukam payday w bazie od czasu {yesterdayTimestamp} rekordow zawierajacych EndTime 0."); foreach (Character character in db.Characters.Where(t => !t.Blocked)) { int payday = 0; foreach (GroupMember group in db.GroupMembers.Where(t => t.CharacterId == character.Id)) { if (group.Payday <= 0) { continue; } Group groupData = db.Groups.FirstOrDefault(t => t.Id == group.GroupId); if (groupData == null) { continue; } int dutyTime = 0; foreach (GroupDuty dutySession in db.GroupDuties.Where(t => t.CharId == character.Id && t.GroupId == group.GroupId && t.StartTime >= yesterdayTimestamp)) { if (dutySession.EndTime < dutySession.StartTime) { continue; } dutyTime += dutySession.EndTime - dutySession.StartTime; } payday += CountPaydayForGroup(character, groupData, group.Payday, dutyTime); } if (payday > 0) { Log.ConsoleLog("PAYDAY", $"Wyplacono wyplate dla gracza {Player.GetPlayerIcName(character)} (${payday})"); character.AccountBalance += payday; db.Characters.Update(character); } } db.SaveChanges(); Log.ConsoleLog("PAYDAY", "Zakonczono wyplacanie..."); } }
/// <summary> /// Zapisuje wszystkie potrzebne dane i restartuje serwer. /// </summary> private static void SaveAll() { Log.ConsoleLog("RESTART", "Wyrzucanie graczy z serwera..."); List <Client> allPlayers = NAPI.Pools.GetAllPlayers(); foreach (Client player in allPlayers) { player.Kick("Następuje restart serwera, wróć za chwilę..."); } Log.ConsoleLog("RESTART", $"Wyrzucono {allPlayers.Count} graczy."); using (Database.Database db = new Database.Database()) { foreach (CharacterDrugAddictions entry in db.CharactersDrugAddictions.ToList()) { db.CharactersDrugAddictions.Attach(entry); entry.Amphetamine -= 5; if (entry.Amphetamine < 0) { entry.Amphetamine = 0; } entry.Cocaine -= 5; if (entry.Cocaine < 0) { entry.Cocaine = 0; } entry.Hash -= 5; if (entry.Hash < 0) { entry.Hash = 0; } entry.Heroin -= 5; if (entry.Heroin < 0) { entry.Heroin = 0; } entry.Lsd -= 5; if (entry.Lsd < 0) { entry.Lsd = 0; } entry.Marijuana -= 5; if (entry.Marijuana < 0) { entry.Marijuana = 0; } entry.MetaAmphetamine -= 5; if (entry.MetaAmphetamine < 0) { entry.MetaAmphetamine = 0; } entry.Opium -= 5; if (entry.Opium < 0) { entry.Opium = 0; } } db.SaveChanges(); Log.ConsoleLog("RESTART", "Zmniejszono uzaleznienie od narkotykow graczy..."); List <Character> allCharacters = db.Characters.ToList(); foreach (Character entry in allCharacters) { if (entry.Blocked) { continue; } db.Characters.Attach(entry); entry.Strength -= 1; if (entry.Strength < 1000) { entry.Strength = 1000; } // Log.ConsoleLog("RESTART", $"Postac {i} ({entry.Name} {entry.Lastname})", LogType.Debug); } db.SaveChanges(); Log.ConsoleLog("RESTART", "Zakonczono obliczenia na graczach."); int timestamp = Global.GetTimestamp(); foreach (House entry in db.Houses.ToList()) { entry.LoadInteriorData(); if (entry.InteriorData == null) { continue; } if (entry.InteriorData.OwnerType != OwnerType.Player) { continue; } Character charData = Account.GetPlayerDataOnly(entry.InteriorData.Owner); if (charData == null) { continue; } // Usuwanie po 30 dniach. if (timestamp - charData.LastLogin > 2592000) { entry.InteriorData.OwnerType = OwnerType.None; entry.InteriorData.Owner = 0; entry.InteriorData.Save(); } } CountPayday(); while (true) { DateTime nowTime = DateTime.Now; if (nowTime.Minute != 0) { break; } Thread.Sleep(1000); } Log.ConsoleLog("RESTART", "Zapis zakonczony. Wylaczanie serwera..."); Environment.Exit(0); } }
public static void StartSocket() { _lsvrpSocket = new LsvrpSocket(); _lsvrpSocket.Server(SocketIp, SocketPort); Log.ConsoleLog("SOCKET", $"Socket UDP został uruchomiony na adresie {SocketIp}:{SocketPort}"); }
/// <summary> /// Laduje do pamięci dane gracza /// </summary> /// <param name="player"></param> /// <param name="charId"></param> /// <returns></returns> public static async Task <Character> LoadPlayerData(Client player, int charId) { using (Database.Database db = new Database.Database()) { Character charInfo = await db.Characters.FirstOrDefaultAsync(t => t.Id == charId); if (charInfo == null) { return(null); } ForumMember memberData = await db.ForumMembers.FirstOrDefaultAsync(t => t.MemberId == charInfo.MemberId); charInfo.AdminLevel = 0; charInfo.HasAdminDuty = false; charInfo.HasMask = false; charInfo.HasCustomName = false; charInfo.CustomName = null; charInfo.AdminPerm = new List <object>(); charInfo.LastWhisper = null; charInfo.WhisperBlock = false; charInfo.Cuff = null; charInfo.RadioBlock = false; charInfo.HasInvisibleEnabled = false; charInfo.ServerId = player.Value; charInfo.ServerData = new Dictionary <ServerData, object>(); charInfo.IsCrouching = false; charInfo.Tattoos = new List <Tattoo>(); charInfo.SyncedTattoos = new List <int>(); charInfo.UsedWeapon = null; charInfo.PlayerHandle = player; charInfo.AnimPlayer = null; charInfo.LoadDrugs(); List <Database.Models.Tattoo> tattoos = await db.Tattoos.Where(t => t.CharId == charInfo.Id).ToListAsync(); foreach (Database.Models.Tattoo entry in tattoos) { charInfo.SyncedTattoos.Add(entry.TattooId); } WalkingStyle charWalkingStyle = await db.WalkingStyles.FirstOrDefaultAsync(t => t.Id == charInfo.WalkingStyle); if (charWalkingStyle == default(WalkingStyle)) { charInfo.WalkingStyleAnim = null; } else { charInfo.WalkingStyleAnim = charWalkingStyle.AnimName; if (charInfo.WalkingStyleAnim.Length < 2) { charInfo.WalkingStyleAnim = null; } } try { charInfo.AdminPerm = JsonConvert.DeserializeObject <List <object> >(memberData.AdminFlags); } catch (Exception e) { Log.ConsoleLog("ACCOUNT", $"(USER {charInfo.Name} {charInfo.Lastname}) {e.Message}", LogType.Error); charInfo.AdminPerm = new List <object>(); } CharactersList.Add(charInfo.PlayerHandle.Value, charInfo); return(charInfo); } }
public void Event_OnMarkerEnter(Client player, string markerName) { Log.ConsoleLog("BLIPS", $"OnMarkerEnter: {markerName}", LogType.Debug); if (markerName == "courier.blip") { using (Database.Database db = new Database.Database()) { List <OrderPending> activeOrders = new List <OrderPending>(); foreach (OrderPending entry in db.OrdersPendings.ToList()) { if (!Jobs.Courier.Library.DoesOrderDelivered(entry.Id)) { activeOrders.Add(entry); } } if (activeOrders.Count == 0) { Ui.ShowError(player, "Nie ma dostępnych żadnych paczek."); Jobs.Courier.Library.StopCourier(player); return; } List <DialogColumn> dialogColumns = new List <DialogColumn> { new DialogColumn("Paczka", 90) }; List <DialogRow> dialogRows = new List <DialogRow>(); foreach (OrderPending entry in activeOrders) { dialogRows.Add(new DialogRow(entry.Id, new[] { entry.Name })); } string[] dialogButtons = { "Przyjmij", "Anuluj" }; Dialogs.Library.CreateDialog(player, DialogId.CourierAcceptPackage, "Wybierz paczkę do dostarczenia", dialogColumns, dialogRows, dialogButtons); } } else if (markerName == "courier.group") { CourierOrder courierData = Jobs.Courier.Library.GetCourierData(player); if (courierData == null) { Jobs.Courier.Library.StopCourier(player); return; } using (Database.Database db = new Database.Database()) { OrderPending pendingOrder = db.OrdersPendings.FirstOrDefault(t => t.Id == courierData.OrderId); if (pendingOrder == null) { Ui.ShowError(player, "Nie znaleziono takiego zamówienia."); Jobs.Courier.Library.StopCourier(player); return; } Order orderData = db.Orders.FirstOrDefault(t => t.Id == pendingOrder.OrderId); if (orderData == null) { Ui.ShowError(player, "Nie ma zamówienia odpowiadającemu temu w bazie."); Jobs.Courier.Library.StopCourier(player); return; } GroupProduct magazineItem = db.GroupProducts.FirstOrDefault(t => t.GroupId == orderData.GroupId && t.ItemName == orderData.Name && t.ItemType == orderData.Type && t.ItemValue1 == orderData.Value1 && t.ItemValue2 == orderData.Value2); if (magazineItem == null) { magazineItem = new GroupProduct { GroupId = orderData.GroupId, ItemName = orderData.Name, ItemType = orderData.Type, ItemValue1 = orderData.Value1, ItemValue2 = orderData.Value2, ItemValue3 = orderData.Value3, Stock = pendingOrder.Count, FlagType = orderData.Flag, Price = orderData.Price }; db.GroupProducts.Add(magazineItem); } else { magazineItem.Stock += pendingOrder.Count; db.GroupProducts.Update(magazineItem); } int price = pendingOrder.Count * 2; if (price < 20) { price = 20; } if (price > 100) { price = 100; } Ui.ShowInfo(player, $"Paczka została dostarczona pomyślnie. Otrzymałeś zapłatę w wysokości ${price}."); Money.Library.GivePlayerWalletCash(player, price, "Zapłata za kurs kuriera."); db.OrdersPendings.Remove(pendingOrder); db.SaveChanges(); Jobs.Courier.Library.StopCourier(player); } } else if (markerName == "vehicle.target") { Character charData = Account.GetPlayerData(player); if (charData == null) { return; } Account.RemoveServerData(charData, Account.ServerData.TargetingAtVehicle); Ui.ShowInfo(player, "Namierzanie pojazdu zostało wyłączone."); NAPI.ClientEvent.TriggerClientEvent(player, "client.markers.destroyMarker", "vehicle.target"); } }