Trading transaction system done
This commit is contained in:
@@ -11,51 +11,57 @@ public class TradeMenu : MonoBehaviour
|
||||
{
|
||||
public Transform tradeListParent;
|
||||
public GameObject tradeListItem;
|
||||
public GameObject refreshIndicator;
|
||||
public Button refreshIndicator;
|
||||
public TMP_Text coinsTxt;
|
||||
public TMP_Text gemsTxt;
|
||||
public List<GameObject> pooledEntries;
|
||||
public List<TradeRequest> trades;
|
||||
[Header("Selected Trade Data")]
|
||||
public TradeRequest selectedTrade=null;
|
||||
public TradeRequest selectedTrade = null;
|
||||
public TMP_Text sellerNameTxt;
|
||||
public GameObject coinsItem;
|
||||
public GameObject gemsItem;
|
||||
public GameObject metalsItem;
|
||||
public GameObject oxygenItem;
|
||||
public Image itemImg;
|
||||
public Sprite defaultFrame;
|
||||
public Sprite mineFrame;
|
||||
public Button acceptBtn;
|
||||
void Start()
|
||||
{
|
||||
pooledEntries= new List<GameObject>();
|
||||
pooledEntries.Add(tradeListItem);
|
||||
pooledEntries = new List<GameObject>();
|
||||
//pooledEntries.Add(tradeListItem);
|
||||
refreshIndicator.onClick.AddListener(Refresh);
|
||||
acceptBtn.onClick.AddListener(OnAcceptClicked);
|
||||
Refresh();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
|
||||
public bool refreshing = false;
|
||||
public async void Refresh(){
|
||||
public async void Refresh()
|
||||
{
|
||||
refreshing = true;
|
||||
refreshIndicator.SetActive(true);
|
||||
refreshIndicator.interactable=false;
|
||||
refreshIndicator.GetComponent<Rotator>().enabled = (true);
|
||||
//Clean existing entries
|
||||
foreach(GameObject entry in pooledEntries){entry.SetActive(false);}
|
||||
foreach (GameObject entry in pooledEntries) { entry.SetActive(false); }
|
||||
coinsTxt.text = DBmanager.Coins.ToString();
|
||||
gemsTxt.text = DBmanager.Gems.ToString();
|
||||
selectedTrade=null;
|
||||
// if(selectedTrade==null){
|
||||
coinsItem.SetActive(false);
|
||||
gemsItem.SetActive(false);
|
||||
metalsItem.SetActive(false);
|
||||
oxygenItem.SetActive(false);
|
||||
acceptBtn.interactable=false;
|
||||
itemImg.sprite = null;
|
||||
selectedTrade = null;
|
||||
// if(selectedTrade==null){
|
||||
coinsItem.SetActive(false);
|
||||
gemsItem.SetActive(false);
|
||||
metalsItem.SetActive(false);
|
||||
oxygenItem.SetActive(false);
|
||||
acceptBtn.interactable = false;
|
||||
itemImg.sprite = null;
|
||||
//}
|
||||
|
||||
|
||||
using (UnityWebRequest www = UnityWebRequest.Get(DBmanager.phpRoot + "get_trades.php"))
|
||||
{
|
||||
var operation = www.SendWebRequest();
|
||||
@@ -70,14 +76,22 @@ public class TradeMenu : MonoBehaviour
|
||||
}
|
||||
else
|
||||
{
|
||||
string[] splitChars = {"<td>"};
|
||||
string[] data = www.downloadHandler.text.Split(splitChars,System.StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] splitChars = { "<td>" };
|
||||
string[] data = www.downloadHandler.text.Split(splitChars, System.StringSplitOptions.RemoveEmptyEntries);
|
||||
trades = new List<TradeRequest>();
|
||||
foreach(string row in data){
|
||||
try{
|
||||
foreach (string row in data)
|
||||
{
|
||||
try
|
||||
{
|
||||
TradeRequest trade = JsonConvert.DeserializeObject<TradeRequest>(row);
|
||||
trades.Add(trade);
|
||||
}catch{
|
||||
if(trade.seller == DBmanager.username){
|
||||
trades[trades.Count-1] = trades[0];
|
||||
trades[0] = trade;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -88,97 +102,161 @@ public class TradeMenu : MonoBehaviour
|
||||
|
||||
//Populate Trade Entries in list
|
||||
|
||||
|
||||
|
||||
//Fill pool if exceeds
|
||||
if(trades.Count > pooledEntries.Count){
|
||||
for(int i =0; i < trades.Count - pooledEntries.Count; i++){
|
||||
int amountToFill = trades.Count - pooledEntries.Count;
|
||||
if (amountToFill > 0)
|
||||
{
|
||||
for (int i = 0; i < amountToFill; i++)
|
||||
{
|
||||
GameObject newEntry = Instantiate(tradeListItem, tradeListParent);
|
||||
newEntry.SetActive(false);
|
||||
pooledEntries.Add(newEntry);
|
||||
}
|
||||
}
|
||||
if(trades.Count > pooledEntries.Count){Debug.LogError("Somethings wrong, I can feel it");}
|
||||
//Set pooled items
|
||||
for(int i = 0; i < trades.Count;i++){
|
||||
for (int i = 0; i < trades.Count; i++)
|
||||
{
|
||||
TradeRequest trade = trades[i];
|
||||
InventoryItem item = Inventory.GetInventoryItem(trade.item);
|
||||
if(item ==null){Debug.LogError("Couldn't find any inventory item for " + trade.item); continue;}
|
||||
if (item == null) { Debug.LogError("Couldn't find any inventory item for " + trade.item); continue; }
|
||||
pooledEntries[i].SetActive(true);
|
||||
pooledEntries[i].transform.GetChild(0).GetComponent<Image>().sprite = item.image;
|
||||
pooledEntries[i].GetComponentInChildren<TMPro.TMP_Text>().text = trade.item;
|
||||
pooledEntries[i].GetComponent<Button>().onClick.RemoveAllListeners();
|
||||
pooledEntries[i].GetComponent<Button>().onClick.AddListener(()=>{SelectTrade(trade.id);});
|
||||
pooledEntries[i].GetComponent<Button>().onClick.AddListener(() => { SelectTrade(trade.id); });
|
||||
|
||||
pooledEntries[i].GetComponent<Image>().sprite = (trade.seller == DBmanager.username) ? mineFrame : defaultFrame;
|
||||
|
||||
}
|
||||
|
||||
refreshIndicator.interactable=true;
|
||||
refreshIndicator.GetComponentInChildren<Rotator>(true).enabled=(false);
|
||||
|
||||
refreshIndicator.SetActive(false);
|
||||
refreshing=false;
|
||||
refreshing = false;
|
||||
}
|
||||
|
||||
public void SelectTrade(TradeRequest trade){
|
||||
public void SelectTrade(TradeRequest trade)
|
||||
{
|
||||
SelectTrade(trade.id);
|
||||
}
|
||||
|
||||
public void SelectTrade(int id){
|
||||
public void SelectTrade(int id)
|
||||
{
|
||||
selectedTrade = null;
|
||||
foreach(TradeRequest trade in trades){
|
||||
if(trade.id == id){
|
||||
foreach (TradeRequest trade in trades)
|
||||
{
|
||||
if (trade.id == id)
|
||||
{
|
||||
selectedTrade = trade;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(selectedTrade==null){Debug.Log("No matching trade request");return;}
|
||||
if (selectedTrade == null) { Debug.Log("No matching trade request"); return; }
|
||||
bool myTrade = selectedTrade.seller == DBmanager.username;
|
||||
InventoryItem item = Inventory.GetInventoryItem(selectedTrade.item);
|
||||
itemImg.sprite = item.image;
|
||||
|
||||
#region setResource
|
||||
if(selectedTrade.coins > 0){
|
||||
if (selectedTrade.coins > 0)
|
||||
{
|
||||
coinsItem.SetActive(true);
|
||||
coinsItem.GetComponentInChildren<TMP_Text>().text = selectedTrade.coins.ToString();
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
coinsItem.SetActive(false);
|
||||
}
|
||||
|
||||
if(selectedTrade.gems > 0){
|
||||
|
||||
if (selectedTrade.gems > 0)
|
||||
{
|
||||
gemsItem.SetActive(true);
|
||||
gemsItem.GetComponentInChildren<TMP_Text>().text = selectedTrade.gems.ToString();
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
gemsItem.SetActive(false);
|
||||
}
|
||||
|
||||
if(selectedTrade.metals > 0){
|
||||
|
||||
if (selectedTrade.metals > 0)
|
||||
{
|
||||
metalsItem.SetActive(true);
|
||||
metalsItem.GetComponentInChildren<TMP_Text>().text = selectedTrade.metals.ToString();
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
metalsItem.SetActive(false);
|
||||
}
|
||||
|
||||
if(selectedTrade.oxygen > 0){
|
||||
|
||||
if (selectedTrade.oxygen > 0)
|
||||
{
|
||||
oxygenItem.SetActive(true);
|
||||
oxygenItem.GetComponentInChildren<TMP_Text>().text = selectedTrade.oxygen.ToString();
|
||||
}else{
|
||||
}
|
||||
else
|
||||
{
|
||||
oxygenItem.SetActive(false);
|
||||
}
|
||||
#endregion
|
||||
|
||||
sellerNameTxt.text = selectedTrade.seller;
|
||||
|
||||
acceptBtn.interactable = (DBmanager.Coins >= selectedTrade.coins) && (DBmanager.Gems >= selectedTrade.gems) && (DBmanager.Metal >= selectedTrade.metals) && (DBmanager.Oxygen >= selectedTrade.oxygen);
|
||||
acceptBtn.interactable = !myTrade && isTradeAffordable(selectedTrade);
|
||||
}
|
||||
|
||||
public bool isTradeAffordable(TradeRequest trade) => (DBmanager.Coins >= trade.coins) && (DBmanager.Gems >= trade.gems) && (DBmanager.Metal >= trade.metals) && (DBmanager.Oxygen >= trade.oxygen);
|
||||
|
||||
public void OnAcceptClicked(){
|
||||
if(selectedTrade==null){Debug.Log("No offer is selected to accept"); return;}
|
||||
if(selectedTrade.seller == DBmanager.username){Debug.LogError("Cannot accept my own offer, This is illegal"); return;}
|
||||
if(!isTradeAffordable(selectedTrade)){Debug.Log("Insufficient resources to complete the trade (LC)");return;}
|
||||
|
||||
//Good to go
|
||||
StartCoroutine(acceptOffer(selectedTrade));
|
||||
}
|
||||
|
||||
IEnumerator acceptOffer(TradeRequest trade){
|
||||
acceptBtn.interactable=false;
|
||||
WWWForm form = new WWWForm();
|
||||
form.AddField("name", DBmanager.username);
|
||||
form.AddField("id", trade.id);
|
||||
|
||||
WWW www = new WWW(DBmanager.phpRoot+"accept_trade.php", form);
|
||||
yield return www;
|
||||
|
||||
if(www.text=="0"){
|
||||
Debug.Log("Trade success");
|
||||
//change local stuff
|
||||
DBmanager.SetCoins(DBmanager.Coins - trade.coins,true);
|
||||
DBmanager.SetGems(DBmanager.Gems - trade.gems,true);
|
||||
DBmanager.SetOxygen(DBmanager.Oxygen - trade.oxygen,true);
|
||||
DBmanager.SetMetal(DBmanager.Metal - trade.metals, true);
|
||||
DBmanager.AddInventoryItem(Inventory.GetInventoryItem(trade.item));
|
||||
Refresh();
|
||||
}else{
|
||||
Debug.Log($"I wanted to trade, but server said :{www.text}");
|
||||
}
|
||||
acceptBtn.interactable=true;
|
||||
}
|
||||
|
||||
|
||||
public void Show(){
|
||||
public void Show()
|
||||
{
|
||||
gameObject.SetActive(true);
|
||||
Refresh();
|
||||
}
|
||||
|
||||
public void Close(){
|
||||
public void Close()
|
||||
{
|
||||
gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[System.Serializable]
|
||||
public class TradeRequest{
|
||||
public class TradeRequest
|
||||
{
|
||||
public int id;
|
||||
public string seller;
|
||||
public string item;
|
||||
|
||||
Reference in New Issue
Block a user