* Merge BreakOnWeightlessMove and BreakOnMove. Provide different theshold for weightless movement.
* Adjust WeightlessMovementThresholds. Put a thing I forgot to put in the doafterargs.
* Make DoAfterArgs only use OnMove to determine whether to check for
movement and MoveThreshold to determine the threshold regardless of
weightlessness. Gave DistanceThreshold a default value which will always
be checked now.
* Fix issue introduced by merge.
* Use interaction system for determining whether a distance is within range
* Fix incorrect doafter args introduced by previous merge.
Forgor to commit these.
* Exorcise ghost.
The execution system should have been deleted when I merged previously.
For a reason I cannot comprehend it came back, but only the execution
system.
* Exorcise ghost Pt. 2
* Allow for movement check to be overriden in zero g and adjust doafter args where needed.
You can now override checking for movement in zero g with the BreakOnWeightlessMove bool. By default it will check.
The following doafters were made to ignore the movement check in zero g:
- Healing yourself with healing items,
- Removing embedded projectiles,
- Using tools like welders and crowbars
* Adjust distance for cuffing/uncuffing to work. Make injections not break on weightless movement.
* Fix evil incorrect and uneeded comments
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.DoAfter, new AccessOverriderDoAfterEvent(), uid, target: args.Target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = true,
};
namespace Content.Server.Animals.Systems;
/// <summary>
-/// Gives ability to produce milkable reagents, produces endless if the
+/// Gives ability to produce milkable reagents, produces endless if the
/// owner has no HungerComponent
/// </summary>
internal sealed class UdderSystem : EntitySystem
var doargs = new DoAfterArgs(EntityManager, userUid, 5, new MilkingDoAfterEvent(), udder, udder, used: containerUid)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
- BreakOnTargetMove = true,
MovementThreshold = 1.0f,
};
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new InternalsDoAfterEvent(), target, target: target)
{
- BreakOnUserMove = true,
BreakOnDamage = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
MovementThreshold = 0.1f,
});
}
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, swab.SwabDelay, new BotanySwabDoAfterEvent(), uid, target: args.Target, used: uid)
{
Broadcast = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
});
}
DoAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, actualDelay, new InjectorDoAfterEvent(), injector.Owner, target: target, used: injector.Owner)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
+ BreakOnWeightlessMove = false,
BreakOnDamage = true,
- BreakOnTargetMove = true,
NeedHand = true,
BreakOnHandChange = true,
MovementThreshold = 0.1f,
var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.Delay, new TerrorDoAfterEvent(), target: target, used: uid, eventTarget: uid)
{
BreakOnDamage = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
MovementThreshold = 0.5f,
CancelDuplicate = false
};
var doAfterArgs = new DoAfterArgs(EntityManager, user, doAfterTime, new AwaitedDoAfterEvent(), null)
{
BreakOnDamage = true,
- BreakOnTargetMove = false,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = false,
// allow simultaneously starting several construction jobs using the same stack of materials.
CancelDuplicate = false,
var doAfterEventArgs = new DoAfterArgs(EntityManager, interactUsing.User, step.DoAfter, doAfterEv, uid, uid, interactUsing.Used)
{
BreakOnDamage = false,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
};
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.ExchangeDuration, new ExchangerDoAfterEvent(), uid, target: args.Target, used: uid)
{
BreakOnDamage = true,
- BreakOnUserMove = true
+ BreakOnMove = true
});
}
}
var doAfterArgs = new DoAfterArgs(EntityManager, userId.Value, delay, new DisposalDoAfterEvent(), unitId, target: toInsertId, used: unitId)
{
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = false
};
{
var doAfterArgs = new DoAfterArgs(EntityManager, user, component.DoAfterTime, new AwaitedDoAfterEvent(), null)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
};
var result = await doAfterSystem.WaitDoAfter(doAfterArgs);
{
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.DoAfterTime, new AwaitedDoAfterEvent(), null)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
};
var result = await _doAfterSystem.WaitDoAfter(doAfterArgs);
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, freeTime, new EnsnareableDoAfterEvent(), target, target: target, used: ensnare)
{
- BreakOnUserMove = breakOnMove,
- BreakOnTargetMove = breakOnMove,
+ BreakOnMove = breakOnMove,
BreakOnDamage = false,
NeedHand = true,
BlockDuplicate = true,
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.UnclogDuration, new DrainDoAfterEvent(), entity, args.Target, args.Used)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
BreakOnHandChange = true
};
{
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, entity.Comp.SpillDelay ?? 0, new SpillDoAfterEvent(), entity.Owner, target: entity.Owner)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true,
});
};
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, pad.ScanDelay, ev, used, target: target, used: used)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
- NeedHand = true
+ NeedHand = true,
+ BreakOnMove = true,
};
_doAfterSystem.TryStartDoAfter(doAfterEventArgs);
{
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ScanDelay, new ForensicScannerDoAfterEvent(), uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
});
}
BreakOnHandChange = true,
NeedHand = true,
BreakOnDamage = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
MovementThreshold = 0.01f,
DistanceThreshold = forensicsComp.CleanDistance,
};
return;
}
- _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.InjectionDelay, new GuardianCreatorDoAfterEvent(), injector, target: target, used: injector)
- {
- BreakOnTargetMove = true,
- BreakOnUserMove = true
- });
+ _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.InjectionDelay, new GuardianCreatorDoAfterEvent(), injector, target: target, used: injector){BreakOnMove = true});
}
private void OnDoAfter(EntityUid uid, GuardianCreatorComponent component, DoAfterEvent args)
{
var args = new DoAfterArgs(EntityManager, user, component.ImplantTime, new ImplantEvent(), implanter, target: target, used: implanter)
{
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true,
};
{
var args = new DoAfterArgs(EntityManager, user, component.DrawTime, new DrawEvent(), implanter, target: target, used: implanter)
{
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true,
};
var doAfterArgs = new DoAfterArgs(EntityManager, userUid, component.SpikeDelay + butcherable.ButcherDelay, new SpikeDoAfterEvent(), uid, target: victimUid, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true
};
var doAfter =
new DoAfterArgs(EntityManager, user, sharp.ButcherDelayModifier * butcher.ButcherDelay, new SharpDoAfterEvent(), knife, target: target, used: knife)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true
};
_doAfterSystem.TryStartDoAfter(doAfter);
// removing a working bulb, so require a delay
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, userUid, light.EjectBulbDelay, new PoweredLightDoAfterEvent(), uid, target: uid)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
});
{
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.LearnTime, new SpellbookDoAfterEvent(), uid, target: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
NeedHand = true //What, are you going to read with your eyes only??
};
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.SelectSlotTime, doAfter, uid, target: target, used: uid)
{
DistanceThreshold = SharedInteractionSystem.InteractionRange,
- BreakOnTargetMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
BreakOnHandChange = false,
- BreakOnUserMove = true,
- BreakOnWeightlessMove = false,
NeedHand = true
}, out var doAfterId);
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ChangeSlotTime, doAfter, uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
BreakOnHandChange = false,
- BreakOnUserMove = true,
- BreakOnWeightlessMove = false,
NeedHand = true
}, out var doAfterId);
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.RemoveSlotTime, doAfter, uid, target: target, used: uid)
{
DistanceThreshold = SharedInteractionSystem.InteractionRange,
- BreakOnTargetMove = true,
BreakOnDamage = true,
BreakOnHandChange = false,
- BreakOnUserMove = true,
- BreakOnWeightlessMove = false,
NeedHand = true
}, out var doAfterId);
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Session.AttachedEntity.Value, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid)
{
- BreakOnTargetMove = true,
BreakOnDamage = true,
+ BreakOnMove = true,
BreakOnHandChange = false,
- BreakOnUserMove = true,
- BreakOnWeightlessMove = false,
NeedHand = true
}, out var doAfterId);
component.AudioStream = _audio.PlayPvs(component.GrabSound, uid).Value.Entity;
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, component.GrabDelay, new GrabberDoAfterEvent(), uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true
+ BreakOnMove = true
};
_doAfter.TryStartDoAfter(doAfterArgs, out component.DoAfter);
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.InstallDuration, new InsertEquipmentEvent(), uid, target: mech, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true
+ BreakOnMove = true,
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
if (TryComp<ToolComponent>(args.Used, out var tool) && tool.Qualities.Contains("Prying") && component.BatterySlot.ContainedEntity != null)
{
- var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.BatteryRemovalDelay, new RemoveBatteryEvent(), uid, target: uid, used: args.Target)
+ var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.BatteryRemovalDelay,
+ new RemoveBatteryEvent(), uid, target: uid, used: args.Target)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
{
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.EntryDelay, new MechEntryEvent(), uid, target: uid)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
return;
}
- var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.ExitDelay, new MechExitEvent(), uid, target: uid)
- {
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
- };
+ var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.ExitDelay,
+ new MechExitEvent(), uid, target: uid);
_doAfter.TryStartDoAfter(doAfterEventArgs);
}
var delay = reclaimer.Comp.BaseInsertionDelay * physics.FixturesMass;
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, delay, new ReclaimerDoAfterEvent(), reclaimer, target: args.Target, used: args.Used)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
- NeedHand = true
+ NeedHand = true,
+ BreakOnMove = true
});
}
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, entity.Comp.EntryDelay, new CryoPodDragFinished(), entity, target: args.Dragged, used: entity)
{
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = false,
};
_doAfterSystem.TryStartDoAfter(doAfterArgs);
uid, target, uid)
{
BlockDuplicate = true,
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
BreakOnHandChange = true,
NeedHand = true
});
var doAfterEventArgs =
new DoAfterArgs(EntityManager, user, delay, new HealingDoAfterEvent(), target, target: target, used: uid)
{
- //Raise the event on the target if it's not self, otherwise raise it on self.
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
// Didn't break on damage as they may be trying to prevent it and
// not being able to heal your own ticking damage would be frustrating.
NeedHand = true,
+ BreakOnMove = true,
+ BreakOnWeightlessMove = false,
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, uid.Comp.ScanDelay, new HealthAnalyzerDoAfterEvent(), uid, target: args.Target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
- NeedHand = true
+ NeedHand = true,
+ BreakOnMove = true
});
}
{
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, comp.Delay, new StethoscopeDoAfterEvent(), scope, target: target, used: scope)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
- NeedHand = true
+ NeedHand = true,
+ BreakOnMove = true,
});
}
var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.DrainTime, new DrainDoAfterEvent(), target: target, eventTarget: uid)
{
- BreakOnUserMove = true,
- BreakOnWeightlessMove = true, // prevent a ninja on a pod remotely draining it
MovementThreshold = 0.5f,
+ BreakOnMove = true,
CancelDuplicate = false,
AttemptFrequency = AttemptFrequency.StartAndEnd
};
var doAfter = new DoAfterArgs(EntityManager, user, nuke.DisarmDoafterLength, new NukeDisarmDoAfterEvent(), uid, target: uid)
{
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
};
target: target,
used: item)
{
- BreakOnUserMove = forceDrink,
+ BreakOnMove = forceDrink,
BreakOnDamage = true,
- BreakOnTargetMove = forceDrink,
MovementThreshold = 0.01f,
DistanceThreshold = 1.0f,
// Mice and the like can eat without hands.
target: target,
used: food)
{
- BreakOnUserMove = forceFeed,
+ BreakOnMove = forceFeed,
BreakOnDamage = true,
- BreakOnTargetMove = forceFeed,
MovementThreshold = 0.01f,
DistanceThreshold = MaxFeedDistance,
// Mice and the like can eat without hands.
var vapeDoAfterEvent = new VapeDoAfterEvent(solution, forced);
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, delay, vapeDoAfterEvent, entity.Owner, target: args.Target, used: entity.Owner)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = false,
+ BreakOnMove = false,
BreakOnDamage = true
});
}
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.StartTime, new GeneratorStartedEvent(), uid, uid)
{
- BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true,
+ BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true,
NeedHand = true
});
}
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, component.BaseResistTime * multiplier, new EscapeInventoryEvent(), user, target: container)
{
- BreakOnTargetMove = false,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = false
};
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, resistLockerComponent.ResistTime, new ResistLockerDoAfterEvent(), target, target: target)
{
- BreakOnTargetMove = false,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = false //No hands 'cause we be kickin'
};
{
var searchDoAfter = new DoAfterArgs(EntityManager, uid, revenant.SoulSearchDuration, new SoulEvent(), uid, target: target)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
DistanceThreshold = 2
};
var doAfter = new DoAfterArgs(EntityManager, uid, revenant.HarvestDebuffs.X, new HarvestEvent(), uid, target: target)
{
DistanceThreshold = 2,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
RequireCanInteract = false, // stuns itself
};
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.PipeSprayTime, new SprayPainterPipeDoAfterEvent(color), args.Used, target: ent, used: args.Used)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
CancelDuplicate = true,
// multiple pipes can be sprayed at once just not the same one
// start sticking object to target
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new StickyDoAfterEvent(), uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
});
}
// start unsticking object
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, delay, new StickyDoAfterEvent(), uid, target: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
});
}
Hidden = stealth,
AttemptFrequency = AttemptFrequency.EveryTick,
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true,
DuplicateCondition = DuplicateConditions.SameTool
};
Hidden = stealth,
AttemptFrequency = AttemptFrequency.EveryTick,
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true,
BreakOnHandChange = false, // Allow simultaneously removing multiple items.
DuplicateCondition = DuplicateConditions.SameTool
Hidden = stealth,
AttemptFrequency = AttemptFrequency.EveryTick,
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true,
DuplicateCondition = DuplicateConditions.SameTool
};
Hidden = stealth,
AttemptFrequency = AttemptFrequency.EveryTick,
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true,
BreakOnHandChange = false, // Allow simultaneously removing multiple items.
DuplicateCondition = DuplicateConditions.SameTool
var doafterArgs = new DoAfterArgs(EntityManager, args.User, component.PortalCreationDelay, new TeleporterDoAfterEvent(), uid, used: uid)
{
BreakOnDamage = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
MovementThreshold = 0.5f,
};
{
NeedHand = true,
BreakOnDamage = true,
- BreakOnUserMove = true
+ BreakOnMove = true
};
_doAfter.TryStartDoAfter(args);
{
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, component.DigDelay / shovel.SpeedModifier, new GraveDiggingDoAfterEvent(), uid, target: args.Target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = true,
BreakOnHandChange = true
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Entity, component.DigDelay / component.DigOutByHandModifier, new GraveDiggingDoAfterEvent(), uid, target: uid)
{
NeedHand = false,
- BreakOnUserMove = true,
- BreakOnTargetMove = false,
+ BreakOnMove = true,
BreakOnHandChange = false,
BreakOnDamage = false
};
var doAfterArgs = new DoAfterArgs(EntityManager, args.Dragged, component.BonkDelay, new BonkDoAfterEvent(), uid, target: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true
};
target: climbable,
used: entityToMove)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true
};
var args = new DoAfterArgs(EntityManager, user, time, new ToggleClothingDoAfterEvent(), item, wearer, item)
{
BreakOnDamage = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
// This should just re-use the BUI range checks & cancel the do after if the BUI closes. But that is all
// server-side at the moment.
// TODO BUI REFACTOR.
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, cuffTime, new AddCuffDoAfterEvent(), handcuff, target, handcuff)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
+ BreakOnWeightlessMove = false,
BreakOnDamage = true,
- NeedHand = true
+ NeedHand = true,
+ DistanceThreshold = 0.3f
};
if (!_doAfter.TryStartDoAfter(doAfterEventArgs))
var doAfterEventArgs = new DoAfterArgs(EntityManager, user, uncuffTime, new UnCuffDoAfterEvent(), target, target, cuffsToRemove)
{
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
+ BreakOnWeightlessMove = false,
BreakOnDamage = true,
NeedHand = true,
RequireCanInteract = false, // Trust in UncuffAttemptEvent
+ DistanceThreshold = 0.3f
};
if (!_doAfter.TryStartDoAfter(doAfterEventArgs))
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.DevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
});
break;
default:
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, uid, component.StructureDevourTime, new DevourDoAfterEvent(), uid, target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
});
}
}
{
Index = index;
- if (args.Target == null)
- {
- DebugTools.Assert(!args.BreakOnTargetMove);
- args.BreakOnTargetMove = false;
- }
-
Args = args;
StartTime = startTime;
}
public bool BreakOnHandChange = true;
/// <summary>
- /// If do_after stops when the user moves
+ /// If do_after stops when the user or target moves
/// </summary>
- [DataField("breakOnUserMove")]
- public bool BreakOnUserMove;
-
- /// <summary>
- /// If this is true then any movement, even when weightless, will break the doafter.
- /// When there is no gravity, BreakOnUserMove is ignored. If it is false to begin with nothing will change.
- /// </summary>
- [DataField("breakOnWeightlessMove")]
- public bool BreakOnWeightlessMove;
+ [DataField]
+ public bool BreakOnMove;
/// <summary>
- /// If do_after stops when the target moves (if there is a target)
+ /// Whether to break on movement when the user is weightless.
+ /// This does nothing if <see cref="BreakOnMove"/> is false.
/// </summary>
- [DataField("breakOnTargetMove")]
- public bool BreakOnTargetMove;
+ [DataField]
+ public bool BreakOnWeightlessMove = true;
/// <summary>
/// Threshold for user and target movement
/// </summary>
[DataField("movementThreshold")]
- public float MovementThreshold = 0.1f;
+ public float MovementThreshold = 0.3f;
/// <summary>
/// Threshold for distance user from the used OR target entities.
Broadcast = other.Broadcast;
NeedHand = other.NeedHand;
BreakOnHandChange = other.BreakOnHandChange;
- BreakOnUserMove = other.BreakOnUserMove;
+ BreakOnMove = other.BreakOnMove;
BreakOnWeightlessMove = other.BreakOnWeightlessMove;
- BreakOnTargetMove = other.BreakOnTargetMove;
MovementThreshold = other.MovementThreshold;
DistanceThreshold = other.DistanceThreshold;
BreakOnDamage = other.BreakOnDamage;
using Content.Shared.Gravity;
using Content.Shared.Hands.Components;
+using Content.Shared.Interaction;
+using Content.Shared.Physics;
using Robust.Shared.Utility;
namespace Content.Shared.DoAfter;
{
[Dependency] private readonly IDynamicTypeFactory _factory = default!;
[Dependency] private readonly SharedGravitySystem _gravity = default!;
+ [Dependency] private readonly SharedInteractionSystem _interaction = default!;
private DoAfter[] _doAfters = Array.Empty<DoAfter>();
return true;
// TODO: Re-use existing xform query for these calculations.
- // when there is no gravity you will be drifting 99% of the time making many doafters impossible
- // so this just ignores your movement if you are weightless (unless the doafter sets BreakOnWeightlessMove then moving will still break it)
- if (args.BreakOnUserMove
- && !userXform.Coordinates.InRange(EntityManager, _transform, doAfter.UserPosition, args.MovementThreshold)
- && (args.BreakOnWeightlessMove || !_gravity.IsWeightless(args.User, xform: userXform)))
- return true;
-
- if (args.BreakOnTargetMove)
+ if (args.BreakOnMove && !(!args.BreakOnWeightlessMove && _gravity.IsWeightless(args.User, xform: userXform)))
{
- DebugTools.Assert(targetXform != null, "Break on move is true, but no target specified?");
- if (targetXform != null && targetXform.Coordinates.TryDistance(EntityManager, userXform.Coordinates, out var distance))
+ // Whether the user has moved too much from their original position.
+ if (!userXform.Coordinates.InRange(EntityManager, _transform, doAfter.UserPosition, args.MovementThreshold))
+ return true;
+
+ // Whether the distance between the user and target(if any) has changed too much.
+ if (targetXform != null &&
+ targetXform.Coordinates.TryDistance(EntityManager, userXform.Coordinates, out var distance))
{
- // once the target moves too far from you the do after breaks
if (Math.Abs(distance - doAfter.TargetDistance) > args.MovementThreshold)
return true;
}
}
+ // Whether the user and the target are too far apart.
+ if (args.Target != null)
+ {
+ if (args.DistanceThreshold != null)
+ {
+ if (!_interaction.InRangeUnobstructed(args.User, args.Target.Value, args.DistanceThreshold.Value))
+ return true;
+ }
+ else
+ {
+ if (!_interaction.InRangeUnobstructed(args.User, args.Target.Value))
+ return true;
+ }
+ }
+
+ // Whether the distance between the tool and the user has grown too much.
+ if (args.Used != null)
+ {
+ if (args.DistanceThreshold != null)
+ {
+ if (!_interaction.InRangeUnobstructed(args.User,
+ args.Used.Value,
+ args.DistanceThreshold.Value))
+ return true;
+ }
+ else
+ {
+ if (!_interaction.InRangeUnobstructed(args.User,args.Used.Value))
+ return true;
+ }
+ }
+
if (args.AttemptFrequency == AttemptFrequency.EveryTick && !TryAttemptEvent(doAfter))
return true;
if (args.RequireCanInteract && !_actionBlocker.CanInteract(args.User, args.Target))
return true;
- if (args.DistanceThreshold != null)
- {
- if (targetXform != null
- && !args.User.Equals(args.Target)
- && !userXform.Coordinates.InRange(EntityManager, _transform, targetXform.Coordinates,
- args.DistanceThreshold.Value))
- {
- return true;
- }
-
- if (usedXform != null
- && !userXform.Coordinates.InRange(EntityManager, _transform, usedXform.Coordinates,
- args.DistanceThreshold.Value))
- {
- return true;
- }
- }
return false;
}
args.NetUser = GetNetEntity(args.User);
args.NetEventTarget = GetNetEntity(args.EventTarget);
- if (args.BreakOnUserMove || args.BreakOnTargetMove)
+ if (args.BreakOnMove)
doAfter.UserPosition = Transform(args.User).Coordinates;
- if (args.Target != null && args.BreakOnTargetMove)
+ if (args.Target != null && args.BreakOnMove)
{
- // Target should never be null if the bool is set.
var targetPosition = Transform(args.Target.Value).Coordinates;
doAfter.UserPosition.TryDistance(EntityManager, targetPosition, out doAfter.TargetDistance);
}
{
BlockDuplicate = true,
BreakOnHandChange = true,
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
CancelDuplicate = true,
RequireCanInteract = true,
NeedHand = true
{
BlockDuplicate = true,
BreakOnHandChange = true,
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
CancelDuplicate = true,
RequireCanInteract = true,
NeedHand = true
return _doAfter.TryStartDoAfter(
new DoAfterArgs(EntityManager, user, lockComp.LockTime, new LockDoAfter(), uid, uid)
{
- BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true,
+ BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true,
NeedHand = true
});
}
return _doAfter.TryStartDoAfter(
new DoAfterArgs(EntityManager, user, lockComp.LockTime, new UnlockDoAfter(), uid, uid)
{
- BreakOnDamage = true, BreakOnTargetMove = true, BreakOnUserMove = true, RequireCanInteract = true,
+ BreakOnDamage = true, BreakOnMove = true, RequireCanInteract = true,
NeedHand = true
});
}
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.Dragged, component.EntryDelay, new MechEntryEvent(), uid, target: uid)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
};
_doAfter.TryStartDoAfter(doAfterEventArgs);
args.Handled = true;
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.RemovalTime.Value,
- new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid)
- {
- DistanceThreshold = SharedInteractionSystem.InteractionRange,
- });
+ new RemoveEmbeddedProjectileEvent(), eventTarget: uid, target: uid));
}
private void OnEmbedRemove(EntityUid uid, EmbeddableProjectileComponent component, RemoveEmbeddedProjectileEvent args)
var doAfterArgs = new DoAfterArgs(EntityManager, user, TimeSpan.FromSeconds(modEv.BaseTime * modEv.PryTimeModifier / toolModifier), new DoorPryDoAfterEvent(), target, target, tool)
{
BreakOnDamage = true,
- BreakOnUserMove = true,
- BreakOnWeightlessMove = true,
+ BreakOnMove = true,
};
if (tool != null)
BreakOnDamage = true,
NeedHand = true,
BreakOnHandChange = true,
- BreakOnUserMove = true,
- BreakOnTargetMove = args.Target != null,
+ BreakOnMove = true,
AttemptFrequency = AttemptFrequency.EveryTick
};
{
BlockDuplicate = true,
BreakOnDamage = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
DistanceThreshold = 2f
});
}
var doAfterArgs = new DoAfterArgs(EntityManager, uid, comp.Delay, new ResearchStealDoAfterEvent(), target: target, used: uid, eventTarget: uid)
{
BreakOnDamage = true,
- BreakOnUserMove = true,
- MovementThreshold = 0.5f
+ BreakOnMove = true,
+ MovementThreshold = 0.5f,
};
_doAfter.TryStartDoAfter(doAfterArgs);
{
CancelDuplicate = true,
MovementThreshold = 0.5f,
- BreakOnUserMove = true,
- BreakOnTargetMove = true,
+ BreakOnMove = true,
Broadcast = true,
NeedHand = true,
});
var doAfter = new DoAfterArgs(EntityManager, uid, comp.ProductionLength, new SericultureDoAfterEvent(), uid)
{ // I'm not sure if more things should be put here, but imo ideally it should probably be set in the component/YAML. Not sure if this is currently possible.
- BreakOnUserMove = true,
+ BreakOnMove = true,
BlockDuplicate = true,
BreakOnDamage = true,
CancelDuplicate = true,
// Create a doafter & start it
var doAfter = new DoAfterArgs(EntityManager, uid, comp.ReformTime, new ReformDoAfterEvent(), uid)
{
- BreakOnUserMove = true,
+ BreakOnMove = true,
BlockDuplicate = true,
BreakOnDamage = true,
CancelDuplicate = true,
return;
// Spawn a new entity
- // This is, to an extent, taken from polymorph. I don't use polymorph for various reasons- most notably that this is permanent.
+ // This is, to an extent, taken from polymorph. I don't use polymorph for various reasons- most notably that this is permanent.
var child = Spawn(comp.ReformPrototype, Transform(uid).Coordinates);
// This transfers the mind to the new entity
_actionsSystem.RemoveAction(uid, comp.ActionEntity); // Zombies can't reform
}
- public sealed partial class ReformEvent : InstantActionEvent { }
+ public sealed partial class ReformEvent : InstantActionEvent { }
[Serializable, NetSerializable]
public sealed partial class ReformDoAfterEvent : SimpleDoAfterEvent { }
var doAfterEventArgs = new DoAfterArgs(EntityManager, args.User, painter.AirlockSprayTime, new SprayPainterDoorDoAfterEvent(sprite, style.Department), args.Used, target: ent, used: args.Used)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = true
};
_doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, userUid, delay, new DumpableDoAfterEvent(), storageUid, target: targetUid, used: storageUid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
});
}
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, delay, new AreaPickupDoAfterEvent(GetNetEntityList(validStorables)), uid, target: uid)
{
BreakOnDamage = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
NeedHand = true
};
var doAfterArgs = new DoAfterArgs(EntityManager, user, delay / toolComponent.SpeedModifier, toolEvent, tool, target: target, used: tool)
{
BreakOnDamage = true,
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
+ BreakOnWeightlessMove = false,
NeedHand = tool != user,
AttemptFrequency = IsWelder(tool) ? AttemptFrequency.EveryTick : AttemptFrequency.Never
};
var doAfterArgs = new DoAfterArgs(EntityManager, args.User, (float) component.RestockDelay.TotalSeconds, new RestockDoAfterEvent(), target,
target: target, used: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = true,
NeedHand = true
};
_doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.FillDelay, new AmmoFillDoAfterEvent(), used: uid, target: args.Target, eventTarget: uid)
{
- BreakOnTargetMove = true,
- BreakOnUserMove = true,
+ BreakOnMove = true,
BreakOnDamage = false,
NeedHand = true
});