Jump to content
    1. Welcome to GTAForums!

    1. GTANet.com

    1. GTA Online

      1. The Criminal Enterprises
      2. Updates
      3. Find Lobbies & Players
      4. Guides & Strategies
      5. Vehicles
      6. Content Creator
      7. Help & Support
    2. Red Dead Online

      1. Blood Money
      2. Frontier Pursuits
      3. Find Lobbies & Outlaws
      4. Help & Support
    3. Crews

    1. Grand Theft Auto Series

      1. Bugs*
      2. St. Andrews Cathedral
    2. GTA VI

    3. GTA V

      1. Guides & Strategies
      2. Help & Support
    4. GTA IV

      1. The Lost and Damned
      2. The Ballad of Gay Tony
      3. Guides & Strategies
      4. Help & Support
    5. GTA San Andreas

      1. Classic GTA SA
      2. Guides & Strategies
      3. Help & Support
    6. GTA Vice City

      1. Classic GTA VC
      2. Guides & Strategies
      3. Help & Support
    7. GTA III

      1. Classic GTA III
      2. Guides & Strategies
      3. Help & Support
    8. Portable Games

      1. GTA Chinatown Wars
      2. GTA Vice City Stories
      3. GTA Liberty City Stories
    9. Top-Down Games

      1. GTA Advance
      2. GTA 2
      3. GTA
    1. Red Dead Redemption 2

      1. PC
      2. Help & Support
    2. Red Dead Redemption

    1. GTA Mods

      1. GTA V
      2. GTA IV
      3. GTA III, VC & SA
      4. Tutorials
    2. Red Dead Mods

      1. Documentation
    3. Mod Showroom

      1. Scripts & Plugins
      2. Maps
      3. Total Conversions
      4. Vehicles
      5. Textures
      6. Characters
      7. Tools
      8. Other
      9. Workshop
    4. Featured Mods

      1. Design Your Own Mission
      2. OpenIV
      3. GTA: Underground
      4. GTA: Liberty City
      5. GTA: State of Liberty
    1. Rockstar Games

    2. Rockstar Collectors

    1. Off-Topic

      1. General Chat
      2. Gaming
      3. Technology
      4. Movies & TV
      5. Music
      6. Sports
      7. Vehicles
    2. Expression

      1. Graphics / Visual Arts
      2. GFX Requests & Tutorials
      3. Writers' Discussion
      4. Debates & Discussion
    1. Announcements

    2. Support

    3. Suggestions

*DO NOT* SHARE MEDIA OR LINKS TO LEAKED COPYRIGHTED MATERIAL. Discussion is allowed.

Changing a prop/entity size/scale by accessing its size in memory or using matrix/quaternion


ChillestDev
 Share

Recommended Posts

ChillestDev

How would I go about changing a props/entities size by accessing its size in the memory/bytes or by using the matrix function or using quaternions.

 

I want to take a prop/entity from the map, and edit its size.

Edited by ChillestDev
Link to comment
Share on other sites

2 hours ago, ChillestDev said:

How would I go about changing a props/entities size by accessing its size in the memory/bytes or by using the matrix function or using quaternions.

 

I want to take a prop/entity from the map, and edit its size.

 

There's a native GET_ENTITY_MATRIX which you could use to get the current values back.

 

You could try getting those values, converting them to a byte[] and then scanning the memory at Entity.MemoryAddress for a matching sequence based on the layout of a Matrix. You could then adjust the prop's rotation and do the same scan process. If you found the old and new values at the same memory address, then that would potentially verify its location in memory. You could pull the values from memory to create a Matrix based on its current values, create a Scale matrix, multiple the two matrices and then try feeding those values back into the memory location you had identified.

 

I thought I had a mod that did that because I remember trying something similar a long time back. I remember it failing miserably though, so I probably deleted the mod. But I always consider that failures could be a result of my bad code, so don't take that as meaning it's not possible... I just couldn't get it to work back then.

 

The other problem you get with props is that if you do scale them, like in Codewalker, the collision doesn't scale with the prop, which is why they generally advise against it in Ymaps.

 

Edit: Interesting, just seen the other thread you replied to just after I found this class I created back in 2018. I can't remember if I confirmed it was converting the byte[] to a Matrix in the right order or not.

 

Edit: I also don't know why all those lines are commented out, the Matrix doesn't get filled with them like that. The perils of old code and a failing memory. 😞

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using GTA;
using GTA.Math;
using GTA.Native;
using Control = GTA.Control;
using Font = GTA.Font;
using System.Runtime.InteropServices;

namespace EntityMatrixExtensionClasses
{
    internal static unsafe class EntityMatrixExtensions
    {
        private static int MatrixAddressOffset = 0x060;
        private static int ColMatrixAddressOffset = MatrixAddressOffset + 0x020;

        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        /// <summary>
        /// Get the data that represents the matrix for the entity
        /// </summary>
        /// <param name="ent"></param>
        /// <returns></returns>
        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        public static Matrix GetEntityMatrix(this Entity ent)
        {
            IntPtr address = (IntPtr)ent.MemoryAddress;

            byte[] byteArray = new byte[64];
            Marshal.Copy(byteArray, 0, address + MatrixAddressOffset, byteArray.Length);

            return Bytes2Matrix(byteArray);
        }

        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        /// <summary>
        /// Get the data that represents the collision matrix from the entity
        /// </summary>
        /// <param name="ent"></param>
        /// <returns></returns>
        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        public static Matrix GetEntityColMatrix(this Entity ent)
        {
            IntPtr address = (IntPtr)ent.MemoryAddress;

            byte[] byteArray = new byte[64];
            Marshal.Copy(byteArray, 0, address + ColMatrixAddressOffset, byteArray.Length);

            return Bytes2Matrix(byteArray);
        }

        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        /// <summary>
        /// Converts a byte array into a Matrix
        /// </summary>
        /// <param name="byteArray"></param>
        /// <returns></returns>
        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        private static Matrix Bytes2Matrix(byte[] byteArray)
        {
            Matrix newMat = Matrix.Identity;
            List<float> matrixElements = new List<float>();

            for (int b = 0; b < 64; b += 4)
            {
                float matrixElement = BitConverter.ToSingle(byteArray, b);
                matrixElements.Add(matrixElement);
                UI.Notify(b.ToString() + " - " + matrixElement.ToString());
            }

            //newMat.M11 = matrixElements[0];
            //newMat.M12 = matrixElements[1];
            //newMat.M13 = matrixElements[2];
            //newMat.M14 = matrixElements[3];

            //newMat.M21 = matrixElements[4];
            //newMat.M22 = matrixElements[5];
            //newMat.M23 = matrixElements[6];
            //newMat.M24 = matrixElements[7];

            //newMat.M31 = matrixElements[8];
            //newMat.M32 = matrixElements[9];
            //newMat.M33 = matrixElements[10];
            //newMat.M34 = matrixElements[11];

            //newMat.M41 = matrixElements[12];
            //newMat.M42 = matrixElements[13];
            //newMat.M43 = matrixElements[14];
            //newMat.M44 = matrixElements[15];

            return newMat;
        }

        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
        public static byte[] GetEntityData(this Entity ent, int length)
        {
            var address = (IntPtr)ent.MemoryAddress;

            byte[] bytes = new byte[length];
            Marshal.Copy(address, bytes, 0, length);
            return bytes;
        }
    }
}

 

Edited by LeeC22
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

  • 1 User Currently Viewing
    0 members, 0 Anonymous, 1 Guest

×
×
  • Create New...

Important Information

By using GTAForums.com, you agree to our Terms of Use and Privacy Policy.