public virtual void Activate()
        {
            Transform tempTransform = SelectedEntity ? SelectedEntity.transform : null;

            if (tempTransform == null)
            {
                return;
            }
            targetPlayer      = tempTransform.GetComponent <BasePlayerCharacterEntity>();
            targetMonster     = tempTransform.GetComponent <BaseMonsterCharacterEntity>();
            targetNpc         = tempTransform.GetComponent <NpcEntity>();
            targetItemDrop    = tempTransform.GetComponent <ItemDropEntity>();
            targetHarvestable = tempTransform.GetComponent <HarvestableEntity>();
            targetBuilding    = null;
            targetVehicle     = tempTransform.GetComponent <VehicleEntity>();
            targetActionType  = TargetActionType.Activate;
            isFollowingTarget = true;
            isAutoAttacking   = false;
            // Priority Player -> Npc -> Buildings
            if (targetPlayer != null)
            {
                CacheUISceneGameplay.SetActivePlayerCharacter(targetPlayer);
            }
            else if (targetMonster != null || targetHarvestable != null)
            {
                targetActionType = TargetActionType.Attack;
                isAutoAttacking  = true;
            }
            else if (targetNpc != null)
            {
                PlayerCharacterEntity.CallServerNpcActivate(targetNpc.ObjectId);
            }
            else if (targetBuilding != null)
            {
                SelectedEntity = targetBuilding;
                ActivateBuilding(targetBuilding);
            }
            else if (targetVehicle != null)
            {
                PlayerCharacterEntity.CallServerEnterVehicle(targetVehicle.ObjectId);
            }
            else if (targetWarpPortal != null)
            {
                PlayerCharacterEntity.CallServerEnterWarp(targetWarpPortal.ObjectId);
            }
        }
示例#2
0
        protected void UpdateInput()
        {
            if (GenericUtils.IsFocusInputField())
            {
                return;
            }

            if (PlayerCharacterEntity.IsDead())
            {
                return;
            }

            // If it's building something, don't allow to activate NPC/Warp/Pickup Item
            if (!ConstructingBuildingEntity)
            {
                // Activate nearby npcs / players / activable buildings
                if (InputManager.GetButtonDown("Activate"))
                {
                    targetPlayer = null;
                    if (ActivatableEntityDetector.players.Count > 0)
                    {
                        targetPlayer = ActivatableEntityDetector.players[0];
                    }
                    targetNpc = null;
                    if (ActivatableEntityDetector.npcs.Count > 0)
                    {
                        targetNpc = ActivatableEntityDetector.npcs[0];
                    }
                    targetBuilding = null;
                    if (ActivatableEntityDetector.buildings.Count > 0)
                    {
                        targetBuilding = ActivatableEntityDetector.buildings[0];
                    }
                    targetVehicle = null;
                    if (ActivatableEntityDetector.vehicles.Count > 0)
                    {
                        targetVehicle = ActivatableEntityDetector.vehicles[0];
                    }
                    targetWarpPortal = null;
                    if (ActivatableEntityDetector.warpPortals.Count > 0)
                    {
                        targetWarpPortal = ActivatableEntityDetector.warpPortals[0];
                    }
                    targetItemsContainer = null;
                    if (ItemDropEntityDetector.itemsContainers.Count > 0)
                    {
                        targetItemsContainer = ItemDropEntityDetector.itemsContainers[0];
                    }
                    // Priority Player -> Npc -> Buildings
                    if (targetPlayer && CacheUISceneGameplay)
                    {
                        // Show dealing, invitation menu
                        SelectedEntity = targetPlayer;
                        CacheUISceneGameplay.SetActivePlayerCharacter(targetPlayer);
                    }
                    else if (targetNpc)
                    {
                        // Talk to NPC
                        SelectedEntity = targetNpc;
                        PlayerCharacterEntity.CallServerNpcActivate(targetNpc.ObjectId);
                    }
                    else if (targetBuilding)
                    {
                        // Use building
                        SelectedEntity = targetBuilding;
                        ActivateBuilding(targetBuilding);
                    }
                    else if (targetVehicle)
                    {
                        // Enter vehicle
                        PlayerCharacterEntity.CallServerEnterVehicle(targetVehicle.ObjectId);
                    }
                    else if (targetWarpPortal)
                    {
                        // Enter warp, For some warp portals that `warpImmediatelyWhenEnter` is FALSE
                        PlayerCharacterEntity.CallServerEnterWarp(targetWarpPortal.ObjectId);
                    }
                    else if (targetItemsContainer)
                    {
                        // Show items
                        ShowItemsContainerDialog(targetItemsContainer);
                    }
                }
                // Pick up nearby items
                if (InputManager.GetButtonDown("PickUpItem"))
                {
                    targetItemDrop = null;
                    if (ItemDropEntityDetector.itemDrops.Count > 0)
                    {
                        targetItemDrop = ItemDropEntityDetector.itemDrops[0];
                    }
                    if (targetItemDrop != null)
                    {
                        PlayerCharacterEntity.CallServerPickupItem(targetItemDrop.ObjectId);
                    }
                }
                // Reload
                if (InputManager.GetButtonDown("Reload"))
                {
                    // Reload ammo when press the button
                    ReloadAmmo();
                }
                if (InputManager.GetButtonDown("ExitVehicle"))
                {
                    // Exit vehicle
                    PlayerCharacterEntity.CallServerExitVehicle();
                }
                if (InputManager.GetButtonDown("SwitchEquipWeaponSet"))
                {
                    // Switch equip weapon set
                    GameInstance.ClientInventoryHandlers.RequestSwitchEquipWeaponSet(new RequestSwitchEquipWeaponSetMessage()
                    {
                        equipWeaponSet = (byte)(PlayerCharacterEntity.EquipWeaponSet + 1),
                    }, ClientInventoryActions.ResponseSwitchEquipWeaponSet);
                }
                if (InputManager.GetButtonDown("Sprint"))
                {
                    // Toggles sprint state
                    isSprinting = !isSprinting;
                }
                // Auto reload
                if (PlayerCharacterEntity.EquipWeapons.rightHand.IsAmmoEmpty() ||
                    PlayerCharacterEntity.EquipWeapons.leftHand.IsAmmoEmpty())
                {
                    // Reload ammo when empty and not press any keys
                    ReloadAmmo();
                }
            }

            UpdateLookInput();
            UpdateWASDInput();
            PlayerCharacterEntity.SetExtraMovement(isSprinting ? ExtraMovementState.IsSprinting : ExtraMovementState.None);
        }
        public void TabTargetUpdateFollowTarget()
        {
            // use attack
            targetActionType = TargetActionType.Attack;
            if (isAutoAttacking && CanAttack(out targetDamageable))
            {
                if (targetDamageable.IsHideOrDead())
                {
                    isAutoAttacking = false;
                    ClearQueueUsingSkill();
                    PlayerCharacterEntity.StopMove();
                    ClearTarget();
                    Targeting.UnTarget(Targeting.SelectedTarget);
                    return;
                }
                float attackDistance = 0f;
                float attackFov      = 0f;
                GetAttackDistanceAndFov(isLeftHandAttacking, out attackDistance, out attackFov);
                Attack(targetDamageable, attackDistance, CurrentGameInstance.characterLayer.Mask);
                return;
            }

            if (!isFollowingTarget)
            {
                return;
            }
            // Use the set target action type for the following actions
            if (TryGetDoActionEntity(out targetPlayer))
            {
                DoActionOrMoveToEntity(targetPlayer, CurrentGameInstance.conversationDistance, () =>
                {
                    // TODO: Do something
                });
                return;
            }

            if (TryGetDoActionEntity(out targetNpc))
            {
                DoActionOrMoveToEntity(targetNpc, CurrentGameInstance.conversationDistance, () =>
                {
                    if (!didActionOnTarget)
                    {
                        didActionOnTarget = true;
                        PlayerCharacterEntity.CallServerNpcActivate(targetNpc.ObjectId);
                    }
                });
                return;
            }

            if (TryGetDoActionEntity(out targetItemDrop))
            {
                DoActionOrMoveToEntity(targetItemDrop, CurrentGameInstance.pickUpItemDistance, () =>
                {
                    PlayerCharacterEntity.CallServerPickupItem(targetItemDrop.ObjectId);
                    ClearTarget();
                });
                return;
            }
            // use skill
            targetActionType = TargetActionType.UseSkill;
            if (TryGetUsingSkillEntity(out targetDamageable))
            {
                if (queueUsingSkill.skill.IsAttack() && targetDamageable.IsHideOrDead())
                {
                    ClearQueueUsingSkill();
                    PlayerCharacterEntity.StopMove();
                    ClearTarget();
                    Targeting.UnTarget(Targeting.SelectedTarget);
                    return;
                }
                float castDistance = 0f;
                float castFov      = 0f;
                GetUseSkillDistanceAndFov(isLeftHandAttacking, out castDistance, out castFov);
                UseSkillOrMoveToEntity(targetDamageable, castDistance);
                return;
            }
            targetActionType = TargetActionType.Activate;
            if (TryGetDoActionEntity(out targetBuilding, TargetActionType.Activate))
            {
                DoActionOrMoveToEntity(targetBuilding, CurrentGameInstance.conversationDistance, () =>
                {
                    if (!didActionOnTarget)
                    {
                        didActionOnTarget = true;
                        ActivateBuilding(targetBuilding);
                    }
                });
                return;
            }

            targetActionType = TargetActionType.ViewOptions;
            if (TryGetDoActionEntity(out targetBuilding, TargetActionType.ViewOptions))
            {
                DoActionOrMoveToEntity(targetBuilding, CurrentGameInstance.conversationDistance, () =>
                {
                    if (!didActionOnTarget)
                    {
                        didActionOnTarget = true;
                        ShowCurrentBuildingDialog();
                    }
                });
                return;
            }

            targetActionType = TargetActionType.Activate;
            if (TryGetDoActionEntity(out targetVehicle))
            {
                DoActionOrMoveToEntity(targetVehicle, CurrentGameInstance.conversationDistance, () =>
                {
                    PlayerCharacterEntity.CallServerEnterVehicle(targetVehicle.ObjectId);
                    ClearTarget();
                    Targeting.UnTarget(Targeting.SelectedTarget);
                });
            }
        }