Beispiel #1
0
        /// <summary>
        /// Akceptuje ofertę z wybranym typem płatności.
        /// </summary>
        /// <param name="charData"></param>
        /// <param name="payType"></param>
        public static void AcceptOffer(Character charData, OfferPayType payType)
        {
            if (charData == null)
            {
                return;
            }
            Offer offerData = GetOfferData(charData.PlayerHandle);

            if (offerData == null)
            {
                return;
            }

            if (offerData.Player == charData.PlayerHandle && !offerData.SystemOffer &&
                offerData.Target != offerData.Player)
            {
                Ui.ShowError(charData.PlayerHandle, "Nie możesz zaakceptować oferty za drugiego gracza.");
                return;
            }

            OnOfferAccept(offerData.Id, payType);
        }
Beispiel #2
0
        /// <summary>
        /// Wykonuje się w momencie zaakceptowania oferty.
        /// </summary>
        /// <param name="offerId"></param>
        /// <param name="payType"></param>
        private static void OnOfferAccept(int offerId, OfferPayType payType)
        {
            Offer offerData = GetOfferData(offerId);

            if (offerData == null)
            {
                return;
            }

            if (!offerData.SystemOffer && !NAPI.Entity.DoesEntityExist(offerData.Player) ||
                !NAPI.Entity.DoesEntityExist(offerData.Target))
            {
                offerData.Destroy("Jeden z graczy nie jest zalogowany.");
                return;
            }

            Character charData   = Account.GetPlayerData(offerData.Player);
            Character targetData = Account.GetPlayerData(offerData.Target);

            if (!offerData.SystemOffer && charData == null || targetData == null)
            {
                offerData.Destroy("Jeden z graczy nie jest zalogowany.");
                return;
            }

            if (payType == OfferPayType.Cash && targetData.Cash < offerData.Price)
            {
                offerData.Destroy("Kupujący nie ma odpowiedniej ilości gotówki przy sobie.");
                return;
            }

            if (payType == OfferPayType.Card && targetData.AccountBalance < offerData.Price)
            {
                offerData.Destroy("Kupujący nie ma na koncie bankowym odpowiedniej ilości gotówki.");
                return;
            }

            // Akcje ofert

            if (offerData.Type == OfferType.SellItem)
            {
                if (Global.GetDistanceBetweenPositions(offerData.Player.Position, offerData.Target.Position) > 3.0 ||
                    offerData.Player.Dimension != offerData.Target.Dimension)
                {
                    offerData.Destroy("Zbyt daleko od celu.");
                    return;
                }

                ItemEntity itemData = ItemsManager.Items.FirstOrDefault(t => t.Id == (int)offerData.Data["Id"]);

                if (itemData == null)
                {
                    offerData.Destroy("Przedmiot nie został znaleziony.");
                    return;
                }

                if (itemData.Used)
                {
                    offerData.Destroy("Przedmiot nie może być używany.");
                    return;
                }

                if (offerData.Price == 0 || PayForOffer(charData, targetData, payType, (int)offerData.Price))
                {
                    itemData.SetOwner(OwnerType.Player, targetData.Id);

                    Chat.Library.SendPlayerMeMessage(charData,
                                                     $"podaje przedmiot \"{itemData.Name}\" graczowi {Player.GetPlayerIcName(targetData)}", true);
                    offerData.Success();
                    return;
                }
            }
            else if (offerData.Type == OfferType.Rp)
            {
                if (offerData.Price == 0 || PayForOffer(charData, targetData, payType, (int)offerData.Price))
                {
                    offerData.Success();
                    return;
                }
            }
            else if (offerData.Type == OfferType.RegisterVehicle)
            {
                Vehicle vehData = Vehicles.Library.GetVehicleData((int)offerData.Data["Id"]);
                if (vehData == null)
                {
                    offerData.Destroy("Wystąpił błąd w trakcie pobierania danych pojazdu.");
                    return;
                }

                if (offerData.Price == 0 || PayForOffer(charData, targetData, payType, (int)offerData.Price))
                {
                    vehData.NumberPlate = Vehicles.Library.GeneratePlate();
                    vehData.Save();
                    if (vehData.Spawned && NAPI.Entity.DoesEntityExist(vehData.VehicleHandle))
                    {
                        vehData.VehicleHandle.NumberPlate = vehData.NumberPlate;
                    }
                    // TODO: akcje z botem

                    offerData.Success();
                    return;
                }
            }
            else if (offerData.Type == OfferType.SellCar)
            {
                Vehicle vehData = Vehicles.Library.GetVehicleData((int)offerData.Data["Id"]);
                if (vehData == null)
                {
                    offerData.Destroy("Pojazd nie został odnaleziony.");
                    return;
                }

                if (offerData.Price == 0 || PayForOffer(charData, targetData, payType, (int)offerData.Price))
                {
                    vehData.OwnerType = Vehicles.OwnerType.Player;
                    vehData.Owner     = targetData.Id;
                    vehData.Save();
                    Chat.Library.SendPlayerMeMessage(charData,
                                                     $"podaje klucze do pojazdu graczowi {Player.GetPlayerIcName(targetData)}.", true);

                    offerData.Success();
                    return;
                }
            }
            else if (offerData.Type == OfferType.Heal)
            {
                if (offerData.Price == 0 || PayForOffer(charData, targetData, payType, (int)offerData.Price))
                {
                    targetData.Health = 100;
                    targetData.PlayerHandle.Health = 100;

                    offerData.Success();
                    return;
                }
            }
            else if (offerData.Type == OfferType.PdFine)
            {
                // todo
            }
            else if (offerData.Type == OfferType.Fuel)
            {
                // todo
            }
            else if (offerData.Type == OfferType.GroupGive)
            {
                using (Database.Database db = new Database.Database())
                {
                    // todo
                }
            }
            else if (offerData.Type == OfferType.BincoCloth)
            {
                if (offerData.Price == 0 || PayForOffer(null, targetData, payType, (int)offerData.Price))
                {
                    using (Database.Database db = new Database.Database())
                    {
                        db.ClothSets.Add((ClothSet)offerData.Data["clothSet"]);
                        db.SaveChanges();

                        Player.SendFormattedChatMessage(targetData.PlayerHandle,
                                                        "Ubranie zostało zapisane. Możesz je zmienić używając komendy /przebierz.",
                                                        Constants.ColorPictonBlue);

                        offerData.Success();
                    }
                }
            }
            else if (offerData.Type == OfferType.GasStation)
            {
                Vehicle vehData = Vehicles.Library.GetVehicleData((GTANetworkAPI.Vehicle)offerData.Data["vehicle"]);
                if (vehData != null)
                {
                    if (offerData.Price == 0 || PayForOffer(null, targetData, payType, (int)offerData.Price))
                    {
                        vehData.Fuel += Command.GetNumberFromString(offerData.Data["fuel"].ToString());
                        vehData.Save();

                        Chat.Library.SendPlayerMeMessage(targetData,
                                                         $"wkłada wąż do baku i tankuje auto \"{vehData.Name}\".", true);

                        offerData.Success();
                    }
                }
            }
            else if (offerData.Type == OfferType.Repair)
            {
                Vehicle vehData = (Vehicle)offerData.Data["vehData"];
                if (vehData != null)
                {
                    if (charData != null && Progress.Library.DoesPlayerHasActiveProgress(charData) ||
                        targetData != null && Progress.Library.DoesPlayerHasActiveProgress(targetData))
                    {
                        offerData.Destroy("Jeden z graczy posiada już aktywne zadanie.");
                        return;
                    }

                    Dictionary <string, object> data = new Dictionary <string, object>
                    {
                        { "veh", vehData },
                        { "price", offerData.Price },
                        { "type", payType }
                    };
                    Progress.Library.CreateProgress("Naprawa pojazdu", targetData, charData, ProgressType.FixVehicle,
                                                    60, data);
                    offerData.Success(true);
                }
            }
            else if (offerData.Type == OfferType.TattooCreate)
            {
                if (charData != null && Progress.Library.DoesPlayerHasActiveProgress(charData) ||
                    targetData != null && Progress.Library.DoesPlayerHasActiveProgress(targetData))
                {
                    offerData.Destroy("Jeden z graczy posiada już aktywne zadanie.");
                    return;
                }

                Dictionary <string, object> data = new Dictionary <string, object>
                {
                    { "tattooId", (int)offerData.Data["tattooId"] },
                    { "price", offerData.Price },
                    { "type", payType }
                };
                Progress.Library.CreateProgress("Nakładanie tatuażu", targetData, charData, ProgressType.TattooCreate,
                                                20, data);
                offerData.Success(true);
            }

            offerData.Destroy();
        }
Beispiel #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="charData">Sprzedający</param>
        /// <param name="targetData">Kupujący</param>
        /// <param name="payType"></param>
        /// <param name="price"></param>
        /// <returns></returns>
        public static bool PayForOffer(Character charData, Character targetData, OfferPayType payType, int price)
        {
            if (targetData == null)
            {
                return(false);
            }

            if (charData != null)
            {
                if (payType == OfferPayType.Cash)
                {
                    if (!Money.Library.TakePlayerWalletCash(targetData, price,
                                                            $"Zapłata za ofertę dla gracza {Player.GetPlayerDebugName(charData)}"))
                    {
                        return(false);
                    }
                    if (!Money.Library.GivePlayerWalletCash(charData, price,
                                                            $"Zapłata za ofertę od gracza {Player.GetPlayerDebugName(targetData)}"))
                    {
                        Money.Library.GivePlayerWalletCash(targetData, price, "Zwrot kwoty po nieudanej próbie oferty");
                        return(false);
                    }

                    return(true);
                }

                if (payType == OfferPayType.Card)
                {
                    if (!Money.Library.TakePlayerBankCash(targetData, price,
                                                          $"Zapłata za ofertę dla gracza {Player.GetPlayerDebugName(charData)}"))
                    {
                        return(false);
                    }
                    if (!Money.Library.GivePlayerBankCash(charData, price,
                                                          $"Zapłata za ofertę od gracza {Player.GetPlayerDebugName(targetData)}"))
                    {
                        Money.Library.GivePlayerBankCash(targetData, price, "Zwrot kwoty po nieudanej próbie oferty");
                        return(false);
                    }

                    return(true);
                }
            }
            else
            {
                if (payType == OfferPayType.Cash)
                {
                    if (!Money.Library.TakePlayerWalletCash(targetData, price,
                                                            "Zapłata za ofertę dla systemu"))
                    {
                        return(false);
                    }
                    return(true);
                }

                if (payType == OfferPayType.Card)
                {
                    if (!Money.Library.TakePlayerBankCash(targetData, price,
                                                          "Zapłata za ofertę dla systemu"))
                    {
                        return(false);
                    }
                    return(true);
                }
            }

            return(false);
        }