protected override FishingActionRequest ClientTryCreateRequest(ICharacter character) { if (ComponentFishingVisualizer.TryGetFor(character, out _) || PlayerCharacter.GetPrivateState(character).CurrentActionState is FishingActionState) { // already fishing return(null); } var itemFishingRod = character.SharedGetPlayerSelectedHotbarItem(); var fishingRodPublicState = itemFishingRod.GetPublicState <ItemFishingRodPublicState>(); if (fishingRodPublicState.CurrentProtoBait is null || SharedFindBaitItem(character, fishingRodPublicState.CurrentProtoBait) is null) { // no bait selected - try switch it FishingBaitReloadingSystem.ClientTrySwitchBaitType(); if (fishingRodPublicState.CurrentProtoBait is null || SharedFindBaitItem(character, fishingRodPublicState.CurrentProtoBait) is null) { // no bait selected after a switch attempt return(null); } } var fishingTargetPosition = ClientInputManager.MouseWorldPosition; // clamp max distance from player fishingTargetPosition = character.Position + ((fishingTargetPosition - character.Position) .ClampMagnitude(MaxFishingDistance * 0.95)); // validation will be done in SharedValidateRequest automatically return(new FishingActionRequest(character, itemFishingRod, fishingTargetPosition)); }
public static void OnFishCaughtOrFishingCancelled( ICharacter character, [CanBeNull] IProtoItem protoItemFishCaught, Vector2D fishingTargetPosition, float caughtFishSizeValue) { ClientTimersSystem.AddAction( FishingCompletedAnimationDelay, () => { ComponentFishingVisualizer.TryGetFor(character, out var fishingVisualizer); if (fishingVisualizer is null) { return; } if (fishingVisualizer.FishingCompletedVisualizer is null) { Api.Client.Scene.CreateSceneObject(nameof(ComponentFishingCompletedVisualizer)) .AddComponent <ComponentFishingCompletedVisualizer>() .Setup(fishingTargetPosition, character, protoItemFishCaught, caughtFishSizeValue); } else if (protoItemFishCaught is not null) { fishingVisualizer.FishingCompletedVisualizer .SetupFish(protoItemFishCaught, caughtFishSizeValue); } }); }