protected void UpdateFireInput() { if (!ConstructingBuildingEntity) { if (PlayerCharacterEntity.RequestAttack(isLeftHandAttacking)) { isLeftHandAttacking = !isLeftHandAttacking; } } }
public void Attack(bool isLeftHand) { PlayerCharacterEntity.RequestAttack(isLeftHand); }
protected virtual void UpdateWASDInput() { if (controllerMode != PlayerCharacterControllerMode.WASD && controllerMode != PlayerCharacterControllerMode.Both) { return; } // If mobile platforms, don't receive input raw to make it smooth bool raw = !InputManager.useMobileInputOnNonMobile && !Application.isMobilePlatform; Vector3 moveDirection = GetMoveDirection(InputManager.GetAxis("Horizontal", raw), InputManager.GetAxis("Vertical", raw)); if (moveDirection.magnitude != 0f) { HideNpcDialogs(); queueUsingSkill = null; FindAndSetBuildingAreaFromCharacterDirection(); } // For WASD mode, Using skill when player pressed hotkey if (queueUsingSkill.HasValue) { UsingSkillData queueUsingSkillValue = queueUsingSkill.Value; destination = null; PlayerCharacterEntity.StopMove(); Skill skill = null; if (GameInstance.Skills.TryGetValue(queueUsingSkillValue.dataId, out skill) && skill != null) { if (skill.IsAttack()) { BaseCharacterEntity targetEntity; if (TryGetSelectedTargetAsAttackingCharacter(out targetEntity)) { SetTarget(targetEntity); } if (wasdLockAttackTarget && !TryGetAttackingCharacter(out targetEntity)) { BaseCharacterEntity nearestTarget = PlayerCharacterEntity.FindNearestAliveCharacter <BaseCharacterEntity>(PlayerCharacterEntity.GetSkillAttackDistance(skill, isLeftHandAttacking) + lockAttackTargetDistance, false, true, false); if (nearestTarget != null) { // Set target, then use skill later when moved nearby target PlayerCharacterEntity.SetTargetEntity(nearestTarget); } else { // No nearby target, so use skill immediately if (RequestUsePendingSkill(isLeftHandAttacking, null)) { isLeftHandAttacking = !isLeftHandAttacking; } } } else if (!wasdLockAttackTarget) { // Not lock target, so not finding target and use skill immediately if (RequestUsePendingSkill(isLeftHandAttacking, null)) { isLeftHandAttacking = !isLeftHandAttacking; } } } else { // Not attack skill, so use skill immediately RequestUsePendingSkill(isLeftHandAttacking, null); } } else { queueUsingSkill = null; } } // Attack when player pressed attack button else if (InputManager.GetButton("Attack")) { destination = null; PlayerCharacterEntity.StopMove(); BaseCharacterEntity targetEntity; if (TryGetSelectedTargetAsAttackingCharacter(out targetEntity)) { SetTarget(targetEntity); } if (wasdLockAttackTarget && !TryGetAttackingCharacter(out targetEntity)) { // Find nearest target and move to the target BaseCharacterEntity nearestTarget = PlayerCharacterEntity .FindNearestAliveCharacter <BaseCharacterEntity>( PlayerCharacterEntity.GetAttackDistance(isLeftHandAttacking) + lockAttackTargetDistance, false, true, false); SelectedEntity = nearestTarget; if (nearestTarget != null) { // Set target, then attack later when moved nearby target PlayerCharacterEntity.SetTargetEntity(nearestTarget); } else { // No nearby target, so attack immediately if (PlayerCharacterEntity.RequestAttack(isLeftHandAttacking)) { isLeftHandAttacking = !isLeftHandAttacking; } } } else if (!wasdLockAttackTarget) { // Find nearest target and set selected target to show character hp/mp UIs BaseCharacterEntity nearestTarget = PlayerCharacterEntity .FindNearestAliveCharacter <BaseCharacterEntity>( PlayerCharacterEntity.GetAttackDistance(isLeftHandAttacking), false, true, false, true, PlayerCharacterEntity.GetAttackFov(isLeftHandAttacking)); SelectedEntity = nearestTarget; // Not lock target, so not finding target and attack immediately if (PlayerCharacterEntity.RequestAttack(isLeftHandAttacking)) { isLeftHandAttacking = !isLeftHandAttacking; } } } // Move if (moveDirection.magnitude != 0f) { PlayerCharacterEntity.StopMove(); destination = null; ClearTarget(); targetLookDirection = moveDirection.normalized; } // Always forward MovementState movementState = MovementState.Forward; if (InputManager.GetButtonDown("Jump")) { movementState |= MovementState.IsJump; } PlayerCharacterEntity.KeyMovement(moveDirection, movementState); }
protected void UpdateFollowTarget() { // Temp variables if (TryGetAttackingCharacter(out targetEnemy)) { if (targetEnemy.IsDead()) { queueUsingSkill = null; PlayerCharacterEntity.StopMove(); ClearTarget(); return; } // Find attack distance and fov, from weapon or skill float attackDistance = 0f; float attackFov = 0f; if (!GetAttackDataOrUseNonAttackSkill(isLeftHandAttacking, out attackDistance, out attackFov)) { return; } float actDistance = attackDistance; actDistance -= actDistance * 0.1f; actDistance -= StoppingDistance; if (FindTarget(targetEnemy.gameObject, actDistance, gameInstance.characterLayer.Mask)) { // Stop movement to attack PlayerCharacterEntity.StopMove(); // Turn character to target targetLookDirection = (targetEnemy.CacheTransform.position - PlayerCharacterEntity.CacheTransform.position).normalized; if (PlayerCharacterEntity.IsPositionInFov(attackFov, targetEnemy.CacheTransform.position)) { // If has queue using skill, attack by the skill if (queueUsingSkill.HasValue && RequestUsePendingSkill(isLeftHandAttacking, targetEnemy.OpponentAimTransform.position)) { isLeftHandAttacking = !isLeftHandAttacking; } else if (PlayerCharacterEntity.RequestAttack(isLeftHandAttacking, targetEnemy.OpponentAimTransform.position)) { isLeftHandAttacking = !isLeftHandAttacking; } } } else { UpdateTargetEntityPosition(targetEnemy); } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetPlayer)) { if (targetPlayer.IsDead()) { queueUsingSkill = null; PlayerCharacterEntity.StopMove(); ClearTarget(); return; } float actDistance = gameInstance.conversationDistance - StoppingDistance; if (Vector3.Distance(CharacterTransform.position, targetPlayer.CacheTransform.position) <= actDistance) { PlayerCharacterEntity.StopMove(); // TODO: do something } else { UpdateTargetEntityPosition(targetPlayer); } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetMonster)) { if (targetMonster.IsDead()) { queueUsingSkill = null; PlayerCharacterEntity.StopMove(); ClearTarget(); return; } float actDistance = gameInstance.conversationDistance - StoppingDistance; if (Vector3.Distance(CharacterTransform.position, targetMonster.CacheTransform.position) <= actDistance) { PlayerCharacterEntity.StopMove(); // TODO: do something } else { UpdateTargetEntityPosition(targetMonster); } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetNpc)) { float actDistance = gameInstance.conversationDistance - StoppingDistance; if (Vector3.Distance(CharacterTransform.position, targetNpc.CacheTransform.position) <= actDistance) { if (lastNpcObjectId != targetNpc.ObjectId) { PlayerCharacterEntity.RequestNpcActivate(targetNpc.ObjectId); lastNpcObjectId = targetNpc.ObjectId; } PlayerCharacterEntity.StopMove(); } else { UpdateTargetEntityPosition(targetNpc); } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetItemDrop)) { float actDistance = gameInstance.pickUpItemDistance - StoppingDistance; if (Vector3.Distance(CharacterTransform.position, targetItemDrop.CacheTransform.position) <= actDistance) { PlayerCharacterEntity.RequestPickupItem(targetItemDrop.ObjectId); PlayerCharacterEntity.StopMove(); ClearTarget(); } else { UpdateTargetEntityPosition(targetItemDrop); } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetBuilding)) { UICurrentBuilding uiCurrentBuilding = null; if (CacheUISceneGameplay != null) { uiCurrentBuilding = CacheUISceneGameplay.uiCurrentBuilding; } float actDistance = gameInstance.conversationDistance - StoppingDistance; if (Vector3.Distance(CharacterTransform.position, targetBuilding.CacheTransform.position) <= actDistance) { PlayerCharacterEntity.StopMove(); if (IsEditingBuilding) { // If it's build mode, show destroy menu if (uiCurrentBuilding != null && !uiCurrentBuilding.IsVisible()) { uiCurrentBuilding.Show(); } } else { // If it's not build mode, try to activate it ActivateBuilding(targetBuilding); ClearTarget(); } } else { UpdateTargetEntityPosition(targetBuilding); if (uiCurrentBuilding != null && uiCurrentBuilding.IsVisible()) { uiCurrentBuilding.Hide(); } } } else if (PlayerCharacterEntity.TryGetTargetEntity(out targetHarvestable)) { if (targetHarvestable.IsDead()) { queueUsingSkill = null; PlayerCharacterEntity.StopMove(); ClearTarget(); return; } float attackDistance = 0f; float attackFov = 0f; if (!GetAttackDataOrUseNonAttackSkill(isLeftHandAttacking, out attackDistance, out attackFov)) { return; } float actDistance = attackDistance; actDistance -= actDistance * 0.1f; actDistance -= StoppingDistance; if (FindTarget(targetHarvestable.gameObject, actDistance, gameInstance.harvestableLayer.Mask)) { // Stop movement to attack PlayerCharacterEntity.StopMove(); // Turn character to target targetLookDirection = (targetHarvestable.CacheTransform.position - PlayerCharacterEntity.CacheTransform.position).normalized; if (PlayerCharacterEntity.IsPositionInFov(attackFov, targetHarvestable.CacheTransform.position)) { if (PlayerCharacterEntity.RequestAttack(isLeftHandAttacking, targetHarvestable.OpponentAimTransform.position)) { isLeftHandAttacking = !isLeftHandAttacking; } } } else { UpdateTargetEntityPosition(targetHarvestable); } } }
public void RequestAttack() { PlayerCharacterEntity.RequestAttack(); }