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); }
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()); }
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); }
//======================================================================= // 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); }