示例#1
0
    // Init and spawn anything in preperation for update job state
    public override bool OnStartJob()
    {
        // Clean up old inventories if they are currently open ( This may need adjusting given multiple inventories could be accessed on the same tick )
        GameController.Instance.crewTargetDirection.ForceCleanupMenu();
        GameController.Instance.crewTargetDirection.ForceCleanUpInventories();

        if (directedToTarget & character)
        {
            character.inventory.SetOpen(true);

            // Clean up opened DIRECTED TO inventory panel ON ARRIVAL JOB
            switch (directedToTarget.TargetSelectionProfile.selectionType)
            {
            case SelectionType.Character:
                SelectableCharacter character = directedToTarget as SelectableCharacter;

                character.inventory.SetOpen(true);
                break;

            case SelectionType.Container:
                SelectableContainer container = directedToTarget as SelectableContainer;

                container.container.SetOpen(true);
                break;
            }

            return(true);
        }

        return(false);
    }
示例#2
0
 public void SetCharacter(SelectableCharacter selectableCharacter)
 {
     foreach (SelectableCharacter character in selectableCharacters)
     {
         character.go.SetActive(character == selectableCharacter);
     }
 }
 internal void SetTargetCharacter(SelectableCharacter character)
 {
     playerSelectionTargetUI.transform.position = character.transform.position;
     playerSelectionUI.ChangeToSelectedCharacter(character);
     targetCharacter = character;
     canSelect       = false;
     remainingTimeBeforeNextSelectionMoveIsAllowed = SELECTIONTIMER;
 }
示例#4
0
    /// <summary>
    /// Возвращает ближайшего к myChar персонажа типа SelectableCharacter
    /// путем перебора сначала по близости на оси X, а затем выбирая ближайшего из них по оси Z
    /// </summary>
    /// <param name="myChar"></param>
    /// <returns></returns>
    SelectableCharacter FindClosestEnemy(SelectableCharacter myChar)
    {
        float closestEnemyDistanceX      = Mathf.Infinity;                               // приравняли в рекорд бесконечность
        SelectableCharacter closestEnemy = null;                                         // приравняли что нету клозеста

        List <SelectableCharacter> closestEnemiesByX = new List <SelectableCharacter>(); //массив перебора ближайших по Х


        var otherCharacters = FindObjectsOfType <SelectableCharacter>(); //найдем всех персонажей

        foreach (SelectableCharacter otherChar in otherCharacters)
        {
            if (otherChar.characterSheet.teamId == myChar.characterSheet.teamId) //пропускаем персонажей своей команды
            {
                continue;
            }


            var newAttackVector = (otherChar.gameObject.transform.position - myChar.gameObject.transform.position); //получим вектор направленный от нашего персонажа на врага - на того которого мы перебираем

            var distance = Mathf.Abs(Mathf.Round(newAttackVector.x));                                               //дистанция до перебираемого врага. мы ещё и округляем


            if (distance < closestEnemyDistanceX) //наиболее близкого запишем
            {
                closestEnemiesByX.Clear();        //очистим список ближайших

                closestEnemyDistanceX = distance; //наименьшая дистанция по X теперь такая

                closestEnemy = otherChar;         //ближайший враг

                closestEnemiesByX.Add(otherChar); //он лишь один среди ближайших по оси Х
            }
            else if (distance == closestEnemyDistanceX)
            {
                closestEnemiesByX.Add(otherChar); //другие враги столь же близкие по оси Х добавляем в массив
            }
        }
        Debug.Log("Число врагов в ближайшем не пустом ряду " + closestEnemiesByX.Count);

        var closestEnemyDistanceZ = Mathf.Infinity;

        //найдем ближайнего по Z из тех, кто в ближайшем непустом ряду по X
        foreach (var enemy in closestEnemiesByX)
        {
            var   newAttackVector = (enemy.gameObject.transform.position - myChar.gameObject.transform.position);
            float distance        = Mathf.Abs(newAttackVector.z);

            if (distance <= closestEnemyDistanceZ)
            {
                closestEnemyDistanceZ = distance;
                closestEnemy          = enemy;
            }
        }

        return(closestEnemy);
    }
    public void OnCharacterPointerExited(SelectableCharacter clickedCharacter)
    {
        var selectedAbility = abilityBar.getSelectedAbility();

        if (selectedAbility != null)
        {
            selectedAbility.DisableAimingEffect();
        }
    }
示例#6
0
    bool CanBeAppliedDistanceCheck(SelectableCharacter myChar, SelectableCharacter targetChar) //Проверка применяемости по дистанции
    {
        bool result = false;

        switch (distanceType)
        {
        case DISTANCE_TYPE.MELEE:
            result = true;
            var attackVector = (targetChar.gameObject.transform.position - myChar.gameObject.transform.position);
            var distance     = attackVector.magnitude;

            if (distance <= MaxUseDistance)
            {
                //Если цель находится в радиусе, значит можем бить всегда
                //Debug.Log("Can attack in radius " + distance);
            }
            else
            {
                var onTheWay = AllyOnTheWay(myChar);
                if (onTheWay == true)
                {
                    result = false;
                }
                else
                {
                    //Если цель делеко, то проверим, нет ли кого-то ближе
                    var closestEnemy = FindClosestEnemy(myChar);
                    if (closestEnemy != targetChar)
                    {
                        result = false;

                        if (Mathf.Round(closestEnemy.transform.position.x) == Mathf.Round(targetChar.transform.position.x))
                        {
                            if (Mathf.Abs(targetChar.transform.position.z - myChar.transform.position.z) <= MaxUseDistance)
                            {
                                result = true;
                            }
                        }

                        //Debug.LogWarning("Can't attack, closest enemy is " + closestEnemy.gameObject.name);
                    }
                }
            }
            break;

        case DISTANCE_TYPE.RANGED:
            result = true;
            break;

        case DISTANCE_TYPE.MAGICAL:
            result = true;
            break;
        }
        return(result);
    }
    public void SetTarget(SelectableTarget currentTarget)
    {
        // Disable character target line renderer
        if (this.currentTarget != null)
        {
            // Destroy the old selection world radial menu
            if (WorldUIRadial.Instance != null)
            {
                Destroy(WorldUIRadial.Instance.gameObject);
            }

            switch (this.currentTarget.TargetSelectionProfile.selectionType)
            {
            case SelectionType.Character:
            {
                SelectableCharacter character = (SelectableCharacter)(this.currentTarget);
                character.pathTracer.SetNavPathTrace(false);
                character.inventory.SetOpen(false);
            }
            break;

            case SelectionType.Container:
            {
                SelectableContainer container = (SelectableContainer)(this.currentTarget);
                container.container.SetOpen(false);
            }
            break;
            }

            GameController.Instance.crewTargetDirection.ForceCleanupMenu();
            GameController.Instance.crewTargetDirection.ForceCleanUpInventories();
        }

        // Set the new target
        this.currentTarget = currentTarget;

        // If character, turn on line renderer
        // Disable character target line renderer
        if (this.currentTarget != null)
        {
            WorldUIRadial radialMenu = Instantiate(worldUIMenuPrefab, GameController.Instance.selectionDisplay.transform).GetComponent <WorldUIRadial>();
            radialMenu.Init(currentTarget);

            switch (this.currentTarget.TargetSelectionProfile.selectionType)
            {
            case SelectionType.Character:
            {
                ((SelectableCharacter)(this.currentTarget)).pathTracer.SetNavPathTrace(true);
            }
            break;
            }
        }
    }
    public bool DoTargetSearch(Vector3 WSMousePos, SelectableCharacter selectedDirecting)
    {
        ForceCleanupMenu();

        this.selectedDirecting = selectedDirecting;

        Vector2 mousePos2D = new Vector2(WSMousePos.x, WSMousePos.y);

        RaycastHit2D[] hits = Physics2D.RaycastAll(mousePos2D, Vector2.zero);

        targets = new List <SelectableTarget>();

        bool clicked = false;

        if (hits.Length > 0)
        {
            foreach (RaycastHit2D hit in hits)
            {
                // Check hit targets for selectables
                SelectableTarget targetCandidate = hit.collider.GetComponent <SelectableTarget>();

                if (targetCandidate != GameController.Instance.targetSelection.CurrentTarget)
                {
                    if (targetCandidate != null)
                    {
                        // Add candidate to new track list
                        if (targetCandidate.TargetSelectionProfile.selectionType == SelectionType.Character || targetCandidate.TargetSelectionProfile.selectionType == SelectionType.Container)
                        {
                            clicked = true;

                            targets.Add(targetCandidate);
                        }
                    }
                }
            }

            // Found containers and characters to add as direction options
            if (targets.Count > 0)
            {
                // Open details options menu
                directionOptionsPanel = GameController.Instance.panelController.AddPanel(PanelType.DirectionOptions, "Interact with");

                directionOptionsPanel.transform.position = Input.mousePosition;

                Vector3 screenPos = GameController.Instance.mainCamera.WorldToScreenPoint(targets[0].transform.position);

                ((DirectionOptionsMenu)directionOptionsPanel).InitMenu(targets);
            }
        }

        return(clicked);
    }
示例#9
0
 private void SetUpHotbar(SelectableCharacter character, GameObject hotbar)
 {
     Button[] buttons = hotbar.GetComponentsInChildren <Button>();
     buttons[0].onClick.AddListener(delegate {
         ButtonTask(character, 0);
     });
     buttons[1].onClick.AddListener(delegate {
         ButtonTask(character, 1);
     });
     buttons[2].onClick.AddListener(delegate {
         ButtonTask(character, 2);
     });
 }
示例#10
0
    // Update is called once per frame
    void Update()
    {
        if (selectManager.GetNumSelected() == 1)
        {
            hotbar.SetActive(true);
            GameObject          currHotbar = null;
            SelectableCharacter currChar   = null;
            if (meleeChar != null && meleeChar.GetSelected())
            {
                currHotbar = meleeHotbar;
                currChar   = meleeChar;
                rangedHotbar.SetActive(false);
            }
            else if (rangedChar != null && rangedChar.GetSelected())
            {
                currHotbar = rangedHotbar;
                currChar   = rangedChar;
                meleeHotbar.SetActive(false);
            }

            if (currChar != null && currHotbar != null)
            {
                currHotbar.SetActive(true);

                Ability[] abilities = currChar.GetAbilities();
                for (int i = 0; i < abilities.Length; i++)
                {
                    Ability ability = abilities[i];
                    if (ability.Cooldown() > 0)
                    {
                        GameObject abilityCd = currHotbar.transform.GetChild(i).GetChild(0).gameObject;
                        abilityCd.SetActive(true);
                        abilityCd.transform.GetComponentInChildren <Text>().text = ability.Cooldown() + "";
                    }
                    else
                    {
                        currHotbar.transform.GetChild(i).GetChild(0).gameObject.SetActive(false);
                    }
                }
            }
            else
            {
                hotbar.SetActive(false);
            }
        }
        else
        {
            hotbar.SetActive(false);
        }
    }
示例#11
0
        protected override void Process(IClient client, CListEnd packet)
        {
            LoginOption         option    = client.GetOption <LoginOption>();
            SelectableCharacter character = option.SelectableCharacters.FirstOrDefault(x => option.CharacterSelector.Invoke(x));

            if (character == null)
            {
                Logger.Error("Can't found character matching predicate");
                return;
            }

            client.SendPacket($"select {character.Slot}");
            Logger.Debug($"Character {character.Name} selected");
        }
示例#12
0
    bool CanBeAppliedDistanceCheck(SelectableCharacter myChar, SelectableCharacter targetChar)
    {
        bool result   = false;
        var  distance = (myChar.gameObject.transform.position - targetChar.gameObject.transform.position).magnitude;

        if (distance <= MaxUseDistance)
        {
            switch (distanceType)
            {
            case DISTANCE_TYPE.MELEE:
                result = true;
                var        rayStart = myChar.GetComponent <Collider>().bounds.center;
                var        ray      = new Ray(rayStart, targetChar.GetComponent <Collider>().bounds.center - rayStart);
                RaycastHit hitInfo;
                if (Physics.Raycast(ray, out hitInfo, MaxUseDistance))
                {
                    Debug.DrawLine(ray.origin, hitInfo.point, Color.red, 1.0f);
                    if (hitInfo.collider.gameObject == targetChar.gameObject)
                    {
                        result = true;
                    }
                    else
                    {
                        result = false;
                        Debug.Log(myChar.name + "CAN'T perform MELEE attack to " + targetChar.name + " due to occlusion");
                    }
                }
                else
                {
                    Debug.DrawRay(ray.origin, ray.direction, Color.green, 1.0f);
                }
                break;

            case DISTANCE_TYPE.RANGED:
                result = true;
                break;

            case DISTANCE_TYPE.MAGICAL:
                result = true;
                break;
            }
        }
        else
        {
            Debug.Log(myChar.name + "CAN'T perform attack to " + targetChar.name + " due to DISTANCE: " + distance + ">" + MaxUseDistance);
            result = false;
        }
        return(result);
    }
示例#13
0
 private void SetUp()
 {
     boxStartPosition = Vector3.zero;
     boxEndPosition   = Vector3.zero;
     selectableChars  = FindObjectsOfType <SelectableCharacter>();
     if (selectableChars[0].GetComponent <RangedPlayerScript>() != null)
     {
         SelectableCharacter temp = selectableChars[0];
         selectableChars[0] = selectableChars[1];
         selectableChars[1] = temp;
     }
     mainCamera       = Camera.main;
     mainCameraScript = mainCamera.GetComponent <CameraScript>();
     numSelected      = 0;
     overButton       = false;
 }
示例#14
0
    public void UseAbility(ref Ability ability, SelectableCharacter targetCharacter) //ссылка на конкретную применяемую абилку, потом пишем когда надо - если что-то то юз абилити
    {
        if (ability == null || string.IsNullOrEmpty(ability.name))                   // если абюилки нет или её имя не задано
        {
            Debug.LogWarning("No ability was selected to use", gameObject);          // то тогда сообщение об ошибке
            return;
        }

        if (targetCharacter == null)
        {
            Debug.LogWarning("No targetCharacter was selected to use onto", gameObject);
            return;
        }

        Debug.Log(name + " used ability " + ability.name + " on " + targetCharacter.name, this);

        ability.ApplyEffectTo(targetCharacter.gameObject);
    }
示例#15
0
    public void OnCharacterPointed(SelectableCharacter pointedCharacter)
    {
        Debug.Log("pointed " + pointedCharacter.name);
        var selectedAbility = abilityBar.getSelectedAbility();

        if (selectedAbility != null)
        {
            if (selectedAbility.CanBeAppliedTo(pointedCharacter.gameObject))
            {
                //Debug.Log("abilityBar.selectedAbility " + abilityBar.getSelectedAbility().name + " CAN be applied to " + pointedCharacter.name);
                selectedAbility.CreateAimingEffect(pointedCharacter.gameObject);
            }
            else
            {
                Debug.Log("abilityBar.selectedAbility " + abilityBar.getSelectedAbility().name + " CAN'T be applied to " + pointedCharacter.name);
            }
        }
    }
示例#16
0
    public void OnCharacterWasClicked(SelectableCharacter clickedCharacter)
    {
        //Debug.Log("OnCharacterWasClicked "+character);

        if (clickedCharacter.characterSheet.teamId == 0)
        {
            selectedCharacter = clickedCharacter;
            Debug.Log("selectedCharacter: " + selectedCharacter, selectedCharacter);
        }
        else
        {
            if (selectedCharacter != null)
            {
                var ability = abilityBar.getSelectedAbility();
                selectedCharacter.UseAbility(ref ability, clickedCharacter);
            }
        }
    }
示例#17
0
    void ShowAbilityBar(SelectableCharacter character)
    {
        if (abilityBar == null)
        {
            Debug.LogError("abilityBar was not set properly!", gameObject);
            enabled = false;
            return;
        }

        if (character != null)
        {
            abilityBar.gameObject.SetActive(true);
            abilityBar.ShowAbilities(character.abilities);
        }
        else
        {
            abilityBar.gameObject.SetActive(false);
        }
    }
示例#18
0
    bool AllyOnTheWay(SelectableCharacter myChar)
    {
        bool allyOnTheWay    = false;
        var  otherCharacters = FindObjectsOfType <SelectableCharacter>(); //найдем всех персонажей

        foreach (SelectableCharacter otherChar in otherCharacters)
        {
            if (otherChar.characterSheet.teamId == myChar.characterSheet.teamId)
            {
                var oneStep = myChar.transform.position.x + 0.1f;
                if (otherChar.transform.position.x >= oneStep)
                {
                    allyOnTheWay = true;
                    break;
                }
            }
        }
        return(allyOnTheWay);
    }
示例#19
0
    public void OnCharacterWasClicked(SelectableCharacter clickedCharacter) //При клике на чара если он в нашей тиме то селектед станеи им
    {
        //Debug.Log("OnCharacterWasClicked "+character);

        if (clickedCharacter.characterSheet.teamId == 0)
        {
            selectedCharacter = clickedCharacter;
            Debug.Log("selectedCharacter: " + selectedCharacter, selectedCharacter);
        }
        else
        {
            if (selectedCharacter != null)
            {
                var ability = abilityBar.getSelectedAbility();
                if (ability.CanBeAppliedTo(clickedCharacter.gameObject))
                {
                    selectedCharacter.UseAbility(ref ability, clickedCharacter);
                }
            }
        }
    }
示例#20
0
    bool CanBeAppliedTypeCheck(SelectableCharacter myChar, SelectableCharacter targetChar) //Проверка применяемости по типу (враги-союзники)
    {
        switch (targetType)
        {
        case TARGET_TYPE.ALL:
            return(true);

        case TARGET_TYPE.ALLIES:

            if (myChar != null && myChar.characterSheet.teamId == targetChar.characterSheet.teamId)
            {
                return(true);
            }
            return(false);

        case TARGET_TYPE.FOES:

            if (myChar != null && myChar.characterSheet.teamId != targetChar.characterSheet.teamId)
            {
                return(true);
            }
            return(false);

        case TARGET_TYPE.SELF:
            if (myChar == targetChar)
            {
                return(true);
            }
            return(false);

        case TARGET_TYPE.OBJECTS:
            if (targetChar == null)
            {
                return(true);
            }
            return(false);
        }
        return(true);
    }
示例#21
0
    public void UseAbility(ref Ability ability, SelectableCharacter targetCharacter)
    {
        if (ability == null || string.IsNullOrEmpty(ability.name))
        {
            Debug.LogWarning("No ability was selected to use", gameObject);
            return;
        }

        if (targetCharacter == null)
        {
            Debug.LogWarning("No targetCharacter was selected to use onto", gameObject);
            return;
        }

        Debug.Log(name + " used ability " + ability.name + " on " + targetCharacter.name, this);

        //if (ability.effectPrefab != null)
        //{
        //    GameObject.Instantiate(ability.effectPrefab, targetCharacter.transform);
        //}
        ability.ApplyEffectTo(targetCharacter.gameObject);
    }
    public void ForceCleanUpInventories()
    {
        if (directedTo.Count > 0)
        {
            foreach (SelectableTarget directables in directedTo)
            {
                // Clean up opened DIRECTED TO inventory panel
                switch (directables.TargetSelectionProfile.selectionType)
                {
                case SelectionType.Character:
                    SelectableCharacter character = directables as SelectableCharacter;

                    character.inventory.SetOpen(false);
                    break;

                case SelectionType.Container:
                    SelectableContainer container = directables as SelectableContainer;

                    container.container.SetOpen(false);
                    break;
                }
            }
        }
    }
示例#23
0
    public void TryOpenSelection()
    {
        SelectableTarget currentTarget = GameController.Instance.targetSelection.CurrentTarget;

        if (currentTarget != null)
        {
            switch (currentTarget.TargetSelectionProfile.selectionType)
            {
            case SelectionType.Character:
            {
                SelectableCharacter character = (SelectableCharacter)currentTarget;
                character.inventory.SetOpen(true);
            }
            break;

            case SelectionType.Container:
            {
                SelectableContainer container = (SelectableContainer)currentTarget;
                container.container.SetOpen(true);
            }
            break;
            }
        }
    }
示例#24
0
    // Update is called once per frame
    void Update()
    {
        bool  overBar;
        Panel panelHover = GameController.Instance.panelController.TestOverPanel(out overBar);

        if (panelHover != null)
        {
            panelHover.OnPanelHover();
        }

        // Left click try and select target
        if (Input.GetMouseButtonDown(0))
        {
            // hoverring main panel and clicked, bring to front
            if (panelHover != null)
            {
                GameController.Instance.panelController.BringToFront(panelHover);

                if (overBar) // Clicked a drag bar of panel
                {
                    GameController.Instance.panelController.StartDrag();
                }
                else // Clicked a window of panel
                {
                    panelHover.OnPanelClick();
                }
            }
            else
            {
                Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

                if (!GameController.Instance.selectionDisplay.TestSelectionButtons()) // Test if clicked selection buttons
                {
                    // Test if clicked radial menu
                    bool          radialClicked       = false;
                    WorldUIRadial radialMenuCandidate = WorldUIRadial.Instance;
                    if (radialMenuCandidate != null)
                    {
                        radialClicked = radialMenuCandidate.TestWorldClickButtons();
                    }

                    if (!radialClicked)
                    {
                        GameController.Instance.targetSelection.DoTargetSearch(mousePos);
                    }
                }
            }
        }

        if (!Input.GetMouseButton(0))
        {
            GameController.Instance.panelController.ForceStopDrag();
        }

        // Left mouse button UP do release logic on target window
        if (Input.GetMouseButtonUp(0))
        {
            // hoverring main panel and released, bring to front
            if (panelHover != null)
            {
                GameController.Instance.panelController.BringToFront(panelHover);

                if (!overBar) // Released on main window, not bar
                {
                    panelHover.OnPanelReleaseClick();
                }
            }
        }

        // Right click, direct selected character to target location
        if (Input.GetMouseButtonDown(1))
        {
            SelectableTarget currentTarget = GameController.Instance.targetSelection.CurrentTarget;

            if (currentTarget != null)
            {
                switch (currentTarget.TargetSelectionProfile.selectionType)
                {
                case SelectionType.Character:
                {
                    SelectableCharacter character = (SelectableCharacter)currentTarget;

                    Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                    if (!GameController.Instance.crewTargetDirection.DoTargetSearch(mousePos, character))
                    {
                        character.playerCrewAI.NavToMouse();
                    }
                }
                break;
                }
            }
        }
    }
示例#25
0
 public JobOpenTransferInventoriesDirection(string name, params object[] requiredObjects) : base(name, requiredObjects)
 {
     character        = requiredObjects[0] as SelectableCharacter;
     directedToTarget = requiredObjects[1] as SelectableTarget;
 }
示例#26
0
 internal void ChangeToSelectedCharacter(SelectableCharacter character)
 {
     //Debug.Log(this.name + ": Changing to selected character - " + character.name);
     sr.sprite = character.GetComponent <SpriteRenderer>().sprite;
 }
示例#27
0
 internal void SetTargetCharacter(SelectableCharacter character)
 {
     transform.position = character.transform.position;
 }
示例#28
0
 private void ButtonTask(SelectableCharacter character, int abilityIndex)
 {
     character.HotbarClicked();
     character.PrepareAbility(abilityIndex);
 }
示例#29
0
 internal void SelectCharacter(SelectableCharacter selectedCharacter)
 {
     this.playerSelectableCharacter = selectedCharacter;
     this.SessionId = dataContext.CreateSession(selectedCharacter.CharacterId);
 }