GML ds_list_add() not working properly

F

Frisk17

Guest
Hi,
I was following a tutorial
by friendly cosmonaut on event system in gms2. My all my scripts were working fine except event_register:

Code:
ds_list_add(listenerList, listenerInfo);
Error: ds_list_add argument 1 incorrect type(undefined) line 36[given above..]
Can an array be directly put into a list as in the tutorial.

Please help..
 
T

Taddio

Guest
Do you have these lines somewhere as well?
Code:
listenerList = ds_list_create();

//As well as

listenerInfo = something;
 
F

Frisk17

Guest
Code:
    //The scripts and arguments
    listenerInfo[0] = objectId;
    //Scripts and arguments
    var len = argument_count - 2;
    
    i = 0; repeat(len) {
        listenerInfo[i+1] = argument[i+2];
        i++;
    }
Sure, I do..
 
Code:
var listenerList = ds_list_create();
Any solutions?
Any variable prefixed by "var" is a local variable. It gets deleted as soon as the current script/event is over. It also DOES NOT free the data structure from memory. You'll have to use ds_list_destroy for that. Are you sure that isn't causing your issues?
 
F

Frisk17

Guest
Certainly, I think it doesn't I've freed space in another script:
Code:
///@desc event_unregister
///@arg event
///@arg objectId

with(obj_eventmanager) {
    var event = argument[0];
    var objectId = argument[1];
   
    if(ds_map_exists(eventMap, event)) {
        var listenerList = eventMap[? event];
        var len = ds_list_size(listenerList);
       
        i = 0; repeat(len) {
            var listenerInfo = listenerList[| i];
            if(listenerInfo[0] == objectId) {
                if(len == 1) {
                    ds_list_destroy(listenerList);
                    ds_map_delete(eventMap, listenerList);
                } else {
                    ds_list_delete(listenerList, i);
                }
            }
            i++;
        }
    }
}
Also, the I'm adding that data to the permanent variable eventMap and then the temporary variable gets deleted so no loss..

Code:
///@desc event_register
///@arg event
///@arg objectid
///@arg script
///@arg arg1...*

with(obj_eventmanager) {
    var event = argument[0];
    var objectId = argument[1];
   
    if(ds_map_exists(eventMap, event)) {
        //Create the list of listeners
        var listenerList = ds_list_create();
       
        //Add the listener
        ds_map_add_list(eventMap, event, listenerList);  
    } else {
        //Find the value and set..
        var listenerList = ds_map_find_value(eventMap, event);
    }
   
    //The info of the listeners
    var listenerInfo;
   
    //The scripts and arguments
    listenerInfo[0] = objectId;
    //Scripts and arguments
    var len = argument_count - 2;
   
    i = 0; repeat(len) {
        listenerInfo[i+1] = argument[i+2];
        i++;
    }
   
    //Add the info to the listenerlist
    ds_list_add(listenerList, listenerInfo);
}
This is actually the whole script from which I showed you guys the part..
Though I don't think this is important but for the functioning(this script tells if an event is fired):
Code:
///@desc event_fire
///@arg event

with(obj_eventmanager) {
    var event = argument[0];
   
    //Check if event is registered
    if(ds_map_exists(eventMap, event)) {
        var listenerList = eventMap[? event];
        var len = ds_list_size(listenerList);
       
        var listenerInfo, listener, script, args;
       
        var i = 0; repeat(len) {
            listenerInfo = listenerList[| i];
            listener = listenerInfo[0];
            script = listenerInfo[1];
           
            var lenArgs = array_length_1d(listenerInfo) - 2;
            var unregister = false;
           
            if(lenArgs <= 0) {
                if(instance_exists(listener)) {
                    with(listener) { unregister = script_execute(script); }
                } else unregister = true;
            } else {
                if(instance_exists(listener)) {
                    args = array_create(lenArgs, 0);
                    array_copy(args, 0, listenerInfo, 2, lenArgs);
                    with(listener) { unregister = script_execute_alt(script, args); }
                } else {
                    unregister = true;
                }
            }
           
            if(unregister) {
                event_unregister(event, listener);
               
                i--;
            }
           
            i++;
        }
    }
}
PS: Sorry, for sending this bunch of stuff wasting your time
 
F

Frisk17

Guest
Wait, I just fixed it!!
I by mistake checked: if map exists rather than not exists...........
Line 11 that's why the list was actually unindexed array..
 
Top