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
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
|