@tool extends Node @export var tilemaplayer: TileMapLayer ##Change if you dont want to use the first tilesetsource @export var tileset_source_id: int = 1 ##load the tilemaplayer data @export_tool_button("get tiledata") var get_tile_data_button: Callable = get_modulates ##Colors and tile coords @export var tile_modulates: Dictionary [Color, Array] ##change the colors here @export var tile_modulates_to_change: Dictionary [Array, Color] var saved_dict: Dictionary [Color, Array] var redo_dict: Dictionary [Color, Array] var atlas_coords:Array[Vector2i] @export_tool_button("undo") var undon: Callable = undo_all func undo_all(): redo_dict = get_data() var mirror_dict: Dictionary [Array, Color] for color in saved_dict: mirror_dict[saved_dict[color]] = color if atlas_coords.size() != 0: for array: Array in saved_dict.values(): for coord: Vector2i in array: var c = mirror_dict[array] var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var tile_data: TileData = source.get_tile_data(coord, 0) tile_data.modulate = c @export_tool_button("redo") var redo: Callable = redo_last func redo_last(): saved_dict = get_data() var mirror_dict: Dictionary [Array, Color] for color in redo_dict: mirror_dict[redo_dict[color]] = color if atlas_coords.size() != 0: for array: Array in redo_dict.values(): for coord: Vector2i in array: var c = mirror_dict[array] var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var tile_data: TileData = source.get_tile_data(coord, 0) tile_data.modulate = c func get_modulates(): clear_all() tile_modulates = get_data() for color in tile_modulates: tile_modulates_to_change[tile_modulates[color]] = color saved_dict = tile_modulates.duplicate() func get_data() -> Dictionary: var dict: Dictionary [Color, Array] var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var atlas_size = source.get_atlas_grid_size() atlas_texture = AtlasTexture.new() atlas_texture.atlas = source.texture for xi in atlas_size.x: for yi in atlas_size.y: atlas_coords.append(Vector2i(xi, yi)) for coord in atlas_coords: if source.has_tile(coord): var tile_data = source.get_tile_data(coord, 0) var color = tile_data.modulate if !dict.has(color): var a : Array a.append(coord) dict.get_or_add(color, a) else: if !dict[color].has(coord): dict[color].append(coord) return dict ## change the colors in the tile_modulate_to_change dict as you like and hit the apply button @export_tool_button("apply changes") var apply: Callable = apply_changes func apply_changes(): if atlas_coords.size() != 0: for array: Array in tile_modulates.values(): for coord: Vector2i in array: var c = tile_modulates_to_change[array] var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var tile_data: TileData = source.get_tile_data(coord, 0) tile_data.modulate = c else: print("get tiledata first!") func clear_all(): tile_modulates.clear() tile_modulates_to_change.clear() atlas_coords.clear() saved_dict.clear() redo_dict.clear() ## specify the region @export var atlas_texture: AtlasTexture ## change the color @export var color_applied_to_atlas_region: Color @export_tool_button("apply color to region") var apply_to_region: Callable = apply_color_to_region func apply_color_to_region(): if atlas_coords.size() != 0: var tile_size: Vector2 = tilemaplayer.tile_set.tile_size var region: Rect2 = atlas_texture.region var start_tile = Vector2(region.position.x / tile_size.x, region.position.y / tile_size.y) var end_tile = Vector2(region.end.x / tile_size.x, region.end.y / tile_size.y) if end_tile != Vector2.ZERO: for x in range(start_tile.x, end_tile.x): for y in range(start_tile.y, end_tile.y): #print(Vector2(x,y)) var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var tile_data: TileData = source.get_tile_data(Vector2(x,y), 0) tile_data.modulate = color_applied_to_atlas_region else: for coord in atlas_coords: var source: TileSetAtlasSource = tilemaplayer.tile_set.get_source(tileset_source_id) var tile_data: TileData = source.get_tile_data(coord, 0) tile_data.modulate = color_applied_to_atlas_region else: print("get tiledata first!")
or share this direct link: