示例#1
0
        public virtual Hashtable Fire(NebulaObject targetObject,
                                      out WeaponHitInfo hit,
                                      int skillID      = -1,
                                      float damageMult = 1.0f,
                                      bool forceShot   = false,
                                      bool useDamageMultSelfAsDamage = false)
        {
            m_NotResettableShotCounter++;

            MakeMeVisible();

            hit = new WeaponHitInfo();

            if (CheckWeaponTarget(targetObject))
            {
                Hashtable result = new Hashtable();
                result.Add((int)SPC.Source, nebulaObject.Id);
                result.Add((int)SPC.SourceType, nebulaObject.Type);
                result.Add((int)SPC.Target, targetObject.Id);
                result.Add((int)SPC.TargetType, targetObject.Type);
                result.Add((int)SPC.Workshop, cachedCharacter.workshop);
                result.Add((int)SPC.Skill, skillID);

                //InputDamage inputDamage = new InputDamage(nebulaObject, GetDamage())
                if (forceShot)
                {
                    InputDamage inputDamage = new InputDamage(nebulaObject, GetDamage(false));
                    CompleteForceShot(targetObject, ref hit, damageMult, useDamageMultSelfAsDamage, inputDamage);
                    inputDamage.SetHitInfo(hit);
                }
                else
                {
                    CheckWeaponBlocked(hit);

                    if (hit.interrupted)
                    {
                        UnblockSingleShot();
                        WeaponDamage dmg = GetDamage(false);
                        dmg.ClearAllDamages();
                        InputDamage inputDamage = new InputDamage(nebulaObject, dmg);
                        inputDamage.SetHitInfo(hit);
                    }
                    else
                    {
                        WeaponDamage damage = null;
                        if (IsCritical(ref hit))
                        {
                            damage = GetDamage(true);
                        }
                        else
                        {
                            damage = GetDamage(false);
                        }
                        InputDamage inputDamage = new InputDamage(nebulaObject, damage);

                        CheckWeaponDistance(targetObject, hit);

                        if (hit.interrupted)
                        {
                            damage.ClearAllDamages();
                        }
                        else
                        {
                            CheckWeaponHit(targetObject, hit);

                            if (hit.interrupted)
                            {
                                damage.ClearAllDamages();
                            }
                            else
                            {
                                if (nebulaObject.IsPlayer())
                                {
                                    nebulaObject.SendMessage(ComponentMessages.OnCriticalHit);
                                }

                                shotCounter++;

                                ApplyDamage(ref hit, targetObject.Damagable(), damageMult, useDamageMultSelfAsDamage, inputDamage);
                            }
                        }

                        inputDamage.SetHitInfo(hit);
                    }
                }

                foreach (DictionaryEntry entry in hit.GetInfo())
                {
                    result[(int)entry.Key] = entry.Value;
                }

                CheckPlayerAgro(targetObject);
                SendFireMessage(hit);
                //log.InfoFormat("final hit state: {0}", hit.state);

                return(result);
            }
            return(new Hashtable());
        }
示例#2
0
        //public void SetDamage(WeaponDamage dmg) {
        //    m_Damage = dmg;
        //}

        public void ClearAllDamages()
        {
            m_Damage.ClearAllDamages();
        }