Files
flufflparty-/FlufflParty/Assets/Scripts/Players/PlayablePlayer.cs
T
2023-03-04 01:14:26 +01:00

277 lines
8.0 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Net.Mail;
using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.UI;
public class PlayablePlayer : Player
{
public Field nextField;
private Field currentField;
public GameObject dice;
private Dice diceScript;
private Vector3 moveTo = Vector3.zero;
private Vector3 lastPos = Vector3.zero;
private float speed = 5;
private float interPol = 0;
private int wurfelZahl = 0;
private bool wait = false;
private float timeSinceWurfeln = 0;
private float timeSinceStop = 0;
private Vector3 useLess = new Vector3();
public Client client;
private static PlayablePlayer instance;
public override void Init()
{
TMP_Text[] playerTexts = GetComponentsInChildren<TMP_Text>();
playerTexts[0].text = playerTexts[1].text = name;
activated = false;
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 61;
diceScript = dice.GetComponent<Dice>();
instance = this;
}
public static PlayablePlayer GetCurrentInstance()
{
return instance;
}
private void Update()
{
/*
if (Input.GetMouseButtonDown(0))
{
eventstop = false;
client.EventStopFinished();
}
*/
if (activated && !name.Equals(""))
{
//Generiere Würfelzahl von 1-6 wenn gerade gewürfelt werden darf
if ((Input.GetMouseButtonUp(0) && !uiHandler.MapOpen) && wurfelZahl == 0 && !wurfelt)
{
if (!Physics.Raycast(new Vector3(Input.mousePosition.x, Input.mousePosition.y, -200), Vector3.forward))
{
wurfelt = true;
wurfelZahl = Random.Range(1, 7);
if (activeItem == Item.Type.Mushroom)
{
wurfelZahl += 3;
activeItem = Item.Type.None;
}
textLeftMoves.text = wurfelZahl + "";
client.SendWurfeln(wurfelZahl);
//nächstes Feld anvisieren
TargetNextField();
//stop the dice
diceScript.StopRandom(wurfelZahl);
//delay for walk start
timeSinceWurfeln = Time.time;
}
}
}
}
private void FixedUpdate()
{
if (activated && !name.Equals(""))
{
camera.transform.position = Vector3.SmoothDamp(camera.transform.position, transform.position + cameraOffset,
ref velocity, 0.2f);
if (!wait)
{
//Laufe zum nöchsten Feld, falls noch Züge übrig sind
if (interPol < 1 && wurfelZahl > 0)
{
//delay
if (Time.time - timeSinceWurfeln > 2)
{
InterPolerate();
}
}
//Würfelzahl um 1 verringern falls noch züge übrig sind
else if (wurfelZahl > 0)
{
wurfelZahl--;
textLeftMoves.text = wurfelZahl + "";
//the next field is the current field XD
currentField = nextField;
//Visiere das nächste Feld an falls noch ein Zug übrig ist (Player steht gerade auf einem Feld oder läuft darüber)
if (wurfelZahl > 0)
{
TargetNextField();
}
}
//Der Spieler steht gerade
else
{
//TODO: temp spieler finsihed erst, wenn field action ausgeführt wurde
if (wurfelt)
{
int fieldReturnStatus = currentField.Action(index);
switch (fieldReturnStatus)
{
case 0:
client.SendCoinFieldAction(0);
AddCoins(3);
break;
case 1:
client.SendCoinFieldAction(1);
AddCoins(-3);
break;
}
Invoke("Finish", 2);
activated = false;
}
else
{
//start the dice
dice.transform.position = Vector3.SmoothDamp(dice.transform.position,
transform.position + Vector3.up * 2, ref useLess, 0.2f);
diceScript.StartRandom();
}
}
}
else
{
foreach (Arrow a in nextField.DirectionalArrow)
{
a.Activate();
}
if (nextField.DirectionalArrow[0].IsClicked())
{
client.SendArrowSelected(0);
foreach (Arrow a in nextField.DirectionalArrow)
{
a.Deactivate();
}
nextField = nextField = nextField.Target[0];
moveTo = nextField.transform.position;
wait = false;
}
else if (nextField.DirectionalArrow[1].IsClicked())
{
client.SendArrowSelected(1);
foreach (Arrow a in nextField.DirectionalArrow)
{
a.Deactivate();
}
nextField = nextField = nextField.Target[1];
moveTo = nextField.transform.position;
wait = false;
}
}
}
}
//Das nächste Feld aufgrund des aktuellen Feldes anvisieren
private void TargetNextField()
{
interPol = 0;
lastPos = transform.position;
if (nextField.Target.Length == 1)
{
nextField = nextField.Target[0];
moveTo = nextField.transform.position;
}
else
{
wait = true;
}
}
//Bewegt den Player von einem Punkt(lastPos) zu einem anderen Punkt(moveTo) mit konstanter Geschwindigkeit
private Vector3 nextPoint;
private void InterPolerate()
{
if (!eventstop)
{
nextPoint = Vector3.Lerp(lastPos, moveTo, interPol);
transform.position = new Vector3(nextPoint.x, transform.position.y, nextPoint.z);
interPol += (Time.deltaTime * speed) / Mathf.Abs(Vector3.Distance(moveTo, lastPos));
}
}
private void Finish()
{
client.SendFinished();
}
private Star currentStar = null;
private void OnTriggerEnter(Collider collider)
{
if (collider.name.Equals("ItemShopTrigger"))
{
base.OnTriggerEnter(collider);
uiHandler.ActivateLayout2(this);
}
else if (collider.name.Equals("StarTrigger"))
{
currentStar = collider.GetComponent<Star>();
if(currentStar.IsActive)
{
base.OnTriggerEnter(collider);
uiHandler.ActivateLayoutBuyStar(this);
}
}
}
public void BuyStar(bool buy)
{
client.SendEventStopFinished();
if (buy)
{
currentStar.Buy(this);
client.SendBuyStar();
AddStars(1);
}
else
{
currentStar = null;
}
}
public void SkipShop()
{
client.SendEventStopFinished();
}
public new void AddItem(Item item)
{
base.AddItem(item);
client.SendBuyItem(item);
}
}