protected virtual bool DoWhisper(string rawParameters, params CommandParameter[] parameters) { if (parameters.Length <= 1) { Send("Whisper whom what?"); return(true); } ICharacter whom = FindHelpers.FindByName(Room.People, parameters[0]); if (whom == null) { Send(StringHelpers.CharacterNotFound); return(true); } string what = CommandHelpers.JoinParameters(parameters.Skip(1)); Act(ActOptions.ToCharacter, "You whisper '{0}' to {1:n}.", what, whom); whom.Act(ActOptions.ToCharacter, "{0:n} whispers you '{1}'.", this, what); ActToNotVictim(whom, "{0:n} whispers something to {1:n}.", this, whom); // ActOptions.ToAll cannot be used because 'something' is sent except for 'this' and 'whom' return(true); }
protected virtual bool DoSlay(string rawParameters, params CommandParameter[] parameters) { if (parameters.Length == 0) { Send("Slay whom?"); return(true); } ICharacter victim = FindHelpers.FindByName(Impersonating.Room.People, parameters[0]); if (victim == null) { Send(StringHelpers.CharacterNotFound); return(true); } if (victim == Impersonating) { Send("Suicide is a mortal sin."); return(true); } DependencyContainer.Instance.GetInstance <IServer>().Wiznet($"{DisplayName} slayed {victim.DebugName}.", WiznetFlags.Punish); victim.Act(ActOptions.ToAll, "{0:N} slay{0:v} {1} in cold blood!", Impersonating, victim); victim.RawKilled(Impersonating, false); return(true); }
public override bool Process(ICharacter source, ICharacter victim, IAbility ability, CombatHelpers.AttackResults attackResult) { if (victim.Auras.Any(x => x.Ability != null && x.Ability == DependencyContainer.Instance.GetInstance <IAbilityManager>().WeakenedSoulAbility)) { source.Act(ActOptions.ToCharacter, "{0} cannot be targeted by {1}.", victim, ability.Name); return(false); } int amount = ComputeAttributeBasedAmount(source, SecondaryAttributeTypes.SpellPower, 45.9m); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(victim, ability, source, AuraModifiers.DamageAbsorb, amount, AmountOperators.Fixed, ability.Duration, true); DependencyContainer.Instance.GetInstance <IWorld>().AddAura(victim, DependencyContainer.Instance.GetInstance <IAbilityManager>().WeakenedSoulAbility, source, AuraModifiers.None, 0, AmountOperators.None, 15, true); return(true); }
// Give item victim protected virtual bool DoGive(string rawParameters, params CommandParameter[] parameters) { if (parameters.Length < 2) { Send("Give what to whom?"); return(true); } IItem what = FindHelpers.FindByName(Content.Where(CanSee), parameters[0]); if (what == null) { Send(StringHelpers.ItemInventoryNotFound); return(true); } ICharacter whom = FindHelpers.FindByName(Room.People.Where(CanSee), parameters[1]); if (whom == null) { Send(StringHelpers.CharacterNotFound); return(true); } if (!whom.CanSee(what)) { Act(ActOptions.ToCharacter, "{0:n} can't see it.", whom); return(true); } if (what is ItemQuest) { Act(ActOptions.ToCharacter, "You cannot give quest items."); return(true); } // Give item to victim what.ChangeContainer(whom); ActToNotVictim(whom, "{0} gives {1} to {2}.", this, what, whom); whom.Act(ActOptions.ToCharacter, "{0} gives you {1}.", this, what); Act(ActOptions.ToCharacter, "You give {0} to {1}.", what, whom); return(true); }
private static void ProcessOnOneTarget(ICharacter source, ICharacter victim, IAbility ability, bool cannotMiss, bool cannotBeDodgedParriedBlocked) { if (ability?.Effects == null || ability.Effects.Count == 0 || !source.IsValid || !victim.IsValid) { return; } // Miss/Dodge/Parray/Block check (only for harmful ability) CombatHelpers.AttackResults attackResult = CombatHelpers.AttackResults.Hit; if (ability.Behavior == AbilityBehaviors.Harmful) { // Starts fight if needed (if A attacks B, A fights B and B fights A) if (source != victim) { if (source.Fighting == null) { source.StartFighting(victim); } if (victim.Fighting == null) { victim.StartFighting(source); } // TODO: Cannot attack slave without breaking slavery } if (ability.Kind == AbilityKinds.Skill) { // TODO: refactor same code in Character.OneHit // Miss, dodge, parry, ... attackResult = CombatHelpers.YellowMeleeAttack(source, victim, cannotMiss, cannotBeDodgedParriedBlocked); Log.Default.WriteLine(LogLevels.Debug, $"{source.DebugName} -> {victim.DebugName} : attack result = {attackResult}"); switch (attackResult) { case CombatHelpers.AttackResults.Miss: victim.Act(ActOptions.ToCharacter, "{0} misses you.", source); source.Act(ActOptions.ToCharacter, "You miss {0}.", victim); return; // no effect applied case CombatHelpers.AttackResults.Dodge: victim.Act(ActOptions.ToCharacter, "You dodge {0}'s {1}.", source, ability.Name); source.Act(ActOptions.ToCharacter, "{0} dodges your {1}.", victim, ability.Name); return; // no effect applied case CombatHelpers.AttackResults.Parry: victim.Act(ActOptions.ToCharacter, "You parry {0}'s {1}.", source, ability.Name); source.Act(ActOptions.ToCharacter, "{0} parries your {1}.", victim, ability.Name); return; // no effect applied case CombatHelpers.AttackResults.Block: EquipedItem victimShield = victim.Equipments.FirstOrDefault(x => x.Item != null && x.Slot == EquipmentSlots.Shield); if (victimShield != null) // will never be null because MeleeAttack will not return Block if no shield { victim.Act(ActOptions.ToCharacter, "You block {0}'s {1} with {2}.", source, ability.Name, victimShield.Item); source.Act(ActOptions.ToCharacter, "{0} blocks your {1} with {2}.", victim, ability.Name, victimShield.Item); } // effect applied break; case CombatHelpers.AttackResults.Critical: case CombatHelpers.AttackResults.CrushingBlow: case CombatHelpers.AttackResults.Hit: // effect applied break; default: Log.Default.WriteLine(LogLevels.Error, $"Ability {ability.Name}[{ability.Kind}] returned an invalid attack result: {attackResult}"); break; } } else if (ability.Kind == AbilityKinds.Spell && ability.Behavior == AbilityBehaviors.Harmful) { // Miss/Hit/Critical attackResult = CombatHelpers.SpellAttack(source, victim, cannotMiss); switch (attackResult) { case CombatHelpers.AttackResults.Miss: victim.Act(ActOptions.ToCharacter, "{0} misses you.", source); source.Act(ActOptions.ToCharacter, "You miss {0}.", victim); return; // no effect applied case CombatHelpers.AttackResults.Hit: case CombatHelpers.AttackResults.Critical: // effect applied break; default: Log.Default.WriteLine(LogLevels.Error, $"Ability {ability.Name}[{ability.Kind}] returned an invalid attack result: {attackResult}"); break; } } else { Log.Default.WriteLine(LogLevels.Error, $"Ability {ability.Name} has an invalid kind: {ability.Kind}"); } } // Apply effects foreach (AbilityEffect effect in ability.Effects) { effect.Process(source, victim, ability, attackResult); } }