예제 #1
0
        public void AddMateria(byte materiaId, uint experience = 0)
        {
            var scanResult = _memory.ScanMem(Settings.ProcessName,
                                             FirstAddress, ItemSize, InvCapacity, IsEmpty);

            if (scanResult.BaseAddrOffset == -1)
            {
                return;
            }

            IntPtr address     = IntPtr.Add(FirstAddress, scanResult.BaseAddrOffset);
            var    materiaSlot = new MateriaSlot(materiaId, experience);

            _memory.WriteMem(Settings.ProcessName, address, materiaSlot.AsBytes());

            bool IsEmpty(byte[] bytes) => bytes.All(b => b == byte.MaxValue);
        }
        public void AddItem(ushort itemId, ushort quantity = 1, bool allowIncrement = true)
        {
            var scanResult = _memory.ScanMem(Settings.ProcessName,
                                             FirstAddress, ItemSize, InvCapacity, IsItem);

            if (scanResult.BaseAddrOffset == -1) // Have none, find empty
            {
                scanResult = _memory.ScanMem(Settings.ProcessName,
                                             FirstAddress, ItemSize, InvCapacity, IsEmpty);
                WriteInventoryItem(new InventorySlot(itemId, quantity), scanResult.BaseAddrOffset);
            }
            else if (allowIncrement)
            {
                var item = new InventorySlot(scanResult.Bytes);
                item.Quantity += quantity;
                WriteInventoryItem(item, scanResult.BaseAddrOffset);
            }


            bool IsItem(byte[] bytes) => new InventorySlot(bytes).ItemId == itemId;
            bool IsEmpty(byte[] bytes) => bytes.All(b => b == byte.MaxValue);
            void WriteInventoryItem(InventorySlot inventorySlot, int addrOffset)
            => _memory.WriteMem(Settings.ProcessName, IntPtr.Add(FirstAddress, addrOffset), inventorySlot.AsBytes());
        }