private static void RunEnchantments(IMobileObject performer, EventType eventType, EventParamerters paramerter) { if (eventType == EventType.DamageReceivedBeforeDefense || eventType == EventType.DamageReceivedAfterDefense) { foreach (IEnchantment enchantment in paramerter.Defender.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } else if (eventType == EventType.DamageDealtBeforeDefense || eventType == EventType.DamageDealtAfterDefense) { if (performer != null) { foreach (IEnchantment enchantment in performer.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } else { IRoom performerRoom = performer.Room; if (performerRoom.Enchantments.Count > 0) { foreach (IEnchantment enchantment in performerRoom.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } if (performerRoom.Traps.Count > 0) { foreach (ITrap trap in performerRoom.Traps) { if (trap.Trigger == Trap.Target.TrapTrigger.All || (performer is NonPlayerCharacter && trap.Trigger == Trap.Target.TrapTrigger.NPC) || (performer is PlayerCharacter && trap.Trigger == Trap.Target.TrapTrigger.PC)) { foreach (IEnchantment enchantment in trap.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } if (performerRoom.PlayerCharacters.Count > 0) { foreach (IPlayerCharacter pc in performerRoom.PlayerCharacters) { if (pc.Enchantments.Count > 0) { if (pc == performer) { //verify the performer is still alive before they can trigger their enchantment if (performer.Room == performerRoom) { foreach (IEnchantment enchantment in performer.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } else { foreach (IEnchantment enchantment in pc.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } } if (performerRoom.NonPlayerCharacters.Count > 0) { foreach (INonPlayerCharacter npc in performerRoom.NonPlayerCharacters) { if (npc.Enchantments.Count > 0) { foreach (IEnchantment enchantment in npc.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } if (performerRoom.Items.Count > 0) { foreach (IItem item in performerRoom.Items) { if (item.Enchantments.Count > 0) { foreach (IEnchantment enchantment in item.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } } }
private static void RunEnchantment(IEnchantment enchantment, EventType eventType, EventParamerters paramerter) { switch (eventType) { case EventType.AttemptToFollow: enchantment.AttemptToFollow(paramerter.Direction, paramerter.Performer, paramerter.FollowedTarget); break; case EventType.Cast: enchantment.Cast(paramerter.Performer, paramerter.SpellName); break; case EventType.DamageDealtAfterDefense: enchantment.DamageDealtAfterDefense(paramerter.Attacker, paramerter.Defender, paramerter.DamageAmount); break; case EventType.DamageDealtBeforeDefense: enchantment.DamageDealtBeforeDefense(paramerter.Attacker, paramerter.Defender, paramerter.DamageAmount); break; case EventType.DamageReceivedAfterDefense: enchantment.DamageReceivedAfterDefense(paramerter.Attacker, paramerter.Defender, paramerter.DamageAmount); break; case EventType.DamageReceivedBeforeDefense: enchantment.DamageReceivedBeforeDefense(paramerter.Attacker, paramerter.Defender, paramerter.DamageAmount); break; case EventType.Drop: enchantment.Drop(paramerter.Performer, paramerter.Item); break; case EventType.EnterRoom: enchantment.EnterRoom(paramerter.Performer); break; case EventType.Equip: enchantment.Equip(paramerter.Performer, paramerter.Item); break; case EventType.Get: enchantment.Get(paramerter.Performer, paramerter.Item); break; case EventType.HeartbeatBigTick: enchantment.HeartbeatBigTick(paramerter.Performer); break; case EventType.LeaveRoom: enchantment.LeaveRoom(paramerter.Performer, paramerter.Direction); break; case EventType.OnDeath: enchantment.OnDeath(paramerter.Performer); break; case EventType.Perform: enchantment.Perform(paramerter.Performer, paramerter.SkillName); break; case EventType.ProcessedCommand: enchantment.ProcessedCommand(paramerter.Performer, paramerter.Command); break; case EventType.ProcessedCommunication: enchantment.ProcessedCommunication(paramerter.Performer, paramerter.Communication); break; case EventType.Relax: enchantment.Relax(paramerter.Performer); break; case EventType.ReturnedMessage: enchantment.ReturnedMessage(paramerter.Performer, paramerter.Message); break; case EventType.Sit: enchantment.Sit(paramerter.Performer); break; case EventType.Sleep: enchantment.Sleep(paramerter.Performer); break; case EventType.Stand: enchantment.Stand(paramerter.Performer); break; case EventType.Unequip: enchantment.Unequip(paramerter.Performer, paramerter.Item); break; } }
private static void RunEnchantments(IMobileObject performer, EventType eventType, EventParamerters paramerter) { if (eventType == EventType.DamageBeforeDefense) { if (performer != null) { foreach (IEnchantment enchantment in performer.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } foreach (IEnchantment enchantment in paramerter.Defender.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } else if (eventType == EventType.DamageAfterDefense) { if (performer != null) { foreach (IEnchantment enchantment in paramerter.Defender.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } foreach (IEnchantment enchantment in performer.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } else { IRoom performerRoom = performer.Room; if (performerRoom != null) //this is null if the player logs out { if (performerRoom.Enchantments.Count > 0) { foreach (IEnchantment enchantment in performerRoom.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } if (performerRoom.Traps.Count > 0) { foreach (ITrap trap in performerRoom.Traps) { if (trap.Trigger == Trap.Target.TrapTrigger.All || (performer is NonPlayerCharacter && trap.Trigger == Trap.Target.TrapTrigger.NPC) || (performer is PlayerCharacter && trap.Trigger == Trap.Target.TrapTrigger.PC)) { foreach (IEnchantment enchantment in trap.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } if (performerRoom.PlayerCharacters.Count > 0) { foreach (IPlayerCharacter pc in performerRoom.PlayerCharacters) { if (pc.Enchantments.Count > 0) { if (pc == performer) { //verify the performer is still alive before they can trigger their enchantment if (performer.Room == performerRoom) { foreach (IEnchantment enchantment in performer.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } else { //for only fire off when its the enchanted player turn, otherwise it will fire once for each player in the room //keeping else statement around in case we want to explain why we don't do this in case we want to try this again later } } } } if (performerRoom.NonPlayerCharacters.Count > 0) { foreach (INonPlayerCharacter npc in performerRoom.NonPlayerCharacters) { if (npc.Enchantments.Count > 0) { foreach (IEnchantment enchantment in npc.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } //store if the item being affected is in the room and its enchantments already triggered bool itemTriggered = false; if (performerRoom.Items.Count > 0) { foreach (IItem item in performerRoom.Items) { if (paramerter.Item == item) { itemTriggered = true; } if (item.Enchantments.Count > 0) { foreach (IEnchantment enchantment in item.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } //if it hasn't, such as being in a container, then fire its enchantments if (paramerter.Item != null && !itemTriggered) { if (paramerter.Item.Enchantments.Count > 0) { foreach (IEnchantment enchantment in paramerter.Item.Enchantments) { RunEnchantment(enchantment, eventType, paramerter); } } } } } }