Esempio n. 1
0
 void Awake()
 {
     player       = GameObject.FindGameObjectWithTag("Player");
     enemyHealth  = GetComponent <damage>();
     playerHealth = player.GetComponent <PlayerHealth>();
     nav          = GetComponent <NavMeshAgent>();
 }
Esempio n. 2
0
    void OnTriggerEnter2D(Collider2D collider)
    {
        Scene  currentScene = SceneManager.GetActiveScene();
        string sceneName    = currentScene.name;

        health -= damage;
        damage missile = collider.gameObject.GetComponent <damage>();

        if (missile)
        {
            health -= missile.GetDamage();
            missile.Hit();
            if (health <= 0)
            {
                var bushtia = FindObjectOfType <enemies>();

                Destroy(gameObject);
                scoreKeeper2 = FindObjectOfType <ScoreToWin>();
                scoreKeeper2.Score(scoreValuee);
                AudioSource.PlayClipAtPoint(cracka, transform.position);
                if (sceneName == "Level_03")
                {
                    GameObject beama = Instantiate(bushtia.enemyPrefab5, transform.position, Quaternion.identity) as GameObject;
                    beama.GetComponent <Rigidbody2D>().velocity = new Vector3(-2, 0, 0);
                }
            }
        }
    }
Esempio n. 3
0
    void OnTriggerEnter2D(Collider2D collider)
    {
        health -= damage;
        AudioSource.PlayClipAtPoint(cracka, transform.position);
        damage missile = collider.gameObject.GetComponent <damage>();

        if (missile)
        {
            health -= missile.GetDamage();
            missile.Hit();
            if (health <= 0)
            {
                var bushtia = FindObjectOfType <enemies>();

                Destroy(gameObject);

                GameObject beama = Instantiate(bushtia.enemyPrefab2, transform.position, Quaternion.identity) as GameObject;
                beama.GetComponent <Rigidbody2D>().velocity = new Vector3(-2, 0, 0);



                scoreKeeper = FindObjectOfType <ScoreKeeper>();
                scoreKeeper.Score(scoreValuee);
            }
        }
    }
Esempio n. 4
0
    void DoDamage()
    {
        timer              = 0f;
        linePosition       = new Vector3(transform.position.x, transform.position.y + 2.5f, transform.position.z);
        shootRay.origin    = linePosition;
        shootRay.direction = transform.forward;

        //hitLine.enabled = true;
        //hitLine.SetPosition(0, linePosition);

        if (Physics.Raycast(shootRay, out shootHit, range, shootableMask))
        {
            damage damage = shootHit.collider.GetComponent <damage>();

            if (damage != null)
            {
                damage.TakeDamage(damagePerHit);
                Debug.Log("Damage Sent");
            }

            //hitLine.SetPosition(1, shootHit.point);
        }
        else
        {
            // ... set the second position of the line renderer to the fullest extent of the gun's range.
            //hitLine.SetPosition(1, shootRay.origin + shootRay.direction * range);
            //Debug.Log("No Damage");
        }
    }
Esempio n. 5
0
 public void takedamage(Creature causer, damage get)
 {
     this.nowHp = this.nowHp - get.amount;
     if (this.nowHp <= 0)
     {
         this.death();
     }
 }
Esempio n. 6
0
    void meleeAttack()
    {
        RaycastHit hit;

        if (Physics.Raycast(Camera.transform.position, Camera.transform.forward, out hit))
        {
            if (hit.transform.tag == "Enemy" && hit.distance <= 5f)
            {
                damage enemy = hit.transform.GetComponent <damage>();
                enemy.Damage1(100f);
                Debug.Log("Melee");
            }
        }
    }
Esempio n. 7
0
 public virtual void takeDamage(damage damage)
 {
     if (unit.alive && !(unit.exiled))                                                  //單位活著且沒有被放逐
     {
         if (damage.kind == 1 && !(unit.immune_attack))                                 //受到的是戰鬥傷害且單位不是物免
         {
             if (!(unit.conversely) || damage.hitConversely)                            //如果單位沒倒地或傷害能攻擊倒地單位
             {
                 unit.nowHP -= (damage.num - (damage.num * (unit.damageReduce / 100))); //傷害結算:單位生命值減少傷害量減物理減傷
             }
             if (unit.canBeStiff)                                                       //硬直判定
             {
                 float realstiff = damage.stiffTime - damage.stiffTime * (unit.stiffReduce / 100);
                 if (unit.stiffTime <= realstiff) //硬直結算:如果單位當前硬直小於傷害造成的硬直
                 {
                     unit.stiffTime = realstiff;  //將當前硬直設定為技能造成硬直
                     animator.SetFloat("stiffTime", unit.stiffTime);
                 }
             }
             if (damage.makeConversaly && (!unit.conversely) && unit.canBeConvesly)//倒地判定:如果伤害会击倒,且单位不为击倒状态,且可以被击倒
             {
                 unit.conversely = true;
                 animator.SetBool("conversely", true);
                 unit.converselyTime += unit.standConveslyTime;
             }
         }
         else if (damage.kind == 2 && !(unit.immune_skill))                             //受到的是戰鬥傷害且單位不是物免
         {
             if (!(unit.conversely) || damage.hitConversely)                            //如果單位沒倒地或傷害能攻擊倒地單位
             {
                 unit.nowHP -= (damage.num - (damage.num * (unit.energyReduce / 100))); //單位生命值減少傷害量減特殊減傷
             }
             if (unit.canBeStiff)
             {
                 float realstiff = damage.stiffTime - damage.stiffTime * (unit.stiffReduce / 100);
                 if (unit.stiffTime <= realstiff) //硬直結算:如果單位當前硬直小於傷害造成的硬直
                 {
                     unit.stiffTime = realstiff;  //將當前硬直設定為技能造成硬直
                     animator.SetFloat("stiffTime", unit.stiffTime);
                 }
             }
             if (damage.makeConversaly && (!unit.conversely) && unit.canBeConvesly)//倒地判定
             {
                 unit.conversely = true;
                 animator.SetBool("conversely", true);
                 unit.converselyTime += unit.standConveslyTime;
             }
         }
     }
 }
Esempio n. 8
0
    // Update is called once per frame
    void Update()
    {
        damage d = GameObject.Find("healthbar").GetComponent <damage>();

        if (d.GetHealth() <= 0)
        {
            SceneManager.LoadScene("Menu");
        }
        Antibody a = GameObject.FindGameObjectWithTag("Slider").GetComponent <Antibody>();

        if (a.GetTime() >= 600)
        {
            SceneManager.LoadScene("Menu");
        }
    }
Esempio n. 9
0
    void Start()
    {
        growth_tree  = 0;
        growth_apple = 0;

        //isPause = true;

        waitTime = 0.3f;
        timer    = 0f;

        tree   = GameObject.FindGameObjectsWithTag("Tree");
        bloss  = GameObject.FindGameObjectsWithTag("Apple blossom");
        fruits = GameObject.FindGameObjectsWithTag("Fruit");
        dam    = GameObject.Find("apple").GetComponent <damage>();
    }
Esempio n. 10
0
    // Use this for initialization

    public override void  takeDamage(damage damage)
    {
        Debug.Log("in net take damage");
        if (unit.alive && !(unit.exiled))//單位活著且沒有被放逐
        {
            int   realnum        = 0;
            float realstiff      = 0;
            float conversalyTime = 0;
            if (damage.kind == 1 && !(unit.immune_attack))                             //受到的是戰鬥傷害且單位不是物免
            {
                if (!(unit.conversely) || damage.hitConversely)                        //如果單位沒倒地或傷害能攻擊倒地單位
                {
                    realnum = (damage.num - (damage.num * (unit.damageReduce / 100))); //傷害結算:單位生命值減少傷害量減物理減傷
                }
                if (unit.canBeStiff)                                                   //硬直判定
                {
                    realstiff = damage.stiffTime - damage.stiffTime * (unit.stiffReduce / 100);
                }
                if (damage.makeConversaly && (!unit.conversely) && unit.canBeConvesly)//倒地判定:如果伤害会击倒,且单位不为击倒状态,且可以被击倒
                {
                    conversalyTime = unit.standConveslyTime;
                }
            }
            else if (damage.kind == 2 && !(unit.immune_skill))                          //受到的是戰鬥傷害且單位不是物免
            {
                if (!(unit.conversely) || damage.hitConversely)                         //如果單位沒倒地或傷害能攻擊倒地單位
                {
                    realnum -= (damage.num - (damage.num * (unit.energyReduce / 100))); //單位生命值減少傷害量減特殊減傷
                }
                if (unit.canBeStiff)
                {
                    realstiff = damage.stiffTime - damage.stiffTime * (unit.stiffReduce / 100);
                }
                if (damage.makeConversaly && (!unit.conversely) && unit.canBeConvesly)//倒地判定
                {
                    conversalyTime = unit.standConveslyTime;
                }
            }
            var parameter = new Dictionary <byte, object>()
            {
                { (byte)1, realnum },
                { (byte)2, realstiff },
                { (byte)3, conversalyTime },
                { (byte)4, unit.No }
            };
            client.peer.OpCustom(4, parameter, true);
        }
    }
Esempio n. 11
0
    void weapon()
    {
        isFiring = true;
        isFull   = false;
        RaycastHit hit;

        if (Physics.Raycast(Camera.transform.position, Camera.transform.forward, out hit))
        {
            if (hit.transform.tag == "Enemy")
            {
                damage enemy = hit.transform.GetComponent <damage>();
                enemy.Damage1(20f);
                Debug.Log("Bullet Hit");
            }
            surfaceHit(hit.point, hit.normal);
        }
    }
Esempio n. 12
0
    void OnTriggerEnter2D(Collider2D collider)
    {
        health -= damage;
        AudioSource.PlayClipAtPoint(cracka, transform.position);
        damage missile = collider.gameObject.GetComponent <damage>();

        if (missile)
        {
            missile.Hit();
            if (health <= 0)
            {
                var bushtia = FindObjectOfType <enemies>();
                Destroy(gameObject);

                scoreKeeper22 = FindObjectOfType <ScoreToWin>();
                scoreKeeper22.Score(scoreValuee);
            }
        }
    }
Esempio n. 13
0
 // Update is called once per frame
 void Update()
 {
     // Debug.Log("(transform.position-origin).magnitude is" + (transform.position - origin).magnitude + "(endPoint-origin).magnitude is" + (endPoint - origin).magnitude);
     // Debug.Log("origin is" + origin + "position is" + transform.position);
     if ((new Vector3(endPoint.x, 0, endPoint.z) - new Vector3(transform.position.x, 0, transform.position.z)).magnitude <= 0.2)
     {
         //Debug.Log("enter endpoint!!!!!!!!!!!!!!!!!!!!!!!!!!!!! it is"+endPoint);
         // Debug.Log("this turn obs is" + obstacle);
         origin = new Vector3(0, 0, 0);
         damage d = new damage(1, 2, 1);
         obstacle = null;
         endPoint = new Vector3(0, 0, 0);
         forward  = new Vector3(0, 0, 0);
     }
     //Debug
     if (!endPoint.Equals(new Vector3(0, 0, 0)))
     {
         (GameObject.Find("mark") as GameObject).transform.position = endPoint;
     }
 }
Esempio n. 14
0
 public base_personnage(string _name,int _ID,santé _Santé, mana _Mana, energie _Energie, poudre _Poudre, vitess _Vitess, armor _Armor, encaissement _Encaissement, speed _Speed, tenacity _Tenacity, range _Range, damage _Damage, power _Power, life_steal _Life_Steal, vampirisme _Vampirisme, List<tool> _LT)
 {
     name = _name;
     ID = _ID;
     Santé = _Santé;
     Mana = _Mana;
     Energie = _Energie;
     Poudre = _Poudre;
     Vitess = _Vitess;
     Armor = _Armor;
     encaissement = _Encaissement;
     Speed = _Speed;
     Tenacity = _Tenacity;
     Range = _Range;
     Damage = _Damage;
     Power = _Power;
     Life_Steal = _Life_Steal;
     Vampirisme = _Vampirisme;
     List_tool = new List<tool>();
     List_tool = _LT;
 }
    // Use this for initialization
    void Start()
    {
        //get references to the child objects
        pearlOffset = transform.GetChild(0).gameObject;

        //get reference to the sprite renderer located on the pearlOffset child object
        pearlRenderer = pearlOffset.GetComponent <SpriteRenderer>();

        playerStateScript = gameObject.GetComponent <player_state>();

        numberOfPlatformsTouching = 0;

        damageScript = GetComponent <damage> ();

        rBody = GetComponent <Rigidbody2D> ();

        scoreScript = GameObject.FindGameObjectWithTag("Score_Keeper").GetComponent <score_keeper>();

        statusAnim = GetComponent <Animator> ();

        soundPlayer = GameObject.FindGameObjectWithTag("Sound_Player").GetComponent <sound_player>();
    }
Esempio n. 16
0
    void Fire(Transform target)
    {
        timer              = 0f;
        linePosition       = barrel.position;
        shootray.origin    = linePosition;
        shootray.direction = barrel.forward;

        if (Physics.Raycast(shootray, out shootHit, range, shootableMask))
        {
            damage damage = shootHit.collider.GetComponent <damage>();

            if (damage != null)
            {
                damage.TakeDamage(damagePerHit);
            }
            hitLine.enabled     = true;
            barrelLight.enabled = true;
            hitLine.SetPosition(0, linePosition);
            hitLine.SetPosition(1, shootHit.transform.position);
            audio.Play();
        }
    }
Esempio n. 17
0
 public void skill_othercausedamage(Creature causer, Creature traget, damage give)
 {
 }
Esempio n. 18
0
        public ZoneTable()
        {
            int          ctx = 0, cta = 0;
            StreamReader reader = new StreamReader(new FileInfo(@"scripts\areadata_cur.txt").FullName);

            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
                if (line.Length == 0)
                {
                    continue;
                }

                if (line.StartsWith("//"))
                {
                    continue;
                }

                if (line.StartsWith("area_begin"))
                {
                    L2Zone       zone     = null;
                    ZoneTemplate template = new ZoneTemplate();
                    string[]     d        = line.Split('\t');

                    for (int i = 1; i < d.Length; i++)
                    {
                        if (d[i].Equals("area_end"))
                        {
                            continue;
                        }

                        string param = d[i].Split('=')[0];
                        string val   = d[i].Substring(param.Length + 1);

                        switch (param)
                        {
                        case "name":
                            template.Name = val;
                            break;

                        case "map_no":
                            template._map_no = val;
                            break;

                        case "type":
                        {
                            template.Type = (ZoneTemplate.ZoneType)Enum.Parse(typeof(ZoneTemplate.ZoneType), val);

                            switch (template.Type)
                            {
                            case ZoneTemplate.ZoneType.battle_zone:
                                zone = new battle_zone();
                                break;

                            case ZoneTemplate.ZoneType.peace_zone:
                                zone = new peace_zone();
                                break;

                            case ZoneTemplate.ZoneType.water:
                                zone = new water();
                                break;

                            case ZoneTemplate.ZoneType.no_restart:
                                zone = new no_restart();
                                break;

                            case ZoneTemplate.ZoneType.ssq_zone:
                                zone = new ssq_zone();
                                break;

                            case ZoneTemplate.ZoneType.mother_tree:
                                zone = new mother_tree();
                                template._hp_regen_bonus = 2;
                                template._mp_regen_bonus = 1;
                                break;

                            case ZoneTemplate.ZoneType.damage:
                                zone = new damage();
                                template._damage_on_hp = 200;
                                template._damage_on_mp = 0;
                                break;

                            case ZoneTemplate.ZoneType.poison:
                                zone = new poison();
                                template.setSkill("s_area_a_speed_down");
                                break;

                            case ZoneTemplate.ZoneType.swamp:
                                zone = new swamp();
                                template._move_bonus = -50;
                                break;

                            case ZoneTemplate.ZoneType.instant_skill:
                                zone = new instant_skill();
                                break;
                            }
                        }
                        break;

                        case "affect_race":
                            template._affect_race = val;
                            break;

                        case "entering_message_no":
                            template._entering_message_no = int.Parse(val);
                            break;

                        case "leaving_message_no":
                            template._leaving_message_no = int.Parse(val);
                            break;

                        case "range":
                            template.setRange(val);
                            break;

                        case "move_bonus":
                            template._move_bonus = int.Parse(val);
                            break;

                        case "default_status":
                            template.DefaultStatus = val.Equals("on");
                            break;

                        case "event_id":
                            template._event_id = int.Parse(val);
                            break;

                        case "damage_on_hp":
                            template._damage_on_hp = int.Parse(val);
                            break;

                        case "damage_on_mp":
                            template._damage_on_mp = int.Parse(val);
                            break;

                        case "message_no":
                            template._message_no = int.Parse(val);
                            break;

                        case "target":
                            template._target = (ZoneTemplate.ZoneTarget)Enum.Parse(typeof(ZoneTemplate.ZoneTarget), val);
                            break;

                        case "skill_prob":
                            template._skill_prob = int.Parse(val);
                            break;

                        case "unit_tick":
                            template._unit_tick = int.Parse(val);
                            break;

                        case "initial_delay":
                            template._initial_delay = int.Parse(val);
                            break;

                        case "skill_list":
                            template.setSkillList(val);
                            break;

                        case "skill_name":
                            template.setSkill(val.Substring(1).Replace("]", ""));
                            break;

                        case "exp_penalty_per":
                            template._exp_penalty_per = int.Parse(val);
                            break;

                        case "item_drop":
                            template._item_drop = val.Equals("on");
                            break;
                        }
                    }
                    zone.Name      = template.Name;
                    zone.Template  = template;
                    zone.Territory = new ZoneNPoly(template._x, template._y, template._z1, template._z2);
                    cta++;
                    for (int i = 0; i < template._x.Length; i++)
                    {
                        L2WorldRegion region = L2World.Instance.GetRegion(template._x[i], template._y[i]);
                        if (region != null)
                        {
                            ctx++;
                            // region._zoneManager.addZone(zone);
                        }
                        else
                        {
                            CLogger.error("AreaTable: null region at " + template._x[i] + " " + template._y[i] + " for zone " + zone.Name);
                        }
                    }
                }
            }

            CLogger.info("AreaTable: intercepted " + ctx + " regions with " + cta + " zones");
        }
Esempio n. 19
0
 /// <summary>
 /// Calculates damage to shields, armor, and character given damage and a character model
 /// </summary>
 public static (float damageToShields, float damageToArmor, float damageToCharacter) DamageRatio(float damage, float pierce, CharacterModel character) => DamageRatioImpl(damage, pierce, character);
Esempio n. 20
0
 public base_personnage(santé _Santé, mana _Mana, energie _Energie, poudre _Poudre, vitess _Vitess, armor _Armor, encaissement _Encaissement, speed _Speed, tenacity _Tenacity, range _Range, damage _Damage, power _Power, life_steal _Life_Steal, vampirisme _Vampirisme)
 {
 }
Esempio n. 21
0
 public void skill_othertakedamage(Creature causer, damage get)
 {
 }
Esempio n. 22
0
    public static Variant apply_dmg_on_pl(IBaseUnit tar_sprite, IBaseUnit frm_sprite, damage damage, long cur_clock_tm, int per, bool direct_dmg = false)
    {
        // TO DO : 优化: per = 1000时不需要计算增益
        //direct_dmg 非状态技能伤害


        var tar_pl = tar_sprite.get_pack_data();
        if (tar_pl == null)
        {
            return null;
        }

        if (tar_sprite.ignore_dmg())
        {
            return null;
        }
        //::g_dump( " apply_dmg_on_pl()  ===>>>>", "") ;
        //var ret = {hited=3, criatk=0, dmg=0, dobdmg=false, isdie=false, frm_iid=pl.iid, to_iid=tar_pl.iid};
        var ret = apply_dmg_on_pl_ex(tar_sprite, frm_sprite, damage, cur_clock_tm, per, false, direct_dmg);



        if (ret["hited"]._int32 == 3)
        {
            // broadcast hpchange msg
            //var hpchange = { frm_iid = ret.frm_iid, hited = ret.hited, criatk = ret.criatk, dobdmg = ret.dobdmg };
            //        if (ret.dmg != 0)
            //        {
            //            hpchange.hpadd < - -ret.dmg;
            //            hpchange.die < -ret.isdie;
            //        }
            //        if (("dp_dmg" in ret) && ret.dp_dmg != 0 )
            //{
            //            hpchange.dpadd < - -ret.dp_dmg;
            //        }
            //        tar_sprite.broad_cast_zone_msg_and_self(26, { iid = tar_pl.iid, hpchange = hpchange});
        }

        return ret;
    }
Esempio n. 23
0
    //    {
    //    level = 1,
    //    atktp = atk_type.ATKTP_ATK,

    //    atk_min = 100,
    //    atk_max = 100,
    //    matk_min = 100,
    //    matk_max = 100,
    //    atk_rate = 1000, // 命中率
    //    miss_rate = 0,  // 闪避
    //    pkatkrate = 100,
    //    pkmisrate = 100,

    //    criatk = 0,
    //    criatk_debuffs = 0, //暴击抵抗,相对 criatk 的抵抗 ,千分比, 算法:受到暴击击的概率降低xx 
    //    cridmg = 0,
    //    exatk = 0,
    //    exatk_debuffs = 0, // 卓越一击率抵抗, 相对 exatk 的抵抗 ,千分比, 算法:受到卓越一击的概率降低xx
    //    exdmg = 0,
    //    dobrate = 0,
    //    igdef_rate = 0,
    //    igdef_rate_debuffs = 0, // 抵抗无视防御几率
    //    def_red = 0,
    //    dmg_red = 0,
    //    atk_dmg_mul = 0,
    //    igdmg_red = 0,  // 无视伤害减免几率,千分比
    //    igatk_dmg_mul = 0,// 无视伤害增益几率,千分比
    //    hpsuck = 0,     // 每次攻击吸收生命值
    //    hpsuck_dmgmul = 0, // 每次攻击吸收生命值增加伤害比例
    //    addResist = [0,0,0,0,0,0,0], // 属性攻击
    //    clansred = 0,
    //    iid = 0,
    //};

    // damage { noratk: } ??
    public static Variant apply_dmg_on_pl_ex(IBaseUnit tar_sprite, IBaseUnit frm_sprite, damage damage, long cur_clock_tm, int per, bool wpnatk = false, bool direct_dmg = false)
    {
        // TO DO : 优化: per = 1000时不需要计算增益
        //direct_dmg 默认伤害....? 技能伤害, 追击伤害, 有miss几率
        //wpnatk 是否默认攻击

        //::g_dump( "apply_dmg [ damage ] ===>>>> ",  damage ) ;
        //::g_dump( "apply_dmg [ flags ] ===>>>> ",  { wpnatk = wpnatk, direct_dmg = direct_dmg } ) ;
        if (frm_sprite != null)
        {
            frm_sprite.on_hurt(tar_sprite);
        }

        tar_sprite.on_be_hurt(frm_sprite);

        var tar_pl = tar_sprite.get_pack_data();

        // 取不到状态添加对象情况下,本函数frm_sprite可能为空,则需要默认的计算参数
        var pl = default(IMapUnit);// g_dmg_calc_def_pl;

        if (frm_sprite != null)
        {
            pl = frm_sprite.get_pack_data();
            pl.last_atk_tm = cur_clock_tm; // 触发普通攻击cd
        }

        var ret = new Variant();
        ret["hited"] = 3;
        ret["criatk"] = 0;
        ret["dmg"] = 0;
        ret["dobdmg"] = false;
        ret["isdie"] = false;
        ret["frm_iid"] = pl.iid;
        ret["to_iid"] = tar_pl.iid;


        // 计算玩家 VS NPC 等级调整伤害
        //var dmg_per_add = 0;
        var is_pvp = true;
        if (frm_sprite != null)
        {
            if (frm_sprite.get_sprite_type() == map_sprite_type.MstMonster)
            {
                is_pvp = false;
            }
        }

        if (tar_sprite.get_sprite_type() == map_sprite_type.MstMonster)
        {
            is_pvp = false;
        }

        // miss check
        var bAllMiss = false;
        if (direct_dmg)
        {
            if (is_pvp)
            {
                // pvp
                var atk_rate = 100 * (pl.pkatkrate / (pl.pkatkrate + tar_pl.pkmisrate)/* * (pl.level/(pl.level + tar_pl.level))*/);
                var lvl_dist = tar_pl.level - pl.level;
                if (lvl_dist >= 300)
                {
                    atk_rate -= 15;
                }
                else if (lvl_dist >= 200)
                {
                    atk_rate -= 10;
                }
                else if (lvl_dist >= 100)
                {
                    atk_rate -= 5;
                }

                var judg = Utility.random(0, 100);
                if (judg > atk_rate)
                {
                    // miss
                    ret["hited"] = 1;
                    return ret;
                }
            }
            else
            {
                // pve
                var atk_rate = 100.0 * (pl.atk_rate - tar_pl.miss_rate) / pl.atk_rate;
                if (atk_rate < 5)
                {
                    if (atk_rate < 0)
                    {
                        bAllMiss = true;
                    }
                    atk_rate = 5;
                }

                var judg = Utility.random(0, 100);
                if (judg > atk_rate)
                {
                    // miss
                    ret["hited"] = 1;
                    return ret;
                }
            }
        }

        double targetDef = tar_pl.def;
        if (is_pvp) targetDef += tar_pl.pkdef;

        targetDef = (targetDef - targetDef * (pl.def_red / 1000.0));




        var igdef_rate = pl.igdef_rate - tar_pl.igdef_rate_debuffs;
        if (igdef_rate > 0)
        {
            var judg = Utility.random(0, 1000);
            if (judg < igdef_rate)
            {
                targetDef = 0;
                ret["criatk"] = 1; // 无视防御
            }
        }


        //Utility.trace_info("apply_dmg_on_pl frm_sprite:["+frm_sprite+"] per["+per+"]\n");
        //sys.dumpobj(pl);

        //var combat_conf = get_general_combat_conf();

        double total_dmg = 0;

        // TO DO : 计算伤害 damage 是否是物理伤害
        if (pl.atktp == atk_type.ATKTP_MATK && !wpnatk && (damage.plyatk != 1))
        {
            //pl.atktp == atk_type.ATKTP_MATK  是 魔攻攻击分类角色
            // !wpnatk  不是默认攻击
            //  (!("plyatk" in damage) || damage.plyatk!=1) 不是物理攻击

            // 根据魔法攻击计算伤害

            int dmg_min = damage.dmg_min + pl.matk_min * damage.noratk;
            int dmg_max = damage.dmg_max + pl.matk_max * damage.noratk;
            if (is_pvp && pl.pkmatk != 0)
            {//pvp魔法攻击增加
                dmg_min += pl.pkmatk;
                dmg_max += pl.pkmatk;
            }

            if (damage.attr >= 0)
            {// 属性攻击
                dmg_min += pl.addResist[damage.attr];
                dmg_max += pl.addResist[damage.attr];
            }

            // TO DO : 根据装备武器不同来计算伤害
            //if(direct_dmg && frm_sprite)
            //{
            //    //frm_sprite.get_equip_by_pos(6); // 获取装备的武器
            //}

            double dmg = 0;
            var dmg_calced = false;

            if (damage.noratk > 0 && (pl.criatk - pl.criatk_debuffs > 0 || pl.exatk - pl.exatk_debuffs > 0))
            {
                var judg = Utility.random(0, 1000);
                if (judg < pl.exatk - pl.exatk_debuffs)
                {//卓越一击几率
                    dmg = dmg_max - targetDef;
                    dmg += dmg_max * (0.2 + pl.exper_add / 1000.0);
                    dmg += pl.exdmg;

                    ret["criatk"] = 2; // 卓越一击

                    dmg_calced = true;
                }
                else
                {
                    judg = Utility.random(0, 1000);
                    if (judg < pl.criatk - pl.criatk_debuffs)
                    {// 会心一击几率
                        dmg = dmg_max - targetDef;
                        dmg += pl.cridmg;

                        ret["criatk"] = 3; // 会心一击

                        dmg_calced = true;
                    }
                }
            }

            if (!dmg_calced)
            {
                dmg = Utility.random(dmg_min, dmg_max + 1);

                //if(is_pvp)
                //{
                //    dmg = dmg - (targetDef*tar_sprite.game_conf.pvp_def_per/100.0);
                //}
                //else
                //{
                //    dmg = dmg - targetDef;
                //}      
            }

            if (frm_sprite != null && frm_sprite.get_sprite_type() == map_sprite_type.MstPlayer)
            {
                //// 技能攻击,技能额外加成
                //int dmg_mul = damage["noratk"];
                //var baseatt_conf = frm_sprite.carr_gen_conf.baseatt[0];
                //if( ("inte2atk" in baseatt_conf) && baseatt_conf.inte2atk != 0 )
                //{
                //    dmg_mul += pl.inte/(pl.inte+baseatt_conf.inte2atk);
                //}
                ////sys.trace( sys.SLT_DETAIL, "atk_type.ATKTP_MATK  dmg_mul=" + dmg_mul + " baseatt_conf.inte2atk =" + baseatt_conf.inte2atk + "\n")
                //dmg = dmg * dmg_mul;
            }

            if (dmg <= 0)
            {
                dmg = 1;
            }

            total_dmg += dmg;
        }
        else
        {
            // 根据攻击力计算伤害

            var skil_dmg_min = damage.dmg_min + pl.atk_min;
            var skil_dmg_max = damage.dmg_max + pl.atk_max;
            if (is_pvp && pl.pkatk != 0)
            {
                skil_dmg_min += pl.pkatk;
                skil_dmg_max += pl.pkatk;
            }

            if (damage.attr >= 0)
            {
                skil_dmg_min += pl.addResist[damage.attr];
                skil_dmg_max += pl.addResist[damage.attr];
            }

            double dmg = 0;
            var dmg_calced = false;

            if (damage.noratk > 0 && (pl.criatk - pl.criatk_debuffs > 0 || pl.exatk - pl.exatk_debuffs > 0))
            {
                var judg = Utility.random(0, 1000);
                if (judg < pl.exatk - pl.exatk_debuffs)
                {
                    dmg = skil_dmg_max;
                    dmg += skil_dmg_max * (0.2 + pl.exper_add / 1000.0);
                    dmg += pl.cridmg;
                    dmg += pl.exdmg;

                    ret["criatk"] = 2; // 卓越一击

                    dmg_calced = true;
                }
                else
                {
                    judg = Utility.random(0, 1000);
                    if (judg < pl.criatk - pl.criatk_debuffs)
                    {
                        dmg = skil_dmg_max;
                        dmg += pl.cridmg;

                        ret["criatk"] = 3; // 会心一击

                        dmg_calced = true;
                    }
                }
            }

            if (!dmg_calced)
            {
                dmg = Utility.random(skil_dmg_min, skil_dmg_max + 1);
            }

            //if(is_pvp)
            //{
            //    dmg = dmg -  (targetDef*tar_sprite.game_conf.pvp_def_per/100.0);
            //}
            //else
            //{
            //    dmg = dmg - targetDef;
            //}      

            if (!wpnatk && frm_sprite != null && frm_sprite.get_sprite_type() == map_sprite_type.MstPlayer)
            {
                // 物理技能攻击,技能额外加成
                var dmg_mul = damage.noratk;
                //var baseatt_conf = frm_sprite.carr_gen_conf.baseatt[0];
                //if( ("inte2atk" in baseatt_conf) && baseatt_conf.inte2atk != 0 )
                //{
                //    dmg_mul += pl.inte/(pl.inte+baseatt_conf.inte2atk);
                //}
                //sys.trace( sys.SLT_DETAIL, "atk_type.ATKTP_ATK  dmg_mul=" + dmg_mul + "\n")
                dmg = dmg * dmg_mul;
            }

            if (dmg <= 0)
            {
                dmg = 1;
            }

            total_dmg += dmg;
        }

        if (bAllMiss)
        {//pve中 攻击者攻击几率 小于 被攻击者 miss几率时,攻击减益到30%
            total_dmg = (total_dmg * 30) / 100;
        }

        if (tar_pl.dmg_red != 1)
        {//伤害减免
            if (pl.igdmg_red <= 0)
            {   //无视伤害减免几率
                total_dmg = (total_dmg * tar_pl.dmg_red);
            }
            else
            {
                var judg = Utility.random(0, 1000);
                if (judg >= pl.igdmg_red)
                {
                    total_dmg = (total_dmg * tar_pl.dmg_red);
                }
            }
        }
        if (is_pvp && tar_pl.pkdmg_red != 1)
        { //pvp 伤害减免
            total_dmg = (total_dmg * tar_pl.pkdmg_red);
        }

        var tlevel = pl.level / 10;
        if (total_dmg >= 0 && total_dmg < tlevel)
        {
            if (tlevel < 1)
            {
                tlevel = 1;
            }

            total_dmg = tlevel;
        }

        // TO DO : sprite damage, 小精灵伤害

        if (direct_dmg)
        {
            // 计算生命损耗伤害加成
            if (frm_sprite != null && pl.hpsuck > 0)
            {
                // 损耗自己生命
                if (pl.hp > pl.hpsuck)
                {
                    pl.hp -= pl.hpsuck;
                    if (pl.hp < 0) pl.hp = 0;

                    // broadcast hpchange msg
                    //frm_sprite.broad_cast_zone_msg_and_self(26, {iid=pl.iid, hpchange={hpadd=-pl.hpsuck, die=(pl.hp <= 0), frm_iid=pl.iid}});

                    //if(pl.cid >0)
                    //{
                    //    var tid = team.get_ply_teamid(pl.cid);
                    //    if(tid > 0)
                    //    {
                    //        // 在队伍中,发送队友属性变化消息
                    //        team_bcast_rpc_except(tid, 138, {cid=pl.cid, hp=pl.hp}, pl.sid);
                    //    }
                    //}

                    if (pl.hpsuck_dmgmul > 0)
                    {
                        // 增加攻击伤害
                        total_dmg = total_dmg * ((1000.0 + pl.hpsuck_dmgmul) / 1000.0);
                    }
                }
            }
            var atk_dmg_mul = pl.atk_dmg_mul;
            if (pl.igatk_dmg_mul > 0)
            {   //无视伤害增益几率
                var judg = Utility.random(0, 1000);
                if (judg < pl.igatk_dmg_mul)
                {
                    atk_dmg_mul = 0;
                }
            }
            if (is_pvp)
            {
                total_dmg += (total_dmg * ((atk_dmg_mul + pl.pkatk_dmg_mul) / 1000.0));
            }
            else
            {
                total_dmg += (total_dmg * (atk_dmg_mul / 1000.0));
            }

            //// 计算技能伤害的属性加成值
            //if(damage.ContainsKey("attdmg_mul"))
            //{
            //    foreach(var attdmg in damage["attdmg_mul"])
            //    {
            //        var val = 0;
            //        if(attdmg.name in pl)
            //        {
            //            val = pl[attdmg.name];
            //        }
            //        total_dmg *= ((attdmg.base + val * attdmg.val ) / attdmg.basediv);
            //    }
            //}
            //if("attdmg_add" in damage)
            //{
            //    foreach(attdmg in damage.attdmg_add)
            //    {
            //        var val = 0;
            //        if(attdmg.name in pl)
            //        {
            //            val = pl[attdmg.name];
            //        }
            //        total_dmg += ((attdmg.base + val * attdmg.val ) / attdmg.basediv);
            //    }
            //}


            //if((tar_sprite.get_sprite_type()==map_sprite_type.MstMonster) && tar_pl.clanatt_eff)
            //{
            //    // 需要计算副本中帮派科技伤害减免
            //    var clanper = 1000 - tar_pl.clanred + pl.clansred;

            //    //Utility.trace_info("calc clanatt total_dmg["+total_dmg+"] clanper["+clanper+"] pl.clansred["+pl.clansred+"] tar_pl.clanred["+tar_pl.clanred+"]\n");

            //    total_dmg = (total_dmg * ((clanper)/1000.0));

            //    //Utility.trace_info("calc clanatt total_dmg["+total_dmg+"]\n");
            //}

            // TO DO : 吸蓝 mpsteal
        }

        total_dmg += damage.hp_dmg;

        total_dmg = (total_dmg * (per / 1000.0));
        //sys.dumpobj(damage);
        //Utility.trace_info("total_dmg:["+total_dmg+"]\n");

        if (total_dmg.CompareTo(0) > 0)
        {
            var real_atk_dmg = total_dmg;

            if (total_dmg > 0)
            {
                if (frm_sprite != null)
                {
                    tar_sprite.onhate(frm_sprite, total_dmg);
                    tar_sprite.ondmg(frm_sprite, total_dmg);

                    if (frm_sprite.get_sprite_type() == map_sprite_type.MstPlayer)
                    {
                        if (frm_sprite.gmap.blvlmap)
                        {
                            frm_sprite.gmap.worldsvr.on_dmg(frm_sprite, tar_sprite, total_dmg);
                        }
                    }

                    if (direct_dmg)
                    {
                        frm_sprite.calc_weapon_dura(total_dmg); // 计算装备耐久损耗
                        frm_sprite.on_make_direct_dmg();
                    }
                }

                if (direct_dmg)
                {
                    tar_sprite.calc_eqp_dura(total_dmg); // 计算装备耐久损耗

                    // 计算双倍伤害
                    if (pl.dobrate > 0)
                    {
                        var judg = Utility.random(0, 1000);
                        if (judg < pl.dobrate)
                        {
                            total_dmg += total_dmg;
                            ret["dobdmg"] = true;
                        }
                    }
                }

                // 吸收伤害
                total_dmg = pl_absorb_dmg(tar_sprite, tar_pl, total_dmg);
                // 魔法抵扣生命
                total_dmg = pl_hpdmg_2_mpdmg(tar_sprite, tar_pl, total_dmg);
                // 伤害链接
                pl_dmg_link(tar_sprite, tar_pl, total_dmg);

            }

            if (is_pvp && total_dmg > 0)
            {
                var pkignore_dp = false;//无视dp  
                var pkigdp_rate = pl.pkigdp_rate - tar_pl.pkigdp_rate_debuffs;
                if (pkigdp_rate > 0)
                {
                    var judg = Utility.random(0, 1000);
                    pkignore_dp = judg < pkigdp_rate;
                }
                if (!pkignore_dp)
                {
                    if (tar_pl.dp < total_dmg)
                    {
                        var dp_dmg = tar_pl.dp;
                        tar_pl.dp = 0;

                        //剩余值 10倍作用于hp
                        total_dmg = ((total_dmg - dp_dmg));//*tar_sprite.game_conf.ply_hp_dmg_factor);
                        tar_pl.hp -= (int)total_dmg;
                        if (tar_pl.hp < 0) tar_pl.hp = 0;

                        ret["dp_dmg"] = dp_dmg;
                    }
                    else
                    {
                        tar_pl.dp -= (int)total_dmg;
                        if (tar_pl.dp > tar_pl.max_dp) tar_pl.dp = tar_pl.max_dp;

                        ret["dp_dmg"] = total_dmg;
                        total_dmg = 0;
                    }
                }
                else
                {
                    //剩余值 10倍作用于hp
                    total_dmg = (total_dmg * 10);//tar_sprite.game_conf.ply_hp_dmg_factor);
                    tar_pl.hp -= (int)total_dmg;
                    if (tar_pl.hp < 0) tar_pl.hp = 0;
                }
                //sys.trace( sys.SLT_DETAIL, "tar_pl.cid =" + tar_pl.cid + "    tar_pl.dp = " +  tar_pl.dp + "    tar_pl.hp = " +  tar_pl.hp + "\n");      
            }
            else
            {
                tar_pl.hp -= (int)total_dmg;
                if (tar_pl.hp < 0) tar_pl.hp = 0;
                if (tar_pl.hp > tar_pl.max_hp) tar_pl.hp = tar_pl.max_hp;
            }

            // broadcast hpchange msg
            //tar_sprite.broad_cast_zone_msg_and_self(26, {iid=tar_pl.iid, hpchange={hpadd=-total_dmg, die=(tar_pl.hp <= 0), frm_iid=pl.iid}});
            ret["isdie"] = (tar_pl.hp <= 0);
            ret["dmg"] = total_dmg;

            //if(tar_pl.cid >0)
            //{
            //    var tid = team.get_ply_teamid(tar_pl.cid);
            //    if(tid > 0)
            //    {
            //        // 在队伍中,发送队友属性变化消息
            //        if( is_pvp )
            //        {
            //            team_bcast_rpc_except(tid, 138, {cid=tar_pl.cid, hp=tar_pl.hp, dp=tar_pl.dp}, tar_pl.sid);
            //        }
            //        else
            //        {
            //            team_bcast_rpc_except(tid, 138, {cid=tar_pl.cid, hp=tar_pl.hp}, tar_pl.sid);
            //        }         
            //    }
            //}

            if (tar_pl.hp <= 0)
            {
                // die!
                tar_sprite.die(frm_sprite);
            }
            //目标死亡,本次伤害不反弹
            if (frm_sprite != null && real_atk_dmg > 0 && tar_pl.iid != pl.iid && tar_pl.hp > 0)
            {
                // 反弹伤害
                double dmg = 0;
                if (tar_pl.rev_dmg_mul > 0)
                {
                    dmg = (real_atk_dmg * ((tar_pl.rev_dmg_mul) / 1000.0));
                    if (dmg <= 0) dmg = 1;
                }
                if (tar_pl.rev_atk > 0)
                {
                    var judg = Utility.random(0, 1000);
                    if (judg < tar_pl.rev_atk)
                    {
                        dmg += real_atk_dmg;
                    }
                }

                //if(is_pvp)
                //{
                //    dmg = (dmg * combat_conf.pk_dmg_per/100);
                //}

                if (dmg > 0)
                {
                    // 吸收伤害
                    dmg = pl_absorb_dmg(frm_sprite, pl, dmg);
                    // 魔法抵扣生命
                    dmg = pl_hpdmg_2_mpdmg(frm_sprite, pl, dmg);

                    frm_sprite.onhate(tar_sprite, dmg);
                    frm_sprite.ondmg(tar_sprite, dmg);

                    //var frm_hpchange = {frm_iid=tar_pl.iid}
                    if (is_pvp)
                    {
                        //sys.trace( sys.SLT_DETAIL, "pl.dp =" + pl.dp + "pl.hp = "+ pl.hp + "\n");
                        if (pl.dp < dmg)
                        {
                            var dp_dmg = pl.dp;
                            pl.dp = 0;
                            //剩余值 10倍作用于hp
                            dmg = ((dmg - dp_dmg));//*tar_sprite.game_conf.ply_hp_dmg_factor);
                            pl.hp -= (int)dmg;
                            if (pl.hp < 0) pl.hp = 0;

                            //frm_hpchange.dpadd <- -dp_dmg;
                            //frm_hpchange.hpadd <- -dmg;
                            //frm_hpchange.die <- pl.hp <= 0;
                        }
                        else
                        {
                            pl.dp -= (int)dmg;

                            //frm_hpchange.dpadd <- -dmg;
                        }
                        //sys.dumpobj( frm_hpchange ); 
                    }
                    else
                    {
                        pl.hp -= (int)dmg;
                        if (pl.hp < 0) pl.hp = 0;

                        //frm_hpchange.hpadd <- -dmg;
                        //frm_hpchange.die <- pl.hp <= 0;
                    }

                    // broadcast hpchange msg
                    //frm_sprite.broad_cast_zone_msg_and_self(26, {iid=pl.iid, hpchange=frm_hpchange});

                    //if(pl.cid > 0)
                    ////if("cid" in pl)
                    //{
                    //    var tid = team.get_ply_teamid(pl.cid);
                    //    if(tid > 0)
                    //    {
                    //        // 在队伍中,发送队友属性变化消息
                    //        if ( is_pvp )
                    //        {
                    //             team_bcast_rpc_except(tid, 138, {cid=pl.cid, hp=pl.hp, dp=pl.dp}, pl.sid);
                    //        }
                    //        else
                    //        {
                    //            team_bcast_rpc_except(tid, 138, {cid=pl.cid, hp=pl.hp}, pl.sid);
                    //        }                       
                    //    }
                    //}

                    if (pl.hp <= 0)
                    {
                        // 被弹死了
                        frm_sprite.die(tar_sprite);
                    }
                }
            }
        }

        // 魔法值、怒气值调整
        var mpchanged = false;
        //var mpchange_rpc = {};
        if (damage.mp_dmg != 0)
        {
            var mpdmg = (damage.mp_dmg * per / 1000);

            tar_pl.mp -= mpdmg;
            if (tar_pl.mp < 0) tar_pl.mp = 0;
            if (tar_pl.mp > tar_pl.max_mp) tar_pl.mp = tar_pl.max_mp;

            //mpchange_rpc.mpadd <- -mpdmg;
            mpchanged = true;

            if (frm_sprite != null)
            {
                tar_sprite.onhate(frm_sprite, mpdmg);
            }
        }

        if (mpchanged && tar_sprite.get_sprite_type() == map_sprite_type.MstPlayer)
        {
            // send mpchange msg
            //::send_rpc(tar_pl.sid, 32, mpchange_rpc);
        }

        return ret;
    }
Esempio n. 24
0
 // Use this for initialization
 void Start()
 {
     source    = GameObject.Find("Sound Manager").GetComponent <AudioSource> ();
     healthbar = GameObject.Find("healthbar").GetComponent <damage> ();
     wintime   = GameObject.FindGameObjectWithTag("Slider").GetComponent <Antibody> ();
 }
 private void Start()
 {
     driver = gameObject.GetComponent <CharacterDriver>();
     weapon = childProjectile.GetComponent <damage>();
     left   = Random.value >= .5;
 }
    // Use this for initialization
    void Start()
    {
        //get references to the child objects
        pearlOffset = transform.GetChild (0).gameObject;

        //get reference to the sprite renderer located on the pearlOffset child object
        pearlRenderer = pearlOffset.GetComponent<SpriteRenderer>();

        playerStateScript = gameObject.GetComponent<player_state>();

        numberOfPlatformsTouching = 0;

        damageScript = GetComponent<damage> ();

        rBody = GetComponent<Rigidbody2D> ();

        scoreScript = GameObject.FindGameObjectWithTag("Score_Keeper").GetComponent<score_keeper>();

        statusAnim = GetComponent<Animator> ();

        soundPlayer = GameObject.FindGameObjectWithTag ("Sound_Player").GetComponent<sound_player>();
    }