Esempio n. 1
0
        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();
                    }
                }
            }
        }
Esempio n. 2
0
 private void AddonNameplateOnUpdateDetour(AddonNamePlate *thisPtr, NumberArrayData **numberData,
                                           StringArrayData **stringData)
 {
     numberData[5]->IntArray[3] = 1;
     this.addonNameplateOnUpdateHook.Original(thisPtr, numberData, stringData);
 }
Esempio n. 3
0
 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);
        }
Esempio n. 7
0
        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];
                }
            }
        }