public virtual void ClientOnObjectHit( WeaponFinalCache weaponCache, IWorldObject damagedObject, WeaponHitData hitData, ref bool isDamageStop) { }
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); }
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); }
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); }
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); } }
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); } }
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); } }
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); }
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); }