Showing preview only (2,338K chars total). Download the full file or copy to clipboard to get everything.
Repository: InitialDet/AutoHook
Branch: main
Commit: 958df427f8d9
Files: 125
Total size: 2.2 MB
Directory structure:
gitextract_17mc788c/
├── .editorconfig
├── .github/
│ ├── FUNDING.yml
│ └── workflows/
│ ├── publish.yml
│ └── update-bite-timers.yml
├── .gitignore
├── .gitmodules
├── AcceptCollectable.md
├── AutoHook/
│ ├── AutoHook.cs
│ ├── AutoHook.csproj
│ ├── AutoHook.csproj.DotSettings
│ ├── AutoHook.json
│ ├── Classes/
│ │ ├── AutoCasts/
│ │ │ ├── AutoBigGameFishing.cs
│ │ │ ├── AutoCastLine.cs
│ │ │ ├── AutoChum.cs
│ │ │ ├── AutoCollect.cs
│ │ │ ├── AutoCordial.cs
│ │ │ ├── AutoDoubleHook.cs
│ │ │ ├── AutoFishEyes.cs
│ │ │ ├── AutoFood.cs
│ │ │ ├── AutoIdenticalCast.cs
│ │ │ ├── AutoLures.cs
│ │ │ ├── AutoMakeShiftBait.cs
│ │ │ ├── AutoMooch.cs
│ │ │ ├── AutoMooch2.cs
│ │ │ ├── AutoMultiHook.cs
│ │ │ ├── AutoPatience.cs
│ │ │ ├── AutoPrizeCatch.cs
│ │ │ ├── AutoReleaseFish.cs
│ │ │ ├── AutoSparefulHand.cs
│ │ │ ├── AutoSurfaceSlap.cs
│ │ │ ├── AutoThaliaksFavor.cs
│ │ │ └── AutoTripleHook.cs
│ │ ├── BaitFishClass.cs
│ │ ├── BaseActionCast.cs
│ │ ├── BaseBiteConfig.cs
│ │ ├── BaseGig.cs
│ │ ├── BaseHookset.cs
│ │ ├── BaseOption.cs
│ │ ├── BasePreset.cs
│ │ ├── BasePresetConfig.cs
│ │ ├── BiteTimers.cs
│ │ ├── ImportedFish.cs
│ │ └── PresetFolder.cs
│ ├── Configurations/
│ │ ├── AutoCastsConfig.cs
│ │ ├── AutoGigConfig.cs
│ │ ├── Configuration.cs
│ │ ├── CustomPresetConfig.cs
│ │ ├── ExtraConfig.cs
│ │ ├── FishConfig.cs
│ │ ├── HookConfig.cs
│ │ └── old_config/
│ │ ├── BaitConfig.cs
│ │ ├── CustomPresetConfig.cs
│ │ ├── OldHookConfig.cs
│ │ └── OldPresetConfig.cs
│ ├── Data/
│ │ ├── FishData/
│ │ │ ├── bitetimers.json
│ │ │ ├── fish_list.json
│ │ │ └── fish_list_64.txt
│ │ └── IDs.cs
│ ├── Enums/
│ │ ├── BaitType.cs
│ │ ├── BiteType.cs
│ │ ├── FishingSteps.cs
│ │ ├── HookType.cs
│ │ ├── IntuitionStatus.cs
│ │ ├── LureTarget.cs
│ │ ├── OpenWindow.cs
│ │ ├── SpectralCurrentStatus.cs
│ │ ├── SwimbaitAction.cs
│ │ └── XivChatLog.cs
│ ├── Fishing/
│ │ ├── FishingManager.AutoCast.cs
│ │ ├── FishingManager.Extra.cs
│ │ ├── FishingManager.FishCaught.cs
│ │ ├── FishingManager.Helper.cs
│ │ ├── FishingManager.cs
│ │ └── FishingPresets.cs
│ ├── Globals.cs
│ ├── IPC/
│ │ └── AutoHookIPC.cs
│ ├── PluginChangelog.cs
│ ├── PluginUI.cs
│ ├── PresetCreator.cs
│ ├── Resources/
│ │ └── Localization/
│ │ ├── UIStrings.Designer.cs
│ │ ├── UIStrings.de.resx
│ │ ├── UIStrings.es.resx
│ │ ├── UIStrings.fr.resx
│ │ ├── UIStrings.it.resx
│ │ ├── UIStrings.ja.resx
│ │ ├── UIStrings.ko.resx
│ │ ├── UIStrings.resx
│ │ ├── UIStrings.ru.resx
│ │ └── UIStrings.zh.resx
│ ├── SeFunctions/
│ │ ├── BaitManager.cs
│ │ ├── SeAddressBase.cs
│ │ ├── SeFunctionBase.cs
│ │ └── SeTugType.cs
│ ├── Service.cs
│ ├── Spearfishing/
│ │ ├── AutoGig.cs
│ │ ├── Enums/
│ │ │ ├── SpearfishSize.cs
│ │ │ └── SpearfishSpeed.cs
│ │ ├── SpearFishingPresets.cs
│ │ └── Struct/
│ │ └── SpearfishWindow.cs
│ ├── Ui/
│ │ ├── BaseTab.cs
│ │ ├── SubTabAutoCast.cs
│ │ ├── SubTabBaitMooch.cs
│ │ ├── SubTabExtra.cs
│ │ ├── SubTabFish.cs
│ │ ├── TabAutoGig.cs
│ │ ├── TabCommunity.cs
│ │ ├── TabDebug.cs
│ │ ├── TabFishingPresets.cs
│ │ ├── TabGlobalPreset.cs
│ │ └── TabSettings.cs
│ ├── Utils/
│ │ ├── DrawUtil.cs
│ │ ├── EzDtr2.cs
│ │ ├── GameRes.cs
│ │ ├── InputUtil.cs
│ │ ├── MultiString.cs
│ │ ├── PlayerRes.cs
│ │ ├── SignaturePatterns.cs
│ │ └── WikiPresets.cs
│ └── packages.lock.json
├── AutoHook.sln
├── LICENSE
├── README.md
├── build.bat
├── crowdin.yml
└── update_bite_timers.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .editorconfig
================================================
root = true
# C# files
[*.cs]
#### Core EditorConfig Options ####
indent_style = space
indent_size = 4
tab_width = 4
end_of_line = crlf
trim_trailing_whitespace = true
insert_final_newline = true
#### Code quality analysis (CAxxxx rules) ####
# note that prefix for .severity and other options is different, e.g.:
#dotnet_diagnostic.CA1000.severity = none
#dotnet_code_quality.CA1000.api_surface = all
# note: we enable analyzers on csproj level rather than here, so that we can avoid build time increase in debug builds
#dotnet_analyzer_diagnostic.severity = warning
dotnet_code_quality.api_surface = all # all rules should apply to all types
dotnet_code_quality.CA1826.exclude_ordefault_methods = true # there is no good replacement for FirstOrDefault / LastOrDefault
dotnet_code_quality.CA1707.api_surface = public, internal # we follow official naming conventions, which recommend private fields to have _ prefix - TODO: reconsider?..
# these rules are forbidding useful language features using questionable justification, and so are disabled; this could be reconsidered in future
dotnet_diagnostic.CA1000.severity = none # this feature (static members of generic types) is used by New utility, and is fine in general
dotnet_diagnostic.CA1002.severity = none # this is a particularly puzzling rule - for whatever reason, it disallows exposing List<>, which is perfectly fine
dotnet_diagnostic.CA1003.severity = none # EventHandler sucks, it has useless first arg (sender) and requires wrapping multi arg payloads into a tuple, which is just annoying - and this rule promotes their use for events
dotnet_diagnostic.CA1028.severity = none # enums that have unsigned underlying type are common and quite useful
dotnet_diagnostic.CA1030.severity = none # we don't use standard events, so this is not relevant
dotnet_diagnostic.CA1034.severity = none # nested public types are used widely, and I don't see a reason to avoid them
dotnet_diagnostic.CA1043.severity = none # indexer by enum are used, don't see a reason to avoid thems
dotnet_diagnostic.CA1051.severity = none # public fields are fine, no need to use properties everywhere
dotnet_diagnostic.CA1062.severity = none # this is annoying, nullability is a contract, there's no need to check non-nullable arguments for null
dotnet_diagnostic.CA1814.severity = none # very weird recommendation, multidimensional arrays are perfectly fine
dotnet_diagnostic.CA2225.severity = none # don't see a need to duplicate operators with named fields, as i don't expect this to ever be used outside c#
# these rules are reasonable, however currently there are too many violations, which are both harmless and time-consuming to fix
# TODO: this category should be empty - all rules either have to be fixed or moved to a different category
dotnet_diagnostic.CA1008.severity = none # a lot of enums (especially various AID's, etc) currently don't have zero value; consider fixing all that and reenabling the rule
dotnet_diagnostic.CA1031.severity = none # catching Exception is not ideal; fixing requires carefully handle all potential sources of error correctly - and i'm not sure whether it's actually possible (eg draw catching exception is a contingency for bugs)
dotnet_diagnostic.CA1069.severity = none # this warns about multiple names for a single enum value; this isn't good
dotnet_diagnostic.CA1305.severity = none # culture should be passed properly where strings are formatted
dotnet_diagnostic.CA1711.severity = none # this is a bit too extreme, prevents calling delegates *Delegate, flags *Flag[s], calling spread/stack data Stack, etc
dotnet_diagnostic.CA1715.severity = none # prefixing all generic type parameters with T is a bit too much refactoring (e.g. AID -> TAID)
dotnet_diagnostic.CA1812.severity = none # we have tons of classes that we instantiate indirectly (eg via reflection); consider codegenerators instead
dotnet_diagnostic.CA1815.severity = none # this is useful, unfortunately it's way too spammy currently (eg for interop structs); figure out how to enable it!
dotnet_diagnostic.CA1822.severity = none # this is useful, unfortunately sometimes method just happening not to access this is implementation detail; revise and potentially reenable
dotnet_diagnostic.CA1852.severity = none # make a pass over all classes (including public) and seal all of them that aren't used as bases, since apparently that's a performance improvement
dotnet_diagnostic.CA2000.severity = none # requires major refactoring to ensure idiomatic dispose usage
# these rules are reasonable in theory, but cause many false positives, and so are disabled
dotnet_diagnostic.CA1027.severity = none # this considers many enums with non-sequential values to be flags erroneosly, and actually missing Flags attribute where it's needed is quite hard
dotnet_diagnostic.CA1716.severity = none # this is a bit too extreme, it reserves too many useful words
dotnet_diagnostic.CA1720.severity = none # this is a bit too extreme, it reserves too many useful words
dotnet_diagnostic.CA1724.severity = none # no way i'm forbidding any types from having same name as any other namespaces
# these rules have minor benefit, but are expensive to run, so are disabled
dotnet_diagnostic.CA1508.severity = none # this rule is extremely expensive (adds like 50s to build time!), it performs data flow analysis to try and find dead code
#### Code style rules (IDExxxx) ####
dotnet_diagnostic.IDE0001.severity = warning # remove unnecessary namespace qualifications
dotnet_diagnostic.IDE0002.severity = warning # remove unnecessary class qualifications
dotnet_diagnostic.IDE0003.severity = warning # disallow useless this. qualification
dotnet_diagnostic.IDE0009.severity = none
dotnet_style_qualification_for_event = false
dotnet_style_qualification_for_field = false
dotnet_style_qualification_for_method = false
dotnet_style_qualification_for_property = false
dotnet_diagnostic.IDE0004.severity = warning # remove unnecessary casts
dotnet_diagnostic.IDE0005.severity = suggestion # remove unnecessary usings - TODO: it should be a warning, however currently this causes issues with builds (rule requires GenerateDocumentationFile property, which we don't want)
dotnet_diagnostic.IDE0007.severity = suggestion # almost always auto - TODO: reconsider severity
dotnet_diagnostic.IDE0008.severity = none
csharp_style_var_for_built_in_types = true
csharp_style_var_when_type_is_apparent = true
csharp_style_var_elsewhere = true
dotnet_diagnostic.IDE0010.severity = silent # non-exhaustive switch statements are generally fine, but allow easy refactoring in ide
dotnet_diagnostic.IDE0072.severity = silent # non-exhaustive switch expressions are generally fine, but allow easy refactoring in ide
dotnet_diagnostic.IDE0011.severity = silent # no strong preferences for braces, but allow easy refactoring in ide
csharp_prefer_braces = true:silent
dotnet_diagnostic.IDE0016.severity = warning # prefer throw expressions instead of null checks
csharp_style_throw_expression = true:suggestion
dotnet_diagnostic.IDE0017.severity = warning # prefer object initializers
dotnet_style_object_initializer = true
dotnet_diagnostic.IDE0018.severity = warning # use inline variable declarations for out params
csharp_style_inlined_variable_declaration = true
dotnet_diagnostic.IDE0019.severity = warning # prefer pattern matching to as + null check
dotnet_diagnostic.IDE0020.severity = warning # prefer pattern matching to is + cast (when is result is saved into variable)
dotnet_diagnostic.IDE0038.severity = warning # prefer pattern matching to is + cast (otherwise)
dotnet_diagnostic.IDE0078.severity = warning # prefer pattern matching in some other cases
dotnet_diagnostic.IDE0083.severity = warning # prefer pattern matching with 'not' operator to negation
dotnet_diagnostic.IDE0170.severity = warning # prefer pattern matching with nested properties
dotnet_diagnostic.IDE0260.severity = warning # prefer pattern matching to as + null propagation
csharp_style_pattern_matching_over_as_with_null_check = true
csharp_style_pattern_matching_over_is_with_cast_check = true
csharp_style_prefer_pattern_matching = true
csharp_style_prefer_not_pattern = true
csharp_style_prefer_extended_property_pattern = true
dotnet_diagnostic.IDE0021.severity = silent # no strong preferences for expression vs body for constructors, but allow easy refactoring in ide
dotnet_diagnostic.IDE0022.severity = silent # no strong preferences for expression vs body for methods, but allow easy refactoring in ide
dotnet_diagnostic.IDE0023.severity = suggestion # suggest expression vs body for conversion operators
dotnet_diagnostic.IDE0024.severity = suggestion # suggest expression vs body for other operators
dotnet_diagnostic.IDE0025.severity = suggestion # suggest expression vs body for properties
dotnet_diagnostic.IDE0026.severity = suggestion # suggest expression vs body for indexers
dotnet_diagnostic.IDE0027.severity = suggestion # suggest expression vs body for accessors
dotnet_diagnostic.IDE0053.severity = suggestion # suggest expression vs body for lambdas
dotnet_diagnostic.IDE0061.severity = suggestion # suggest expression vs body for local functions
csharp_style_expression_bodied_constructors = true:silent
csharp_style_expression_bodied_methods = true:silent
csharp_style_expression_bodied_operators = true:silent
csharp_style_expression_bodied_properties = true:silent
csharp_style_expression_bodied_indexers = true:silent
csharp_style_expression_bodied_accessors = true:silent
csharp_style_expression_bodied_lambdas = true:silent
csharp_style_expression_bodied_local_functions = true:silent
dotnet_diagnostic.IDE0028.severity = warning # prefer collection initializers
dotnet_diagnostic.IDE0300.severity = warning # prefer collection expressions for arrays
dotnet_diagnostic.IDE0301.severity = warning # prefer collection expressions for empty containers
dotnet_diagnostic.IDE0302.severity = warning # prefer collection expressions for stackalloc
dotnet_diagnostic.IDE0303.severity = warning # prefer collection expressions for immutable containers (Create)
dotnet_diagnostic.IDE0304.severity = warning # prefer collection expressions for immutable containers (builders)
dotnet_diagnostic.IDE0305.severity = warning # prefer collection expressions for linq
dotnet_style_collection_initializer = true
dotnet_style_prefer_collection_expression = when_types_loosely_match
dotnet_diagnostic.IDE0029.severity = warning # prefer x ?? y to x != null ? x : y for non-nullable reference types
dotnet_diagnostic.IDE0030.severity = warning # prefer x ?? y to x != null ? x : y for nullable value and reference types
dotnet_diagnostic.IDE0270.severity = warning # prefer x ?? throw ... to if-null check
dotnet_style_coalesce_expression = true
dotnet_diagnostic.IDE0031.severity = warning # prefer x?.foo() to x != null ? x.foo() : null;
dotnet_style_null_propagation = true
dotnet_diagnostic.IDE0032.severity = warning # prefer auto properties to explicit backing fields
dotnet_style_prefer_auto_properties = true
dotnet_diagnostic.IDE0033.severity = warning # prefer explicit tuple member names to ItemN
dotnet_style_explicit_tuple_names = true
dotnet_diagnostic.IDE0034.severity = warning # prefer default to default(T) if type can be inferred
csharp_prefer_simple_default_expression = true
dotnet_diagnostic.IDE0035.severity = warning # disallow unreachable code
dotnet_diagnostic.IDE0036.severity = warning # prefer standard modifier order
csharp_preferred_modifier_order = public,private,protected,internal,file,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,required,volatile,async
dotnet_diagnostic.IDE0037.severity = warning # prefer inferred member names for tuples and anonymous types
dotnet_style_prefer_inferred_tuple_names = true
dotnet_style_prefer_inferred_anonymous_type_member_names = true
dotnet_diagnostic.IDE0039.severity = warning # prefer local functions to lambdas
csharp_style_prefer_local_over_anonymous_function = true
dotnet_diagnostic.IDE0040.severity = silent # no strong preference for default accessibility modifiers (TODO: reconsider severity and interfaces)
dotnet_style_require_accessibility_modifiers = for_non_interface_members
dotnet_diagnostic.IDE0041.severity = warning # prefer is null checks
dotnet_style_prefer_is_null_check_over_reference_equality_method = true
dotnet_diagnostic.IDE0042.severity = silent # would be a good rule if it only suggested deconstructed non-named tuples, otherwise just leave it for refactoring
csharp_style_deconstructed_variable_declaration = true
dotnet_diagnostic.IDE0044.severity = warning # prefer marking fields as readonly if possible
dotnet_style_readonly_field = true
dotnet_diagnostic.IDE0045.severity = suggestion # suggest ternary over if-else for assignments, however sometimes it actually complicates code too much
dotnet_diagnostic.IDE0046.severity = suggestion # suggest ternary over if-else for return, however sometimes it actually complicates code too much
dotnet_style_prefer_conditional_expression_over_assignment = true
dotnet_style_prefer_conditional_expression_over_return = true
dotnet_diagnostic.IDE0047.severity = suggestion # suggest avoiding unnecessary parentheses, however sometimes they help with clarity
dotnet_diagnostic.IDE0048.severity = suggestion # ... except for relational (TODO reconsider?)
dotnet_style_parentheses_in_arithmetic_binary_operators = never_if_unnecessary
dotnet_style_parentheses_in_relational_binary_operators = always_for_clarity
dotnet_style_parentheses_in_other_binary_operators = never_if_unnecessary
dotnet_style_parentheses_in_other_operators = never_if_unnecessary
dotnet_diagnostic.IDE0049.severity = warning # prefer builtin type aliases (eg int vs System.Int32)
dotnet_style_predefined_type_for_locals_parameters_members = true
dotnet_style_predefined_type_for_member_access = true
dotnet_diagnostic.IDE0051.severity = warning # avoid unused private members
dotnet_diagnostic.IDE0052.severity = warning # avoid private members that are never read
dotnet_diagnostic.IDE0054.severity = warning # prefer compound assignments (eg +=)
dotnet_diagnostic.IDE0074.severity = warning # prefer coalesce compound assignments
dotnet_style_prefer_compound_assignment = true
dotnet_diagnostic.IDE0055.severity = warning # warn about formatting violations
dotnet_sort_system_directives_first = false
dotnet_separate_import_directive_groups = false
csharp_new_line_before_open_brace = all
csharp_new_line_before_else = true
csharp_new_line_before_catch = true
csharp_new_line_before_finally = true
csharp_new_line_before_members_in_object_initializers = true
csharp_new_line_before_members_in_anonymous_types = true
csharp_new_line_between_query_expression_clauses = true
csharp_indent_case_contents = true
csharp_indent_switch_labels = true
csharp_indent_labels = one_less_than_current
csharp_indent_block_contents = true
csharp_indent_braces = false
csharp_indent_case_contents_when_block = true
csharp_space_after_cast = false
csharp_space_after_keywords_in_control_flow_statements = true
csharp_space_between_parentheses = false
csharp_space_before_colon_in_inheritance_clause = true
csharp_space_after_colon_in_inheritance_clause = true
csharp_space_around_binary_operators = before_and_after
csharp_space_between_method_declaration_parameter_list_parentheses = false
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
csharp_space_between_method_declaration_name_and_open_parenthesis = false
csharp_space_between_method_call_parameter_list_parentheses = false
csharp_space_between_method_call_empty_parameter_list_parentheses = false
csharp_space_between_method_call_name_and_opening_parenthesis = false
csharp_space_after_comma = true
csharp_space_before_comma = false
csharp_space_after_dot = false
csharp_space_before_dot = false
csharp_space_after_semicolon_in_for_statement = true
csharp_space_before_semicolon_in_for_statement = false
csharp_space_around_declaration_statements = false
csharp_space_before_open_square_brackets = false
csharp_space_between_empty_square_brackets = false
csharp_space_between_square_brackets = false
csharp_preserve_single_line_statements = true
csharp_preserve_single_line_blocks = true
dotnet_diagnostic.IDE0056.severity = warning # prefer [^1] index operators
csharp_style_prefer_index_operator = true
dotnet_diagnostic.IDE0057.severity = warning # prefer [i..j] range operators
csharp_style_prefer_range_operator = true
dotnet_diagnostic.IDE0058.severity = silent # TODO: reconsider - there are too many cases where ignoring return value implicitly is perfectly fine
csharp_style_unused_value_expression_statement_preference = discard_variable
dotnet_diagnostic.IDE0059.severity = warning # unused assignment is almost always an error
csharp_style_unused_value_assignment_preference = discard_variable
dotnet_diagnostic.IDE0060.severity = suggestion # TODO: reconsider - unused parameters are often hard to avoid...
dotnet_code_quality_unused_parameters = all
dotnet_diagnostic.IDE0062.severity = warning # prefer marking local fuctions as static if possible
csharp_prefer_static_local_function = true
dotnet_diagnostic.IDE0063.severity = suggestion # suggest simple (without extra scope) RAII usings
csharp_prefer_simple_using_statement = true:suggestion
dotnet_diagnostic.IDE0064.severity = warning # warn about structs with readonly fields that have full-struct reassigns
dotnet_diagnostic.IDE0065.severity = warning # all usings should be outside namespace
csharp_using_directive_placement = outside_namespace:silent
dotnet_diagnostic.IDE0066.severity = warning # prefer switch expressions over statements
csharp_style_prefer_switch_expression = true
dotnet_diagnostic.IDE0070.severity = warning # prefer standard HashCombine over custom hash calculation code
dotnet_diagnostic.IDE0071.severity = warning # prefer simplest possible string interpolation form
dotnet_style_prefer_simplified_interpolation = true
dotnet_diagnostic.IDE0073.severity = none # don't bother with any file headers
file_header_template = unset
dotnet_diagnostic.IDE0075.severity = warning # prefer boolean expressions without redundancy
dotnet_style_prefer_simplified_boolean_expressions = true
dotnet_diagnostic.IDE0076.severity = warning # warn about invalid targets in suppression attributes
dotnet_diagnostic.IDE0077.severity = warning # warn about legacy syntax in suppression attributes
dotnet_diagnostic.IDE0079.severity = warning # warn about stale warning suppressions
dotnet_remove_unnecessary_suppression_exclusions = all
dotnet_diagnostic.IDE0080.severity = warning # warn about unnecessary null-forgiving (!) operators
dotnet_diagnostic.IDE0082.severity = warning # prefer nameof(...) to typeof(...).Name
dotnet_diagnostic.IDE0090.severity = warning # don't repeat type twice in new expressions
csharp_style_implicit_object_creation_when_type_is_apparent = true
dotnet_diagnostic.IDE0100.severity = warning # avoid redundant '== true' comparisons
dotnet_diagnostic.IDE0110.severity = warning # avoid unnecessary _ placeholders
dotnet_diagnostic.IDE0120.severity = warning # prefer simpler linq, eg any(...) vs where(...).any()
dotnet_diagnostic.IDE0130.severity = none # TODO: reconsider - currently namespaces and folder structure don't match at all
dotnet_style_namespace_match_folder = true
dotnet_diagnostic.IDE0150.severity = warning # prefer null checks over misleading type checks
csharp_style_prefer_null_check_over_type_check = true:suggestion
dotnet_diagnostic.IDE0160.severity = none # prefer file scoped namespaces
dotnet_diagnostic.IDE0161.severity = warning
csharp_style_namespace_declarations = file_scoped:silent
dotnet_diagnostic.IDE0180.severity = warning # prefer tuple swap
csharp_style_prefer_tuple_swap = true
dotnet_diagnostic.IDE0200.severity = warning # prefer method groups to lambdas if stars align
csharp_style_prefer_method_group_conversion = true:silent
dotnet_diagnostic.IDE0210.severity = warning # prefer implicit main
dotnet_diagnostic.IDE0211.severity = none
csharp_style_prefer_top_level_statements = true:silent
dotnet_diagnostic.IDE0220.severity = warning # avoid implicit casts in foreach
dotnet_style_prefer_foreach_explicit_cast_in_source = always # when_strongly_typed ??
dotnet_diagnostic.IDE0230.severity = warning # use utf8 literals instead of byte arrays
csharp_style_prefer_utf8_string_literals = true
dotnet_diagnostic.IDE0240.severity = warning # we have nullables enabled globally, so any directives would be redundant and should not appear in codebase
dotnet_diagnostic.IDE0241.severity = warning
dotnet_diagnostic.IDE0250.severity = warning # prefer marking struct as readonly if all fields are
csharp_style_prefer_readonly_struct = true
dotnet_diagnostic.IDE0251.severity = warning # prefer marking struct members as readonly
csharp_style_prefer_readonly_struct_member = true
dotnet_diagnostic.IDE0280.severity = warning # prefer nameof to hardcoded name strings in various attributes
dotnet_diagnostic.IDE0290.severity = warning # prefer primary constructors where possible
csharp_style_prefer_primary_constructors = true:suggestion
dotnet_diagnostic.IDE1005.severity = warning # prefer delegate?.invoke() to null checks
csharp_style_conditional_delegate_call = true
#### ??? ####
# Expression-level preferences
dotnet_style_operator_placement_when_wrapping = beginning_of_line
# New line preferences
dotnet_style_allow_multiple_blank_lines_experimental = false:warning
dotnet_style_allow_statement_immediately_after_block_experimental = true
csharp_style_allow_blank_line_after_colon_in_constructor_initializer_experimental = false:warning
csharp_style_allow_blank_line_after_token_in_arrow_expression_clause_experimental = false:warning
csharp_style_allow_blank_line_after_token_in_conditional_expression_experimental = false:warning
csharp_style_allow_blank_lines_between_consecutive_braces_experimental = false:warning
csharp_style_allow_embedded_statements_on_same_line_experimental = true:warning
#### Naming styles ####
dotnet_diagnostic.IDE1006.severity = warning # enforce naming rules (TODO: review & reconsider rules)
# Naming rules
dotnet_naming_rule.interface_should_be_begins_with_i.severity = suggestion
dotnet_naming_rule.interface_should_be_begins_with_i.symbols = interface
dotnet_naming_rule.interface_should_be_begins_with_i.style = begins_with_i
dotnet_naming_rule.types_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.types_should_be_pascal_case.symbols = types
dotnet_naming_rule.types_should_be_pascal_case.style = pascal_case
dotnet_naming_rule.non_field_members_should_be_pascal_case.severity = suggestion
dotnet_naming_rule.non_field_members_should_be_pascal_case.symbols = non_field_members
dotnet_naming_rule.non_field_members_should_be_pascal_case.style = pascal_case
# Symbol specifications
dotnet_naming_symbols.interface.applicable_kinds = interface
dotnet_naming_symbols.interface.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.interface.required_modifiers =
dotnet_naming_symbols.types.applicable_kinds = class, struct, interface, enum
dotnet_naming_symbols.types.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.types.required_modifiers =
dotnet_naming_symbols.non_field_members.applicable_kinds = property, event, method
dotnet_naming_symbols.non_field_members.applicable_accessibilities = public, internal, private, protected, protected_internal, private_protected
dotnet_naming_symbols.non_field_members.required_modifiers =
# Naming styles
dotnet_naming_style.pascal_case.required_prefix =
dotnet_naming_style.pascal_case.required_suffix =
dotnet_naming_style.pascal_case.word_separator =
dotnet_naming_style.pascal_case.capitalization = pascal_case
dotnet_naming_style.begins_with_i.required_prefix = I
dotnet_naming_style.begins_with_i.required_suffix =
dotnet_naming_style.begins_with_i.word_separator =
dotnet_naming_style.begins_with_i.capitalization = pascal_case
[*.{cs,vb}]
dotnet_style_operator_placement_when_wrapping = beginning_of_line
tab_width = 4
indent_size = 4
end_of_line = crlf
dotnet_style_coalesce_expression = true:suggestion
dotnet_style_null_propagation = true:suggestion
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion
dotnet_style_prefer_auto_properties = true:silent
dotnet_style_object_initializer = true:suggestion
dotnet_style_collection_initializer = true:suggestion
dotnet_style_prefer_simplified_boolean_expressions = true:suggestion
dotnet_style_prefer_conditional_expression_over_assignment = true:silent
dotnet_style_prefer_conditional_expression_over_return = true:silent
dotnet_style_explicit_tuple_names = true:suggestion
dotnet_style_prefer_inferred_tuple_names = true:suggestion
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion
dotnet_style_prefer_compound_assignment = true:suggestion
dotnet_style_prefer_simplified_interpolation = true:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_style_namespace_match_folder = true:suggestion
================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: initialdet
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
================================================
FILE: .github/workflows/publish.yml
================================================
on:
push:
tags:
- 'v*.*.*.*'
permissions:
contents: read
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Build and publish
uses: Jaksuhn/DynamisPublishAction@master
with:
plugin_id: '47'
publisher_key: ${{ secrets.PUBLISHER_KEY }}
================================================
FILE: .github/workflows/update-bite-timers.yml
================================================
name: Update Bite Timers
on:
schedule:
- cron: '0 0 1 * *' # Runs on the first day of each month
workflow_dispatch:
jobs:
update-bite-timers:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install requests
- name: Run update script
run: python update_bite_timers.py
- name: Check for changes
id: check_changes
run: |
git diff --quiet AutoHook/AutoHook/Data/FishData/bitetimers.json || echo "changes=true" >> $GITHUB_OUTPUT
- name: Commit and push if changed
if: steps.check_changes.outputs.changes == 'true'
run: |
git config --local user.email "actions@github.com"
git config --local user.name "GitHub Actions"
git add AutoHook/Data/FishData/bitetimers.json
git commit -m "Update bitetimers.json"
git push
================================================
FILE: .gitignore
================================================
.vs/
obj/
bin/
dist/
*.user
.idea/
================================================
FILE: .gitmodules
================================================
[submodule "PunishLib"]
path = PunishLib
url = https://github.com/PunishXIV/PunishLib
================================================
FILE: AcceptCollectable.md
================================================
# Auto accept collectable popup
Theres an amazing plugin also published by Puni.sh called YesAlready that can help us with that.
## Installation
* We use the same repo, so just search and Install YesAlready from the Plugin Installer.
https://github.com/PunishXIV/YesAlready
## Configuration
### Option 1 (kr/cn not supported)
Enable Auto Collectables

### Option 2
* Open the plugin config window by typing /pyes in the chatbox
* Go to the YesNo tab, click the + button and add the white text from the Collectable windows in this format: /WhiteTextHere .*/

It should look like this with the English Client:
* /Preserve the following item with a collectability of .*/
This should work with any client language, just swap the english text with yours.

================================================
FILE: AutoHook/AutoHook.cs
================================================
using AutoHook.IPC;
using AutoHook.Spearfishing;
using Dalamud.Game.Command;
using Dalamud.Game.Gui.Dtr;
using Dalamud.Game.Text;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using PunishLib;
using System.Globalization;
namespace AutoHook;
public class AutoHook : IDalamudPlugin
{
public string Name => UIStrings.AutoHook;
internal static AutoHook Plugin = null!;
//todo: - Spearfishing rework
private const string CmdAhCfg = "/ahcfg";
private const string CmdAh = "/autohook";
private const string CmdAhOn = "/ahon";
private const string CmdAhOff = "/ahoff";
private const string CmdAhtg = "/ahtg";
private const string CmdAhPreset = "/ahpreset";
private const string CmdAhStart = "/ahstart";
private const string CmdAhBait = "/ahbait";
private const string CmdBait = "/bait";
private const string CmdAgPreset = "/agpreset";
private static readonly Dictionary<string, string> CommandHelp = new()
{
{ CmdAhOff, UIStrings.Disables_AutoHook },
{ CmdAhOn, UIStrings.Enables_AutoHook },
{ CmdAhCfg, UIStrings.Opens_Config_Window },
{ CmdAh, UIStrings.Opens_Config_Window },
{ CmdAhtg, UIStrings.Toggles_AutoHook_On_Off },
{ CmdAhPreset, UIStrings.Set_preset_command },
{ CmdAhStart, UIStrings.Starts_AutoHook },
{ CmdAhBait, UIStrings.SwitchFishBait },
{ CmdBait, UIStrings.SwitchFishBait },
{ CmdAgPreset, UIStrings.Set_agpreset_command }
};
private static PluginUi _pluginUi = null!;
private static AutoGig _autoGig = null!;
public readonly FishingManager HookManager;
public AutoHookIPC AutoHookIpc;
public AutoHook(IDalamudPluginInterface pluginInterface, IDtrBar dtrBar)
{
ECommonsMain.Init(pluginInterface, this, Module.DalamudReflector, Module.ObjectFunctions);
Service.Initialize(pluginInterface);
PunishLibMain.Init(pluginInterface, "AutoHook",
new AboutPlugin() { Developer = "InitialDet", Sponsor = "https://ko-fi.com/initialdet" });
Plugin = this;
Service.BaitManager = new BaitManager();
Service.TugType = new SeTugType(Svc.SigScanner);
Svc.PluginInterface.UiBuilder.Draw += Service.WindowSystem.Draw;
Svc.PluginInterface.UiBuilder.OpenConfigUi += OnOpenConfigUi;
Svc.PluginInterface.UiBuilder.OpenMainUi += OnOpenConfigUi;
Service.Language = Svc.ClientState.ClientLanguage;
GameRes.Initialize();
Service.Configuration = Configuration.Load();
UIStrings.Culture = new CultureInfo(Service.Configuration.CurrentLanguage);
_pluginUi = new PluginUi();
_autoGig = new AutoGig();
foreach (var (command, help) in CommandHelp)
{
Svc.Commands.AddHandler(command, new CommandInfo(OnCommand)
{
HelpMessage = help
});
}
HookManager = new FishingManager();
AutoHookIpc = new AutoHookIPC();
_ = new EzDtr2(() =>
$"{((SeIconChar)0xE05E).ToIconString()} {(Service.Configuration.PluginEnabled ? UIStrings.Enabled : UIStrings.Disabled)}",
evt =>
{
if (evt.ClickType is MouseClickType.Left)
{
Service.Configuration.PluginEnabled ^= true;
Service.Configuration.Save();
}
else if (evt.ClickType is MouseClickType.Right)
_pluginUi.Toggle();
},
showCondition: () => Service.Configuration.DtrBarEnabled && Player.Job is ECommons.ExcelServices.Job.FSH
);
_ = new EzDtr2(() => $"{SeIconChar.Collectible.ToIconString()} {Service.Configuration.HookPresets.SelectedPreset?.PresetName ?? $"{UIStrings.GlobalPreset}"}",
evt =>
{
if (Service.Configuration.HookPresets.SelectedPreset == null) return;
var presets = Service.Configuration.HookPresets.CustomPresets;
var index = presets.IndexOf(Service.Configuration.HookPresets.SelectedPreset);
var direction = evt.ClickType == MouseClickType.Left ? 1 : -1;
Service.Configuration.HookPresets.SelectedPreset = presets[(index + direction + presets.Count) % presets.Count];
Service.Configuration.Save();
},
$"{Name}Presets",
() => Service.Configuration.DtrPresetBarEnabled && Player.Job is ECommons.ExcelServices.Job.FSH && Service.Configuration.HookPresets.SelectedPreset != null
);
#if (DEBUG)
OnOpenConfigUi();
#endif
}
private void OnCommand(string command, string args)
{
switch (command.Trim())
{
case CmdAhCfg:
case CmdAh:
OnOpenConfigUi();
break;
case CmdAhOn:
Svc.Chat.Print(UIStrings.AutoHook_Enabled);
Service.Configuration.PluginEnabled = true;
break;
case CmdAhOff:
Svc.Chat.Print(UIStrings.AutoHook_Disabled);
Service.Configuration.PluginEnabled = false;
break;
case CmdAhtg when Service.Configuration.PluginEnabled:
Svc.Chat.Print(UIStrings.AutoHook_Disabled);
Service.Configuration.PluginEnabled = false;
break;
case CmdAhtg:
Svc.Chat.Print(UIStrings.AutoHook_Enabled);
Service.Configuration.PluginEnabled = true;
break;
case CmdAhPreset:
SetPreset(args);
break;
case CmdAhStart:
HookManager.StartFishing();
break;
case CmdBait:
case CmdAhBait:
SwapBait(args);
break;
case CmdAgPreset:
SetGigPreset(args);
break;
}
}
private static void SwapBait(string args)
{
var bait = GameRes.Baits.FirstOrDefault(f => f.Name.ToLower() == args.ToLower() || f.Id.ToString() == args);
Service.BaitManager.ChangeBait((uint)bait?.Id!);
}
private static void SetPreset(string presetName)
{
var preset = Service.Configuration.HookPresets.CustomPresets.FirstOrDefault(x => x.PresetName == presetName);
if (preset == null)
{
Svc.Chat.Print(UIStrings.Preset_not_found);
return;
}
Service.Save();
Service.Configuration.HookPresets.SelectedPreset = preset;
Svc.Chat.Print(@$"{UIStrings.Preset_set_to_} {preset.PresetName}");
Service.Save();
}
private static void SetGigPreset(string presetName)
{
try
{
var preset = Service.Configuration.AutoGigConfig.Presets.FirstOrDefault(x => x.PresetName == presetName);
if (preset == null)
{
Svc.Chat.Print(@$"{UIStrings.Preset_not_found} - {presetName}");
return;
}
Service.Save();
Service.Configuration.AutoGigConfig.SelectedPreset = preset;
Svc.Chat.Print(@$"{UIStrings.Gig_preset_set_to_} {preset.PresetName}");
Service.Save();
}
catch (Exception e)
{
Svc.Log.Error(e.Message);
}
}
public void Dispose()
{
_pluginUi.Dispose();
_autoGig.Dispose();
HookManager.Dispose();
Service.Save();
Svc.PluginInterface.UiBuilder.Draw -= Service.WindowSystem.Draw;
Svc.PluginInterface.UiBuilder.OpenConfigUi -= OnOpenConfigUi;
Svc.PluginInterface.UiBuilder.OpenMainUi -= OnOpenConfigUi;
foreach (var (command, _) in CommandHelp)
Svc.Commands.RemoveHandler(command);
EzDtr2.DisposeAll();
ECommonsMain.Dispose();
}
private static void OnOpenConfigUi() => _pluginUi.Toggle();
}
================================================
FILE: AutoHook/AutoHook.csproj
================================================
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Dalamud.NET.Sdk/14.0.1">
<PropertyGroup>
<Authors>Det</Authors>
<Version>0.0.0.0</Version>
<LangVersion>preview</LangVersion>
<GenerateErrorForMissingTargetingPacks>false</GenerateErrorForMissingTargetingPacks>
</PropertyGroup>
<ItemGroup>
<None Include="Data\FishData\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<EmbeddedResource Include="Assets\Fishy.png" />
<EmbeddedResource Include="Assets\Fishy_g.png" />
</ItemGroup>
<PropertyGroup Condition="'$([System.Runtime.InteropServices.RuntimeInformation]::IsOSPlatform($([System.Runtime.InteropServices.OSPlatform]::Linux)))'">
<DalamudLibPath>$(DALAMUD_HOME)/</DalamudLibPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="ECommons" Version="3.1.0.21" />
<PackageReference Include="HtmlAgilityPack" Version="1.12.4" />
<ProjectReference Include="..\PunishLib\PunishLib\PunishLib.csproj" />
</ItemGroup>
<ItemGroup>
<Compile Update="Resources\Localization\UIStrings.Designer.cs">
<DesignTime>True</DesignTime>
<AutoGen>True</AutoGen>
<DependentUpon>UIStrings.resx</DependentUpon>
</Compile>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Update="Resources\Localization\UIStrings.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>UIStrings.Designer.cs</LastGenOutput>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<PackageReference Update="DotNet.ReproducibleBuilds" Version="2.0.2" />
</ItemGroup>
</Project>
================================================
FILE: AutoHook/AutoHook.csproj.DotSettings
================================================
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<s:String x:Key="/Default/CodeEditing/Localization/Localizable/@EntryValue">Yes</s:String>
<s:String x:Key="/Default/CodeEditing/Localization/LocalizableInspector/@EntryValue">Pessimistic</s:String></wpf:ResourceDictionary>
================================================
FILE: AutoHook/AutoHook.json
================================================
{
"Author": "Det",
"Name": "AutoHook",
"Punchline": "Makes fishing less (or more) boring",
"Description": "It hooks the fish for you, can you believe it?",
"InternalName": "AutoHook",
"RepoUrl": "https://github.com/PunishXIV/AutoHook",
"MinimumDalamudVersion": "14.0.0.0",
"Tags": [ "Gathering", "Fishing" ],
"AcceptsFeedback": false,
"Changelog": "Click the Changelog button to see whats new",
"IconURL": "https://s3.puni.sh/media/plugin/47/icon-k1slevjorpo.png"
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoBigGameFishing.cs
================================================
namespace AutoHook.Classes.AutoCasts;
public class AutoBigGameFishing : BaseActionCast
{
public int AnglersStacks = 2;
public bool WithIdenticalC = false;
public bool WithSlap = false;
public AutoBigGameFishing() : base(UIStrings.BigGameFishing, IDs.Actions.BigGameFishing)
{
}
public override string GetName()
=> Name = UIStrings.BigGameFishing;
public override bool CastCondition()
{
if (PlayerRes.HasStatus(IDs.Status.BigGameFishing))
return false;
var slapOrIc = true;
if (WithIdenticalC || WithSlap)
slapOrIc = WithIdenticalC && PlayerRes.HasStatus(IDs.Status.IdenticalCast) ||
WithSlap && PlayerRes.HasStatus(IDs.Status.SurfaceSlap);
bool hasStacks = PlayerRes.HasAnglersArtStacks(AnglersStacks);
return hasStacks && slapOrIc;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
var stack = AnglersStacks;
if (DrawUtil.EditNumberField(UIStrings.TabAutoCasts_DrawExtraOptionsThaliaksFavor_, ref stack, "", 1))
{
AnglersStacks = Math.Max(2, Math.Min(stack, 10));
Service.Save();
}
DrawUtil.Checkbox(UIStrings.UseIcActive, ref WithIdenticalC);
DrawUtil.Checkbox(UIStrings.UseSlapActive, ref WithSlap);
};
public override int Priority { get; set; } = 18;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoCastLine.cs
================================================
using System.ComponentModel;
namespace AutoHook.Classes.AutoCasts;
public class AutoCastLine : BaseActionCast
{
public bool OnlyCastWithFishEyes = false;
public bool OnlyCastLarge = false;
[DefaultValue(true)] public bool IgnoreMooch = true;
public override bool DoesCancelMooch() => !IgnoreMooch;
public override bool RequiresTimeWindow() => true;
public AutoCastLine() : base(UIStrings.AutoCastLine_Auto_Cast_Line, IDs.Actions.Cast)
{
Enabled = true;
Priority = 1;
}
public override int Priority { get; set; } = 0;
public override bool IsExcludedPriority { get; set; } = true;
public override bool CastCondition()
{
if (OnlyCastWithFishEyes && !PlayerRes.HasStatus(IDs.Status.FishEyes))
return false;
if (OnlyCastLarge && !PlayerRes.HasAnyStatus([IDs.Status.AnglersFortune, IDs.Status.PrizeCatch]))
return false;
return true;
}
public override string GetName()
=> Name = UIStrings.AutoCastLine_Auto_Cast_Line;
protected override DrawOptionsDelegate DrawOptions => () =>
{
DrawUtil.Checkbox(UIStrings.AutoCastOnlyUnderFishEyes, ref OnlyCastWithFishEyes,
UIStrings.AutoCastOnlyUnderFishEyesHelpText);
DrawUtil.Checkbox(UIStrings.OnlyCastLarge, ref OnlyCastLarge);
DrawUtil.Checkbox(UIStrings.IgnoreMooch, ref IgnoreMooch,
UIStrings.IgnoreMoochHelpText);
};
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoChum.cs
================================================
namespace AutoHook.Classes.AutoCasts;
public class AutoChum : BaseActionCast
{
public bool _onlyUseWithIntuition;
public int _useWhenIntuitionExceeds = 0;
public override bool DoesCancelMooch() => true;
public AutoChum() : base(UIStrings.Chum, IDs.Actions.Chum)
{
HelpText = UIStrings.CancelsCurrentMooch;
}
public override string GetName()
=> Name = UIStrings.Chum;
public override bool CastCondition()
{
var hasIntuition = PlayerRes.HasStatus(IDs.Status.FishersIntuition);
if (!hasIntuition && _onlyUseWithIntuition)
return false;
if (hasIntuition && _onlyUseWithIntuition && PlayerRes.GetStatusTime(IDs.Status.FishersIntuition) <= _useWhenIntuitionExceeds)
return false;
return true;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
if (DrawUtil.Checkbox(UIStrings.OnlyUseWhenFisherSIntutionIsActive, ref _onlyUseWithIntuition))
{
Service.Save();
}
if (_onlyUseWithIntuition)
{
var time = _useWhenIntuitionExceeds;
if (DrawUtil.EditNumberField(UIStrings.UseWhenIntuitionTimeIsEqualOrGreaterThan, ref time))
{
_useWhenIntuitionExceeds = Math.Max(0, Math.Min(time, 999));
Service.Save();
}
}
};
public override int Priority { get; set; } = 1;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoCollect.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoCollect : BaseActionCast
{
public override int Priority { get; set; } = 2;
public override bool IsExcludedPriority { get; set; } = true;
public AutoCollect() : base(UIStrings.Collect, IDs.Actions.Collect, ActionType.EventAction)
{
HelpText = UIStrings.CollectHelpText;
}
public override string GetName()
=> Name = UIStrings.Collect;
public override bool CastCondition() => !PlayerRes.HasStatus(IDs.Status.CollectorsGlove);
//protected override DrawOptionsDelegate DrawOptions => () =>
//{
//};
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoCordial.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoCordial : BaseActionCast
{
private const uint CordialHiRecovery = 400;
private const uint CordialHqRecovery = 350;
private const uint CordialRecovery = 300;
private const uint CordialHqWateredRecovery = 200;
private const uint CordialWateredRecovery = 150;
public bool InvertCordialPriority;
public bool AllowOvercapIC;
public bool IgnoreTimeWindow;
public override bool RequiresTimeWindow() => !IgnoreTimeWindow;
[NonSerialized]
public readonly List<(uint, uint)> _cordialList =
[
(IDs.Item.HiCordial, CordialHiRecovery),
(IDs.Item.HQCordial, CordialHqRecovery),
(IDs.Item.Cordial, CordialRecovery),
(IDs.Item.HQWateredCordial, CordialHqWateredRecovery),
(IDs.Item.WateredCordial, CordialWateredRecovery)
];
[NonSerialized]
private readonly List<(uint, uint)> _invertedList =
[
(IDs.Item.WateredCordial, CordialWateredRecovery),
(IDs.Item.HQWateredCordial, CordialHqWateredRecovery),
(IDs.Item.Cordial, CordialRecovery),
(IDs.Item.HQCordial, CordialHqRecovery),
(IDs.Item.HiCordial, CordialHiRecovery)
];
public AutoCordial(bool isSpearFishing = false) : base(UIStrings.Cordial, IDs.Item.Cordial, ActionType.Item)
{
IsSpearFishing = isSpearFishing;
}
public override string GetName()
=> Name = UIStrings.Cordial;
public override bool CastCondition()
{
var cordialList = _cordialList;
if (InvertCordialPriority)
cordialList = _invertedList;
foreach (var (id, recovery) in cordialList)
{
if (!PlayerRes.HaveCordialInInventory(id))
continue;
Id = id;
return CheckNotOvercaped(recovery);
}
return false;
}
public override void SetThreshold(int newCost)
{
if (newCost <= 0)
GpThreshold = 0;
else
GpThreshold = newCost;
}
private bool CheckNotOvercaped(uint recovery)
{
if (AllowOvercapIC && PlayerRes.HasStatus(IDs.Status.IdenticalCast))
return true;
return PlayerRes.GetCurrentGp() + recovery <= PlayerRes.GetMaxGp();
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
if (DrawUtil.Checkbox(UIStrings.AutoCastCordialPriority, ref InvertCordialPriority))
{
Service.Save();
}
if (!IsSpearFishing)
{
if (DrawUtil.Checkbox(UIStrings.Allow_Gp_Overcap, ref AllowOvercapIC))
{
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.CordialOutsideTimeWindow, ref IgnoreTimeWindow, UIStrings.CordialOutsideTimeWindowHelpText))
{
Service.Save();
}
}
};
public override int Priority { get; set; } = 4;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoDoubleHook.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoDoubleHook : BaseActionCast
{
public override int Priority { get; set; } = 5;
public override bool IsExcludedPriority { get; set; } = false;
public AutoDoubleHook() : base(UIStrings.Double_Hook, Data.IDs.Actions.DoubleHook, ActionType.Action)
{
}
public override string GetName()
=> Name = UIStrings.Double_Hook;
public override bool CastCondition()
{
return true;
}
/*protected override DrawOptionsDelegate DrawOptions => () =>
{
};*/
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoFishEyes.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoFishEyes : BaseActionCast
{
public override int Priority { get; set; } = 6;
public override bool IsExcludedPriority { get; set; } = false;
public bool OnlyWhenMakeShiftUp;
public bool IgnoreMooch;
public override bool DoesCancelMooch() => !IgnoreMooch;
public override bool RequiresTimeWindow() => true;
public AutoFishEyes() : base(UIStrings.Fish_Eyes, IDs.Actions.FishEyes, ActionType.Action)
{
HelpText = UIStrings.CancelsCurrentMooch;
}
public override string GetName()
=> Name = UIStrings.Fish_Eyes;
public override bool CastCondition()
{
if (PlayerRes.HasStatus(IDs.Status.FishEyes))
return false;
if (OnlyWhenMakeShiftUp && !PlayerRes.HasStatus(IDs.Status.MakeshiftBait) &&
!PlayerRes.HasStatus(IDs.Status.AnglersFortune))
return false;
return true;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
DrawUtil.Checkbox(UIStrings.OnlyWhenMakeshiftOrPatience, ref OnlyWhenMakeShiftUp);
DrawUtil.Checkbox(UIStrings.IgnoreMooch, ref IgnoreMooch, UIStrings.IgnoreMoochFishEyes);
};
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoFood.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoFood : BaseActionCast //todo
{
public float SecondsRemaining = 0;
public override int Priority { get; set; } = 7;
public override bool IsExcludedPriority { get; set; } = false;
public AutoFood() : base(UIStrings.Food_Buff, 0, ActionType.Item)
{
}
public override string GetName()
=> Name = UIStrings.Food_Buff;
public override bool CastCondition()
{
if (PlayerRes.GetStatusTime(IDs.Status.FoodBuff) > SecondsRemaining)
{
return false;
}
return true;
}
/*protected override DrawOptionsDelegate DrawOptions => () =>
{
};*/
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoIdenticalCast.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
using Dalamud.Bindings.ImGui;
namespace AutoHook.Classes.AutoCasts;
public class AutoIdenticalCast : BaseActionCast
{
public bool OnlyUseUnderPatience;
public bool OnlyWhenCordialAvailable;
public bool OnlyUseAfterXAmount;
public int CaughtAmountLimit = 1;
public override bool DoesCancelMooch() => true;
public AutoIdenticalCast() : base(UIStrings.Identical_Cast, IDs.Actions.IdenticalCast, ActionType.Action)
{
HelpText = UIStrings.OverridesSurfaceSlap;
}
public override string GetName()
=> Name = UIStrings.UseIdenticalCast;
public override bool CastCondition()
{
if (PlayerRes.HasStatus(IDs.Status.IdenticalCast) || PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
return false;
if (OnlyWhenCordialAvailable && PlayerRes.ActionOnCoolDown(IDs.Item.HiCordial, ActionType.Item))
return false;
if (OnlyUseUnderPatience && !PlayerRes.HasStatus(IDs.Status.AnglersFortune))
return false;
return true;
}
public bool IsAvailableToCast(int caughtAmount)
{
if (OnlyUseAfterXAmount && caughtAmount < CaughtAmountLimit)
return false;
return IsAvailableToCast();
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
if (DrawUtil.Checkbox(UIStrings.Only_When_Patience_Active, ref OnlyUseUnderPatience))
{
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.Only_use_when_Cordial_is_available, ref OnlyWhenCordialAvailable))
{
Service.Save();
}
var stack = CaughtAmountLimit;
if (DrawUtil.Checkbox(UIStrings.Only_use_when_the_fish_is_caught, ref OnlyUseAfterXAmount))
{
Service.Save();
}
ImGui.SameLine();
ImGui.SetNextItemWidth(30);
if (ImGui.InputInt(UIStrings.TimeS, ref stack, 0, 0))
{
CaughtAmountLimit = Math.Max(1, Math.Min(stack, 999));
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.Dont_Cancel_Mooch, ref DontCancelMooch,
UIStrings.IdenticalCast_HelpText, true))
{
Service.Save();
}
};
public override int Priority { get; set; } = 8;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoLures.cs
================================================
using Dalamud.Bindings.ImGui;
using ECommons.Throttlers;
using FFXIVClientStructs.FFXIV.Client.Game.Event;
namespace AutoHook.Classes.AutoCasts;
public class AutoLures : BaseActionCast
{
public int LureStacks = 3;
public bool CancelAttempt;
public LureTarget LureTarget;
public AutoLures() : base(UIStrings.UseLures, IDs.Actions.AmbitiousLure)
{ }
public bool OnlyWhenActiveSlap;
public bool OnlyWhenNotActiveSlap;
public bool OnlyWhenActiveIdentical;
public bool OnlyWhenNotActiveIdentical;
public bool OnlyCastLarge;
public override string GetName()
=> Name = UIStrings.UseLures;
private uint StatusId => Id == IDs.Actions.AmbitiousLure ? IDs.Status.AmbitiousLure : IDs.Status.ModestLure;
public override bool CastCondition()
{
if (PlayerRes.GetStatusStacks(StatusId) >= LureStacks)
return false;
if (Service.BaitManager.FishingState is not (FishingState.AmbitiousLure or FishingState.LineInWater))
return false;
if (OnlyCastLarge && !PlayerRes.HasAnyStatus([IDs.Status.AnglersFortune, IDs.Status.PrizeCatch]))
return false;
if (OnlyWhenActiveIdentical && !PlayerRes.HasStatus(IDs.Status.IdenticalCast))
return false;
if (OnlyWhenNotActiveIdentical && PlayerRes.HasStatus(IDs.Status.IdenticalCast))
return false;
if (OnlyWhenActiveSlap && !PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
return false;
if (OnlyWhenNotActiveSlap && PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
return false;
return true;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
DrawUtil.TextV(UIStrings.LureType);
ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.AmbitiousLure, Id == IDs.Actions.AmbitiousLure))
{
Id = IDs.Actions.AmbitiousLure;
Service.Save();
}
ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.ModestLure, Id == IDs.Actions.ModestLure))
{
Id = IDs.Actions.ModestLure;
Service.Save();
}
var stack = LureStacks;
DrawUtil.TextV(UIStrings.AutoLures_Target_Fish);
ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.AnyTarget, LureTarget == LureTarget.Any))
{
LureTarget = LureTarget.Any;
Service.Save();
}
ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.OnlySpecial, LureTarget == LureTarget.Special))
{
LureTarget = LureTarget.Special;
Service.Save();
}
ImGui.SameLine();
DrawUtil.Info($"{UIStrings.SpecialFishExemple} {GameRes.LureFishes.FirstOrDefault()?.Name}");
ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.NotSpecial, LureTarget == LureTarget.NotSpecial))
{
LureTarget = LureTarget.NotSpecial;
Service.Save();
}
if (DrawUtil.EditNumberField(UIStrings.MaxAttempts, ref stack, "", 1))
{
// value has to be between 3 and 10
LureStacks = Math.Clamp(stack, 1, 3);
Service.Save();
}
DrawUtil.Checkbox(UIStrings.CancelAttempt, ref CancelAttempt);
DrawUtil.Checkbox(UIStrings.OnlyCastLarge, ref OnlyCastLarge);
DrawUtil.DrawTreeNodeEx(UIStrings.Surface_Slap_Options, DrawSurfaceSwap);
DrawUtil.DrawTreeNodeEx(UIStrings.Identical_Cast_Options, DrawIdenticalCast);
};
public void TryCasting(bool lureSuccess)
{
if (!EzThrottler.Check("CastingLure"))
return;
if (PlayerRes.GetStatusStacks(StatusId) >= LureStacks && CancelAttempt && !lureSuccess)
{
PlayerRes.CastActionDelayed(IDs.Actions.Rest);
return;
}
if (!IsAvailableToCast() || lureSuccess)
return;
PlayerRes.CastActionDelayed(Id);
EzThrottler.Throttle("CastingLure", 2500);
}
private void DrawSurfaceSwap()
{
ImGui.Indent();
if (DrawUtil.Checkbox(UIStrings.LureSSActive, ref OnlyWhenActiveSlap))
{
OnlyWhenNotActiveSlap = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.LureSSNotActive, ref OnlyWhenNotActiveSlap))
{
OnlyWhenActiveSlap = false;
Service.Save();
}
ImGui.Unindent();
}
private void DrawIdenticalCast()
{
ImGui.Indent();
if (DrawUtil.Checkbox(UIStrings.LureICActive, ref OnlyWhenActiveIdentical))
{
OnlyWhenNotActiveIdentical = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.LureICNotActive, ref OnlyWhenNotActiveIdentical))
{
OnlyWhenActiveIdentical = false;
Service.Save();
}
ImGui.Unindent();
}
public override int Priority { get; set; } = 0;
public override bool IsExcludedPriority { get; set; } = true;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoMakeShiftBait.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoMakeShiftBait : BaseActionCast
{
public int MakeshiftBaitStacks = 5;
public bool _onlyUseWithIntuition;
public bool OnlyWhenMoochNotUp;
public bool UseOnlyWhenMoochIIOnCD;
public override bool RequiresTimeWindow() => true;
public AutoMakeShiftBait() : base(UIStrings.MakeShift_Bait, IDs.Actions.MakeshiftBait, ActionType.Action)
{
HelpText = UIStrings.TabAutoCasts_DrawMakeShiftBait_HelpText;
}
public override string GetName()
=> Name = UIStrings.MakeShift_Bait;
public override bool CastCondition()
{
if (!Enabled)
return false;
if (PlayerRes.HasStatus(IDs.Status.MakeshiftBait))
return false;
if (PlayerRes.HasStatus(IDs.Status.PrizeCatch))
return false;
if (PlayerRes.HasStatus(IDs.Status.AnglersFortune))
return false;
if (!PlayerRes.HasStatus(IDs.Status.FishersIntuition) && _onlyUseWithIntuition)
return false;
if (PlayerRes.IsMoochAvailable() && OnlyWhenMoochNotUp)
return false;
if (UseOnlyWhenMoochIIOnCD && !PlayerRes.ActionOnCoolDown(IDs.Actions.Mooch2))
return false;
bool available = PlayerRes.ActionTypeAvailable(IDs.Actions.MakeshiftBait);
bool hasStacks = PlayerRes.HasAnglersArtStacks(MakeshiftBaitStacks);
return hasStacks && available;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
var stack = MakeshiftBaitStacks;
if (DrawUtil.EditNumberField(UIStrings.TabAutoCasts_When_Stack_Equals, ref stack))
{
// value has to be between 5 and 10
MakeshiftBaitStacks = Math.Max(5, Math.Min(stack, 10));
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.OnlyUseWhenFisherSIntutionIsActive, ref _onlyUseWithIntuition))
{
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.OnlyWhenMoochNotAvailable, ref OnlyWhenMoochNotUp))
{
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.AutoCastExtraOptionMakeshiftBait, ref UseOnlyWhenMoochIIOnCD))
{
Service.Save();
}
};
public override int Priority { get; set; } = 9;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoMooch.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoMooch : BaseActionCast
{
public AutoMooch2 Mooch2 = new();
public bool OnlyMoochIntuition = false;
public override bool RequiresTimeWindow() => true;
public AutoMooch() : base(UIStrings.AutoMooch, IDs.Actions.Mooch, ActionType.Action)
{
HelpText = UIStrings.AutoMooch_HelpText;
}
public override string GetName()
=> Name = UIStrings.AutoMooch;
public override bool CastCondition()
{
if (OnlyMoochIntuition && !PlayerRes.HasStatus(IDs.Status.FishersIntuition))
return false;
if (Mooch2.IsAvailableToCast())
{
Service.PrintDebug(@$"Mooch2 Available, casting mooch2");
Id = IDs.Actions.Mooch2;
return true;
}
if (PlayerRes.ActionTypeAvailable(IDs.Actions.Mooch))
{
Service.PrintDebug(@$"Mooch Available, casting normal mooch");
Id = IDs.Actions.Mooch;
return true;
}
return false;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
Mooch2.DrawConfig(null);
if (DrawUtil.Checkbox(UIStrings.TabAutoCasts_DrawExtraOptionsAutoMooch_Extra_Only_Active,
ref OnlyMoochIntuition))
{
Service.Save();
}
};
public override int Priority { get; set; } = 10;
public override bool IsExcludedPriority { get; set; } = true;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoMooch2.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoMooch2 : BaseActionCast
{
public override int Priority { get; set; } = 11;
public override bool IsExcludedPriority { get; set; } = true;
public override bool RequiresTimeWindow() => true;
public AutoMooch2() : base(UIStrings.UseMoochII, Data.IDs.Actions.Mooch2, ActionType.Action)
{
}
public override string GetName()
=> Name = UIStrings.UseMoochII;
public override bool CastCondition()
{
return true;
}
/*protected override DrawOptionsDelegate DrawOptions => () =>
{
};*/
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoMultiHook.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoMultiHook : BaseActionCast
{
/// <summary>Auto Casts: only use when Identical Cast status is active. Fish Caught: only use when Identical Cast is the action being cast.</summary>
public bool OnlyUseWhenIdenticalCastActive;
public AutoMultiHook() : base(UIStrings.Multihook, IDs.Actions.MultiHook) { }
public override int Priority { get; set; } = 0;
public override bool IsExcludedPriority { get; set; } = true;
public override unsafe bool CastCondition()
{
if (DutyActionManager.GetInstanceIfReady() is not null and var dm)
for (var i = 0; i < dm->NumValidSlots; i++)
if (dm->ActionId[i] is IDs.Actions.MultiHook && dm->CurCharges[i] > 0)
return !OnlyUseWhenIdenticalCastActive || PlayerRes.HasStatus(IDs.Status.IdenticalCast);
return false;
}
public override string GetName() => Name = UIStrings.Multihook;
protected override DrawOptionsDelegate DrawOptions => () =>
{
if (DrawUtil.Checkbox(UIStrings.OnlyUseWhenIdenticalCastIsActive, ref OnlyUseWhenIdenticalCastActive))
Service.Save();
};
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoPatience.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
using Dalamud.Bindings.ImGui;
namespace AutoHook.Classes.AutoCasts;
public class AutoPatience : BaseActionCast
{
//public bool EnableMakeshiftPatience;
public int RefreshEarlyTime = 0;
public bool UseOnlyWhenMoochIIOnCD;
public override bool RequiresTimeWindow() => true;
public override bool DoesCancelMooch() => true;
public AutoPatience() : base(UIStrings.AutoPatience_Patience, IDs.Actions.Patience2, ActionType.Action)
{
HelpText = UIStrings.CancelsCurrentMooch;
}
public override string GetName()
=> Name = UIStrings.AutoPatience_Patience;
public override bool CastCondition()
{
if (PlayerRes.HasStatus(IDs.Status.AnglersFortune) && PlayerRes.GetStatusTime(IDs.Status.AnglersFortune) > RefreshEarlyTime)
return false;
if (PlayerRes.HasStatus(IDs.Status.PrizeCatch))
return false;
if (PlayerRes.HasStatus(IDs.Status.MakeshiftBait))
return false;
if (UseOnlyWhenMoochIIOnCD && !PlayerRes.ActionOnCoolDown(IDs.Actions.Mooch2))
return false;
return true;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
/*if (DrawUtil.Checkbox(UIStrings.TabAutoCasts_DrawExtraOptionsPatience, ref EnableMakeshiftPatience))
{
Service.Save();
}*/
if (ImGui.RadioButton(UIStrings.Patience_I, Id == IDs.Actions.Patience))
{
Id = IDs.Actions.Patience;
Service.Save();
}
if (ImGui.RadioButton(UIStrings.Patience_II, Id == IDs.Actions.Patience2))
{
Id = IDs.Actions.Patience2;
Service.Save();
}
var time = RefreshEarlyTime;
if (DrawUtil.EditNumberField(UIStrings.RefreshWhenTimeIsLessThanOrEqual, ref time))
{
RefreshEarlyTime = Math.Max(0, Math.Min(time, 999));
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.AutoCastExtraOptionPatience, ref UseOnlyWhenMoochIIOnCD))
{
Service.Save();
}
};
public override int Priority { get; set; } = 12;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoPrizeCatch.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoPrizeCatch : BaseActionCast
{
public bool UseWhenMoochIIOnCD = false;
public bool UseOnlyWithIdenticalCast = false;
public bool UseOnlyWithActiveSlap = false;
public override bool DoesCancelMooch() => true;
public AutoPrizeCatch() : base(UIStrings.Prize_Catch, IDs.Actions.PrizeCatch, ActionType.Action)
{
HelpText = UIStrings.Use_Prize_Catch_HelpText;
}
public override string GetName()
=> Name = UIStrings.Prize_Catch;
public override bool CastCondition()
{
if (!Enabled)
return false;
if (UseWhenMoochIIOnCD && !PlayerRes.ActionOnCoolDown(IDs.Actions.Mooch2))
return false;
var slapOrIc = true;
if (UseOnlyWithIdenticalCast || UseOnlyWithActiveSlap)
slapOrIc = UseOnlyWithIdenticalCast && PlayerRes.HasStatus(IDs.Status.IdenticalCast) ||
UseOnlyWithActiveSlap && PlayerRes.HasStatus(IDs.Status.SurfaceSlap);
if (PlayerRes.HasStatus(IDs.Status.MakeshiftBait))
return false;
if (PlayerRes.HasStatus(IDs.Status.PrizeCatch))
return false;
if (PlayerRes.HasStatus(IDs.Status.AnglersFortune))
return false;
return slapOrIc && PlayerRes.ActionTypeAvailable(IDs.Actions.PrizeCatch);
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
DrawUtil.Checkbox(UIStrings.AutoCastExtraOptionPrizeCatch,
ref UseWhenMoochIIOnCD, UIStrings.ExtraOptionPrizeCatchHelpMarker);
DrawUtil.Checkbox(UIStrings.UseIcActive, ref UseOnlyWithIdenticalCast);
DrawUtil.Checkbox(UIStrings.UseSlapActive, ref UseOnlyWithActiveSlap);
};
public override int Priority { get; set; } = 13;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoReleaseFish.cs
================================================
namespace AutoHook.Classes.AutoCasts;
public class AutoReleaseFish : BaseActionCast
{
public AutoReleaseFish() : base(UIStrings.ReleaseAllFish, Data.IDs.Actions.Release)
{
HelpText = UIStrings.ReleaseAllFishHelpText;
}
public override int Priority { get; set; } = 14;
public override bool IsExcludedPriority { get; set; } = false;
public override bool CastCondition()
{
return true;
}
public override string GetName()
=> Name = UIStrings.ReleaseAllFish;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoSparefulHand.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoSparefulHand : BaseActionCast
{
public int SwimbaitCountLimit { get; set; } = 3;
public AutoSparefulHand() : base(UIStrings.SparefulHand, IDs.Actions.SparefulHand, ActionType.Action)
{
HelpText = UIStrings.SparefulHand_HelpText;
}
public override string GetName()
=> Name = UIStrings.SparefulHand;
public uint? FishIdToCheck { get; set; }
public override bool CastCondition()
{
// Check swimbait count for this specific fish if limit is set
if (SwimbaitCountLimit > 0 && FishIdToCheck.HasValue)
{
var currentSwimbaitCount = Service.BaitManager.GetSwimbaitCountForFish(FishIdToCheck.Value);
if (currentSwimbaitCount >= SwimbaitCountLimit)
return false;
}
return true;
}
public override int Priority { get; set; } = 20;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoSurfaceSlap.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoSurfaceSlap : BaseActionCast
{
public override bool DoesCancelMooch() => true;
public AutoSurfaceSlap() : base(UIStrings.Surface_Slap, IDs.Actions.SurfaceSlap, ActionType.Action)
{
HelpText = UIStrings.OverridesIdenticalCast;
}
public override string GetName()
=> Name = UIStrings.UseSurfaceSlap;
public override bool CastCondition()
{
if (PlayerRes.HasStatus(IDs.Status.IdenticalCast) || PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
return false;
return true;
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
if (DrawUtil.Checkbox(UIStrings.Dont_Cancel_Mooch, ref DontCancelMooch,
UIStrings.IdenticalCast_HelpText, true))
{
Service.Save();
}
};
public override int Priority { get; set; } = 15;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoThaliaksFavor.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoThaliaksFavor : BaseActionCast
{
public int ThaliaksFavorStacks = 3;
public int ThaliaksFavorRecover = 150;
public bool UseWhenCordialCD;
public AutoThaliaksFavor(bool isSpearfishing = false) : base(UIStrings.Thaliaks_Favor, IDs.Actions.ThaliaksFavor, ActionType.Action)
{
HelpText = UIStrings.TabAutoCasts_DrawThaliaksFavor_HelpText;
IsSpearFishing = isSpearfishing;
}
public override string GetName()
=> Name = UIStrings.Thaliaks_Favor;
public override bool CastCondition()
{
bool allowedToUseThaliaks = true;
bool hasStacks = PlayerRes.HasAnglersArtStacks(ThaliaksFavorStacks);
bool notOvercaped = (PlayerRes.GetCurrentGp() + ThaliaksFavorRecover) < PlayerRes.GetMaxGp();
if (UseWhenCordialCD)
{
var cordialConfig = AutoHook.Plugin.HookManager.GetAutoCastCfg().CastCordial;
bool hasCordial = false;
foreach (var cordial in cordialConfig._cordialList)
{
hasCordial |= PlayerRes.HaveCordialInInventory(cordial.Item1);
}
bool cordialAvailable = cordialConfig.Enabled && PlayerRes.IsPotOffCooldown() && hasCordial;
allowedToUseThaliaks = !cordialAvailable;
}
return hasStacks && notOvercaped && allowedToUseThaliaks; // dont use if its going to overcap gp
}
protected override DrawOptionsDelegate DrawOptions => () =>
{
var stack = ThaliaksFavorStacks;
if (DrawUtil.EditNumberField(UIStrings.TabAutoCasts_DrawExtraOptionsThaliaksFavor_, ref stack))
{
// value has to be between 3 and 10
ThaliaksFavorStacks = Math.Max(3, Math.Min(stack, 10));
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.ThaliaksCordialOffCd, ref UseWhenCordialCD, UIStrings.Use_Cordials_First_Help))
Service.Save();
};
public override int Priority { get; set; } = 16;
public override bool IsExcludedPriority { get; set; } = false;
}
================================================
FILE: AutoHook/Classes/AutoCasts/AutoTripleHook.cs
================================================
using FFXIVClientStructs.FFXIV.Client.Game;
namespace AutoHook.Classes.AutoCasts;
public class AutoTripleHook : BaseActionCast
{
public override int Priority { get; set; } = 17;
public override bool IsExcludedPriority { get; set; } = false;
public AutoTripleHook() : base(UIStrings.Triple_Hook, Data.IDs.Actions.TripleHook, ActionType.Action)
{
}
public override string GetName()
=> Name = UIStrings.Triple_Hook;
public override bool CastCondition()
{
return true;
}
/*protected override DrawOptionsDelegate DrawOptions => () =>
{
};*/
}
================================================
FILE: AutoHook/Classes/BaitFishClass.cs
================================================
using ECommons.MathHelpers;
using System.Text.Json.Serialization;
using FishRow = Lumina.Excel.Sheets.FishParameter;
using ItemRow = Lumina.Excel.Sheets.Item;
namespace AutoHook.Classes;
public class BaitFishClass : IComparable<BaitFishClass>
{
[JsonIgnore]
public string Name => Id switch
{
GameRes.AllMoochesId => UIStrings.All_Mooches,
GameRes.AllBaitsId => UIStrings.All_Baits,
_ => MultiString.GetItemName((uint)Id)
};
public int Id;
[JsonIgnore] public string LureMessage = "";
// check the bait type
[JsonIgnore]
public BaitType BaitType
{
get
{
return GameRes.Baits.Any(b => b.Id == Id) ? BaitType.Bait :
GameRes.Fishes.Any(f => f.Id == Id) ? BaitType.Mooch : BaitType.Unknown;
}
}
public BaitFishClass(ItemRow data)
{
Id = (int)data.RowId;
}
public BaitFishClass(FishRow fishRow)
{
var itemData = fishRow.Item.GetValueOrDefault<ItemRow>() ?? new ItemRow();
LureMessage = fishRow.Unknown_70_1.ToString();
Id = (int)itemData.RowId;
}
public BaitFishClass(string name, int id)
{
Id = id;
}
public BaitFishClass()
{
Id = -1;
}
public BaitFishClass(Number id)
{
Id = id;
}
public int CompareTo(BaitFishClass? other)
=> Id.CompareTo(other?.Id ?? 0);
}
================================================
FILE: AutoHook/Classes/BaseActionCast.cs
================================================
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility;
using FFXIVClientStructs.FFXIV.Client.Game;
using Dalamud.Bindings.ImGui;
using System.ComponentModel;
using System.Numerics;
using Dalamud.Interface.Utility.Raii;
using ECommons.Throttlers;
namespace AutoHook.Classes;
public abstract class BaseActionCast
{
protected BaseActionCast(string name, uint id, ActionType actionType = ActionType.Action)
{
Name = name;
Id = id;
Enabled = false;
ActionType = actionType;
if (actionType == ActionType.Action && id != IDs.Actions.ThaliaksFavor)
GpThreshold = (int)PlayerRes.CastActionCost(Id, ActionType);
}
[NonSerialized] public string Name;
[NonSerialized] public string HelpText = @"";
[DefaultValue(false)] public bool Enabled;
public uint Id;
public int GpThreshold;
[NonSerialized] public bool IsSpearFishing;
[DefaultValue(true)] public bool GpThresholdAbove { get; set; } = true;
public virtual bool DoesCancelMooch() => false;
[DefaultValue(true)] public bool DontCancelMooch = true;
public virtual bool RequiresAutoCastAvailabl() => false;
public virtual bool RequiresTimeWindow() => false;
public virtual int Priority { get; set; }
[NonSerialized] public ActionType ActionType;
public virtual void SetThreshold(int newCost)
{
var actionCost = Id == IDs.Actions.ThaliaksFavor ? 0 : (int)PlayerRes.CastActionCost(Id, ActionType);
GpThreshold = (newCost < 0) ? 0 : Math.Max(newCost, actionCost);
Service.Save();
}
public bool IsAvailableToCast(bool ignoreCurrentMooch = false)
{
if (!Enabled)
return false;
if (DoesCancelMooch() && PlayerRes.IsMoochAvailable() && DontCancelMooch && !ignoreCurrentMooch)
{
return false;
}
var condition = CastCondition();
var currentGp = PlayerRes.GetCurrentGp();
bool hasGp;
if (GpThresholdAbove)
hasGp = currentGp >= GpThreshold;
else
hasGp = currentGp <= GpThreshold;
var actionAvailable = PlayerRes.ActionTypeAvailable(Id, ActionType);
if (EzThrottler.Throttle("LogActions", 1000))
Service.PrintVerbose(
@$"[BaseAction] {Name} - GpCheck:{hasGp}, ActionAvailable: {actionAvailable}, OtherConditions: {condition}");
return hasGp && actionAvailable && condition;
}
public abstract bool CastCondition();
public virtual string GetName() => "";
public virtual int GetPriority() => Priority;
protected delegate void DrawOptionsDelegate();
protected virtual DrawOptionsDelegate? DrawOptions => null;
public abstract bool IsExcludedPriority { get; set; }
public virtual void DrawConfig(List<BaseActionCast>? availableActs = null)
{
ImGui.PushID(@$"{GetName()}_cfg");
if (DrawOptions != null)
{
if (DrawUtil.Checkbox(@$"###{GetName()}", ref Enabled, HelpText, true))
{
Service.PrintDebug(@$"[BaseAction] {Name} - {(Enabled ? @"Enabled" : @"Disabled")}");
Service.Save();
}
ImGui.SameLine(0, 3);
var x = ImGui.GetCursorPosX();
if (ImGui.TreeNodeEx(@$"{GetName()}", ImGuiTreeNodeFlags.FramePadding))
{
ImGui.SameLine(200 * ImGui.GetIO().FontGlobalScale * (ImGui.GetFontSize() / 12f));
DrawGpThreshold();
DrawUpDownArrows(availableActs);
ImGui.SetCursorPosX(x);
ImGui.BeginGroup();
DrawOptions?.Invoke();
ImGui.Separator();
ImGui.EndGroup();
ImGui.TreePop();
}
else
{
ImGui.SameLine(200 * ImGui.GetIO().FontGlobalScale * (ImGui.GetFontSize() / 12f));
DrawGpThreshold();
DrawUpDownArrows(availableActs);
}
}
else
{
if (DrawUtil.Checkbox(@$"###{GetName()}", ref Enabled, HelpText, true))
{
Service.PrintDebug(@$"[BaseAction] {Name} - {(Enabled ? @"Enabled" : @"Disabled")}");
Service.Save();
}
ImGui.SameLine(0, 28);
ImGui.Text(@$"{GetName()}");
ImGui.SameLine(200 * ImGui.GetIO().FontGlobalScale * (ImGui.GetFontSize() / 12f));
DrawGpThreshold();
DrawUpDownArrows(availableActs);
}
ImGui.PopID();
}
public virtual void DrawConfigOptions()
{
DrawOptions?.Invoke();
}
private void DrawUpDownArrows(List<BaseActionCast>? availableActs)
{
if (availableActs is null || IsExcludedPriority) return;
if (GetPriority() == 0) //failsafe I guess
{
Priority = availableActs.MaxBy(x => x.Priority)!.Priority + 1;
}
ImGui.NextColumn();
ImGui.SameLine();
if (!availableActs.Any(x => x.Priority < Priority && !x.IsExcludedPriority))
ImGui.BeginDisabled();
if (ImGui.ArrowButton(@"###UpArrow", ImGuiDir.Up))
{
if (availableActs.Any(x => x.Priority < Priority && !x.IsExcludedPriority))
{
var nextAct = availableActs.Where(x => x.Priority < Priority && !x.IsExcludedPriority)
.OrderByDescending(x => x.Priority).First();
nextAct.Priority = Priority;
Priority--;
}
}
if (!availableActs.Any(x => x.Priority < Priority && !x.IsExcludedPriority))
ImGui.EndDisabled();
ImGui.SameLine();
if (!availableActs.Any(x => x.Priority > Priority && !x.IsExcludedPriority))
ImGui.BeginDisabled();
if (ImGui.ArrowButton(@"###DownArrow", ImGuiDir.Down))
{
if (availableActs.Any(x => x.Priority > Priority && !x.IsExcludedPriority))
{
var lastAct = availableActs.Where(x => x.Priority > Priority && !x.IsExcludedPriority)
.OrderBy(x => x.Priority).First();
lastAct.Priority = Priority;
Priority++;
}
}
if (!availableActs.Any(x => x.Priority > Priority && !x.IsExcludedPriority))
ImGui.EndDisabled();
}
public virtual void DrawGpThreshold()
{
ImGui.PushID(@$"{GetName()}_gp");
if (ImGui.Button(UIStrings.GPlabel))
{
ImGui.OpenPopup(strId: @"gp_cfg");
}
if (ImGui.BeginPopup(@"gp_cfg"))
{
using (var item = ImRaii.Child("###gp_cfg2", new Vector2(175, 125), true))
{
if (ImGui.Button(@" X "))
ImGui.CloseCurrentPopup();
ImGui.SameLine();
ImGui.TextColored(ImGuiColors.DalamudYellow, @$"GP - {GetName()}");
if (ImGui.IsItemHovered())
ImGui.SetTooltip(
@$"{GetName()} {UIStrings.WillBeUsedWhenYourGPIsEqualOr} {(GpThresholdAbove ? UIStrings.Above : UIStrings.Below)} {GpThreshold}");
ImGui.Separator();
if (ImGui.RadioButton(UIStrings.Above, GpThresholdAbove))
{
GpThresholdAbove = true;
Service.Save();
}
//ImGui.SameLine();
if (ImGui.RadioButton(UIStrings.Below, !GpThresholdAbove))
{
GpThresholdAbove = false;
Service.Save();
}
//ImGui.SameLine();
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputInt(UIStrings.GP, ref GpThreshold, 1, 1))
{
GpThreshold = Math.Max(GpThreshold, 0);
SetThreshold(GpThreshold);
Service.Save();
}
}
ImGui.EndPopup();
}
ImGui.PopID();
}
}
================================================
FILE: AutoHook/Classes/BaseBiteConfig.cs
================================================
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using System.ComponentModel;
namespace AutoHook.Classes;
public class BaseBiteConfig(HookType type)
{
[DefaultValue(true)]
public bool HooksetEnabled = true;
public bool EnableHooksetSwap;
public bool HookTimerEnabled;
public double MinHookTimer;
public double MaxHookTimer;
public bool ChumTimerEnabled;
public double ChumMinHookTimer;
public double ChumMaxHookTimer;
public bool OnlyWhenActiveSlap;
public bool OnlyWhenNotActiveSlap;
public bool OnlyWhenActiveIdentical;
public bool OnlyWhenNotActiveIdentical;
public bool PrizeCatchReq;
public bool PrizeCatchNotReq;
public bool OnlyWhenActiveMultihook;
public bool OnlyWhenNotActiveMultihook;
public HookType HooksetType = type;
public bool UseMultipleHookTypesByTimer;
public bool UseNormalHookTypeByTimer;
public double NormalHookTypeMin;
public double NormalHookTypeMax;
public bool UsePrecisionHookTypeByTimer;
public double PrecisionHookTypeMin;
public double PrecisionHookTypeMax;
public bool UsePowerfulHookTypeByTimer;
public double PowerfulHookTypeMin;
public double PowerfulHookTypeMax;
public bool UseStellarHookTypeByTimer;
public double StellarHookTypeMin;
public double StellarHookTypeMax;
public void DrawOptions(string biteName, bool enableSwap = false)
{
EnableHooksetSwap = enableSwap;
using var id = ImRaii.PushId(@$"{biteName}");
DrawUtil.DrawCheckboxTree(biteName, ref HooksetEnabled,
() =>
{
DrawUtil.DrawTreeNodeEx(UIStrings.Conditions, () =>
{
using var indent = ImRaii.PushIndent();
DrawUtil.DrawTreeNodeEx(UIStrings.Surface_Slap_Options, DrawSurfaceSwap);
DrawUtil.DrawTreeNodeEx(UIStrings.Identical_Cast_Options, DrawIdenticalCast);
DrawUtil.DrawTreeNodeEx(UIStrings.Prize_Catch_Options, DrawPrizeCatch);
DrawUtil.DrawTreeNodeEx(UIStrings.Multihook_Options, DrawMultihook);
}, UIStrings.Conditions_HelpText);
if (EnableHooksetSwap)
DrawUtil.DrawTreeNodeEx(UIStrings.HookType, DrawBite, UIStrings.HookWillBeUsedIfPatienceIsNotUp);
DrawUtil.DrawTreeNodeEx(UIStrings.HookingTimer, DrawTimers, UIStrings.HookingTimerHelpText);
});
}
private void DrawBite()
{
using var indent = ImRaii.PushIndent();
DrawUtil.Checkbox(UIStrings.UseMutlipleHooksByTimer, ref UseMultipleHookTypesByTimer);
if (!UseMultipleHookTypesByTimer)
{
if (ImGui.RadioButton(UIStrings.Normal_Hook, HooksetType == HookType.Normal))
{
HooksetType = HookType.Normal;
Service.Save();
}
if (ImGui.RadioButton(UIStrings.PrecisionHookset, HooksetType == HookType.Precision))
{
HooksetType = HookType.Precision;
Service.Save();
}
if (ImGui.RadioButton(UIStrings.PowerfulHookset, HooksetType == HookType.Powerful))
{
HooksetType = HookType.Powerful;
Service.Save();
}
if (ImGui.RadioButton(UIStrings.StellarHookset, HooksetType == HookType.Stellar))
{
HooksetType = HookType.Stellar;
Service.Save();
}
}
else
{
DrawTimedHookTypeOption(UIStrings.Normal_Hook, HookType.Normal,
ref UseNormalHookTypeByTimer, ref NormalHookTypeMin, ref NormalHookTypeMax);
DrawTimedHookTypeOption(UIStrings.PrecisionHookset, HookType.Precision,
ref UsePrecisionHookTypeByTimer, ref PrecisionHookTypeMin, ref PrecisionHookTypeMax);
DrawTimedHookTypeOption(UIStrings.PowerfulHookset, HookType.Powerful,
ref UsePowerfulHookTypeByTimer, ref PowerfulHookTypeMin, ref PowerfulHookTypeMax);
DrawTimedHookTypeOption(UIStrings.StellarHookset, HookType.Stellar,
ref UseStellarHookTypeByTimer, ref StellarHookTypeMin, ref StellarHookTypeMax);
}
}
private void DrawTimedHookTypeOption(string label, HookType hookType, ref bool enabled, ref double minTime, ref double maxTime)
{
using var id = ImRaii.PushId(label);
using var indent = ImRaii.PushIndent();
if (DrawUtil.Checkbox(label, ref enabled))
{
if (enabled && HooksetType == HookType.None)
HooksetType = hookType;
}
if (enabled)
{
using var innerIndent = ImRaii.PushIndent();
ImGui.TextColored(ImGuiColors.DalamudYellow, UIStrings.SetZeroToIgnore);
SetupTimer(ref minTime, ref maxTime);
}
}
private void DrawSurfaceSwap()
{
using var indent = ImRaii.PushIndent();
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenActiveSurfaceSlap, ref OnlyWhenActiveSlap))
{
OnlyWhenNotActiveSlap = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenNOTActiveSurfaceSlap, ref OnlyWhenNotActiveSlap))
{
OnlyWhenActiveSlap = false;
Service.Save();
}
}
private void DrawIdenticalCast()
{
using var indent = ImRaii.PushIndent();
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenActiveIdentical, ref OnlyWhenActiveIdentical))
{
OnlyWhenNotActiveIdentical = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenNOTActiveIdentical, ref OnlyWhenNotActiveIdentical))
{
OnlyWhenActiveIdentical = false;
Service.Save();
}
}
private void DrawPrizeCatch()
{
using var indent = ImRaii.PushIndent();
if (DrawUtil.Checkbox(UIStrings.Prize_Catch_Required, ref PrizeCatchReq))
{
PrizeCatchNotReq = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.PrizeCatchNotActive, ref PrizeCatchNotReq))
{
PrizeCatchReq = false;
Service.Save();
}
}
private void DrawMultihook()
{
using var indent = ImRaii.PushIndent();
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenActiveMultihook, ref OnlyWhenActiveMultihook))
{
OnlyWhenNotActiveMultihook = false;
Service.Save();
}
if (DrawUtil.Checkbox(UIStrings.OnlyHookWhenNOTActiveMultihook, ref OnlyWhenNotActiveMultihook))
{
OnlyWhenActiveMultihook = false;
Service.Save();
}
}
private void DrawTimers()
{
using var indent = ImRaii.PushIndent();
using (var _ = ImRaii.PushId(@"HookingTimer"))
{
ImGui.TextColored(ImGuiColors.DalamudYellow, UIStrings.SetZeroToIgnore);
DrawUtil.Checkbox(UIStrings.EnableHookingTimer, ref HookTimerEnabled);
SetupTimer(ref MinHookTimer, ref MaxHookTimer);
}
DrawUtil.SpacingSeparator();
//ImGui.TextWrapped(UIStrings.ChumTimer);
ImGui.PushID(@"MoochTimer");
using var id = ImRaii.PushId(@"MoochTimer");
DrawUtil.Checkbox(UIStrings.EnableChumTimer, ref ChumTimerEnabled);
SetupTimer(ref ChumMinHookTimer, ref ChumMaxHookTimer);
}
private void SetupTimer(ref double minTimeDelay, ref double maxTimeDelay)
{
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputDouble(UIStrings.MinWait, ref minTimeDelay, .1, 1, @"%.1f%"))
{
switch (minTimeDelay)
{
case <= 0:
minTimeDelay = 0;
break;
case > 99:
minTimeDelay = 99;
break;
}
Service.Save();
}
ImGui.SameLine();
ImGuiComponents.HelpMarker($"{UIStrings.HelpMarkerMinWaitTimer}\n\n{UIStrings.DoesntHaveAffectUnderChum}");
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputDouble(UIStrings.MaxWait, ref maxTimeDelay, .1, 1, @"%.1f%"))
{
switch (maxTimeDelay)
{
case 0.1:
maxTimeDelay = 2;
break;
case <= 0:
case <= 1.9: //This makes the option turn off if delay = 2 seconds when clicking the minus.
maxTimeDelay = 0;
break;
case > 99:
maxTimeDelay = 99;
break;
}
Service.Save();
}
ImGuiComponents.HelpMarker(UIStrings.HelpMarkerMaxWaitTimer);
}
}
================================================
FILE: AutoHook/Classes/BaseGig.cs
================================================
using System.ComponentModel;
using AutoHook.Spearfishing.Enums;
namespace AutoHook.Classes;
public class BaseGig(int itemId) : BaseOption
{
[DefaultValue(true)]
public bool Enabled = true;
private int _itemId = itemId;
public ImportedFish? Fish
{
get
{
if (_fish == null && _itemId != 0)
{
Service.PrintDebug($"[AutoGig] BaseGig.Fish - Lazy initializing for itemId: {_itemId}, ImportedFishes count: {GameRes.ImportedFishes.Count}");
_fish = GameRes.ImportedFishes.FirstOrDefault(f => f.ItemId == _itemId);
Service.PrintDebug($"[AutoGig] BaseGig.Fish - Found: {(_fish != null ? _fish.Name : "null")}");
}
return _fish;
}
set
{
Service.PrintDebug($"[AutoGig] BaseGig.Fish - Setting to: {(value != null ? value.Name : "null")}");
_fish = value;
}
}
private ImportedFish? _fish = GameRes.ImportedFishes.FirstOrDefault(f => f.ItemId == itemId);
public bool UseNaturesBounty;
public float LeftOffset;
public float RightOffset;
public SpearfishSpeed Speed => Fish?.Speed ?? SpearfishSpeed.Unknown;
public SpearfishSize Size => Fish?.Size ?? SpearfishSize.Unknown;
public override void DrawOptions()
{
DrawUtil.DrawComboSelector(
[.. GameRes.ImportedFishes.Where(f => f.IsSpearFish)],
(ImportedFish item) => item.Name,
Fish?.Name ?? UIStrings.None,
(ImportedFish item) => Fish = item);
DrawUtil.Checkbox(UIStrings.UseNaturesBounty, ref UseNaturesBounty);
DrawUtil.DrawTreeNodeEx(UIStrings.Fish_Hitbox_Offset, () =>
{
if (DrawUtil.EditFloatField(UIStrings.OffsetLR, ref LeftOffset,
UIStrings.OffsetLRHelpText, true))
{
LeftOffset = Math.Max(-10, Math.Min(LeftOffset, 10));
Service.Save();
}
if (DrawUtil.EditFloatField(UIStrings.OffsetRL, ref RightOffset,
UIStrings.OffsetRLHelpText, true))
{
RightOffset = Math.Max(-10, Math.Min(RightOffset, 10));
Service.Save();
}
}, UIStrings.FishHitboxHelpText);
}
public override bool Equals(object? obj)
{
return obj is BaseGig settings &&
Fish?.ItemId == settings.Fish?.ItemId;
}
public override int GetHashCode()
{
return HashCode.Combine(UniqueId);
}
}
================================================
FILE: AutoHook/Classes/BaseHookset.cs
================================================
using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Utility;
using Dalamud.Bindings.ImGui;
// ReSharper disable FieldCanBeMadeReadOnly.Global
// ReSharper disable MemberCanBePrivate.Global
namespace AutoHook.Classes;
public class BaseHookset(uint requiredStatus)
{
// for future use, maybe we need a hooking condition under a different status?
public uint RequiredStatus = requiredStatus;
private Guid _uniqueId;
// Patience > Normal, Precision and Powerful
public BaseBiteConfig PatienceWeak = new(HookType.Precision);
public BaseBiteConfig PatienceStrong = new(HookType.Powerful);
public BaseBiteConfig PatienceLegendary = new(HookType.Powerful);
// Double Hook
public bool UseDoubleHook;
public bool LetFishEscapeDoubleHook;
public BaseBiteConfig DoubleWeak = new(HookType.Double);
public BaseBiteConfig DoubleStrong = new(HookType.Double);
public BaseBiteConfig DoubleLegendary = new(HookType.Double);
// Triple Hook
public bool UseTripleHook;
public bool LetFishEscapeTripleHook;
public BaseBiteConfig TripleWeak = new(HookType.Triple);
public BaseBiteConfig TripleStrong = new(HookType.Triple);
public BaseBiteConfig TripleLegendary = new(HookType.Triple);
// Timeout
//public double TimeoutMin = 0;
public double TimeoutMax = 0;
public double ChumTimeoutMax = 0;
// Stop condition
public bool StopAfterCaught;
public bool StopAfterResetCount;
public int StopAfterCaughtLimit = 1;
public FishingSteps StopFishingStep = FishingSteps.None;
public bool UseCustomStatusHook;
public AutoLures CastLures = new();
public Guid GetUniqueId()
{
if (_uniqueId == Guid.Empty)
_uniqueId = Guid.NewGuid();
return _uniqueId;
}
public void DrawOptions()
{
ImGui.PushID(@"BaseHookset");
if (RequiredStatus != 0)
{
ImGui.Spacing();
var statusName = MultiString.GetStatusName(RequiredStatus);
DrawUtil.Checkbox(string.Format(UIStrings.UseConfigRequiredStatus, statusName), ref UseCustomStatusHook,
UIStrings.RequiredStatusSettingHelpText);
}
DrawPatience();
ImGui.Spacing();
DrawDoubleHook();
ImGui.Spacing();
DrawTripleHook();
ImGui.Spacing();
DrawTimeout();
ImGui.Spacing();
DrawLures();
ImGui.Spacing();
DrawStopCondition();
ImGui.PopID();
}
private void DrawPatience()
{
if (ImGui.TreeNodeEx(UIStrings.NormalPatienceHookset,
ImGuiTreeNodeFlags.FramePadding | ImGuiTreeNodeFlags.AllowItemOverlap))
{
PatienceWeak.DrawOptions(UIStrings.HookWeakExclamation, true);
PatienceStrong.DrawOptions(UIStrings.HookStrongExclamation, true);
PatienceLegendary.DrawOptions(UIStrings.HookLegendaryExclamation, true);
ImGui.TreePop();
}
}
private void DrawDoubleHook()
{
if (ImGui.TreeNodeEx(UIStrings.Double_Hook,
ImGuiTreeNodeFlags.FramePadding | ImGuiTreeNodeFlags.AllowItemOverlap))
{
DrawUtil.Checkbox(UIStrings.UseDoubleHook, ref UseDoubleHook);
DrawUtil.Checkbox(UIStrings.LetTheFishEscape, ref LetFishEscapeDoubleHook, UIStrings.LetFishEscapeHelpText);
ImGui.Separator();
DoubleWeak.DrawOptions(UIStrings.HookWeakExclamation);
DoubleStrong.DrawOptions(UIStrings.HookStrongExclamation);
DoubleLegendary.DrawOptions(UIStrings.HookLegendaryExclamation);
ImGui.TreePop();
}
}
private void DrawTripleHook()
{
if (ImGui.TreeNodeEx(UIStrings.Triple_Hook,
ImGuiTreeNodeFlags.FramePadding | ImGuiTreeNodeFlags.AllowItemOverlap))
{
DrawUtil.Checkbox(UIStrings.UseTripleHook, ref UseTripleHook);
DrawUtil.Checkbox(UIStrings.LetTheFishEscape, ref LetFishEscapeTripleHook, UIStrings.LetFishEscapeHelpText);
ImGui.Separator();
TripleWeak.DrawOptions(UIStrings.HookWeakExclamation);
TripleStrong.DrawOptions(UIStrings.HookStrongExclamation);
TripleLegendary.DrawOptions(UIStrings.HookLegendaryExclamation);
ImGui.TreePop();
}
}
private void DrawTimeout()
{
if (ImGui.TreeNodeEx(UIStrings.Timeout,
ImGuiTreeNodeFlags.FramePadding | ImGuiTreeNodeFlags.AllowItemOverlap))
{
ImGui.TextColored(ImGuiColors.DalamudYellow, UIStrings.TimeoutOption);
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputDouble(UIStrings.TimeLimit, ref TimeoutMax, .1, 1, @"%.1f%"))
{
switch (TimeoutMax)
{
case 0.1:
TimeoutMax = 2;
break;
case <= 0:
case <= 1.9: //This makes the option turn off if delay = 2 seconds when clicking the minus.
TimeoutMax = 0;
break;
case > 99:
TimeoutMax = 99;
break;
}
Service.Save();
}
ImGui.SameLine();
ImGuiComponents.HelpMarker($"{UIStrings.TimeoutHelpText}\n\n{UIStrings.DoesntHaveAffectUnderChum}");
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputDouble(UIStrings.ChumTimeLimit, ref ChumTimeoutMax, .1, 1, @"%.1f%"))
{
switch (ChumTimeoutMax)
{
case 0.1:
ChumTimeoutMax = 2;
break;
case <= 0:
case <= 1.9: //This makes the option turn off if delay = 2 seconds when clicking the minus.
ChumTimeoutMax = 0;
break;
case > 99:
ChumTimeoutMax = 99;
break;
}
Service.Save();
}
ImGui.SameLine();
ImGuiComponents.HelpMarker(UIStrings.TimeoutHelpText);
ImGui.TreePop();
}
}
private void DrawLures()
{
ImGui.PushID($"Lures");
CastLures.DrawConfig();
ImGui.PopID();
}
private void DrawStopCondition()
{
DrawUtil.DrawCheckboxTree(UIStrings.StopAfterHooking, ref StopAfterCaught,
() =>
{
ImGui.SetNextItemWidth(100 * ImGuiHelpers.GlobalScale);
if (ImGui.InputInt(UIStrings.TimeS, ref StopAfterCaughtLimit))
{
if (StopAfterCaughtLimit < 1)
StopAfterCaughtLimit = 1;
Service.Save();
}
ImGui.Spacing();
if (ImGui.RadioButton(UIStrings.Stop_Casting, StopFishingStep == FishingSteps.None))
{
StopFishingStep = FishingSteps.None;
Service.Save();
}
ImGui.SameLine();
ImGuiComponents.HelpMarker(UIStrings.Auto_Cast_Stopped);
if (ImGui.RadioButton(UIStrings.Quit_Fishing, StopFishingStep == FishingSteps.Quitting))
{
StopFishingStep = FishingSteps.Quitting;
Service.Save();
}
DrawUtil.Checkbox(UIStrings.Reset_the_counter, ref StopAfterResetCount);
});
}
}
================================================
FILE: AutoHook/Classes/BaseOption.cs
================================================
namespace AutoHook.Classes;
public abstract class BaseOption
{
public Guid UniqueId { get; private set; } = Guid.NewGuid();
public abstract void DrawOptions();
}
================================================
FILE: AutoHook/Classes/BasePreset.cs
================================================
using Newtonsoft.Json;
namespace AutoHook.Classes;
public abstract class BasePreset
{
public string SelectedGuid { get; set; } = "";
[JsonIgnore]
public virtual BasePresetConfig? SelectedPreset
{
get
{
return PresetList.FirstOrDefault(p => p.UniqueId.ToString() == SelectedGuid);
}
set
{
Service.Status = string.Empty;
if (value != null)
{
OnSelectedPreset(value, SelectedPreset);
SelectedGuid = value.UniqueId.ToString();
}
else
SelectedGuid = "";
}
}
public Guid UniqueId { get; protected set; } = Guid.NewGuid();
public abstract void AddNewPreset(string presetName);
public abstract void AddNewPreset(BasePresetConfig preset);
public abstract void RemovePreset(Guid value);
public virtual void RenamePreset(Guid value, string newName)
{
var preset = PresetList.Find(p => p.UniqueId == value);
if (preset == null)
return;
preset.PresetName = newName;
Service.Save();
}
public virtual void OnSelectedPreset(BasePresetConfig newPreset, BasePresetConfig? oldPreset)
{
Service.Save();
}
public abstract void SwapIndex(int itemIndex, int targetIndex);
public virtual BasePresetConfig? GetPreset(Guid value)
{
return PresetList.Find(p => p.UniqueId == value);
}
[JsonIgnore] public abstract List<BasePresetConfig> PresetList { get; }
}
================================================
FILE: AutoHook/Classes/BasePresetConfig.cs
================================================
using Newtonsoft.Json;
namespace AutoHook.Classes;
public abstract class BasePresetConfig()
{
public string PresetName { get; set; } = "";
[JsonIgnore] public string GroupName { get; set; } = "";
public Guid UniqueId { get; set; } = Guid.NewGuid();
public abstract void DrawOptions();
public virtual void RenamePreset(string newName)
{
PresetName = newName;
Service.Save();
}
public abstract void AddItem(BaseOption item);
public abstract void RemoveItem(Guid value);
}
================================================
FILE: AutoHook/Classes/BiteTimers.cs
================================================
namespace AutoHook.Classes;
public class BiteTimers
{
public int itemId { get; set; }
public double min { get; set; }
public double median { get; set; }
public double mean { get; set; }
public double max { get; set; }
public double whiskerMin { get; set; }
public double whiskerMax { get; set; }
public double q1 { get; set; }
public double q3 { get; set; }
}
================================================
FILE: AutoHook/Classes/ImportedFish.cs
================================================
using AutoHook.Spearfishing.Enums;
namespace AutoHook.Classes;
public class ImportedFish
{
public int ItemId { get; set; }
public HookType HookType { get; set; }
public BiteType BiteType { get; set; }
public int InitialBait { get; set; }
public List<int> Mooches { get; set; } = [];
public List<FishPredator> Predators { get; set; } = [];
public List<int> Nodes { get; set; } = [];
public bool IsSpearFish { get; set; } = new();
public SpearfishSize Size { get; set; } = new();
public SpearfishSpeed Speed { get; set; } = new();
public int SurfaceSlap { get; set; } = new();
public bool OceanFish { get; set; } = new();
public FishInterval Interval { get; set; } = new();
public string Name => MultiString.GetItemName(ItemId);
public bool IsLureFish => GameRes.LureFishes.Any(f => f.Id == ItemId);
public class FishPredator
{
public int itemId { get; set; }
public int qtd { get; set; }
}
public class FishInterval
{
public int OnTime { get; set; }
public int OffTime { get; set; }
public int ShiftTime { get; set; }
}
}
================================================
FILE: AutoHook/Classes/PresetFolder.cs
================================================
namespace AutoHook.Classes;
public class PresetFolder(string folderName)
{
public Guid UniqueId { get; set; } = Guid.NewGuid();
public string FolderName { get; set; } = folderName;
public bool IsExpanded { get; set; } = true;
public List<Guid> PresetIds { get; set; } = [];
public void AddPreset(Guid presetId)
{
if (!PresetIds.Contains(presetId))
PresetIds.Add(presetId);
}
public void RemovePreset(Guid presetId)
{
if (PresetIds.Contains(presetId))
PresetIds = [.. PresetIds.Where(p => p != presetId)];
}
public bool ContainsPreset(Guid presetId)
{
return PresetIds.Contains(presetId);
}
}
================================================
FILE: AutoHook/Configurations/AutoCastsConfig.cs
================================================
using FFXIVClientStructs.FFXIV.Client.System.Framework;
using System.ComponentModel;
namespace AutoHook.Configurations;
public class AutoCastsConfig
{
public bool EnableAll = false;
[DefaultValue(true)] public bool DontCancelMooch = true;
public TimeOnly StartTime = new(0);
public TimeOnly EndTime = new(0);
public bool OnlyCastDuringSpecificTime = false;
public bool RecastAnimationCancel;
public bool TurnCollectOff;
public bool ChumAnimationCancel;
public bool TurnCollectOffWithoutAnimCancel;
public AutoCastLine CastLine = new();
public AutoMooch CastMooch = new();
public AutoChum CastChum = new();
public AutoCollect CastCollect = new();
public AutoCordial CastCordial = new();
public AutoFishEyes CastFishEyes = new();
public AutoMakeShiftBait CastMakeShiftBait = new();
public AutoPatience CastPatience = new();
public AutoPrizeCatch CastPrizeCatch = new();
public AutoThaliaksFavor CastThaliaksFavor = new();
public AutoBigGameFishing CastBigGame = new();
public AutoMultiHook CastMultihook = new();
//public AutoLures CastLures = new();
private List<BaseActionCast> GetAutoCastOrder()
{
var output = new List<BaseActionCast>
{
CastThaliaksFavor,
CastCordial,
CastPatience,
CastMakeShiftBait,
CastChum,
CastFishEyes,
CastPrizeCatch,
//CastCollect,
CastBigGame,
CastMultihook,
}.OrderBy(x => x.Priority).ToList();
return output;
}
public BaseActionCast? GetNextAutoCast(bool ignoreCurrentMooch)
{
if (!EnableAll)
return null;
BaseActionCast? cast = null;
var order = GetAutoCastOrder();
foreach (var action in order.Where(action => action.IsAvailableToCast(ignoreCurrentMooch)))
{
if (OnlyCastDuringSpecificTime && action.RequiresTimeWindow() && !InsideCastWindow())
continue;
Service.PrintDebug($"[AutoCast] Returning {action.Name}");
return action;
}
return cast;
}
private unsafe bool InsideCastWindow()
{
var clientTime = Framework.Instance()->ClientTime.EorzeaTime;
var eorzeaTime = TimeOnly.FromDateTime(DateTimeOffset.FromUnixTimeSeconds(clientTime).DateTime);
return eorzeaTime.IsBetween(StartTime, EndTime);
}
public bool TryCastAction(BaseActionCast? action, bool noDelay = false, bool ignoreCurrentMooch = false)
{
if (action == null || !EnableAll)
return false;
if (OnlyCastDuringSpecificTime && action.RequiresTimeWindow() && !InsideCastWindow())
return false;
if (!action.Enabled || !action.IsAvailableToCast(ignoreCurrentMooch))
return false;
if (action.Id == IDs.Actions.Chum && ChumAnimationCancel)
TryChumAnimationCancel();
else if (noDelay)
PlayerRes.CastActionNoDelay(action.Id, action.ActionType, action.GetName());
else
PlayerRes.CastActionDelayed(action.Id, action.ActionType, action.GetName());
return true;
}
private void TryChumAnimationCancel()
{
Service.PrintDebug("Trying to cancel chum animation");
// Make sure Salvage is disabled before chum
Service.TaskManager.EnqueueDelay(40);
Service.TaskManager.Enqueue(() => PlayerRes.CastAction(IDs.Actions.Chum));
// Recast Salvage a few ms's later, maybe 500 is enough?
Service.TaskManager.EnqueueDelay(465);
Service.TaskManager.Enqueue(() => PlayerRes.CastAction(IDs.Actions.Salvage));
}
}
================================================
FILE: AutoHook/Configurations/AutoGigConfig.cs
================================================
using Dalamud.Interface;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Bindings.ImGui;
namespace AutoHook.Configurations;
public class AutoGigConfig : BasePresetConfig
{
public string Name { get; set; } = "Old Preset";
public List<BaseGig> Gigs { get; set; } = [];
public int HitboxSize = 25;
public AutoGigConfig(string presetName)
{
PresetName = presetName;
}
public List<BaseGig> GetGigCurrentNode(int node)
{
Service.PrintDebug($"[AutoGig] GetGigCurrentNode - node: {node}, Total Gigs: {Gigs?.Count ?? 0}");
var result = Gigs.Where(f =>
{
var hasFish = f.Fish != null;
var hasNode = f.Fish?.Nodes.Contains(node) ?? false;
Service.PrintDebug($"[AutoGig] GetGigCurrentNode - Fish: {f.Fish?.Name ?? "null"}, Enabled: {f.Enabled}, HasFish: {hasFish}, HasNode: {hasNode}");
return hasFish && hasNode;
}).ToList();
Service.PrintDebug($"[AutoGig] GetGigCurrentNode - Returning {result.Count} fish(es)");
return result;
}
public override void AddItem(BaseOption item)
{
Gigs.Add((BaseGig)item);
Service.Save();
}
public override void RemoveItem(Guid value)
{
Gigs.RemoveAll(x => x.UniqueId == value);
Service.Save();
}
public override void DrawOptions()
{
if (Gigs == null || Gigs.Count == 0)
return;
foreach (var gig in Gigs)
{
ImGui.PushID(gig.UniqueId.ToString());
using (ImRaii.PushFont(UiBuilder.IconFont))
{
var icon = FontAwesomeIcon.Trash.ToIconString();
var buttonSize = ImGui.CalcTextSize(icon) + ImGui.GetStyle().FramePadding * 2;
if (ImGui.Button(@$"{icon}", buttonSize) &&
ImGui.GetIO().KeyShift)
{
RemoveItem(gig.UniqueId);
Service.Save();
return;
}
}
if (ImGui.IsItemHovered())
ImGui.SetTooltip(UIStrings.HoldShiftToDelete);
ImGui.SameLine(0, 3);
DrawUtil.Checkbox(@$"", ref gig.Enabled);
ImGui.SameLine(0, 3);
var x = ImGui.GetCursorPosX();
if (ImGui.TreeNodeEx($"{gig.Fish?.Name ?? UIStrings.None}", ImGuiTreeNodeFlags.FramePadding))
{
ImGui.SetCursorPosX(x);
ImGui.BeginGroup();
gig.DrawOptions();
ImGui.EndGroup();
ImGui.TreePop();
}
ImGui.PopID();
}
}
}
================================================
FILE: AutoHook/Configurations/Configuration.cs
================================================
using Dalamud.Configuration;
using Newtonsoft.Json;
using System.ComponentModel;
using System.IO.Compression;
using System.IO;
using AutoHook.Configurations.old_config;
using AutoHook.Spearfishing;
namespace AutoHook.Configurations;
[Serializable]
public class Configuration : IPluginConfiguration
{
public int Version { get; set; } = 5;
public string CurrentLanguage { get; set; } = @"en";
public bool HideLocButtonn = true;
[DefaultValue(true)] public bool PluginEnabled = true;
public FishingPresets HookPresets = new();
public SpearFishingPresets AutoGigConfig = new();
public bool ShowDebugConsole = false;
[DefaultValue(true)] public bool ShowChatLogs = true;
public int DelayBetweenCastsMin = 600;
public int DelayBetweenCastsMax = 1000;
public int DelayBetweenHookMin = 100;
public int DelayBetweenHookMax = 200;
public int DelayBeforeCancelMin = 1500;
public int DelayBeforeCancelMax = 2000;
[DefaultValue(true)] public bool ShowStatus = true;
public bool ShowPresetsAsSidebar = false;
public bool HideTabDescription = false;
public bool SwapToButtons = false;
public int SwapType;
[DefaultValue(true)] public bool DontHideOptionsDisabled = true;
[DefaultValue(true)] public bool ResetAfkTimer = true;
[DefaultValue(false)] public bool AutoStartFishing = false;
[DefaultValue(false)] public bool DtrBarEnabled = false;
[DefaultValue(false)] public bool DtrPresetBarEnabled = false;
// old config
public List<BaitPresetConfig> BaitPresetList = [];
public void Save()
{
Svc.PluginInterface!.SavePluginConfig(this);
}
public void UpdateVersion()
{
if (Version == 1)
{
Version = 2;
}
if (Version == 2)
{
try
{
foreach (var preset in BaitPresetList)
{
var newPreset = ConvertOldPreset(preset);
if (newPreset != null)
HookPresets.CustomPresets.Add(newPreset);
}
Version = 3;
}
catch (Exception e)
{
Service.PrintDebug(@$"[Configuration] {e.Message}");
}
}
if (Version == 3)
{
Service.PrintDebug(@$"[Configuration] Updating to v4");
Save();
Version = 4;
}
if (Version == 4)
{
Service.PrintDebug(@$"[Configuration] Updating to v5");
foreach (var gig in AutoGigConfig.Presets)
{
Service.PrintDebug($"Renaming {gig.PresetName} to {gig.Name}");
gig.PresetName = gig.Name;
}
HookPresets.DefaultPreset.PresetName = Service.GlobalPresetName;
Save();
Version = 5;
}
}
private static void SetFieldNewClass(HookConfig newOne, BaitConfig old)
{
var oldType = old.GetType();
var newType = newOne.GetType();
var oldFields = oldType.GetFields();
var newFields = newType.GetFields();
foreach (var sourceField in oldFields)
{
var targetField =
newFields.FirstOrDefault(f => f.Name == sourceField.Name && f.FieldType == sourceField.FieldType);
if (targetField != null)
{
var value = sourceField.GetValue(old);
targetField.SetValue(newOne, value);
}
}
}
public void Initiate()
{
if (HookPresets.DefaultPreset.ListOfBaits.Count != 0)
return;
var bait = new BaitFishClass(UIStrings.All_Baits, 0);
var mooch = new BaitFishClass(UIStrings.All_Mooches, 0);
HookPresets.DefaultPreset.ListOfBaits.Add(new HookConfig(bait));
HookPresets.DefaultPreset.ListOfMooch.Add(new HookConfig(mooch));
}
public static Configuration Load()
{
try
{
if (Svc.PluginInterface.GetPluginConfig() is Configuration config)
{
config.Initiate();
config.UpdateVersion();
config.Save();
return config;
}
config = new Configuration();
config.Initiate();
config.Save();
return config;
}
catch (Exception e)
{
Svc.Log.Error(@$"[Configuration] {e.Message}");
throw;
}
}
public static void ResetConfig()
{
}
// Got the export/import function from the UnknownX7's ReAction repo
/*public static string ExportPreset(CustomPresetConfig preset)
{
return CompressString(JsonConvert.SerializeObject(preset,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }));
}*/
public static string ExportPreset(BasePresetConfig preset)
{
var exported = CompressString(JsonConvert.SerializeObject(preset,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }));
// check if preset is type of AutoGigConfig or CustomPresetConfig
if (preset is AutoGigConfig)
return ExportPrefixSf + exported;
else if (preset is CustomPresetConfig)
return ExportPrefixV4 + exported;
return "Something went wrong while exporting the preset";
}
public class FolderExport(string name)
{
public string FolderName { get; set; } = name;
public List<CustomPresetConfig> Presets { get; set; } = [];
}
public static string ExportFolder(PresetFolder folder, List<CustomPresetConfig> presets)
{
var folderExport = new FolderExport(folder.FolderName);
foreach (var presetId in folder.PresetIds)
{
var preset = presets.FirstOrDefault(p => p.UniqueId == presetId);
if (preset != null)
{
folderExport.Presets.Add(preset);
}
}
var exported = CompressString(JsonConvert.SerializeObject(folderExport,
new JsonSerializerSettings { DefaultValueHandling = DefaultValueHandling.Ignore }));
return ExportPrefixFolder + exported;
}
public static (PresetFolder Folder, List<CustomPresetConfig> Presets)? ImportFolder(string import)
{
if (!import.StartsWith(ExportPrefixFolder))
return null;
try
{
var folderData = JsonConvert.DeserializeObject<FolderExport>(DecompressString(import),
new JsonSerializerSettings { ObjectCreationHandling = ObjectCreationHandling.Replace });
if (folderData == null)
return null;
var folder = new PresetFolder(folderData.FolderName);
// Generate new GUIDs for all presets to avoid conflicts
foreach (var preset in folderData.Presets)
{
preset.UniqueId = Guid.NewGuid();
folder.AddPreset(preset.UniqueId);
}
return (folder, folderData.Presets);
}
catch (Exception e)
{
Svc.Log.Error($"Failed to import folder: {e.Message}");
return null;
}
}
public static BasePresetConfig? ImportPreset(string import)
{
if (import.StartsWith(ExportPrefixV2))
{
var old = JsonConvert.DeserializeObject<BaitPresetConfig>(DecompressString(import),
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace });
return ConvertOldPreset(old);
}
if (import.StartsWith(ExportPrefixV3))
{
var old = JsonConvert.DeserializeObject<OldPresetConfig>(DecompressString(import),
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace });
return ConvertOldPresetV3(old);
}
if (import.StartsWith(ExportPrefixSf))
{
var autogig = JsonConvert.DeserializeObject<AutoGigConfig>(DecompressString(import),
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace });
return autogig;
}
var importActionStack = JsonConvert.DeserializeObject<CustomPresetConfig>(DecompressString(import),
new JsonSerializerSettings() { ObjectCreationHandling = ObjectCreationHandling.Replace });
return importActionStack;
}
[NonSerialized] public static string ExportPrefixV2 = "AH_";
[NonSerialized] public static string ExportPrefixV3 = "AH3_";
[NonSerialized] public static string ExportPrefixV4 = "AH4_";
[NonSerialized] public static string ExportPrefixSf = "AHSF1_";
[NonSerialized] public static string ExportPrefixFolder = "AHFOLDER_";
[NonSerialized]
private static readonly List<string> ExportPrefixes =
[
ExportPrefixV2, ExportPrefixV3, ExportPrefixV4, ExportPrefixSf, ExportPrefixFolder
];
public static string CompressString(string s)
{
var bytes = Encoding.UTF8.GetBytes(s);
using var ms = new MemoryStream();
using (var gs = new GZipStream(ms, CompressionMode.Compress))
gs.Write(bytes, 0, bytes.Length);
return Convert.ToBase64String(ms.ToArray());
}
public static string DecompressString(string s)
{
if (!ExportPrefixes.Any(s.StartsWith))
throw new ApplicationException(UIStrings.DecompressString_Invalid_Import);
var prefix = ExportPrefixes.First(s.StartsWith);
var data = Convert.FromBase64String(s[prefix.Length..]);
var lengthBuffer = new byte[4];
Array.Copy(data, data.Length - 4, lengthBuffer, 0, 4);
var uncompressedSize = BitConverter.ToInt32(lengthBuffer, 0);
var buffer = new byte[uncompressedSize];
using (var ms = new MemoryStream(data))
{
using var gzip = new GZipStream(ms, CompressionMode.Decompress);
gzip.ReadExactly(buffer, 0, uncompressedSize);
}
return Encoding.UTF8.GetString(buffer);
}
public static string DecompressBase64(string base64)
{
try
{
var bytes = Convert.FromBase64String(base64);
using var compressedStream = new MemoryStream(bytes);
using var zipStream = new GZipStream(compressedStream, CompressionMode.Decompress);
using var resultStream = new MemoryStream();
zipStream.CopyTo(resultStream);
bytes = resultStream.ToArray();
return Encoding.UTF8.GetString(bytes, 1, bytes.Length - 1);
}
catch (Exception e)
{
Svc.Log.Error(@$"Failed to DecompressBase64: {e.Message}");
return "";
}
}
private static CustomPresetConfig? ConvertOldPreset(BaitPresetConfig? preset)
{
if (preset == null)
return null;
var filteredBaits = new List<HookConfig>();
var filteredMooch = new List<HookConfig>();
foreach (var old in preset.ListOfBaits)
{
var matchingBait = GameRes.Baits.FirstOrDefault(b => b.Name == old.BaitName);
var matchingFish = GameRes.Fishes.FirstOrDefault(f => f.Name == old.BaitName);
if (matchingBait != null)
{
var newOne = new HookConfig(matchingBait);
SetFieldNewClass(newOne, old);
filteredBaits.Add(newOne);
}
else if (matchingFish != null)
{
var newOne = new HookConfig(matchingFish);
SetFieldNewClass(newOne, old);
filteredMooch.Add(newOne);
}
}
CustomPresetConfig newPreset = new(@$"[Old Version] {preset.PresetName}")
{
ListOfBaits = filteredBaits,
ListOfMooch = filteredMooch
};
return newPreset;
}
private static CustomPresetConfig? ConvertOldPresetV3(OldPresetConfig? old)
{
if (old == null)
return null;
var newPreset = new CustomPresetConfig(old.PresetName);
Service.PrintDebug($"Converting v3 to v4: {old.PresetName}");
foreach (var bait in old.ListOfBaits)
{
bait.ConvertV3ToV4();
var newBait = new HookConfig(bait.BaitFish)
{
Enabled = bait.Enabled,
NormalHook = bait.NormalHook,
IntuitionHook = bait.IntuitionHook
};
newBait.IntuitionHook.UseCustomStatusHook = bait.UseCustomIntuitionHook;
newPreset.AddItem(newBait);
}
foreach (var mooch in old.ListOfMooch)
{
mooch.ConvertV3ToV4();
var newMooch = new HookConfig(mooch.BaitFish)
{
Enabled = mooch.Enabled,
NormalHook = mooch.NormalHook,
IntuitionHook = mooch.IntuitionHook
};
newMooch.IntuitionHook.UseCustomStatusHook = mooch.UseCustomIntuitionHook;
newPreset.AddItem(newMooch);
}
newPreset.ListOfFish = old.ListOfFish;
newPreset.ExtraCfg = old.ExtraCfg;
newPreset.AutoCastsCfg = old.AutoCastsCfg;
return newPreset;
}
}
================================================
FILE: AutoHook/Configurations/CustomPresetConfig.cs
================================================
using System.Text.Json.Serialization;
using AutoHook.Ui;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Bindings.ImGui;
namespace AutoHook.Configurations;
public class CustomPresetConfig : BasePresetConfig
{
public List<HookConfig> ListOfBaits { get; set; } = [];
public List<HookConfig> ListOfMooch { get; set; } = [];
public List<FishConfig> ListOfFish { get; set; } = [];
public AutoCastsConfig AutoCastsCfg = new();
public ExtraConfig ExtraCfg = new();
public CustomPresetConfig(string name)
{
PresetName = name;
}
public override void AddItem(BaseOption item)
{
//check if the item is HookConfig (then check BaitFishClass BaitType), or FishConfig
if (item is HookConfig hookConfig)
{
if (hookConfig.BaitFish.BaitType == BaitType.Bait)
ListOfBaits.Add(hookConfig);
else if (hookConfig.BaitFish.BaitType == BaitType.Mooch)
ListOfMooch.Add(hookConfig);
}
else if (item is FishConfig fishConfig)
ListOfFish.Add(fishConfig);
Service.Save();
}
public void ReplaceBaitConfig(HookConfig hookConfig)
{
var existing = ListOfBaits.FirstOrDefault(hook => hook.BaitFish.Id == hookConfig.BaitFish.Id);
if (existing != null)
{
ListOfBaits.Remove(existing);
}
ListOfBaits.Add(hookConfig);
Service.Save();
}
public void ReplaceMoochConfig(HookConfig moochConfig)
{
var existing = ListOfMooch.FirstOrDefault(hook => hook.BaitFish.Id == moochConfig.BaitFish.Id);
if (existing != null)
{
ListOfMooch.Remove(existing);
}
ListOfMooch.Add(moochConfig);
Service.Save();
}
public HookConfig? GetCfgById(int id, bool isMooching)
{
if (isMooching)
{
var mooch = ListOfMooch.FirstOrDefault(hook => hook.BaitFish.Id == id);
return mooch ?? ListOfMooch.FirstOrDefault(hook => hook.BaitFish.Id == GameRes.AllMoochesId);
}
var bait = ListOfBaits.FirstOrDefault(hook => hook.BaitFish.Id == id);
return bait ?? ListOfBaits.FirstOrDefault(hook => hook.BaitFish.Id == GameRes.AllBaitsId);
}
public FishConfig? GetFishById(int id)
{
return ListOfFish.FirstOrDefault(fish => fish.Fish.Id == id);
}
public override void RemoveItem(Guid value)
{
ListOfBaits.RemoveAll(x => x.UniqueId == value);
ListOfMooch.RemoveAll(x => x.UniqueId == value);
ListOfFish.RemoveAll(x => x.UniqueId == value);
Service.Save();
}
public bool HasBaitOrMooch(uint id)
{
return ListOfBaits.Any(hook => hook.BaitFish.Id == id || hook.BaitFish.Id == GameRes.AllBaitsId) ||
ListOfMooch.Any(hook => hook.BaitFish.Id == id || hook.BaitFish.Id == GameRes.AllMoochesId);
}
public void ResetCounter()
{
foreach (var item in ListOfBaits)
{
FishingManager.FishingHelper.RemoveId(item.UniqueId);
}
foreach (var item in ListOfMooch)
{
FishingManager.FishingHelper.RemoveId(item.UniqueId);
}
foreach (var item in ListOfFish)
{
FishingManager.FishingHelper.RemoveId(item.UniqueId);
}
}
public override bool Equals(object? obj)
{
return obj is CustomPresetConfig settings &&
UniqueId == settings.UniqueId;
}
public override int GetHashCode()
{
return HashCode.Combine(UniqueId);
}
[JsonIgnore] public bool IsGlobal => PresetName == Service.GlobalPresetName;
public override void DrawOptions()
{
ImGui.SetCursorPosX(ImGui.GetCursorPosX() + ImGui.GetContentRegionAvail().X / 2 -
ImGui.CalcTextSize(PresetName).X / 2);
ImGui.TextColored(ImGuiColors.DalamudOrange, $" {PresetName}");
using var mainTab = ImRaii.TabBar(@"TabBarsPreset", ImGuiTabBarFlags.NoTooltip);
if (!mainTab)
return;
using (var tabHook = ImRaii.TabItem(UIStrings.Hooking))
{
DrawUtil.HoveredTooltip(UIStrings.BaitTabHelpText);
if (tabHook)
SubTabBaitMooch.DrawHookTab(this);
}
using (var tabFish = ImRaii.TabItem(UIStrings.FishCaught))
{
DrawUtil.HoveredTooltip(UIStrings.FishCaughtHelp);
if (tabFish)
SubTabFish.DrawFishTab(this);
}
using (var tabExtra = ImRaii.TabItem(UIStrings.ExtraOptions))
{
DrawUtil.HoveredTooltip(UIStrings.ExtraOptionsHelp);
if (tabExtra)
SubTabExtra.DrawExtraTab(this);
}
using (var tabAutoCast = ImRaii.TabItem(UIStrings.Auto_Casts))
{
DrawUtil.HoveredTooltip(UIStrings.AutoCastsHelp);
if (tabAutoCast)
SubTabAutoCast.DrawAutoCastTab(this);
}
}
}
================================================
FILE: AutoHook/Configurations/ExtraConfig.cs
================================================
namespace AutoHook.Configurations;
public class ExtraConfig : BaseOption
{
public bool Enabled = false;
public bool SwapBaitIntuitionGain = false;
public BaitFishClass BaitToSwapIntuitionGain = new();
public bool SwapBaitIntuitionLost = false;
public BaitFishClass BaitToSwapIntuitionLost = new();
public bool SwapPresetIntuitionGain = false;
public string PresetToSwapIntuitionGain = @"-";
public bool SwapPresetIntuitionLost = false;
public string PresetToSwapIntuitionLost = @"-";
public bool SwapBaitSpectralCurrentGain = false;
public BaitFishClass BaitToSwapSpectralCurrentGain = new();
public bool SwapBaitSpectralCurrentLost = false;
public BaitFishClass BaitToSwapSpectralCurrentLost = new();
public bool SwapPresetSpectralCurrentGain = false;
public string PresetToSwapSpectralCurrentGain = @"-";
public bool SwapPresetSpectralCurrentLost = false;
public string PresetToSwapSpectralCurrentLost = @"-";
public bool ResetCounterPresetSwap = false;
public bool QuitOnIntuitionLost = false;
public bool StopOnIntuitionLost = false;
public bool ForceBaitSwap;
public int ForcedBaitId;
// Angler's Art
public bool StopAfterAnglersArt = false;
public int AnglerStackQtd = 0;
public FishingSteps AnglerStopFishingStep = FishingSteps.None;
public bool SwapBaitAnglersArt = false;
public BaitFishClass BaitToSwapAnglersArt = new();
public bool SwapPresetAnglersArt = false;
public string PresetToSwapAnglersArt = @"-";
// Swimbait
public SwimbaitAction SwimbaitFillsAction = SwimbaitAction.None;
public string PresetToSwapSwimbaitFills = @"-";
public SwimbaitAction SwimbaitRunsOutAction = SwimbaitAction.None;
public string PresetToSwapSwimbaitRunsOut = @"-";
public override void DrawOptions()
{
}
}
================================================
FILE: AutoHook/Configurations/FishConfig.cs
================================================
using System.ComponentModel;
namespace AutoHook.Configurations;
public class FishConfig : BaseOption
{
[DefaultValue(true)]
public bool Enabled = true;
public bool IgnoreOnIntuition = false;
public BaitFishClass Fish = new();
public bool StopAfterCaught = false;
public int StopAfterCaughtLimit = 1;
public bool StopAfterResetCount = false;
public AutoIdenticalCast IdenticalCast = new();
public AutoSurfaceSlap SurfaceSlap = new();
public AutoMooch Mooch = new();
public AutoSparefulHand SparefulHand = new();
public AutoMultiHook Multihook = new();
public bool SwapBait = false;
public BaitFishClass BaitToSwap = new();
public int SwapBaitCount = 1;
public bool SwapBaitResetCount = false;
public bool SwapPresets = false;
public string PresetToSwap = "-";
public int SwapPresetCount = 1;
public bool NeverMooch = false;
public FishingSteps StopFishingStep = FishingSteps.None;
public FishConfig() { }
public FishConfig(BaitFishClass fish)
{
Fish = fish;
// ok this is not the best way, but im tired, and it works for now so be nice to me
Mooch.Name = UIStrings.Always_Mooch;
}
public FishConfig(int fishId)
{
Fish = new BaitFishClass(fishId);
}
public override void DrawOptions()
{
}
}
================================================
FILE: AutoHook/Configurations/HookConfig.cs
================================================
using System.ComponentModel;
namespace AutoHook.Configurations;
public class HookConfig : BaseOption
{
[DefaultValue(true)] public bool Enabled = true;
public BaitFishClass BaitFish = new();
public BaseHookset NormalHook = new(IDs.Status.None);
public BaseHookset IntuitionHook = new(IDs.Status.FishersIntuition);
public bool UseSwimbait = false;
public int SwimbaitCountThreshold = 1;
public bool OnlyUseWhenNoMoochAvailable = true;
//todo enable more hook settings based on the current status
//List<BaseHookset> CustomHooksets = new();
public HookConfig() { }
public HookConfig(BaitFishClass baitFish)
{
BaitFish = baitFish;
}
public HookConfig(int baitFishId)
{
BaitFish = new BaitFishClass(baitFishId);
}
public void SetBiteAndHookType(BiteType bite, HookType hookType, bool isIntuition = false)
{
BaseHookset hookset = isIntuition ? IntuitionHook : NormalHook;
var hookDictionary = new Dictionary<BiteType, (BaseBiteConfig th, BaseBiteConfig dh, BaseBiteConfig ph)>
{
{ BiteType.Weak, (hookset.TripleWeak, hookset.DoubleWeak, hookset.PatienceWeak) },
{ BiteType.Strong, (hookset.TripleStrong, hookset.DoubleStrong, hookset.PatienceStrong) },
{ BiteType.Legendary, (hookset.TripleLegendary, hookset.DoubleLegendary, hookset.PatienceLegendary) }
};
if (hookDictionary.TryGetValue(bite, out var hook))
{
hook.ph.HooksetEnabled = true;
hook.ph.HooksetType = hookType;
hook.dh.HooksetEnabled = true;
hook.th.HooksetEnabled = true;
}
}
public void SetHooksetTimer(BiteType bite, double min, double max, bool isIntuition = false)
{
BaseHookset hookset = isIntuition ? IntuitionHook : NormalHook;
var hookDictionary = new Dictionary<BiteType, (BaseBiteConfig th, BaseBiteConfig dh, BaseBiteConfig ph)>
{
{ BiteType.Weak, (hookset.TripleWeak, hookset.DoubleWeak, hookset.PatienceWeak) },
{ BiteType.Strong, (hookset.TripleStrong, hookset.DoubleStrong, hookset.PatienceStrong) },
{ BiteType.Legendary, (hookset.TripleLegendary, hookset.DoubleLegendary, hookset.PatienceLegendary) }
};
if (hookDictionary.TryGetValue(bite, out var hook))
{
hook.ph.MinHookTimer = min;
hook.ph.MaxHookTimer = max + 1;
hook.ph.HookTimerEnabled = true;
hook.dh.MinHookTimer = min;
hook.dh.MaxHookTimer = max + 1;
hook.dh.HookTimerEnabled = true;
hook.th.MinHookTimer = min;
hook.th.MaxHookTimer = max + 1;
hook.th.HookTimerEnabled = true;
}
}
public void ResetAllHooksets()
{
ResetHooksets(NormalHook);
ResetHooksets(IntuitionHook);
}
private void ResetHooksets(BaseHookset hookset)
{
var hookDictionary = new Dictionary<BiteType, (BaseBiteConfig th, BaseBiteConfig dh, BaseBiteConfig ph)>
{
{ BiteType.Weak, (hookset.TripleWeak, hookset.DoubleWeak, hookset.PatienceWeak) },
{ BiteType.Strong, (hookset.TripleStrong, hookset.DoubleStrong, hookset.PatienceStrong) },
{ BiteType.Legendary, (hookset.TripleLegendary, hookset.DoubleLegendary, hookset.PatienceLegendary) }
};
foreach (var hookDisable in hookDictionary)
{
hookDisable.Value.ph.HooksetEnabled = false;
hookDisable.Value.dh.HooksetEnabled = false;
hookDisable.Value.th.HooksetEnabled = false;
}
}
public BaseHookset GetHookset()
{
/*
var requiredStatusPreset = new List<BaseHookset> { IntuitionHook };
foreach (var preset in requiredStatusPreset)
{
if (PlayerRes.HasStatus(preset.RequiredStatus) && preset.UseCustomStatusHook)
{
return preset;
}
}*/
return FishingManager.IntuitionStatus == IntuitionStatus.Active && IntuitionHook.UseCustomStatusHook ? IntuitionHook : NormalHook;
}
public HookType? GetHook(BiteType bite, double timePassed)
{
var hookset = GetHookset();
var hookDictionary = new Dictionary<BiteType, (BaseBiteConfig th, BaseBiteConfig dh, BaseBiteConfig ph)>
{
{ BiteType.Weak, (hookset.TripleWeak, hookset.DoubleWeak, hookset.PatienceWeak) },
{ BiteType.Strong, (hookset.TripleStrong, hookset.DoubleStrong, hookset.PatienceStrong) },
{ BiteType.Legendary, (hookset.TripleLegendary, hookset.DoubleLegendary, hookset.PatienceLegendary) }
};
Service.Status = "";
if (hookDictionary.TryGetValue(bite, out var hook))
{
// Triple Hook
if (hookset.UseTripleHook && hook.th.HooksetEnabled)
{
if (CheckHookCondition(hook.th, timePassed))
if (GetHookTypeForTime(hook.th, timePassed) is { } ht && IsHookAvailable(hook.th, timePassed))
return ht;
if (hookset.LetFishEscapeTripleHook && PlayerRes.GetCurrentGp() < 700)
{
Service.Status = "Not enough GP to use Triple Hook, Letting fish escape is enabled";
return HookType.None;
}
Service.Status = $"(Triple Hook) {Service.Status}";
}
// Double Hook
if (hookset.UseDoubleHook && hook.dh.HooksetEnabled)
{
if (CheckHookCondition(hook.dh, timePassed))
if (GetHookTypeForTime(hook.dh, timePassed) is { } ht && IsHookAvailable(hook.dh, timePassed))
return ht;
if (hookset.LetFishEscapeDoubleHook && PlayerRes.GetCurrentGp() < 400)
{
Service.Status = "Not enough GP to use Double Hook, Letting fish escape is enabled";
return HookType.None;
}
Service.Status = $"(Triple Hook) {Service.Status}";
}
// Normal - Patience
if (hook.ph.HooksetEnabled)
{
if (CheckHookCondition(hook.ph, timePassed))
{
if (GetHookTypeForTime(hook.ph, timePassed) is { } ht)
return IsHookAvailable(hook.ph, timePassed) ? ht : HookType.Normal;
Service.Status = "(Normal/Patience Hook) No hook type for current bite timer.";
}
else
Service.Status = $"(Normal/Patience Hook) {Service.Status}";
}
else if (Service.Status == "")
Service.Status = UIStrings.Status_NoHookEnabled;
}
//Service.Status = "Skipping bite - No hook for this bite is enabled";
return HookType.None;
}
private bool CheckHookCondition(BaseBiteConfig hookType, double timePassed)
{
if (!CheckIdenticalCast(hookType))
return false;
if (!CheckSurfaceSlap(hookType))
return false;
if (!CheckPrizeCatch(hookType))
return false;
if (!CheckMultihook(hookType))
return false;
if (!CheckTimer(hookType, timePassed))
return false;
return true;
}
private HookType? GetHookTypeForTime(BaseBiteConfig hookType, double timePassed)
{
if (hookType.UseMultipleHookTypesByTimer)
return GetTimedHookType(hookType, timePassed) is { } timedHook ? timedHook : null;
return hookType.HooksetType;
}
private HookType? GetTimedHookType(BaseBiteConfig hookType, double timePassed)
{
bool InRange(bool enabled, double min, double max)
{
if (!enabled)
return false;
if (min > 0 && timePassed < min)
return false;
return max <= 0 || timePassed <= max;
}
// Highest value hook types first if multiple windows overlap
if (InRange(hookType.UseStellarHookTypeByTimer, hookType.StellarHookTypeMin, hookType.StellarHookTypeMax))
return HookType.Stellar;
if (InRange(hookType.UsePowerfulHookTypeByTimer, hookType.PowerfulHookTypeMin, hookType.PowerfulHookTypeMax))
return HookType.Powerful;
if (InRange(hookType.UsePrecisionHookTypeByTimer, hookType.PrecisionHookTypeMin, hookType.PrecisionHookTypeMax))
return HookType.Precision;
if (InRange(hookType.UseNormalHookTypeByTimer, hookType.NormalHookTypeMin, hookType.NormalHookTypeMax))
return HookType.Normal;
return null;
}
private bool IsHookAvailable(BaseBiteConfig hookType, double timePassed)
{
if (GetHookTypeForTime(hookType, timePassed) is not { } timedHook)
return false;
if (!PlayerRes.ActionTypeAvailable((uint)timedHook))
{
Service.Status = UIStrings.Status_HookNotAvailableNormalWillBeUsed;
return false;
}
return true;
}
private bool CheckIdenticalCast(BaseBiteConfig hookType)
{
if (hookType.OnlyWhenActiveIdentical && !PlayerRes.HasStatus(IDs.Status.IdenticalCast))
{
Service.Status = UIStrings.Status_IdenticalCastRequired;
return false;
}
if (hookType.OnlyWhenNotActiveIdentical && PlayerRes.HasStatus(IDs.Status.IdenticalCast))
{
Service.Status = UIStrings.Status_IdenticalCastNotRequired;
return false;
}
return true;
}
private bool CheckPrizeCatch(BaseBiteConfig hookType)
{
if (hookType.PrizeCatchReq && !PlayerRes.HasStatus(IDs.Status.PrizeCatch))
{
Service.Status = UIStrings.Status_PrizeCatchRequired;
return false;
}
if (hookType.PrizeCatchNotReq && PlayerRes.HasStatus(IDs.Status.PrizeCatch))
{
Service.Status = UIStrings.Status_PrizeCatchNotRequired;
return false;
}
return true;
}
private bool CheckSurfaceSlap(BaseBiteConfig hookType)
{
if (hookType.OnlyWhenActiveSlap && !PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
{
Service.Status = UIStrings.Status_SurfaceSlapRequired;
return false;
}
if (hookType.OnlyWhenNotActiveSlap && PlayerRes.HasStatus(IDs.Status.SurfaceSlap))
{
Service.Status = UIStrings.Status_SurfaceSlapNotRequired;
return false;
}
return true;
}
private bool CheckMultihook(BaseBiteConfig hookType)
{
if (hookType.OnlyWhenActiveMultihook && !PlayerRes.HasMultihookAvailable())
{
Service.Status = UIStrings.Status_MultihookRequired;
return false;
}
if (hookType.OnlyWhenNotActiveMultihook && PlayerRes.HasMultihookAvailable())
{
Service.Status = UIStrings.Status_MultihookNotRequired;
return false;
}
return true;
}
private bool CheckTimer(BaseBiteConfig hookType, double timePassed)
{
double minimumTime = 0;
double maximumTime = 0;
if (PlayerRes.HasStatus(IDs.Status.Chum))
{
if (hookType.ChumTimerEnabled)
{
minimumTime = hookType.ChumMinHookTimer;
maximumTime = hookType.ChumMaxHookTimer;
}
}
else if (hookType.HookTimerEnabled)
{
minimumTime = hookType.MinHookTimer;
maximumTime = hookType.MaxHookTimer;
}
if (minimumTime > 0 && timePassed < minimumTime)
{
Service.Status =
$"Skipping bite - Minimum time has not been met - Current: {timePassed} < Min: {minimumTime}";
return false;
}
if (maximumTime > 0 && timePassed > maximumTime)
{
Service.Status =
$"Skipping bite - Maximum time has been exceeded - Current: {timePassed} > Max: {maximumTime}";
return false;
}
return true;
}
public override void DrawOptions()
{
}
public override bool Equals(object? obj)
{
return obj is HookConfig settings &&
BaitFish == settings.BaitFish;
}
public override int GetHashCode()
{
return HashCode.Combine(UniqueId);
}
}
================================================
FILE: AutoHook/Configurations/old_config/BaitConfig.cs
================================================
namespace AutoHook.Configurations.old_config;
public class BaitConfig(string bait)
{
/* old config, dont use*/
public bool Enabled = true;
public string BaitName = bait;
public bool HookWeakEnabled = true;
public bool HookWeakIntuitionEnabled = true;
public bool HookWeakDHTHEnabled = true;
public HookType HookTypeWeak = HookType.Precision;
public HookType HookTypeWeakIntuition = HookType.Precision;
public bool HookStrongEnabled = true;
public bool HookStrongIntuitionEnabled = true;
public bool HookStrongDHTHEnabled = true;
public HookType HookTypeStrong = HookType.Powerful;
public HookType HookTypeStrongIntuition = HookType.Powerful;
public bool HookLegendaryEnabled = true;
public bool HookLegendaryIntuitionEnabled = true;
public bool HookLegendaryDHTHEnabled = true;
public HookType HookTypeLegendary = HookType.Powerful;
public HookType HookTypeLegendaryIntuition = HookType.Powerful;
public bool UseCustomIntuitionHook = false;
public bool UseAutoMooch = true;
public bool UseAutoMooch2 = false;
public bool OnlyMoochIntuition = false;
public bool UseSurfaceSlap = false;
public bool UseIdenticalCast = false;
public bool UseDoubleHook = false;
public bool UseTripleHook = false;
public bool UseDHTHPatience = false;
public bool UseDHTHOnlySurfaceSlap = false;
public bool LetFishEscape = false;
public double MaxTimeDelay = 0;
public double MinTimeDelay = 0;
public bool UseChumTimer = false;
public double MaxChumTimeDelay = 0;
public double MinChumTimeDelay = 0;
public bool StopAfterCaught = false;
public int StopAfterCaughtLimit = 1;
public HookType? GetHook(BiteType bite)
{
bool hasIntuition = PlayerRes.HasStatus(IDs.Status.FishersIntuition);
if (hasIntuition && UseCustomIntuitionHook)
{
if (!CheckHookIntuitionEnabled(bite))
return HookType.None;
}
else if (!CheckHookEnabled(bite))
return HookType.None;
var hook = GetDoubleTripleHook(bite);
if (hook != HookType.None)
return hook;
if (hasIntuition)
return GetIntuitionHook(bite);
else
return GetPatienceHook(bite);
}
public HookType? GetHookIgnoreEnable(BiteType bite)
{
bool hasIntuition = PlayerRes.HasStatus(IDs.Status.FishersIntuition);
var hook = GetDoubleTripleHook(bite);
if (hook is null or not HookType.None)
return hook;
if (hasIntuition)
return GetIntuitionHook(bite);
else
return GetPatienceHook(bite);
}
public bool CheckHookEnabled(BiteType bite) =>
bite == BiteType.Weak ? HookWeakEnabled :
bite == BiteType.Strong ? HookStrongEnabled :
bite == BiteType.Legendary ? HookLegendaryEnabled :
false;
public bool CheckHookIntuitionEnabled(BiteType bite) =>
bite == BiteType.Weak ? HookWeakIntuitionEnabled :
bite == BiteType.Strong ? HookStrongIntuitionEnabled :
bite == BiteType.Legendary ? HookLegendaryIntuitionEnabled :
false;
public bool CheckHookDHTHEnabled(BiteType bite) =>
bite == BiteType.Weak ? HookWeakDHTHEnabled :
bite == BiteType.Strong ? HookStrongDHTHEnabled :
bite == BiteType.Legendary ? HookLegendaryDHTHEnabled :
false;
private HookType GetPatienceHook(BiteType bite) => bite switch
{
BiteType.Weak => HookTypeWeak,
BiteType.Strong => HookTypeStrong,
BiteType.Legendary => HookTypeLegendary,
_ => HookType.None,
};
private HookType GetIntuitionHook(BiteType bite) => bite switch
{
BiteType.Weak => HookTypeWeakIntuition,
BiteType.Strong => HookTypeStrongIntuition,
BiteType.Legendary => HookTypeLegendaryIntuition,
_ => HookType.None,
};
private HookType? GetDoubleTripleHook(BiteType bite)
{
if (UseTripleHook || UseDoubleHook)
{
if (UseDHTHOnlySurfaceSlap && !PlayerRes.HasStatus(IDs.Status.IdenticalCast))
return HookType.None;
if (PlayerRes.HasStatus(IDs.Status.AnglersFortune) && !UseDHTHPatience)
return HookType.None;
if (UseTripleHook && PlayerRes.GetCurrentGp() >= 700 && CheckHookDHTHEnabled(bite))
return HookType.Triple;
if (UseDoubleHook && PlayerRes.GetCurrentGp() >= 400 && CheckHookDHTHEnabled(bite))
return HookType.Double;
if (LetFishEscape)
return null;
}
return HookType.None;
}
public override bool Equals(object? obj)
{
return obj is BaitConfig settings &&
BaitName == settings.BaitName;
}
public override int GetHashCode()
{
return HashCode.Combine(BaitName + @"a");
}
}
================================================
FILE: AutoHook/Configurations/old_config/CustomPresetConfig.cs
================================================
namespace AutoHook.Configurations.old_config;
public class BaitPresetConfig
{
/* old config, dont use*/
private string presetName = UIStrings.New_Preset;
private List<BaitConfig> _listOfBaits = [];
public string PresetName { get => presetName; set => presetName = value; }
public List<BaitConfig> ListOfBaits { get => _listOfBaits; set => _listOfBaits = value; }
public BaitPresetConfig(string presetName)
{
if (ListOfBaits == null)
ListOfBaits = [];
PresetName = presetName;
}
public void AddBaitConfig(BaitConfig baitConfig)
{
if (ListOfBaits != null && !ListOfBaits.Contains(baitConfig))
{
ListOfBaits.Add(baitConfig);
}
}
public void RemoveBaitConfig(BaitConfig baitConfig)
{
if (ListOfBaits != null && ListOfBaits.Contains(baitConfig))
{
ListOfBaits.Remove(baitConfig);
}
}
// This is just for the conversion of the Config version 1 to version 2
public void AddListOfHook(List<BaitConfig> listOfBaits)
{
ListOfBaits.AddRange(listOfBaits);
}
public override bool Equals(object? obj)
{
return obj is BaitPresetConfig settings &&
presetName == settings.presetName;
}
public override int GetHashCode()
{
return HashCode.Combine(presetName + @"a");
}
public void RenamePreset(string name)
{
PresetName = name;
}
}
================================================
FILE: AutoHook/Configurations/old_config/OldHookConfig.cs
================================================
namespace AutoHook.Configurations.old_config;
public class OldHookConfig
{
public bool Enabled = true;
public BaitFishClass BaitFish = new();
public BaseHookset NormalHook = new(IDs.Status.None);
public BaseHookset IntuitionHook = new(IDs.Status.FishersIntuition);
public bool HookWeakEnabled = true;
public bool HookWeakIntuitionEnabled = true;
public bool HookWeakDHTHEnabled = true;
public bool HookWeakOnlyWhenActiveSlap = false;
public bool HookWeakOnlyWhenNOTActiveSlap = false;
public HookType HookTypeWeak = HookType.Precision;
public HookType HookTypeWeakIntuition = HookType.Precision;
public bool HookStrongEnabled = true;
public bool HookStrongIntuitionEnabled = true;
public bool HookStrongDHTHEnabled = true;
public bool HookStrongOnlyWhenActiveSlap = false;
public bool HookStrongOnlyWhenNOTActiveSlap = false;
public HookType HookTypeStrong = HookType.Powerful;
public HookType HookTypeStrongIntuition = HookType.Powerful;
public bool HookLegendaryEnabled = true;
public bool HookLegendaryIntuitionEnabled = true;
public bool HookLegendaryDHTHEnabled = true;
public bool HookLegendaryOnlyWhenActiveSlap = false;
public bool HookLegendaryOnlyWhenNOTActiveSlap = false;
public HookType HookTypeLegendary = HookType.Powerful;
public HookType HookTypeLegendaryIntuition = HookType.Powerful;
public bool UseCustomIntuitionHook = false;
/*public bool UseAutoMooch = true;
public bool UseAutoMooch2 = false;
public bool OnlyMoochIntuition = false;*/
/*public bool UseSurfaceSlap = false;
public bool UseIdenticalCast = false;*/
public bool UseDoubleHook = false;
public bool UseTripleHook = false;
public bool UseDHTHPatience = false;
public bool UseDHTHOnlyIdenticalCast = false;
public bool UseDHTHOnlySurfaceSlap = false;
public bool LetFishEscape = false;
public double MaxTimeDelay = 0;
public double MinTimeDelay = 0;
public bool UseChumTimer = false;
public double MaxChumTimeDelay = 0;
public double MinChumTimeDelay = 0;
public bool StopAfterCaught = false;
public int StopAfterCaughtLimit = 1;
public bool StopAfterResetCount = false;
public FishingSteps StopFishingStep = FishingSteps.None;
/*public HookConfig(string bait)
{
BaitName = bait;
}*/
public void ConvertV3ToV4()
{
if (NormalHook == null)
NormalHook = new(IDs.Status.None);
if (IntuitionHook == null)
IntuitionHook = new(IDs.Status.None);
Convert(NormalHook, false);
Convert(IntuitionHook, true);
IntuitionHook.UseCustomStatusHook = UseCustomIntuitionHook;
}
private void Convert(BaseHookset hookset, bool isIntuition)
{
Dictionary<BaseBiteConfig, (bool, HookType, bool, bool, bool)> normal;
if (isIntuition)
{
normal = new()
{
{
hookset.PatienceWeak,
(HookWeakIntuitionEnabled, HookTypeWeakIntuition, HookWeakOnlyWhenActiveSlap, HookWeakOnlyWhenNOTActiveSlap, false)
},
{
hookset.PatienceStrong,
(HookStrongIntuitionEnabled, HookTypeStrongIntuition, HookStrongOnlyWhenActiveSlap, HookStrongOnlyWhenNOTActiveSlap, false)
},
{
hookset.PatienceLegendary,
(HookLegendaryIntuitionEnabled, HookTypeLegendaryIntuition, HookLegendaryOnlyWhenActiveSlap, HookLegendaryOnlyWhenNOTActiveSlap, false)
},
};
}
else
{
normal = new()
{
{
hookset.PatienceWeak,
(HookWeakEnabled, HookTypeWeak, HookWeakOnlyWhenActiveSlap, HookWeakOnlyWhenNOTActiveSlap, false)
},
{
hookset.PatienceStrong,
(HookStrongEnabled, HookTypeStrong, HookStrongOnlyWhenActiveSlap, HookStrongOnlyWhenNOTActiveSlap, false)
},
{
hookset.PatienceLegendary,
(HookLegendaryEnabled, HookTypeLegendary, HookLegendaryOnlyWhenActiveSlap, HookLegendaryOnlyWhenNOTActiveSlap, false)
},
};
}
var doubleHook = new Dictionary<BaseBiteConfig, (bool, HookType, bool, bool, bool)>
{
{
hookset.DoubleWeak,
(HookWeakDHTHEnabled, HookType.Double, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
},
{
hookset.DoubleStrong,
(HookStrongDHTHEnabled, HookType.Double, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
},
{
hookset.DoubleLegendary,
(HookLegendaryDHTHEnabled, HookType.Double, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
}
};
var tripleHook = new Dictionary<BaseBiteConfig, (bool, HookType, bool, bool, bool)>
{
{
hookset.TripleWeak,
(HookWeakDHTHEnabled, HookType.Triple, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
},
{
hookset.TripleStrong,
(HookStrongDHTHEnabled, HookType.Triple, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
},
{
hookset.TripleLegendary,
(HookLegendaryDHTHEnabled, HookType.Triple, UseDHTHOnlySurfaceSlap, false, UseDHTHOnlyIdenticalCast)
}
};
var list = new List<Dictionary<BaseBiteConfig, (bool, HookType, bool, bool, bool)>>
{ normal, doubleHook, tripleHook };
foreach (var dict in list)
{
foreach (var (bite, (enabled, type, slapActive, slapNotActive, identicalActive)) in dict)
{
bite.HooksetEnabled = enabled;
bite.HooksetType = type;
bite.OnlyWhenActiveSlap = slapActive;
bite.OnlyWhenNotActiveSlap = slapNotActive;
bite.OnlyWhenActiveIdentical = identicalActive;
bite.MinHookTimer = MinTimeDelay;
bite.MaxHookTimer = MaxTimeDelay;
if (MinTimeDelay > 0 || MaxTimeDelay > 0)
{
bite.HookTimerEnabled = true;
}
bite.ChumMinHookTimer = MinChumTimeDelay;
bite.ChumMaxHookTimer = MaxChumTimeDelay;
bite.ChumTimerEnabled = UseChumTimer;
}
}
hookset.UseDoubleHook = UseDoubleHook;
hookset.LetFishEscapeDoubleHook = LetFishEscape;
hookset.UseTripleHook = UseTripleHook;
hookset.LetFishEscapeTripleHook = LetFishEscape;
hookset.StopAfterCaught = StopAfterCaught;
hookset.StopAfterCaughtLimit = StopAfterCaughtLimit;
hookset.StopAfterResetCount = StopAfterResetCount;
hookset.StopFishingStep = StopFishingStep;
}
}
================================================
FILE: AutoHook/Configurations/old_config/OldPresetConfig.cs
================================================
namespace AutoHook.Configurations.old_config;
public class OldPresetConfig(string presetName)
{
public string PresetName { get; set; } = presetName;
public List<OldHookConfig> ListOfBaits { get; set; } = [];
public List<OldHookConfig> ListOfMooch { get; set; } = [];
public List<FishConfig> ListOfFish { get; set; } = [];
public AutoCastsConfig AutoCastsCfg = new();
public ExtraConfig ExtraCfg = new();
public void ConvertV3ToV4()
{
foreach (var item in ListOfBaits)
{
item.ConvertV3ToV4();
}
foreach (var item in ListOfMooch)
{
item.ConvertV3ToV4();
}
}
}
================================================
FILE: AutoHook/Data/FishData/bitetimers.json
================================================
[
{
"itemId": 4776,
"min": 3,
"median": 19,
"mean": 18.664815471267083,
"max": 29,
"whiskerMin": 8.5,
"whiskerMax": 28.5,
"q1": 13,
"q3": 24
},
{
"itemId": 4869,
"min": 2,
"median": 14,
"mean": 13.612212392776957,
"max": 94,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 10,
"q3": 19
},
{
"itemId": 4870,
"min": 2,
"median": 12,
"mean": 12.159646095903382,
"max": 34,
"whiskerMin": 2.5,
"whiskerMax": 22.5,
"q1": 7,
"q3": 19
},
{
"itemId": 4871,
"min": 2,
"median": 14,
"mean": 14.10636023516836,
"max": 29,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4872,
"min": 2,
"median": 18,
"mean": 18.381495149098267,
"max": 35,
"whiskerMin": 8.5,
"whiskerMax": 28.5,
"q1": 13,
"q3": 25
},
{
"itemId": 4873,
"min": 7,
"median": 20,
"mean": 20.085599387207967,
"max": 29,
"whiskerMin": 12.0,
"whiskerMax": 28.0,
"q1": 14,
"q3": 27
},
{
"itemId": 4874,
"min": 2,
"median": 12,
"mean": 12.899138682885955,
"max": 44,
"whiskerMin": 2,
"whiskerMax": 25.0,
"q1": 7,
"q3": 20
},
{
"itemId": 4875,
"min": 7,
"median": 19,
"mean": 19.229821459129543,
"max": 29,
"whiskerMin": 9.5,
"whiskerMax": 29,
"q1": 13,
"q3": 27
},
{
"itemId": 4876,
"min": 3,
"median": 14,
"mean": 14.29352906475473,
"max": 36,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4877,
"min": 5,
"median": 14,
"mean": 14.527654351294956,
"max": 25,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 20
},
{
"itemId": 4878,
"min": 2,
"median": 14,
"mean": 14.52122188781193,
"max": 28,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 21
},
{
"itemId": 4879,
"min": 5,
"median": 15,
"mean": 15.367865449991054,
"max": 27,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 21
},
{
"itemId": 4880,
"min": 5,
"median": 18,
"mean": 18.39463286137636,
"max": 36,
"whiskerMin": 8.5,
"whiskerMax": 28.5,
"q1": 13,
"q3": 27
},
{
"itemId": 4881,
"min": 8,
"median": 21,
"mean": 20.605859245934138,
"max": 37,
"whiskerMin": 10.5,
"whiskerMax": 30.5,
"q1": 14,
"q3": 29
},
{
"itemId": 4882,
"min": 2,
"median": 12,
"mean": 13.043397750993199,
"max": 52,
"whiskerMin": 2,
"whiskerMax": 27.5,
"q1": 7,
"q3": 21
},
{
"itemId": 4883,
"min": 5,
"median": 17,
"mean": 16.85505174963036,
"max": 34,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 11,
"q3": 22
},
{
"itemId": 4884,
"min": 7,
"median": 20,
"mean": 19.604034240189847,
"max": 33,
"whiskerMin": 9.5,
"whiskerMax": 29.5,
"q1": 15,
"q3": 26
},
{
"itemId": 4885,
"min": 5,
"median": 18,
"mean": 17.48496308846666,
"max": 34,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 23
},
{
"itemId": 4886,
"min": 4,
"median": 15,
"mean": 15.414868575912122,
"max": 30,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 12,
"q3": 20
},
{
"itemId": 4887,
"min": 3,
"median": 16,
"mean": 16.29911783925071,
"max": 25,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4888,
"min": 5,
"median": 15,
"mean": 14.767424635212206,
"max": 21,
"whiskerMin": 7.0,
"whiskerMax": 21,
"q1": 11,
"q3": 19
},
{
"itemId": 4889,
"min": 8,
"median": 20,
"mean": 19.428877463581834,
"max": 26,
"whiskerMin": 13.5,
"whiskerMax": 25.5,
"q1": 14,
"q3": 24
},
{
"itemId": 4890,
"min": 6,
"median": 19,
"mean": 18.768591794353707,
"max": 33,
"whiskerMin": 8.5,
"whiskerMax": 28.5,
"q1": 13,
"q3": 27
},
{
"itemId": 4891,
"min": 2,
"median": 15,
"mean": 14.789441795526988,
"max": 30,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4892,
"min": 4,
"median": 15,
"mean": 15.33950953678474,
"max": 27,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 11,
"q3": 20
},
{
"itemId": 4893,
"min": 4,
"median": 18,
"mean": 17.859315431791813,
"max": 27,
"whiskerMin": 10.0,
"whiskerMax": 26.0,
"q1": 13,
"q3": 23
},
{
"itemId": 4894,
"min": 7,
"median": 20,
"mean": 19.840940034333748,
"max": 34,
"whiskerMin": 9.5,
"whiskerMax": 29.5,
"q1": 14,
"q3": 27
},
{
"itemId": 4895,
"min": 3,
"median": 13,
"mean": 13.387795146837595,
"max": 36,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 10,
"q3": 19
},
{
"itemId": 4896,
"min": 5,
"median": 18,
"mean": 18.071653282556504,
"max": 36,
"whiskerMin": 10.0,
"whiskerMax": 26.0,
"q1": 14,
"q3": 23
},
{
"itemId": 4897,
"min": 6,
"median": 19,
"mean": 19.190077289767206,
"max": 32,
"whiskerMin": 11.0,
"whiskerMax": 27.0,
"q1": 13,
"q3": 24
},
{
"itemId": 4898,
"min": 2,
"median": 10,
"mean": 11.04520047533119,
"max": 34,
"whiskerMin": 4.5,
"whiskerMax": 16.5,
"q1": 7,
"q3": 20
},
{
"itemId": 4899,
"min": 7,
"median": 15,
"mean": 15.33275713050994,
"max": 30,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 10,
"q3": 20
},
{
"itemId": 4900,
"min": 5,
"median": 19,
"mean": 19.325293624161073,
"max": 34,
"whiskerMin": 9.5,
"whiskerMax": 29.5,
"q1": 14,
"q3": 27
},
{
"itemId": 4901,
"min": 6,
"median": 17,
"mean": 17.378451911304584,
"max": 37,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 23
},
{
"itemId": 4902,
"min": 2,
"median": 14,
"mean": 14.221468287626049,
"max": 32,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4903,
"min": 3,
"median": 17,
"mean": 16.84639983842192,
"max": 46,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 21
},
{
"itemId": 4904,
"min": 2,
"median": 13,
"mean": 12.551008535510086,
"max": 33,
"whiskerMin": 6.5,
"whiskerMax": 18.5,
"q1": 9,
"q3": 16
},
{
"itemId": 4905,
"min": 2,
"median": 10,
"mean": 9.914601533250133,
"max": 54,
"whiskerMin": 3.5,
"whiskerMax": 15.5,
"q1": 7,
"q3": 15
},
{
"itemId": 4906,
"min": 7,
"median": 20,
"mean": 20.199452977067114,
"max": 32,
"whiskerMin": 10.5,
"whiskerMax": 30.5,
"q1": 15,
"q3": 25
},
{
"itemId": 4907,
"min": 6,
"median": 15,
"mean": 15.067179638946433,
"max": 28,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 12,
"q3": 19
},
{
"itemId": 4908,
"min": 10,
"median": 17,
"mean": 16.841283994650023,
"max": 29,
"whiskerMin": 10,
"whiskerMax": 25.0,
"q1": 13,
"q3": 21
},
{
"itemId": 4909,
"min": 7,
"median": 17,
"mean": 16.70480928689884,
"max": 28,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 12,
"q3": 21
},
{
"itemId": 4910,
"min": 6,
"median": 17,
"mean": 16.43838383838384,
"max": 21,
"whiskerMin": 9.0,
"whiskerMax": 21,
"q1": 9,
"q3": 21
},
{
"itemId": 4911,
"min": 5,
"median": 15,
"mean": 14.950559364850234,
"max": 27,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 11,
"q3": 19
},
{
"itemId": 4912,
"min": 10,
"median": 17,
"mean": 16.800085433575394,
"max": 21,
"whiskerMin": 10,
"whiskerMax": 21,
"q1": 13,
"q3": 21
},
{
"itemId": 4913,
"min": 5,
"median": 21,
"mean": 21.20480668756531,
"max": 29,
"whiskerMin": 11.5,
"whiskerMax": 29,
"q1": 16,
"q3": 26
},
{
"itemId": 4914,
"min": 9,
"median": 21,
"mean": 21.417507640851163,
"max": 28,
"whiskerMin": 11.5,
"whiskerMax": 28,
"q1": 16,
"q3": 27
},
{
"itemId": 4915,
"min": 12,
"median": 25,
"mean": 25.22384219554031,
"max": 30,
"whiskerMin": 15.5,
"whiskerMax": 30,
"q1": 20,
"q3": 30
},
{
"itemId": 4916,
"min": 9,
"median": 21,
"mean": 21.29471595137683,
"max": 29,
"whiskerMin": 11.5,
"whiskerMax": 29,
"q1": 16,
"q3": 26
},
{
"itemId": 4917,
"min": 11,
"median": 20,
"mean": 20.242931196983978,
"max": 33,
"whiskerMin": 11,
"whiskerMax": 30.5,
"q1": 15,
"q3": 25
},
{
"itemId": 4918,
"min": 11,
"median": 20,
"mean": 20.21432406313755,
"max": 26,
"whiskerMin": 11,
"whiskerMax": 26,
"q1": 15,
"q3": 25
},
{
"itemId": 4919,
"min": 2,
"median": 18,
"mean": 18.20057485628593,
"max": 28,
"whiskerMin": 8.5,
"whiskerMax": 28,
"q1": 13,
"q3": 23
},
{
"itemId": 4920,
"min": 13,
"median": 21,
"mean": 21.269725557461406,
"max": 27,
"whiskerMin": 13,
"whiskerMax": 27,
"q1": 16,
"q3": 26
},
{
"itemId": 4921,
"min": 8,
"median": 23,
"mean": 22.469604015616287,
"max": 39,
"whiskerMin": 12.5,
"whiskerMax": 32.5,
"q1": 17,
"q3": 28
},
{
"itemId": 4922,
"min": 13,
"median": 21,
"mean": 21.28879099363681,
"max": 27,
"whiskerMin": 13,
"whiskerMax": 27,
"q1": 16,
"q3": 26
},
{
"itemId": 4923,
"min": 9,
"median": 22,
"mean": 21.885895763625022,
"max": 28,
"whiskerMin": 10.0,
"whiskerMax": 28,
"q1": 16,
"q3": 27
},
{
"itemId": 4924,
"min": 17,
"median": 24,
"mean": 24.275,
"max": 30,
"whiskerMin": 17,
"whiskerMax": 30,
"q1": 19,
"q3": 29
},
{
"itemId": 4925,
"min": 3,
"median": 12,
"mean": 12.132228448789794,
"max": 25,
"whiskerMin": 6.5,
"whiskerMax": 18.5,
"q1": 8,
"q3": 18
},
{
"itemId": 4926,
"min": 3,
"median": 14,
"mean": 14.063785819250551,
"max": 25,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4927,
"min": 2,
"median": 13,
"mean": 13.293325240672365,
"max": 24,
"whiskerMin": 5.0,
"whiskerMax": 21.0,
"q1": 7,
"q3": 21
},
{
"itemId": 4928,
"min": 3,
"median": 14,
"mean": 14.28689181453921,
"max": 24,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4929,
"min": 2,
"median": 15,
"mean": 15.172928566130109,
"max": 24,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 22
},
{
"itemId": 4930,
"min": 2,
"median": 11,
"mean": 11.365383672468742,
"max": 28,
"whiskerMin": 3.0,
"whiskerMax": 19.0,
"q1": 7,
"q3": 19
},
{
"itemId": 4931,
"min": 6,
"median": 15,
"mean": 15.041948868143267,
"max": 24,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 21
},
{
"itemId": 4932,
"min": 4,
"median": 13,
"mean": 13.155344605952735,
"max": 35,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 8,
"q3": 18
},
{
"itemId": 4933,
"min": 2,
"median": 15,
"mean": 15.211109866726398,
"max": 24,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 22
},
{
"itemId": 4934,
"min": 4,
"median": 14,
"mean": 14.535265363128492,
"max": 24,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 21
},
{
"itemId": 4935,
"min": 2,
"median": 14,
"mean": 14.638130411091602,
"max": 24,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4936,
"min": 2,
"median": 16,
"mean": 15.604686446392448,
"max": 28,
"whiskerMin": 5.5,
"whiskerMax": 25.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4937,
"min": 2,
"median": 14,
"mean": 13.515066740264954,
"max": 42,
"whiskerMin": 3.5,
"whiskerMax": 23.5,
"q1": 7,
"q3": 20
},
{
"itemId": 4938,
"min": 5,
"median": 14,
"mean": 14.642968022353307,
"max": 28,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4939,
"min": 2,
"median": 15,
"mean": 15.420422732362821,
"max": 24,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4940,
"min": 6,
"median": 16,
"mean": 16.295198863636365,
"max": 42,
"whiskerMin": 8.0,
"whiskerMax": 24.0,
"q1": 12,
"q3": 22
},
{
"itemId": 4941,
"min": 2,
"median": 15,
"mean": 15.5814981514226,
"max": 28,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 11,
"q3": 22
},
{
"itemId": 4942,
"min": 2,
"median": 13,
"mean": 13.081264980446575,
"max": 28,
"whiskerMin": 5.0,
"whiskerMax": 21.0,
"q1": 8,
"q3": 21
},
{
"itemId": 4943,
"min": 6,
"median": 16,
"mean": 16.33916083916084,
"max": 31,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4944,
"min": 8,
"median": 20,
"mean": 20.279912262081652,
"max": 30,
"whiskerMin": 10.5,
"whiskerMax": 30,
"q1": 15,
"q3": 28
},
{
"itemId": 4945,
"min": 6,
"median": 15,
"mean": 15.333072841689631,
"max": 27,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 11,
"q3": 22
},
{
"itemId": 4946,
"min": 7,
"median": 16,
"mean": 16.281539173349785,
"max": 32,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4947,
"min": 9,
"median": 20,
"mean": 19.61865714836967,
"max": 26,
"whiskerMin": 12.0,
"whiskerMax": 26,
"q1": 15,
"q3": 25
},
{
"itemId": 4948,
"min": 2,
"median": 12,
"mean": 12.6028108548097,
"max": 47,
"whiskerMin": 2.5,
"whiskerMax": 22.5,
"q1": 7,
"q3": 21
},
{
"itemId": 4949,
"min": 3,
"median": 17,
"mean": 17.36442090811023,
"max": 28,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 24
},
{
"itemId": 4950,
"min": 6,
"median": 18,
"mean": 17.58948966135012,
"max": 27,
"whiskerMin": 7.5,
"whiskerMax": 27,
"q1": 12,
"q3": 24
},
{
"itemId": 4951,
"min": 4,
"median": 14,
"mean": 13.6989601221141,
"max": 32,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 10,
"q3": 20
},
{
"itemId": 4952,
"min": 6,
"median": 15,
"mean": 14.58353329334133,
"max": 18,
"whiskerMin": 8.5,
"whiskerMax": 18,
"q1": 12,
"q3": 18
},
{
"itemId": 4953,
"min": 8,
"median": 20,
"mean": 20.376618605932592,
"max": 41,
"whiskerMin": 8.0,
"whiskerMax": 32.0,
"q1": 14,
"q3": 30
},
{
"itemId": 4954,
"min": 7,
"median": 20,
"mean": 19.57820772345064,
"max": 42,
"whiskerMin": 9.5,
"whiskerMax": 29.5,
"q1": 13,
"q3": 28
},
{
"itemId": 4955,
"min": 4,
"median": 15,
"mean": 15.21286475389804,
"max": 37,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 11,
"q3": 21
},
{
"itemId": 4956,
"min": 6,
"median": 15,
"mean": 15.572411296162201,
"max": 28,
"whiskerMin": 6,
"whiskerMax": 25.5,
"q1": 11,
"q3": 23
},
{
"itemId": 4957,
"min": 4,
"median": 19,
"mean": 19.28679703772275,
"max": 40,
"whiskerMin": 9.5,
"whiskerMax": 29.5,
"q1": 12,
"q3": 25
},
{
"itemId": 4958,
"min": 2,
"median": 20,
"mean": 20.057915580679012,
"max": 35,
"whiskerMin": 8.0,
"whiskerMax": 32.0,
"q1": 14,
"q3": 26
},
{
"itemId": 4959,
"min": 8,
"median": 19,
"mean": 18.627460180912905,
"max": 37,
"whiskerMin": 12.5,
"whiskerMax": 24.5,
"q1": 14,
"q3": 24
},
{
"itemId": 4960,
"min": 10,
"median": 17,
"mean": 17.196330275229357,
"max": 27,
"whiskerMin": 10,
"whiskerMax": 27,
"q1": 11,
"q3": 26
},
{
"itemId": 4961,
"min": 7,
"median": 20,
"mean": 19.583618434292614,
"max": 29,
"whiskerMin": 12.0,
"whiskerMax": 28.0,
"q1": 14,
"q3": 25
},
{
"itemId": 4962,
"min": 5,
"median": 14,
"mean": 13.964577139604023,
"max": 30,
"whiskerMin": 6.0,
"whiskerMax": 22.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4963,
"min": 8,
"median": 16,
"mean": 15.87470671046457,
"max": 33,
"whiskerMin": 8.0,
"whiskerMax": 24.0,
"q1": 11,
"q3": 20
},
{
"itemId": 4964,
"min": 4,
"median": 15,
"mean": 14.526943133846537,
"max": 18,
"whiskerMin": 8.5,
"whiskerMax": 18,
"q1": 11,
"q3": 18
},
{
"itemId": 4965,
"min": 8,
"median": 17,
"mean": 16.782845844412627,
"max": 22,
"whiskerMin": 9.0,
"whiskerMax": 22,
"q1": 13,
"q3": 21
},
{
"itemId": 4966,
"min": 5,
"median": 16,
"mean": 16.046492584842145,
"max": 26,
"whiskerMin": 8.0,
"whiskerMax": 24.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4967,
"min": 5,
"median": 16,
"mean": 15.955708458654362,
"max": 33,
"whiskerMin": 8.0,
"whiskerMax": 24.0,
"q1": 12,
"q3": 22
},
{
"itemId": 4968,
"min": 7,
"median": 17,
"mean": 17.307452093683462,
"max": 27,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 22
},
{
"itemId": 4969,
"min": 8,
"median": 19,
"mean": 19.367026340844177,
"max": 30,
"whiskerMin": 11.0,
"whiskerMax": 27.0,
"q1": 14,
"q3": 24
},
{
"itemId": 4970,
"min": 5,
"median": 15,
"mean": 15.23360619663762,
"max": 32,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 9,
"q3": 21
},
{
"itemId": 4971,
"min": 7,
"median": 17,
"mean": 17.359243160317053,
"max": 26,
"whiskerMin": 7.5,
"whiskerMax": 26,
"q1": 13,
"q3": 22
},
{
"itemId": 4972,
"min": 5,
"median": 15,
"mean": 14.943273905996758,
"max": 32,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 20
},
{
"itemId": 4973,
"min": 7,
"median": 19,
"mean": 19.341583432795193,
"max": 37,
"whiskerMin": 11.0,
"whiskerMax": 27.0,
"q1": 14,
"q3": 24
},
{
"itemId": 4974,
"min": 2,
"median": 15,
"mean": 15.271575526391892,
"max": 30,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4975,
"min": 9,
"median": 19,
"mean": 19.04328358208955,
"max": 29,
"whiskerMin": 11.0,
"whiskerMax": 27.0,
"q1": 15,
"q3": 24
},
{
"itemId": 4976,
"min": 3,
"median": 19,
"mean": 18.43952463101399,
"max": 28,
"whiskerMin": 10.0,
"whiskerMax": 26.0,
"q1": 13,
"q3": 24
},
{
"itemId": 4977,
"min": 2,
"median": 10,
"mean": 10.153526721232547,
"max": 23,
"whiskerMin": 2.0,
"whiskerMax": 18.0,
"q1": 7,
"q3": 16
},
{
"itemId": 4978,
"min": 2,
"median": 10,
"mean": 10.832545574025847,
"max": 30,
"whiskerMin": 4.5,
"whiskerMax": 16.5,
"q1": 7,
"q3": 19
},
{
"itemId": 4979,
"min": 2,
"median": 14,
"mean": 13.801303942874883,
"max": 29,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 10,
"q3": 21
},
{
"itemId": 4980,
"min": 6,
"median": 17,
"mean": 17.506549051055867,
"max": 30,
"whiskerMin": 7.5,
"whiskerMax": 27.5,
"q1": 12,
"q3": 25
},
{
"itemId": 4981,
"min": 4,
"median": 16,
"mean": 16.213668624294233,
"max": 29,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4982,
"min": 3,
"median": 16,
"mean": 15.498758571766375,
"max": 27,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 10,
"q3": 21
},
{
"itemId": 4983,
"min": 4,
"median": 13,
"mean": 12.895949367088608,
"max": 34,
"whiskerMin": 6.5,
"whiskerMax": 18.5,
"q1": 9,
"q3": 18
},
{
"itemId": 4984,
"min": 6,
"median": 16,
"mean": 15.750174297002092,
"max": 34,
"whiskerMin": 8.0,
"whiskerMax": 24.0,
"q1": 10,
"q3": 22
},
{
"itemId": 4985,
"min": 7,
"median": 18,
"mean": 18.37871120107962,
"max": 35,
"whiskerMin": 8.5,
"whiskerMax": 28.5,
"q1": 13,
"q3": 24
},
{
"itemId": 4986,
"min": 2,
"median": 15,
"mean": 15.432610950379388,
"max": 30,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 11,
"q3": 19
},
{
"itemId": 4987,
"min": 4,
"median": 15,
"mean": 14.70007620875554,
"max": 28,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 10,
"q3": 22
},
{
"itemId": 4988,
"min": 6,
"median": 16,
"mean": 16.210683906090505,
"max": 28,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4989,
"min": 5,
"median": 19,
"mean": 19.008320198444483,
"max": 40,
"whiskerMin": 11.0,
"whiskerMax": 27.0,
"q1": 13,
"q3": 26
},
{
"itemId": 4990,
"min": 5,
"median": 14,
"mean": 14.97079096430765,
"max": 26,
"whiskerMin": 5,
"whiskerMax": 24.5,
"q1": 10,
"q3": 23
},
{
"itemId": 4991,
"min": 4,
"median": 13,
"mean": 13.027319754283868,
"max": 24,
"whiskerMin": 5.0,
"whiskerMax": 21.0,
"q1": 9,
"q3": 18
},
{
"itemId": 4992,
"min": 6,
"median": 18,
"mean": 17.61511135401011,
"max": 30,
"whiskerMin": 11.5,
"whiskerMax": 23.5,
"q1": 14,
"q3": 21
},
{
"itemId": 4993,
"min": 6,
"median": 17,
"mean": 16.666775648989734,
"max": 30,
"whiskerMin": 10.5,
"whiskerMax": 22.5,
"q1": 12,
"q3": 21
},
{
"itemId": 4994,
"min": 10,
"median": 21,
"mean": 21.337336922758336,
"max": 31,
"whiskerMin": 10,
"whiskerMax": 31,
"q1": 14,
"q3": 30
},
{
"itemId": 4995,
"min": 4,
"median": 15,
"mean": 14.745920236175273,
"max": 53,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 11,
"q3": 21
},
{
"itemId": 4996,
"min": 3,
"median": 18,
"mean": 17.51544521802858,
"max": 31,
"whiskerMin": 11.5,
"whiskerMax": 23.5,
"q1": 13,
"q3": 23
},
{
"itemId": 4997,
"min": 12,
"median": 17,
"mean": 17.5778668002003,
"max": 29,
"whiskerMin": 12,
"whiskerMax": 27.5,
"q1": 13,
"q3": 24
},
{
"itemId": 4998,
"min": 10,
"median": 15,
"mean": 14.645250114731528,
"max": 22,
"whiskerMin": 10,
"whiskerMax": 20.5,
"q1": 11,
"q3": 19
},
{
"itemId": 4999,
"min": 3,
"median": 16,
"mean": 15.622184172507893,
"max": 29,
"whiskerMin": 9.5,
"whiskerMax": 21.5,
"q1": 12,
"q3": 19
},
{
"itemId": 5000,
"min": 6,
"median": 15,
"mean": 14.551284122112744,
"max": 18,
"whiskerMin": 8.5,
"whiskerMax": 18,
"q1": 11,
"q3": 18
},
{
"itemId": 5001,
"min": 6,
"median": 17,
"mean": 17.01299632517702,
"max": 36,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 10,
"q3": 22
},
{
"itemId": 5002,
"min": 2,
"median": 13,
"mean": 13.356112446828186,
"max": 37,
"whiskerMin": 7.5,
"whiskerMax": 19.5,
"q1": 10,
"q3": 17
},
{
"itemId": 5003,
"min": 6,
"median": 15,
"mean": 15.067857142857143,
"max": 33,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 10,
"q3": 22
},
{
"itemId": 5004,
"min": 7,
"median": 15,
"mean": 14.574377859613882,
"max": 26,
"whiskerMin": 8.5,
"whiskerMax": 20.5,
"q1": 11,
"q3": 18
},
{
"itemId": 5005,
"min": 9,
"median": 17,
"mean": 16.813793661060803,
"max": 21,
"whiskerMin": 9.0,
"whiskerMax": 21,
"q1": 13,
"q3": 21
},
{
"itemId": 5006,
"min": 7,
"median": 17,
"mean": 17.38108564535585,
"max": 31,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 23
},
{
"itemId": 5007,
"min": 5,
"median": 15,
"mean": 14.836858006042297,
"max": 25,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 11,
"q3": 19
},
{
"itemId": 5008,
"min": 2,
"median": 17,
"mean": 17.160380835380835,
"max": 44,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 23
},
{
"itemId": 5009,
"min": 7,
"median": 17,
"mean": 16.84959468698115,
"max": 30,
"whiskerMin": 9.0,
"whiskerMax": 25.0,
"q1": 13,
"q3": 21
},
{
"itemId": 5010,
"min": 11,
"median": 17,
"mean": 16.824456902592853,
"max": 21,
"whiskerMin": 11,
"whiskerMax": 21,
"q1": 13,
"q3": 21
},
{
"itemId": 5011,
"min": 3,
"median": 15,
"mean": 14.798830532029262,
"max": 21,
"whiskerMin": 7.0,
"whiskerMax": 21,
"q1": 11,
"q3": 19
},
{
"itemId": 5012,
"min": 9,
"median": 17,
"mean": 16.852959214964734,
"max": 24,
"whiskerMin": 9.0,
"whiskerMax": 24,
"q1": 13,
"q3": 21
},
{
"itemId": 5013,
"min": 2,
"median": 15,
"mean": 14.879180436219432,
"max": 25,
"whiskerMin": 7.0,
"whiskerMax": 23.0,
"q1": 11,
"q3": 19
},
{
"itemId": 5014,
"min": 10,
"median": 17,
"mean": 16.795594262295083,
"max": 21,
"whiskerMin": 10,
"whiskerMax": 21,
"q1": 13,
"q3": 21
},
{
"itemId": 5015,
"min": 9,
"median": 21,
"mean": 21.275186104218363,
"max": 27,
"whiskerMin": 11.5,
"whiskerMax": 27,
"q1": 16,
"q3": 26
},
{
"itemId": 5016,
"min": 16,
"median": 22,
"mean": 21.449310624493105,
"max": 28,
"whiskerMin": 16,
"whiskerMax": 28,
"q1": 17,
"q3": 26
},
{
"itemId": 5017,
"min": 9,
"median": 22,
"mean": 21.42966194111232,
"max": 27,
"whiskerMin": 11.5,
"whiskerMax": 27,
"q1": 16,
"q3": 26
},
{
"itemId": 5018,
"min": 11,
"median": 20,
"mean": 20.129885057471263,
"max": 29,
"whiskerMin": 11,
"whiskerMax": 29,
"q1": 15,
"q3": 25
},
{
"itemId": 5019,
"min": 11,
"median": 18,
"mean": 18.276677933365523,
"max": 24,
"whiskerMin": 11,
"whiskerMax": 24,
"q1": 13,
"q3": 23
},
{
"itemId": 5020,
"min": 9,
"median": 20,
"mean": 20.142309535218015,
"max": 26,
"whiskerMin": 10.5,
"whiskerMax": 26,
"q1": 15,
"q3": 25
},
{
"itemId": 5021,
"min": 21,
"median": 27,
"mean": 26.5250569476082,
"max": 32,
"whiskerMin": 21,
"whiskerMax": 32,
"q1": 21,
"q3": 31
},
{
"itemId": 5022,
"min": 11,
"median": 20,
"mean": 20.23982509249916,
"max": 25,
"whiskerMin": 11,
"whiskerMax": 25,
"q1": 15,
"q3": 25
},
{
"itemId": 5023,
"min": 9,
"median": 21,
"mean": 21.3168709444845,
"max": 28,
"whiskerMin": 11.5,
"whiskerMax": 28,
"q1": 16,
"q3": 26
},
{
"itemId": 5024,
"min": 13,
"median": 18,
"mean": 18.16947723440135,
"max": 23,
"whiskerMin": 13,
"whiskerMax": 23,
"q1": 13,
"q3": 23
},
{
"itemId": 5025,
"min": 11,
"median": 23,
"mean": 22.67703180212014,
"max": 35,
"whiskerMin": 12.5,
"whiskerMax": 32.5,
"q1": 17,
"q3": 28
},
{
"itemId": 5026,
"min": 10,
"median": 18,
"mean": 18.06997084548105,
"max": 23,
"whiskerMin": 10.0,
"whiskerMax": 23,
"q1": 13,
"q3": 23
},
{
"itemId": 5027,
"min": 21,
"median": 26,
"mean": 26.290285714285716,
"max": 32,
"whiskerMin": 21,
"whiskerMax": 32,
"q1": 21,
"q3": 31
},
{
"itemId": 5028,
"min": 15,
"median": 27,
"mean": 27.20291869353718,
"max": 33,
"whiskerMin": 17.5,
"whiskerMax": 33,
"q1": 22,
"q3": 33
},
{
"itemId": 5029,
"min": 17,
"median": 28,
"mean": 27.5625,
"max": 33,
"whiskerMin": 17.5,
"whiskerMax": 33,
"q1": 22,
"q3": 33
},
{
"itemId": 5030,
"min": 16,
"median": 22,
"mean": 22.230252100840335,
"max": 28,
"whiskerMin": 16,
"whiskerMax": 28,
"q1": 17,
"q3": 27
},
{
"itemId": 5031,
"min": 10,
"median": 18,
"mean": 18.138738180127113,
"max": 23,
"whiskerMin": 10,
"whiskerMax": 23,
"q1": 13,
"q3": 23
},
{
"itemId": 5032,
"min": 3,
"median": 13,
"mean": 12.84175151016704,
"max": 32,
"whiskerMin": 6.5,
"whiskerMax": 18.5,
"q1": 10,
"q3": 17
},
{
gitextract_17mc788c/ ├── .editorconfig ├── .github/ │ ├── FUNDING.yml │ └── workflows/ │ ├── publish.yml │ └── update-bite-timers.yml ├── .gitignore ├── .gitmodules ├── AcceptCollectable.md ├── AutoHook/ │ ├── AutoHook.cs │ ├── AutoHook.csproj │ ├── AutoHook.csproj.DotSettings │ ├── AutoHook.json │ ├── Classes/ │ │ ├── AutoCasts/ │ │ │ ├── AutoBigGameFishing.cs │ │ │ ├── AutoCastLine.cs │ │ │ ├── AutoChum.cs │ │ │ ├── AutoCollect.cs │ │ │ ├── AutoCordial.cs │ │ │ ├── AutoDoubleHook.cs │ │ │ ├── AutoFishEyes.cs │ │ │ ├── AutoFood.cs │ │ │ ├── AutoIdenticalCast.cs │ │ │ ├── AutoLures.cs │ │ │ ├── AutoMakeShiftBait.cs │ │ │ ├── AutoMooch.cs │ │ │ ├── AutoMooch2.cs │ │ │ ├── AutoMultiHook.cs │ │ │ ├── AutoPatience.cs │ │ │ ├── AutoPrizeCatch.cs │ │ │ ├── AutoReleaseFish.cs │ │ │ ├── AutoSparefulHand.cs │ │ │ ├── AutoSurfaceSlap.cs │ │ │ ├── AutoThaliaksFavor.cs │ │ │ └── AutoTripleHook.cs │ │ ├── BaitFishClass.cs │ │ ├── BaseActionCast.cs │ │ ├── BaseBiteConfig.cs │ │ ├── BaseGig.cs │ │ ├── BaseHookset.cs │ │ ├── BaseOption.cs │ │ ├── BasePreset.cs │ │ ├── BasePresetConfig.cs │ │ ├── BiteTimers.cs │ │ ├── ImportedFish.cs │ │ └── PresetFolder.cs │ ├── Configurations/ │ │ ├── AutoCastsConfig.cs │ │ ├── AutoGigConfig.cs │ │ ├── Configuration.cs │ │ ├── CustomPresetConfig.cs │ │ ├── ExtraConfig.cs │ │ ├── FishConfig.cs │ │ ├── HookConfig.cs │ │ └── old_config/ │ │ ├── BaitConfig.cs │ │ ├── CustomPresetConfig.cs │ │ ├── OldHookConfig.cs │ │ └── OldPresetConfig.cs │ ├── Data/ │ │ ├── FishData/ │ │ │ ├── bitetimers.json │ │ │ ├── fish_list.json │ │ │ └── fish_list_64.txt │ │ └── IDs.cs │ ├── Enums/ │ │ ├── BaitType.cs │ │ ├── BiteType.cs │ │ ├── FishingSteps.cs │ │ ├── HookType.cs │ │ ├── IntuitionStatus.cs │ │ ├── LureTarget.cs │ │ ├── OpenWindow.cs │ │ ├── SpectralCurrentStatus.cs │ │ ├── SwimbaitAction.cs │ │ └── XivChatLog.cs │ ├── Fishing/ │ │ ├── FishingManager.AutoCast.cs │ │ ├── FishingManager.Extra.cs │ │ ├── FishingManager.FishCaught.cs │ │ ├── FishingManager.Helper.cs │ │ ├── FishingManager.cs │ │ └── FishingPresets.cs │ ├── Globals.cs │ ├── IPC/ │ │ └── AutoHookIPC.cs │ ├── PluginChangelog.cs │ ├── PluginUI.cs │ ├── PresetCreator.cs │ ├── Resources/ │ │ └── Localization/ │ │ ├── UIStrings.Designer.cs │ │ ├── UIStrings.de.resx │ │ ├── UIStrings.es.resx │ │ ├── UIStrings.fr.resx │ │ ├── UIStrings.it.resx │ │ ├── UIStrings.ja.resx │ │ ├── UIStrings.ko.resx │ │ ├── UIStrings.resx │ │ ├── UIStrings.ru.resx │ │ └── UIStrings.zh.resx │ ├── SeFunctions/ │ │ ├── BaitManager.cs │ │ ├── SeAddressBase.cs │ │ ├── SeFunctionBase.cs │ │ └── SeTugType.cs │ ├── Service.cs │ ├── Spearfishing/ │ │ ├── AutoGig.cs │ │ ├── Enums/ │ │ │ ├── SpearfishSize.cs │ │ │ └── SpearfishSpeed.cs │ │ ├── SpearFishingPresets.cs │ │ └── Struct/ │ │ └── SpearfishWindow.cs │ ├── Ui/ │ │ ├── BaseTab.cs │ │ ├── SubTabAutoCast.cs │ │ ├── SubTabBaitMooch.cs │ │ ├── SubTabExtra.cs │ │ ├── SubTabFish.cs │ │ ├── TabAutoGig.cs │ │ ├── TabCommunity.cs │ │ ├── TabDebug.cs │ │ ├── TabFishingPresets.cs │ │ ├── TabGlobalPreset.cs │ │ └── TabSettings.cs │ ├── Utils/ │ │ ├── DrawUtil.cs │ │ ├── EzDtr2.cs │ │ ├── GameRes.cs │ │ ├── InputUtil.cs │ │ ├── MultiString.cs │ │ ├── PlayerRes.cs │ │ ├── SignaturePatterns.cs │ │ └── WikiPresets.cs │ └── packages.lock.json ├── AutoHook.sln ├── LICENSE ├── README.md ├── build.bat ├── crowdin.yml └── update_bite_timers.py
SYMBOL INDEX (632 symbols across 96 files)
FILE: AutoHook/AutoHook.cs
class AutoHook (line 13) | public class AutoHook : IDalamudPlugin
method AutoHook (line 53) | public AutoHook(IDalamudPluginInterface pluginInterface, IDtrBar dtrBar)
method OnCommand (line 120) | private void OnCommand(string command, string args)
method SwapBait (line 160) | private static void SwapBait(string args)
method SetPreset (line 166) | private static void SetPreset(string presetName)
method SetGigPreset (line 181) | private static void SetGigPreset(string presetName)
method Dispose (line 203) | public void Dispose()
method OnOpenConfigUi (line 220) | private static void OnOpenConfigUi() => _pluginUi.Toggle();
FILE: AutoHook/Classes/AutoCasts/AutoBigGameFishing.cs
class AutoBigGameFishing (line 3) | public class AutoBigGameFishing : BaseActionCast
method AutoBigGameFishing (line 10) | public AutoBigGameFishing() : base(UIStrings.BigGameFishing, IDs.Actio...
method GetName (line 14) | public override string GetName()
method CastCondition (line 17) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoCastLine.cs
class AutoCastLine (line 5) | public class AutoCastLine : BaseActionCast
method DoesCancelMooch (line 13) | public override bool DoesCancelMooch() => !IgnoreMooch;
method RequiresTimeWindow (line 15) | public override bool RequiresTimeWindow() => true;
method AutoCastLine (line 17) | public AutoCastLine() : base(UIStrings.AutoCastLine_Auto_Cast_Line, ID...
method CastCondition (line 27) | public override bool CastCondition()
method GetName (line 38) | public override string GetName()
FILE: AutoHook/Classes/AutoCasts/AutoChum.cs
class AutoChum (line 3) | public class AutoChum : BaseActionCast
method DoesCancelMooch (line 8) | public override bool DoesCancelMooch() => true;
method AutoChum (line 10) | public AutoChum() : base(UIStrings.Chum, IDs.Actions.Chum)
method GetName (line 15) | public override string GetName()
method CastCondition (line 18) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoCollect.cs
class AutoCollect (line 5) | public class AutoCollect : BaseActionCast
method AutoCollect (line 10) | public AutoCollect() : base(UIStrings.Collect, IDs.Actions.Collect, Ac...
method GetName (line 15) | public override string GetName()
method CastCondition (line 18) | public override bool CastCondition() => !PlayerRes.HasStatus(IDs.Statu...
FILE: AutoHook/Classes/AutoCasts/AutoCordial.cs
class AutoCordial (line 5) | public class AutoCordial : BaseActionCast
method RequiresTimeWindow (line 19) | public override bool RequiresTimeWindow() => !IgnoreTimeWindow;
method AutoCordial (line 41) | public AutoCordial(bool isSpearFishing = false) : base(UIStrings.Cordi...
method GetName (line 46) | public override string GetName()
method CastCondition (line 48) | public override bool CastCondition()
method SetThreshold (line 68) | public override void SetThreshold(int newCost)
method CheckNotOvercaped (line 76) | private bool CheckNotOvercaped(uint recovery)
FILE: AutoHook/Classes/AutoCasts/AutoDoubleHook.cs
class AutoDoubleHook (line 5) | public class AutoDoubleHook : BaseActionCast
method AutoDoubleHook (line 10) | public AutoDoubleHook() : base(UIStrings.Double_Hook, Data.IDs.Actions...
method GetName (line 14) | public override string GetName()
method CastCondition (line 17) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoFishEyes.cs
class AutoFishEyes (line 5) | public class AutoFishEyes : BaseActionCast
method DoesCancelMooch (line 14) | public override bool DoesCancelMooch() => !IgnoreMooch;
method RequiresTimeWindow (line 16) | public override bool RequiresTimeWindow() => true;
method AutoFishEyes (line 18) | public AutoFishEyes() : base(UIStrings.Fish_Eyes, IDs.Actions.FishEyes...
method GetName (line 23) | public override string GetName()
method CastCondition (line 26) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoFood.cs
class AutoFood (line 5) | public class AutoFood : BaseActionCast //todo
method AutoFood (line 12) | public AutoFood() : base(UIStrings.Food_Buff, 0, ActionType.Item)
method GetName (line 16) | public override string GetName()
method CastCondition (line 19) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoIdenticalCast.cs
class AutoIdenticalCast (line 6) | public class AutoIdenticalCast : BaseActionCast
method DoesCancelMooch (line 15) | public override bool DoesCancelMooch() => true;
method AutoIdenticalCast (line 17) | public AutoIdenticalCast() : base(UIStrings.Identical_Cast, IDs.Action...
method GetName (line 22) | public override string GetName()
method CastCondition (line 25) | public override bool CastCondition()
method IsAvailableToCast (line 39) | public bool IsAvailableToCast(int caughtAmount)
FILE: AutoHook/Classes/AutoCasts/AutoLures.cs
class AutoLures (line 7) | public class AutoLures : BaseActionCast
method AutoLures (line 14) | public AutoLures() : base(UIStrings.UseLures, IDs.Actions.AmbitiousLure)
method GetName (line 24) | public override string GetName()
method CastCondition (line 29) | public override bool CastCondition()
method TryCasting (line 115) | public void TryCasting(bool lureSuccess)
method DrawSurfaceSwap (line 133) | private void DrawSurfaceSwap()
method DrawIdenticalCast (line 152) | private void DrawIdenticalCast()
FILE: AutoHook/Classes/AutoCasts/AutoMakeShiftBait.cs
class AutoMakeShiftBait (line 5) | public class AutoMakeShiftBait : BaseActionCast
method RequiresTimeWindow (line 13) | public override bool RequiresTimeWindow() => true;
method AutoMakeShiftBait (line 15) | public AutoMakeShiftBait() : base(UIStrings.MakeShift_Bait, IDs.Action...
method GetName (line 20) | public override string GetName()
method CastCondition (line 23) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoMooch.cs
class AutoMooch (line 5) | public class AutoMooch : BaseActionCast
method RequiresTimeWindow (line 11) | public override bool RequiresTimeWindow() => true;
method AutoMooch (line 13) | public AutoMooch() : base(UIStrings.AutoMooch, IDs.Actions.Mooch, Acti...
method GetName (line 18) | public override string GetName()
method CastCondition (line 21) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoMooch2.cs
class AutoMooch2 (line 5) | public class AutoMooch2 : BaseActionCast
method RequiresTimeWindow (line 10) | public override bool RequiresTimeWindow() => true;
method AutoMooch2 (line 12) | public AutoMooch2() : base(UIStrings.UseMoochII, Data.IDs.Actions.Mooc...
method GetName (line 16) | public override string GetName()
method CastCondition (line 19) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoMultiHook.cs
class AutoMultiHook (line 5) | public class AutoMultiHook : BaseActionCast
method AutoMultiHook (line 10) | public AutoMultiHook() : base(UIStrings.Multihook, IDs.Actions.MultiHo...
method CastCondition (line 14) | public override unsafe bool CastCondition()
method GetName (line 23) | public override string GetName() => Name = UIStrings.Multihook;
FILE: AutoHook/Classes/AutoCasts/AutoPatience.cs
class AutoPatience (line 6) | public class AutoPatience : BaseActionCast
method RequiresTimeWindow (line 11) | public override bool RequiresTimeWindow() => true;
method DoesCancelMooch (line 13) | public override bool DoesCancelMooch() => true;
method AutoPatience (line 15) | public AutoPatience() : base(UIStrings.AutoPatience_Patience, IDs.Acti...
method GetName (line 20) | public override string GetName()
method CastCondition (line 23) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoPrizeCatch.cs
class AutoPrizeCatch (line 5) | public class AutoPrizeCatch : BaseActionCast
method DoesCancelMooch (line 12) | public override bool DoesCancelMooch() => true;
method AutoPrizeCatch (line 14) | public AutoPrizeCatch() : base(UIStrings.Prize_Catch, IDs.Actions.Priz...
method GetName (line 19) | public override string GetName()
method CastCondition (line 22) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoReleaseFish.cs
class AutoReleaseFish (line 3) | public class AutoReleaseFish : BaseActionCast
method AutoReleaseFish (line 5) | public AutoReleaseFish() : base(UIStrings.ReleaseAllFish, Data.IDs.Act...
method CastCondition (line 14) | public override bool CastCondition()
method GetName (line 19) | public override string GetName()
FILE: AutoHook/Classes/AutoCasts/AutoSparefulHand.cs
class AutoSparefulHand (line 5) | public class AutoSparefulHand : BaseActionCast
method AutoSparefulHand (line 9) | public AutoSparefulHand() : base(UIStrings.SparefulHand, IDs.Actions.S...
method GetName (line 14) | public override string GetName()
method CastCondition (line 19) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoSurfaceSlap.cs
class AutoSurfaceSlap (line 5) | public class AutoSurfaceSlap : BaseActionCast
method DoesCancelMooch (line 8) | public override bool DoesCancelMooch() => true;
method AutoSurfaceSlap (line 10) | public AutoSurfaceSlap() : base(UIStrings.Surface_Slap, IDs.Actions.Su...
method GetName (line 15) | public override string GetName()
method CastCondition (line 18) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoThaliaksFavor.cs
class AutoThaliaksFavor (line 5) | public class AutoThaliaksFavor : BaseActionCast
method AutoThaliaksFavor (line 11) | public AutoThaliaksFavor(bool isSpearfishing = false) : base(UIStrings...
method GetName (line 17) | public override string GetName()
method CastCondition (line 20) | public override bool CastCondition()
FILE: AutoHook/Classes/AutoCasts/AutoTripleHook.cs
class AutoTripleHook (line 5) | public class AutoTripleHook : BaseActionCast
method AutoTripleHook (line 10) | public AutoTripleHook() : base(UIStrings.Triple_Hook, Data.IDs.Actions...
method GetName (line 14) | public override string GetName()
method CastCondition (line 17) | public override bool CastCondition()
FILE: AutoHook/Classes/BaitFishClass.cs
class BaitFishClass (line 8) | public class BaitFishClass : IComparable<BaitFishClass>
method BaitFishClass (line 33) | public BaitFishClass(ItemRow data)
method BaitFishClass (line 38) | public BaitFishClass(FishRow fishRow)
method BaitFishClass (line 45) | public BaitFishClass(string name, int id)
method BaitFishClass (line 50) | public BaitFishClass()
method BaitFishClass (line 55) | public BaitFishClass(Number id)
method CompareTo (line 60) | public int CompareTo(BaitFishClass? other)
FILE: AutoHook/Classes/BaseActionCast.cs
class BaseActionCast (line 12) | public abstract class BaseActionCast
method BaseActionCast (line 14) | protected BaseActionCast(string name, uint id, ActionType actionType =...
method DoesCancelMooch (line 40) | public virtual bool DoesCancelMooch() => false;
method RequiresAutoCastAvailabl (line 44) | public virtual bool RequiresAutoCastAvailabl() => false;
method RequiresTimeWindow (line 46) | public virtual bool RequiresTimeWindow() => false;
method SetThreshold (line 52) | public virtual void SetThreshold(int newCost)
method IsAvailableToCast (line 61) | public bool IsAvailableToCast(bool ignoreCurrentMooch = false)
method CastCondition (line 91) | public abstract bool CastCondition();
method GetName (line 93) | public virtual string GetName() => "";
method GetPriority (line 95) | public virtual int GetPriority() => Priority;
method DrawConfig (line 103) | public virtual void DrawConfig(List<BaseActionCast>? availableActs = n...
method DrawConfigOptions (line 154) | public virtual void DrawConfigOptions()
method DrawUpDownArrows (line 159) | private void DrawUpDownArrows(List<BaseActionCast>? availableActs)
method DrawGpThreshold (line 209) | public virtual void DrawGpThreshold()
FILE: AutoHook/Classes/BaseBiteConfig.cs
class BaseBiteConfig (line 10) | public class BaseBiteConfig(HookType type)
method DrawOptions (line 57) | public void DrawOptions(string biteName, bool enableSwap = false)
method DrawBite (line 83) | private void DrawBite()
method DrawTimedHookTypeOption (line 131) | private void DrawTimedHookTypeOption(string label, HookType hookType, ...
method DrawSurfaceSwap (line 150) | private void DrawSurfaceSwap()
method DrawIdenticalCast (line 167) | private void DrawIdenticalCast()
method DrawPrizeCatch (line 184) | private void DrawPrizeCatch()
method DrawMultihook (line 201) | private void DrawMultihook()
method DrawTimers (line 218) | private void DrawTimers()
method SetupTimer (line 237) | private void SetupTimer(ref double minTimeDelay, ref double maxTimeDelay)
FILE: AutoHook/Classes/BaseGig.cs
class BaseGig (line 6) | public class BaseGig(int itemId) : BaseOption
method DrawOptions (line 40) | public override void DrawOptions()
method Equals (line 69) | public override bool Equals(object? obj)
method GetHashCode (line 75) | public override int GetHashCode()
FILE: AutoHook/Classes/BaseHookset.cs
class BaseHookset (line 11) | public class BaseHookset(uint requiredStatus)
method GetUniqueId (line 53) | public Guid GetUniqueId()
method DrawOptions (line 61) | public void DrawOptions()
method DrawPatience (line 92) | private void DrawPatience()
method DrawDoubleHook (line 104) | private void DrawDoubleHook()
method DrawTripleHook (line 119) | private void DrawTripleHook()
method DrawTimeout (line 134) | private void DrawTimeout()
method DrawLures (line 189) | private void DrawLures()
method DrawStopCondition (line 198) | private void DrawStopCondition()
FILE: AutoHook/Classes/BaseOption.cs
class BaseOption (line 3) | public abstract class BaseOption
method DrawOptions (line 7) | public abstract void DrawOptions();
FILE: AutoHook/Classes/BasePreset.cs
class BasePreset (line 5) | public abstract class BasePreset
method AddNewPreset (line 31) | public abstract void AddNewPreset(string presetName);
method AddNewPreset (line 33) | public abstract void AddNewPreset(BasePresetConfig preset);
method RemovePreset (line 35) | public abstract void RemovePreset(Guid value);
method RenamePreset (line 37) | public virtual void RenamePreset(Guid value, string newName)
method OnSelectedPreset (line 47) | public virtual void OnSelectedPreset(BasePresetConfig newPreset, BaseP...
method SwapIndex (line 52) | public abstract void SwapIndex(int itemIndex, int targetIndex);
method GetPreset (line 54) | public virtual BasePresetConfig? GetPreset(Guid value)
FILE: AutoHook/Classes/BasePresetConfig.cs
class BasePresetConfig (line 5) | public abstract class BasePresetConfig()
method DrawOptions (line 13) | public abstract void DrawOptions();
method RenamePreset (line 15) | public virtual void RenamePreset(string newName)
method AddItem (line 21) | public abstract void AddItem(BaseOption item);
method RemoveItem (line 23) | public abstract void RemoveItem(Guid value);
FILE: AutoHook/Classes/BiteTimers.cs
class BiteTimers (line 3) | public class BiteTimers
FILE: AutoHook/Classes/ImportedFish.cs
class ImportedFish (line 5) | public class ImportedFish
class FishPredator (line 26) | public class FishPredator
class FishInterval (line 32) | public class FishInterval
FILE: AutoHook/Classes/PresetFolder.cs
class PresetFolder (line 3) | public class PresetFolder(string folderName)
method AddPreset (line 10) | public void AddPreset(Guid presetId)
method RemovePreset (line 16) | public void RemovePreset(Guid presetId)
method ContainsPreset (line 22) | public bool ContainsPreset(Guid presetId)
FILE: AutoHook/Configurations/AutoCastsConfig.cs
class AutoCastsConfig (line 6) | public class AutoCastsConfig
method GetAutoCastOrder (line 36) | private List<BaseActionCast> GetAutoCastOrder()
method GetNextAutoCast (line 55) | public BaseActionCast? GetNextAutoCast(bool ignoreCurrentMooch)
method InsideCastWindow (line 76) | private unsafe bool InsideCastWindow()
method TryCastAction (line 84) | public bool TryCastAction(BaseActionCast? action, bool noDelay = false...
method TryChumAnimationCancel (line 105) | private void TryChumAnimationCancel()
FILE: AutoHook/Configurations/AutoGigConfig.cs
class AutoGigConfig (line 7) | public class AutoGigConfig : BasePresetConfig
method AutoGigConfig (line 15) | public AutoGigConfig(string presetName)
method GetGigCurrentNode (line 20) | public List<BaseGig> GetGigCurrentNode(int node)
method AddItem (line 36) | public override void AddItem(BaseOption item)
method RemoveItem (line 42) | public override void RemoveItem(Guid value)
method DrawOptions (line 48) | public override void DrawOptions()
FILE: AutoHook/Configurations/Configuration.cs
class Configuration (line 11) | [Serializable]
method Save (line 59) | public void Save()
method UpdateVersion (line 64) | public void UpdateVersion()
method SetFieldNewClass (line 115) | private static void SetFieldNewClass(HookConfig newOne, BaitConfig old)
method Initiate (line 135) | public void Initiate()
method Load (line 147) | public static Configuration Load()
method ResetConfig (line 171) | public static void ResetConfig()
method ExportPreset (line 182) | public static string ExportPreset(BasePresetConfig preset)
class FolderExport (line 196) | public class FolderExport(string name)
method ExportFolder (line 202) | public static string ExportFolder(PresetFolder folder, List<CustomPres...
method ImportFolder (line 221) | public static (PresetFolder Folder, List<CustomPresetConfig> Presets)?...
method ImportPreset (line 252) | public static BasePresetConfig? ImportPreset(string import)
method CompressString (line 294) | public static string CompressString(string s)
method DecompressString (line 304) | public static string DecompressString(string s)
method DecompressBase64 (line 325) | public static string DecompressBase64(string base64)
method ConvertOldPreset (line 344) | private static CustomPresetConfig? ConvertOldPreset(BaitPresetConfig? ...
method ConvertOldPresetV3 (line 378) | private static CustomPresetConfig? ConvertOldPresetV3(OldPresetConfig?...
FILE: AutoHook/Configurations/CustomPresetConfig.cs
class CustomPresetConfig (line 9) | public class CustomPresetConfig : BasePresetConfig
method CustomPresetConfig (line 19) | public CustomPresetConfig(string name)
method AddItem (line 24) | public override void AddItem(BaseOption item)
method ReplaceBaitConfig (line 40) | public void ReplaceBaitConfig(HookConfig hookConfig)
method ReplaceMoochConfig (line 53) | public void ReplaceMoochConfig(HookConfig moochConfig)
method GetCfgById (line 66) | public HookConfig? GetCfgById(int id, bool isMooching)
method GetFishById (line 78) | public FishConfig? GetFishById(int id)
method RemoveItem (line 83) | public override void RemoveItem(Guid value)
method HasBaitOrMooch (line 91) | public bool HasBaitOrMooch(uint id)
method ResetCounter (line 97) | public void ResetCounter()
method Equals (line 115) | public override bool Equals(object? obj)
method GetHashCode (line 121) | public override int GetHashCode()
method DrawOptions (line 128) | public override void DrawOptions()
FILE: AutoHook/Configurations/ExtraConfig.cs
class ExtraConfig (line 3) | public class ExtraConfig : BaseOption
method DrawOptions (line 53) | public override void DrawOptions()
FILE: AutoHook/Configurations/FishConfig.cs
class FishConfig (line 5) | public class FishConfig : BaseOption
method FishConfig (line 37) | public FishConfig() { }
method FishConfig (line 39) | public FishConfig(BaitFishClass fish)
method FishConfig (line 46) | public FishConfig(int fishId)
method DrawOptions (line 51) | public override void DrawOptions()
FILE: AutoHook/Configurations/HookConfig.cs
class HookConfig (line 5) | public class HookConfig : BaseOption
method HookConfig (line 21) | public HookConfig() { }
method HookConfig (line 23) | public HookConfig(BaitFishClass baitFish)
method HookConfig (line 28) | public HookConfig(int baitFishId)
method SetBiteAndHookType (line 33) | public void SetBiteAndHookType(BiteType bite, HookType hookType, bool ...
method SetHooksetTimer (line 53) | public void SetHooksetTimer(BiteType bite, double min, double max, boo...
method ResetAllHooksets (line 79) | public void ResetAllHooksets()
method ResetHooksets (line 85) | private void ResetHooksets(BaseHookset hookset)
method GetHookset (line 102) | public BaseHookset GetHookset()
method GetHook (line 118) | public HookType? GetHook(BiteType bite, double timePassed)
method CheckHookCondition (line 185) | private bool CheckHookCondition(BaseBiteConfig hookType, double timePa...
method GetHookTypeForTime (line 205) | private HookType? GetHookTypeForTime(BaseBiteConfig hookType, double t...
method GetTimedHookType (line 212) | private HookType? GetTimedHookType(BaseBiteConfig hookType, double tim...
method IsHookAvailable (line 241) | private bool IsHookAvailable(BaseBiteConfig hookType, double timePassed)
method CheckIdenticalCast (line 254) | private bool CheckIdenticalCast(BaseBiteConfig hookType)
method CheckPrizeCatch (line 271) | private bool CheckPrizeCatch(BaseBiteConfig hookType)
method CheckSurfaceSlap (line 288) | private bool CheckSurfaceSlap(BaseBiteConfig hookType)
method CheckMultihook (line 305) | private bool CheckMultihook(BaseBiteConfig hookType)
method CheckTimer (line 322) | private bool CheckTimer(BaseBiteConfig hookType, double timePassed)
method DrawOptions (line 358) | public override void DrawOptions()
method Equals (line 362) | public override bool Equals(object? obj)
method GetHashCode (line 368) | public override int GetHashCode()
FILE: AutoHook/Configurations/old_config/BaitConfig.cs
class BaitConfig (line 3) | public class BaitConfig(string bait)
method GetHook (line 53) | public HookType? GetHook(BiteType bite)
method GetHookIgnoreEnable (line 76) | public HookType? GetHookIgnoreEnable(BiteType bite)
method CheckHookEnabled (line 91) | public bool CheckHookEnabled(BiteType bite) =>
method CheckHookIntuitionEnabled (line 97) | public bool CheckHookIntuitionEnabled(BiteType bite) =>
method CheckHookDHTHEnabled (line 103) | public bool CheckHookDHTHEnabled(BiteType bite) =>
method GetPatienceHook (line 109) | private HookType GetPatienceHook(BiteType bite) => bite switch
method GetIntuitionHook (line 117) | private HookType GetIntuitionHook(BiteType bite) => bite switch
method GetDoubleTripleHook (line 125) | private HookType? GetDoubleTripleHook(BiteType bite)
method Equals (line 148) | public override bool Equals(object? obj)
method GetHashCode (line 154) | public override int GetHashCode()
FILE: AutoHook/Configurations/old_config/CustomPresetConfig.cs
class BaitPresetConfig (line 3) | public class BaitPresetConfig
method BaitPresetConfig (line 13) | public BaitPresetConfig(string presetName)
method AddBaitConfig (line 21) | public void AddBaitConfig(BaitConfig baitConfig)
method RemoveBaitConfig (line 29) | public void RemoveBaitConfig(BaitConfig baitConfig)
method AddListOfHook (line 38) | public void AddListOfHook(List<BaitConfig> listOfBaits)
method Equals (line 43) | public override bool Equals(object? obj)
method GetHashCode (line 49) | public override int GetHashCode()
method RenamePreset (line 54) | public void RenamePreset(string name)
FILE: AutoHook/Configurations/old_config/OldHookConfig.cs
class OldHookConfig (line 3) | public class OldHookConfig
method ConvertV3ToV4 (line 70) | public void ConvertV3ToV4()
method Convert (line 85) | private void Convert(BaseHookset hookset, bool isIntuition)
FILE: AutoHook/Configurations/old_config/OldPresetConfig.cs
class OldPresetConfig (line 3) | public class OldPresetConfig(string presetName)
method ConvertV3ToV4 (line 17) | public void ConvertV3ToV4()
FILE: AutoHook/Data/IDs.cs
class IDs (line 3) | public static class IDs
class Actions (line 5) | public static class Actions
class Status (line 42) | public static class Status
class Item (line 65) | public static class Item
FILE: AutoHook/Enums/BaitType.cs
type BaitType (line 3) | public enum BaitType
FILE: AutoHook/Enums/BiteType.cs
type BiteType (line 3) | public enum BiteType : byte
FILE: AutoHook/Enums/FishingSteps.cs
type FishingSteps (line 3) | [Flags]
FILE: AutoHook/Enums/HookType.cs
type HookType (line 3) | public enum HookType : uint
FILE: AutoHook/Enums/IntuitionStatus.cs
type IntuitionStatus (line 3) | public enum IntuitionStatus
FILE: AutoHook/Enums/LureTarget.cs
type LureTarget (line 3) | public enum LureTarget : int
FILE: AutoHook/Enums/OpenWindow.cs
type OpenWindow (line 3) | public enum OpenWindow
FILE: AutoHook/Enums/SpectralCurrentStatus.cs
type SpectralCurrentStatus (line 3) | public enum SpectralCurrentStatus
FILE: AutoHook/Enums/SwimbaitAction.cs
type SwimbaitAction (line 3) | public enum SwimbaitAction
FILE: AutoHook/Enums/XivChatLog.cs
class XivChatLog (line 3) | public static class XivChatLog
FILE: AutoHook/Fishing/FishingManager.AutoCast.cs
class FishingManager (line 5) | public partial class FishingManager
method GetAutoCastCfg (line 7) | public AutoCastsConfig GetAutoCastCfg()
method CheckWhileFishingActions (line 12) | private void CheckWhileFishingActions()
method CastCollect (line 28) | private void CastCollect()
method UseAutoCasts (line 43) | private void UseAutoCasts()
method CastLineMoochOrRelease (line 68) | private void CastLineMoochOrRelease(AutoCastsConfig acCfg, FishConfig?...
method TryUseSwimbait (line 93) | private bool TryUseSwimbait(AutoCastsConfig acCfg, FishConfig? lastFis...
FILE: AutoHook/Fishing/FishingManager.Extra.cs
class FishingManager (line 3) | public partial class FishingManager
method GetExtraCfg (line 5) | public ExtraConfig GetExtraCfg()
method CheckExtraActions (line 12) | private void CheckExtraActions(ExtraConfig extraCfg)
method CheckSpectral (line 20) | private void CheckSpectral(ExtraConfig extraCfg)
method CheckIntuition (line 115) | private void CheckIntuition(ExtraConfig extraCfg)
method ExtraCfgGainedIntuition (line 143) | private void ExtraCfgGainedIntuition(ExtraConfig extraCfg)
method ExtraCfgLostIntuition (line 181) | private void ExtraCfgLostIntuition(ExtraConfig extraCfg)
method CheckAnglersArt (line 230) | private void CheckAnglersArt(ExtraConfig extraCfg)
method CheckSwimbait (line 270) | private void CheckSwimbait(ExtraConfig extraCfg)
FILE: AutoHook/Fishing/FishingManager.FishCaught.cs
class FishingManager (line 3) | public partial class FishingManager
method GetLastCatchConfig (line 5) | private FishConfig? GetLastCatchConfig()
method UseFishCaughtActions (line 13) | private bool UseFishCaughtActions(FishConfig? lastFishCatchCfg)
method CheckFishCaughtSwap (line 67) | private void CheckFishCaughtSwap(FishConfig? lastCatchCfg)
FILE: AutoHook/Fishing/FishingManager.Helper.cs
class FishingManager (line 8) | public partial class FishingManager
method CheckFishingState (line 11) | private void CheckFishingState()
method ResetAfkTimer (line 22) | private static void ResetAfkTimer()
method AnimationCancel (line 34) | private void AnimationCancel()
method OnMessageDelegate (line 46) | private void OnMessageDelegate(XivChatType type, int timeStamp, ref Se...
class FishingHelper (line 81) | public static class FishingHelper
method AddFishCount (line 89) | public static void AddFishCount(Guid guid)
method AddBaitSwap (line 97) | public static void AddBaitSwap(Guid guid)
method AddPresetSwap (line 103) | public static void AddPresetSwap(Guid guid)
method RemovePresetSwap (line 109) | public static void RemovePresetSwap(Guid guid)
method GetFishCount (line 115) | public static int GetFishCount(Guid guid)
method SwappedBait (line 120) | public static bool SwappedBait(Guid guid)
method SwappedPreset (line 125) | public static bool SwappedPreset(Guid guid)
method RemoveId (line 130) | public static void RemoveId(Guid guid)
method RemoveGuidQueue (line 142) | public static void RemoveGuidQueue()
method Reset (line 159) | public static void Reset()
FILE: AutoHook/Fishing/FishingManager.cs
class FishingManager (line 10) | public partial class FishingManager : IDisposable
method FishingManager (line 42) | public FishingManager()
method Dispose (line 56) | public void Dispose()
method CreateDalamudHooks (line 63) | public unsafe void CreateDalamudHooks()
method Enable (line 74) | private void Enable()
method Disable (line 82) | private void Disable()
method StartFishing (line 90) | public void StartFishing()
method UpdateStatusAndTimer (line 117) | private void UpdateStatusAndTimer()
method GetPresetName (line 153) | public string GetPresetName()
method GetHookCfg (line 175) | public HookConfig GetHookCfg()
method OnFrameworkUpdate (line 193) | private void OnFrameworkUpdate(IFramework _)
method InitFinishing (line 256) | private void InitFinishing()
method CheckPluginActions (line 266) | private void CheckPluginActions()
method OnBeganFishing (line 298) | private void OnBeganFishing(bool mooching)
method CheckTimeout (line 323) | private void CheckTimeout()
method OnBite (line 341) | private void OnBite()
method HookFish (line 355) | private void HookFish(BiteType bite, HookConfig currentHook)
method OnCatch (line 385) | private void OnCatch(uint fishId, uint amount)
method CheckStopCondition (line 409) | private void CheckStopCondition()
method OnFishingStop (line 456) | private void OnFishingStop()
method OnUseAction (line 471) | private bool OnUseAction(IntPtr manager, ActionType actionType, uint a...
method UpdateCatchDetour (line 504) | private void UpdateCatchDetour(IntPtr module, uint fishId, bool large,...
FILE: AutoHook/Fishing/FishingPresets.cs
class FishingPresets (line 5) | public class FishingPresets : BasePreset
method AddNewPreset (line 16) | public override void AddNewPreset(string presetName)
method AddNewPreset (line 23) | public override void AddNewPreset(BasePresetConfig preset)
method RemovePreset (line 33) | public override void RemovePreset(Guid value)
method OnSelectedPreset (line 49) | public override void OnSelectedPreset(BasePresetConfig newPreset, Base...
method SwapIndex (line 60) | public override void SwapIndex(int itemIndex, int targetIndex)
method AddNewFolder (line 72) | public void AddNewFolder(string folderName)
method RemoveFolder (line 79) | public void RemoveFolder(Guid folderId)
method IsPresetInAnyFolder (line 89) | public bool IsPresetInAnyFolder(Guid presetId)
method GetFolderContainingPreset (line 94) | public PresetFolder? GetFolderContainingPreset(Guid presetId)
FILE: AutoHook/IPC/AutoHookIPC.cs
class AutoHookIPC (line 5) | public class AutoHookIPC
method AutoHookIPC (line 9) | public AutoHookIPC()
method SetPluginState (line 14) | [EzIPC]
method GetPluginState (line 21) | [EzIPC]
method GetAutoStartFishing (line 27) | [EzIPC]
method SetAutoStartFishing (line 33) | [EzIPC]
method SetAutoGigState (line 40) | [EzIPC]
method SetPreset (line 47) | [EzIPC]
method SetPresetAutogig (line 56) | public void SetPresetAutogig(string preset)
method CreateAndSelectAnonymousPreset (line 64) | [EzIPC]
method ImportAndSelectPreset (line 78) | [EzIPC]
method DeleteSelectedPreset (line 94) | [EzIPC]
method DeleteAllAnonymousPresets (line 104) | [EzIPC]
method SwapBaitById (line 111) | [EzIPC]
method SwapBait (line 118) | [EzIPC]
method SwapSwimbaitByIndex (line 138) | [EzIPC]
FILE: AutoHook/PluginChangelog.cs
class PluginChangelog (line 5) | public static class PluginChangelog
class Version (line 603) | public class Version(string versionNumber)
FILE: AutoHook/PluginUI.cs
class PluginUi (line 19) | public class PluginUi : Window, IDisposable
method PluginUi (line 33) | public PluginUi() : base(
method Dispose (line 49) | public void Dispose()
method Draw (line 61) | public override void Draw()
method DrawOldLayout (line 78) | private void DrawOldLayout()
method Debug (line 134) | private void Debug()
method DrawNewLayout (line 162) | private void DrawNewLayout()
method DrawStatus (line 277) | private static void DrawStatus()
method DrawTabs (line 328) | private void DrawTabs()
method OnClose (line 371) | public override void OnClose()
method ShowKofi (line 376) | public static void ShowKofi()
method OpenBrowser (line 391) | private static void OpenBrowser(string url)
method DrawChangelog (line 399) | [Localizable(false)]
method TestButtons (line 464) | private static unsafe void TestButtons()
FILE: AutoHook/PresetCreator.cs
class PresetCreator (line 9) | public class PresetCreator
method DrawHeader (line 24) | private void DrawHeader()
method SetSelectedFish (line 46) | private void SetSelectedFish(ImportedFish fish)
method ResetOptions (line 52) | private void ResetOptions()
method DrawPresetGenerator (line 65) | public void DrawPresetGenerator()
method GeneratePreset (line 152) | private void GeneratePreset(List<ImportedFish> moochList, List<(Import...
method SetupFishEyes (line 222) | private void SetupFishEyes(CustomPresetConfig newPreset)
method SetupIntPrep (line 244) | private void SetupIntPrep(CustomPresetConfig newPreset, List<(Imported...
method SetupBaitAndMooch (line 264) | private void SetupBaitAndMooch(CustomPresetConfig newPreset, int bait,...
method CreateAnglerPreset (line 368) | private CustomPresetConfig CreateAnglerPreset()
method CreateAnglerPresetTest (line 389) | private CustomPresetConfig CreateAnglerPresetTest()
method GetBiteType (line 413) | private static string GetBiteType(BiteType bite)
method SetupSparefulHandPrep (line 422) | private void SetupSparefulHandPrep(CustomPresetConfig newPreset)
FILE: AutoHook/Resources/Localization/UIStrings.Designer.cs
class UIStrings (line 22) | [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resource...
method UIStrings (line 31) | [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Mic...
FILE: AutoHook/SeFunctions/BaitManager.cs
class BaitManager (line 8) | public unsafe class BaitManager
method ChangeBait (line 81) | public ChangeBaitReturn ChangeBait(uint baitId)
method ChangeSwimbait (line 95) | public ChangeBaitReturn ChangeSwimbait(uint index)
method ChangeBait (line 103) | public ChangeBaitReturn ChangeBait(BaitFishClass bait)
method GetSwimbaitCount (line 126) | public int GetSwimbaitCount()
method GetSwimbaitCountForFish (line 132) | public int GetSwimbaitCountForFish(uint fishId)
method IsSwimbaitFull (line 138) | public bool IsSwimbaitFull() => GetSwimbaitCount() >= 3;
method IsSwimbaitEmpty (line 139) | public bool IsSwimbaitEmpty() => GetSwimbaitCount() == 0;
method IsMooching (line 146) | public bool IsMooching() => GameRes.MoochableFish.Any(f => f.Id == Cur...
method GetCurrentBaitMoochId (line 154) | public int GetCurrentBaitMoochId(int? fallbackId = null, bool isMoochi...
type ChangeBaitReturn (line 167) | public enum ChangeBaitReturn
FILE: AutoHook/SeFunctions/SeAddressBase.cs
class SeAddressBase (line 5) | public class SeAddressBase
method SeAddressBase (line 9) | public SeAddressBase(ISigScanner sigScanner, string signature, int off...
FILE: AutoHook/SeFunctions/SeFunctionBase.cs
class SeFunctionBase (line 8) | public class SeFunctionBase<T> where T : Delegate
method SeFunctionBase (line 13) | public SeFunctionBase(SigScanner sigScanner, int offset)
method SeFunctionBase (line 18) | public SeFunctionBase(ISigScanner sigScanner, string signature, int of...
method Delegate (line 26) | public T? Delegate()
method Invoke (line 41) | public dynamic? Invoke(params dynamic[] parameters)
method CreateHook (line 58) | public Hook<T>? CreateHook(T detour)
FILE: AutoHook/SeFunctions/SeTugType.cs
class SeTugType (line 5) | public sealed class SeTugType(ISigScanner sigScanner) : SeAddressBase(si...
FILE: AutoHook/Service.cs
class Service (line 8) | public class Service
method Initialize (line 10) | public static void Initialize(IDalamudPluginInterface pluginInterface)
method Save (line 38) | public static void Save()
method PrintDebug (line 46) | public static void PrintDebug(string msg)
method PrintVerbose (line 57) | public static void PrintVerbose(string msg)
method PrintChat (line 68) | public static void PrintChat(string msg)
FILE: AutoHook/Spearfishing/AutoGig.cs
class AutoGig (line 14) | internal class AutoGig : Window, IDisposable
method AutoGig (line 40) | public AutoGig() : base(@"SpearfishingHelper", WindowFlags, true)
method Condition_ConditionChange (line 48) | private void Condition_ConditionChange(Dalamud.Game.ClientState.Condit...
method Dispose (line 57) | public void Dispose()
method Draw (line 64) | public override void Draw()
method DrawSettings (line 70) | public unsafe void DrawSettings()
method DrawFishOverlay (line 108) | private unsafe void DrawFishOverlay()
method GigFish (line 147) | private unsafe void GigFish(SpearfishWindow.Info info, AtkResNode* node)
method CheckFish (line 202) | private BaseGig? CheckFish(SpearfishWindow.Info info)
method GetCatchAllGig (line 226) | private BaseGig? GetCatchAllGig()
method DrawGigHitbox (line 231) | private unsafe void DrawGigHitbox(ImDrawListPtr drawList, int gigHitbox)
method DrawFishHitbox (line 253) | private unsafe void DrawFishHitbox(ImDrawListPtr drawList, float fishH...
method DrawConditions (line 271) | public override unsafe bool DrawConditions()
method SetFishTargets (line 287) | private void SetFishTargets()
method PreDraw (line 294) | public override unsafe void PreDraw()
FILE: AutoHook/Spearfishing/Enums/SpearfishSize.cs
type SpearfishSize (line 3) | public enum SpearfishSize : byte
class SpearFishSizeExtensions (line 12) | public static class SpearFishSizeExtensions
method ToName (line 14) | public static string ToName(this SpearfishSize size)
FILE: AutoHook/Spearfishing/Enums/SpearfishSpeed.cs
type SpearfishSpeed (line 3) | public enum SpearfishSpeed : ushort
class SpearFishSpeedExtensions (line 20) | public static class SpearFishSpeedExtensions
method ToName (line 22) | public static string ToName(this SpearfishSpeed speed)
FILE: AutoHook/Spearfishing/SpearFishingPresets.cs
class SpearFishingPresets (line 6) | public class SpearFishingPresets : BasePreset
method AddNewPreset (line 30) | public override void AddNewPreset(string presetName)
method AddNewPreset (line 38) | public override void AddNewPreset(BasePresetConfig preset)
method RemovePreset (line 48) | public override void RemovePreset(Guid value)
method SwapIndex (line 58) | public override void SwapIndex(int itemIndex, int targetIndex)
FILE: AutoHook/Spearfishing/Struct/SpearfishWindow.cs
type SpearfishWindow (line 7) | [StructLayout(LayoutKind.Explicit)]
type Info (line 13) | [StructLayout(LayoutKind.Explicit)]
FILE: AutoHook/Ui/BaseTab.cs
class BaseTab (line 5) | public abstract class BaseTab : IDisposable
method DrawHeader (line 14) | public abstract void DrawHeader();
method Draw (line 16) | public abstract void Draw();
method Dispose (line 18) | public virtual void Dispose()
method DrawTabDescription (line 22) | public void DrawTabDescription(string tabDescription)
FILE: AutoHook/Ui/SubTabAutoCast.cs
class SubTabAutoCast (line 9) | public class SubTabAutoCast
method DrawAutoCastTab (line 15) | public static void DrawAutoCastTab(CustomPresetConfig presetCfg)
method DrawHeader (line 40) | private static void DrawHeader(AutoCastsConfig acCfg)
method DrawBody (line 81) | private static void DrawBody(AutoCastsConfig acCfg)
FILE: AutoHook/Ui/SubTabBaitMooch.cs
class SubTabBaitMooch (line 10) | public class SubTabBaitMooch
method DrawHookTab (line 14) | public static void DrawHookTab(CustomPresetConfig preset)
method DrawBody (line 36) | private static void DrawBody(List<HookConfig> list, bool isMooch)
method DrawInputSearchBar (line 128) | private static void DrawInputSearchBar(HookConfig hookConfig, bool isM...
method DrawDeleteButton (line 157) | private static void DrawDeleteButton(HookConfig hookConfig)
method DrawSwimbaitUsage (line 175) | private static void DrawSwimbaitUsage(HookConfig hookConfig)
FILE: AutoHook/Ui/SubTabExtra.cs
class SubTabExtra (line 10) | public class SubTabExtra
method DrawExtraTab (line 14) | public static void DrawExtraTab(CustomPresetConfig preset)
method DrawHeader (line 25) | public static void DrawHeader(ExtraConfig config)
method DrawBody (line 65) | public static void DrawBody(ExtraConfig config)
method DrawSpectralCurrent (line 130) | private static void DrawSpectralCurrent(ExtraConfig config)
method DrawFishersIntuition (line 146) | private static void DrawFishersIntuition(ExtraConfig config)
method DrawAnglersArt (line 170) | private static void DrawAnglersArt(ExtraConfig config)
method DrawPresetSwap (line 207) | private static void DrawPresetSwap(ref bool enable, ref string presetN...
method DrawBaitSwap (line 227) | private static void DrawBaitSwap(ref bool enable, ref BaitFishClass ba...
method DrawSwimbait (line 247) | private static void DrawSwimbait(ExtraConfig config)
FILE: AutoHook/Ui/SubTabFish.cs
class SubTabFish (line 10) | public class SubTabFish
method DrawFishTab (line 14) | public static void DrawFishTab(CustomPresetConfig presetCfg)
method DrawDescription (line 78) | private static void DrawDescription(List<FishConfig> list)
method DrawDeleteButton (line 108) | private static void DrawDeleteButton(FishConfig fishConfig)
method DrawFishSearchBar (line 124) | private static void DrawFishSearchBar(FishConfig fishConfig)
method DrawSurfaceSlapIdenticalCast (line 136) | private static void DrawSurfaceSlapIdenticalCast(FishConfig fishConfig)
method DrawMultihook (line 152) | private static void DrawMultihook(FishConfig fishConfig)
method DrawMooch (line 164) | private static void DrawMooch(FishConfig fishConfig)
method DrawSparefulHand (line 183) | private static void DrawSparefulHand(FishConfig fishConfig)
method DrawSwapBait (line 209) | private static void DrawSwapBait(FishConfig fishConfig)
method DrawSwapPreset (line 244) | private static void DrawSwapPreset(FishConfig fishConfig)
method DrawStopAfter (line 277) | private static void DrawStopAfter(FishConfig fishConfig)
FILE: AutoHook/Ui/TabAutoGig.cs
class TabAutoGig (line 9) | internal class TabAutoGig : BaseTab
method DrawHeader (line 18) | public override void DrawHeader()
method Draw (line 66) | public override void Draw()
method DrawPresetSelector (line 100) | public void DrawPresetSelector()
FILE: AutoHook/Ui/TabCommunity.cs
class TabCommunity (line 14) | public class TabCommunity : BaseTab
method DrawHeader (line 26) | public override void DrawHeader()
method Draw (line 30) | public override void Draw()
method DrawHeaderList (line 74) | private void DrawHeaderList(string tab, List<BasePresetConfig> list, D...
method ImportAllPresets (line 349) | private static void ImportAllPresets(List<BasePresetConfig> list)
method ImportPreset (line 384) | public static void ImportPreset(BasePresetConfig preset)
method OpenWiki (line 417) | private static void OpenWiki()
FILE: AutoHook/Ui/TabDebug.cs
class TabDebug (line 15) | public class TabDebug : BaseTab
method TabDebug (line 22) | public TabDebug()
method CreateDalamudHooks (line 29) | private unsafe void CreateDalamudHooks()
method ExecuteCommandDetour (line 37) | private unsafe byte ExecuteCommandDetour(int id, int unk1, uint baitId...
method DrawHeader (line 53) | public override void DrawHeader()
type RepairStatus (line 60) | enum RepairStatus
method Draw (line 70) | public override unsafe void Draw()
method ProcessRepair (line 161) | private static bool ProcessRepair()
method RepairFailed (line 171) | private void RepairFailed(TaskManagerTask task, ref long ms)
method ListWikiPages (line 198) | public static async Task ListWikiPages()
method GetWikiPageUrls (line 210) | static async Task<List<string>> GetWikiPageUrls(string url)
method ExtractBase64FromWikiPage (line 228) | static async Task<List<string>> ExtractBase64FromWikiPage(string url)
method Dispose (line 234) | public override void Dispose()
method Checkoffsets (line 240) | public unsafe void Checkoffsets()
FILE: AutoHook/Ui/TabFishingPresets.cs
class TabFishingPresets (line 12) | public class TabFishingPresets : BaseTab
method DrawHeader (line 41) | public override void DrawHeader()
method DrawPresetGenTab (line 49) | private void DrawPresetGenTab()
method Draw (line 60) | public override void Draw()
method DrawList (line 74) | private void DrawList()
method DrawFolder (line 157) | private void DrawFolder(PresetFolder folder, int folderIndex)
method DrawItemInFolder (line 304) | private void DrawItemInFolder(CustomPresetConfig preset, int i, Preset...
method DrawItem (line 386) | private void DrawItem(CustomPresetConfig preset, int i)
method DrawPresetOptions (line 460) | private void DrawPresetOptions(BasePresetConfig? preset)
method DrawPresetButtons (line 470) | private void DrawPresetButtons()
method DrawCombinedImport (line 491) | private void DrawCombinedImport()
method DrawCreateFolderPopup (line 710) | private void DrawCreateFolderPopup()
method DrawRenameFolderPopup (line 747) | private void DrawRenameFolderPopup()
method DrawFolderContextMenu (line 796) | private void DrawFolderContextMenu(PresetFolder folder)
method DrawPresetContext (line 874) | public static void DrawPresetContext(BasePresetConfig preset)
method CopyPreset (line 923) | private static void CopyPreset(BasePresetConfig preset)
FILE: AutoHook/Ui/TabGlobalPreset.cs
class TabGlobalPreset (line 5) | internal class TabGlobalPreset : BaseTab
method DrawHeader (line 11) | public override void DrawHeader()
method Draw (line 16) | public override void Draw()
FILE: AutoHook/Ui/TabSettings.cs
class TabSettings (line 10) | public class TabSettings : BaseTab
method DrawHeader (line 17) | public override void DrawHeader()
method Draw (line 43) | public override void Draw()
method DrawConfigs (line 51) | private void DrawConfigs()
method DrawDelayHook (line 103) | private static void DrawDelayHook()
method DrawDelayCasts (line 131) | private static void DrawDelayCasts()
method DrawDelayCancel (line 158) | private static void DrawDelayCancel()
method DrawLanguageSelector (line 187) | private void DrawLanguageSelector()
FILE: AutoHook/Utils/DrawUtil.cs
class DrawUtil (line 12) | public static class DrawUtil
method NumericDisplay (line 14) | public static void NumericDisplay(string label, int value)
method NumericDisplay (line 21) | public static void NumericDisplay(string label, string formattedString)
method NumericDisplay (line 28) | public static void NumericDisplay(string label, int value, Vector4 color)
method EditFloatField (line 35) | public static bool EditFloatField(string label, ref float refValue, st...
method EditFloatField (line 41) | public static bool EditFloatField(string label, float fieldWidth, ref ...
method EditNumberField (line 69) | public static bool EditNumberField(string label, ref int refValue, str...
method EditNumberField (line 79) | public static bool EditNumberField(string label, float fieldWidth, ref...
method TextV (line 98) | public static void TextV(string s)
method Info (line 109) | public static void Info(string text)
method HoveredTooltip (line 124) | public static void HoveredTooltip(string text)
method SubCheckbox (line 130) | public static bool SubCheckbox(string label, ref bool refValue, string...
method Checkbox (line 137) | public static bool Checkbox(string label, ref bool refValue, string he...
method DrawWordWrappedString (line 161) | public static void DrawWordWrappedString(string message)
method DrawComboSelector (line 198) | public static void DrawComboSelector<T>(
method DrawComboSelectorPreset (line 241) | public static void DrawComboSelectorPreset(BasePreset presetList)
method DrawRenamePreset (line 302) | public static void DrawRenamePreset(BasePresetConfig selectedPreset)
method DrawAddNewPresetButton (line 326) | public static void DrawAddNewPresetButton(BasePreset presetConfig)
method DrawImportExport (line 351) | public static void DrawImportExport(BasePreset basePreset)
method DrawImportPreset (line 416) | public static void DrawImportPreset(BasePreset hookPresets)
method DrawDeletePresetButton (line 467) | public static void DrawDeletePresetButton(BasePreset itemList)
method DrawCheckboxTree (line 483) | public static void DrawCheckboxTree(string treeName, ref bool enable, ...
method DrawTreeNodeEx (line 537) | public static void DrawTreeNodeEx(string treeName, Action action, stri...
method DrawButtonPopupType0 (line 577) | public static void DrawButtonPopupType0(string popupName, Action actio...
method DrawButtonPopupType1 (line 611) | public static void DrawButtonPopupType1(string popupName, Action actio...
method SpacingSeparator (line 636) | public static void SpacingSeparator()
FILE: AutoHook/Utils/EzDtr2.cs
class EzDtr2 (line 7) | public class EzDtr2 : IDisposable
method EzDtr2 (line 21) | public EzDtr2(Func<SeString> text, Action? onClick = null, string? tit...
method EzDtr2 (line 32) | public EzDtr2(Func<SeString> text, Action<DtrInteractionEvent>? onClic...
method OnUpdate (line 43) | internal void OnUpdate(object _)
method Dispose (line 59) | public void Dispose()
method DisposeAll (line 66) | public static void DisposeAll() => Registered.ToArray().Each(x => x.Di...
FILE: AutoHook/Utils/GameRes.cs
class GameRes (line 8) | public static class GameRes
method Initialize (line 22) | public static void Initialize()
FILE: AutoHook/Utils/InputUtil.cs
class InputUtil (line 7) | internal static class InputUtil
method FindWindowEx (line 12) | [DllImport("user32.dll", CharSet = CharSet.Unicode)]
method GetWindowThreadProcessId (line 15) | [DllImport("user32.dll")]
method SendMessage (line 18) | [DllImport("user32.dll")]
method TryFindGameWindow (line 21) | public static bool TryFindGameWindow(out IntPtr hwnd)
method SendKeycode (line 34) | public static void SendKeycode(IntPtr hwnd, int keycode)
FILE: AutoHook/Utils/MultiString.cs
type MultiString (line 7) | public readonly struct MultiString
method ParseSeString (line 9) | public static string ParseSeString(ReadOnlySeString? luminaString)
method GetStatusName (line 12) | public static string GetStatusName(uint statusId)
method GetActionName (line 17) | public static string GetActionName(uint id)
method GetItemName (line 22) | public static string GetItemName(uint id)
method GetItemName (line 39) | public static string GetItemName(int id)
FILE: AutoHook/Utils/PlayerRes.cs
class PlayerRes (line 8) | public static class PlayerRes
method IsMoochAvailable (line 10) | public static bool IsMoochAvailable()
method HasStatus (line 21) | public static bool HasStatus(uint statusID)
method HasAnyStatus (line 35) | public static bool HasAnyStatus(uint[] statusIDs)
method IsInActiveSpectralCurrent (line 43) | public static unsafe bool IsInActiveSpectralCurrent()
method GetCurrentGp (line 51) | public static uint GetCurrentGp()
method GetMaxGp (line 59) | public static uint GetMaxGp()
method GetStatusStacks (line 67) | public static int GetStatusStacks(uint status)
method HasAnglersArtStacks (line 81) | public static bool HasAnglersArtStacks(int amount)
method GetStatusTime (line 95) | public static float GetStatusTime(uint statusId)
method ActionTypeAvailable (line 111) | public static unsafe bool ActionTypeAvailable(uint id, ActionType acti...
method IsCastAvailable (line 116) | public static unsafe bool IsCastAvailable()
method HasMultihookAvailable (line 121) | public static unsafe bool HasMultihookAvailable()
method ActionOnCoolDown (line 134) | public static unsafe bool ActionOnCoolDown(uint id, ActionType actionT...
method ActionStatus (line 146) | public static unsafe uint ActionStatus(uint id, ActionType actionType ...
method CastAction (line 151) | public static unsafe bool CastAction(uint id)
method GetRecastGroups (line 156) | public static unsafe int GetRecastGroups(uint id, ActionType actionTyp...
method HasItem (line 161) | public static unsafe int HasItem(uint itemId)
method UseItems (line 164) | public static unsafe void UseItems(uint id)
method IsPotOffCooldown (line 170) | public static unsafe bool IsPotOffCooldown()
method CastActionCost (line 176) | public static unsafe uint CastActionCost(uint id, ActionType actionTyp...
method GetCooldown (line 181) | public static unsafe float GetCooldown(uint id, ActionType actionType)
method HaveItemInInventory (line 193) | public static unsafe bool HaveItemInInventory(uint id, bool isHQ = false)
method HaveCordialInInventory (line 196) | public static unsafe bool HaveCordialInInventory(uint id)
method CastActionDelayed (line 203) | public static void CastActionDelayed(uint actionId, ActionType actionT...
method CastActionNoDelay (line 246) | public static void CastActionNoDelay(uint actionId, ActionType actionT...
method DelayNextCast (line 272) | public static async void DelayNextCast(uint actionId)
method ConditionalDelay (line 290) | private static int ConditionalDelay(uint id)
FILE: AutoHook/Utils/SignaturePatterns.cs
class SignaturePatterns (line 3) | public static class SignaturePatterns
FILE: AutoHook/Utils/WikiPresets.cs
class WikiPresets (line 10) | public static partial class WikiPresets
method Ah (line 16) | [GeneratedRegex("```\\s*(AH(?:[1-4]|FOLDER)\\s*[\\s\\S]*?)\\s*```", Re...
method Ahsf (line 17) | [GeneratedRegex("```\\s*(AHSF1\\s*[\\s\\S]*?)\\s*```", RegexOptions.Mu...
method ListWikiPages (line 22) | public static async Task ListWikiPages()
method GetWikiPageUrls (line 61) | static async Task<List<string>> GetWikiPageUrls(string url)
method ExtractBase64FromWikiPage (line 78) | static async Task<(List<string> presets, List<string> presetsSf)> Extr...
FILE: update_bite_timers.py
function fetch_bite_data (line 5) | def fetch_bite_data():
function calculate_quantile (line 41) | def calculate_quantile(data_points, target_quantile):
function calculate_statistics (line 54) | def calculate_statistics(bite_time_series):
function process_bite_data (line 87) | def process_bite_data(bite_data):
function main (line 104) | def main():
Condensed preview — 125 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,552K chars).
[
{
"path": ".editorconfig",
"chars": 25220,
"preview": "root = true\n\n# C# files\n[*.cs]\n\n#### Core EditorConfig Options ####\n\nindent_style = space\nindent_size = 4\ntab_width = 4\n"
},
{
"path": ".github/FUNDING.yml",
"chars": 775,
"preview": "# These are supported funding model platforms\n\ngithub: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [u"
},
{
"path": ".github/workflows/publish.yml",
"chars": 303,
"preview": "on:\n push:\n tags:\n - 'v*.*.*.*'\n\npermissions:\n contents: read\n\njobs:\n publish:\n runs-on: ubuntu-latest\n "
},
{
"path": ".github/workflows/update-bite-timers.yml",
"chars": 1159,
"preview": "name: Update Bite Timers\n\non:\n schedule:\n - cron: '0 0 1 * *' # Runs on the first day of each month\n workflow_disp"
},
{
"path": ".gitignore",
"chars": 41,
"preview": ".vs/\r\nobj/\r\nbin/\r\ndist/\r\n*.user\r\n.idea/\r\n"
},
{
"path": ".gitmodules",
"chars": 88,
"preview": "[submodule \"PunishLib\"]\n\tpath = PunishLib\n\turl = https://github.com/PunishXIV/PunishLib\n"
},
{
"path": "AcceptCollectable.md",
"chars": 1059,
"preview": "# Auto accept collectable popup\nTheres an amazing plugin also published by Puni.sh called YesAlready that can help us wi"
},
{
"path": "AutoHook/AutoHook.cs",
"chars": 8206,
"preview": "using AutoHook.IPC;\r\nusing AutoHook.Spearfishing;\r\nusing Dalamud.Game.Command;\r\nusing Dalamud.Game.Gui.Dtr;\r\nusing Dala"
},
{
"path": "AutoHook/AutoHook.csproj",
"chars": 1753,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<Project Sdk=\"Dalamud.NET.Sdk/14.0.1\">\r\n <PropertyGroup>\r\n <Authors>D"
},
{
"path": "AutoHook/AutoHook.csproj.DotSettings",
"chars": 504,
"preview": "<wpf:ResourceDictionary xml:space=\"preserve\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" xmlns:s=\"clr-namesp"
},
{
"path": "AutoHook/AutoHook.json",
"chars": 509,
"preview": "{\n \"Author\": \"Det\",\n \"Name\": \"AutoHook\",\n \"Punchline\": \"Makes fishing less (or more) boring\",\n \"Description\""
},
{
"path": "AutoHook/Classes/AutoCasts/AutoBigGameFishing.cs",
"chars": 1472,
"preview": "namespace AutoHook.Classes.AutoCasts;\n\npublic class AutoBigGameFishing : BaseActionCast\n{\n public int AnglersStacks "
},
{
"path": "AutoHook/Classes/AutoCasts/AutoCastLine.cs",
"chars": 1463,
"preview": "using System.ComponentModel;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoCastLine : BaseActionCast\n{\n p"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoChum.cs",
"chars": 1506,
"preview": "namespace AutoHook.Classes.AutoCasts;\n\npublic class AutoChum : BaseActionCast\n{\n public bool _onlyUseWithIntuition;\n"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoCollect.cs",
"chars": 659,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoCollect : BaseActi"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoCordial.cs",
"chars": 3113,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoCordial : BaseActi"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoDoubleHook.cs",
"chars": 608,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoDoubleHook : BaseA"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoFishEyes.cs",
"chars": 1267,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoFishEyes : BaseAct"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoFood.cs",
"chars": 735,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoFood : BaseActionC"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoIdenticalCast.cs",
"chars": 2395,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\nusing Dalamud.Bindings.ImGui;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npubli"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoLures.cs",
"chars": 5058,
"preview": "using Dalamud.Bindings.ImGui;\nusing ECommons.Throttlers;\nusing FFXIVClientStructs.FFXIV.Client.Game.Event;\n\nnamespace A"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoMakeShiftBait.cs",
"chars": 2442,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoMakeShiftBait : Ba"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoMooch.cs",
"chars": 1512,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoMooch : BaseActionC"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoMooch2.cs",
"chars": 650,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoMooch2 : BaseActio"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoMultiHook.cs",
"chars": 1231,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoMultiHook : BaseAct"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoPatience.cs",
"chars": 2258,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\nusing Dalamud.Bindings.ImGui;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npubli"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoPrizeCatch.cs",
"chars": 1917,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoPrizeCatch : BaseA"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoReleaseFish.cs",
"chars": 541,
"preview": "namespace AutoHook.Classes.AutoCasts;\r\n\r\npublic class AutoReleaseFish : BaseActionCast\r\n{\r\n public AutoReleaseFish()"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoSparefulHand.cs",
"chars": 1031,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoSparefulHand : Bas"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoSurfaceSlap.cs",
"chars": 1031,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoSurfaceSlap : Base"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoThaliaksFavor.cs",
"chars": 2145,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoThaliaksFavor : Ba"
},
{
"path": "AutoHook/Classes/AutoCasts/AutoTripleHook.cs",
"chars": 609,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\n\nnamespace AutoHook.Classes.AutoCasts;\n\npublic class AutoTripleHook : BaseA"
},
{
"path": "AutoHook/Classes/BaitFishClass.cs",
"chars": 1477,
"preview": "using ECommons.MathHelpers;\r\nusing System.Text.Json.Serialization;\r\nusing FishRow = Lumina.Excel.Sheets.FishParameter;\r"
},
{
"path": "AutoHook/Classes/BaseActionCast.cs",
"chars": 8118,
"preview": "using Dalamud.Interface.Colors;\nusing Dalamud.Interface.Utility;\nusing FFXIVClientStructs.FFXIV.Client.Game;\nusing Dalam"
},
{
"path": "AutoHook/Classes/BaseBiteConfig.cs",
"chars": 9048,
"preview": "using Dalamud.Bindings.ImGui;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Components;\nusing Dalamud.Interfac"
},
{
"path": "AutoHook/Classes/BaseGig.cs",
"chars": 2548,
"preview": "using System.ComponentModel;\nusing AutoHook.Spearfishing.Enums;\n\nnamespace AutoHook.Classes;\n\npublic class BaseGig(int "
},
{
"path": "AutoHook/Classes/BaseHookset.cs",
"chars": 7718,
"preview": "using Dalamud.Interface.Colors;\nusing Dalamud.Interface.Components;\nusing Dalamud.Interface.Utility;\nusing Dalamud.Bind"
},
{
"path": "AutoHook/Classes/BaseOption.cs",
"chars": 172,
"preview": "namespace AutoHook.Classes;\n\npublic abstract class BaseOption\n{\n public Guid UniqueId { get; private set; } = Guid.N"
},
{
"path": "AutoHook/Classes/BasePreset.cs",
"chars": 1553,
"preview": "using Newtonsoft.Json;\n\nnamespace AutoHook.Classes;\n\npublic abstract class BasePreset\n{\n public string SelectedGuid "
},
{
"path": "AutoHook/Classes/BasePresetConfig.cs",
"chars": 530,
"preview": "using Newtonsoft.Json;\n\nnamespace AutoHook.Classes;\n\npublic abstract class BasePresetConfig()\n{\n public string Prese"
},
{
"path": "AutoHook/Classes/BiteTimers.cs",
"chars": 405,
"preview": "namespace AutoHook.Classes;\n\npublic class BiteTimers\n{\n public int itemId { get; set; }\n\n public double min { get"
},
{
"path": "AutoHook/Classes/ImportedFish.cs",
"chars": 1152,
"preview": "using AutoHook.Spearfishing.Enums;\n\nnamespace AutoHook.Classes;\n\npublic class ImportedFish\n{\n public int ItemId { ge"
},
{
"path": "AutoHook/Classes/PresetFolder.cs",
"chars": 695,
"preview": "namespace AutoHook.Classes;\n\npublic class PresetFolder(string folderName)\n{\n public Guid UniqueId { get; set; } = Gui"
},
{
"path": "AutoHook/Configurations/AutoCastsConfig.cs",
"chars": 3728,
"preview": "using FFXIVClientStructs.FFXIV.Client.System.Framework;\nusing System.ComponentModel;\n\nnamespace AutoHook.Configurations;"
},
{
"path": "AutoHook/Configurations/AutoGigConfig.cs",
"chars": 2674,
"preview": "using Dalamud.Interface;\nusing Dalamud.Interface.Utility.Raii;\nusing Dalamud.Bindings.ImGui;\n\nnamespace AutoHook.Config"
},
{
"path": "AutoHook/Configurations/Configuration.cs",
"chars": 13810,
"preview": "using Dalamud.Configuration;\r\nusing Newtonsoft.Json;\r\nusing System.ComponentModel;\r\nusing System.IO.Compression;\r\nusing"
},
{
"path": "AutoHook/Configurations/CustomPresetConfig.cs",
"chars": 5041,
"preview": "using System.Text.Json.Serialization;\nusing AutoHook.Ui;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Utility"
},
{
"path": "AutoHook/Configurations/ExtraConfig.cs",
"chars": 1869,
"preview": "namespace AutoHook.Configurations;\n\npublic class ExtraConfig : BaseOption\n{\n public bool Enabled = false;\n\n publi"
},
{
"path": "AutoHook/Configurations/FishConfig.cs",
"chars": 1360,
"preview": "using System.ComponentModel;\n\nnamespace AutoHook.Configurations;\n\npublic class FishConfig : BaseOption\n{\n [DefaultVal"
},
{
"path": "AutoHook/Configurations/HookConfig.cs",
"chars": 12575,
"preview": "using System.ComponentModel;\n\nnamespace AutoHook.Configurations;\n\npublic class HookConfig : BaseOption\n{\n [DefaultVal"
},
{
"path": "AutoHook/Configurations/old_config/BaitConfig.cs",
"chars": 5121,
"preview": "namespace AutoHook.Configurations.old_config;\r\n\r\npublic class BaitConfig(string bait)\r\n{\r\n /* old config, dont use*/"
},
{
"path": "AutoHook/Configurations/old_config/CustomPresetConfig.cs",
"chars": 1537,
"preview": "namespace AutoHook.Configurations.old_config;\r\n\r\npublic class BaitPresetConfig\r\n{\r\n /* old config, dont use*/\r\n p"
},
{
"path": "AutoHook/Configurations/old_config/OldHookConfig.cs",
"chars": 7154,
"preview": "namespace AutoHook.Configurations.old_config;\n\npublic class OldHookConfig\n{\n public bool Enabled = true;\n\n public "
},
{
"path": "AutoHook/Configurations/old_config/OldPresetConfig.cs",
"chars": 673,
"preview": "namespace AutoHook.Configurations.old_config;\n\npublic class OldPresetConfig(string presetName)\n{\n public string Prese"
},
{
"path": "AutoHook/Data/FishData/bitetimers.json",
"chars": 268258,
"preview": "[\n {\n \"itemId\": 4776,\n \"min\": 3,\n \"median\": 19,\n \"mean\": 18.664815471267083,\n \"max\": 29,\n \"whiskerMin"
},
{
"path": "AutoHook/Data/FishData/fish_list.json",
"chars": 913226,
"preview": "[\n {\n \"ItemId\": 28065,\n \"HookType\": 4179,\n \"BiteType\": 38,\n \"InitialBait\": 27589,\n \"Mooches\": [],\n \"N"
},
{
"path": "AutoHook/Data/FishData/fish_list_64.txt",
"chars": 19253,
"preview": "H4sIAAAAAAAACuV9TY8kuZHlf6lzHpz0D5J9nMNiG9jFLKC5DebQ0JSgxmrUQqu0wO5g/vsaIyIzwxme4f7CnfRHmgZRmorOUtczGo3Pvv/1P7/9/OP7f/z8"
},
{
"path": "AutoHook/Data/IDs.cs",
"chars": 1963,
"preview": "namespace AutoHook.Data;\n\npublic static class IDs\n{\n public static class Actions\n {\n public const uint\n "
},
{
"path": "AutoHook/Enums/BaitType.cs",
"chars": 99,
"preview": "namespace AutoHook.Enums;\n\npublic enum BaitType\n{\n Bait,\n Mooch,\n Swimbait,\n Unknown\n}"
},
{
"path": "AutoHook/Enums/BiteType.cs",
"chars": 144,
"preview": "namespace AutoHook.Enums;\n\npublic enum BiteType : byte\n{\n Unknown = 0,\n Weak = 36,\n Strong = 37,\n Legendary "
},
{
"path": "AutoHook/Enums/FishingSteps.cs",
"chars": 339,
"preview": "namespace AutoHook.Enums;\n\n[Flags]\npublic enum FishingSteps\n{\n None = 0x01,\n BeganFishing = 0x02,\n BeganMoochin"
},
{
"path": "AutoHook/Enums/HookType.cs",
"chars": 316,
"preview": "namespace AutoHook.Enums;\n\npublic enum HookType : uint\n{\n None = 0,\n Normal = IDs.Actions.Hook,\n Precision = ID"
},
{
"path": "AutoHook/Enums/IntuitionStatus.cs",
"chars": 116,
"preview": "namespace AutoHook.Enums;\r\n\r\npublic enum IntuitionStatus\r\n{\r\n NotActive,\r\n Gained,\r\n Active,\r\n Lost,\r\n}"
},
{
"path": "AutoHook/Enums/LureTarget.cs",
"chars": 109,
"preview": "namespace AutoHook.Enums;\n\npublic enum LureTarget : int\n{\n Any = 0,\n Special = 1,\n NotSpecial = 2\n}"
},
{
"path": "AutoHook/Enums/OpenWindow.cs",
"chars": 158,
"preview": "namespace AutoHook.Enums;\n\npublic enum OpenWindow\n{\n None,\n Global,\n FishingPreset,\n AutoGig,\n Settings,"
},
{
"path": "AutoHook/Enums/SpectralCurrentStatus.cs",
"chars": 114,
"preview": "namespace AutoHook.Enums;\n\npublic enum SpectralCurrentStatus\n{\n NotActive,\n Gained,\n Active,\n Lost,\n}"
},
{
"path": "AutoHook/Enums/SwimbaitAction.cs",
"chars": 106,
"preview": "namespace AutoHook.Enums;\n\npublic enum SwimbaitAction\n{\n None = 0,\n SwapPreset = 1,\n Stop = 2,\n}\n"
},
{
"path": "AutoHook/Enums/XivChatLog.cs",
"chars": 171,
"preview": "namespace AutoHook.Enums;\n\npublic static class XivChatLog\n{\n public const uint\n CantFish = 3516,\n AmbL"
},
{
"path": "AutoHook/Fishing/FishingManager.AutoCast.cs",
"chars": 5755,
"preview": "using ECommons.Throttlers;\n\nnamespace AutoHook.Fishing;\n\npublic partial class FishingManager\n{\n public AutoCastsConf"
},
{
"path": "AutoHook/Fishing/FishingManager.Extra.cs",
"chars": 12732,
"preview": "namespace AutoHook.Fishing;\n\npublic partial class FishingManager\n{\n public ExtraConfig GetExtraCfg()\n {\n r"
},
{
"path": "AutoHook/Fishing/FishingManager.FishCaught.cs",
"chars": 4717,
"preview": "namespace AutoHook.Fishing;\n\npublic partial class FishingManager\n{\n private FishConfig? GetLastCatchConfig()\n {\n "
},
{
"path": "AutoHook/Fishing/FishingManager.Helper.cs",
"chars": 5075,
"preview": "using Dalamud.Game.Text;\nusing Dalamud.Game.Text.SeStringHandling;\nusing ECommons.Throttlers;\nusing Lumina.Excel.Sheets;"
},
{
"path": "AutoHook/Fishing/FishingManager.cs",
"chars": 17462,
"preview": "using Dalamud.Hooking;\nusing Dalamud.Plugin.Services;\nusing ECommons.Throttlers;\nusing FFXIVClientStructs.FFXIV.Client.G"
},
{
"path": "AutoHook/Fishing/FishingPresets.cs",
"chars": 2806,
"preview": "using Newtonsoft.Json;\n\nnamespace AutoHook.Fishing;\n\npublic class FishingPresets : BasePreset\n{\n // Global preset, c"
},
{
"path": "AutoHook/Globals.cs",
"chars": 602,
"preview": "global using AutoHook.Classes;\nglobal using AutoHook.Classes.AutoCasts;\nglobal using AutoHook.Configurations;\nglobal us"
},
{
"path": "AutoHook/IPC/AutoHookIPC.cs",
"chars": 3956,
"preview": "using ECommons.EzIpcManager;\n\nnamespace AutoHook.IPC;\n\npublic class AutoHookIPC\n{\n private readonly Configuration _cf"
},
{
"path": "AutoHook/PluginChangelog.cs",
"chars": 20691,
"preview": "// ReSharper disable LocalizableElement\n\nnamespace AutoHook;\n\npublic static class PluginChangelog\n{\n public static r"
},
{
"path": "AutoHook/PluginUI.cs",
"chars": 15796,
"preview": "using AutoHook.Ui;\r\nusing Dalamud.Interface.Colors;\r\nusing Dalamud.Interface.Windowing;\r\nusing Dalamud.Bindings.ImGui;\r\n"
},
{
"path": "AutoHook/PresetCreator.cs",
"chars": 16850,
"preview": "using AutoHook.Ui;\nusing Dalamud.Bindings.ImGui;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Utility;\n\nname"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.Designer.cs",
"chars": 167774,
"preview": "//------------------------------------------------------------------------------\r\n// <auto-generated>\r\n// This code"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.de.resx",
"chars": 56258,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.es.resx",
"chars": 29324,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.fr.resx",
"chars": 61741,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.it.resx",
"chars": 5695,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.ja.resx",
"chars": 47717,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.ko.resx",
"chars": 52016,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.resx",
"chars": 65324,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.ru.resx",
"chars": 68399,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/Resources/Localization/UIStrings.zh.resx",
"chars": 50351,
"preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<root>\n <!-- \n Microsoft ResX Schema \n \n Version 2.0\n \n The prima"
},
{
"path": "AutoHook/SeFunctions/BaitManager.cs",
"chars": 5551,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\nusing FFXIVClientStructs.FFXIV.Client.Game.Event;\nusing FFXIVClientStructs."
},
{
"path": "AutoHook/SeFunctions/SeAddressBase.cs",
"chars": 461,
"preview": "using Dalamud.Plugin.Services;\n\nnamespace AutoHook.SeFunctions;\n\npublic class SeAddressBase\n{\n public readonly IntPt"
},
{
"path": "AutoHook/SeFunctions/SeFunctionBase.cs",
"chars": 1999,
"preview": "using Dalamud.Game;\nusing Dalamud.Hooking;\nusing Dalamud.Plugin.Services;\nusing System.Runtime.InteropServices;\n\nnamesp"
},
{
"path": "AutoHook/SeFunctions/SeTugType.cs",
"chars": 295,
"preview": "using Dalamud.Plugin.Services;\n\nnamespace AutoHook.SeFunctions;\n\npublic sealed class SeTugType(ISigScanner sigScanner) :"
},
{
"path": "AutoHook/Service.cs",
"chars": 1941,
"preview": "using Dalamud.Game;\r\nusing Dalamud.Plugin;\r\nusing Dalamud.Interface.Windowing;\r\nusing ECommons.Automation.NeoTaskManager"
},
{
"path": "AutoHook/Spearfishing/AutoGig.cs",
"chars": 11191,
"preview": "using AutoHook.Spearfishing.Struct;\nusing Dalamud.Bindings.ImGui;\nusing Dalamud.Game.ClientState.Objects.Enums;\nusing D"
},
{
"path": "AutoHook/Spearfishing/Enums/SpearfishSize.cs",
"chars": 564,
"preview": "namespace AutoHook.Spearfishing.Enums;\n\npublic enum SpearfishSize : byte\n{\n All = 0,\n Small = 1,\n Average = 2,\n"
},
{
"path": "AutoHook/Spearfishing/Enums/SpearfishSpeed.cs",
"chars": 1146,
"preview": "namespace AutoHook.Spearfishing.Enums;\n\npublic enum SpearfishSpeed : ushort\n{\n All = 0,\n SuperSlow = 100,\n Extr"
},
{
"path": "AutoHook/Spearfishing/SpearFishingPresets.cs",
"chars": 1896,
"preview": "using System.ComponentModel;\nusing Newtonsoft.Json;\n\nnamespace AutoHook.Spearfishing;\n\npublic class SpearFishingPresets"
},
{
"path": "AutoHook/Spearfishing/Struct/SpearfishWindow.cs",
"chars": 1256,
"preview": "using System.Runtime.InteropServices;\nusing AutoHook.Spearfishing.Enums;\nusing FFXIVClientStructs.FFXIV.Component.GUI;\n\n"
},
{
"path": "AutoHook/Ui/BaseTab.cs",
"chars": 1013,
"preview": "using Dalamud.Bindings.ImGui;\r\n\r\nnamespace AutoHook.Ui;\r\n\r\npublic abstract class BaseTab : IDisposable\r\n{\r\n public ab"
},
{
"path": "AutoHook/Ui/SubTabAutoCast.cs",
"chars": 5652,
"preview": "using Dalamud.Bindings.ImGui;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Utility;\nusing Dalamud.Interface.U"
},
{
"path": "AutoHook/Ui/SubTabBaitMooch.cs",
"chars": 8061,
"preview": "using System.Numerics;\r\nusing Dalamud.Interface;\r\nusing Dalamud.Interface.Components;\r\nusing Dalamud.Interface.Utility;\r"
},
{
"path": "AutoHook/Ui/SubTabExtra.cs",
"chars": 11089,
"preview": "using Dalamud.Interface.Colors;\nusing Dalamud.Interface.Components;\nusing Dalamud.Interface.Utility;\nusing Dalamud.Inte"
},
{
"path": "AutoHook/Ui/SubTabFish.cs",
"chars": 10486,
"preview": "using System.Numerics;\nusing Dalamud.Interface;\nusing Dalamud.Interface.Components;\nusing Dalamud.Interface.Utility;\nusi"
},
{
"path": "AutoHook/Ui/TabAutoGig.cs",
"chars": 3693,
"preview": "using AutoHook.Spearfishing;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Utility.Raii;\nusing FFXIVClientStr"
},
{
"path": "AutoHook/Ui/TabCommunity.cs",
"chars": 18044,
"preview": "using System.Diagnostics;\nusing AutoHook.Spearfishing;\nusing Dalamud.Interface;\nusing Dalamud.Interface.Colors;\nusing D"
},
{
"path": "AutoHook/Ui/TabDebug.cs",
"chars": 9004,
"preview": "using Dalamud.Bindings.ImGui;\nusing Dalamud.Hooking;\nusing Dalamud.Interface.Utility.Raii;\nusing ECommons.Automation.Ne"
},
{
"path": "AutoHook/Ui/TabFishingPresets.cs",
"chars": 35375,
"preview": "using System.Numerics;\nusing Dalamud.Interface;\nusing Dalamud.Interface.Colors;\nusing Dalamud.Interface.Components;\nusin"
},
{
"path": "AutoHook/Ui/TabGlobalPreset.cs",
"chars": 587,
"preview": "using Dalamud.Interface.Utility.Raii;\n\nnamespace AutoHook.Ui;\n\ninternal class TabGlobalPreset : BaseTab\n{\n public ove"
},
{
"path": "AutoHook/Ui/TabSettings.cs",
"chars": 6739,
"preview": "using System.Diagnostics;\nusing System.Globalization;\nusing Dalamud.Interface.Utility;\nusing Dalamud.Interface.Utility."
},
{
"path": "AutoHook/Utils/DrawUtil.cs",
"chars": 20057,
"preview": "using Dalamud.Interface;\nusing Dalamud.Interface.Components;\nusing Dalamud.Interface.Utility;\nusing Dalamud.Bindings.Im"
},
{
"path": "AutoHook/Utils/EzDtr2.cs",
"chars": 2155,
"preview": "using Dalamud.Game.Gui.Dtr;\nusing Dalamud.Game.Text.SeStringHandling;\nusing ECommons.Reflection;\n\nnamespace AutoHook.Ut"
},
{
"path": "AutoHook/Utils/GameRes.cs",
"chars": 2316,
"preview": "using System.IO;\nusing System.Text.Json;\nusing Dalamud.Bindings.ImGui;\nusing Lumina.Excel.Sheets;\n\nnamespace AutoHook.U"
},
{
"path": "AutoHook/Utils/InputUtil.cs",
"chars": 1318,
"preview": "using System.Diagnostics;\nusing System.Runtime.InteropServices;\n\nnamespace AutoHook.Utils;\n\n// I got this from the XIVD"
},
{
"path": "AutoHook/Utils/MultiString.cs",
"chars": 1082,
"preview": "using Lumina.Excel.Sheets;\r\nusing Lumina.Text.ReadOnly;\r\nusing Action = Lumina.Excel.Sheets.Action;\r\n\r\nnamespace AutoHoo"
},
{
"path": "AutoHook/Utils/PlayerRes.cs",
"chars": 9015,
"preview": "using FFXIVClientStructs.FFXIV.Client.Game;\nusing FFXIVClientStructs.FFXIV.Client.Game.Event;\nusing FFXIVClientStructs.F"
},
{
"path": "AutoHook/Utils/SignaturePatterns.cs",
"chars": 542,
"preview": "namespace AutoHook.Utils;\n\npublic static class SignaturePatterns\n{\n // Used to hook ExecuteCommand (bait/swimbait cha"
},
{
"path": "AutoHook/Utils/WikiPresets.cs",
"chars": 3619,
"preview": "using ECommons.Throttlers;\nusing HtmlAgilityPack;\nusing System.Net.Http;\nusing System.Text.RegularExpressions;\nusing st"
},
{
"path": "AutoHook/packages.lock.json",
"chars": 1174,
"preview": "{\n \"version\": 1,\n \"dependencies\": {\n \"net10.0-windows7.0\": {\n \"DalamudPackager\": {\n \"type\": \"Direct\",\n "
},
{
"path": "AutoHook.sln",
"chars": 1539,
"preview": "\r\nMicrosoft Visual Studio Solution File, Format Version 12.00\r\n# Visual Studio Version 17\r\nVisualStudioVersion = 17.0.3"
},
{
"path": "LICENSE",
"chars": 1494,
"preview": "BSD 3-Clause License\n\nCopyright (c) 2024, Puni.sh\n\nRedistribution and use in source and binary forms, with or without\nmo"
},
{
"path": "README.md",
"chars": 748,
"preview": "<div align=\"center\">\n\n# AutoHook - Final Fantasy XIV Fishing Plugin\n\n## Help us with localization\nhttps://crowdin.com/pr"
},
{
"path": "build.bat",
"chars": 394,
"preview": "dotnet restore\ndotnet build --configuration Release PunishLib/ECommons/ECommons/ECommons.csproj\ndotnet build --configura"
},
{
"path": "crowdin.yml",
"chars": 152,
"preview": "files:\n - source: /AutoHook/Resources/Localization/UIStrings.resx\n translation: /AutoHook//Resources/Localization/UI"
},
{
"path": "update_bite_timers.py",
"chars": 3822,
"preview": "import os\nimport requests\nimport json\n\ndef fetch_bite_data():\n url = \"https://gubal.ffxivteamcraft.com/graphql\"\n q"
}
]
About this extraction
This page contains the full source code of the InitialDet/AutoHook GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 125 files (2.2 MB), approximately 571.9k tokens, and a symbol index with 632 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.