/// <summary> /// Ustawia synchronizowane dane dla danego gracza. /// </summary> /// <param name="player"></param> /// <param name="data"></param> public static void SetPlayerSyncedData(Client player, IEnumerable <PlayerData> data) { if (!PlayersData.ContainsKey(player.Value)) { PlayersData.Add(player.Value, new Dictionary <string, object>()); } foreach (PlayerData dataEntry in data) { if (PlayersData[player.Value].ContainsKey(dataEntry.Name)) { PlayersData[player.Value].Remove(dataEntry.Name); } PlayersData[player.Value].Add(dataEntry.Name, dataEntry.Value); } string serializedObject = JsonConvert.SerializeObject(data, Formatting.None); foreach (Client entry in NAPI.Pools.GetAllPlayers()) { NAPI.ClientEvent.TriggerClientEvent(entry, "client.syncmanager.loadplayermoredata", player.Value, serializedObject); } Log.ConsoleLog("SYNC", $"Ustawiono dla gracza {Player.GetPlayerDebugName(player)} [wiele danych]", LogType.Debug); }
/// <summary> /// Tworzy nową ofertę. /// </summary> /// <param name="player"></param> /// <param name="target"></param> /// <param name="type"></param> /// <param name="price"></param> /// <param name="data"></param> /// <param name="name"></param> /// <param name="system"></param> public static void CreateOffer(Client player, Client target, OfferType type, uint price, Dictionary <string, object> data, string name, bool system = false) { Offer newOffer = new Offer { Id = GetFreeOfferIndex(), Player = player, Target = target, Type = type, Price = price, Data = data, StartedAt = Global.GetTimestamp(), SystemOffer = system }; OffersList.Add(newOffer.Id, newOffer); if (player != null) { Ui.ShowInfo(player, "Oferta została złożona."); } // TODO: logi string pName = player == null ? "System" : Player.GetPlayerIcName(player); NAPI.ClientEvent.TriggerClientEvent(target, "client.offers.showOffer", $"{pName} ofertuje {name}", price); Log.ConsoleLog("OFFERS", $"Oferta o Id {newOffer.Id} zostala utworzona.", LogType.Debug); }
public void ServerStart() { Console.OutputEncoding = Encoding.UTF8; Console.CancelKeyPress += delegate(object sender, ConsoleCancelEventArgs args) { Log.ConsoleLog("SHUTDOWN", "Wyłączanie serwera..."); args.Cancel = true; }; double startTime = Global.GetTimestampMs(); Log.ConsoleLog("MAIN", "Inicjalizacja skryptu Los Santos V Role-Play..."); NAPI.Server.SetGlobalServerChat(false); // Wyłączenie globalnego domyślnego czatu NAPI.Server.SetAutoSpawnOnConnect(false); // Wyłączenie automatycznego spawnu gracza po dołączeniu NAPI.Server.SetAutoRespawnAfterDeath(false); // Wyłączenie automatycznego respawnu po śmierci NAPI.Server.SetGlobalDefaultCommandMessages(false); // Wyłączenie domyślnych odpowiedzi do komend // NAPI.Server.SetDefaultSpawnLocation(); TODO // Ładowanie systemów Library.LoadGroups(); // Ładowanie grup Features.Vehicles.Library.LoadVehicles(); // Ładowanie pojazdów New.Managers.ItemsManager.Load(); // [NEW] Ładowanie przedmiotów // Features.Items.Library.LoadItems(); // Ładowanie przedmiotów Features.Blips.Library.LoadBlips(); // Ładowanie blipów Features.Animations.Library.LoadAnimations(); // Ładowanie animacji Features.Interiors.Library.LoadInteriors(); // Ładowanie interiorów Features.Interiors.Library.LoadInteriorsDoors(); // Ładowanie drzwi interiorów Features.Corners.Library.LoadCorners(); Features.Shops.Library.LoadShops(); // Ładowanie sklepów Features.Timers.Library.StartTimer(); // Włączanie timera Features.Socket.Library.StartSocket(); // Włączanie serwera socket Features.Drugs.Library.Load(); // Ładowanie narkotyków Features.Objects.Library.LoadObjects(); // Ładowanie obiektów Features.Houses.Library.LoadHouses(); // Ładowanie mieszkań // Features.Tattoos.Library.RenderClientsideTattooList(); // Tworzenie tatuaży dla clientside using (Database.Database db = new Database.Database()) { db.Characters.ToList().ForEach(t => t.InGame = false); db.SaveChanges(); Log.ConsoleLog("INGAME", "Zresetowano licznik graczy online."); } Log.ConsoleLog("MAIN", $"Zakończono ładowanie modułów. | {Global.GetTimestampMs() - startTime}ms"); Console.WriteAscii($"LSVRP {Constants.ScriptVersion}", Color.White); if (Configuration.Get().DebugMode) { Log.ConsoleLog("MAIN", "DebugMode jest WŁĄCZONY.", LogType.Warning); } // Features.Timers.Library.CountPayday(); // tylko do testów }
/// <summary> /// Funkcja uruchamiana wraz ze startem serwera. Ładuje wszystkie pojazdy do pamięci /// </summary> public static void LoadVehicles() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <Vehicle> vehicles = db.Vehicles.ToList(); foreach (Vehicle entry in vehicles) { entry.Spawned = false; entry.MappedExtras = new Dictionary <int, bool>(); try { entry.MappedExtras = JsonConvert.DeserializeObject <Dictionary <int, bool> >(entry.Extras); } catch { entry.MappedExtras = new Dictionary <int, bool>(); } VehiclesList.Add(entry.Id, entry); if (entry.OwnerType == OwnerType.Group) { Group groupData = Groups.Library.GetGroupData(entry.Owner); if (groupData == null) // Jeśli grupa nie istnieje { DestroyVehicle(entry.Id); } else { if (groupData.Type != GroupType.Family) { SpawnVehicle(entry.Id); } } } } foreach (VehicleFuel entry in db.VehiclesFuel.ToList()) { VehConsumption entryConsumption = new VehConsumption { VehicleHash = NAPI.Util.GetHashKey(entry.VehicleName), Consumption = entry.Consumption, MaxFuel = entry.MaxFuel }; VehiclesFuel.Add(entryConsumption.VehicleHash, entryConsumption); } Log.ConsoleLog("VEHICLES", $"Załadowano pojazdy ({VehiclesList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Uruchamia timer. /// </summary> public static void StartTimer() { // ReSharper disable once RedundantCheckBeforeAssignment if (_globalTimer != null) { _globalTimer = null; } _globalTimer = new Timer(1000); _globalTimer.Elapsed += OnTimerElapsed; _globalTimer.AutoReset = true; _globalTimer.Enabled = true; Log.ConsoleLog("TIMER", "Timer został uruchomiony."); }
/// <summary> /// Tworzy nowy pojazd. /// </summary> /// <param name="vehicleHash"></param> /// <param name="position"></param> /// <param name="rotation"></param> /// <param name="colorFirst"></param> /// <param name="colorSecond"></param> /// <param name="ownerTypeType"></param> /// <param name="dimension"></param> /// <param name="owner"></param> /// <param name="name"></param> /// <param name="createdBy"></param> /// <returns></returns> public static Vehicle CreateVehicle(long vehicleHash, Vector3 position, Vector3 rotation, int colorFirst, int colorSecond, OwnerType ownerTypeType, int dimension, int owner, string name, string createdBy = "System") { VehConsumption vehCon = GetDefaultConsumption(vehicleHash); Vehicle veh = new Vehicle { VehicleHash = vehicleHash, Name = name, OwnerType = ownerTypeType, Owner = owner, Dimension = dimension, NumberPlate = "BRAK", PlateType = 1, Spawned = false, X = position.X, Y = position.Y, Z = position.Z, Rx = rotation.X, Ry = rotation.Y, Rz = rotation.Z, Closed = true, FirstColor = colorFirst, SecondColor = colorSecond, MaxFuel = vehCon.MaxFuel, Fuel = (int)Math.Floor((double)vehCon.MaxFuel / 2), Livery = 0, Extras = "", FuelMultiplier = vehCon.Consumption, Health = 1000.0f, Blocked = false, BlockValue = 0, Modifications = "", Mileage = 0.0, MappedExtras = new Dictionary <int, bool>() }; using (Database.Database db = new Database.Database()) { db.Vehicles.Add(veh); db.SaveChanges(); Log.ConsoleLog("VEHICLE", $"Utworzono pojazd \"{veh.Name}\" (UID: {veh.Id}) [{createdBy}]", LogType.Debug); VehiclesList.Add(veh.Id, veh); SpawnVehicle(veh.Id); return(veh); } }
/// <summary> /// Ładuje dane narkotyków z bazy danych. /// </summary> public static void Load() { using (Database.Database db = new Database.Database()) { double startTime = Global.GetTimestampMs(); foreach (DrugEffect entry in db.DrugEffects.ToList()) { DrugEffects.Add(entry.Id, entry); } Log.ConsoleLog("DRUGS", $"Załadowano efekty narkotykow ({DrugEffects.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Ładuje wszystkie obiekty z bazy danych. /// </summary> public static void LoadObjects() { using (Database.Database db = new Database.Database()) { double startTime = Global.GetTimestampMs(); foreach (Object entry in db.Objects.ToList()) { entry.Create(); ObjectsList.Add(entry.Id, entry); } Log.ConsoleLog("OBJECTS", $"Załadowano obiekty ({ObjectsList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Ładuje mieszkania z bazy danych. /// </summary> public static void LoadHouses() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { foreach (House entry in db.Houses.ToList()) { entry.LoadInteriorData(); HousesList.Add(entry.Id, entry); } } Log.ConsoleLog("HOUSES", $"Załadowano mieszkania ({HousesList.Count}) | {Global.GetTimestampMs() - startTime}ms"); }
/// <summary> /// Usuwa wszystkie synchronizowane dane dla danego gracza. /// </summary> /// <param name="player"></param> public static void ResetPlayerData(Client player) { if (!PlayersData.ContainsKey(player.Value)) { return; } PlayersData.Remove(player.Value); foreach (Client entry in NAPI.Pools.GetAllPlayers()) { NAPI.ClientEvent.TriggerClientEvent(entry, "client.syncmanager.resetplayerdata", player.Value); } Log.ConsoleLog("SYNC", $"Zresetowano dla gracza {Player.GetPlayerDebugName(player)}", LogType.Debug); }
public static void LoadCorners() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <Corner> loaded = db.Corners.ToList(); foreach (var entry in loaded) { CornerList.Add(entry.Id, entry); } Log.ConsoleLog("CORNERS", $"Załadowano cornery ({CornerList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Ładuje wszystkie animacje z bazy danych. /// </summary> public static void LoadAnimations() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <Animation> animations = db.Animations.ToList(); foreach (Animation entry in animations) { AnimationsList.Add(entry.AnimationCommand, entry); } Log.ConsoleLog("ANIMATIONS", $"Załadowano animacje ({AnimationsList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Laduje interiory z bazy danych do pamięci. /// </summary> public static void LoadInteriors() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <Interior> interiors = db.Interiors.ToList(); foreach (Interior entry in interiors) { InteriorsList.Add(entry.Id, entry); } Log.ConsoleLog("INTERIORS", $"Załadowano interiory ({InteriorsList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
public static void OnSocketGotData(string receivedData) { try { SocketData sData = NAPI.Util.FromJson <SocketData>(receivedData); Functions choosedFunction = (Functions)Command.GetNumberFromString(sData.Func); if (choosedFunction == Functions.ReloadGroup) { int errno = Groups.Library.ReloadGroup(Command.GetNumberFromString(sData.Data)); if (errno == 0) { Log.ConsoleLog("SOCKET", $"Przeladowano zdalnie grupe o Id {sData.Data}."); } else { Log.ConsoleLog("SOCKET", $"Wystąpił blad w trakcie przeladowywania danych grupy o Id {sData.Data} (errno: {errno}).", LogType.Error); } } else if (choosedFunction == Functions.KickPlayer) { int charId = Command.GetNumberFromString(sData.Data); if (charId == Command.InvalidNumber) { return; } Character charData = Account.GetPlayerData(charId); if (charData == null) { return; } // TODO kick. Log.ConsoleLog("SOCKET", $"Wyrzucono gracza {Player.GetPlayerDebugName(charData)} z serwera."); } } catch (Exception e) { Log.ConsoleLog("SOCKET", $"Wystapil problem w momencie konwersji stringa do jsona. Dane: |{receivedData}| Error: {e.Message}", LogType.Error); } }
/// <summary> /// Usuwa dane gracza /// </summary> /// <param name="player"></param> public static void RemovePlayerData(Client player) { Character charData = GetPlayerData(player); if (charData == null) { return; } Log.ConsoleLog("ACCOUNT", $"Gracz {Player.GetPlayerDebugName(charData)} wyszedl. Usunięto PlayerData.", LogType.Debug); charData.InGame = false; charData.LastLogin = Global.GetTimestamp(); charData.Save(); CharactersList.Remove(player.Value); }
/// <summary> /// Usuwa istniejącą ofertę. /// </summary> /// <param name="offerId"></param> /// <param name="withMessage"></param> /// <param name="reason"></param> /// <param name="cancelOffer"></param> public static void DestroyOffer(int offerId, bool withMessage = true, string reason = "Wystąpił problem w trakcie realizowania oferty.", bool cancelOffer = false) { Offer offerData = GetOfferData(offerId); if (offerData == null) { return; } if (withMessage) { if (!offerData.SystemOffer && offerData.Player != null && NAPI.Entity.DoesEntityExist(offerData.Player)) { NAPI.ClientEvent.TriggerClientEvent(offerData.Player, "client.offers.hideOffer"); if (cancelOffer) { Ui.ShowInfo(offerData.Player, reason); } else { Ui.ShowError(offerData.Player, reason); } } if (NAPI.Entity.DoesEntityExist(offerData.Target)) { NAPI.ClientEvent.TriggerClientEvent(offerData.Target, "client.offers.hideOffer"); if (cancelOffer) { Ui.ShowInfo(offerData.Target, reason); } else { Ui.ShowError(offerData.Target, reason); } } } Log.ConsoleLog("OFFERS", $"Oferta o Id {offerData.Id} zostala usunieta.", LogType.Debug); OffersList.Remove(offerData.Id); }
/// <summary> /// Laduje drzwi interiorów z bazy danych do pamięci. /// </summary> public static void LoadInteriorsDoors() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <InteriorDoor> doors = db.InteriorDoors.ToList(); foreach (InteriorDoor entry in doors) { Interior interiorData = GetInteriorData(entry.ParentId); if (interiorData == null) { db.InteriorDoors.Remove(entry); continue; } entry.MarkerOut = NAPI.Marker.CreateMarker(20, new Vector3(entry.OutX, entry.OutY, entry.OutZ + 1), new Vector3(), new Vector3(), 0.5f, new Color(255, 255, 255, 255), true, (uint)entry.OutDim); entry.MarkerOut.Transparency = 255; if ((int)Math.Floor(entry.InX) != 0) { entry.MarkerIn = NAPI.Marker.CreateMarker(20, new Vector3(entry.InX, entry.InY, entry.InZ + 1), new Vector3(), new Vector3(), 0.5f, new Color(255, 255, 255, 255), true, (uint)entry.InDim); entry.MarkerIn.Transparency = 255; } if (entry.Blip > 0) { entry.BlipHandle = NAPI.Blip.CreateBlip(entry.Blip, new Vector3(entry.OutX, entry.OutY, entry.OutZ), 1.0f, 3, entry.Name, 255, 999999.0f, true, 0, (uint)entry.OutDim); } InteriorDoorsList.Add(entry.Id, entry); } Log.ConsoleLog("INTERIORS-DOORS", $"Załadowano drzwi interiorów ({InteriorDoorsList.Count}) | " + $"{Global.GetTimestampMs() - startTime}ms"); } }
/// <summary> /// Usuwa synchronizowane dane dla danego gracza. /// </summary> /// <param name="player"></param> /// <param name="dataName"></param> public static void DeletePlayerData(Client player, string dataName) { if (!PlayersData.ContainsKey(player.Value)) { return; } if (!PlayersData[player.Value].ContainsKey(dataName)) { return; } PlayersData[player.Value].Remove(dataName); foreach (Client entry in NAPI.Pools.GetAllPlayers()) { NAPI.ClientEvent.TriggerClientEvent(entry, "client.syncmanager.deleteplayerdata", player.Value, dataName); } Log.ConsoleLog("SYNC", $"Usunięto dla gracza {Player.GetPlayerDebugName(player)} [dataName: {dataName}]", LogType.Debug); }
/// <summary> /// Ładuje blipy z bazy danych do pamięci /// </summary> public static void LoadBlips() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { List <Blip> blipsList = db.Blips.ToList(); foreach (Blip entry in blipsList) { entry.BlipHandle = NAPI.Blip.CreateBlip(entry.SpriteId, new Vector3(entry.X, entry.Y, entry.Z), entry.Scale, (byte)entry.ColorId, entry.Name, (byte)entry.Alpha, 999999.0f, true, 0, (uint)entry.Dimension); BlipsList.Add(entry.Id, entry); } } Log.ConsoleLog("BLIPS", $"Załadowano blipy ({BlipsList.Count}) | {Global.GetTimestampMs() - startTime}ms"); }
/// <summary> /// Ładuje sklepy z bazy danych. /// </summary> public static void LoadShops() { double startTime = Global.GetTimestampMs(); using (Database.Database db = new Database.Database()) { foreach (Shop entry in db.Shops.ToList()) { entry.ShopMarker = NAPI.Marker.CreateMarker(1, new Vector3(entry.X, entry.Y, entry.Z), new Vector3(), new Vector3(), 0.5f, 255, 255, 255, false, 0); /*entry.ShopBlip = * NAPI.Blip.CreateBlip(500, new Vector3(), 1.0f, 4, entry.Name, 255, 50.0f, true, 0, 0);*/ ShopsList.Add(entry.Id, entry); } Log.ConsoleLog("SHOPS", $"Załadowano sklepy ({ShopsList.Count}) | {Global.GetTimestampMs() - startTime}ms"); } }
/// <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 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"); } }
/// <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 static void StartSocket() { _lsvrpSocket = new LsvrpSocket(); _lsvrpSocket.Server(SocketIp, SocketPort); Log.ConsoleLog("SOCKET", $"Socket UDP został uruchomiony na adresie {SocketIp}:{SocketPort}"); }
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); } }