Log in to reply
 

Game crashes upon calling DELETE_PED Function???



  • Here's the general overview:

    • I'm creating a mod menu.
    • I'm still fairly new to C# and the GTAV local natives.
    • The game crashes whenever I run the following functions: DELETE_PED, DELETE_ENTITY, and REMOVE_PED_ELEGANTLY.

    All I want to do is delete a spawned ped, because they never seem to despawn like naturally-spawning game peds.

    What the code does:

    • Creates a new pedestrian when a UI button is selected & adds it to a Ped List.
    • A tick is set to constantly run through the function(removeDeadEntity()) to check if the ped is both dead and not moving.
    • In the removeDeadEntity() function, it loops through the length of the list, checking, like what was previously stated, if the ped is both dead and not moving.
    • The only problem is, is the game crashes every time when both conditions are met in the if() statement.

    Code: (I removed the code that shouldn't have any affect.)

    (If you need to actually run the mod menu, here's the link >> https://mega.nz/#!EzRw3DpY!JBXNCzlhoRJBjRBPQzQQWdZmnbZA1k1SbnElQBDjsg0 (Press "Z" to activate.))

    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using GTA;
    using GTA.Native;
    using NativeUI;
    using GTA.Math;

    public class MenuExample : Script { // Main Script
    private MenuPool _menuPool; // MenuPool
    private Player player = Game.Player;
    private Ped playerPed = Game.Player.Character;

    List<Ped> spawnedPedList = new List<Ped>();
    
    
    // This is where Menu1 is created
    public void Menu1(UIMenu menu) {
        // This is where the submenus and/or buttons are created
        var playerOptions = _menuPool.AddSubMenu(menu, "Player Options"); 
    
    // This is where the pedestrian menu opens/is created
    public void Menu2(UIMenu menu) { 
    
        var submenu1 = _menuPool.AddSubMenu(menu, "Pedestrian Menu");
    
        for (int i = 0; i > 1; i++) {     // Enables the submenu
        
    
        }
    
        var pedMoods = new List<dynamic> {
            "Angry ped",
            "Happy ped",
            "Gang War ped"
        };
        var spawnedPedMoodList = new UIMenuListItem("Set ped mood:", pedMoods, 0);
        var spawnPed = new UIMenuItem("Spawn a person");
        int spawnedPedMoodType = 0;
        submenu1.AddItem(button1);         
    
        submenu1.OnItemSelect += (sender, item, index) => {          // Checks if the button is selected
    
            if(item == spawnPed) {
                Vector3 position = Game.Player.Character.Position + Game.Player.Character.ForwardVector * 5;
                Ped spawnedPed = World.CreatePed(new Model(PedHash.Soucent04AMM), position);
                Function.Call(Hash._0xD30C50DF888D58B5, spawnedPed.Handle, true);
                spawnedPed.Weapons.Give(WeaponHash.MicroSMG, 9000, true, true);
                Function.Call(Hash.SET_PED_COMBAT_ABILITY, spawnedPed, 100); // 100 = attack
                spawnedPedList.Add(spawnedPed);
                if(spawnedPedMoodType == 0) {
                    spawnedPed.Task.FightAgainst(Game.Player.Character);
                }
                else if(spawnedPedMoodType == 1) {
                    Function.Call(Hash.TASK_WANDER_STANDARD, 10.0f, 10);
                }
                else if(spawnedPedMoodType == 2) {
                    spawnedPed.Task.ShootAt(spawnedPed.Position);
                }
            }
        };
    
        submenu1.AddItem(spawnedPedMoodList);
        submenu1.AddItem(spawnPed);
        submenu1.OnListChange += (sender, item, index) => {
            if (item == spawnedPedMoodList) {
                if(index == 0) {
                    spawnedPedMoodType = 0;
                }
                else if(index == 1) {
                    spawnedPedMoodType = 1;
                }
                else if(index == 2) {
                    spawnedPedMoodType = 2;
                }
            }
        };
    }   //MENU 2 END
    
    
    //MY FUNCTIONS
    
    public void removeDeadEntity() {
        Vector3 stillPosition = new Vector3(0f, 0f, 0f);
        if (spawnedPedList.Count != 0) { 
            for (int i = 0; i < spawnedPedList.Count; i++) {
                if (Function.Call<Vector3>(Hash.GET_ENTITY_VELOCITY, spawnedPedList[i]) == stillPosition && Function.Call<bool>(Hash._IS_PED_DEAD, spawnedPedList[i])) {
                    Function.Call(Hash.DELETE_PED, spawnedPedList[i]);
                }
            }
        }
    }
    
    //MY FUNCTIONS
    
    // Main Base, including the menu name, hotkeys etc
    public MenuExample() { 
    
        _menuPool = new MenuPool();         // MenuPool
        var mainMenu = new UIMenu("~g~MeestaUI Mod Menu", "~b~Happy modding");      
        _menuPool.Add(mainMenu);            // Adds the main menu
    
        Menu1(mainMenu);
        Menu2(mainMenu);
    
        _menuPool.RefreshIndex();           // Refreshes the Index
        Tick += (o, e) => _menuPool.ProcessMenus();         // Constant tick, processes the menus
        Tick += (o, e) => removeDeadEntity();
        KeyDown += (o, e) => {       // Enables hotkey(s)
            if (e.KeyCode == Keys.Z && !_menuPool.IsAnyMenuOpen()) {  
                mainMenu.Visible = !mainMenu.Visible;
            }
        };
    }
    

    }

    Thanks for the help!


  • MODERATOR

    It's because you don't remove the deleted ped from the list, which means the next time the function is called you'll be trying to call these functions on a non-existent ped.

    Here is the corrected function (with some other improvements):

    public void removeDeadEntity() 
    {
    	if (spawnedPedList.Count != 0) 
    	{ 
    		for (int i = 0; i < spawnedPedList.Count; i++) 
    		{
    			if (spawnedPedList[i] == null || !spawnedPedList[i].Exists()) //always make sure the ped still exists
    			{
    				spawnedPedList.RemoveAt(i); //remove the non-existent ped from the list
    				i--;
    				
    				continue;
    			}
    		
    			if (spawnedPedList[i].Velocity == Vector3.Zero && spawnedPedList[i].IsDead) 
    			{
    				spawnedPedList[i].Delete();
    				
    				spawnedPedList.RemoveAt(i); //make sure to remove it from the list
    				i--;
    			}
    		}
    	}
    }


  • @Jitnaught Thanks! Works like a charm :D


Log in to reply
 

Looks like your connection to GTA5-Mods.com Forums was lost, please wait while we try to reconnect.