예제 #1
0
        private bool Transfer(IMyInventory source, IMyInventory destination, string itemType, VRage.MyFixedPoint amount)
        {
            //Moves given amount of given type from source to destination
            int ixSource;
            List <MyInventoryItem> sourceItems = GetInventoryItems(source);

            ixSource = IndexOfFirstTradeItem(source, itemType, false);
            if (ixSource < 0)
            {
                Display(Info.MsgErrTransferNoItemsInSource, itemType, source.ToString());
                return(false);
            }

            MyInventoryItem item = sourceItems[ixSource];

            if (amount > item.Amount)
            {
                Display(Info.MsgErrTransferInsufficientItemsInSource, source.ToString(), item.Amount + "/" + amount.ToString() + " " + itemType);
                return(false);
            }

            if (!source.TransferItemTo(destination, ixSource, null, true, amount))
            {
                Display(Info.MsgErrTransferFailed, amount.ToString() + " " + itemType, source.ToString() + " -> " + destination.ToString());
                return(false);
            }

            return(true);
        }
예제 #2
0
    public void doWork()
    {
        VRage.MyFixedPoint newAmmo = turrets.Items().OfType("NATO_25x184mm").Count();
        newAmmo = newAmmo + turrets.Items().OfType("Missile200mm").Count();

        if (newAmmo < ammo)
        {
            string timestamp = DateTime.UtcNow.AddHours(3).ToString("dd.MM.yyyy HH:mm:ss");
            log.SetText("[" + timestamp + "] Attack detected, fired " + (ammo - newAmmo) + " ammo; Remaining: " + newAmmo + "\n" + log.screen.GetPublicText());
            beacon.SetName("!!! Attack detected at " + timestamp + " !!!");
        }

        ammo = newAmmo;
        storage.setStorage(ammo.ToString());
    }
예제 #3
0
        private bool Sell(string requiredType)
        {
            //Player sells to the trader
            //Sells the first item in the "Entry" cargo container that matches
            //the given type. Use "Any" to match any type (that has a price).

            int ixTradeItem;
            int ixPaymentItem;
            List <MyInventoryItem> entryItems;
            List <MyInventoryItem> vaultItems;

            //Find the item the player is selling
            ixTradeItem = IndexOfFirstTradeItem(Info.InventoryEntry, requiredType, true);
            if (ixTradeItem < 0)
            {
                Display(Info.MsgErrNoTradeItems);
                return(false);
            }

            //Fetch the item the player sells
            entryItems = GetInventoryItems(Info.InventoryEntry);
            MyInventoryItem tradeItem     = entryItems[ixTradeItem];
            string          tradeItemType = GetItemType(tradeItem);

            VRage.MyFixedPoint tradeItemAmount = tradeItem.Amount;
            Display(Info.MsgYouOffer + ": " + tradeItemAmount.ToString() + " " + tradeItemType);

            //Calculate the payment
            float price = Info.PriceLookup[tradeItemType] * Info.RateTraderPurchase;

            VRage.MyFixedPoint paymentItemAmount = tradeItemAmount * price;
            Display(Info.MsgWePay + ": " + paymentItemAmount.ToString() + " " + Info.ItemTypeCurrency);

            //Find the payment item in the vault
            ixPaymentItem = IndexOfFirstTradeItem(Info.InventoryVault, Info.ItemTypeCurrency, false);
            if (ixPaymentItem < 0)
            {
                Display(Info.MsgErrInsufficientFunds + "0 " + Info.ItemTypeCurrency + ".");
                return(false);
            }

            //Fetch the payment item in the vault
            vaultItems = GetInventoryItems(Info.InventoryVault);
            MyInventoryItem paymentItem     = vaultItems[ixPaymentItem];
            string          paymentItemType = GetItemType(paymentItem);

            VRage.MyFixedPoint maxPaymentItemAmount = paymentItem.Amount;

            if (paymentItemAmount > maxPaymentItemAmount)
            {
                Display(Info.MsgErrInsufficientFunds + maxPaymentItemAmount.ToString() + " " + paymentItemType + ".");
                return(false);
            }

            //Move the player's item to vault
            if (!Transfer(Info.InventoryEntry, Info.InventoryVault, tradeItemType, tradeItemAmount))
            {
                Display(Info.MsgErrTechnicalDifficulties + " " + Info.MsgErrItemsNotReceived);
                return(false);
            }

            //Pay the player
            if (!Transfer(Info.InventoryVault, Info.InventoryEntry, paymentItemType, paymentItemAmount))
            {
                //Payment failed so return the trade item back to the player, if this fails then too bad...
                Display(Info.MsgErrTechnicalDifficulties + " " + Info.MsgErrPaymentNotSent);
                Transfer(Info.InventoryVault, Info.InventoryEntry, tradeItemType, tradeItemAmount);
                return(false);
            }
            Display(Info.MsgCollectYourPayment);
            Display(Info.MsgTransactionEnds);

            return(true);
        }
예제 #4
0
        //=======================================================================
        // TRADING METHODS

        private bool Buy(string requiredType)
        {
            //Player buys from the trader
            //Buys the first item in the vault cargo container that matches
            //the given type. The type "Any" can't be used.

            int ixTradeItem;
            int ixPaymentItem;
            List <MyInventoryItem> entryItems;
            List <MyInventoryItem> vaultItems;

            if (Info.ModeTarget == "Any")
            {
                Display(Info.MsgErrPurchaseNotSpecified);
                return(false);
            }

            //Find the currency item the player is offering
            ixPaymentItem = IndexOfFirstTradeItem(Info.InventoryEntry, Info.ItemTypeCurrency, false);
            if (ixPaymentItem < 0)
            {
                Display(Info.MsgErrNoFunds + " (" + Info.ItemTypeCurrency + ")");
                return(false);
            }

            //Fetch the currency item the player is offering
            entryItems = GetInventoryItems(Info.InventoryEntry);
            MyInventoryItem paymentItem     = entryItems[ixPaymentItem];
            string          paymentItemType = GetItemType(paymentItem);

            VRage.MyFixedPoint paymentItemAmount = paymentItem.Amount;
            Display(Info.MsgYouOffer + ": " + paymentItemAmount.ToString() + " " + paymentItemType);

            //Calculate the amount the player gets
            string tradeItemType = requiredType;

            VRage.MyFixedPoint tradeItemAmount = paymentItemAmount * (1.0F / Info.PriceLookup[tradeItemType]);
            if (!Info.IsWeighable.Contains(tradeItemType))
            {
                //If purchased item can't be divided adjust the amount to whole units and recalc the price
                tradeItemAmount   = VRage.MyFixedPoint.Floor(tradeItemAmount);
                paymentItemAmount = tradeItemAmount * Info.PriceLookup[tradeItemType];
            }
            Display(Info.MsgThatBuys + ": " + tradeItemAmount.ToString() + " " + tradeItemType);

            //Find the item the player is buying
            ixTradeItem = IndexOfFirstTradeItem(Info.InventoryVault, tradeItemType, false);
            if (ixTradeItem < 0)
            {
                Display(Info.MsgErrInsufficientItems + "0 " + requiredType + ".");
                return(false);
            }

            //Fetch the item the player purchased
            vaultItems = GetInventoryItems(Info.InventoryVault);
            MyInventoryItem tradeItem = vaultItems[ixTradeItem];

            tradeItemType = GetItemType(tradeItem);
            VRage.MyFixedPoint maxTradeItemAmount = tradeItem.Amount;

            if (tradeItemAmount > maxTradeItemAmount)
            {
                Display(Info.MsgErrInsufficientItems + maxTradeItemAmount.ToString() + " " + tradeItemType + ".");
                return(false);
            }

            //Move the payment to the vault
            if (!Transfer(Info.InventoryEntry, Info.InventoryVault, paymentItemType, paymentItemAmount))
            {
                Display(Info.MsgErrTechnicalDifficulties + " " + Info.MsgErrPaymentNotReceived);
                return(false);
            }
            Display(Info.MsgPayment + ": " + paymentItemAmount.ToString() + " " + paymentItemType);

            //Move the item to the "Entry" container
            if (!Transfer(Info.InventoryVault, Info.InventoryEntry, tradeItemType, tradeItemAmount))
            {
                //Moving the purchase failed so return the payment back to the player, if this fails then too bad...
                Display(Info.MsgErrTechnicalDifficulties + " " + Info.MsgErrItemsNotSent);
                Transfer(Info.InventoryVault, Info.InventoryEntry, paymentItemType, paymentItemAmount);
                return(false);
            }
            Display(Info.MsgCollectYourItems);
            Display(Info.MsgTransactionEnds);

            return(true);
        }