You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

131 lines
3.8 KiB

local _, addon = ...
local _, _, classID = UnitClass("player");
if classID ~= 11 then return end;
if addon.IsGame_10_2_0 then
return
end
local SPELL_MOONKIN_FORM = 24858;
local IS_USING_GLYPH = false; --Glyph Spell ID: 114301
local LAST_FORM_ID;
local MODULE_ENABLED = false;
local GetShapeshiftFormID = GetShapeshiftFormID;
local ModelScene = CharacterModelScene;
local function ShowRegularModel()
ModelScene:ReleaseAllActors();
ModelScene:TransitionToModelSceneID(595, 1, 2, true); --CHARACTER_SHEET_MODEL_SCENE_ID, CAMERA_TRANSITION_TYPE_IMMEDIATE, CAMERA_MODIFICATION_TYPE_MAINTAIN
local actor = ModelScene:GetPlayerActor();
if actor then
local hasAlternateForm, inAlternateForm = C_PlayerInfo.GetAlternateFormInfo();
local sheatheWeapon = GetSheathState() == 1;
local autodress = true;
local hideWeapon = false;
local useNativeForm = not inAlternateForm;
actor:SetModelByUnit("player", sheatheWeapon, autodress, hideWeapon, useNativeForm);
actor:SetAnimationBlendOperation(0);
return actor
end
end
local function ShowAstralModel()
local actor = ShowRegularModel();
if actor then
actor:SetSpellVisualKit(23368, false);
actor:SetSpellVisualKit(27440, false);
end
end
local function UpdatePlayerModel()
if not MODULE_ENABLED then return end;
local form = GetShapeshiftFormID();
if not (form == 31 and IS_USING_GLYPH) then
return
end
ShowAstralModel();
end
local EventListener = CreateFrame("Frame");
EventListener:RegisterEvent("PLAYER_ENTERING_WORLD");
EventListener:RegisterEvent("USE_GLYPH");
EventListener:SetScript("OnEvent", function(self, event, ...)
if event == "PLAYER_ENTERING_WORLD" or event == "USE_GLYPH" then
if event == "PLAYER_ENTERING_WORLD" then
self:UnregisterEvent(event);
end
IS_USING_GLYPH = HasAttachedGlyph(SPELL_MOONKIN_FORM);
elseif event == "UPDATE_SHAPESHIFT_FORM" then
--Glyph user won't trigger "UNIT_MODEL_CHANGED" when shift between humanoid form and moonkin
--So we monitor this event instead
local newForm = GetShapeshiftFormID();
if (not IS_USING_GLYPH) or (newForm == LAST_FORM_ID) then return end;
if newForm == nil and LAST_FORM_ID == 31 then
ShowRegularModel();
elseif newForm == 31 and LAST_FORM_ID == nil then
ShowAstralModel();
end
LAST_FORM_ID = newForm;
end
end);
local HAS_HOOK = false;
local function HookFunctions()
if PaperDollFrame_SetPlayer and ModelScene then
hooksecurefunc("PaperDollFrame_SetPlayer", UpdatePlayerModel);
end
if PaperDollFrame then
if PaperDollFrame:GetScript("OnShow") then
PaperDollFrame:HookScript("OnShow", function()
EventListener:RegisterEvent("UPDATE_SHAPESHIFT_FORM");
LAST_FORM_ID = GetShapeshiftFormID();
end);
end
if PaperDollFrame:GetScript("OnHide") then
PaperDollFrame:HookScript("OnHide", function()
EventListener:UnregisterEvent("UPDATE_SHAPESHIFT_FORM");
end);
end
end
end
local function EnableModule(state)
if state then
if not HAS_HOOK then
HAS_HOOK = true;
HookFunctions();
end
MODULE_ENABLED = true;
else
MODULE_ENABLED = false;
end
end
do
local _, addon = ...
local moduleData = {
name = addon.L["ModuleName DruidModelFix"],
dbKey = "DruidModelFix",
description = addon.L["ModuleDescription DruidModelFix"],
toggleFunc = EnableModule,
};
addon.ControlCenter:AddModule(moduleData);
end