public override bool ApplyBuff(Creature offender, DamageDesc.BuffType type, float time, DamageDesc damageDesc) { if (false == base.ApplyBuff(offender, type, time, damageDesc)) return false; switch(type) { case DamageDesc.BuffType.LevelUp: DamageText(type.ToString(), Vector3.one, Color.cyan, DamageNumberSprite.MovementType.RisingUp); break; case DamageDesc.BuffType.Macho: DamageText(RefData.Instance.RefTexts(MultiLang.ID.MachoSkill), Vector3.one, Color.cyan, DamageNumberSprite.MovementType.RisingUp); break; } return true; }
IEnumerator EffectDash(DamageDesc damageDesc, float time) { Vector3 pos = transform.position; pos.y = damageDesc.PrefEffect.transform.position.y; GameObject dmgEffect = (GameObject)Instantiate(damageDesc.PrefEffect, pos, damageDesc.PrefEffect.transform.rotation); float finished = Time.time + time; rigidbody.AddForce(damageDesc.Dir*10f, ForceMode.Impulse); while(Time.time < finished) { yield return null; } rigidbody.velocity = Vector3.zero; m_buffEffects[(int)DamageDesc.BuffType.Dash].m_run = false; DestroyObject(dmgEffect); }
IEnumerator EffectBurning(float time, Creature offender, DamageDesc damageDesc) { while(time > 0) { yield return new WaitForSeconds(0.3f); time -= 0.3f; damageDesc.PushbackOnDamage = false; TakeDamage(offender, damageDesc); } m_buffEffects[(int)DamageDesc.BuffType.Poison].m_run = false; }
void ApplyDamageEffect(DamageDesc.Type type, GameObject prefEffect) { if (prefEffect == null) return; if (Warehouse.Instance.NewGameStats.DamageEffectPerSec > 10) return; Warehouse.Instance.NewGameStats.DamageEffect+=1; GameObject dmgEffect = (GameObject)Instantiate(prefEffect, Vector3.zero, Quaternion.Euler(0f, 0f, 0f)); dmgEffect.transform.parent = m_aimpoint.transform; dmgEffect.transform.localPosition = Vector3.zero; dmgEffect.transform.localScale = m_aimpoint.transform.localScale; Bullet.ParticleScale(dmgEffect, m_aimpoint.transform.localScale.x); StartCoroutine(UpdateDamageEffect(dmgEffect)); }
public virtual long TakeDamage(Creature offender, DamageDesc damageDesc) { if (m_behaviourType == BehaviourType.Death) return 0; if (m_buffEffects[(int)DamageDesc.BuffType.Macho].m_run == true) { DamageText(RefData.Instance.RefTexts(MultiLang.ID.Blocked), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha); return 0; } if (m_buffEffects[(int)DamageDesc.BuffType.Dash].m_run == true) { DamageText(RefData.Instance.RefTexts(MultiLang.ID.Blocked), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha); return 0; } bool critical = false; float criticalDamage = 1f; if (offender != null) { if (Random.Range(0, 1f) < offender.m_creatureProperty.CriticalChance) { critical = true; criticalDamage = 1f+offender.m_creatureProperty.CriticalDamage; } } long dmg = (long)(damageDesc.Damage*criticalDamage); dmg -= (long)(dmg*m_creatureProperty.DamageReduction); if (dmg <= 0) { dmg = Random.Range(0, 2); } if (dmg > 0) { if (Random.Range(0f, 1f) < m_creatureProperty.Dodge) { DamageText(RefData.Instance.RefTexts(MultiLang.ID.Dodged), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha); return 0; } if (m_creatureProperty.Shield > 0) { --m_creatureProperty.Shield; DamageText(RefData.Instance.RefTexts(MultiLang.ID.Shielded), Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha); return 0; } } string strDamage = dmg.ToString(); if (dmg == 0) { strDamage = RefData.Instance.RefTexts(MultiLang.ID.Blocked); DamageText(strDamage, Vector3.one, Color.white, DamageNumberSprite.MovementType.ParabolaAlpha); return 0; } if (m_ingTakenDamageEffect < Const.MaxShowDamageNumber) { Vector3 damageTextScale = Vector3.one; ++m_ingTakenDamageEffect; Color color = Color.white; if (critical == true) { strDamage = dmg.ToString(); color = Color.red; damageTextScale *= 1.1f; } else if (damageDesc.DamageBuffType == DamageDesc.BuffType.Poison) { color = Color.magenta; } else { if (offender != null && offender.RefMob.mobAI == MobAIType.Follow) { damageTextScale *= 0.8f; switch(offender.RefMob.id) { case 30001: color = Color.clear; break; case 30002: color = Color.red; break; case 30003: color = Color.blue; break; case 30004: color = Color.cyan; break; case 30005: color = Color.yellow; break; case 30006: color = Color.magenta; break; case 30007: color = Color.grey; break; } } } DamageText(strDamage, damageTextScale, color, DamageNumberSprite.MovementType.ParabolaAlpha); StartCoroutine(BodyRedColoredOnTakenDamage()); ApplyDamageEffect(damageDesc.DamageType, damageDesc.PrefEffect); } if (true == m_creatureProperty.BackwardOnDamage && damageDesc.PushbackOnDamage && m_pushbackSpeedOnDamage <= 0f) { if (Random.Range(0, 10) == 0) { m_pushbackSpeedOnDamage = 10f / rigidbody.mass; rigidbody.AddForce(transform.right*-2f, ForceMode.Impulse); rigidbody.AddTorque(transform.forward*2f, ForceMode.Impulse); rigidbody.maxAngularVelocity = 2f; EnableNavmeshUpdatePos(false); } } ApplyBuff(offender, damageDesc.DamageBuffType, 2f, damageDesc); if (offender != null && damageDesc.LifeSteal == true) { long lifeSteal = (long)(offender.m_creatureProperty.LifeSteal); if (lifeSteal > 0) { offender.DamageText(lifeSteal.ToString() + "L", Vector3.one, Color.green, DamageNumberSprite.MovementType.ParabolaAlpha); offender.Heal(lifeSteal); } } m_creatureProperty.HP-=dmg; if (m_creatureProperty.HP == 0) { Const.GetSpawn().SharePotinsChamps(offender, ItemData.Type.XPPotion, m_creatureProperty.RewardExp, false); Death(); } if (offender != null && (offender.CreatureType & Type.Champ) > 0) { Warehouse.Instance.NewGameStats.DealDamages += dmg; } else if (CreatureType == Type.Champ) { Warehouse.Instance.NewGameStats.TakenDamages += dmg; } return dmg; }
public bool ApplyHealingSkill() { if (m_buffEffects[(int)DamageDesc.BuffType.Healing].m_run == true) return false; DamageDesc desc = new DamageDesc(0, DamageDesc.Type.Normal, DamageDesc.BuffType.Nothing, null); desc.DamageRatio = 0.1f; ApplyBuff(null, DamageDesc.BuffType.Healing, 10f, desc); return true; }
public bool ApplyDamageMultiplySkill() { DamageDesc desc = new DamageDesc(0, DamageDesc.Type.Normal, DamageDesc.BuffType.Nothing, null); desc.DamageRatio = 10f; ApplyBuff(null, DamageDesc.BuffType.DamageMultiply, 20f, desc); return true; }
public virtual bool ApplyBuff(Creature offender, DamageDesc.BuffType type, float time, DamageDesc damageDesc) { //if (m_buffEffects[(int)type].m_run == true) // return false; switch(type) { case DamageDesc.BuffType.Airborne: case DamageDesc.BuffType.Stun: case DamageDesc.BuffType.Slow: case DamageDesc.BuffType.Poison: if (m_buffEffects[(int)type].m_run == true) return false; break; } m_buffEffects[(int)type].m_run = true; switch(type) { case DamageDesc.BuffType.Airborne: StartCoroutine(EffectAirborne()); break; case DamageDesc.BuffType.Stun: StartCoroutine(EffectStun()); break; case DamageDesc.BuffType.Slow: StartCoroutine(EffectSlow(time)); break; case DamageDesc.BuffType.LevelUp: StartCoroutine(EffectSteamPack(time)); break; case DamageDesc.BuffType.Poison: StartCoroutine(EffectBurning(time, null, damageDesc)); break; case DamageDesc.BuffType.Macho: StartCoroutine(EffectMacho(time)); break; case DamageDesc.BuffType.Dash: StartCoroutine(EffectDash(damageDesc, time)); break; case DamageDesc.BuffType.DamageMultiply: StartCoroutine(EffectDamageMultiply(time, damageDesc.DamageRatio)); break; case DamageDesc.BuffType.Healing: StartCoroutine(EffectHealing(time, damageDesc.DamageRatio)); break; case DamageDesc.BuffType.Zzz: StartCoroutine(EffectZzz(time)); break; } return true; }
// Update is called once per frame new void Update() { base.Update(); if (m_enableAutoTarget) { if (AutoAttack() == false) { m_weaponHolder.StopFiring(); m_navAgent.Resume(); } else { if (WeaponHolder.MainWeapon != null) m_navAgent.Stop(); } } int touchedCount = 0; Vector3[] touchPos = new Vector3[5]; #if UNITY_EDITOR touchedCount = Input.GetMouseButtonUp(0) == true ? 1 : 0; if (touchedCount > 0) touchPos[0] = Input.mousePosition; #else touchedCount = Input.touchCount; if (touchedCount > 0) { int aa = 0; for(int i = 0; i < touchedCount; ++i) { if (Input.GetTouch (i).phase == TouchPhase.Began) { touchPos[aa] = Input.GetTouch(i).position; ++aa; } } touchedCount = aa; } #endif bool hitted = false; for (int i = 0; i < touchedCount; ++i) { StartCoroutine(EffectTouch(touchPos[i])); Ray ray = Camera.main.ScreenPointToRay( touchPos[i] ); RaycastHit[] hits; hits = Physics.RaycastAll(ray, Mathf.Infinity, 1<<9 | 1<<10 | 1<<11); foreach(RaycastHit hit in hits ) { Creature target = hit.transform.GetComponent<Creature>(); if (null == WeaponHolder.MainWeapon && target != null) RotateToTarget(target.transform.position); if (target != null && IsEnemy(target, this)) { DamageDesc tapDamageDesc = new DamageDesc(m_tapWeapon.GetDamage(m_creatureProperty), DamageDesc.Type.Normal, DamageDesc.BuffType.Nothing, null); tapDamageDesc.LifeSteal = true; target.TakeDamage(this, tapDamageDesc); hitted = true; continue; } if (hit.transform.tag.CompareTo("ItemBox") == 0) { ItemBox itemBox = hit.transform.gameObject.GetComponent<ItemBox>(); itemBox.StartPickupEffect(this); hitted = true; } } } if (hitted == false) { Creature[] targets = Bullet.SearchTarget(transform.position, GetMyEnemyType(), 4f+m_creatureProperty.AttackRange); int length = 0; if (targets != null) length = Mathf.Min(touchedCount, targets.Length); for(int i = 0; i < length; ++i) { if (targets[i] == null) continue; DamageDesc tapDamageDesc = new DamageDesc(m_tapWeapon.GetDamage(m_creatureProperty), DamageDesc.Type.Normal, DamageDesc.BuffType.Nothing, null); tapDamageDesc.LifeSteal = true; targets[i].TakeDamage(this, tapDamageDesc); } } Warehouse.Instance.GameDataContext.m_level.Value = m_creatureProperty.Level; Warehouse.Instance.GameDataContext.m_hp.Value = m_creatureProperty.HP; Warehouse.Instance.GameDataContext.m_xp.Value = m_creatureProperty.Exp; Warehouse.Instance.GameDataContext.m_sp.Value = m_creatureProperty.SP; if (touchedCount > 0) { m_idleTime = 0f; m_admob.ShowBanner(false); if (Warehouse.Instance.GameTutorial.m_unlockedTap == false) { if (Const.GetTutorialMgr().TutorialName.CompareTo("Tap") == 0) { Const.GetTutorialMgr().SetTutorial("Nothing"); Warehouse.Instance.GameTutorial.m_unlockedTap = true; } } } else { m_idleTime += Time.deltaTime; if (m_idleTime > 180f) { m_admob.ShowBanner(true); m_idleTime = 0f; } } TimeEffector.Instance.Update(); }