This commit is contained in:
Yair Morgenstern 2021-04-21 22:12:46 +03:00
parent 2b6c9e7ec0
commit 55ef131fb2
34 changed files with 161 additions and 39 deletions

View File

@ -949,6 +949,8 @@ Download = Download
Done! = Concluído!
Delete [modName] = Deletar [modName]
Are you SURE you want to delete this mod? = Tem CERTEZA que deseja deletar este mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3753,6 +3755,8 @@ Moai = Moai
Cannot be built on bonus resource = Não pode ser construído com recurso de bônus
Terrace farm = Cultivo em terraços
# Requires translation!
Unpillagable =
Ancient ruins = Ruínas antigas
City ruins = Ruínas da cidade

View File

@ -967,6 +967,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -4991,6 +4993,8 @@ Moai =
Cannot be built on bonus resource =
Terrace farm = Терасна ферма
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -267,9 +267,7 @@ Mods: = Mody:
Base ruleset mods: = Mody zakladních pravidel:
Extension mods: = Rozšiřující mody:
# Requires translation!
World Wrap = Zakulacení světa
# Requires translation!
World wrap maps are very memory intensive - creating large world wrap maps on Android can lead to crashes! = Mapy se zakulaceným světem jsou velmi náročné na paměť - vytváření velkých zakulacených map na Androidu může vést k padání aplikace!
# Multiplayer
@ -514,7 +512,6 @@ Culture = Kultura
Food = Jídlo
Crop Yield = Výnos plodiny
# Requires translation!
Territory = Území
Force = Síla
GOLDEN AGE = ZLATÝ VĚK
@ -932,6 +929,8 @@ Download = Stáhnout
Done! = Hotovo!
Delete [modName] = Smazat [modName]
Are you SURE you want to delete this mod? = OPRAVDU chcete smazat tento mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3125,6 +3124,8 @@ Moai = Moai
Cannot be built on bonus resource = Nesmí být postaveno na bonusové surovině
Terrace farm = Terasovité pole
# Requires translation!
Unpillagable =
Ancient ruins = Starobylé ruiny
City ruins = Zřiceniny města

View File

@ -933,6 +933,8 @@ Download = Download
Done! = Klaar!
Delete [modName] = Verwijder [modName]
Are you SURE you want to delete this mod? = Weet je zeker dat je deze mod wil verwijderen?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -4519,6 +4521,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
Ancient ruins = Oude ruïnes
City ruins = Ruïnes van de stad

View File

@ -1736,6 +1736,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -5796,6 +5798,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -1015,6 +1015,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -4052,6 +4054,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -932,6 +932,8 @@ Download = Télécharger
Done! = Fini!
Delete [modName] = Supprimer [modName]
Are you SURE you want to delete this mod? = Êtes vous SÛR de vouloir supprimer ce mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3149,6 +3151,8 @@ Moai = Moai
Cannot be built on bonus resource = Ne peut être construit sur une ressource bonus
Terrace farm = Culture en terrasse
# Requires translation!
Unpillagable =
Ancient ruins = Anciennes ruines
City ruins = Ruines

View File

@ -932,6 +932,8 @@ Download = Download
Done! = Abgeschlossen!
Delete [modName] = Lösche [modName]
Are you SURE you want to delete this mod? = SICHER, dass diese Modifikation gelöscht werden soll?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3111,6 +3113,8 @@ Moai = Moai
Cannot be built on bonus resource = Darf nicht auf Bonus-Ressourcen gebaut werden
Terrace farm = Terrassenfelder
# Requires translation!
Unpillagable =
Ancient ruins = Altertümliche Ruinen
City ruins = Stadtruinen

View File

@ -948,6 +948,8 @@ Download = Letöltés
Done! = Kész!
Delete [modName] = [modName] törlése
Are you SURE you want to delete this mod? = Biztosan TÖRLI ezt a modot?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3780,6 +3782,8 @@ Moai =
Cannot be built on bonus resource =
Terrace farm = Terasz farm
# Requires translation!
Unpillagable =
Ancient ruins = Ősi romok
City ruins = Városromok

View File

@ -932,6 +932,8 @@ Download = Unduh
Done! = Selesai!
Delete [modName] = Hapus [modName]
Are you SURE you want to delete this mod? = Apakah kamu YAKIN untuk menghapus mod ini?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3111,6 +3113,8 @@ Moai = Moai
Cannot be built on bonus resource = Tidak bisa dibangun di atas sumber daya bonus
Terrace farm = Sawah bersengkedan
# Requires translation!
Unpillagable =
Ancient ruins = Reruntuhan kuno
City ruins = Reruntuhan kota

View File

@ -929,6 +929,8 @@ Download = Scarica
Done! = Fatto!
Delete [modName] = Cancella [modName]
Are you SURE you want to delete this mod? = Vuoi davvero cancellare questa mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3105,6 +3107,8 @@ Moai = Moai
Cannot be built on bonus resource = Non costruibile sulle risorse bonus
Terrace farm = Terrazzamento
# Requires translation!
Unpillagable =
Ancient ruins = Antiche rovine
City ruins = Rovine cittadine

View File

@ -932,6 +932,8 @@ Download = ダウンロード
Done! = 完了!
Delete [modName] = [modName]を消去
Are you SURE you want to delete this mod? = このMODを削除しますか
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3111,6 +3113,8 @@ Moai = モアイ
Cannot be built on bonus resource = ボーナス資源の上では建設できない
Terrace farm = 棚田
# Requires translation!
Unpillagable =
Ancient ruins = 古代遺跡
City ruins = 廃墟都市

View File

@ -951,6 +951,8 @@ Download = 다운로드
Done! = 완료!
Delete [modName] = [modName] 삭제
Are you SURE you want to delete this mod? = 이 모드를 정말로 삭제하시겠습니까?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3150,6 +3152,8 @@ Moai = 모아이
Cannot be built on bonus resource = 보너스 자원 위에 건설 불가
Terrace farm = 계단식 농업
# Requires translation!
Unpillagable =
Ancient ruins = 고대 유적
City ruins = 도시 폐허

View File

@ -1059,6 +1059,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -5094,6 +5096,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -1576,6 +1576,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -5439,6 +5441,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -1020,6 +1020,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -5026,6 +5028,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -1017,6 +1017,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -5023,6 +5025,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
# Requires translation!
Ancient ruins =

View File

@ -931,6 +931,8 @@ Download = Pobierz
Done! = Zrobione!
Delete [modName] = Usuń [modName]
Are you SURE you want to delete this mod? = Czy jesteś pewny, że chcesz usunąć ten mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3143,6 +3145,8 @@ Moai = Moai
Cannot be built on bonus resource = Nie można zbudować na bonusowych surowcach.
Terrace farm = Uprawa tarasowa
# Requires translation!
Unpillagable =
Ancient ruins = Starożytne ruiny
City ruins = Ruiny miasta

View File

@ -1004,6 +1004,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -4576,6 +4578,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
Ancient ruins = Ruínas antigas
City ruins = Ruínas da cidade

View File

@ -1108,6 +1108,8 @@ Done! =
Delete [modName] =
# Requires translation!
Are you SURE you want to delete this mod? =
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -4765,6 +4767,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
Ancient ruins = Ruine străvechi
City ruins = Oraș în ruină

View File

@ -933,6 +933,8 @@ Download = Скачать
Done! = Готово!
Delete [modName] = Удалить [modName]
Are you SURE you want to delete this mod? = Вы УВЕРЕНЫ что хотите удалить этот мод?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3112,6 +3114,8 @@ Moai = Статуя Моаи
Cannot be built on bonus resource = Нельзя построить на бонусных ресурсах
Terrace farm = Террасная ферма
# Requires translation!
Unpillagable =
Ancient ruins = Древние руины
City ruins = Руины города

View File

@ -929,6 +929,8 @@ Download = 下载
Done! = 完成!
Delete [modName] = 删除模组:[modName]
Are you SURE you want to delete this mod? = 你确定要删除这个模组吗?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3105,6 +3107,8 @@ Moai = 摩艾石像群
Cannot be built on bonus resource = 无法建造在拥有奖励资源的地块
Terrace farm = 梯田
# Requires translation!
Unpillagable =
Ancient ruins = 远古遗迹
City ruins = 城市废墟

View File

@ -931,6 +931,8 @@ Download = Descargar
Done! = ¡Hecho!
Delete [modName] = Eliminar [modName]
Are you SURE you want to delete this mod? = ¿Estás SEGURO de que deseas eliminar este mod?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3107,6 +3109,8 @@ Moai = Móai
Cannot be built on bonus resource = No se puede construir en los recursos
Terrace farm = Terrazas de cultivo
# Requires translation!
Unpillagable =
Ancient ruins = Ruinas Antiguas
City ruins = Ciudad en ruinas

View File

@ -929,6 +929,8 @@ Download = 下載
Done! = 完成!
Delete [modName] = 刪除模組:[modName]
Are you SURE you want to delete this mod? = 你確定要刪除這個模組嗎?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3105,6 +3107,8 @@ Moai = 摩艾石像群
Cannot be built on bonus resource = 無法建造在擁有獎勵資源的地塊
Terrace farm = 梯田
# Requires translation!
Unpillagable =
Ancient ruins = 遠古遺跡
City ruins = 城市廢墟

View File

@ -932,6 +932,8 @@ Download = İndir
Done! = Tamam!
Delete [modName] = [modName] modunu sil
Are you SURE you want to delete this mod? = Bu modu SİLMEK istediğinize emin misiniz?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3682,6 +3684,8 @@ Cannot be built on bonus resource =
# Requires translation!
Terrace farm =
# Requires translation!
Unpillagable =
Ancient ruins = Antik Kalıntılar
City ruins = Şehir Kalıntıları

View File

@ -935,6 +935,8 @@ Download = Завантажити
Done! = Зроблено
Delete [modName] = Видалити [modName]
Are you SURE you want to delete this mod? = Ви СПРАВДІ хочете видалити цю модифікацію?
# Requires translation!
Updated =
# Uniques that are relevant to more than one type of game object
@ -3118,6 +3120,8 @@ Moai = Моаї
Cannot be built on bonus resource = Не може бути побудована на бонусному ресурсі
Terrace farm = Терасна ферма
# Requires translation!
Unpillagable =
Ancient ruins = Стародавні руїни
City ruins = Руїни міста

View File

@ -931,6 +931,7 @@ Download =
Done! =
Delete [modName] =
Are you SURE you want to delete this mod? =
Updated =
# Uniques that are relevant to more than one type of game object

View File

@ -22,12 +22,12 @@ open class AndroidLauncher : AndroidApplication() {
}
MultiplayerTurnCheckWorker.createNotificationChannels(applicationContext)
// Only allow mods on KK+, to avoid READ_EXTERNAL_STORAGE permission earlier versions need
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
copyMods()
// Only allow mods on KK+, to avoid READ_EXTERNAL_STORAGE permission earlier versions need
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
copyMods()
val externalfilesDir = getExternalFilesDir(null)
if(externalfilesDir!=null) GameSaver.externalFilesDirForAndroid = externalfilesDir.path
}
if (externalfilesDir != null) GameSaver.externalFilesDirForAndroid = externalfilesDir.path
}
val config = AndroidApplicationConfiguration().apply { useImmersiveMode = true; }
val androidParameters = UncivGameParameters(
@ -36,16 +36,16 @@ open class AndroidLauncher : AndroidApplication() {
fontImplementation = NativeFontAndroid(ORIGINAL_FONT_SIZE.toInt()),
customSaveLocationHelper = customSaveLocationHelper
)
val game = UncivGame ( androidParameters )
val game = UncivGame(androidParameters)
initialize(game, config)
}
/**
* Copies mods from external data directory (where users can access) to the private one (where
* libGDX reads from). Note: deletes all files currently in the private mod directory and
* replaces them with the ones in the external folder!)
*/
private fun copyMods() {
/**
* Copies mods from external data directory (where users can access) to the private one (where
* libGDX reads from). Note: deletes all files currently in the private mod directory and
* replaces them with the ones in the external folder!)
*/
private fun copyMods() {
// Mod directory in the internal app data (where Gdx.files.local looks)
val internalModsDir = File("${filesDir.path}/mods")
@ -74,8 +74,8 @@ open class AndroidLauncher : AndroidApplication() {
cancel(MultiplayerTurnCheckWorker.NOTIFICATION_ID_INFO)
cancel(MultiplayerTurnCheckWorker.NOTIFICATION_ID_SERVICE)
}
} catch (ex: Exception) {
}
catch (ex:Exception){}
super.onResume()
}

View File

@ -3,8 +3,8 @@ package com.unciv.build
object BuildConfig {
const val kotlinVersion = "1.4.30"
const val appName = "Unciv"
const val appCodeNumber = 557
const val appVersion = "3.14.2"
const val appCodeNumber = 558
const val appVersion = "3.14.3"
const val gdxVersion = "1.10.0"
const val roboVMVersion = "2.3.1"

View File

@ -1,3 +1,23 @@
## 3.14.3
Added "Updated!" next to updated mods in mod management screen
Added 'last updated time' and 'open Github page of mod' in mod management screen
Can no longer enter diplomacy screen for self, defeated and spectator civs through diplomacy overview screen
Resolved #3817 - don't display resource requirements from uniques twice
By SomeTroglodyte:
- Solves #3802 Mod translations don't appear in new game screen
- Modify choice of city to own the tiles acquired by a citadel - v2
- Make city center unpillagable using a unique
Parameterize civ-wide sight bonus - By SpacedOutChicken
Translation updates
## 3.14.2
Put world wrap behind setting again and added warning for world wrap for Android - I'm seeing a lot of ANRs in recent versions, but it's not something that seems solvable.

View File

@ -25,4 +25,4 @@ interface CustomSaveLocationHelper {
* [GameInfo]
*/
fun loadGame(loadCompleteCallback: (GameInfo?, Exception?) -> Unit)
}
}

View File

@ -14,6 +14,7 @@ object GameSaver {
private const val saveFilesFolder = "SaveFiles"
private const val multiplayerFilesFolder = "MultiplayerGames"
private const val settingsFileName = "GameSettings.json"
@Volatile
var customSaveLocationHelper: CustomSaveLocationHelper? = null
@ -23,7 +24,7 @@ object GameSaver {
fun json() = Json().apply { setIgnoreDeprecated(true); ignoreUnknownFields = true } // Json() is NOT THREAD SAFE so we need to create a new one for each function
fun getSubfolder(multiplayer: Boolean=false) = if(multiplayer) multiplayerFilesFolder else saveFilesFolder
fun getSubfolder(multiplayer: Boolean = false) = if (multiplayer) multiplayerFilesFolder else saveFilesFolder
fun getSave(GameName: String, multiplayer: Boolean = false): FileHandle {
val localfile = Gdx.files.local("${getSubfolder(multiplayer)}/$GameName")
@ -90,7 +91,7 @@ object GameSaver {
return json().fromJson(GameInfo::class.java, gameData)
}
fun deleteSave(GameName: String, multiplayer: Boolean = false){
fun deleteSave(GameName: String, multiplayer: Boolean = false) {
getSave(GameName, multiplayer).delete()
}
@ -136,7 +137,7 @@ object GameSaver {
}
}
fun autoSaveSingleThreaded (gameInfo: GameInfo) {
fun autoSaveSingleThreaded(gameInfo: GameInfo) {
// If the user has chosen a custom save location outside of the usual game directories,
// they'll probably expect us to overwrite that instead. E.g. if the user is saving their
// game to their Google Drive folder, they'll probably want that progress to be synced to
@ -170,5 +171,4 @@ object GameSaver {
fun getGameIdFromFile(gameFile: FileHandle): String {
return json().fromJson(GameInfo::class.java, gameFile).gameId
}
}
}

View File

@ -378,7 +378,7 @@ object RulesetCache :HashMap<String,Ruleset>() {
fun getBaseRuleset() = this[BaseRuleset.Civ_V_Vanilla.fullName]!!.clone() // safeguard, o no-one edits the base ruleset by mistake
fun getComplexRuleset(mods:LinkedHashSet<String>):Ruleset{
fun getComplexRuleset(mods: LinkedHashSet<String>): Ruleset {
val newRuleset = Ruleset()
val loadedMods = mods.filter { containsKey(it) }.map { this[it]!! }
if (loadedMods.none { it.modOptions.isBaseRuleset })

View File

@ -37,18 +37,18 @@ class ModManagementScreen: PickerScreen() {
topTable.row()
topTable.add(ScrollPane(modTable)).height(scrollPane.height*0.8f).pad(10f)
topTable.add(ScrollPane(modTable)).height(scrollPane.height * 0.8f).pad(10f)
downloadTable.add(getDownloadButton()).row()
tryDownloadPage(1)
topTable.add(ScrollPane(downloadTable)).height(scrollPane.height*0.8f)//.size(downloadTable.width, topTable.height)
topTable.add(ScrollPane(downloadTable)).height(scrollPane.height * 0.8f)//.size(downloadTable.width, topTable.height)
topTable.add(modActionTable)
}
fun tryDownloadPage(pageNum:Int) {
fun tryDownloadPage(pageNum: Int) {
thread {
val repoSearch: Github.RepoSearch
try {
@ -66,9 +66,9 @@ class ModManagementScreen: PickerScreen() {
var downloadButtonText = repo.name
val existingMod = RulesetCache.values.firstOrNull { it.name == repo.name }
if(existingMod!=null) {
if (existingMod != null) {
if (existingMod.modOptions.lastUpdated != "" && existingMod.modOptions.lastUpdated != repo.updated_at)
downloadButtonText += " - Updated!"
downloadButtonText += " - {Updated}"
}
val downloadButton = downloadButtonText.toTextButton()
@ -95,7 +95,7 @@ class ModManagementScreen: PickerScreen() {
val nextPageButton = "Next page".toTextButton()
nextPageButton.onClick {
nextPageButton.remove()
tryDownloadPage(pageNum+1)
tryDownloadPage(pageNum + 1)
}
downloadTable.add(nextPageButton).row()
}
@ -113,7 +113,7 @@ class ModManagementScreen: PickerScreen() {
}
if (updatedAt != "") {
val updateString = "Last updated at: " + LocalDateTime.parse(updatedAt, DateTimeFormatter.ISO_DATE_TIME)
val updateString = "{Updated}: " + LocalDateTime.parse(updatedAt, DateTimeFormatter.ISO_DATE_TIME)
.toLocalDate().toString()
modActionTable.add(updateString.toLabel())
}
@ -123,13 +123,13 @@ class ModManagementScreen: PickerScreen() {
val downloadButton = "Download mod from URL".toTextButton()
downloadButton.onClick {
val popup = Popup(this)
val textArea = TextArea("https://github.com/...",skin)
popup.add(textArea).width(stage.width/2).row()
val textArea = TextArea("https://github.com/...", skin)
popup.add(textArea).width(stage.width / 2).row()
val actualDownloadButton = "Download".toTextButton()
actualDownloadButton.onClick {
actualDownloadButton.setText("Downloading...".tr())
actualDownloadButton.disable()
downloadMod(Github.Repo().apply { html_url=textArea.text; default_branch= "master"}) { popup.close() }
downloadMod(Github.Repo().apply { html_url = textArea.text; default_branch = "master" }) { popup.close() }
}
popup.add(actualDownloadButton).row()
popup.addCloseButton()
@ -138,7 +138,7 @@ class ModManagementScreen: PickerScreen() {
return downloadButton
}
fun downloadMod(repo:Github.Repo, postAction:()->Unit={}) {
fun downloadMod(repo: Github.Repo, postAction: () -> Unit = {}) {
thread { // to avoid ANRs - we've learnt our lesson from previous download-related actions
try {
val modFolder = Github.downloadAndExtract(repo.html_url, repo.default_branch,
@ -186,7 +186,7 @@ class ModManagementScreen: PickerScreen() {
addModInfoToActionTable(mod.modOptions.modUrl, mod.modOptions.lastUpdated)
}
fun refreshModTable(){
fun refreshModTable() {
modTable.clear()
val currentMods = RulesetCache.values.filter { it.name != "" }
for (mod in currentMods) {
@ -205,9 +205,9 @@ class ModManagementScreen: PickerScreen() {
}
}
fun deleteMod(mod: Ruleset){
fun deleteMod(mod: Ruleset) {
val modFileHandle = Gdx.files.local("mods").child(mod.name)
if(modFileHandle.isDirectory) modFileHandle.deleteDirectory()
if (modFileHandle.isDirectory) modFileHandle.deleteDirectory()
else modFileHandle.delete()
RulesetCache.loadRulesets()
refreshModTable()