public unsafe void Init() { var scanner = _plugin.pluginInterface.TargetModuleScanner; // actually a pointer to the game's memory storage for all battlecharas. the player character is always the first. // this SHOULD persist on swapping characters but i didnt actually test var localPlayerAddress = scanner.GetStaticAddressFromSig("48 8B F8 48 8D 2D ? ? ? ? "); LocalPlayer = *(BattleChara **)localPlayerAddress.ToPointer(); var characterEnableDrawAddress = scanner.ScanText("E8 ?? ?? ?? ?? 48 8B 8B ?? ?? ?? ?? 48 85 C9 74 2C 33 D2"); var characterDisableDrawAddress = scanner.ScanText("40 57 41 56 48 83 EC 28 48 8B F9 48 8B 0D ?? ?? ?? ??"); var companionEnableDrawAddress = scanner.ScanText("40 53 48 83 EC 20 80 B9 ?? ?? ?? ?? ?? 48 8B D9 72 0C F7 81 ?? ?? ?? ?? ?? ?? ?? ?? 74 3D"); var characterDtorAddress = scanner.ScanText("48 89 5C 24 ?? 57 48 83 EC 20 48 8D 05 ?? ?? ?? ?? 48 8B D9 48 89 01 48 8D 05 ?? ?? ?? ?? 48 89 81 ?? ?? ?? ?? 48 8B 89 ?? ?? ?? ??"); this.hookCharacterEnableDraw = new Hook <CharacterEnableDrawPrototype>(characterEnableDrawAddress, new CharacterEnableDrawPrototype(CharacterEnableDrawDetour), this); this.hookCharacterDisableDraw = new Hook <CharacterDisableDrawPrototype>(characterDisableDrawAddress, new CharacterDisableDrawPrototype(CharacterDisableDrawDetour), this); this.hookCompanionEnableDraw = new Hook <CompanionEnableDrawPrototype>(companionEnableDrawAddress, new CompanionEnableDrawPrototype(CompanionEnableDrawDetour), this); this.hookCharacterDtor = new Hook <CharacterDtorPrototype>(characterDtorAddress, new CharacterDtorPrototype(CharacterDtorDetour), this); this.hookCharacterEnableDraw.Enable(); this.hookCharacterDisableDraw.Enable(); this.hookCompanionEnableDraw.Enable(); this.hookCharacterDtor.Enable(); }
public unsafe void Init(DalamudPluginInterface pluginInterface, VisibilityConfiguration pluginConfig) { _pluginInterface = pluginInterface; _address.Setup(pluginInterface.TargetModuleScanner); _config = pluginConfig; LocalPlayer = *(BattleChara **)_address.LocalPlayerAddress.ToPointer(); hookCharacterEnableDraw = new Hook <CharacterEnableDrawPrototype>(_address.CharacterEnableDrawAddress, new CharacterEnableDrawPrototype(CharacterEnableDrawDetour), this); hookCharacterDisableDraw = new Hook <CharacterDisableDrawPrototype>(_address.CharacterDisableDrawAddress, new CharacterDisableDrawPrototype(CharacterDisableDrawDetour), this); hookCompanionEnableDraw = new Hook <CompanionEnableDrawPrototype>(_address.CompanionEnableDrawAddress, new CompanionEnableDrawPrototype(CompanionEnableDrawDetour), this); hookCharacterDtor = new Hook <CharacterDtorPrototype>(_address.CharacterDtorAddress, new CharacterDtorPrototype(CharacterDtorDetour), this); hookCharacterEnableDraw.Enable(); hookCharacterDisableDraw.Enable(); hookCompanionEnableDraw.Enable(); hookCharacterDtor.Enable(); }
private unsafe void CharacterEnableDrawDetour(Character *thisPtr) { var localPlayerAddress = _pluginInterface?.ClientState?.LocalPlayer?.Address; if (localPlayerAddress.HasValue && LocalPlayer != (BattleChara *)localPlayerAddress.Value) { LocalPlayer = (BattleChara *)localPlayerAddress.Value; } if (_config.Enabled && localPlayerAddress.HasValue && thisPtr != (Character *)LocalPlayer) { switch (thisPtr->GameObject.ObjectKind) { case (byte)ObjectKind.Player: if (thisPtr->GameObject.ObjectID == 0xE0000000) { break; } _players[ContainerType.All].Add(thisPtr->GameObject.ObjectID); if ((thisPtr->StatusFlags & (byte)StatusFlags.Friend) > 0) { _players[ContainerType.Friend].Add(thisPtr->GameObject.ObjectID); } else { _players[ContainerType.Friend].Remove(thisPtr->GameObject.ObjectID); } if ((thisPtr->StatusFlags & (byte)StatusFlags.PartyMember) > 0) { _players[ContainerType.Party].Add(thisPtr->GameObject.ObjectID); } else { _players[ContainerType.Party].Remove(thisPtr->GameObject.ObjectID); } if ((_pluginInterface.ClientState.Condition[ConditionFlag.BoundByDuty] || _pluginInterface.ClientState.Condition[ConditionFlag.BetweenAreas] || _pluginInterface.ClientState.Condition[ConditionFlag.WatchingCutscene]) && !(_config.TerritoryTypeWhitelist.Contains(_pluginInterface.ClientState.TerritoryType) && _config.TerryWhiteList)) { break; } if (*LocalPlayer->Character.CompanyTag != 0 && LocalPlayer->Character.CurrentWorld == LocalPlayer->Character.HomeWorld && UnsafeArrayEqual(thisPtr->CompanyTag, LocalPlayer->Character.CompanyTag, 7)) { _players[ContainerType.Company].Add(thisPtr->GameObject.ObjectID); } else { _players[ContainerType.Company].Remove(thisPtr->GameObject.ObjectID); } if (_config.VoidList.Any(x => UnsafeArrayEqual(Encoding.UTF8.GetBytes(x.Name), thisPtr->GameObject.Name) && x.HomeworldId == thisPtr->HomeWorld)) { thisPtr->GameObject.RenderFlags |= (int)VisibilityFlags.Invisible; HiddenObjectIds.Add(thisPtr->GameObject.ObjectID); break; } if (!_config.HidePlayer || (_config.ShowDeadPlayer && thisPtr->CurrentHp == 0) || (_config.ShowFriendPlayer && _players[ContainerType.Friend].Contains(thisPtr->GameObject.ObjectID)) || (_config.ShowCompanyPlayer && _players[ContainerType.Company].Contains(thisPtr->GameObject.ObjectID)) || (_config.ShowPartyPlayer && _players[ContainerType.Party].Contains(thisPtr->GameObject.ObjectID)) || (_config.Whitelist.Any(x => UnsafeArrayEqual(Encoding.UTF8.GetBytes(x.Name), thisPtr->GameObject.Name) && x.HomeworldId == thisPtr->HomeWorld))) { break; } else { thisPtr->GameObject.RenderFlags |= (int)VisibilityFlags.Invisible; HiddenObjectIds.Add(thisPtr->GameObject.ObjectID); break; } case (byte)ObjectKind.BattleNpc when thisPtr->GameObject.SubKind == (byte)BattleNpcSubKind.Pet && thisPtr->NameID != 6565: if (!_config.HidePet || thisPtr->GameObject.OwnerID == LocalPlayer->Character.GameObject.ObjectID) { break; } _pets[ContainerType.All].Add(thisPtr->GameObject.ObjectID); if (_players[ContainerType.Friend].Contains(thisPtr->GameObject.OwnerID)) { _pets[ContainerType.Friend].Add(thisPtr->GameObject.ObjectID); } if (_players[ContainerType.Party].Contains(thisPtr->GameObject.OwnerID)) { _pets[ContainerType.Party].Add(thisPtr->GameObject.ObjectID); } if (_players[ContainerType.Company].Contains(thisPtr->GameObject.OwnerID)) { _pets[ContainerType.Company].Add(thisPtr->GameObject.ObjectID); } if ((_config.ShowFriendPet && _players[ContainerType.Friend].Contains(thisPtr->GameObject.OwnerID)) || (_config.ShowCompanyPet && _players[ContainerType.Company].Contains(thisPtr->GameObject.OwnerID)) || (_config.ShowPartyPet && _players[ContainerType.Party].Contains(thisPtr->GameObject.OwnerID))) { break; } else { thisPtr->GameObject.RenderFlags |= (int)VisibilityFlags.Invisible; HiddenObjectIds.Add(thisPtr->GameObject.ObjectID); break; } case (byte)ObjectKind.BattleNpc when thisPtr->GameObject.SubKind == (byte)BattleNpcSubKind.Pet && thisPtr->NameID == 6565 : // Earthly Star if (_config.HideStar && _pluginInterface.ClientState.Condition[ConditionFlag.InCombat] && thisPtr->GameObject.OwnerID != LocalPlayer->Character.GameObject.ObjectID && !_players[ContainerType.Party].Contains(thisPtr->GameObject.OwnerID)) { thisPtr->GameObject.RenderFlags |= (int)VisibilityFlags.Invisible; HiddenObjectIds.Add(thisPtr->GameObject.ObjectID); } break; case (byte)ObjectKind.BattleNpc when thisPtr->GameObject.SubKind == 3: if (!_config.HideChocobo || thisPtr->GameObject.OwnerID == LocalPlayer->Character.GameObject.ObjectID) { break; } _chocobos[ContainerType.All].Add(thisPtr->GameObject.ObjectID); if (_players[ContainerType.Friend].Contains(thisPtr->GameObject.OwnerID)) { _chocobos[ContainerType.Friend].Add(thisPtr->GameObject.ObjectID); } if (_players[ContainerType.Party].Contains(thisPtr->GameObject.OwnerID)) { _chocobos[ContainerType.Party].Add(thisPtr->GameObject.ObjectID); } if (_players[ContainerType.Company].Contains(thisPtr->GameObject.OwnerID)) { _chocobos[ContainerType.Company].Add(thisPtr->GameObject.ObjectID); } if ((_config.ShowFriendChocobo && _players[ContainerType.Friend].Contains(thisPtr->GameObject.OwnerID)) || (_config.ShowCompanyChocobo && _players[ContainerType.Company].Contains(thisPtr->GameObject.OwnerID)) || (_config.ShowPartyChocobo && _players[ContainerType.Party].Contains(thisPtr->GameObject.OwnerID))) { break; } else { thisPtr->GameObject.RenderFlags |= (int)VisibilityFlags.Invisible; HiddenObjectIds.Add(thisPtr->GameObject.ObjectID); break; } } } hookCharacterEnableDraw.Original(thisPtr); }
public unsafe void UpdateLocalPlayer() { LocalPlayer = *(BattleChara **)_address.LocalPlayerAddress.ToPointer(); }
public partial BattleChara *LookupPetByOwnerObject(BattleChara *owner);