private void BagWidgetUpdate(AtkUnitBase *atkUnitBase, NumberArrayData **numberArrayData, StringArrayData **stringArrayData) { var equipmentComponentNode = atkUnitBase->GetNodeById(6); if (equipmentComponentNode == null) { return; } if ((ushort)equipmentComponentNode->Type < 1000) { return; } var equipmentComponent = ((AtkComponentNode *)equipmentComponentNode)->Component; if (equipmentComponent == null) { return; } MoveNode(equipmentComponent, 3, 5, 10); MoveNode(equipmentComponent, 4, 23, 10); for (var i = 5U; i < 10; i++) { MoveNode(equipmentComponent, i, 5, 10 + (i - 4) * 6); } for (var i = 10U; i < 15; i++) { MoveNode(equipmentComponent, i, 23, 10 + (i - 9) * 6); } var backgroundImage = (AtkImageNode *)equipmentComponent->UldManager.SearchNodeById(15); if (backgroundImage != null) { backgroundImage->AtkResNode.ToggleVisibility(false); for (var i = 0U; i < 2; i++) { // Create var bgImageNode = Common.GetNodeByID <AtkImageNode>(equipmentComponent->UldManager, CustomNodes.GearPositionsBg + i, NodeType.Image); if (bgImageNode == null) { SimpleLog.Log($"Create Custom BG Image Node#{i}"); bgImageNode = IMemorySpace.GetUISpace()->Create <AtkImageNode>(); bgImageNode->AtkResNode.Type = NodeType.Image; bgImageNode->AtkResNode.NodeID = CustomNodes.GearPositionsBg + i; bgImageNode->AtkResNode.Flags = (short)(NodeFlags.AnchorTop | NodeFlags.AnchorLeft); bgImageNode->AtkResNode.DrawFlags = 0; bgImageNode->WrapMode = 1; bgImageNode->Flags = 0; var partsList = (AtkUldPartsList *)IMemorySpace.GetUISpace()->Malloc((ulong)sizeof(AtkUldPartsList), 8); if (partsList == null) { SimpleLog.Error("Failed to alloc memory for parts list."); bgImageNode->AtkResNode.Destroy(true); break; } partsList->Id = 0; partsList->PartCount = 1; var part = (AtkUldPart *)IMemorySpace.GetUISpace()->Malloc((ulong)sizeof(AtkUldPart), 8); if (part == null) { SimpleLog.Error("Failed to alloc memory for part."); IMemorySpace.Free(partsList, (ulong)sizeof(AtkUldPartsList)); bgImageNode->AtkResNode.Destroy(true); break; } part->U = 21; part->V = 13; part->Width = 11; part->Height = 41; partsList->Parts = part; var asset = (AtkUldAsset *)IMemorySpace.GetUISpace()->Malloc((ulong)sizeof(AtkUldAsset), 8); if (asset == null) { SimpleLog.Error("Failed to alloc memory for asset."); IMemorySpace.Free(part, (ulong)sizeof(AtkUldPart)); IMemorySpace.Free(partsList, (ulong)sizeof(AtkUldPartsList)); bgImageNode->AtkResNode.Destroy(true); break; } asset->Id = 0; asset->AtkTexture.Ctor(); part->UldAsset = asset; bgImageNode->PartsList = partsList; bgImageNode->LoadTexture("ui/uld/BagStatus.tex"); bgImageNode->AtkResNode.ToggleVisibility(true); bgImageNode->AtkResNode.SetWidth(11); bgImageNode->AtkResNode.SetHeight(41); bgImageNode->AtkResNode.SetPositionShort((short)(i == 0 ? 3 : 21), 10); var prev = backgroundImage->AtkResNode.PrevSiblingNode; bgImageNode->AtkResNode.ParentNode = backgroundImage->AtkResNode.ParentNode; backgroundImage->AtkResNode.PrevSiblingNode = (AtkResNode *)bgImageNode; prev->NextSiblingNode = (AtkResNode *)bgImageNode; bgImageNode->AtkResNode.PrevSiblingNode = prev; bgImageNode->AtkResNode.NextSiblingNode = (AtkResNode *)backgroundImage; equipmentComponent->UldManager.UpdateDrawNodeList(); } } } }
private void AddonNameplateOnUpdateDetour(AddonNamePlate *thisPtr, NumberArrayData **numberData, StringArrayData **stringData) { numberData[5]->IntArray[3] = 1; this.addonNameplateOnUpdateHook.Original(thisPtr, numberData, stringData); }
private void AfterInventoryUpdate(AtkUnitBase *atkUnitBase, NumberArrayData **numberArrayData, StringArrayData **stringArrayData) { Update(atkUnitBase); }
private void *AddonExpOnUpdateDetour(AtkUnitBase *addonExp, NumberArrayData **numberArrays, StringArrayData **stringArrays, void *a4) { var ret = addonExpOnUpdateHook.Original(addonExp, numberArrays, stringArrays, a4); var stringArray = stringArrays[2]; if (stringArray == null) { goto Return; } var strPtr = stringArray->StringArray[69]; if (strPtr == null) { goto Return; } try { var str = MemoryHelper.ReadSeStringNullTerminated(new IntPtr(strPtr)); SetExperienceBarVisible(!str.TextValue.Contains("-/-")); } catch { // Ignored } Return: return(ret); }
private byte ActionBarBaseUpdateDetour(AddonActionBarBase *addonActionBarBase, NumberArrayData **numberArrayData, StringArrayData **stringArrayData) { var changesFound = false; var hotbarID = addonActionBarBase->HotbarID; if (hotbarID < allActionBars.Length) { changesFound = UpdateHotbarRecordedControlHints(addonActionBarBase, stringArrayData[StrDataIndex]); changesFound |= UpdateHotbarCommands(addonActionBarBase); } var ret = actionBarBaseUpdateHook.Original(addonActionBarBase, numberArrayData, stringArrayData); if (changesFound) { FillControlHints(); } return(ret); }
private byte DoubleCrossBarBaseUpdateDetour(AddonActionBarBase *atkUnitBase, NumberArrayData **numberArrayData, StringArrayData **stringArrayData) { var ret = doubleCrossBarUpdateHook.Original(atkUnitBase, numberArrayData, stringArrayData); try { Update(atkUnitBase); } catch { // } return(ret); }
private void AddonNameplateOnUpdateDetour(AddonNamePlate *thisPtr, NumberArrayData **numberData, StringArrayData **stringData) { var numbers = numberData[5]; var strings = stringData[4]; SetTextRenderMode(thisPtr, numbers); if (numbers->IntArray[1] != 0) { numbers->IntArray[1] = 0; for (int i = 0; i < 50; i++) { thisPtr->NamePlateObjectArray[i].NeedsToBeBaked = 1; } } for (int i = 0; i < 50; i++) { atkResNodeToggleVisibilityFunc((AtkResNode *)thisPtr->NamePlateObjectArray[i].RootNode, 0); } var doFullUpdate = numbers->IntArray[4]; bool doFullUpdateChanged = (doFullUpdate != thisPtr->DoFullUpdate); thisPtr->DoFullUpdate = doFullUpdate != 0 ? (byte)1 : (byte)0; var nameplateScale = (float)numbers->IntArray[2]; // this is from "Display Name Size" in nameplate config var addonScale = atkUnitBaseGetScaleFunc((AtkUnitBase *)thisPtr); // scale of addon itself var globalUIScale = atkUnitBaseGetGlobalUIScaleFunc((AtkUnitBase *)thisPtr); // global UI scale in system config var finalScale = (float)((nameplateScale * addonScale * globalUIScale) / 100.0); // nameplateScale is 100, 120, 140 instead of 1.0/1.2/1.4 so divide by 100 var activeNameplateCount = numbers->IntArray[0]; if (activeNameplateCount > 0) { bool hasPriorityChange = false; for (int i = 0; i < activeNameplateCount; i++) { var numberArrayIndex = i * 19 + 5; var npObjIndex = numbers->IntArray[numberArrayIndex + 15]; var npObj = thisPtr->NamePlateObjectArray[npObjIndex]; npObj.Priority = activeNameplateCount - i - 1; atkResNodeToggleVisibilityFunc((AtkResNode *)npObj.RootNode, 1); if (atkResNodeGetPriorityFunc((AtkResNode *)npObj.RootNode) != npObj.Priority) { hasPriorityChange = true; atkResNodeSetPriorityFunc((AtkResNode *)npObj.RootNode, (ushort)npObj.Priority); } var nameplateKind = numbers->IntArray[numberArrayIndex + 1]; npObj.NameplateKind = (byte)nameplateKind; var x = numbers->IntArray[numberArrayIndex + 3]; var y = numbers->IntArray[numberArrayIndex + 4]; var depth = numbers->IntArray[numberArrayIndex + 5]; var scale = numbers->IntArray[numberArrayIndex + 6]; SetCommon(&npObj, x, y, depth, scale, finalScale); var flags = numbers->IntArray[numberArrayIndex + 17]; var useDepthBasedDrawPriority = (flags & 0x8) != 0; if (useDepthBasedDrawPriority != atkResNodeIsUsingDepthBasedDrawPriorityFunc((AtkResNode *)npObj.RootNode)) { atkResNodeSetUseDepthBasedDrawPriorityFunc((AtkResNode *)npObj.RootNode, useDepthBasedDrawPriority); var rootComponent = npObj.RootNode->Component; if (rootComponent->UldManager.Objects != null) { var count = rootComponent->UldManager.Objects->NodeCount + rootComponent->UldManager.UnknownCount; // not sure what unknown count is here for (uint nodeIndex = 0; nodeIndex < count; nodeIndex++) { var node = atkUldManagerSearchNodeByIndexFunc(&rootComponent->UldManager, nodeIndex); atkResNodeSetUseDepthBasedDrawPriorityFunc(node, useDepthBasedDrawPriority); } } } bool disableAlternatePartId = (flags & 0x100) != 0; if (disableAlternatePartId) { npObj.ImageNode5->PartId = 1; } else { npObj.ImageNode5->PartId = thisPtr->AlternatePartId; } byte updatesRequestedState = (byte)numbers->IntArray[numberArrayIndex + 2]; } } }