-- Sample transitional terrains declaration. Note that the transitional has greater id than the 2 that use it. --- Returns the index of the terrain giving its name as input. -- @cstyle int GetTerrainTextureIndex(string nameTerrain). -- @param nameTerrain string. the name of the terrain. -- @return int. index of the terrain (nil if invalid terrain name is given). if FirstLoad then TerrainTextures = {} TerrainNameToIdx = {} end --- Returns the index of the terrain giving its name as input. -- @param nameTerrain string. the name of the terrain. -- @return int. index of the terrain (nil if invalid terrain name is given). function GetTerrainTextureIndex(nameTerrain) return TerrainNameToIdx[nameTerrain] end --- --- Returns the terrain texture preview image for the given terrain name. --- --- @param nameTerrain string The name of the terrain. --- @return boolean|userdata The terrain texture preview image, or false if the terrain name is invalid. function GetTerrainTexturePreview(nameTerrain) local idx = GetTerrainTextureIndex(nameTerrain) return idx and TerrainTextures[idx] and GetTerrainImage(TerrainTextures[idx].basecolor) or false end --- --- Returns a combo box containing all the terrain names. --- --- @return table A table containing the terrain names. function GetTerrainNamesCombo() return PresetsCombo("TerrainObj", false, "") end ---- if FirstLoad then suspendReasons = {} end --- --- Suspends terrain invalidations for the given reason. --- --- If there are no other reasons to suspend terrain invalidations and the map is not empty, this function will suspend terrain invalidation. --- The given reason is stored in the `suspendReasons` table, and terrain invalidation will remain suspended until `ResumeTerrainInvalidations` is called with the same reason. --- --- @param reason string|boolean The reason for suspending terrain invalidations, or `false` if no specific reason is given. function SuspendTerrainInvalidations(reason) reason = reason or false if next(suspendReasons) == nil and GetMap() ~= "" then terrain.SuspendInvalidation() end suspendReasons[reason] = true end --- --- Resumes terrain invalidations that were previously suspended. --- --- If there are no other reasons to suspend terrain invalidations and the map is not empty, this function will resume terrain invalidation. --- The given reason is removed from the `suspendReasons` table, and terrain invalidation will resume if there are no other reasons to suspend it. --- --- @param reason string|boolean The reason for suspending terrain invalidations, or `false` if no specific reason was given. --- @param reload boolean If true, forces a reload of the terrain textures. function ResumeTerrainInvalidations(reason, reload) reason = reason or false suspendReasons[reason] = nil if next(suspendReasons) == nil and GetMap() ~= "" then if reload then hr.TR_ForceReloadNoTextures = 1 end terrain.ResumeInvalidation() end end ---- if FirstLoad then activeThread = false end --- --- Schedules a terrain reload to occur in 3 seconds. --- --- If there is no active thread for reloading the terrain, this function will create a new real-time thread that will sleep for 2.8 seconds and then force a reload of the terrain textures. --- --- @function ScheduleReloadTerrain --- @return nil function ScheduleReloadTerrain() if not IsValidThread(activeThread) then print("The terrain will be reloaded in 3 sec.") activeThread = CreateRealTimeThread(function() Sleep(2800) hr.TR_ForceReloadTextures = true activeThread = false end) end end --[==[ local step = const.TypeTileSize local map = box(0, 0, terrain.GetMapWidth() - 1, terrain.GetMapHeight() - 1) local typestats = {} for j = map:miny(), map:maxy(), step do for i = map:minx(), map:maxx(), step do local type = terrain.GetTerrainType(point(i,j)) if type then typestats[type] = typestats[type] and typestats[type] + 1 or 1 end end end print("------------------------------------------------------------") print("Terrain test:") for type, texture in sorted_pairs(TerrainTextures) do local count = typestats[type] or 0 print("Texture " .. texture.id .. " used " .. count .. " times.") end ]==]