示例#1
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);
        }
示例#2
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}");
            }
        }
示例#3
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...");
            }
        }
示例#4
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);
            }
        }
示例#5
0
 public static void StartSocket()
 {
     _lsvrpSocket = new LsvrpSocket();
     _lsvrpSocket.Server(SocketIp, SocketPort);
     Log.ConsoleLog("SOCKET", $"Socket UDP został uruchomiony na adresie {SocketIp}:{SocketPort}");
 }
示例#6
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);
            }
        }
示例#7
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");
            }
        }