public void SaveLevel()
    {
        s_object[,,] objec = Grid.blocks;

        data_level da = new data_level();

        da.blocks = new List <data_level.data_block>();
        da.doors  = new List <data_level.data_door>();

        da.size_x = Grid.worldsize.x;
        da.size_y = Grid.worldsize.y;
        da.size_z = Grid.worldsize.z;

        da.name = inpfeild.text;
        for (int x = 0; x < Grid.worldsize.x - 1; x++)
        {
            for (int y = 0; y < Grid.worldsize.y - 1; y++)
            {
                for (int z = 0; z < Grid.worldsize.z - 1; z++)
                {
                    if (objec[x, y, z])
                    {
                        //This is a pretty crude approach, trying to save everything into seperate things

                        if (objec[x, y, z].GetType() == typeof(o_door))
                        {
                            o_door door = (o_door)objec[x, y, z];
                            if (door.location != "")
                            {
                                da.doors.Add(new data_level.data_door(x, y, z,
                                                                      door.locked,
                                                                      door.name,
                                                                      door.location,
                                                                      new Vector3Int(
                                                                          door.teleport_position.x,
                                                                          door.teleport_position.y,
                                                                          door.teleport_position.z
                                                                          ),
                                                                      door.DOOR_STATE,
                                                                      door.required_waterstones));
                            }
                            else
                            {
                                da.doors.Add(new data_level.data_door(x, y, z, door.name,
                                                                      door.locked,
                                                                      new Vector3Int(
                                                                          door.teleport_position.x,
                                                                          door.teleport_position.y,
                                                                          door.teleport_position.z
                                                                          ),
                                                                      door.DOOR_STATE,
                                                                      door.required_waterstones
                                                                      ));
                            }
                        }
                        else if (objec[x, y, z].GetType() == typeof(o_block))
                        {
                            da.blocks.Add(new data_level.data_block(x, y, z, objec[x, y, z].name));
                        }
                        else if (objec[x, y, z].GetType() == typeof(o_item))
                        {
                            o_item item = (o_item)objec[x, y, z];
                            da.items.Add(new data_level.data_item(x, y, z, item.name, item.item));
                        }
                    }
                }
            }
        }

        if (levels.Count == 0 || levels[currentLevNum].name != da.name)
        {
            levels.Add(da);
        }
        else if (levels[currentLevNum].name == da.name)
        {
            levels[currentLevNum] = da;
        }
    }