* The name of the reaction
* @param reaction
* The reaction to add to this engine
- * @throws IllegalStateException
- * if the engine already contains a {@link Reaction} with the
- * given name
*/
public void addReaction(String name, Reaction reaction) {
synchronized (reactions) {
- if (reactions.containsKey(name)) {
- throw new IllegalStateException(String.format("Engine already contains a Reaction named “%s!”", name));
- }
reactions.put(name, reaction);
reactions.notifyAll();
}
/* wait until the next reaction has to run. */
net.pterodactylus.reactor.State lastState = stateManager.loadState(reactionName);
long lastStateTime = (lastState != null) ? lastState.time() : 0;
+ int lastStateFailCount = (lastState != null) ? lastState.failCount() : 0;
long waitTime = (lastStateTime + nextReaction.updateInterval()) - System.currentTimeMillis();
logger.debug(String.format("Time to wait for next Reaction: %d millseconds.", waitTime));
if (waitTime > 0) {
state = newState;
}
}
- if (state.success()) {
- stateManager.saveState(reactionName, state);
+ if (!state.success()) {
+ state.setFailCount(lastStateFailCount + 1);
}
+ stateManager.saveState(reactionName, state);
- /* only run trigger if we have collected two states. */
+ /* only run trigger if we have collected two successful states. */
Trigger trigger = nextReaction.trigger();
boolean triggerHit = false;
- if ((lastState != null) && state.success()) {
+ if ((lastState != null) && lastState.success() && state.success()) {
logger.debug("Checking Trigger for changes...");
triggerHit = trigger.triggers(state, lastState);
}