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); } }
// 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)); }
// 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()); } }
// 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); }