public void request(GameObject friend)//заявка на дружбу { print(gameObject + "получил заявку от " + friend.name); if (Random.Range(0, 10) < sociability) //принимаем { if (clan == null) //если пришла заявка, а мы не в клане { print(gameObject + "не в клане, обнуляем его и добавляем"); if (friend.GetComponent <CleverAI>().clan == null) //приславший заявку не состоит в клане, но хочет создать свой { clan = new Clan(friend); //в этом случае создаем для него клан friend.GetComponent <CleverAI>().clan = clan; //записываем для него его же клан } clan = friend.GetComponent <CleverAI>().clan; //и только теперь добавляемся в его клан ResetAllTasks(gameObject); clan.AddToClan(gameObject); Creator.ChangeInClans(); } else//мы уже в клане и пришла заявка от игрока без клана { print(gameObject + "добавляем в свой клан" + friend.name + "и обнуляет"); CleverAI cleverfriend = GetComponent <CleverAI>(); cleverfriend.clan = clan;//и только теперь добавляем его в наш клан ResetAllTasks(friend); clan.AddToClan(friend); Creator.ChangeInClans(); } } }
public void GetEnemy(GameObject newenemy) //рядом враг { // Debug.Log(gameObject.name + "see the" + newenemy.name); if (state != State.dead && anim != null)//если не мертвый и подключился аниматор { if (friend != newenemy) { int newenemypriority;//приоритет нового врага if (newenemy.tag == "Player") { newenemypriority = 6; //у игрока приоритет всегда 6 } else { newenemypriority = newenemy.GetComponent <Behavior>().priority; //узнаем приоритет нового врага } bool changenemy = false; //будем ли менять врага if (enemy != null) //определяем, будем ли менять врага, если уже есть взаимодействие { int oldpriority; if (enemy.tag == "Player") { oldpriority = 6; } else { oldpriority = enemy.GetComponent <Behavior>().priority; } if (newenemypriority > oldpriority) { changenemy = true; } if (newenemy.gameObject.name != enemy.gameObject.name) { // Debug.Log("write enemy in memory for:"+gameObject.name+" oldenemy: " + enemy.gameObject.name + "newenemy: " + newenemy.gameObject.name); if (changenemy) { enemyinmemory = enemy; //если враг будет менятся запомним, что он тоже рядом } else { enemyinmemory = newenemy;//если враг был проигнорирован из-за приоритета, но запомним, что он тоже рядом } } } if (enemy == null || changenemy) { bool addenemy = false; //добавить ли врага после проверки условий bool friendly = false; // Debug.Log("About friendly!" + priority + newenemypriority); if (priority == 6 && newenemypriority == 6) { if (clan != null) //мы в клане { if (newenemy.tag == "Player") //мы втретили игрока { if (clan.Leader == newenemy) { friendly = true; Debug.Log(gameObject.name + "я уже был в клане игрока"); } else { Debug.Log(gameObject.name + "я не в клане игрока"); } } else if (newenemy.GetComponent <Behavior>().clan != null)//мы встретили не игрока { if (newenemy.GetComponent <Behavior>().clan == clan) { friendly = true; Debug.Log(gameObject.name + "я в том же клане, что и этот аи"); } else { Debug.Log(gameObject.name + "я в другом клане"); } } else//т.е. мы в клане, а он - нет { if (Random.Range(0, 3) != 0) { if (newenemy.GetComponent <Behavior>().enemy != null) //у нашего объекта есть враг { if (newenemy.GetComponent <Behavior>().enemy.tag == "Player") //если враг объекта игрок { if (clan.Leader.name == "Player") { friendly = false; //и мы в клане игрока } else { friendly = true; } } else if (newenemy.GetComponent <Behavior>().enemy.GetComponent <Behavior>().clan != clan) { friendly = true; //если встретили объект с врагом не из нашего клана } } else { friendly = true; } //добавить в клан!!! if (friendly) { clan.AddToClan(newenemy); Debug.Log(gameObject.name + "я возьму его в свой клан"); } else { Debug.Log("он враждует с моим кланом!"); } } else { Debug.Log(gameObject.name + "я не возьму его в свой клан"); } } } else//мы не в клане { if (newenemy.tag == "Player")//мы встретили игрока { if (Random.Range(0, 3) != 0) { friendly = true;//присоединть к клану игрока clan = newenemy.GetComponent <PlayerMove>().ClanOfPlayer; clan.AddToClan(gameObject); Debug.Log(gameObject.name + "Я хочу в клан игрока!"); } else { Debug.Log(gameObject.name + "я не хочу в клан игрока"); } } else if (newenemy.GetComponent <Behavior>().clan != null)//встретили не игрока уже в клане { if (Random.Range(0, 3) != 0) { friendly = true;//присоединиться к клану другого аи clan = newenemy.GetComponent <Behavior>().clan; clan.AddToClan(gameObject); Debug.Log(gameObject.name + "я пойду в клан этого аи"); if (enemy != null) { if (enemy.tag != "Player") { if (enemy.GetComponent <Behavior>().clan != null) { if (enemy.GetComponent <Behavior>().clan == newenemy.GetComponent <Behavior>().clan) { enemy = null; } } } else if (enemy.GetComponent <PlayerMove>().ClanOfPlayer == clan) { enemy = null; } } } else { Debug.Log(gameObject.name + "я не пойду в клан этого аи"); } } else //мы оба не в кланах { if (Random.Range(0, 3) != 0) { friendly = true; clan = new Clan(gameObject); Creator.ChangeInClans(); Debug.Log(gameObject.name + "Мы сформируем новый клан!"); } else { Debug.Log(gameObject.name + "не будем формировать новый клан"); } } } //Debug.Log("About friendly!" + priority + newenemypriority); if (friendly)//если решили дружить { if (priority == 6) { //Debug.Log("FRIENDLY! " + gameObject.name); friend = newenemy; anim.SetBool("Attack", false); anim.SetTrigger("Hello"); if (friend.tag == "Player")//добавляемся в клан игрока { nav.ResetPath(); state = State.friend; StopAllCoroutines(); } // else if (friend.GetComponent<Behavior>().state != State.friend) else if (clan.Leader != gameObject)//если мы не лидер клана { nav.ResetPath(); state = State.friend; StopAllCoroutines(); } } } } if (!friendly) { if (CreatorRef.Response(6, 6) == 1) //запрос к создателю о нападении, если true - нападаем { anim.SetBool("Attack", false); //перестаем атаковать if (priority == 5) { anim.SetBool("Eating", false); //перестаем ксть } state = State.runfor; //указываем состояние бега transform.LookAt(newenemy.transform.position); //разворачиваем сначала к игроку addenemy = true; } else if (newenemypriority > 4) //если не нападаем и его приоритет выше 4 - убегаем { if (state == State.eat || state == State.attack) //если в это время ели или сражались с кем-то { StopAllCoroutines(); //останавливаем все процессы anim.SetBool("Attack", false); //перестаем атаковать if (priority == 5) { anim.SetBool("Eating", false); } } state = State.runfrom; //указываем состояние бега transform.rotation = Quaternion.Euler(newenemy.transform.rotation.eulerAngles.x, newenemy.transform.rotation.eulerAngles.y, newenemy.transform.rotation.eulerAngles.z); //бежим туда, куда направлен и враг addenemy = true; //указываем, что враг будет добавлен } if (enemy == null && gameObject.tag == "Player") { addenemy = true; //если запрос пришел на игрока и у него небыло сопряженных врагов - добавляем } if (addenemy) //если добавляем врага { enemy = newenemy.gameObject; //записываем врага if (enemy.tag == "Player") { enemy.GetComponent <PlayerMove>().associated = gameObject; } // else enemy.GetComponent<Behavior>().GetEnemy(gameObject);//оповещаем о присоединении !!!попробуем НЕ ОПОВЕЩАТЬ!!! StopAllCoroutines(); //останавливаем корутины (т.к. есть возможность входа в триггер во время ожидания) nav.speed = Random.Range(5, 8); //включаем высокую скорость anim.SetBool("Walk", false); //выключаем ходьбу anim.SetBool("Run", true); //переключаем анимацию в бег } } } // else StartCoroutine(Wait()); } } }