示例#1
0
    private void SpawnMonster(Vector2Int position, Tile tile)
    {
        GameObject     monsterObject = Instantiate(m_monsterPrefab, tile.Sprite.transform.position, Quaternion.identity);
        NetworkMonster monster       = monsterObject.GetComponent <NetworkMonster>();

        monster.MonsterIndex = m_monsters.GetRandomMonsterIndex();
        NetworkServer.Spawn(monsterObject);
        m_map.AddMonsterAtPosition(monster, position);
    }
示例#2
0
 private void PerformMonsterAttack(NetworkMonster monster, Vector2Int targetPosition, List <NetworkPlayer> players)
 {
     foreach (NetworkPlayer player in players)
     {
         if (player.Position == targetPosition)
         {
             InflictDamageOnPlayer(Damage.GetDamage(monster.Damage), player);
             return;
         }
     }
 }
示例#3
0
    private void MoveMonsters()
    {
        Dictionary <Vector2Int, NetworkMonster> monsters            = Map.I.Monsters;
        Dictionary <Vector2Int, NetworkMonster> newMonsterPositions = new Dictionary <Vector2Int, NetworkMonster>(monsters);
        List <NetworkPlayer> players = m_networkManager.ClientPlayers.Values.ToList();

        foreach (KeyValuePair <Vector2Int, NetworkMonster> entry in monsters)
        {
            Vector2Int        currentPosition = entry.Key;
            NetworkMonster    monster         = entry.Value;
            List <Vector2Int> targetTiles     = new List <Vector2Int>();
            MonsterAction     action          = MonsterAction.Wait;

            for (int i = 0; i < m_directions.Length; ++i)
            {
                Vector2Int    targetTile = currentPosition + m_directions[i];
                MonsterAction tempAction = GetMonsterAction(targetTile, newMonsterPositions, players);

                if (tempAction == MonsterAction.Move)
                {
                    action = tempAction;
                    targetTiles.Add(targetTile);
                }
                else if (tempAction == MonsterAction.Attack)
                {
                    action = tempAction;
                    targetTiles.Clear();
                    targetTiles.Add(targetTile);
                    break;
                }
            }

            if (action == MonsterAction.Wait)
            {
                continue;
            }

            if (action == MonsterAction.Attack)
            {
                PerformMonsterAttack(monster, targetTiles[0], players);
            }

            else
            {
                Vector2Int targetTile = targetTiles[Random.Range(0, targetTiles.Count)];
                newMonsterPositions.Add(targetTile, monster);
                monster.RpcMove(targetTile);
                newMonsterPositions.Remove(currentPosition);
            }
        }

        Map.I.Monsters = newMonsterPositions;
    }
示例#4
0
    private bool HandlePossibleMonsterAtTargetPosition(Vector2Int targetPosition)
    {
        NetworkMonster monster = m_map.GetMonsterAtPosition(targetPosition);

        if (monster == null)
        {
            return(false);
        }
        NetworkHealth monsterHealth = monster.Health;
        int           damage        = Damage.GetDamage(m_attack);

        monsterHealth.TakeDamage(damage);
        RpcDisplayDamage(damage, monster.transform.position);
        if (monsterHealth.IsDead())
        {
            m_map.RemoveMonsterAtPosition(targetPosition);
            NetworkServer.Destroy(monster.gameObject);
        }
        return(true);
    }
示例#5
0
 public void AddMonsterAtPosition(NetworkMonster monster, Vector2Int position)
 {
     AddAtPosition(Monsters, monster, position);
 }