public void DrawStartPos(APAttack.AttackContext context, bool bDraw)
    {
        if (bDraw && context.m_enabled)
        {
            APCharacterController oController = (APCharacterController)target;
            Vector3 pointPos = oController.transform.TransformPoint(context.m_bulletStartPosition);
            Color   color    = Color.cyan;
            color.a       = 0.5f;
            Handles.color = color;
            Vector3 newPos = Handles.FreeMoveHandle(pointPos, Quaternion.identity, 0.1f, Vector3.zero, Handles.SphereHandleCap);
            if (GUI.changed)
            {
                Undo.RecordObject(oController, "Move Bullet Position");
                context.m_bulletStartPosition = oController.transform.InverseTransformPoint(newPos);

                // mark object as dirty
                EditorUtility.SetDirty(oController);
            }

            // draw direction arrow
            float   fAngle    = Mathf.Deg2Rad * context.m_bulletDirection;
            Vector2 v2MoveDir = new Vector2(Mathf.Cos(fAngle), -Mathf.Sin(fAngle));

            APCharacterMotor oMotor = oController.GetComponent <APCharacterMotor>();
            if (oMotor && ((oMotor.m_faceRight && v2MoveDir.x < 0f) || (!oMotor.m_faceRight && v2MoveDir.x > 0f)))
            {
                v2MoveDir.x = -v2MoveDir.x;
            }

            v2MoveDir = oController.transform.TransformDirection(v2MoveDir);

            Quaternion rot = Quaternion.LookRotation(v2MoveDir);
            Handles.ArrowHandleCap(0, pointPos, rot, 0.5f, EventType.Repaint);
        }
    }
示例#2
0
    // called when we have been hit by a melee attack
    override public bool OnMeleeAttackHit(APCharacterController character, APHitZone hitZone)
    {
        // Do nothing if player is currently blinking
        APSamplePlayer samplePlayer = character.GetComponent <APSamplePlayer>();

        if (samplePlayer && samplePlayer.IsGodModeEnabled())
        {
            return(false);
        }

        return(AddHitDamage(hitZone.m_damage));
    }
示例#3
0
    // called when character motor ray is touching us
    override public void OnCharacterTouch(APCharacterController character, APCharacterMotor.RayType rayType)
    {
        // Do nothing if dead
        if (IsDead())
        {
            return;
        }

        // prevent checking hits too often
        if (Time.time < m_lastHitTime + m_minTimeBetweenTwoReceivedHits)
        {
            return;
        }

        // save current hit time
        m_lastHitTime = Time.time;

        // check if jumping on us
        APSamplePlayer samplePlayer = character.GetComponent <APSamplePlayer>();

        if (rayType == APCharacterMotor.RayType.Ground)
        {
            // make character jump
            float  fRatio      = m_jumpRatioInputReleased;
            string sJumpButton = character.m_jump.m_button;
            if (!string.IsNullOrEmpty(sJumpButton) && Input.GetButton(sJumpButton))
            {
                fRatio = m_jumpRatioInputPushed;
            }

            if (fRatio > 0f)
            {
                character.Jump(fRatio);
            }

            // add hit to us
            AddHitDamage(samplePlayer.m_jumpDamage);
        }
        else
        {
            // notify hit to character controller as Blob makes damage by touching it
            samplePlayer.OnHit(this);
        }
    }
    // Catch this collectible
    void HandleCatch(APCharacterController character)
    {
        if (!m_catched)
        {
            m_catched = true;

            // update player data
            APSamplePlayer player = character.GetComponent <APSamplePlayer>();
            if (player != null)
            {
                player.AddLife(m_lifePoints);
                player.AddScore(m_scorePoints);
                player.AddAmmo(m_ammoPoints, m_rangedAttackIndex);
            }

            // destroy me
            Object.Destroy(gameObject);
        }
    }
    // Catch this collectible
    void HandleCatch(APCharacterController character)
    {
        if (!m_catched)
        {
            m_catched = true;

            // update player data
            APSamplePlayer player = character.GetComponent <APSamplePlayer>();
            if (player != null)
            {
                player.AddLife(m_lifePoints);
                player.AddScore(m_scorePoints);
                if (m_ammoBox != null)
                {
                    m_ammoBox.AddAmmo(m_ammoPoints);
                }
            }

            StartCoroutine(wait());
        }
    }
示例#6
0
    // called when character motor ray is touching us
    override public bool OnCharacterTouch(APCharacterController character, APCharacterMotor.RayType rayType, RaycastHit2D hit, float penetration,
                                          APMaterial hitMaterial)
    {
        // Do nothing if dead
        if (IsDead())
        {
            return(false);
        }

        // Do nothing in godmode
        APSamplePlayer samplePlayer = character.GetComponent <APSamplePlayer>();

        if (samplePlayer && samplePlayer.IsGodModeEnabled())
        {
            return(false);
        }

        // check if jumping on us
        bool bHit = false;

        if ((rayType == APCharacterMotor.RayType.Ground) && (penetration <= m_jumpHitPenetrationTolerance))
        {
            // make character jump
            float fRatio = m_jumpRatioInputReleased;
            if (character.m_jump.m_button.IsSpecified() && character.m_jump.m_button.GetButton())
            {
                fRatio = m_jumpRatioInputPushed;
            }

            if (fRatio > 0f)
            {
                character.Jump(character.m_jump.m_minHeight * fRatio, character.m_jump.m_maxHeight * fRatio);
            }

            // add hit to NPC
            if (samplePlayer)
            {
                AddHitDamage(samplePlayer.m_jumpDamage);
            }

            bHit = true;
        }
        else if (penetration <= m_hitPenetrationTolerance)
        {
            // add hit to character
            if (samplePlayer)
            {
                samplePlayer.OnHit(m_touchDamage, transform.position);
            }

            bHit = true;
        }

        // prevent checking hits too often
        if (bHit)
        {
            if (Time.time < m_lastHitTime + m_minTimeBetweenTwoReceivedHits)
            {
                return(false);
            }

            // save current hit time
            m_lastHitTime = Time.time;
        }

        // always ignore contact
        return(false);
    }