UPF/Assets/Game/Scripts/Minigame/Bot/SpaceshipNetworkBot.cs
2023-02-24 22:14:55 +05:30

316 lines
10 KiB
C#
Executable File

using System;
using System.Collections;
using System.Collections.Generic;
using Mirror;
using UnityEngine;
using UnityEngine.UI;
using Random = UnityEngine.Random;
public class SpaceshipNetworkBot : NetworkBehaviour
{
public string[] Names;
[SyncVar (hook = nameof(OnPnameChanged))]
public string pname;
public Text nameTxt;
public float movingSpeed;
public float minSpeed;
public float maxSpeed;
public Transform curTarget;
public TrailMgrBot trailMgr;
public GameObject DeathEffect;
public LayerMask pickupsLayer;
[SyncVar]
public int Scores = 0;
[SyncVar(hook = nameof(OnSetupIndexChanged))]
public int SelectedSetupIndex;
void OnSetupIndexChanged(int old, int value){
GetComponent<SpriteRenderer>().sprite = botSetups[value].skins[SelectedSkinIndex];
}
[SyncVar(hook = nameof(OnSkinIndexChanged))]
public int SelectedSkinIndex;
void OnSkinIndexChanged(int old, int value){
GetComponent<SpriteRenderer>().sprite = botSetups[SelectedSetupIndex].skins[value];
}
public float up;
public BotSetup[] botSetups;
void OnPnameChanged(string oldName, string newName){
nameTxt.text = newName;
}
public void InitRandomBot(){
pname = BotsHiveMind.LeaseName(pname.Length > 0 ? pname : null);
nameTxt.text = pname;
int luck = Random.Range(0,100);
BotSetup selectedSetup = botSetups[0];
for(int i=0; i < botSetups.Length; i++){
BotSetup setup = botSetups[i];
if(setup.rarity < luck && setup.rarity > selectedSetup.rarity){
selectedSetup = setup;
SelectedSetupIndex = i;
}
}
SelectedSkinIndex = Random.Range(0, selectedSetup.skins.Length);
GetComponent<SpriteRenderer>().sprite = selectedSetup.skins[SelectedSkinIndex];
movingSpeed = Random.Range(selectedSetup.minSpeed, selectedSetup.maxSpeed);
// movingSpeed = Random.Range(minSpeed, maxSpeed);
}
// Update is called once per frame
void FixedUpdate()
{
if(!isServer){return;}
HandleMovement();
CheckForPickups();
// ChangeName();
}
void CheckForPickups(){
Collider2D[] hits = Physics2D.OverlapCircleAll(transform.position, 3, pickupsLayer);
foreach(Collider2D hit in hits){
if(hit!=null ){
// Debug.Log(hit.name);
PickupItem pickupItem = hit.GetComponent<PickupItem>();
if(pickupItem !=null && pickupItem.active){
pickupItem.active=false;
pickupItem.Deactivate(transform);
CollectPickup(pickupItem.type);
}
}
}
}
void Update(){
nameTxt.rectTransform.rotation = Quaternion.Euler(Vector3.zero);
}
float swayTimer = 0;
void HandleMovement(){
CheckAndUpdateTarget();
Vector3 targ = curTarget.position;
if(isHunting){
targ+=(curTarget.up * 8);
if(swayTimer < 10){
targ+=(curTarget.right * 8);
}else{
targ-=(curTarget.right * 8);
}
swayTimer += Time.deltaTime;
if(swayTimer > 20){
swayTimer=0;
}
}
targ.z = 0f;
Vector3 objectPos = transform.position;
targ.x = targ.x - objectPos.x;
targ.y = targ.y - objectPos.y;
float angle = Mathf.Atan2(targ.y, targ.x) * Mathf.Rad2Deg + up;
transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(new Vector3(0, 0, angle)), 0.05f);
transform.position += transform.up * movingSpeed;
}
float t2 =0;
bool isHunting=false;
void CheckAndUpdateTarget(){
bool skip = false;
if(curTarget != null){
if(curTarget.gameObject.activeSelf){
if(t2 < 5){
t2+=Time.deltaTime;
}else{
if(Vector3.Distance(transform.position, curTarget.position) < 7){
skip = true;
}
t2=0;
}
if(!skip){return;}
}
}
SpaceshipController[] players = FindObjectsOfType<SpaceshipController>();
foreach(SpaceshipController player in players){
if(BotsHiveMind.LeasePlayer(player, this)){
curTarget = player.transform;
isHunting=true;
return;
break;
}
}
bool foundItem = false;
while(!foundItem){
List<PickupItem> randomSet= MinigameManager.instance.pickupItems[Random.Range(1,MinigameManager.instance.pickupItems.Length)].Active;
PickupItem randomPickup = randomSet[Random.Range(0,randomSet.Count)];
if(Vector3.Distance(Vector3.zero, randomPickup.transform.position) < MinigameManager.instance.mapRadius){
curTarget = randomPickup.transform;
foundItem=true;
isHunting=false;
}
}
}
public void TrailCollided(Collider2D hit){
if(!isServer){return;}
SpaceshipController deadPlayer = hit.GetComponent<SpaceshipController>();
// Debug.Log("got hit by player? : " + (deadPlayer != null));
if (deadPlayer != null && !deadPlayer.dead && (NetworkTime.time - deadPlayer.startedTime) > 5)
{ // <-- okay we killed someone | KILLCODE
// deadPlayer.RpcShowDeathEffect(deadPlayer.transform.position);
deadPlayer.Die(pname);
if(BotsHiveMind.Leased.ContainsKey(deadPlayer)){
if(BotsHiveMind.Leased[deadPlayer] == this){
curTarget=null;
isHunting=false;
}
}
Debug.Log($"{pname} killed {deadPlayer.pname}");
return;
}
SpaceshipNetworkBot deadBot = hit.GetComponent<SpaceshipNetworkBot>();
// Debug.Log("got hit by bot? : " + (deadPlayer != deadBot));
if(deadBot != null){
deadBot.Die();
return;
}
}
[SyncVar (hook = nameof(OnTrailTimeChanged))]
private float m_trailTime;
public float maxTrailTime;
public float minTrailTime;
public float trailIncrementRate = 0.1f;
public float trailTime{get{return m_trailTime;} set{
m_trailTime = Mathf.Clamp(value, minTrailTime,maxTrailTime);
trailMgr.trail.time = m_trailTime;
}}
void OnTrailTimeChanged(float oldTime, float newTime){
trailMgr.trail.time = newTime;
}
public void CollectPickup(PickupItem.PickupType type){
trailTime += trailIncrementRate;
if(type.ToString().ToLower().Contains("moon")){
Scores+=2;
}else{
Scores++;
}
}
public void Die(){
int leftoverAmount = (int)((float)Scores/4f);
Debug.Log("Bot " + pname + " Left " + leftoverAmount + " Stars");
MinigameManager.instance.SpawnLeftoverPickups(transform.position, leftoverAmount);
MinigameManager.instance.DestroyBot(this);
return;
RpcDie(transform.position);
Scores = 0;
trailTime = 0;
trailMgr.trail.time=0;
transform.position = MinigameManager.getRandomPointInCirlce(Vector3.zero, 150);
StartCoroutine(die());
}
[ClientRpc]
void RpcDie(Vector3 position){
EffectPool.Spawn(DeathEffect, position);
trailMgr.trail.time=0;
trailMgr.trail.enabled=false;
StartCoroutine(die());
}
IEnumerator die(){
yield return new WaitForSeconds(0.5f);
trailTime = 0;
trailMgr.trail.enabled =true;
}
}
public static class BotsHiveMind{
private static string[] Names= {"Andrew Joe", "Dragon Fire", "Doom Killer", "Ice Killer", "Drake Ronin", "Turbo Skull", "Decay", "Fester Flack", "El Diablo", "Rubble r", "Hank 95", "Zer0", "War-lord",
"Wraith", "Knuckles U", "iKill U", "iSteal", "Bull3t", "Tito 97", "Jurgen", "Tobias 37", "Mia M", "Luca 43", "Aditya 101", "Abu B", "Ahmad Cipta", "Harta Ismaya", "Yuda_333"};
private static List<string> ActiveNames;
private static List<string> PooledNames;
public static string LeaseName(string borrowedName = null){
if(ActiveNames == null) { ActiveNames = new List<string>();}
if(PooledNames == null){ PooledNames = new List<string>(Names);}
//Return borrowed name to the list
if(borrowedName!=null){
ActiveNames.Remove(borrowedName);
PooledNames.Add(borrowedName);
}
//Borrow a new name
string chosenName = PooledNames[Random.Range(0,PooledNames.Count)];
PooledNames.Remove(chosenName);
ActiveNames.Add(chosenName);
return chosenName;
}
public static void ReturnName(string name){
PooledNames.Add(name);
ActiveNames.Remove(name);
}
private static Dictionary<SpaceshipController, SpaceshipNetworkBot> leased = new Dictionary<SpaceshipController, SpaceshipNetworkBot>();
public static Dictionary<SpaceshipController, SpaceshipNetworkBot> Leased {
get{
if(leased == null){ leased = new Dictionary<SpaceshipController, SpaceshipNetworkBot>();}
return leased;
}
}
public static bool LeasePlayer(SpaceshipController player, SpaceshipNetworkBot bot){
if(leased.ContainsKey(player)){//Player's already leased
if(leased[player].curTarget == player.transform){
return false;
}else{
leased.Remove(player);
}
}
leased.Add(player,bot);
return true;
}
public static void RetrunPlayer(SpaceshipController player){
if(leased.ContainsKey(player)){
leased.Remove(player);
}
Debug.Log("Trying to return a player to hive mind pool. But no one was borrowing them");
}
}
[Serializable]
public class BotSetup{
public float minSpeed;
public float maxSpeed;
public Sprite[] skins;
[Range(0,100)]
public int rarity;
}