Пример #1
0
        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        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
        }
Пример #4
0
        /// <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");
            }
        }
Пример #5
0
        /// <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.");
        }
Пример #6
0
        /// <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);
            }
        }
Пример #7
0
        /// <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");
            }
        }
Пример #8
0
        /// <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");
            }
        }
Пример #9
0
        /// <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");
        }
Пример #10
0
        /// <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);
        }
Пример #11
0
        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");
            }
        }
Пример #12
0
        /// <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");
            }
        }
Пример #13
0
        /// <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");
            }
        }
Пример #14
0
        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);
            }
        }
Пример #15
0
        /// <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);
        }
Пример #16
0
        /// <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);
        }
Пример #17
0
        /// <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");
            }
        }
Пример #18
0
        /// <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);
        }
Пример #19
0
        /// <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");
        }
Пример #20
0
        /// <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");
            }
        }
Пример #21
0
        /// <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);
        }
Пример #22
0
        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");
            }
        }
Пример #23
0
        /// <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);
            }
        }
Пример #24
0
 public static void StartSocket()
 {
     _lsvrpSocket = new LsvrpSocket();
     _lsvrpSocket.Server(SocketIp, SocketPort);
     Log.ConsoleLog("SOCKET", $"Socket UDP został uruchomiony na adresie {SocketIp}:{SocketPort}");
 }
Пример #25
0
        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}");
            }
        }
Пример #26
0
        /// <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...");
            }
        }
Пример #27
0
        /// <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);
            }
        }