Update for 6.0

This commit is contained in:
Ottermandias 2021-12-10 10:25:53 +01:00
parent 5d3a39110a
commit 7e01fe52f4
10 changed files with 252 additions and 266 deletions

View file

@ -1,79 +1,78 @@
using Dalamud.Game.ClientState.Objects.Types;
namespace Glamourer
namespace Glamourer;
public static class CharacterExtensions
{
public static class CharacterExtensions
public const int WetnessOffset = 0x19E4;
public const byte WetnessFlag = 0x08;
public const int StateFlagsOffset = 0xDF6;
public const byte HatHiddenFlag = 0x01;
public const byte VisorToggledFlag = 0x10;
public const int AlphaOffset = 0x18B8;
public const int WeaponHiddenOffset = 0xCD4;
public const byte WeaponHiddenFlag = 0x02;
public static unsafe bool IsWet(this Character a)
=> (*((byte*)a.Address + WetnessOffset) & WetnessFlag) != 0;
public static unsafe bool SetWetness(this Character a, bool value)
{
public const int WetnessOffset = 0x19A5;
public const byte WetnessFlag = 0x10;
public const int StateFlagsOffset = 0x106C;
public const byte HatHiddenFlag = 0x01;
public const byte VisorToggledFlag = 0x10;
public const int AlphaOffset = 0x182C;
public const int WeaponHiddenOffset = 0xF64;
public const byte WeaponHiddenFlag = 0x02;
var current = a.IsWet();
if (current == value)
return false;
public static unsafe bool IsWet(this Character a)
=> (*((byte*) a.Address + WetnessOffset) & WetnessFlag) != 0;
public static unsafe bool SetWetness(this Character a, bool value)
{
var current = a.IsWet();
if (current == value)
return false;
if (value)
*((byte*) a.Address + WetnessOffset) = (byte) (*((byte*) a.Address + WetnessOffset) | WetnessFlag);
else
*((byte*) a.Address + WetnessOffset) = (byte) (*((byte*) a.Address + WetnessOffset) & ~WetnessFlag);
return true;
}
public static unsafe ref byte StateFlags(this Character a)
=> ref *((byte*) a.Address + StateFlagsOffset);
public static bool SetStateFlag(this Character a, bool value, byte flag)
{
var current = a.StateFlags();
var previousValue = (current & flag) != 0;
if (previousValue == value)
return false;
if (value)
a.StateFlags() = (byte) (current | flag);
else
a.StateFlags() = (byte) (current & ~flag);
return true;
}
public static bool IsHatHidden(this Character a)
=> (a.StateFlags() & HatHiddenFlag) != 0;
public static unsafe bool IsWeaponHidden(this Character a)
=> (a.StateFlags() & WeaponHiddenFlag) != 0
&& (*((byte*) a.Address + WeaponHiddenOffset) & WeaponHiddenFlag) != 0;
public static bool IsVisorToggled(this Character a)
=> (a.StateFlags() & VisorToggledFlag) != 0;
public static bool SetHatHidden(this Character a, bool value)
=> SetStateFlag(a, value, HatHiddenFlag);
public static unsafe bool SetWeaponHidden(this Character a, bool value)
{
var ret = SetStateFlag(a, value, WeaponHiddenFlag);
var val = *((byte*) a.Address + WeaponHiddenOffset);
if (value)
*((byte*) a.Address + WeaponHiddenOffset) = (byte) (val | WeaponHiddenFlag);
else
*((byte*) a.Address + WeaponHiddenOffset) = (byte) (val & ~WeaponHiddenFlag);
return ret || (val & WeaponHiddenFlag) != 0 != value;
}
public static bool SetVisorToggled(this Character a, bool value)
=> SetStateFlag(a, value, VisorToggledFlag);
public static unsafe ref float Alpha(this Character a)
=> ref *(float*) ((byte*) a.Address + AlphaOffset);
if (value)
*((byte*)a.Address + WetnessOffset) = (byte)(*((byte*)a.Address + WetnessOffset) | WetnessFlag);
else
*((byte*)a.Address + WetnessOffset) = (byte)(*((byte*)a.Address + WetnessOffset) & ~WetnessFlag);
return true;
}
public static unsafe ref byte StateFlags(this Character a)
=> ref *((byte*)a.Address + StateFlagsOffset);
public static bool SetStateFlag(this Character a, bool value, byte flag)
{
var current = a.StateFlags();
var previousValue = (current & flag) != 0;
if (previousValue == value)
return false;
if (value)
a.StateFlags() = (byte)(current | flag);
else
a.StateFlags() = (byte)(current & ~flag);
return true;
}
public static bool IsHatHidden(this Character a)
=> (a.StateFlags() & HatHiddenFlag) != 0;
public static unsafe bool IsWeaponHidden(this Character a)
=> (a.StateFlags() & WeaponHiddenFlag) != 0
&& (*((byte*)a.Address + WeaponHiddenOffset) & WeaponHiddenFlag) != 0;
public static bool IsVisorToggled(this Character a)
=> (a.StateFlags() & VisorToggledFlag) != 0;
public static bool SetHatHidden(this Character a, bool value)
=> SetStateFlag(a, value, HatHiddenFlag);
public static unsafe bool SetWeaponHidden(this Character a, bool value)
{
var ret = SetStateFlag(a, value, WeaponHiddenFlag);
var val = *((byte*)a.Address + WeaponHiddenOffset);
if (value)
*((byte*)a.Address + WeaponHiddenOffset) = (byte)(val | WeaponHiddenFlag);
else
*((byte*)a.Address + WeaponHiddenOffset) = (byte)(val & ~WeaponHiddenFlag);
return ret || (val & WeaponHiddenFlag) != 0 != value;
}
public static bool SetVisorToggled(this Character a, bool value)
=> SetStateFlag(a, value, VisorToggledFlag);
public static unsafe ref float Alpha(this Character a)
=> ref *(float*)((byte*)a.Address + AlphaOffset);
}

View file

@ -5,8 +5,8 @@
<PlatformTarget>x64</PlatformTarget>
<RootNamespace>Glamourer</RootNamespace>
<AssemblyName>Glamourer</AssemblyName>
<FileVersion>0.0.6.2</FileVersion>
<AssemblyVersion>0.0.6.2</AssemblyVersion>
<FileVersion>0.0.7.0</FileVersion>
<AssemblyVersion>0.0.7.0</AssemblyVersion>
<Company>SoftOtter</Company>
<Product>Glamourer</Product>
<Copyright>Copyright © 2020</Copyright>

View file

@ -5,10 +5,10 @@
"Description": "Adds functionality to change and store appearance of players, customization and equip. Requires Penumbra to be installed and activated to work. Can also add preview options to the Changed Items tab for Penumbra.",
"Tags": [ "Appearance", "Glamour", "Race", "Outfit", "Armor", "Clothes", "Skins", "Customization", "Design", "Character" ],
"InternalName": "Glamourer",
"AssemblyVersion": "0.0.6.2",
"AssemblyVersion": "0.0.7.0",
"RepoUrl": "https://github.com/Ottermandias/Glamourer",
"ApplicableVersion": "any",
"DalamudApiLevel": 4,
"DalamudApiLevel": 5,
"LoadPriority": -100,
"ImageUrls": null,
"IconUrl": "https://raw.githubusercontent.com/Ottermandias/Glamourer/master/images/icon.png"

View file

@ -352,13 +352,7 @@ namespace Glamourer.Gui
ImGui.PushFont(UiBuilder.IconFont);
var icon = customization.Gender == Gender.Male ? FontAwesomeIcon.Mars : FontAwesomeIcon.Venus;
var restricted = false;
if (customization.Race == Race.Viera)
{
ImGui.PushStyleVar(ImGuiStyleVar.Alpha, 0.25f);
icon = FontAwesomeIcon.VenusDouble;
restricted = true;
}
else if (customization.Race == Race.Hrothgar)
if (customization.Race == Race.Hrothgar)
{
ImGui.PushStyleVar(ImGuiStyleVar.Alpha, 0.25f);
icon = FontAwesomeIcon.MarsDouble;

View file

@ -63,12 +63,8 @@ namespace Glamourer.Gui
customization.Race = race;
customization.Clan = clan;
customization.Gender = race switch
{
Race.Hrothgar => Gender.Male,
Race.Viera => Gender.Female,
_ => customization.Gender,
};
if (race == Race.Hrothgar)
customization.Gender = Gender.Male;
FixUpAttributes(ref customization);