using System.Diagnostics.CodeAnalysis; using Content.Shared._CP14.Fishing.Components; using Content.Shared._CP14.Fishing.Core; using Robust.Shared.Prototypes; namespace Content.Shared._CP14.Fishing.Systems; public abstract partial class CP14SharedFishingProcessSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototype = default!; protected EntityQuery FishingRod; protected EntityQuery FishingPool; public override void Initialize() { base.Initialize(); FishingRod = GetEntityQuery(); FishingPool = GetEntityQuery(); } public override void Update(float frameTime) { base.Update(frameTime); var query = EntityQueryEnumerator(); while (query.MoveNext(out var entityUid, out var processComponent)) { Update((entityUid, processComponent), frameTime); } } private void UpdateReeling(Entity process, Entity fishingRod, float frameTime) { if (process.Comp.Player is not { } player) return; if (fishingRod.Comp.Reeling) { player.Velocity += fishingRod.Comp.Speed * frameTime; return; } player.Velocity -= fishingRod.Comp.Gravity * frameTime; } private void UpdateVelocity(Entity process, Entity fishingRod) { if (process.Comp.Player is not { } player) return; player.Velocity *= fishingRod.Comp.Drag; player.Velocity = Math.Clamp(player.Velocity, fishingRod.Comp.MinVelocity, fishingRod.Comp.MaxVelocity); } private void UpdatePosition(Entity process, float frameTime) { if (process.Comp.Player is not { } player) return; player.Position += process.Comp.Player.Velocity * frameTime; var halfSize = process.Comp.Player.HalfSize; process.Comp.Player.Position = Math.Clamp(process.Comp.Player.Position, halfSize, 1 - halfSize); } public void Update(Entity process, float frameTime) { if (process.Comp.Player is not { } player) return; var fishingRod = GetRod(process); UpdateReeling(process, fishingRod, frameTime); UpdateVelocity(process, fishingRod); UpdatePosition(process, frameTime); if (process.Comp.Fish is { } fish) { FishPreUpdate(process, fish, frameTime); fish.Update(frameTime); var collides = Collide(fish, player); var progressAdditive = collides ? 0.1f : -0.2f; process.Comp.Progress = Math.Clamp(process.Comp.Progress + progressAdditive * frameTime, 0, 1); } UpdateDirty(process); if (process.Comp.Progress is 1 or 0) Finish(process, process.Comp.Progress is 1); } public virtual void FishPreUpdate(Entity process, Fish fish, float frameTime) { } public virtual void UpdateDirty(Entity process) { } public virtual void Finish(Entity process, bool success) { } public void Stop(Entity process) { var rod = GetRod(process); rod.Comp.Process = null; Dirty(rod); Del(process); } public virtual void Reward(Entity process) { } public bool TryGetByUser(EntityUid userEntityUid, [NotNullWhen(true)] out Entity? process) { process = null; var query = EntityQueryEnumerator(); while (query.MoveNext(out var entityUid, out var processComponent)) { if (processComponent.User != userEntityUid) continue; process = (entityUid, processComponent); return true; } return false; } }