Ticket #4366: 4366_barterUI_v1-2.patch
File 4366_barterUI_v1-2.patch, 20.6 KB (added by , 7 years ago) |
---|
-
binaries/data/config/default.cfg
diff --git a/binaries/data/config/default.cfg b/binaries/data/config/default.cfg index 47f8528cf..d5f3c8ffe 100644
a b realtime.toggle = "Alt+T" ; Toggle current display of computer time 159 159 session.devcommands.toggle = "Alt+D" ; Toggle developer commands panel 160 160 session.gui.toggle = "Alt+G" ; Toggle visibility of session GUI 161 161 menu.toggle = "F10" ; Toggle in-game menu 162 barter.toggle = "Ctrl+B" ; Toggle in-game barter/trade page 162 163 timeelapsedcounter.toggle = "F12" ; Toggle time elapsed counter 163 164 session.showstatusbars = Tab ; Toggle display of status bars 164 165 session.highlightguarding = PgDn ; Toggle highlight of guarding units -
binaries/data/mods/public/gui/session/hotkeys/misc.xml
diff --git a/binaries/data/mods/public/gui/session/hotkeys/misc.xml b/binaries/data/mods/public/gui/session/hotkeys/misc.xml index 87844d24c..9aac550db 100644
a b 16 16 <action on="Press">toggleMenu();</action> 17 17 </object> 18 18 19 <object hotkey="barter.toggle"> 20 <action on="Press">toggleTrade();</action> 21 </object> 22 19 23 <object hotkey="silhouettes"> 20 24 <action on="Press"> 21 25 var newSetting = !Engine.Renderer_GetSilhouettesEnabled(); -
binaries/data/mods/public/gui/session/menu.js
diff --git a/binaries/data/mods/public/gui/session/menu.js b/binaries/data/mods/public/gui/session/menu.js index 12f2a025e..d0993a21a 100644
a b const STEP = 5; 28 28 // Shown in the trade dialog. 29 29 const g_IdleTraderTextColor = "orange"; 30 30 31 const BARTER_RESOURCE_AMOUNT_TO_SELL = 100; 32 const BARTER_BUNCH_MULTIPLIER = 5; 33 const BARTER_ACTIONS = ["Buy", "Sell"]; 34 var g_BarterSell; 35 31 36 var g_IsMenuOpen = false; 32 37 33 38 var g_IsDiplomacyOpen = false; … … function openTrade() 489 494 490 495 g_IsTradeOpen = true; 491 496 492 var updateButtons = function()497 let updateTradeButtons = function() 493 498 { 494 499 for (let res in button) 495 500 { … … function openTrade() 510 515 511 516 for (let i = 0; i < resCodes.length; ++i) 512 517 { 518 let resCode = resCodes[i]; 519 520 // Barter 521 let barterButton = {}; 522 for (let action of BARTER_ACTIONS) 523 barterButton[action] = Engine.GetGUIObjectByName("barter" + action + "Button[" + i + "]"); 524 525 if (!g_BarterSell) 526 g_BarterSell = g_ResourceData.GetCodes()[0]; 527 528 let resource = getLocalizedResourceName(g_ResourceData.GetNames()[resCode], "withinSentence"); 529 barterButton.Buy.tooltip = sprintf(translate("Buy %(resource)s"), { "resource": resource }); 530 barterButton.Sell.tooltip = sprintf(translate("Sell %(resource)s"), { "resource": resource }); 531 532 barterButton.Sell.onPress = function() { 533 g_BarterSell = resCode; 534 }; 535 536 setPanelObjectPosition(Engine.GetGUIObjectByName("barterResource[" + i + "]"), i, i+1); 537 538 // Trade 513 539 let tradeResource = Engine.GetGUIObjectByName("tradeResource["+i+"]"); 514 540 if (!tradeResource) 515 541 { … … function openTrade() 519 545 520 546 setPanelObjectPosition(tradeResource, i, i+1); 521 547 522 let resCode = resCodes[i];523 proba[resCode] = proba[resCode] || 0;524 525 548 let icon = Engine.GetGUIObjectByName("tradeResourceIcon["+i+"]"); 526 549 icon.sprite = "stretched:session/icons/resources/" + resCode + ".png"; 527 550 … … function openTrade() 535 558 "sel": Engine.GetGUIObjectByName("tradeResourceSelection["+i+"]") 536 559 }; 537 560 561 proba[resCode] = proba[resCode] || 0; 562 538 563 let buttonResource = Engine.GetGUIObjectByName("tradeResourceButton["+i+"]"); 539 564 buttonResource.enabled = controlsPlayer(g_ViewedPlayer); 540 565 buttonResource.onpress = (function(resource){ … … function openTrade() 547 572 Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba}); 548 573 } 549 574 selec = resource; 550 update Buttons();575 updateTradeButtons(); 551 576 }; 552 577 })(resCode); 553 578 … … function openTrade() 557 582 proba[resource] += Math.min(STEP, proba[selec]); 558 583 proba[selec] -= Math.min(STEP, proba[selec]); 559 584 Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba}); 560 update Buttons();585 updateTradeButtons(); 561 586 }; 562 587 })(resCode); 563 588 … … function openTrade() 567 592 proba[selec] += Math.min(STEP, proba[resource]); 568 593 proba[resource] -= Math.min(STEP, proba[resource]); 569 594 Engine.PostNetworkCommand({"type": "set-trading-goods", "tradingGoods": proba}); 570 update Buttons();595 updateTradeButtons(); 571 596 }; 572 597 })(resCode); 573 598 } 574 update Buttons();599 updateTradeButtons(); 575 600 576 601 let traderNumber = Engine.GuiInterfaceCall("GetTraderNumber", g_ViewedPlayer); 577 Engine.GetGUIObjectByName("landTraders").caption = getIdleLandTradersText(traderNumber); 578 Engine.GetGUIObjectByName("shipTraders").caption = getIdleShipTradersText(traderNumber); 602 Engine.GetGUIObjectByName("traders").caption = getIdleLandTradersText(traderNumber) + "\n\n" + getIdleShipTradersText(traderNumber); 579 603 Engine.GetGUIObjectByName("tradeDialogPanel").hidden = false; 580 604 } 581 605 606 function updateBarterButtons() 607 { 608 let resCodes = g_ResourceData.GetCodes(); 609 if (!g_BarterSell) 610 g_BarterSell = resCodes[0]; 611 612 let canBarter = Engine.GuiInterfaceCall("PlayerCanBarter", g_ViewedPlayer); 613 Engine.GetGUIObjectByName("barterNoMarketsMessage").hidden = canBarter; 614 Engine.GetGUIObjectByName("barterResources").hidden = !canBarter; 615 if (!canBarter) 616 return; 617 618 for (let i = 0; i < resCodes.length; ++i) 619 { 620 let resCode = resCodes[i]; 621 let barterButton = {}; 622 let barterIcon = {}; 623 let barterAmount = {}; 624 for (let action of BARTER_ACTIONS) 625 { 626 barterButton[action] = Engine.GetGUIObjectByName("barter" + action + "Button[" + i + "]"); 627 barterIcon[action] = Engine.GetGUIObjectByName("barter" + action + "Icon[" + i + "]"); 628 barterAmount[action] = Engine.GetGUIObjectByName("barter" + action + "Amount[" + i + "]"); 629 } 630 let selectionIcon = Engine.GetGUIObjectByName("barterSellSelection[" + i + "]"); 631 632 let amountToSell = BARTER_RESOURCE_AMOUNT_TO_SELL; 633 if (Engine.HotkeyIsPressed("session.massbarter")) 634 amountToSell *= BARTER_BUNCH_MULTIPLIER; 635 636 let isSelected = resCode == g_BarterSell; 637 let grayscale = isSelected ? "color: 0 0 0 100:grayscale:" : ""; 638 639 // Do we have enough of this resource to sell? 640 let neededRes = {}; 641 neededRes[resCode] = amountToSell; 642 let canSellCurrent = Engine.GuiInterfaceCall("GetNeededResources", { 643 "cost": neededRes, 644 "player": g_ViewedPlayer 645 }) ? "color: 255 0 0 80:" : ""; 646 647 // Let's see if we have enough resources to barter. 648 neededRes = {}; 649 neededRes[g_BarterSell] = amountToSell; 650 let canBuyAny = Engine.GuiInterfaceCall("GetNeededResources", { 651 "cost": neededRes, 652 "player": g_ViewedPlayer 653 }) ? "color: 255 0 0 80:" : ""; 654 655 barterIcon.Sell.sprite = canSellCurrent + "stretched:" + grayscale + "session/icons/resources/" + resCode + ".png"; 656 barterIcon.Buy.sprite = canBuyAny + "stretched:" + grayscale + "session/icons/resources/" + resCode + ".png"; 657 658 barterAmount.Sell.caption = "-" + amountToSell; 659 let prices = Engine.GuiInterfaceCall("GetBarterPrices"); 660 barterAmount.Buy.caption = "+" + Math.round(prices.sell[g_BarterSell] / prices.buy[resCode] * amountToSell); 661 662 barterButton.Buy.onPress = function() { 663 Engine.PostNetworkCommand({ 664 "type": "barter", 665 "sell": g_BarterSell, 666 "buy": resCode, 667 "amount": amountToSell 668 }); 669 }; 670 671 barterButton.Buy.hidden = isSelected; 672 barterButton.Buy.enabled = controlsPlayer(g_ViewedPlayer); 673 barterButton.Sell.hidden = false; 674 selectionIcon.hidden = !isSelected; 675 } 676 }; 677 582 678 function getIdleLandTradersText(traderNumber) 583 679 { 584 680 let active = traderNumber.landTrader.trading; -
binaries/data/mods/public/gui/session/selection_panels.js
diff --git a/binaries/data/mods/public/gui/session/selection_panels.js b/binaries/data/mods/public/gui/session/selection_panels.js index 6bc6e12be..61b8cf03f 100644
a b let g_FormationsInfo = new Map(); 33 33 34 34 let g_SelectionPanels = {}; 35 35 36 let g_BarterSell;37 38 36 g_SelectionPanels.Alert = { 39 37 "getMaxNumberOfItems": function() 40 38 { … … g_SelectionPanels.Barter = { 110 108 }, 111 109 "setupButton": function(data) 112 110 { 111 // If more than four resources, don't display icons here at all 112 if (g_ResourceData.GetCodes().length > this.rowLength) 113 return; 114 113 115 // data.item is the resource name in this case 114 116 let button = {}; 115 117 let icon = {}; 116 118 let amount = {}; 117 for (let a of BARTER_ACTIONS)119 for (let action of BARTER_ACTIONS) 118 120 { 119 button[a ] = Engine.GetGUIObjectByName("unitBarter" + a+ "Button[" + data.i + "]");120 icon[a ] = Engine.GetGUIObjectByName("unitBarter" + a+ "Icon[" + data.i + "]");121 amount[a ] = Engine.GetGUIObjectByName("unitBarter" + a+ "Amount[" + data.i + "]");121 button[action] = Engine.GetGUIObjectByName("unitBarter" + action + "Button[" + data.i + "]"); 122 icon[action] = Engine.GetGUIObjectByName("unitBarter" + action + "Icon[" + data.i + "]"); 123 amount[action] = Engine.GetGUIObjectByName("unitBarter" + action + "Amount[" + data.i + "]"); 122 124 } 123 125 let selectionIcon = Engine.GetGUIObjectByName("unitBarterSellSelection[" + data.i + "]"); 124 126 … … g_SelectionPanels.Barter = { 161 163 let isSelected = data.item == g_BarterSell; 162 164 let grayscale = isSelected ? "color: 0 0 0 100:grayscale:" : ""; 163 165 164 // do we have enough of this resource to sell?166 // Do we have enough of this resource to sell? 165 167 let neededRes = {}; 166 168 neededRes[data.item] = amountToSell; 167 169 let canSellCurrent = Engine.GuiInterfaceCall("GetNeededResources", { 168 170 "cost": neededRes, 169 171 "player": data.player 170 }) ? "color: 255 0 0 80:" : "";172 }) ? "color: 255 0 0 80:" : ""; 171 173 172 174 // Let's see if we have enough resources to barter. 173 175 neededRes = {}; … … g_SelectionPanels.Barter = { 175 177 let canBuyAny = Engine.GuiInterfaceCall("GetNeededResources", { 176 178 "cost": neededRes, 177 179 "player": data.player 178 }) ? "color: 255 0 0 80:" : "";180 }) ? "color: 255 0 0 80:" : ""; 179 181 180 182 icon.Sell.sprite = canSellCurrent + "stretched:" + grayscale + "session/icons/resources/" + data.item + ".png"; 181 183 icon.Buy.sprite = canBuyAny + "stretched:" + grayscale + "session/icons/resources/" + data.item + ".png"; … … g_SelectionPanels.Upgrade = { 1217 1219 */ 1218 1220 let g_PanelsOrder = [ 1219 1221 // LEFT PANE 1220 "Barter", // Must always be visible on markets 1222 "Barter", // Must always be visible on markets, if less than five resources 1221 1223 "Garrison", // More important than Formation, as you want to see the garrisoned units in ships 1222 1224 "Alert", 1223 1225 "Formation", -
binaries/data/mods/public/gui/session/selection_panels_helpers.js
diff --git a/binaries/data/mods/public/gui/session/selection_panels_helpers.js b/binaries/data/mods/public/gui/session/selection_panels_helpers.js index 6b9f507d6..e5b1f0354 100644
a b 1 const BARTER_RESOURCE_AMOUNT_TO_SELL = 100;2 const BARTER_BUNCH_MULTIPLIER = 5;3 const BARTER_ACTIONS = ["Sell", "Buy"];4 1 const GATE_ACTIONS = ["lock", "unlock"]; 5 2 6 3 const UPGRADING_NOT_STARTED = -2; -
binaries/data/mods/public/gui/session/session.js
diff --git a/binaries/data/mods/public/gui/session/session.js b/binaries/data/mods/public/gui/session/session.js index e2b43aae5..469ede741 100644
a b function updateGUIObjects() 768 768 updateBuildingPlacementPreview(); 769 769 updateTimeNotifications(); 770 770 updateIdleWorkerButton(); 771 updateBarterButtons(); 771 772 772 773 if (g_ViewedPlayer > 0) 773 774 { -
binaries/data/mods/public/gui/session/top_panel/button_trade.xml
diff --git a/binaries/data/mods/public/gui/session/top_panel/button_trade.xml b/binaries/data/mods/public/gui/session/top_panel/button_trade.xml index 787c1f760..6f59e92aa 100644
a b 7 7 > 8 8 <!-- TODO make the button less ugly --> 9 9 <object size="0 0 100% 100%" name="tradeButtonImage" type="image" sprite="stretched:session/icons/economics.png" ghost="true"/> 10 <translatableAttribute id="tooltip"> Trade</translatableAttribute>10 <translatableAttribute id="tooltip">Barter & Trade</translatableAttribute> 11 11 <action on="Press"> 12 12 toggleTrade(); 13 13 </action> -
binaries/data/mods/public/gui/session/trade_window.xml
diff --git a/binaries/data/mods/public/gui/session/trade_window.xml b/binaries/data/mods/public/gui/session/trade_window.xml index 537eac505..f4d0d66de 100644
a b 1 1 <?xml version="1.0" encoding="utf-8"?> 2 2 <object name="tradeDialogPanel" 3 size="50%- 134 50%-130 50%+134 50%+100"3 size="50%-80 50%-280 50%+80 50%+136" 4 4 type="image" 5 5 hidden="true" 6 6 sprite="ModernDialog" 7 z="100" 7 8 > 8 9 <object type="text" style="TitleText" size="50%-96 -16 50%+96 16"> 9 <translatableAttribute id="caption"> Trade</translatableAttribute>10 <translatableAttribute id="caption">Barter & Trade Goods</translatableAttribute> 10 11 </object> 11 12 12 <!-- Trading goods --> 13 <object name="tradeGoods" size="20 50 100%-20 82"> 14 <object name="tradeHeader" size="0 0 180 100%" type="text" style="ModernLabelText" text_align="left" ghost="true"> 15 <translatableAttribute id="caption">Trading goods selection:</translatableAttribute> 13 14 <!-- Barter Goods --> 15 <object size="24 24 100%-24 33%"> 16 17 <object name="barterHeader" size="8 0 100% 32" type="text" style="ModernLeftLabelText"> 18 <translatableAttribute id="caption">Barter</translatableAttribute> 16 19 </object> 20 <object size="0 28 100% 29" type="image" sprite="ModernGoldLine"/> 21 22 <object size="0 38 100% 122"> 23 24 <object size="0 0 60 41" type="text" style="ModernRightLabelText"> 25 <translatableAttribute id="caption">Sell:</translatableAttribute> 26 </object> 27 28 <object size="0 100%-41 60 100%" type="text" style="ModernRightLabelText"> 29 <translatableAttribute id="caption">Buy:</translatableAttribute> 30 </object> 31 32 <object size="72 0 100% 100%" type="text" style="ModernLabelText" name="barterNoMarketsMessage"> 33 <translatableAttribute id="caption">No Markets Available</translatableAttribute> 34 </object> 35 36 <object name="barterResources" size="72 0 100% 100%"> 37 <repeat count="8"> 38 <object name="barterResource[n]" size="0 0 58 100%"> 39 40 <!-- Sell --> 41 <object name="barterSellButton[n]" style="iconButton" type="button" size="0 0 41 41" tooltip_style="sessionToolTipBottomBold" hidden="true"> 42 <object name="barterSellIcon[n]" type="image" ghost="true" size="3 3 100%-3 100%-3"/> 43 <object name="barterSellAmount[n]" ghost="true" style="resourceText" type="text" size="0 0 100% 50%"/> 44 <object name="barterSellSelection[n]" hidden="true" type="image" ghost="true" size="3 3 100%-3 100%-3" sprite="stretched:session/icons/corners.png"/> 45 </object> 46 47 <!-- Buy --> 48 <object name="barterBuyButton[n]" style="iconButton" type="button" size="0 100%-41 41 100%" tooltip_style="sessionToolTipBottomBold" hidden="true"> 49 <object name="barterBuyIcon[n]" type="image" ghost="true" size="3 3 100%-3 100%-3"/> 50 <object name="barterBuyAmount[n]" ghost="true" style="resourceText" type="text" size="0 0 100% 50%"/> 51 </object> 17 52 18 <object size="180 0 100% 100%" name="tradeResources">19 <repeat count="8">20 <object name="tradeResource[n]" size="0 0 58 32">21 <object name="tradeResourceButton[n]" size="4 0 36 100%" type="button" style="StoneButton">22 <object name="tradeResourceIcon[n]" type="image" ghost="true"/>23 <object name="tradeResourceSelection[n]" type="image" sprite="stretched:session/icons/corners.png" ghost="true"/>24 <object name="tradeResourceText[n]" type="text" style="ModernLabelText" ghost="true"/>25 </object>26 <object name="tradeArrowUp[n]" size="36 0 52 50%" type="button" style="iconButton">27 <object type="image" ghost="true" sprite="StoneArrowUp"/>28 53 </object> 29 <object name="tradeArrowDn[n]" size="36 50% 52 100%" type="button" style="iconButton"> 30 <object type="image" ghost="true" sprite="StoneArrowDn"/> 54 </repeat> 55 </object> 56 57 </object> 58 </object> 59 60 <!-- Trading goods --> 61 <object size="24 33%+32 100%-24 100%-64"> 62 63 <object name="tradeHeader" size="8 0 100% 32" type="text" style="ModernLeftLabelText"> 64 <translatableAttribute id="caption">Trade</translatableAttribute> 65 </object> 66 <object size="0 28 100% 29" type="image" sprite="ModernGoldLine"/> 67 68 <object name="tradeGoods" size="0 38 100% 70"> 69 70 <object size="0 0 60 100%" type="text" style="ModernRightLabelText"> 71 <translatableAttribute id="caption">Goods:</translatableAttribute> 72 </object> 73 74 <object size="72 0 100% 100%" name="tradeResources"> 75 <repeat count="8"> 76 <object name="tradeResource[n]" size="0 0 58 32"> 77 78 <object name="tradeResourceButton[n]" size="4 0 36 100%" type="button" style="StoneButton"> 79 <object name="tradeResourceIcon[n]" type="image" ghost="true"/> 80 <object name="tradeResourceSelection[n]" type="image" sprite="stretched:session/icons/corners.png" ghost="true"/> 81 <object name="tradeResourceText[n]" type="text" style="ModernLabelText" ghost="true"/> 82 </object> 83 <object name="tradeArrowUp[n]" size="36 0 52 50%" type="button" style="iconButton"> 84 <object type="image" ghost="true" sprite="StoneArrowUp"/> 85 </object> 86 <object name="tradeArrowDn[n]" size="36 50% 52 100%" type="button" style="iconButton"> 87 <object type="image" ghost="true" sprite="StoneArrowDn"/> 88 </object> 89 31 90 </object> 32 </object> 33 </repeat> 91 </repeat> 92 </object> 93 34 94 <object name="tradeHelp" size="100%-24 4 100% 28" enabled="false" type="button" style="StoneButton" tooltip_style="sessionToolTipBold"> 35 95 <object size="20% 15% 80% 75%" type="image" ghost="true" sprite="iconInfoWhite"/> 36 96 </object> 97 37 98 </object> 38 </object>39 99 40 <object name="tradeStatistics" size="20 90 100%-20 168"> 41 <object name="landTraders" size="0 0 100% 50%" type="text" style="ModernLabelText" text_align="left" ghost="true" /> 42 <object name="shipTraders" size="0 50% 100% 100%" type="text" style="ModernLabelText" text_align="left" ghost="true" /> 100 <object name="traders" size="8 88 100% 100%" type="text" style="ModernLeftTabLabelText"/> 101 43 102 </object> 44 103 45 104 <object size="50%-64 100%-50 50%+64 100%-22" type="button" style="StoneButton"> -
binaries/data/mods/public/gui/session/unit_actions.js
diff --git a/binaries/data/mods/public/gui/session/unit_actions.js b/binaries/data/mods/public/gui/session/unit_actions.js index 4f8e7b2ef..297dc9176 100644
a b var g_EntityCommands = 1260 1260 return false; 1261 1261 1262 1262 return { 1263 "tooltip": translate(" Select trading goods"),1263 "tooltip": translate("Barter & Trade"), 1264 1264 "icon": "economics.png" 1265 1265 }; 1266 1266 }, -
binaries/data/mods/public/simulation/components/GuiInterface.js
diff --git a/binaries/data/mods/public/simulation/components/GuiInterface.js b/binaries/data/mods/public/simulation/components/GuiInterface.js index 932c8cd3d..f548fc3f0 100644
a b GuiInterface.prototype.GetSimulationState = function() 150 150 ret.alliedVictory = cmpEndGameManager.GetAlliedVictory(); 151 151 152 152 // Add bartering prices 153 let cmpBarter = Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter); 154 ret.barterPrices = cmpBarter.GetPrices(); 153 ret.barterPrices = this.GetBarterPrices(); 155 154 156 155 // Add Resource Codes, untranslated names and AI Analysis 157 156 ret.resources = { … … GuiInterface.prototype.GetExtendedEntityState = function(player, ent) 565 564 }; 566 565 567 566 if (!cmpFoundation && cmpIdentity && cmpIdentity.HasClass("BarterMarket")) 568 { 569 let cmpBarter = Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter); 570 ret.barterMarket = { "prices": cmpBarter.GetPrices() }; 571 } 567 ret.barterMarket = { "prices": this.GetBarterPrices() }; 572 568 573 569 let cmpHeal = Engine.QueryInterface(ent, IID_Heal); 574 570 if (cmpHeal) … … GuiInterface.prototype.GetTradingGoods = function(player) 1954 1950 return QueryPlayerIDInterface(player).GetTradingGoods(); 1955 1951 }; 1956 1952 1953 GuiInterface.prototype.GetBarterPrices = function() 1954 { 1955 return Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter).GetPrices(); 1956 }; 1957 1958 GuiInterface.prototype.PlayerCanBarter = function(player) 1959 { 1960 let playerEnt = Engine.QueryInterface(SYSTEM_ENTITY, IID_PlayerManager).GetPlayerByID(player); 1961 return Engine.QueryInterface(SYSTEM_ENTITY, IID_Barter).PlayerHasMarket(playerEnt); 1962 }; 1963 1957 1964 GuiInterface.prototype.OnGlobalEntityRenamed = function(msg) 1958 1965 { 1959 1966 this.renamedEntities.push(msg); … … let exposedFunctions = { 2018 2025 2019 2026 "GetTraderNumber": 1, 2020 2027 "GetTradingGoods": 1, 2028 "GetBarterPrices": 1, 2029 "PlayerCanBarter": 1, 2021 2030 }; 2022 2031 2023 2032 GuiInterface.prototype.ScriptCall = function(player, name, args)