public override bool StackEffect(ParsedEvtcLog log, BuffStackItem stackItem, List <BuffStackItem> stacks, List <BuffSimulationItemWasted> wastes) { if (stacks.Count <= 1) { throw new InvalidOperationException("Queue logic based must have a >1 capacity"); } BuffStackItem first = stacks[0]; stacks.RemoveAt(0); BuffStackItem minItem = stacks.MinBy(x => x.TotalBoonDuration()); if (minItem.TotalBoonDuration() > stackItem.TotalBoonDuration() + ParserHelper.ServerDelayConstant) { stacks.Insert(0, first); return(false); } wastes.Add(new BuffSimulationItemWasted(minItem.Src, minItem.Duration, minItem.Start)); if (minItem.Extensions.Count > 0) { foreach ((AgentItem src, long value) in minItem.Extensions) { wastes.Add(new BuffSimulationItemWasted(src, value, minItem.Start)); } } stacks[stacks.IndexOf(minItem)] = stackItem; stacks.Insert(0, first); Sort(log, stacks); return(true); }
public override bool StackEffect(ParsedEvtcLog log, BuffStackItem stackItem, List <BuffStackItem> stacks, List <BuffSimulationItemWasted> wastes) { if (stacks.Count == 0) { return(false); } BuffStackItem stack = stacks[0]; if (stack.TotalBoonDuration() <= stackItem.TotalBoonDuration() + ParserHelper.ServerDelayConstant) { wastes.Add(new BuffSimulationItemWasted(stack.Src, stack.Duration, stack.Start)); if (stack.Extensions.Count > 0) { foreach ((AgentItem src, long value) in stack.Extensions) { wastes.Add(new BuffSimulationItemWasted(src, value, stack.Start)); } } stacks[0] = stackItem; Sort(log, stacks); return(true); } else { return(false); } }
public override void Remove(AgentItem by, long removedDuration, int removedStacks, long time, ArcDPSEnums.BuffRemove removeType, uint id) { switch (removeType) { case ArcDPSEnums.BuffRemove.All: foreach (BuffStackItem stackItem in BuffStack) { WasteSimulationResult.Add(new BuffSimulationItemWasted(stackItem.Src, stackItem.Duration, time)); if (stackItem.Extensions.Count > 0) { foreach ((AgentItem src, long value) in stackItem.Extensions) { WasteSimulationResult.Add(new BuffSimulationItemWasted(src, value, time)); } } } BuffStack.Clear(); break; case ArcDPSEnums.BuffRemove.Single: for (int i = 0; i < BuffStack.Count; i++) { BuffStackItem stackItem = BuffStack[i]; if (Math.Abs(removedDuration - stackItem.TotalBoonDuration()) < ParserHelper.ServerDelayConstant) { WasteSimulationResult.Add(new BuffSimulationItemWasted(stackItem.Src, stackItem.Duration, time)); if (stackItem.Extensions.Count > 0) { foreach ((AgentItem src, long value) in stackItem.Extensions) { WasteSimulationResult.Add(new BuffSimulationItemWasted(src, value, time)); } } BuffStack.RemoveAt(i); break; } } break; default: break; } _logic.Sort(Log, BuffStack); }