示例#1
0
        public static void do_auction(CharacterInstance ch, string argument, IAuctionManager auctionManager = null)
        {
            if (ch.IsNpc())
            {
                return;
            }

            ch.SetColor(ATTypes.AT_LBLUE);
            if (CheckFunctions.CheckIfTrue(ch, ch.Level < GameConstants.GetSystemValue <int>("MinimumAuctionLevel"),
                                           "You need to gain more experience to use the auction..."))
            {
                return;
            }

            // TODO: Do we really want time restrictions on auctions?

            var firstArg = argument.FirstWord();

            if (firstArg.IsNullOrEmpty())
            {
                ReviewAuction(ch, auctionManager);
            }
            if (ch.IsImmortal() && firstArg.EqualsIgnoreCase("stop"))
            {
                StopAuction(ch, "Sale of {0} has been stopped by an Immortal.", auctionManager);
            }
            if (firstArg.EqualsIgnoreCase("bid"))
            {
                PlaceBid(ch, argument, auctionManager);
            }
            PlaceItemForAuction(ch, argument, auctionManager);
        }
示例#2
0
        public static void StopAuction(CharacterInstance ch, string argument, IAuctionManager auctionManager)
        {
            if (CheckFunctions.CheckIfNullObject(ch, (auctionManager ?? AuctionManager.Instance).Auction, "There is no auction to stop."))
            {
                return;
            }

            ch.SetColor(ATTypes.AT_LBLUE);

            var auction = (auctionManager ?? AuctionManager.Instance).Auction;

            ChatManager.talk_auction(string.Format(argument, auction.ItemForSale.ShortDescription));
            auction.ItemForSale.AddTo(auction.Seller);

            if (GameManager.Instance.SystemData.SaveFlags.IsSet(AutoSaveFlags.Auction))
            {
                save.save_char_obj(auction.Seller);
            }

            if (auction.Buyer != null && auction.Buyer != auction.Seller)
            {
                auction.Buyer.CurrentCoin += auction.BidAmount;
                auction.Buyer.SendTo("Your money has been returned.");
            }

            (auctionManager ?? AuctionManager.Instance).StopAuction();
        }
示例#3
0
 public OrderGenerator(IAuctionManager auctionManager)
 {
     _auctionManager = auctionManager;
 }
示例#4
0
        private static void PlaceItemForAuction(CharacterInstance ch, string argument, IAuctionManager auctionManager)
        {
            var firstArg = argument.FirstWord();
            var obj      = ch.GetCarriedObject(firstArg);

            if (CheckFunctions.CheckIfNullObject(ch, obj, "You aren't carrying that."))
            {
                return;
            }
            if (CheckFunctions.CheckIfTrue(ch, obj.Timer > 0, "You can't auction objects that are decaying."))
            {
                return;
            }
            if (CheckFunctions.CheckIfSet(ch, obj.ExtraFlags, (int)ItemExtraFlags.Personal,
                                          "Personal items may not be auctioned."))
            {
                return;
            }

            if (CheckFunctions.CheckIfTrue(ch,
                                           (auctionManager ?? AuctionManager.Instance).Repository.History.Any(x => x.ItemForSale == obj.ObjectIndex.ID),
                                           "Such an item has been auctioned recently, try again later."))
            {
                return;
            }

            var secondArg = argument.SecondWord();

            if (CheckFunctions.CheckIfEmptyString(ch, secondArg, "Auction it for what?"))
            {
                return;
            }
            if (CheckFunctions.CheckIfTrue(ch, !secondArg.IsNumber(),
                                           "You must input a number at which to start the auction."))
            {
                return;
            }

            var startingBid = secondArg.ToInt32();

            if (CheckFunctions.CheckIfTrue(ch, startingBid <= 0, "You can't auction something for nothing!"))
            {
                return;
            }

            if ((auctionManager ?? AuctionManager.Instance).Auction != null)
            {
                comm.act(ATTypes.AT_TELL, "Try again later - $p is being auctioned right now!", ch,
                         (auctionManager ?? AuctionManager.Instance).Auction.ItemForSale, null, ToTypes.Character);
                if (!ch.IsImmortal())
                {
                    Macros.WAIT_STATE(ch, GameConstants.GetSystemValue <int>("PulseViolence"));
                }
                return;
            }

            if (!obj.HasAttribute <AuctionableAttribute>())
            {
                comm.act(ATTypes.AT_TELL, "You cannot auction $Ts.", ch, null, obj.GetItemTypeName(), ToTypes.Character);
                return;
            }

            obj.Split();
            obj.RemoveFrom();
            if (GameManager.Instance.SystemData.SaveFlags.IsSet(AutoSaveFlags.Auction))
            {
                save.save_char_obj(ch);
            }

            (auctionManager ?? AuctionManager.Instance).StartAuction(ch, obj, startingBid);
            ChatManager.talk_auction($"A new item is being auctioned: {obj.ShortDescription} at {startingBid} coin.");
        }
示例#5
0
        private static void ReviewAuction(CharacterInstance ch, IAuctionManager auctionManager)
        {
            if (CheckFunctions.CheckIfNullObject(ch, (auctionManager ?? AuctionManager.Instance).Auction,
                                                 "There is nothing being auctioned right now.  What would you like to auction?"))
            {
                return;
            }

            ch.SetColor(ATTypes.AT_BLUE);
            ch.SendTo("Auctions:");

            var auction = (auctionManager ?? AuctionManager.Instance).Auction;

            if (auction.BidAmount > 0)
            {
                ch.Printf("Current bid on this item is %s coin.", auction.BidAmount);
            }
            else
            {
                ch.SendTo("No bids on this item have been received.");
            }

            ch.SetColor(ATTypes.AT_LBLUE);
            ch.Printf("Object '%s' is %s, special properties: %s\r\nIts weight is %d, value is %d, and level is %d.",
                      auction.ItemForSale.Name, auction.ItemForSale.Name.AOrAn(), auction.ItemForSale.ExtraFlags.ToString(),
                      auction.ItemForSale.Weight, auction.ItemForSale.Cost, auction.ItemForSale.Level);

            if (auction.ItemForSale.WearLocation != WearLocations.Light)
            {
                ch.Printf("Item's wear location: %s", auction.ItemForSale.WearLocation);
            }

            ch.SetColor(ATTypes.AT_BLUE);

            if (DisplayTable.ContainsKey(auction.ItemForSale.ItemType))
            {
                DisplayTable[auction.ItemForSale.ItemType].Invoke(ch, auction.ItemForSale);
            }

            foreach (var af in auction.ItemForSale.ObjectIndex.Affects)
            {
                handler.showaffect(ch, af);
            }

            foreach (var af in auction.ItemForSale.Affects)
            {
                handler.showaffect(ch, af);
            }

            if ((auction.ItemForSale.ItemType == ItemTypes.Container ||
                 auction.ItemForSale.ItemType == ItemTypes.KeyRing ||
                 auction.ItemForSale.ItemType == ItemTypes.Quiver) &&
                auction.ItemForSale.Contents.Any())
            {
                ch.SetColor(ATTypes.AT_OBJECT);
                ch.SendTo("Contents:");
                act_info.show_list_to_char(auction.ItemForSale.Contents.ToList(), (PlayerInstance)ch, true, false);
            }

            if (ch.IsImmortal())
            {
                ch.Printf("Seller: %s.  Bidder: %s.  Round: %d,",
                          auction.Seller.Name, auction.Buyer.Name, auction.GoingCounter + 1);
                ch.Printf("Time left in round: %d.", auction.PulseFrequency);
            }
        }
示例#6
0
        private static void PlaceBid(CharacterInstance ch, string argument, IAuctionManager auctionManager)
        {
            if (CheckFunctions.CheckIfNullObject(ch, (auctionManager ?? AuctionManager.Instance).Auction,
                                                 "There isn't anything being auctioned right now."))
            {
                return;
            }

            var auction = (auctionManager ?? AuctionManager.Instance).Auction;

            if (CheckFunctions.CheckIfTrue(ch, ch.Level < auction.ItemForSale.Level,
                                           "This object's level is too high for your use."))
            {
                return;
            }
            if (CheckFunctions.CheckIfEquivalent(ch, ch, auction.Seller, "You can't bid on your own item!"))
            {
                return;
            }

            var secondArg = argument.SecondWord();

            if (CheckFunctions.CheckIfEmptyString(ch, secondArg, "Bid how much?"))
            {
                return;
            }

            var bid = Program.parsebet(auction.BidAmount, secondArg);

            if (CheckFunctions.CheckIfTrue(ch, bid < auction.StartingBid,
                                           "You must place a bid that is higher than the starting bet."))
            {
                return;
            }
            if (CheckFunctions.CheckIfTrue(ch, bid < auction.BidAmount + 10000,
                                           "You must bid at least 10,000 coins over the current bid."))
            {
                return;
            }
            if (CheckFunctions.CheckIfTrue(ch, bid < ch.CurrentCoin, "You don't have that much money!"))
            {
                return;
            }
            if (CheckFunctions.CheckIfTrue(ch, bid > GameConstants.GetSystemValue <int>("MaximumAuctionBid"),
                                           $"You can't bid over {GameConstants.GetSystemValue<int>("MaximumAuctionBid")} coins."))
            {
                return;
            }

            var thirdArg = argument.ThirdWord();

            if (CheckFunctions.CheckIfTrue(ch, thirdArg.IsNullOrEmpty() || auction.ItemForSale.Name.IsAnyEqual(thirdArg),
                                           "That item is not being auctioned right now."))
            {
                return;
            }

            if (auction.Buyer != null && auction.Buyer != auction.Seller)
            {
                auction.Buyer.CurrentCoin += auction.BidAmount;
            }

            ch.CurrentCoin -= bid;
            if (GameManager.Instance.SystemData.SaveFlags.IsSet(AutoSaveFlags.Auction))
            {
                save.save_char_obj(ch);
            }

            (auctionManager ?? AuctionManager.Instance).PlaceBid(ch, bid);

            ChatManager.talk_auction($"A bid of {bid} coin has been received on {auction.ItemForSale.ShortDescription}.");
        }
示例#7
0
 public AuctionHub(IAuctionManager auctionManager, UserManager userManager)
 {
     _auctionManager = auctionManager;
     _userManager    = userManager;
 }
示例#8
0
 public AuctionAppService(IAuctionManager auctionManager)
 {
     _auctionManager = auctionManager;
 }
        public static void Extract(this ObjectInstance obj, IAuctionManager auctionManager = null)
        {
            if (handler.obj_extracted(obj))
            {
                throw new ObjectAlreadyExtractedException("Object {0}", obj.ObjectIndex.ID);
            }

            if (obj.ItemType == ItemTypes.Portal)
            {
                update.remove_portal(obj);
            }

            if (AuctionManager.Instance.Auction.ItemForSale == obj)
            {
                SmaugCS.Commands.Auction.StopAuction((auctionManager ?? AuctionManager.Instance).Auction.Seller,
                                                     "Sale of {0} has been stopped by a system action.", auctionManager);
            }

            if (obj.CarriedBy != null)
            {
                obj.RemoveFrom();
            }
            else if (obj.InRoom != null)
            {
                obj.InRoom.RemoveFrom(obj);
            }
            else
            {
                obj.InObject.RemoveFrom(obj);
            }

            var objContent = obj.Contents.Last();

            objContent?.Extract();

            obj.Affects.Clear();
            obj.ExtraDescriptions.Clear();

            //trworld_obj_check(obj);

            foreach (var relation in db.RELATIONS
                     .Where(relation => relation.Types == RelationTypes.OSet_On))
            {
                if (obj == (ObjectInstance)relation.Subject)
                {
                    relation.Actor.CastAs <CharacterInstance>().DestinationBuffer = null;
                }
                else
                {
                    continue;
                }
                db.RELATIONS.Remove(relation);
            }

            RepositoryManager.Instance.OBJECTS.CastAs <Repository <long, ObjectInstance> >().Delete(obj.ID);

            handler.queue_extracted_obj(obj);

            obj.ObjectIndex.Count -= obj.Count;

            if (obj != handler.CurrentObject)
            {
                return;
            }

            handler.CurrentObjectExtracted = true;
            if (handler.GlobalObjectCode == ReturnTypes.None)
            {
                handler.GlobalObjectCode = ReturnTypes.ObjectExtracted;
            }
        }
        public static ObjectInstance GroupWith(this ObjectInstance obj1, ObjectInstance obj2, IAuctionManager auctionManager = null)
        {
            if (obj1 == null || obj2 == null)
            {
                return(null);
            }
            if (obj1 == obj2)
            {
                return(obj1);
            }

            if (obj1.ObjectIndex == obj2.ObjectIndex &&
                obj1.Name.EqualsIgnoreCase(obj2.Name) &&
                obj1.ShortDescription.EqualsIgnoreCase(obj2.ShortDescription) &&
                obj1.Description.EqualsIgnoreCase(obj2.Description) &&
                obj1.Owner.EqualsIgnoreCase(obj2.Owner) &&
                obj1.ItemType == obj2.ItemType &&
                obj1.ExtraFlags == obj2.ExtraFlags &&
                obj1.MagicFlags == obj2.MagicFlags &&
                obj1.WearFlags == obj2.WearFlags &&
                obj1.WearLocation == obj2.WearLocation &&
                obj1.Weight == obj2.Weight &&
                obj1.Cost == obj2.Cost &&
                obj1.Level == obj2.Level &&
                obj1.Timer == obj2.Timer &&
                obj1.Value.ToList()[0] == obj2.Value.ToList()[0] &&
                obj1.Value.ToList()[1] == obj2.Value.ToList()[1] &&
                obj1.Value.ToList()[2] == obj2.Value.ToList()[2] &&
                obj1.Value.ToList()[3] == obj2.Value.ToList()[3] &&
                obj1.Value.ToList()[4] == obj2.Value.ToList()[4] &&
                obj1.Value.ToList()[5] == obj2.Value.ToList()[5] &&
                obj1.ExtraDescriptions.SequenceEqual(obj2.ExtraDescriptions) &&
                obj1.Affects.SequenceEqual(obj2.Affects) &&
                obj1.Contents.SequenceEqual(obj2.Contents) &&
                obj1.Count + obj2.Count > 0)
            {
                obj1.Count             += obj2.Count;
                obj1.ObjectIndex.Count += obj2.Count;
                obj2.Extract(auctionManager ?? AuctionManager.Instance);
                return(obj1);
            }
            return(obj2);
        }