diff --git a/AutoRidingTraining.lua b/AutoRidingTraining.lua new file mode 100644 index 0000000..cb80952 --- /dev/null +++ b/AutoRidingTraining.lua @@ -0,0 +1,157 @@ + +local ART = { + AddonName = "AutoRidingTraining", + Author = "Myzael", + VariablesVersion = 1, + Defaults = { + Order = { + [1] = RIDING_TRAIN_SPEED, + [2] = RIDING_TRAIN_CARRYING_CAPACITY, + [3] = RIDING_TRAIN_STAMINA, + }, + PerCharacter = false, + }, + SavedVariables = nil, + Mapping = { + [RIDING_TRAIN_SPEED] = "speed", + [RIDING_TRAIN_CARRYING_CAPACITY] = "capacity", + [RIDING_TRAIN_STAMINA] = "stamina", + speed = RIDING_TRAIN_SPEED, + capacity = RIDING_TRAIN_CARRYING_CAPACITY, + stamina = RIDING_TRAIN_STAMINA, + }, +} + +function ART.OnAddOnLoaded(eventCode, name) + if name ~= ART.AddonName then + return + end + ART.SavedVariables = ZO_SavedVars:NewAccountWide("AutoRidingTrainingVars", ART.VariablesVersion, nil, ART.Defaults) + ART.SavedVariablesChar = ZO_SavedVars:New("AutoRidingTrainingVars", ART.VariablesVersion, nil, ART.Defaults) + EVENT_MANAGER:UnregisterForEvent(ART.AddonName, EVENT_ADD_ON_LOADED) + EVENT_MANAGER:RegisterForEvent(ART.AddonName, EVENT_PLAYER_ACTIVATED, ART.Initialize) +end + +function ART.Initialize() + EVENT_MANAGER:UnregisterForEvent(ART.AddonName, EVENT_PLAYER_ACTIVATED) + EVENT_MANAGER:RegisterForEvent(ART.AddonName, EVENT_CHATTER_BEGIN, ART.OnChatterBegin) +end + +function ART.OnChatterBegin(eventCode, optionCount) + local unitCaption = GetUnitCaption('interact') + if unitCaption and string.find(unitCaption:lower(), GetString(ART_STABLE_MASTER_CAPTION):lower()) then + EVENT_MANAGER:RegisterForEvent(ART.AddonName, EVENT_STABLE_INTERACT_START, ART.OnStableInteractStart) + SelectChatterOption(1) + end +end + +function ART.OnStableInteractStart(eventCode) + EVENT_MANAGER:UnregisterForEvent(ART.AddonName, EVENT_STABLE_INTERACT_START) + + local inventoryBonus, maxInventoryBonus, staminaBonus, maxStaminaBonus, speedBonus, maxSpeedBonus = GetRidingStats() + local statsMapped = { + [RIDING_TRAIN_SPEED] = {speedBonus, maxSpeedBonus}, + [RIDING_TRAIN_CARRYING_CAPACITY] = {inventoryBonus, maxInventoryBonus}, + [RIDING_TRAIN_STAMINA] = {staminaBonus, maxStaminaBonus}, + } + local order = ART.SavedVariablesChar.PerCharacter and ART.SavedVariablesChar.Order or ART.SavedVariables.Order + for index, skillToTrain in pairs(order) do + local stats = statsMapped[skillToTrain] + if stats[1] < stats[2] then + EVENT_MANAGER:RegisterForEvent(ART.AddonName, EVENT_RIDING_SKILL_IMPROVEMENT, ART.OnRidingSkillImprovement) + TrainRiding(skillToTrain) + end + end +end + +-- number +-- RidingTrainType +-- number +-- number +-- RidingTrainSource +function ART.OnRidingSkillImprovement(eventCode, ridingSkillType, previous, current, source) + EVENT_MANAGER:UnregisterForEvent(ART.AddonName, EVENT_RIDING_SKILL_IMPROVEMENT) + ZO_SharedInteraction:CloseChatterAndDismissAssistant() + SCENE_MANAGER:Show('hud') +end + +EVENT_MANAGER:RegisterForEvent(ART.AddonName, EVENT_ADD_ON_LOADED, ART.OnAddOnLoaded) + +function string:split(delimiter) + local result = {} + local from = 1 + local delim_from, delim_to = string.find(self, delimiter, from) + while delim_from do + table.insert(result, string.sub(self, from, delim_from - 1)) + from = delim_to + 1 + delim_from, delim_to = string.find(self, delimiter, from) + end + table.insert(result, string.sub(self, from)) + return result +end + +SLASH_COMMANDS["/art"] = function(command) + if not command or command == "" then + CHAT_SYSTEM:AddMessage("Current riding skill order:") + local order = ART.SavedVariablesChar.PerCharacter and ART.SavedVariablesChar.Order or ART.SavedVariables.Order + for index, skillType in pairs(order) do + CHAT_SYSTEM:AddMessage(tostring(index)..". "..ART.Mapping[skillType]) + end + if ART.SavedVariablesChar.PerCharacter then + CHAT_SYSTEM:AddMessage("Using character settings.") + else + CHAT_SYSTEM:AddMessage("Using account settings.") + end + CHAT_SYSTEM:AddMessage("Enter `/art use character settings` or `/art use account settings` to switch between modes.") + CHAT_SYSTEM:AddMessage("For changing the order enter `/art set order speed,stamina,capacity`, it will save it for the currently active mode.") + return + end + local options = command:split(" ") + if #options == 3 and options[1] == "use" and options[3] == "settings" then + if options[2] == "character" then + ART.SavedVariablesChar.PerCharacter = true + CHAT_SYSTEM:AddMessage("Switched to character settings") + elseif options[2] == "account" then + ART.SavedVariablesChar.PerCharacter = false + CHAT_SYSTEM:AddMessage("Switched to account settings") + else + CHAT_SYSTEM:AddMessage("Invalid input '"..options[2].."'. Try 'character' or 'account'.") + end + elseif #options == 3 and options[1] == "set" and options[2] == "order" then + newOrder = options[3]:split(",") + if #newOrder ~= 3 then + CHAT_SYSTEM:AddMessage("Invalid order. Need exactly 3 elements in the order argument.") + return + end + speed = 0 + capacity = 0 + stamina = 0 + for _, v in pairs(newOrder) do + if v == "stamina" then + stamina = stamina + 1 + elseif v == "speed" then + speed = speed + 1 + elseif v == "capacity" then + capacity = capacity + 1 + else + CHAT_SYSTEM:AddMessage("Invalid order name '"..v.."'. Use either 'stamina', 'speed' or 'capacity'.") + return + end + end + if speed ~= 1 or stamina ~= 1 or capacity ~=1 then + CHAT_SYSTEM:AddMessage("Order must contain every type exactly once.") + return + end + if ART.SavedVariablesChar.PerCharacter then + ART.SavedVariablesChar.Order[1] = ART.Mapping[newOrder[1]] + ART.SavedVariablesChar.Order[2] = ART.Mapping[newOrder[2]] + ART.SavedVariablesChar.Order[3] = ART.Mapping[newOrder[3]] + CHAT_SYSTEM:AddMessage("Saved new order into character settings") + else + ART.SavedVariables.Order[1] = ART.Mapping[newOrder[1]] + ART.SavedVariables.Order[2] = ART.Mapping[newOrder[2]] + ART.SavedVariables.Order[3] = ART.Mapping[newOrder[3]] + CHAT_SYSTEM:AddMessage("Saved new order into account settings") + end + end +end diff --git a/AutoRidingTraining.txt b/AutoRidingTraining.txt new file mode 100644 index 0000000..87c5419 --- /dev/null +++ b/AutoRidingTraining.txt @@ -0,0 +1,19 @@ +## Title: |c0B2BF0AutoRidingTraining|r 0.3.0 +## Description: This addon fast forwards riding skill training +## Version: 0.3.0 +## Author: |@Myzael|r +## APIVersion: 100029 +## SavedVariables: AutoRidingTrainingVars + +lang/en.lua +lang/$(language).lua +AutoRidingTraining.lua + +; API https://esoapi.uesp.net/current/index.html +; This Add-on is not created by, affiliated with or sponsored by ZeniMax +; Media Inc. or its affiliates. The Elder Scrolls® and related logos are +; registered trademarks or trademarks of ZeniMax Media Inc. in the United +; States and/or other countries. All rights reserved. +; +; You can read the full terms at: +; https://account.elderscrollsonline.com/add-on-terms diff --git a/lang/de.lua b/lang/de.lua new file mode 100644 index 0000000..a86b0e5 --- /dev/null +++ b/lang/de.lua @@ -0,0 +1 @@ +SafeAddString(ART_STABLE_MASTER_CAPTION, "stallmeister", 1) diff --git a/lang/en.lua b/lang/en.lua new file mode 100644 index 0000000..82557f7 --- /dev/null +++ b/lang/en.lua @@ -0,0 +1,8 @@ +local strings = { + ART_STABLE_MASTER_CAPTION = "stablemaster", +} + +for stringId, stringValue in pairs(strings) do + ZO_CreateStringId(stringId, stringValue) + SafeAddVersion(stringId, 1) +end \ No newline at end of file diff --git a/lang/fr.lua b/lang/fr.lua new file mode 100644 index 0000000..1cbc60b --- /dev/null +++ b/lang/fr.lua @@ -0,0 +1 @@ +SafeAddString(ART_STABLE_MASTER_CAPTION, "écurie", 1)