using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Net.Sockets; using System.Text; using System.Threading; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; public class Client : MonoBehaviour { [SerializeField] private TMP_Text textLeftMoves; private TcpClient client; private Stream stream; [SerializeField] private GameObject playerPrefab; private Player[] players = new Player[4]; private Queue jobs = new Queue(); [SerializeField] private GameObject dice; [SerializeField] private Field nextField; [SerializeField] private GameObject cam; [SerializeField] private UIHandler uiHandler; [SerializeField] private TMP_Text[] playerNameTexts; [SerializeField] private GameObject[] playerInfo; private PlayerInfoElements[] playerInfoElements = new PlayerInfoElements[4]; [SerializeField] private GameObject layout2; [SerializeField] public Item[] items; [SerializeField] private Button[] itemButtons; [SerializeField] private TMP_Text fpsText; private int playerAmount = 0; [SerializeField] private Image imageCurrentItem; [SerializeField] private Image[] playerItemInfoImages; private static Client thisClient; public static Client GetCurrentInstance() { return thisClient; } private void Awake() { Time.fixedDeltaTime = 0.01f; } private void Start() { Application.targetFrameRate = 60; thisClient = this; for (int i = 0; i < 4; i++) { playerInfo[i].SetActive(false); } client = new TcpClient("185.245.96.48", 8051); stream = client.GetStream(); stream.Write(new byte[] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 0, 10); string roomCode = PlayerPrefs.GetString("roomcode"); stream.Write(Encoding.ASCII.GetBytes(roomCode), 0, 10); string name = PlayerPrefs.GetString("name"); stream.Write(Encoding.ASCII.GetBytes(name), 0, 10); for (int i = 0; i < playerInfo.Length; i++) { playerInfoElements[i] = playerInfo[i].GetComponent(); } new Thread(Read).Start(); } public void CalculatePlacement() { Player[] temp = new Player[playerAmount]; bool[] samePlacement = new bool[playerAmount]; for (int j = 0; j < temp.Length; j++) { temp[j] = players[j]; samePlacement[j] = false; } for (int i = 0; i < temp.Length - 1; i++) { for (int f = 0; f < temp.Length - 1; f++) { if (temp[f].stars < temp[f + 1].stars) { (temp[f], temp[f + 1]) = (temp[f + 1], temp[f]); } else if (temp[f].stars == temp[f + 1].stars && temp[f].coins < temp[f + 1].coins) { (temp[f], temp[f + 1]) = (temp[f + 1], temp[f]); } else if(temp[f].stars == temp[f + 1].stars && temp[f].coins == temp[f + 1].coins) { samePlacement[f] = true; } } } int currentPlacement = 1; for (int j = 0; j < temp.Length; j++) { for (int i = 0; i < temp.Length; i++) { if (temp[j] == players[i]) { // playerInfoElements[i].textPlacement.text = j+1 + "."; playerInfoElements[i].textPlacement.text = currentPlacement + ""; if (!samePlacement[j]) { currentPlacement++; } } } } } private void FixedUpdate() { fpsText.text = "" + Time.frameCount / Time.time + ""; if (jobs.Count > 0) { Job job = jobs.Dequeue(); switch (job.data[0]) { //-----Create A new player----- case 1: playerAmount++; //player is playable if (job.data[1] == 1) { GameObject player = Instantiate(playerPrefab); player.transform.position = new Vector3(job.data[2], job.data[3] + 0.5f, job.data[4]); PlayablePlayer script = player.AddComponent(); players[job.data[5]] = script; script.client = this; script.nextField = nextField; script.dice = dice; script.camera = cam; script.imageCurrentItem = imageCurrentItem; //ITEM INFO IMAGES Image[] temp = new Image[3]; int itemInfoImagesStartIndex = job.data[5] * 3; int idx = 0; for (int i = itemInfoImagesStartIndex; i < itemInfoImagesStartIndex + 3; i++) { temp[idx] = playerItemInfoImages[i]; temp[idx].color = new Color(0, 0, 0, 0); idx++; } script.itemInfoImages = temp; //END itemButtons[job.data[5]].interactable = true; } //player is not playable else { GameObject player = Instantiate(playerPrefab); player.transform.position = new Vector3(job.data[2], job.data[3] + 0.5f, job.data[4]); NoPlayablePlayer script = player.AddComponent(); players[job.data[5]] = script; script.nextField = nextField; script.dice = dice; script.camera = cam; script.imageCurrentItem = imageCurrentItem; //ITEM INFO IMAGES Image[] temp = new Image[3]; int itemInfoImagesStartIndex = job.data[5] * 3; int idx = 0; for (int i = itemInfoImagesStartIndex; i < itemInfoImagesStartIndex + 3; i++) { temp[idx] = playerItemInfoImages[i]; temp[idx].color = new Color(0, 0, 0, 0); idx++; } script.itemInfoImages = temp; //END itemButtons[job.data[5]].interactable = false; } break; //--------------------------------------------------------- //-----Activate a Player case 2: Activate(job.data[1]); break; //Jemand hat gewürfelt case 3: ((NoPlayablePlayer)players[job.data[1]]).Wurfeln(job.data[2]); break; //Jemand hat den Pfeil geklickt case 4: ((NoPlayablePlayer)players[job.data[1]]).ArrowSelect(job.data[2]); break; case 5: byte[] name = new byte[8]; for (int i = 0; i < 8; i++) { name[i] = job.data[i + 2]; } players[job.data[1]].name = Encoding.ASCII.GetString(name).Replace(" ", ""); players[job.data[1]].index = job.data[1]; players[job.data[1]].textCoinsInfo = playerInfoElements[job.data[1]].textCoinInfo; players[job.data[1]].textStarsInfo = playerInfoElements[job.data[1]].textStarsInfo; players[job.data[1]].uiHandler = uiHandler; players[job.data[1]].textLeftMoves = textLeftMoves; players[job.data[1]].AddCoins(3); players[job.data[1]].Init(); playerNameTexts[job.data[1]].text = Encoding.ASCII.GetString(name).Replace(" ", ""); uiHandler.ActivateLayout1(); playerInfo[job.data[1]].SetActive(true); break; case 6: ((NoPlayablePlayer)players[job.data[1]]).CoinFieldAction(job.data[2]); break; case 7: (players[job.data[1]]).EventStopFinished(); break; case 8: ((NoPlayablePlayer)players[job.data[1]]).BuyStar(); break; case 9: players[job.data[1]].AddCoins(-items[job.data[2]].Cost); players[job.data[1]].AddItem(items[job.data[2]]); break; case 10: players[job.data[1]].ActivateItem(job.data[2]); break; case 126: stream.Write(new byte[]{126, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 0, 10); break; case 127: client.Close(); SceneManager.LoadScene(0, LoadSceneMode.Single); break; } } } private void Activate(int player) { for (int i = 0; i < players.Length; i++) { if (!(players[i] is null)) { if (i == player) { players[i].Activate(); } else { players[i].DeActivate(); } } } // cam.transform.parent = players[player].transform; // cam.transform.localPosition = new Vector3(-3, 8, 7); } private void Read() { while (true) { byte[] read = new byte[10]; stream.Read(read, 0, 10); jobs.Enqueue(new Job(read)); } } //0 3 wurfeln //1 x, x = zahl public void SendWurfeln(int zahl) { stream.Write(new byte[]{3, (byte)zahl, 0, 0, 0, 0, 0, 0, 0, 0}); } //0 4 arrow selected //1 x, x = arrow idx public void SendArrowSelected(int idx) { stream.Write(new byte[]{4, (byte)idx, 0, 0, 0, 0, 0, 0, 0, 0}); } //0 5 public void SendFinished() { stream.Write(new byte[]{5, 0, 0, 0, 0, 0, 0, 0, 0, 0}); } public void SendCoinFieldAction(int action) { stream.Write(new byte[]{6, (byte)action, 0, 0, 0, 0, 0, 0, 0, 0}); } public void SendEventStopFinished() { stream.Write(new byte[]{7, 0, 0, 0, 0, 0, 0, 0, 0, 0}); } public void SendBuyStar() { stream.Write(new byte[]{8, 0, 0, 0, 0, 0, 0, 0, 0, 0}); } public void SendBuyItem(Item item) { stream.Write(new byte[] { 9, (byte)item.type, 0, 0, 0, 0, 0, 0, 0, 0 }); } public void SendActiveItem(byte index) { stream.Write(new byte[]{10, index, 0, 0, 0, 0, 0, 0, 0, 0}); } private void OnApplicationQuit() { stream.Write(new byte[]{126, 0, 0, 0, 0, 0, 0, 0, 0, 0}); } private void OnApplicationPause(bool pauseStatus) { stream.Write(new byte[]{126, 0, 0, 0, 0, 0, 0, 0, 0, 0}); } }