Пример #1
0
 public virtual void ClientOnObjectHit(
     WeaponFinalCache weaponCache,
     IWorldObject damagedObject,
     WeaponHitData hitData,
     ref bool isDamageStop)
 {
 }
Пример #2
0
        public override void SharedOnHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            double damage,
            WeaponHitData hitData,
            out bool isDamageStop)
        {
            base.SharedOnHit(weaponCache,
                             damagedObject,
                             damage,
                             hitData,
                             out isDamageStop);

            if (IsClient)
            {
                // on client we cannot consume energy
                return;
            }

            // consume energy on hit
            var byCharacter          = weaponCache.Character;
            var requiredEnergyAmount = SkillWeaponsEnergy.SharedGetRequiredEnergyAmount(byCharacter,
                                                                                        this.EnergyUsePerHit);

            CharacterEnergySystem.ServerDeductEnergyCharge(byCharacter, requiredEnergyAmount);
        }
Пример #3
0
        public sealed override void ClientOnObjectHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            WeaponHitData hitData,
            ref bool isDamageStop)
        {
            isDamageStop = true;

            var explosionWorldPosition = SharedGetExplosionWorldPosition(damagedObject, hitData);

            this.ClientExplodeAt(weaponCache, explosionWorldPosition);
        }
Пример #4
0
        public sealed override void ServerOnObjectHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            double damage,
            WeaponHitData hitData,
            ref bool isDamageStop)
        {
            isDamageStop = true;

            var explosionWorldPosition = SharedGetExplosionWorldPosition(damagedObject, hitData);

            this.ServerExplodeAt(weaponCache, explosionWorldPosition, isHit: true);
        }
Пример #5
0
 public virtual void ServerOnObjectHit(
     WeaponFinalCache weaponCache,
     IWorldObject damagedObject,
     double damage,
     WeaponHitData hitData,
     ref bool isDamageStop)
 {
     if (damagedObject is ICharacter damagedCharacter)
     {
         this.ServerOnCharacterHit(damagedCharacter,
                                   damage,
                                   ref isDamageStop);
     }
 }
Пример #6
0
        public override void SharedOnHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            double damage,
            WeaponHitData hitData,
            out bool isDamageStop)
        {
            isDamageStop = true;

            if (IsServer)
            {
                var explosionWorldPosition = SharedGetExplosionWorldPosition(damagedObject, hitData);
                this.ServerExplodeAt(weaponCache, explosionWorldPosition, isHit: true);
            }
            else
            {
                var explosionWorldPosition = SharedGetExplosionWorldPosition(damagedObject, hitData);
                this.ClientExplodeAt(weaponCache, explosionWorldPosition);
            }
        }
Пример #7
0
        public override void SharedOnHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            double damage,
            WeaponHitData hitData,
            out bool isDamageStop)
        {
            base.SharedOnHit(weaponCache,
                             damagedObject,
                             damage,
                             hitData,
                             out isDamageStop);

            if (IsServer &&
                damage > 0 &&
                damagedObject is ICharacter damagedCharacter)
            {
                // guaranteed small toxin effect per hit
                // (please note the addition formula inside the Toxins effect class is NOT linear
                //  so subsequent hits increasing it on less than 20%)
                damagedCharacter.ServerAddStatusEffect <StatusEffectToxins>(intensity: 0.2);
            }
        }
Пример #8
0
        public override void SharedOnHit(
            WeaponFinalCache weaponCache,
            IWorldObject damagedObject,
            double damage,
            WeaponHitData hitData,
            out bool isDamageStop)
        {
            if (damagedObject is ICharacter)
            {
                base.SharedOnHit(weaponCache, damagedObject, damage, hitData, out isDamageStop);
            }

            // make arrows to always stop on the first hit and have a chance to drop on the ground
            isDamageStop = true;

            if (IsServer &&
                isDamageStop &&
                RandomHelper.NextDouble() <= 2 / 3.0)    // 2/3 chance to recover the arrow
            {
                this.ServerCreateDroppedArrow(weaponCache,
                                              hitData.FallbackTilePosition.ToVector2D() + hitData.HitPoint);
            }
        }
        public override void SharedOnHit(WeaponFinalCache weaponCache, IWorldObject damagedObject, double damage, WeaponHitData hitData, out bool isDamageStop)
        {
            weaponCache.AllowNpcToNpcDamage = true;

            base.SharedOnHit(weaponCache, damagedObject, damage, hitData, out isDamageStop);
        }
Пример #10
0
        private static Vector2D SharedGetExplosionWorldPosition(IWorldObject damagedObject, WeaponHitData hitData)
        {
            var explosionWorldPosition = damagedObject switch
            {
                null => hitData.FallbackTilePosition.ToVector2D(),                                   // tile hit
                IDynamicWorldObject dynamicWorldObject => dynamicWorldObject.Position,
                _ => damagedObject.TilePosition.ToVector2D(),
            };

            return(explosionWorldPosition + hitData.HitPoint);
        }