public void RemoveBuff(IBuff b) { lock (_buffsLock) { if (b.BuffAddType == BuffAddType.STACKS_AND_OVERLAPS && b.StackCount > 1) { b.DecrementStackCount(); RemoveBuff(b.Name); BuffList.Remove(b); RemoveBuffSlot(b); var tempbuffs = GetBuffsWithName(b.Name); tempbuffs.ForEach(tempbuff => tempbuff.SetStacks(b.StackCount)); BuffSlots[b.Slot] = tempbuffs[0]; Buffs.Add(b.Name, tempbuffs[0]); var newestBuff = tempbuffs[tempbuffs.Count - 1]; if (!b.IsHidden) { if (b.BuffType == BuffType.COUNTER) { _game.PacketNotifier.NotifyNPC_BuffUpdateNumCounter(Buffs[b.Name]); } else { if (b.StackCount == 1) { _game.PacketNotifier.NotifyNPC_BuffUpdateCount(newestBuff, b.Duration - newestBuff.TimeElapsed, newestBuff.TimeElapsed); } else { _game.PacketNotifier.NotifyNPC_BuffUpdateCountGroup(this, tempbuffs, b.Duration - newestBuff.TimeElapsed, newestBuff.TimeElapsed); } } } } else { BuffList.RemoveAll(buff => buff.Elapsed()); RemoveBuff(b.Name); RemoveBuffSlot(b); if (!b.IsHidden) { _game.PacketNotifier.NotifyNPC_BuffRemove2(b); } } } }