├── .editorconfig ├── .github ├── ISSUE_TEMPLATE │ ├── ------.md │ └── ----.md └── workflows │ ├── gradle.yml │ └── releasers.yml ├── .gitignore ├── LICENSE ├── README.MD ├── UTEversion.txt ├── Update.txt ├── build.gradle.kts ├── buildSrc ├── build.gradle.kts ├── settings.gradle.kts └── src │ └── main │ └── kotlin │ ├── GitHub.kt │ ├── GitHubUploader.kt │ ├── Gitee.kt │ ├── JsonHelper.kt │ ├── PluginResolver.kt │ ├── RAFOutputStream.kt │ └── Versions.kt ├── dev-version.txt ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── libs ├── FakePlayer-1.3-73139.jar ├── LibsDisguises-10.0.5.jar ├── Residence-4.8.7.4.jar ├── spigot-1.12.2.jar.native.jar ├── spigot-1.13.2.jar.native.jar ├── spigot-1.13.jar.native.jar ├── spigot-1.14.2.jar.native.jar ├── spigot-1.15.2.jar.native.jar ├── spigot-1.16.1.jar.native.jar ├── spigot-1.16.3.jar.native.jar └── spigot-1.16.4.jar.native.jar ├── settings.gradle.kts └── src └── main ├── java └── ute │ ├── Commands.java │ ├── Config.java │ ├── Logging.java │ ├── UntilTheEnd.java │ ├── api │ ├── BlockApi.java │ ├── GuideApi.java │ ├── ItemApi.java │ ├── Loc3D.java │ ├── PlayerApi.java │ ├── PluginApi.java │ ├── UTEPapiExpansion.java │ ├── WChunk.java │ ├── WorldApi.java │ ├── event │ │ ├── block │ │ │ ├── CustomBlockBreakEvent.java │ │ │ ├── CustomBlockInteractEvent.java │ │ │ ├── CustomBlockPlaceEvent.java │ │ │ └── UTEBlockEvent.java │ │ ├── cap │ │ │ ├── HumidityChangeEvent.java │ │ │ ├── SanityChangeEvent.java │ │ │ ├── TemperatureChangeEvent.java │ │ │ └── TirednessChangeEvent.java │ │ └── player │ │ │ ├── CustomItemInteractEvent.java │ │ │ ├── PlayerRoleChangeByCommandEvent.java │ │ │ └── UTEItemEvent.java │ └── spi │ │ └── PlayerDataLoader.java │ ├── cap │ ├── HudBossBar.java │ ├── HudProvider.java │ ├── hum │ │ ├── ChangeTasks.java │ │ ├── Humidity.java │ │ ├── HumidityProvider.java │ │ ├── InfluenceEvents.java │ │ └── InfluenceTasks.java │ ├── san │ │ ├── ChangeTasks.java │ │ ├── InfluenceEvents.java │ │ ├── InfluenceTasks.java │ │ ├── Sanity.java │ │ └── SanityProvider.java │ ├── tem │ │ ├── ChangeTasks.java │ │ ├── InfluenceTasks.java │ │ ├── Temperature.java │ │ └── TemperatureProvider.java │ └── tir │ │ ├── ChangeEvents.java │ │ ├── ChangeTasks.java │ │ ├── InfluenceEvents.java │ │ ├── InfluenceTasks.java │ │ └── Tiredness.java │ ├── crops │ ├── CropProvider.java │ ├── Crops.java │ ├── SeasonCroping.java │ └── TakeWaterUp.java │ ├── food │ ├── Food.java │ ├── Hunger.java │ ├── RottenFoodEvents.java │ ├── RottenFoodInfluence.java │ └── RottenFoodTask.java │ ├── guide │ ├── cap │ │ └── CapabilityGuide.java │ └── craft │ │ ├── CraftGuide.java │ │ ├── HolderCategoryHelp.java │ │ ├── HolderItemCraftingHelp.java │ │ ├── HolderMainHelp.java │ │ ├── UTEInvHolder.java │ │ └── event │ │ └── OperateLimiter.java │ ├── internal │ ├── ArrowManager.java │ ├── BuildData.java │ ├── DataConverter.java │ ├── DisableManager.java │ ├── EventHelper.java │ ├── ExceptionBox.java │ ├── HolderPlaceholder.java │ ├── InternalClassLoader.java │ ├── ItemFactory.java │ ├── LightingCompensation.java │ ├── MathHelper.java │ ├── Metrics.java │ ├── NPCChecker.java │ ├── NativeFunction.java │ ├── OptionFeature.java │ ├── ResidenceChecker.java │ ├── SanChattingProvider.java │ ├── ScriptProvider.java │ ├── UTEi18n.java │ ├── YamlUpdater.java │ ├── karlatemp │ │ └── mxlib │ │ │ └── formatter │ │ │ ├── AbstractReplacer.java │ │ │ ├── ArrayReplacer.java │ │ │ ├── FormatAction.java │ │ │ ├── FormatTemplate.java │ │ │ ├── Formatter.java │ │ │ ├── Java9StringFactory.java │ │ │ ├── MapMapping.java │ │ │ ├── PunctuateFormatter.java │ │ │ ├── Replacer.java │ │ │ └── SimpleFormatTemplate.java │ └── pdl │ │ ├── BinStore.java │ │ ├── NameBin.java │ │ ├── PlayerDataLoaderImpl.java │ │ ├── PlayerNameYml.java │ │ ├── PlayerNameYmlV2.java │ │ ├── PlayerUUIDYml.java │ │ └── UUIDBin.java │ ├── item │ ├── BlockManager.java │ ├── ItemListener.java │ ├── ItemManager.java │ ├── ItemProvider.java │ ├── UTEItemStack.java │ ├── basics │ │ ├── Ashes.java │ │ ├── Sclerite.java │ │ └── SpiderGland.java │ ├── clothes │ │ ├── BushesHat.java │ │ ├── ClothesContainer.java │ │ ├── ConstantTemperatureClothes.java │ │ ├── Earmuff.java │ │ ├── EyeballUmbrella.java │ │ ├── Garland.java │ │ ├── StrawHat.java │ │ └── SwimmingSuit.java │ ├── combat │ │ ├── BeeMine.java │ │ ├── BlowArrow1.java │ │ ├── BlowArrow2.java │ │ ├── BlowArrow3.java │ │ ├── ChainingAxe.java │ │ ├── ChainingHoe.java │ │ ├── ChainingPickaxe.java │ │ ├── ChainingSpade.java │ │ ├── ToothTrap.java │ │ └── WeatherPain.java │ ├── magic │ │ ├── ChilledAmulet.java │ │ ├── DecomposeWand.java │ │ ├── FireWand.java │ │ ├── FlyCarpet.java │ │ ├── IceWand.java │ │ ├── LifeGivingAmulet.java │ │ ├── TelelocatorWand.java │ │ ├── Teleportage.java │ │ └── Tracker.java │ ├── materials │ │ ├── Fern.java │ │ ├── Hail.java │ │ └── NightMare.java │ ├── science │ │ ├── AutoClicker.java │ │ ├── BluePrint.java │ │ ├── ColdFire.java │ │ ├── CombinedTools.java │ │ ├── Hygrometer.java │ │ ├── IceFlingomatic.java │ │ ├── LightningArrester.java │ │ ├── Refridgerator.java │ │ └── Thermometer.java │ └── survival │ │ ├── ACDDrug.java │ │ ├── FlowerUmbrella.java │ │ ├── FurRoll.java │ │ ├── HealingSalve.java │ │ ├── HoneyPoultice.java │ │ ├── LuxuryFan.java │ │ ├── MovablePack.java │ │ ├── NormalPack.java │ │ ├── PigPack.java │ │ ├── SiestaLeanto.java │ │ ├── StrawRoll.java │ │ ├── Umbrella.java │ │ ├── WarmStone.java │ │ └── WaterBalloon.java │ ├── manager │ └── WetManager.java │ ├── nms │ ├── ActionBarManager.java │ ├── NMSHelper.java │ ├── NMSManager.java │ ├── ReflectionImplAllocator.java │ ├── ReflectionUtil.java │ ├── reflect │ │ └── ActionBarManagerImpl.java │ ├── v1_12_R1 │ │ └── ActionBarManagerImpl.java │ ├── v1_13_R1 │ │ └── ActionBarManagerImpl.java │ ├── v1_13_R2 │ │ └── ActionBarManagerImpl.java │ ├── v1_14_R1 │ │ └── ActionBarManagerImpl.java │ ├── v1_15_R1 │ │ └── ActionBarManagerImpl.java │ ├── v1_16_R1 │ │ └── ActionBarManagerImpl.java │ ├── v1_16_R2 │ │ └── ActionBarManagerImpl.java │ ├── v1_16_R3 │ │ └── ActionBarManagerImpl.java │ └── v1_16_R4 │ │ └── ActionBarManagerImpl.java │ ├── player │ ├── Player.java │ ├── PlayerInventoryAdapt.java │ ├── PlayerManager.java │ ├── death │ │ ├── DeathCause.java │ │ └── DeathMessage.java │ └── role │ │ ├── IRole.java │ │ ├── Roles.java │ │ ├── RolesSettings.java │ │ ├── events │ │ ├── EventLoader.java │ │ ├── GeneralEvents.java │ │ ├── WX78.java │ │ ├── Wendy.java │ │ └── Willow.java │ │ └── tasks │ │ ├── TaskLoader.java │ │ ├── WX78.java │ │ ├── Willow.java │ │ ├── Wilson.java │ │ └── Wolfgang.java │ └── world │ ├── InfluenceTasks.java │ ├── World.java │ ├── WorldCounter.java │ ├── WorldProvider.java │ ├── cave │ ├── CaveEvents.java │ ├── CaveManager.java │ └── structure │ │ └── RabbitHouse.java │ └── structure │ └── StructureManager.java └── resources ├── LightingCompensation.yml ├── config.yml ├── crops.yml ├── disable.yml ├── drops.yml ├── food.yml ├── hud.yml ├── humidity.yml ├── i18n.en_us.yml ├── i18n.zh_cn.yml ├── i18n.zh_tw.yml ├── itemattributes.yml ├── itemsets.yml ├── plugin.yml ├── roles.yml ├── sanity.yml ├── season-tmp.yml ├── temperature.yml └── tiredness.yml /.editorconfig: -------------------------------------------------------------------------------- 1 | [*.java] 2 | indent_style = space 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/------.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 提交新的功能 3 | about: 向我们分享你的想法 4 | title: '' 5 | labels: enhancement 6 | assignees: '' 7 | 8 | --- 9 | 10 | **新的想法** 11 | ......... 12 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/----.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 错误提交 3 | about: 向我们提交一个错误 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **错误描述** 11 | 错误描述 12 | 13 | **怎么复现/做了什么** 14 | 1. 我做了 .... 15 | 2. 然后我 '....' 16 | 3. 报错了 17 | 18 | **版本** 19 | Server: `Spigot v1.15.2 (服务器版本)` 20 | UTE: `UTE版本` 21 | 22 | **错误日志** 23 | ``` 24 | 粘贴到这里 25 | ``` 26 | -------------------------------------------------------------------------------- /.github/workflows/gradle.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Gradle 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle 3 | 4 | name: Java CI with Gradle 5 | 6 | on: 7 | push: 8 | branches: [ master ] 9 | paths: 10 | - 'src/**' 11 | - 'buildSrc/**' 12 | - 'libs/**' 13 | pull_request: 14 | branches: [ master ] 15 | paths: 16 | - 'src/**' 17 | - 'buildSrc/**' 18 | - 'libs/**' 19 | 20 | jobs: 21 | build: 22 | 23 | runs-on: ubuntu-latest 24 | 25 | steps: 26 | - uses: actions/checkout@v2 27 | - name: Set up JDK 1.8 28 | uses: actions/setup-java@v1 29 | with: 30 | java-version: 1.8 31 | - name: Grant execute permission for gradlew 32 | run: chmod +x gradlew 33 | - name: Build with Gradle 34 | run: ./gradlew build 35 | env: 36 | is_github: true 37 | -------------------------------------------------------------------------------- /.github/workflows/releasers.yml: -------------------------------------------------------------------------------- 1 | # This workflow will build a Java project with Gradle 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle 3 | 4 | name: Github Releaser 5 | 6 | on: 7 | release: 8 | types: # This configuration does not affect the page_build event above 9 | - created 10 | 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: actions/checkout@v2 16 | - name: Set up JDK 1.8 17 | uses: actions/setup-java@v1 18 | with: 19 | java-version: 1.8 20 | - name: Grant execute permission for gradlew 21 | run: chmod +x gradlew 22 | - name: Build with Gradle 23 | run: ./gradlew releases 24 | env: 25 | is_github: true 26 | github_token: ${{ secrets.push_token }} 27 | gitee_token: ${{ secrets.gitee_token }} 28 | 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled class file 2 | *.class 3 | 4 | # Log file 5 | *.log 6 | 7 | # BlueJ files 8 | *.ctxt 9 | 10 | # Mobile Tools for Java (J2ME) 11 | .mtj.tmp/ 12 | 13 | # Package Files # 14 | *.war 15 | *.nar 16 | *.ear 17 | *.zip 18 | *.tar.gz 19 | *.rar 20 | 21 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 22 | hs_err_pid* 23 | 24 | target/ 25 | build/ 26 | 27 | .idea/ 28 | *.iml 29 | /.idea/ 30 | .idea/* 31 | /.idea/* 32 | 33 | /test 34 | 35 | .gradle/ 36 | 37 | local.properties 38 | 39 | # Maven publishing credits 40 | keys.properties 41 | /plugins/ 42 | 43 | token.txt 44 | bintray.user.txt 45 | bintray.key.txt 46 | 47 | /dist 48 | /out 49 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Karlatemp & 南外丶仓鼠 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # UntilTheEnd 2 | 3 | --- 4 | 5 | ![Java CI with Gradle](https://github.com/UntilTheEndDev/UntilTheEnd/workflows/Java%20CI%20with%20Gradle/badge.svg) 6 | ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/UntilTheEndDev/UntilTheEnd?style=flat-square) 7 | ![GitHub release (latest by date including pre-releases)](https://img.shields.io/github/v/release/UntilTheEndDev/UntilTheEnd?include_prereleases&label=Latest%20Release&style=flat-square) 8 | 9 | --- 10 | 11 | ## 提交错误/想法 12 | 如果有任何错误或者想法, 请前往 [GitHub Issue](https://github.com/UntilTheEndDev/UntilTheEnd/issues?q=is%3Aissue) 13 | 创建一个新的issue前请先确认是否有同样的issue, 不然你的issue可能不会被我们接受 14 | 15 | ## 开源地址 16 | 17 | [GitHub](https://github.com/UntilTheEndDev/UntilTheEnd) 18 | 19 | [Coding](https://e.coding.net/untiltheend/UntilTheEnd.git) 20 | 21 | ## 关于包名带有大写字母的说明 22 | 23 | --- 24 | 别吐槽,Karlatemp 接手的时候已经是这种带大写的了, 25 | 由于更正会导致使用UTE提供的API的插件全部爆炸, 26 | 所以决定本项目的主包名不再按照 27 | [Google Java Style Guide](https://google.github.io/styleguide/javaguide.html) 28 | 来 29 | 30 | *不是不想是不能改啊!!!!* 31 | 32 | ## 下载 33 | 34 | 你可以在 [GitHub](https://github.com/UntilTheEndDev/UntilTheEndReleases/tree/master/shadow/until-the-end) 35 | 或者 [Gitee](https://gitee.com/Karlatemp-bot/UntilTheEndReleases/tree/master/releases) 找到我们的全部构建 36 | 37 | 38 | ## 如何构建 39 | 40 | 使用 `glt clone` 克隆本仓库到你本机上, 然后打开命令行, 键入 `./gradlew :buildAll` 41 | 然后你就可以在 `dist` 中找到构建 42 | 43 | ## Placeholder 44 | 45 | ---- 46 | 这是UTE的全部PAPI可用占位符 47 | 48 | | 名称 | 描述 | 49 | |----: | :---- | 50 | |ute_san|理智值| 51 | |ute_tem|温度值| 52 | |ute_hum|湿度值| 53 | |ute_tir|疲劳值| 54 | |ute_season|玩家所在世界的季节名字| 55 | |ute_role|玩家当前直接名字| 56 | |ute_sanmax|玩家最大理智值| 57 | |ute_level|玩家等级| 58 | |ute_damagelevel|玩家伤害缩放系数| 59 | |ute_day|玩家所在世界的第N天| 60 | |ute_saniticolor|理智颜色占位| 61 | |ute_temperaturecolor|温度颜色占位| 62 | |ute_humiditycolor|湿度颜色占位| 63 | |ute_tirednesscolor|疲劳颜色占位| 64 | |ute_seasoncolor|季节颜色占位| 65 | |ute_sanitytend|理智变化箭头占位| 66 | |ute_temperaturetend|温度变化箭头占位| 67 | |ute_humiditytend|湿度变化箭头占位| 68 | |ute_tirednesstend|疲劳变化箭头占位| 69 | |ute_sanitybar|理智条| 70 | |ute_humiditybar|湿度条| 71 | |ute_temperaturebar|温度条| 72 | |ute_tirednessbar|疲劳条| 73 | 74 | ### 可用模板 75 | 76 | --- 77 | 78 | ```text 79 | §7§l理智值:%ute_sanitycolor%%ute_san%%ute_sanitytend% 80 | §7§l温度:%ute_temperaturecolor%%ute_tem%%ute_temperaturetend% 81 | §7§l湿度:%ute_humiditycolor%%ute_hum%%ute_humiditytend% 82 | §7§l季节:%ute_seasoncolor%%ute_season% 83 | §7§l季节天数:%ute_day% 84 | ``` 85 | -------------------------------------------------------------------------------- /UTEversion.txt: -------------------------------------------------------------------------------- 1 | 6.4.1-Release -------------------------------------------------------------------------------- /buildSrc/build.gradle.kts: -------------------------------------------------------------------------------- 1 | plugins { 2 | `kotlin-dsl` 3 | } 4 | 5 | repositories { 6 | mavenLocal() 7 | if (System.getenv("is_github")?.toBoolean() != true) 8 | maven(url = "https://mirrors.huaweicloud.com/repository/maven") 9 | // SpigotMC 10 | maven(url = "https://hub.spigotmc.org/nexus/content/groups/public") 11 | jcenter() 12 | } 13 | 14 | kotlin { 15 | sourceSets.all { 16 | languageSettings.useExperimentalAnnotation("kotlin.Experimental") 17 | languageSettings.useExperimentalAnnotation("kotlin.RequiresOptIn") 18 | } 19 | } 20 | 21 | dependencies { 22 | fun kotlinx(id: String, version: String) = "org.jetbrains.kotlinx:kotlinx-$id:$version" 23 | fun ktor(id: String, version: String) = "io.ktor:ktor-$id:$version" 24 | 25 | api(ktor("client-core", "1.3.2")) 26 | api(ktor("client-cio", "1.3.2")) 27 | api(ktor("client-json", "1.3.2")) 28 | 29 | api("org.jsoup:jsoup:1.12.1") 30 | api("org.ow2.asm:asm:7.2") 31 | api("org.ow2.asm:asm-tree:7.2") 32 | api("org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT") // YAML 33 | api("com.google.code.gson:gson:2.8.6") 34 | api(kotlinx("coroutines-core", "1.3.3")) 35 | } -------------------------------------------------------------------------------- /buildSrc/settings.gradle.kts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/buildSrc/settings.gradle.kts -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/GitHubUploader.kt: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/04/25 18:56:32 5 | * 6 | * until-the-end/until-the-end.buildSrc.main/GitHubUploader.kt 7 | */ 8 | 9 | object GitHubUploader { 10 | val project0 = "Karlatemp/UntilTheEnd" 11 | } -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/Gitee.kt: -------------------------------------------------------------------------------- 1 | import io.ktor.client.request.header 2 | import io.ktor.client.request.post 3 | import kotlinx.coroutines.runBlocking 4 | import org.gradle.api.Project 5 | import org.gradle.kotlin.dsl.provideDelegate 6 | import java.io.File 7 | import java.util.* 8 | 9 | /* 10 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 11 | * @author Karlatemp 12 | * @create 2020/04/25 22:09:06 13 | * 14 | * until-the-end/until-the-end.buildSrc.main/Gitee.kt 15 | */ 16 | 17 | object Gitee { 18 | 19 | private fun getGiteeToken(): String { 20 | 21 | System.getProperty("gitee_token", null)?.let { 22 | return@getGiteeToken it.trim() 23 | } 24 | System.getenv("gitee_token")?.let { return@getGiteeToken it.trim() } 25 | error("Cannot find gitee token, " + 26 | "please specify by providing JVM parameter 'github_token'" 27 | ) 28 | } 29 | 30 | fun upload(file: File) = runBlocking { 31 | val target = "https://gitee.com/api/v5/repos/Karlatemp-bot/UntilTheEndReleases/contents/releases/${file.name}" 32 | Http.post(target) { 33 | header("Content-Type", "application/json;charset=UTF-8") 34 | body = json { 35 | obj { 36 | "access_token" value getGiteeToken() 37 | "content" value String(Base64.getEncoder().encode(file.readBytes())) 38 | "message" value "automatically upload on release" 39 | "branch" value "master" 40 | } 41 | } 42 | } 43 | } 44 | } -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/RAFOutputStream.kt: -------------------------------------------------------------------------------- 1 | import java.io.File 2 | import java.io.OutputStream 3 | import java.io.RandomAccessFile 4 | 5 | /* 6 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 7 | * @author Karlatemp 8 | * @create 2020/04/25 17:31:44 9 | * 10 | * until-the-end/until-the-end.buildSrc.main/RAFOutputStream.kt 11 | */ 12 | 13 | class RAFOutputStream(val raf: RandomAccessFile) : OutputStream() { 14 | constructor(file: File) : this(RandomAccessFile(file, "rw")) 15 | 16 | override fun write(b: Int) { 17 | raf.write(b) 18 | } 19 | 20 | override fun write(b: ByteArray) { 21 | raf.write(b) 22 | } 23 | 24 | override fun write(b: ByteArray, off: Int, len: Int) { 25 | raf.write(b, off, len) 26 | } 27 | 28 | override fun close() { 29 | raf.setLength(raf.filePointer) 30 | raf.close() 31 | } 32 | } -------------------------------------------------------------------------------- /buildSrc/src/main/kotlin/Versions.kt: -------------------------------------------------------------------------------- 1 | import org.gradle.api.Project 2 | import java.io.File 3 | import java.text.SimpleDateFormat 4 | import java.time.ZoneId 5 | import java.util.* 6 | 7 | /* 8 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 9 | * @author Karlatemp 10 | * @create 2020/04/25 17:04:55 11 | * 12 | * until-the-end/until-the-end.buildSrc.main/Versions.kt 13 | */ 14 | 15 | @Suppress("MemberVisibilityCanBePrivate") 16 | object Versions { 17 | var resultFile: File? = null 18 | var project: Project? = null 19 | 20 | val isGithubCI: Boolean = System.getenv("is_github")?.toBoolean() ?: false 21 | 22 | val UTE: String 23 | get() { 24 | val pro = project ?: error("Project not set") 25 | val file = File(pro.projectDir, "dev-version.txt") 26 | if (file.isFile) { 27 | return file.readText(Charsets.UTF_8).trim() 28 | } 29 | error("Version info not found!") 30 | } 31 | 32 | val commit by lazy { 33 | kotlin.runCatching { 34 | Runtime.getRuntime() 35 | .exec("git rev-parse HEAD") 36 | .apply { waitFor() } 37 | .inputStream 38 | .reader(Charsets.UTF_8) 39 | .use { it.readText() } 40 | .trim() 41 | }.getOrElse { error -> 42 | error.printStackTrace() 43 | "ERROR: $error" 44 | } 45 | } 46 | 47 | val whoAmI by lazy { 48 | if (isGithubCI) return@lazy "Github Action" 49 | kotlin.runCatching { 50 | Runtime.getRuntime() 51 | .exec("whoami") 52 | .apply { waitFor() } 53 | .inputStream 54 | .reader(Charsets.UTF_8) 55 | .use { it.readText() } 56 | .trim() 57 | }.getOrElse { error -> 58 | error.printStackTrace() 59 | "ERROR: $error" 60 | } 61 | } 62 | 63 | private val zone = TimeZone.getTimeZone(ZoneId.of("Asia/Shanghai"))!! 64 | 65 | val buildDate = Date() 66 | 67 | val format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss '[Asia/Shanghai]'").apply { 68 | this.timeZone = zone 69 | } 70 | 71 | val buildTime = buildDate.toInstant() 72 | .atZone(zone.toZoneId())!! 73 | 74 | val buildString = format.format(buildDate)!! 75 | } -------------------------------------------------------------------------------- /dev-version.txt: -------------------------------------------------------------------------------- 1 | 6.4.1-Release -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.1-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /libs/FakePlayer-1.3-73139.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/FakePlayer-1.3-73139.jar -------------------------------------------------------------------------------- /libs/LibsDisguises-10.0.5.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/LibsDisguises-10.0.5.jar -------------------------------------------------------------------------------- /libs/Residence-4.8.7.4.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/Residence-4.8.7.4.jar -------------------------------------------------------------------------------- /libs/spigot-1.12.2.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.12.2.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.13.2.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.13.2.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.13.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.13.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.14.2.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.14.2.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.15.2.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.15.2.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.16.1.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.16.1.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.16.3.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.16.3.jar.native.jar -------------------------------------------------------------------------------- /libs/spigot-1.16.4.jar.native.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UntilTheEndDev/UntilTheEnd/9688a9b196f4bfa016a103dd87affd2a0dfed29b/libs/spigot-1.16.4.jar.native.jar -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | pluginManagement { 2 | repositories { 3 | mavenLocal() 4 | jcenter() 5 | google() 6 | mavenCentral() 7 | maven { setUrl("https://plugins.gradle.org/m2/") } 8 | maven { setUrl("https://dl.bintray.com/jetbrains/kotlin-native-dependencies") } 9 | } 10 | } 11 | 12 | rootProject.name = "until-the-end" 13 | -------------------------------------------------------------------------------- /src/main/java/ute/Logging.java: -------------------------------------------------------------------------------- 1 | package ute; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | import org.jetbrains.annotations.NotNull; 6 | 7 | import java.util.logging.Level; 8 | import java.util.logging.LogRecord; 9 | import java.util.logging.SimpleFormatter; 10 | 11 | public class Logging extends java.util.logging.Logger { 12 | private static final Logger logger = LogManager.getLogger("UntilTheEnd"); 13 | private static final Logging INSTANCE = new Logging(); 14 | private static final SimpleFormatter formatter = new SimpleFormatter(); 15 | 16 | public static @NotNull java.util.logging.Logger getLogger() { 17 | return INSTANCE; 18 | } 19 | 20 | private Logging() { 21 | super("UntilTheEnd", null); 22 | } 23 | 24 | @Override 25 | public void log(LogRecord record) { 26 | if (!isLoggable(getLevel())) return; 27 | String message = "[UntilTheEnd] " + formatter.formatMessage(record); 28 | Throwable exception = record.getThrown(); 29 | Level level = record.getLevel(); 30 | if (level == Level.SEVERE) { 31 | logger.error(message, exception); 32 | } else if (level == Level.WARNING) { 33 | logger.warn(message, exception); 34 | } else if (level == Level.INFO) { 35 | logger.info(message, exception); 36 | } else if (level == Level.FINER || level == Level.FINE) { 37 | logger.fatal(message, exception); 38 | } else if (level == Level.CONFIG) { 39 | logger.trace(message, exception); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/ute/api/GuideApi.java: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | */ 4 | package ute.api; 5 | 6 | import ute.guide.craft.CraftGuide; 7 | import ute.internal.ItemFactory; 8 | import ute.internal.UTEi18n; 9 | import org.bukkit.Bukkit; 10 | import org.bukkit.Material; 11 | import org.bukkit.inventory.Inventory; 12 | import org.bukkit.inventory.ItemStack; 13 | import org.bukkit.inventory.meta.ItemMeta; 14 | 15 | public class GuideApi { 16 | public static void add_item_to_category(AvaliableCategories category, ItemStack item) { 17 | CraftGuide.button_to_gui.get(category.button).addItem(item); 18 | } 19 | 20 | public static void add_guide_to_item(ItemStack item, Inventory inventory) { 21 | ItemStack back = item_creater(UTEi18n.cache("item.guide.action.previous"), Material.STAINED_GLASS_PANE, (short) 6); 22 | ItemStack menu = item_creater(UTEi18n.cache("item.guide.action.main"), Material.STAINED_GLASS_PANE, (short) 9); 23 | inventory.setItem(0, back); 24 | inventory.setItem(8, menu); 25 | CraftGuide.button_to_gui.put(item, inventory); 26 | } 27 | 28 | public static ItemStack item_creater(String item_name, Material material, short data) { 29 | ItemStack item = new ItemStack(material); 30 | ItemMeta meta = item.getItemMeta(); 31 | meta.setDisplayName(item_name); 32 | item.setItemMeta(meta); 33 | item.setDurability(data); 34 | return item; 35 | } 36 | 37 | public static Inventory copy_inventory(Inventory inv,String title) { 38 | Inventory copy = Bukkit.createInventory(inv.getHolder(), inv.getSize(), title); 39 | copy.setContents(inv.getContents()); 40 | return copy; 41 | } 42 | 43 | public enum AvaliableCategories { 44 | //这里带了LEGACY 45 | 衣物(GuideApi.item_creater("§6衣物", ItemFactory.fromLegacy(Material.GOLD_HELMET), (short) 0), 14), 46 | 战斗与工具(GuideApi.item_creater("§6战斗与工具", ItemFactory.fromLegacy(Material.DIAMOND_SWORD), (short) 0), 13), 47 | 魔法(GuideApi.item_creater("§6魔法", ItemFactory.fromLegacy(Material.SPLASH_POTION), (short) 0), 15), 48 | 精炼(GuideApi.item_creater("§6精炼", ItemFactory.fromLegacy(Material.LEASH), (short) 0), 10), 49 | 科学(GuideApi.item_creater("§6科学", ItemFactory.fromLegacy(Material.REDSTONE_COMPARATOR), (short) 0), 12), 50 | 生存(GuideApi.item_creater("§6生存", ItemFactory.fromLegacy(Material.IRON_PICKAXE), (short) 0), 11); 51 | public ItemStack button; 52 | public int slot_id; 53 | 54 | AvaliableCategories(ItemStack button, int slot_id) { 55 | this.button = button; 56 | this.slot_id = slot_id; 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /src/main/java/ute/api/Loc3D.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/05/09 19:47:29 5 | * 6 | * until-the-end/until-the-end.main/Loc3D.java 7 | */ 8 | 9 | package ute.api; 10 | 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.Location; 13 | import org.bukkit.World; 14 | import org.jetbrains.annotations.NotNull; 15 | 16 | import java.io.Serializable; 17 | import java.util.NoSuchElementException; 18 | import java.util.Objects; 19 | 20 | public class Loc3D implements Serializable { 21 | private static final long serialVersionUID = 148757128437582932L; 22 | public final int x, y, z; 23 | public final String world; 24 | 25 | public Loc3D(String world, int x, int y, int z) { 26 | this.x = x; 27 | this.y = y; 28 | this.z = z; 29 | this.world = world; 30 | } 31 | 32 | @Override 33 | public boolean equals(Object o) { 34 | if (this == o) return true; 35 | if (o == null || getClass() != o.getClass()) return false; 36 | 37 | Loc3D loc3D = (Loc3D) o; 38 | 39 | if (x != loc3D.x) return false; 40 | if (y != loc3D.y) return false; 41 | if (z != loc3D.z) return false; 42 | return Objects.equals(world, loc3D.world); 43 | } 44 | 45 | @Override 46 | public int hashCode() { 47 | int result = x; 48 | result = 31 * result + y; 49 | result = 31 * result + z; 50 | result = 31 * result + (world != null ? world.hashCode() : 0); 51 | return result; 52 | } 53 | 54 | public Location toLocation() { 55 | World world = this.world == null ? null : Bukkit.getWorld(this.world); 56 | return new Location(world, x, y, z); 57 | } 58 | 59 | public Location toUsableLocation() { 60 | Location loc = toLocation(); 61 | if (loc.getWorld() == null) { 62 | throw new NoSuchElementException("No world `" + world + "` found."); 63 | } 64 | return loc; 65 | } 66 | 67 | public static @NotNull Loc3D from(@NotNull Location location) { 68 | World world = location.getWorld(); 69 | String worldName = world == null ? null : world.getName(); 70 | return new Loc3D(worldName, location.getBlockX(), location.getBlockY(), location.getBlockZ()); 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /src/main/java/ute/api/PluginApi.java: -------------------------------------------------------------------------------- 1 | package ute.api; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class PluginApi { 6 | public static Class getNMS(String name) { 7 | try { 8 | return Class.forName("net.minecraft.server." + getVersion() + "." + name); 9 | } catch (ClassNotFoundException e) { 10 | e.printStackTrace(); 11 | return null; 12 | } 13 | } 14 | 15 | public static String getVersion() { 16 | return Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/ute/api/WorldApi.java: -------------------------------------------------------------------------------- 1 | package ute.api; 2 | 3 | import ute.cap.HudProvider; 4 | import ute.world.WorldProvider; 5 | import org.bukkit.World; 6 | 7 | public class WorldApi { 8 | public static String getSeasonColor(World world) { 9 | return HudProvider.yaml.getString("seasonColor." + getSeason(world).name(), ""); 10 | } 11 | 12 | public static String getName(WorldProvider.Season season) { 13 | return season.getName(); 14 | } 15 | 16 | public static WorldProvider.Season getSeason(World world) { 17 | final WorldProvider.IWorld status = WorldProvider.worldStates.get(world.getName()); 18 | if (status != null) 19 | return status.season; 20 | return WorldProvider.Season.NULL; 21 | } 22 | 23 | public static int getDay(World world) { 24 | final WorldProvider.IWorld status = WorldProvider.worldStates.get(world.getName()); 25 | if (status != null) 26 | return status.day; 27 | return -1; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/block/CustomBlockBreakEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.block; 2 | 3 | import org.bukkit.block.Block; 4 | import org.bukkit.entity.Player; 5 | 6 | import ute.item.UTEItemStack; 7 | 8 | public class CustomBlockBreakEvent extends UTEBlockEvent { 9 | 10 | private final Block block; 11 | private final Player player; 12 | private final UTEItemStack item; 13 | 14 | public CustomBlockBreakEvent(Block block, Player player, UTEItemStack item) { 15 | this.block = block; 16 | this.player = player; 17 | this.item = item; 18 | } 19 | 20 | public UTEItemStack getCustomItem() { 21 | return this.item; 22 | } 23 | 24 | public Player getPlayer() { 25 | return player; 26 | } 27 | 28 | public Block getBlock() { 29 | return block; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/block/CustomBlockInteractEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.block; 2 | 3 | import org.bukkit.block.Block; 4 | import org.bukkit.block.BlockFace; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.block.Action; 7 | import org.bukkit.inventory.EquipmentSlot; 8 | import org.bukkit.inventory.ItemStack; 9 | 10 | import ute.item.UTEItemStack; 11 | 12 | public class CustomBlockInteractEvent extends UTEBlockEvent { 13 | private final Player who; 14 | private final Action action; 15 | private final Block clickedBlock; 16 | private final BlockFace clickedFace; 17 | 18 | public Player getWho() { 19 | return who; 20 | } 21 | 22 | public Action getAction() { 23 | return action; 24 | } 25 | 26 | public Block getClickedBlock() { 27 | return clickedBlock; 28 | } 29 | 30 | public BlockFace getClickedFace() { 31 | return clickedFace; 32 | } 33 | 34 | public EquipmentSlot getHand() { 35 | return hand; 36 | } 37 | 38 | public UTEItemStack getNewitem() { 39 | return newitem; 40 | } 41 | 42 | public ItemStack getItem() { 43 | return item; 44 | } 45 | 46 | private final EquipmentSlot hand; 47 | private final UTEItemStack newitem; 48 | private final ItemStack item; 49 | 50 | public CustomBlockInteractEvent(Player who, Action action, ItemStack item, Block clickedBlock, 51 | BlockFace clickedFace, EquipmentSlot hand, UTEItemStack newitem) { 52 | this.who = who; 53 | this.action = action; 54 | this.item = item; 55 | this.clickedBlock = clickedBlock; 56 | this.clickedFace = clickedFace; 57 | this.hand = hand; 58 | this.newitem = newitem; 59 | } 60 | 61 | public UTEItemStack getCustomItem() { 62 | return this.newitem; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/block/CustomBlockPlaceEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.block; 2 | 3 | import org.bukkit.block.Block; 4 | import org.bukkit.block.BlockState; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.inventory.EquipmentSlot; 7 | import org.bukkit.inventory.ItemStack; 8 | 9 | import ute.item.UTEItemStack; 10 | 11 | public class CustomBlockPlaceEvent extends UTEBlockEvent { 12 | private final Block placedBlock; 13 | private final BlockState replacedBlockState; 14 | private final Block placedAgainst; 15 | private final ItemStack itemInHand; 16 | private final Player player; 17 | private final boolean canBuild; 18 | private final EquipmentSlot hand; 19 | private final UTEItemStack item; 20 | 21 | public CustomBlockPlaceEvent(Block placedBlock, BlockState replacedBlockState, Block placedAgainst, 22 | ItemStack itemInHand, Player thePlayer, boolean canBuild, EquipmentSlot hand, UTEItemStack item) { 23 | this.placedBlock = placedBlock; 24 | this.replacedBlockState = replacedBlockState; 25 | this.placedAgainst = placedAgainst; 26 | this.itemInHand = itemInHand; 27 | this.player = thePlayer; 28 | this.canBuild = canBuild; 29 | this.hand = hand; 30 | this.item = item; 31 | } 32 | 33 | public Block getBlock() { 34 | return getPlacedBlock(); 35 | } 36 | 37 | public Block getPlacedBlock() { 38 | return placedBlock; 39 | } 40 | 41 | public BlockState getReplacedBlockState() { 42 | return replacedBlockState; 43 | } 44 | 45 | public Block getPlacedAgainst() { 46 | return placedAgainst; 47 | } 48 | 49 | public ItemStack getItemInHand() { 50 | return itemInHand; 51 | } 52 | 53 | public Player getPlayer() { 54 | return player; 55 | } 56 | 57 | public boolean isCanBuild() { 58 | return canBuild; 59 | } 60 | 61 | public EquipmentSlot getHand() { 62 | return hand; 63 | } 64 | 65 | public UTEItemStack getItem() { 66 | return item; 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/block/UTEBlockEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.block; 2 | 3 | import org.bukkit.event.Cancellable; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class UTEBlockEvent extends Event implements Cancellable { 8 | public static final HandlerList handlers = new HandlerList(); 9 | 10 | public static HandlerList getHandlerList() { 11 | return handlers; 12 | } 13 | 14 | @Override 15 | public HandlerList getHandlers() { 16 | return handlers; 17 | } 18 | 19 | private boolean cancelled; 20 | 21 | @Override 22 | public boolean isCancelled() { 23 | return cancelled; 24 | } 25 | 26 | @Override 27 | public void setCancelled(boolean cancel) { 28 | cancelled = cancel; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/cap/HumidityChangeEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.cap; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class HumidityChangeEvent extends Event implements Cancellable { 9 | private static final HandlerList handlers = new HandlerList(); 10 | 11 | public HandlerList getHandlers() { 12 | return handlers; 13 | } 14 | 15 | public static HandlerList getHandlerList() { 16 | return handlers; 17 | } 18 | private Player player; 19 | private ChangeCause cause; 20 | private double change; 21 | private boolean isCancelled; 22 | 23 | public HumidityChangeEvent(Player player, ChangeCause cause, double change) { 24 | this.player=player; 25 | this.cause = cause; 26 | this.change = change; 27 | this.isCancelled = false; 28 | } 29 | 30 | public Player getPlayer() { 31 | return this.player; 32 | } 33 | 34 | public ChangeCause getCause() { 35 | return this.cause; 36 | } 37 | 38 | public double getChange() { 39 | return this.change; 40 | } 41 | 42 | @Override 43 | public boolean isCancelled() { 44 | return isCancelled; 45 | } 46 | 47 | @Override 48 | public void setCancelled(boolean isCancelled) { 49 | this.isCancelled = isCancelled; 50 | } 51 | 52 | public enum ChangeCause { 53 | WATER,RAIN,VAPOUR,ITEMS; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/cap/SanityChangeEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.cap; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class SanityChangeEvent extends Event implements Cancellable { 9 | private static final HandlerList handlers = new HandlerList(); 10 | 11 | public HandlerList getHandlers() { 12 | return handlers; 13 | } 14 | 15 | public static HandlerList getHandlerList() { 16 | return handlers; 17 | } 18 | private Player player; 19 | private ChangeCause cause; 20 | private double change; 21 | private boolean isCancelled; 22 | 23 | public SanityChangeEvent(Player player, ChangeCause cause, double change) { 24 | this.player=player; 25 | this.cause = cause; 26 | this.change = change; 27 | this.isCancelled = false; 28 | } 29 | 30 | public Player getPlayer() { 31 | return this.player; 32 | } 33 | 34 | public ChangeCause getCause() { 35 | return this.cause; 36 | } 37 | 38 | public double getChange() { 39 | return this.change; 40 | } 41 | 42 | @Override 43 | public boolean isCancelled() { 44 | return isCancelled; 45 | } 46 | 47 | @Override 48 | public void setCancelled(boolean isCancelled) { 49 | this.isCancelled = isCancelled; 50 | } 51 | 52 | public enum ChangeCause { 53 | INVENTORYITEM, INVENTORYCLOTHES, CREATUREAURA, 54 | PLAYER, MONSTER, HUMIDITY, 55 | EVENING, NIGHT, USEWAND, FURROLL, STRAWROLL, 56 | SIESTALEANTO, DARKWARN, DARKATTACK, 57 | FOOD,WILLOW; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/cap/TemperatureChangeEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.cap; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class TemperatureChangeEvent extends Event implements Cancellable { 9 | private static final HandlerList handlers = new HandlerList(); 10 | 11 | public HandlerList getHandlers() { 12 | return handlers; 13 | } 14 | 15 | public static HandlerList getHandlerList() { 16 | return handlers; 17 | } 18 | private Player player; 19 | private ChangeCause cause; 20 | private double change; 21 | private boolean isCancelled; 22 | 23 | public TemperatureChangeEvent(Player player, ChangeCause cause, double change) { 24 | this.player=player; 25 | this.cause = cause; 26 | this.change = change; 27 | this.isCancelled = false; 28 | } 29 | 30 | public Player getPlayer() { 31 | return this.player; 32 | } 33 | 34 | public ChangeCause getCause() { 35 | return this.cause; 36 | } 37 | 38 | public double getChange() { 39 | return this.change; 40 | } 41 | 42 | @Override 43 | public boolean isCancelled() { 44 | return isCancelled; 45 | } 46 | 47 | @Override 48 | public void setCancelled(boolean isCancelled) { 49 | this.isCancelled = isCancelled; 50 | } 51 | 52 | public enum ChangeCause { 53 | WARMSTONE,ENVIRONMENT,HUMIDITY,CLOTHES,ITEMS; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/cap/TirednessChangeEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.cap; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.Cancellable; 5 | import org.bukkit.event.Event; 6 | import org.bukkit.event.HandlerList; 7 | 8 | public class TirednessChangeEvent extends Event implements Cancellable { 9 | private static final HandlerList handlers = new HandlerList(); 10 | 11 | public HandlerList getHandlers() { 12 | return handlers; 13 | } 14 | 15 | public static HandlerList getHandlerList() { 16 | return handlers; 17 | } 18 | private Player player; 19 | private ChangeCause cause; 20 | private double change; 21 | private boolean isCancelled; 22 | 23 | public TirednessChangeEvent(Player player, ChangeCause cause, double change) { 24 | this.player=player; 25 | this.cause = cause; 26 | this.change = change; 27 | this.isCancelled = false; 28 | } 29 | 30 | public Player getPlayer() { 31 | return this.player; 32 | } 33 | 34 | public ChangeCause getCause() { 35 | return this.cause; 36 | } 37 | 38 | public double getChange() { 39 | return this.change; 40 | } 41 | 42 | @Override 43 | public boolean isCancelled() { 44 | return isCancelled; 45 | } 46 | 47 | @Override 48 | public void setCancelled(boolean isCancelled) { 49 | this.isCancelled = isCancelled; 50 | } 51 | 52 | public enum ChangeCause { 53 | TELEPORT,TAB,DAMAGE,BE_DAMAGED,ENCHANT, 54 | BREAK,TALK,SPRINT, 55 | DRIVE,SLEEP,BLOCK,GLIDE, 56 | MOVE,NOTMOVE,ITEMWEIGHT; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/player/CustomItemInteractEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.player; 2 | 3 | import org.bukkit.block.Block; 4 | import org.bukkit.block.BlockFace; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.HandlerList; 7 | import org.bukkit.event.block.Action; 8 | import org.bukkit.inventory.ItemStack; 9 | import ute.item.UTEItemStack; 10 | 11 | public class CustomItemInteractEvent extends UTEItemEvent{ 12 | private final Player who; 13 | private final Action action; 14 | private final ItemStack item; 15 | 16 | public Player getWho() { 17 | return who; 18 | } 19 | 20 | public Action getAction() { 21 | return action; 22 | } 23 | 24 | public ItemStack getItem() { 25 | return item; 26 | } 27 | 28 | public Block getClickedBlock() { 29 | return clickedBlock; 30 | } 31 | 32 | public BlockFace getClickedFace() { 33 | return clickedFace; 34 | } 35 | 36 | public UTEItemStack getUteItem() { 37 | return uteItem; 38 | } 39 | 40 | private final Block clickedBlock; 41 | private final BlockFace clickedFace; 42 | private final UTEItemStack uteItem; 43 | public static final HandlerList handlers = new HandlerList(); 44 | 45 | public CustomItemInteractEvent(Player who, Action action, ItemStack item, Block clickedBlock, BlockFace clickedFace, UTEItemStack uteItem) { 46 | this.who=who; 47 | this.action=action; 48 | this.item=item; 49 | this.clickedBlock=clickedBlock; 50 | this.clickedFace=clickedFace; 51 | this.uteItem=uteItem; 52 | } 53 | 54 | public static HandlerList getHandlerList() { 55 | return handlers; 56 | } 57 | 58 | @Override 59 | public HandlerList getHandlers() { 60 | return handlers; 61 | } 62 | 63 | private boolean cancelled; 64 | 65 | @Override 66 | public boolean isCancelled() { 67 | return cancelled; 68 | } 69 | 70 | @Override 71 | public void setCancelled(boolean cancel) { 72 | cancelled = cancel; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/player/PlayerRoleChangeByCommandEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.player; 2 | 3 | import ute.player.role.Roles; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.Cancellable; 6 | import org.bukkit.event.Event; 7 | import org.bukkit.event.HandlerList; 8 | 9 | public class PlayerRoleChangeByCommandEvent 10 | extends Event 11 | implements Cancellable { 12 | private boolean cancelled = false; 13 | private String fallbackMessage; 14 | private boolean needCoins = true; 15 | 16 | public boolean isNeedCoins() { 17 | return needCoins; 18 | } 19 | 20 | public void setNeedCoins(boolean needCoins) { 21 | this.needCoins = needCoins; 22 | } 23 | 24 | public String getFallbackMessage() { 25 | return fallbackMessage; 26 | } 27 | 28 | public void setFallbackMessage(String fallbackMessage) { 29 | this.fallbackMessage = fallbackMessage; 30 | } 31 | 32 | @Override 33 | public boolean isCancelled() { 34 | return cancelled; 35 | } 36 | 37 | @Override 38 | public void setCancelled(boolean cancelled) { 39 | this.cancelled = cancelled; 40 | } 41 | 42 | private static final HandlerList handlerList = new HandlerList(); 43 | private final Player player; 44 | private final Roles target; 45 | 46 | public static HandlerList getHandlerList() { 47 | return handlerList; 48 | } 49 | 50 | @Override 51 | public HandlerList getHandlers() { 52 | return handlerList; 53 | } 54 | 55 | public Player getPlayer() { 56 | return player; 57 | } 58 | 59 | public Roles getTarget() { 60 | return target; 61 | } 62 | 63 | public PlayerRoleChangeByCommandEvent(Player player, Roles target) { 64 | this.player = player; 65 | this.target = target; 66 | } 67 | 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/ute/api/event/player/UTEItemEvent.java: -------------------------------------------------------------------------------- 1 | package ute.api.event.player; 2 | 3 | import org.bukkit.event.Cancellable; 4 | import org.bukkit.event.Event; 5 | import org.bukkit.event.HandlerList; 6 | 7 | public class UTEItemEvent extends Event implements Cancellable { 8 | public static final HandlerList handlers = new HandlerList(); 9 | 10 | public static HandlerList getHandlerList() { 11 | return handlers; 12 | } 13 | 14 | @Override 15 | public HandlerList getHandlers() { 16 | return handlers; 17 | } 18 | 19 | private boolean cancelled; 20 | 21 | @Override 22 | public boolean isCancelled() { 23 | return cancelled; 24 | } 25 | 26 | @Override 27 | public void setCancelled(boolean cancel) { 28 | cancelled = cancel; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/ute/api/spi/PlayerDataLoader.java: -------------------------------------------------------------------------------- 1 | package ute.api.spi; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.util.Map; 8 | 9 | /** 10 | * Create at 2020/3/8 0:04 11 | * Copyright Karlatemp 12 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.api.spi 13 | */ 14 | public interface PlayerDataLoader { 15 | Map 16 | load(File playerdata, OfflinePlayer player) throws IOException; 17 | 18 | void save(File playerdata, 19 | OfflinePlayer player, 20 | Map data) throws IOException; 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/HudProvider.java: -------------------------------------------------------------------------------- 1 | package ute.cap; 2 | 3 | import java.util.HashMap; 4 | import java.util.UUID; 5 | 6 | import org.bukkit.configuration.file.YamlConfiguration; 7 | 8 | import ute.Config; 9 | import ute.UntilTheEnd; 10 | 11 | public class HudProvider { 12 | public static YamlConfiguration yaml; 13 | public static HashMap sanity = new HashMap<>(); 14 | public static HashMap humidity = new HashMap<>(); 15 | public static HashMap temperature = new HashMap<>(); 16 | public static HashMap tiredness = new HashMap<>(); 17 | 18 | public static void initialize(UntilTheEnd plugin) { 19 | yaml = Config.autoUpdateConfigs("hud.yml"); 20 | if (yaml.getBoolean("bar.enable")) 21 | new HudBossBar().runTaskTimer(plugin, 0L, yaml.getLong("fresh")); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/hum/Humidity.java: -------------------------------------------------------------------------------- 1 | package ute.cap.hum; 2 | 3 | import ute.internal.UTEi18n; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | import org.bukkit.event.Listener; 7 | 8 | import ute.Config; 9 | import ute.UntilTheEnd; 10 | 11 | public class Humidity implements Listener { 12 | public static YamlConfiguration yaml; 13 | 14 | public static void initialize(UntilTheEnd plugin) { 15 | yaml = Config.autoUpdateConfigs("humidity.yml"); 16 | Bukkit.getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.hum.provider.loading")); 17 | HumidityProvider.loadConfig(); 18 | ChangeTasks.initialize(plugin); 19 | InfluenceTasks.initialize(plugin); 20 | new InfluenceEvents(plugin); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/hum/HumidityProvider.java: -------------------------------------------------------------------------------- 1 | package ute.cap.hum; 2 | 3 | import java.util.HashMap; 4 | 5 | import ute.Logging; 6 | import ute.internal.ItemFactory; 7 | import ute.internal.UTEi18n; 8 | import org.bukkit.Material; 9 | import org.bukkit.configuration.ConfigurationSection; 10 | 11 | public class HumidityProvider { 12 | public static HashMap moistness = new HashMap<>(); 13 | public static HashMap driness = new HashMap<>(); 14 | 15 | public static void loadConfig() { 16 | final ConfigurationSection section = Humidity.yaml.getConfigurationSection("wetBlocks"); 17 | if (section != null) { 18 | for (String from : section.getKeys(false)) { 19 | String to = section.getString(from); 20 | Material sf = ItemFactory.valueOf(from); 21 | Material tm = ItemFactory.valueOf(to); 22 | Logging.getLogger().info(UTEi18n.parse("cap.hum.provider.rule", String.valueOf(to), String.valueOf(from))); 23 | moistness.put(sf, tm); 24 | driness.put(tm, sf); 25 | } 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/san/InfluenceEvents.java: -------------------------------------------------------------------------------- 1 | package ute.cap.san; 2 | 3 | import ute.api.PlayerApi; 4 | import ute.internal.DisableManager; 5 | import ute.internal.SanChattingProvider; 6 | import org.bukkit.Location; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.player.AsyncPlayerChatEvent; 12 | import org.bukkit.event.player.PlayerMoveEvent; 13 | 14 | import ute.Config; 15 | import ute.player.PlayerManager; 16 | 17 | public class InfluenceEvents implements Listener { 18 | public static double moveWronglySanity = Sanity.yaml.getDouble("moveWronglySanity"); 19 | public static double moveWronglyPercent = Sanity.yaml.getDouble("moveWronglyPercent"); 20 | public static double chatablessSanity = Sanity.yaml.getDouble("chatablessSanity"); 21 | 22 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 23 | public void onMove(PlayerMoveEvent event) { 24 | Player player = event.getPlayer(); 25 | if (!Config.enableWorlds.contains(player.getWorld())) return; 26 | int san = (int) PlayerManager.check(player, PlayerManager.CheckType.SANITY); 27 | int moveWronglySanityCal = (int) (moveWronglySanity * PlayerManager.check(player, PlayerManager.CheckType.SANMAX)); 28 | if (san <= moveWronglySanityCal && Math.random() <= moveWronglyPercent) { 29 | Location loc = event.getTo(); 30 | float fac = (moveWronglySanityCal - san) / 3F; 31 | if (fac < 0) return; 32 | loc.setYaw((float) (loc.getYaw() + Math.random() * fac - Math.random() * fac)); 33 | loc.setPitch((float) (loc.getPitch() + Math.random() * fac - Math.random() * fac)); 34 | event.setTo(loc); 35 | } 36 | } 37 | 38 | @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) 39 | public void onChat(AsyncPlayerChatEvent event) { 40 | Player sender = event.getPlayer(); 41 | if (!DisableManager.root.getBoolean("chatting_placeholder_api", true)) 42 | event.setMessage(PlayerApi.PapiOperations.getPAPI(sender, event.getMessage())); 43 | if (!Config.enableWorlds.contains(sender.getWorld())) return; 44 | int san = (int) PlayerManager.check(sender, PlayerManager.CheckType.SANITY); 45 | int chatablessSanityCal = (int) (chatablessSanity * PlayerManager.check(sender, PlayerManager.CheckType.SANMAX)); 46 | if (san <= chatablessSanityCal) { 47 | event.setMessage(SanChattingProvider.INSTANCE.apply(event.getMessage())); 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/san/Sanity.java: -------------------------------------------------------------------------------- 1 | package ute.cap.san; 2 | 3 | import ute.internal.UTEi18n; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import ute.Config; 8 | import ute.UntilTheEnd; 9 | 10 | public class Sanity { 11 | public static YamlConfiguration yaml; 12 | 13 | public static void initialize(UntilTheEnd plugin) { 14 | yaml = Config.autoUpdateConfigs("sanity.yml"); 15 | Bukkit.getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.san.provider.loading")); 16 | SanityProvider.loadAura(); 17 | ChangeTasks.initialize(); 18 | InfluenceTasks.initialize(); 19 | plugin.getServer().getPluginManager().registerEvents(new InfluenceEvents(), plugin); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/san/SanityProvider.java: -------------------------------------------------------------------------------- 1 | package ute.cap.san; 2 | 3 | import java.util.HashMap; 4 | 5 | import ute.internal.UTEi18n; 6 | import org.bukkit.Bukkit; 7 | import org.bukkit.entity.EntityType; 8 | 9 | public class SanityProvider { 10 | public static HashMap creatureAura = new HashMap(); 11 | 12 | public static void loadAura() { 13 | for (String path : Sanity.yaml.getKeys(true)) { 14 | if (path.equalsIgnoreCase("creatureAura")) continue; 15 | if (path.startsWith("creatureAura")) { 16 | int san = Sanity.yaml.getInt(path); 17 | path = path.replace("creatureAura.", ""); 18 | EntityType type = EntityType.valueOf(path); 19 | Bukkit.getConsoleSender().sendMessage(UTEi18n.parse("cap.san.provider.aura", path, String.valueOf(san))); 20 | creatureAura.put(type, san); 21 | } 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/tem/Temperature.java: -------------------------------------------------------------------------------- 1 | package ute.cap.tem; 2 | 3 | import ute.internal.UTEi18n; 4 | import org.bukkit.Bukkit; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import ute.Config; 8 | import ute.UntilTheEnd; 9 | 10 | public class Temperature { 11 | public static YamlConfiguration yaml; 12 | 13 | public static void initialize(UntilTheEnd plugin) { 14 | yaml = Config.autoUpdateConfigs("temperature.yml"); 15 | Bukkit.getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.tem.provider.loading")); 16 | TemperatureProvider.initialize(plugin); 17 | ChangeTasks.initialize(plugin); 18 | InfluenceTasks.initialize(plugin); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/tir/InfluenceTasks.java: -------------------------------------------------------------------------------- 1 | package ute.cap.tir; 2 | 3 | import ute.internal.NPCChecker; 4 | import ute.internal.ResidenceChecker; 5 | 6 | import org.bukkit.World; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.potion.PotionEffect; 9 | import org.bukkit.potion.PotionEffectType; 10 | import org.bukkit.scheduler.BukkitRunnable; 11 | 12 | import ute.Config; 13 | import ute.internal.UTEi18n; 14 | import ute.player.PlayerManager; 15 | import ute.player.PlayerManager.CheckType; 16 | 17 | public class InfluenceTasks extends BukkitRunnable { 18 | public static int slowness = Tiredness.yaml.getInt("influence.slowness"); 19 | public static int slowdigging = Tiredness.yaml.getInt("influence.slowdigging"); 20 | public static int hunger = Tiredness.yaml.getInt("influence.hunger"); 21 | public static int wither = Tiredness.yaml.getInt("influence.wither"); 22 | public static int weak = Tiredness.yaml.getInt("influence.weak"); 23 | public static int sprint = Tiredness.yaml.getInt("influence.event.sprint"); 24 | 25 | @Override 26 | public void run() { 27 | for (World world : Config.enableWorlds) 28 | for (Player player : world.getPlayers()) { 29 | if (NPCChecker.isNPC(player)||ResidenceChecker.isProtected(player.getLocation())) continue; 30 | int tir = (int) PlayerManager.check(player, CheckType.TIREDNESS); 31 | if (tir >= slowness) 32 | addEffect(player, PotionEffectType.SLOW, (tir - slowness) / 15); 33 | if (tir >= slowdigging) 34 | addEffect(player, PotionEffectType.SLOW_DIGGING, (tir - slowdigging) / 15); 35 | if (tir >= hunger) 36 | addEffect(player, PotionEffectType.HUNGER, (tir - hunger) / 5); 37 | if (tir >= wither) 38 | addEffect(player, PotionEffectType.WITHER, (tir - wither) / 5); 39 | if (tir >= weak) 40 | addEffect(player, PotionEffectType.WEAKNESS, (tir - weak) / 15); 41 | if (player.isSprinting() && tir >= sprint) { 42 | player.sendMessage(UTEi18n.cache("cap.tir.influence.sprint")); 43 | player.setSprinting(false); 44 | } 45 | } 46 | } 47 | 48 | public void addEffect(Player player, PotionEffectType type, int level) { 49 | player.removePotionEffect(type); 50 | player.addPotionEffect(new PotionEffect(type, 200, level)); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/ute/cap/tir/Tiredness.java: -------------------------------------------------------------------------------- 1 | package ute.cap.tir; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | 6 | import ute.Config; 7 | import ute.UntilTheEnd; 8 | import ute.internal.UTEi18n; 9 | 10 | public class Tiredness { 11 | public static YamlConfiguration yaml; 12 | 13 | public static void initialize(UntilTheEnd plugin) { 14 | yaml = Config.autoUpdateConfigs("tiredness.yml"); 15 | Bukkit.getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.tir.provider.loading")); 16 | ChangeTasks.initialize(); 17 | new InfluenceTasks().runTaskTimer(plugin, 0L, 20L); 18 | plugin.getServer().getPluginManager().registerEvents(new ChangeEvents(plugin), plugin); 19 | plugin.getServer().getPluginManager().registerEvents(new InfluenceEvents(), plugin); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/crops/CropProvider.java: -------------------------------------------------------------------------------- 1 | package ute.crops; 2 | 3 | import ute.Logging; 4 | import ute.internal.UTEi18n; 5 | 6 | import java.util.HashMap; 7 | import java.util.List; 8 | 9 | public class CropProvider { 10 | public static HashMap> seasonCrops = new HashMap>(); 11 | 12 | public static void loadConfig() { 13 | for (String path : Crops.yaml.getKeys(true)) { 14 | if (path.equalsIgnoreCase("seasonCrops")) 15 | continue; 16 | if (path.startsWith("seasonCrops")) { 17 | if (path.replace("seasonCrops.", "").contains(".")) 18 | continue; 19 | List seasons = Crops.yaml.getStringList(path + ".seasons"); 20 | List percents = Crops.yaml.getDoubleList(path + ".percents"); 21 | HashMap crop = new HashMap(); 22 | int index = 0; 23 | for (String name : seasons) { 24 | crop.put(name, percents.get(index)); 25 | index++; 26 | } 27 | Logging.getLogger().info( 28 | UTEi18n.parse("crops.provider.rule", path.replace("seasonCrops.", ""), String.valueOf(crop))); 29 | seasonCrops.put(path.replace("seasonCrops.", ""), crop); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/ute/crops/Crops.java: -------------------------------------------------------------------------------- 1 | package ute.crops; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import ute.Config; 6 | import ute.internal.UTEi18n; 7 | 8 | public class Crops { 9 | static YamlConfiguration yaml; 10 | public static void initialize() { 11 | yaml = Config.autoUpdateConfigs("crops.yml"); 12 | Bukkit.getServer().getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.crops.provider.loading")); 13 | CropProvider.loadConfig(); 14 | if (yaml.getBoolean("crops.season")) 15 | new SeasonCroping(); 16 | if (yaml.getBoolean("crops.takewaterup.enable")) 17 | new TakeWaterUp(); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ute/crops/SeasonCroping.java: -------------------------------------------------------------------------------- 1 | package ute.crops; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.Material; 5 | import org.bukkit.World; 6 | import org.bukkit.block.Block; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import org.bukkit.event.block.BlockGrowEvent; 11 | import ute.Config; 12 | import ute.UntilTheEnd; 13 | import ute.api.WorldApi; 14 | import ute.world.WorldProvider; 15 | 16 | import java.util.HashMap; 17 | 18 | public class SeasonCroping implements Listener { 19 | public SeasonCroping() { 20 | Bukkit.getServer().getPluginManager().registerEvents(this, UntilTheEnd.getInstance()); 21 | } 22 | 23 | @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) 24 | public void onGrow(BlockGrowEvent event) { 25 | if (event.getBlock() == null) return; 26 | Block block = event.getBlock(); 27 | World world = block.getWorld(); 28 | if (!Config.enableWorlds.contains(world)) return; 29 | WorldProvider.Season season = WorldApi.getSeason(world); 30 | Material material = block.getState().getData().getItemType(); 31 | String name = material.toString(); 32 | if (CropProvider.seasonCrops.containsKey(name)) { 33 | HashMap crop = CropProvider.seasonCrops.get(name); 34 | if (crop.containsKey(season.toString())) { 35 | double percent = crop.get(season.toString()); 36 | if (Math.random() > percent) 37 | event.setCancelled(true); 38 | } else event.setCancelled(true); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/ute/crops/TakeWaterUp.java: -------------------------------------------------------------------------------- 1 | package ute.crops; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.Location; 5 | import org.bukkit.Material; 6 | import org.bukkit.World; 7 | import org.bukkit.block.Block; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.block.BlockFromToEvent; 12 | import org.bukkit.event.block.BlockGrowEvent; 13 | import ute.Config; 14 | import ute.UntilTheEnd; 15 | 16 | public class TakeWaterUp implements Listener { 17 | static double percent = Crops.yaml.getDouble("crops.takewaterup.takeWaterPercent"); 18 | 19 | public TakeWaterUp() { 20 | Bukkit.getServer().getPluginManager().registerEvents(this, UntilTheEnd.getInstance()); 21 | } 22 | 23 | @EventHandler 24 | public void onLiquidRun(BlockFromToEvent event) { 25 | Block block1 = event.getBlock(); 26 | Block block2 = event.getToBlock(); 27 | if (!Config.enableWorlds.contains(block1.getWorld())) return; 28 | if (!Config.enableWorlds.contains(block2.getWorld())) return; 29 | if (!block1.isLiquid()) return; 30 | if (block2.isLiquid()) event.setCancelled(true); 31 | } 32 | 33 | @EventHandler(priority = EventPriority.NORMAL) 34 | public void onTakingUp(BlockGrowEvent event) { 35 | Block block = event.getBlock(); 36 | Location loc = block.getLocation(); 37 | World world = loc.getWorld(); 38 | if (!Config.enableWorlds.contains(world)) return; 39 | boolean flag = true; 40 | for (int x = -3; x <= 3; x++) { 41 | for (int y = -3; y <= 3; y++) { 42 | for (int z = -3; z <= 3; z++) { 43 | Location locNew = new Location(loc.getWorld(), loc.getX() + x, loc.getY() + y, loc.getZ() + z); 44 | Block iblock = world.getBlockAt(locNew); 45 | if (iblock.isLiquid()) { 46 | if (Math.random() <= percent) 47 | iblock.setType(Material.AIR); 48 | flag = false; 49 | } 50 | } 51 | } 52 | } 53 | if (flag) 54 | if (Math.random() <= 0.1) 55 | block.breakNaturally(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/ute/food/Food.java: -------------------------------------------------------------------------------- 1 | package ute.food; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import ute.Config; 6 | import ute.UntilTheEnd; 7 | import ute.crops.CropProvider; 8 | import ute.internal.UTEi18n; 9 | 10 | public class Food { 11 | static YamlConfiguration yaml; 12 | 13 | public Food(UntilTheEnd plugin) { 14 | yaml = Config.autoUpdateConfigs("food.yml"); 15 | Bukkit.getServer().getConsoleSender().sendMessage(UTEi18n.cacheWithPrefix("cap.crops.provider.loading")); 16 | CropProvider.loadConfig(); 17 | if (yaml.getBoolean("food.rotten.invenable")) 18 | new RottenFoodTask(plugin); 19 | if (yaml.getBoolean("food.rotten.guienable")) { 20 | RottenFoodEvents events = new RottenFoodEvents(); 21 | plugin.getServer().getPluginManager().registerEvents(events, plugin); 22 | plugin.getServer().getScheduler().runTaskTimer(plugin, events, 0, 23 | yaml.getLong("food.rotten.guispeed")); 24 | } 25 | new RottenFoodInfluence(plugin); 26 | if (yaml.getBoolean("food.hunger.enable")) 27 | new Hunger(plugin); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/main/java/ute/food/Hunger.java: -------------------------------------------------------------------------------- 1 | package ute.food; 2 | 3 | import ute.internal.NPCChecker; 4 | import org.bukkit.GameMode; 5 | import org.bukkit.World; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.event.player.PlayerJoinEvent; 10 | import org.bukkit.scheduler.BukkitRunnable; 11 | 12 | import ute.Config; 13 | import ute.UntilTheEnd; 14 | 15 | public class Hunger implements Listener { 16 | 17 | public Hunger(UntilTheEnd plugin) { 18 | plugin.getServer().getPluginManager().registerEvents(this, plugin); 19 | new AutoHunger().runTaskTimer(plugin, 0L, 20 * Food.yaml.getLong("food.hunger.speed")); 20 | } 21 | 22 | @EventHandler() 23 | public void onJoin(PlayerJoinEvent event) { 24 | if (!Config.enableWorlds.contains(event.getPlayer().getWorld())) return; 25 | event.getPlayer().setFoodLevel(10); 26 | } 27 | 28 | public static class AutoHunger extends BukkitRunnable { 29 | @Override 30 | public void run() { 31 | for (World world : Config.enableWorlds) 32 | for (Player player : world.getPlayers()) 33 | if (!NPCChecker.isNPC(player)) 34 | if (!(player.getGameMode() == GameMode.CREATIVE || player.getGameMode() == GameMode.SPECTATOR)) 35 | player.setFoodLevel(player.getFoodLevel() - 1); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ute/guide/craft/HolderCategoryHelp.java: -------------------------------------------------------------------------------- 1 | package ute.guide.craft; 2 | 3 | /** 4 | * Create at 2020/3/7 23:29 5 | * Copyright Karlatemp 6 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.guide 7 | */ 8 | public class HolderCategoryHelp implements UTEInvHolder { 9 | public static final HolderCategoryHelp INSTANCE = new HolderCategoryHelp(); 10 | private String name; 11 | 12 | @Override 13 | public String getCustomName() { 14 | return name; 15 | } 16 | 17 | @Override 18 | public void setCustomName(String name) { 19 | this.name = name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/guide/craft/HolderItemCraftingHelp.java: -------------------------------------------------------------------------------- 1 | package ute.guide.craft; 2 | 3 | /** 4 | * Create at 2020/3/7 23:27 5 | * Copyright Karlatemp 6 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.guide 7 | */ 8 | public class HolderItemCraftingHelp implements UTEInvHolder { 9 | public static final HolderItemCraftingHelp INSTANCE = new HolderItemCraftingHelp(); 10 | private String name; 11 | 12 | @Override 13 | public String getCustomName() { 14 | return name; 15 | } 16 | 17 | @Override 18 | public void setCustomName(String name) { 19 | this.name = name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/guide/craft/HolderMainHelp.java: -------------------------------------------------------------------------------- 1 | package ute.guide.craft; 2 | 3 | /** 4 | * Create at 2020/3/7 23:29 5 | * Copyright Karlatemp 6 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.guide 7 | */ 8 | public class HolderMainHelp implements UTEInvHolder { 9 | public static final HolderMainHelp INSTANCE = new HolderMainHelp(); 10 | private String name; 11 | 12 | @Override 13 | public String getCustomName() { 14 | return name; 15 | } 16 | 17 | @Override 18 | public void setCustomName(String name) { 19 | this.name = name; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/guide/craft/UTEInvHolder.java: -------------------------------------------------------------------------------- 1 | package ute.guide.craft; 2 | 3 | import org.bukkit.inventory.Inventory; 4 | import org.bukkit.inventory.InventoryHolder; 5 | import org.jetbrains.annotations.Nullable; 6 | 7 | /** 8 | * Create at 2020/3/7 23:29 9 | * Copyright Karlatemp 10 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.guide 11 | */ 12 | public interface UTEInvHolder extends InventoryHolder { 13 | @Override 14 | default Inventory getInventory() { 15 | return null; 16 | } 17 | 18 | /** 19 | * Gets the custom name on a mob or block. If there is no name this method 20 | * will return null. 21 | *

22 | * This value has no effect on players, they will always use their real 23 | * name. 24 | * 25 | * @return name of the mob/block or null 26 | */ 27 | @Nullable 28 | public String getCustomName(); 29 | 30 | /** 31 | * Sets a custom name on a mob or block. This name will be used in death 32 | * messages and can be sent to the client as a nameplate over the mob. 33 | *

34 | * Setting the name to null or an empty string will clear it. 35 | *

36 | * This value has no effect on players, they will always use their real 37 | * name. 38 | * 39 | * @param name the name to set 40 | */ 41 | public void setCustomName(@Nullable String name); 42 | } 43 | -------------------------------------------------------------------------------- /src/main/java/ute/guide/craft/event/OperateLimiter.java: -------------------------------------------------------------------------------- 1 | package ute.guide.craft.event; 2 | 3 | import org.bukkit.event.EventHandler; 4 | import org.bukkit.event.EventPriority; 5 | import org.bukkit.event.Listener; 6 | import org.bukkit.event.inventory.InventoryClickEvent; 7 | import org.bukkit.event.inventory.InventoryDragEvent; 8 | import org.bukkit.event.player.PlayerQuitEvent; 9 | 10 | import java.util.ArrayList; 11 | import java.util.UUID; 12 | 13 | public class OperateLimiter implements Listener { 14 | public static ArrayList openers=new ArrayList(); 15 | @EventHandler(priority= EventPriority.LOWEST) 16 | public void onClick(InventoryClickEvent event){ 17 | if(openers.contains(event.getWhoClicked().getUniqueId())){ 18 | event.setCancelled(true); 19 | } 20 | } 21 | @EventHandler(priority= EventPriority.LOWEST) 22 | public void onDrag(InventoryDragEvent event){ 23 | if(openers.contains(event.getWhoClicked().getUniqueId())){ 24 | event.setCancelled(true); 25 | } 26 | } 27 | @EventHandler(priority= EventPriority.LOWEST) 28 | public void onQuit(PlayerQuitEvent event){ 29 | openers.remove(event.getPlayer().getUniqueId()); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/DataConverter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/05/09 19:55:20 5 | * 6 | * until-the-end/until-the-end.main/DataConverter.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import ute.Logging; 12 | import ute.UntilTheEnd; 13 | import ute.api.BlockApi; 14 | import ute.api.Loc3D; 15 | import org.bukkit.configuration.file.YamlConfiguration; 16 | 17 | import java.io.File; 18 | import java.io.IOException; 19 | import java.util.logging.Level; 20 | import java.util.logging.Logger; 21 | 22 | public class DataConverter { 23 | public static void run() { 24 | final UntilTheEnd plugin = UntilTheEnd.getInstance(); 25 | final Logger logger = Logging.getLogger(); 26 | logger.finer("[DataConverter] Task start......"); 27 | File data = new File(plugin.getDataFolder(), "data"); 28 | resolve(new File(data, "blocks.yml"), "Blocks", logger); 29 | resolve(new File(data, "traps.yml"), "Traps", logger); 30 | } 31 | 32 | private static void resolve(File blocks, String name, Logger logger) { 33 | logger.finer("[DataConverter] Resolve " + name + "..."); 34 | if (blocks.isFile()) { 35 | final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(blocks); 36 | YamlConfiguration current = new YamlConfiguration(); 37 | boolean needUpdate = false; 38 | for (String key : configuration.getKeys(false)) { 39 | try { 40 | final Loc3D loc3d = BlockApi.strToLoc3d(key); 41 | final String loc3s = BlockApi.locToStr(loc3d); 42 | current.set(loc3s, configuration.getString(key)); 43 | needUpdate |= !loc3s.equals(key); 44 | } catch (Throwable any) { 45 | logger.log(Level.WARNING, "[DataConverter] [" + name + "] Invalid loc3d `" + key + "`"); 46 | } 47 | } 48 | if (needUpdate) { 49 | try { 50 | current.save(blocks); 51 | } catch (IOException ioException) { 52 | logger.log(Level.SEVERE, "[DataConverter] [" + name + "] Exception in updating loc3d", ioException); 53 | } 54 | } 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/DisableManager.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/12 18:11:38 5 | * 6 | * UntilTheEnd/UntilTheEnd/DisableManager.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import ute.Config; 12 | import ute.Logging; 13 | import ute.player.PlayerManager; 14 | import org.bukkit.World; 15 | import org.bukkit.configuration.ConfigurationSection; 16 | import org.bukkit.configuration.file.YamlConfiguration; 17 | 18 | import java.util.*; 19 | 20 | public class DisableManager { 21 | public static final YamlConfiguration root = Config.autoUpdateConfigs("disable.yml"); 22 | public static boolean bypass_right_action_cancelled; 23 | public static boolean disable_actionbar; 24 | 25 | static { 26 | Logging.getLogger().fine("[DisableManager] Loading disable manager's data...."); 27 | bypass_right_action_cancelled = root.getBoolean("bypass_right_action_cancelled", false); 28 | disable_actionbar = root.getBoolean("disable_actionbar", false); 29 | } 30 | 31 | public static class CheckTypeChecking { 32 | private static final ConfigurationSection section = root.getConfigurationSection("check-type"); 33 | private static final Map> mapping = new HashMap<>(); 34 | private static final EnumSet def; 35 | private static final Map> cache = new HashMap<>(); 36 | 37 | public static EnumSet getDisabled(World world) { 38 | EnumSet checkTypes = cache.get(world.getUID()); 39 | if (checkTypes == null) { 40 | checkTypes = mapping.getOrDefault(world.getName().toLowerCase(), def); 41 | cache.put(world.getUID(), checkTypes); 42 | } 43 | return checkTypes; 44 | } 45 | 46 | public static EnumSet parse(Collection list) { 47 | EnumSet es = EnumSet.noneOf(PlayerManager.CheckType.class); 48 | if (list == null) return es; 49 | for (String opt : list) { 50 | final PlayerManager.CheckType search = PlayerManager.CheckType.search(opt); 51 | if (search != null) 52 | es.add(search); 53 | } 54 | return es; 55 | } 56 | 57 | static { 58 | for (String wn : section.getKeys(false)) { 59 | ConfigurationSection val = section.getConfigurationSection(wn); 60 | final EnumSet list = parse(val.getStringList("list")); 61 | mapping.put(wn.toLowerCase(), list); 62 | for (String mirror : val.getStringList("mirror")) { 63 | mapping.put(mirror.toLowerCase(), list); 64 | } 65 | } 66 | def = mapping.getOrDefault("$default", EnumSet.noneOf(PlayerManager.CheckType.class)); 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/EventHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/12 19:07:33 5 | * 6 | * UntilTheEnd/UntilTheEnd/EventHelper.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import org.bukkit.event.block.Action; 12 | 13 | public class EventHelper { 14 | public static boolean isRight(Action action) { 15 | return action == Action.RIGHT_CLICK_AIR || action == Action.RIGHT_CLICK_BLOCK; 16 | } 17 | 18 | public static boolean isLeft(Action action) { 19 | return action == Action.LEFT_CLICK_AIR || action == Action.LEFT_CLICK_BLOCK; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/ExceptionBox.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/04/02 09:38:35 5 | * 6 | * UntilTheEnd/UntilTheEnd/ExceptionBox.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | public class ExceptionBox extends Throwable { 12 | /** 13 | * 14 | */ 15 | private static final long serialVersionUID = 1L; 16 | public final Object exception; 17 | 18 | public ExceptionBox(Object exception) { 19 | super(null, null, false, false); 20 | this.exception = exception; 21 | } 22 | } -------------------------------------------------------------------------------- /src/main/java/ute/internal/HolderPlaceholder.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/04/20 21:47:57 5 | * 6 | * UntilTheEnd/UntilTheEnd/HolderPlaceholder.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import org.bukkit.Bukkit; 12 | import org.bukkit.inventory.Inventory; 13 | import org.bukkit.inventory.InventoryHolder; 14 | 15 | public interface HolderPlaceholder extends InventoryHolder { 16 | Inventory INVENTORY = Bukkit.createInventory(null, 9, ""); 17 | 18 | @Override 19 | default Inventory getInventory() { 20 | return INVENTORY; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/InternalClassLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/11 19:47:39 5 | * 6 | * UntilTheEnd/UntilTheEnd/InternalClassLoader.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import java.util.Base64; 12 | 13 | public class InternalClassLoader extends ClassLoader { 14 | private InternalClassLoader() { 15 | super(InternalClassLoader.class.getClassLoader()); 16 | } 17 | 18 | public static final InternalClassLoader loader = new InternalClassLoader(); 19 | 20 | public Class load(byte[] data) { 21 | return defineClass(null, data, 0, data.length); 22 | } 23 | 24 | public Class load(String encoded) { 25 | return load(Base64.getDecoder().decode(encoded)); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/LightingCompensation.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 21:33:30 5 | * 6 | * UntilTheEnd/UntilTheEnd/LightingCompensation.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import ute.UntilTheEnd; 12 | import org.bukkit.Bukkit; 13 | import org.bukkit.World; 14 | import org.bukkit.configuration.file.YamlConfiguration; 15 | import org.bukkit.event.EventHandler; 16 | import org.bukkit.event.Listener; 17 | import org.bukkit.event.world.WorldLoadEvent; 18 | 19 | import java.io.File; 20 | import java.util.HashMap; 21 | import java.util.Map; 22 | import java.util.UUID; 23 | 24 | public class LightingCompensation { 25 | public static final Map comp = new HashMap<>(); 26 | public static final Map config = new HashMap<>(); 27 | private static boolean initialize; 28 | 29 | public static int getComp(UUID world) { 30 | final Integer integer = comp.get(world); 31 | if (integer == null) return 0; 32 | return integer; 33 | } 34 | 35 | private static void update(World world) { 36 | final Integer integer = config.get(world.getName().toLowerCase()); 37 | if (integer == null) return; 38 | comp.put(world.getUID(), integer); 39 | } 40 | 41 | public static void reload() { 42 | UntilTheEnd pl = UntilTheEnd.getInstance(); 43 | comp.clear(); 44 | config.clear(); 45 | pl.saveResource("LightingCompensation.yml", false); 46 | final YamlConfiguration setting = YamlConfiguration.loadConfiguration(new File(pl.getDataFolder(), "LightingCompensation.yml")); 47 | for (String key : setting.getKeys(false)) { 48 | config.put(key.toLowerCase(), setting.getInt(key)); 49 | } 50 | Bukkit.getWorlds().forEach(LightingCompensation::update); 51 | if (initialize) { 52 | return; 53 | } 54 | Bukkit.getPluginManager().registerEvents(new Listener() { 55 | @EventHandler() 56 | void onWorldLoad(WorldLoadEvent event) { 57 | update(event.getWorld()); 58 | } 59 | }, pl); 60 | initialize = true; 61 | } 62 | 63 | static { 64 | reload(); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/MathHelper.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/11 23:30:56 5 | * 6 | * UntilTheEnd/UntilTheEnd/MathHelper.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | public class MathHelper { 12 | public static double p2(double d) { 13 | return Math.floor(d * 100D) / 100D; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/NPCChecker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/18 24:04:00 5 | * 6 | * UntilTheEnd/UntilTheEnd/NPCChecker.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import ute.nms.NMSHelper; 12 | import net.citizensnpcs.api.npc.NPC; 13 | import net.citizensnpcs.npc.ai.NPCHolder; 14 | import org.bukkit.entity.Entity; 15 | 16 | import com.infumia.fakeplayer.api.INPC; 17 | 18 | import java.util.LinkedList; 19 | import java.util.function.Predicate; 20 | 21 | @SuppressWarnings("Convert2Lambda") 22 | public class NPCChecker { 23 | private static final LinkedList> checkers = new LinkedList<>(); 24 | 25 | public static void clearAll() { 26 | checkers.clear(); 27 | } 28 | 29 | public static boolean isNPC(Entity entity) { 30 | for (Predicate checker : checkers) { 31 | if (checker.test(entity)) return true; 32 | } 33 | return false; 34 | } 35 | 36 | public static void register(Predicate checker) { 37 | checkers.add(checker); 38 | } 39 | 40 | static { 41 | try { 42 | // For Citizens 43 | Class.forName("net.citizensnpcs.npc.ai.NPCHolder"); 44 | register(new Predicate() { 45 | @Override 46 | public boolean test(Entity entity) { 47 | return entity instanceof NPC || entity instanceof NPCHolder; 48 | } 49 | }); 50 | } catch (Throwable ignore) { 51 | } 52 | try { 53 | // For FakePlayer (73139) 54 | Class.forName("com.infumia.fakeplayer.api.INPC"); 55 | register(new Predicate() { 56 | @Override 57 | public boolean test(Entity entity) { 58 | return NMSHelper.getHandle(entity) instanceof INPC; 59 | } 60 | }); 61 | } catch (Throwable ignore) { 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/OptionFeature.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/11 17:34:04 5 | * 6 | * UntilTheEnd/UntilTheEnd/OptionFeature.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import ute.Logging; 12 | import ute.UntilTheEnd; 13 | 14 | import java.io.*; 15 | import java.nio.charset.StandardCharsets; 16 | import java.nio.file.Files; 17 | import java.util.Collection; 18 | import java.util.HashSet; 19 | import java.util.concurrent.ConcurrentLinkedQueue; 20 | import java.util.logging.Level; 21 | 22 | @SuppressWarnings("ResultOfMethodCallIgnored") 23 | public abstract class OptionFeature { 24 | public static Collection disabled = new HashSet<>(); 25 | public static Collection all = new ConcurrentLinkedQueue<>(); 26 | 27 | static { 28 | File list = new File(UntilTheEnd.getInstance().getDataFolder(), "disabled.txt"); 29 | if (!list.isFile()) { 30 | try { 31 | list.getParentFile().mkdirs(); 32 | list.createNewFile(); 33 | Files.write(list.toPath(), ("" + 34 | "# This is a list of disabled UTE features\n" + 35 | "# If you want to dump all features. Use \"/ute dump-features\" to dump them.\n" + 36 | "").getBytes(StandardCharsets.UTF_8)); 37 | } catch (IOException e) { 38 | Logging.getLogger().log(Level.SEVERE, "Failed to save disabled list.", e); 39 | } 40 | } else { 41 | try { 42 | try (FileInputStream fis = new FileInputStream(list)) { 43 | try (InputStreamReader reader = new InputStreamReader(fis, StandardCharsets.UTF_8)) { 44 | try (BufferedReader buffer = new BufferedReader(reader)) { 45 | String line; 46 | while ((line = buffer.readLine()) != null) { 47 | line = line.trim(); 48 | if (line.isEmpty()) continue; 49 | if (line.charAt(0) == '#') continue; 50 | disabled.add(line); 51 | } 52 | } 53 | } 54 | } 55 | } catch (Throwable any) { 56 | Logging.getLogger().log(Level.SEVERE, "Exception in loading disabled list.", any); 57 | } 58 | } 59 | } 60 | 61 | public String getFeatureName() { 62 | return getClass().getName(); 63 | } 64 | 65 | public boolean isEnable() { 66 | return !disabled.contains(getFeatureName()); 67 | } 68 | 69 | protected abstract void boot(); 70 | 71 | public void start() { 72 | String uniqueId = getFeatureName(); 73 | if (!all.contains(uniqueId)) all.add(uniqueId); 74 | if (isEnable()) boot(); 75 | else Logging.getLogger().log(Level.WARNING, "Feature " + uniqueId + " disabled."); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/ResidenceChecker.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/18 24:04:00 5 | * 6 | * UntilTheEnd/UntilTheEnd/NPCChecker.java 7 | */ 8 | 9 | package ute.internal; 10 | 11 | import java.util.LinkedList; 12 | import java.util.List; 13 | import java.util.function.Consumer; 14 | 15 | import org.bukkit.Location; 16 | 17 | import com.bekvon.bukkit.residence.api.ResidenceApi; 18 | import com.bekvon.bukkit.residence.protection.ClaimedResidence; 19 | import ute.UntilTheEnd; 20 | 21 | // 代码隔离 22 | @SuppressWarnings("Convert2Lambda") 23 | public class ResidenceChecker { 24 | public static final LinkedList> handlers = new LinkedList<>(); 25 | 26 | public static class ProtectedEvent { 27 | public boolean cancelled; 28 | public final Location location; 29 | 30 | public ProtectedEvent(Location location) { 31 | this.location = location; 32 | } 33 | } 34 | 35 | static { 36 | try { 37 | // Residence 38 | Class.forName("com.bekvon.bukkit.residence.api.ResidenceApi"); 39 | List ignoredList = UntilTheEnd.getInstance().getConfig().getStringList("ignoreResidences"); 40 | handlers.add(new Consumer() { 41 | @Override 42 | public void accept(ProtectedEvent event) { 43 | if (event.cancelled) return; 44 | ClaimedResidence residence = ResidenceApi.getResidenceManager().getByLoc(event.location); 45 | while (residence != null) { 46 | if (ignoredList.contains(residence.getName())) { 47 | event.cancelled = true; 48 | return; 49 | } 50 | residence = residence.getParent(); 51 | } 52 | } 53 | }); 54 | } catch (Throwable ignore) { 55 | } 56 | } 57 | 58 | public static boolean isProtected(Location loc) { 59 | ProtectedEvent event = new ProtectedEvent(loc); 60 | for (Consumer handler : handlers) { 61 | handler.accept(event); 62 | } 63 | return event.cancelled; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/AbstractReplacer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/AbstractReplacer.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | public interface AbstractReplacer extends Replacer { 12 | @Override 13 | default boolean containsKey(String key) { 14 | return true; 15 | } 16 | 17 | @Override 18 | default boolean isEmpty() { 19 | return false; 20 | } 21 | 22 | @Override 23 | default void apply(StringBuilder builder, String key) { 24 | builder.append(key); 25 | } 26 | 27 | @Override 28 | default void apply(StringBuilder builder, int slot) { 29 | apply(builder, String.valueOf(slot)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/ArrayReplacer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/ArrayReplacer.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import java.util.Arrays; 12 | import java.util.List; 13 | 14 | public class ArrayReplacer implements Replacer { 15 | private final List list; 16 | 17 | public ArrayReplacer(List list) { 18 | this.list = list; 19 | } 20 | 21 | public ArrayReplacer(String... list) { 22 | this(Arrays.asList(list)); 23 | } 24 | 25 | @Override 26 | public boolean containsKey(String key) { 27 | return false; 28 | } 29 | 30 | @Override 31 | public boolean containsSlot(int slot) { 32 | return slot >= 0 && slot < list.size(); 33 | } 34 | 35 | @Override 36 | public boolean isEmpty() { 37 | return list.isEmpty(); 38 | } 39 | 40 | @Override 41 | public String apply(String s) { 42 | return null; 43 | } 44 | 45 | @Override 46 | public void apply(StringBuilder builder, String key) { 47 | 48 | } 49 | 50 | @Override 51 | public void apply(StringBuilder builder, int slot) { 52 | if (containsSlot(slot)) 53 | builder.append(list.get(slot)); 54 | } 55 | 56 | @Override 57 | public String getKey(String key) { 58 | return null; 59 | } 60 | 61 | @Override 62 | public String getSlot(int slot) { 63 | StringBuilder sb = new StringBuilder(); 64 | apply(sb, slot); 65 | return sb.toString(); 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/FormatTemplate.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/FormatTemplate.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Locale; 14 | 15 | public interface FormatTemplate { 16 | String format(Locale locale, @NotNull Replacer replacer); 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/Formatter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/Formatter.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Locale; 14 | import java.util.Map; 15 | import java.util.function.BiFunction; 16 | import java.util.function.Function; 17 | 18 | public abstract class Formatter implements BiFunction { 19 | 20 | public static MapMapping mapping(final Map map) { 21 | return MapMapping.mapping(map); 22 | } 23 | 24 | @Deprecated 25 | public String format(final Locale l, final String t, final Function func) { 26 | if (func instanceof Replacer) { 27 | return format(l, t, (Replacer) func); 28 | } 29 | return format(l, t, new FRP(func)); 30 | 31 | } 32 | 33 | @Deprecated 34 | public String format(final String t, final Function func) { 35 | return format(Locale.getDefault(), t, func); 36 | } 37 | 38 | protected boolean nullCheck(final Locale l, final String t, final Replacer u) { 39 | if (t == null || u == null || t.isEmpty() || u.isEmpty()) { 40 | return true; 41 | } 42 | return false; 43 | } 44 | 45 | @Deprecated 46 | public String format(final Locale l, final String t, final Replacer u) { 47 | return parse(t, Replacer.EMPTY).format(l, u); 48 | } 49 | 50 | @Deprecated 51 | public String format(final String t, final Replacer u) { 52 | return format(Locale.getDefault(), t, u); 53 | } 54 | 55 | @Deprecated 56 | @Override 57 | public String apply(final String t, final Replacer u) { 58 | return format(t, u); 59 | } 60 | 61 | public abstract FormatTemplate parse(@NotNull String template, @NotNull Replacer constants); 62 | 63 | private static class FRP implements Replacer { 64 | 65 | private final Function func; 66 | 67 | public FRP(Function func) { 68 | this.func = func; 69 | } 70 | 71 | @Override 72 | public boolean containsKey(String key) { 73 | return true; 74 | } 75 | 76 | @Override 77 | public boolean isEmpty() { 78 | return false; 79 | } 80 | 81 | @Override 82 | public String apply(String t) { 83 | return func.apply(t); 84 | } 85 | 86 | @Override 87 | public void apply(StringBuilder builder, String key) { 88 | builder.append(apply(key)); 89 | } 90 | 91 | @Override 92 | public void apply(StringBuilder builder, int key) { 93 | builder.append(getSlot(key)); 94 | } 95 | } 96 | 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/Java9StringFactory.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/Java9StringFactory.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.lang.invoke.MethodHandles; 14 | import java.lang.invoke.MethodType; 15 | import java.nio.CharBuffer; 16 | import java.util.UUID; 17 | 18 | /** 19 | * @see java.lang.invoke.StringConcatFactory#makeConcatWithConstants(MethodHandles.Lookup, String, MethodType, String, Object...) 20 | */ 21 | public class Java9StringFactory extends Formatter { 22 | /** 23 | * Tag used to demarcate an ordinary argument. 24 | */ 25 | private static final char TAG_ARG = '\u0001'; 26 | 27 | /** 28 | * Tag used to demarcate a constant. 29 | */ 30 | private static final char TAG_CONST = '\u0002'; 31 | 32 | public static void main(String... args) { 33 | System.out.println(new Java9StringFactory().parse("Hey, My \u0002 Is \u0001!", 34 | new ArrayReplacer("UniqueId") 35 | ).format(null, new ArrayReplacer(UUID.randomUUID().toString()))); 36 | } 37 | 38 | @Override 39 | public FormatTemplate parse(@NotNull String template, @NotNull Replacer constants) { 40 | FormatAction.ActionLink link = new FormatAction.ActionLink(); 41 | CharBuffer cb = CharBuffer.allocate(template.length()); 42 | int arg = 0, cArg = 0; 43 | for (char c : template.toCharArray()) { 44 | switch (c) { 45 | case TAG_ARG: { 46 | cb.flip(); 47 | if (cb.hasRemaining()) { 48 | link.append(cb.toString()); 49 | } 50 | cb.clear(); 51 | link.appendSlot(arg++); 52 | break; 53 | } 54 | case TAG_CONST: { 55 | cb.flip(); 56 | if (cb.hasRemaining()) { 57 | link.append(cb.toString()); 58 | } 59 | cb.clear(); 60 | link.append(constants.getSlot(cArg++)); 61 | break; 62 | } 63 | default: { 64 | cb.put(c); 65 | break; 66 | } 67 | } 68 | } 69 | cb.flip(); 70 | if (cb.hasRemaining()) { 71 | link.append(cb.toString()); 72 | } 73 | return new SimpleFormatTemplate(link); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/MapMapping.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/MapMapping.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import java.util.Map; 12 | //@SuppressWarnings({"rawtypes"}) 13 | 14 | public class MapMapping implements Replacer { 15 | 16 | public static MapMapping mapping(Map map) { 17 | return new MapMapping<>(map); 18 | } 19 | 20 | private final Map m; 21 | 22 | public MapMapping(Map map) { 23 | this.m = map; 24 | } 25 | 26 | public Map getMap() { 27 | return m; 28 | } 29 | 30 | @Override 31 | public String apply(String t) { 32 | return String.valueOf(m.get(t)); 33 | } 34 | 35 | @Override 36 | public void apply(StringBuilder builder, String key) { 37 | builder.append(apply(key)); 38 | } 39 | 40 | @Override 41 | public void apply(StringBuilder builder, int key) { 42 | builder.append(getSlot(key)); 43 | } 44 | 45 | @Override 46 | public boolean containsKey(String key) { 47 | return m.containsKey(key); 48 | } 49 | 50 | @Override 51 | public boolean isEmpty() { 52 | return m.isEmpty(); 53 | } 54 | 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/PunctuateFormatter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/PunctuateFormatter.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.HashMap; 14 | import java.util.function.BiConsumer; 15 | 16 | public class PunctuateFormatter extends Formatter implements BiConsumer { 17 | 18 | private final String suf; 19 | private final String pre; 20 | 21 | public PunctuateFormatter(String prefix, String suffix) { 22 | if (prefix.isEmpty() || suffix.isEmpty()) { 23 | throw new RuntimeException("Cannot input empty string."); 24 | } 25 | this.pre = prefix; 26 | this.suf = suffix; 27 | } 28 | 29 | public static void main(String[] args) { 30 | HashMap map = new HashMap<>(); 31 | map.put("A", "Karlatemp"); 32 | map.put("B", "Bilibili"); 33 | map.put("C", "1min"); 34 | System.out.println(new PunctuateFormatter("$", "$").parse( 35 | "$A$ to $B$ used $C$.$UNKNOWN_VARIABLE$ Copyright Karlatemp.", Replacer.EMPTY 36 | ).format(null, new MapMapping<>(map))); 37 | } 38 | 39 | @Override 40 | public FormatTemplate parse(@NotNull String template, @NotNull Replacer constants) { 41 | FormatAction.ActionLink link = new FormatAction.ActionLink(); 42 | final int size = template.length(); 43 | int off = 0; 44 | do { 45 | final int ind = template.indexOf(pre, off); 46 | if (ind == -1) { 47 | link.append(template.substring(off)); 48 | break; 49 | } 50 | link.append(template.substring(off, ind)); 51 | off = ind + pre.length(); 52 | int ending = template.indexOf(suf, off); 53 | if (ending == -1) { 54 | link.append(template.substring(off)); 55 | break; 56 | } else { 57 | String key = template.substring(off, ending); 58 | link.appendKey(key, this); 59 | off = ending + suf.length(); 60 | } 61 | } while (off < size); 62 | 63 | return new SimpleFormatTemplate(link); 64 | } 65 | 66 | @Override 67 | public void accept(StringBuilder builder, String s) { 68 | builder.append(pre).append(s).append(suf); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/Replacer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/Replacer.java 7 | */ 8 | 9 | /* 10 | * To change this license header, choose License Headers in Project Properties. 11 | * To change this template file, choose Tools | Templates 12 | * and open the template in the editor. 13 | */ 14 | package ute.internal.karlatemp.mxlib.formatter; 15 | 16 | import java.util.function.Function; 17 | 18 | /** 19 | * @author 32798 20 | */ 21 | public interface Replacer extends Function { 22 | 23 | boolean containsKey(String key); 24 | 25 | default boolean containsSlot(int slot) { 26 | return containsKey(String.valueOf(slot)); 27 | } 28 | 29 | boolean isEmpty(); 30 | 31 | @Override 32 | default String apply(String s) { 33 | if (!containsKey(s)) return null; 34 | StringBuilder sb = new StringBuilder(); 35 | apply(sb, s); 36 | return sb.toString(); 37 | } 38 | 39 | void apply(StringBuilder builder, String key); 40 | 41 | void apply(StringBuilder builder, int slot); 42 | 43 | default String getKey(String key) { 44 | return apply(key); 45 | } 46 | 47 | default String getSlot(int slot) { 48 | if (!containsSlot(slot)) return null; 49 | StringBuilder sb = new StringBuilder(); 50 | apply(sb, slot); 51 | return sb.toString(); 52 | } 53 | 54 | default Object magicValue() { 55 | return null; 56 | } 57 | 58 | Replacer EMPTY = new Replacer() { 59 | @Override 60 | public boolean containsKey(String key) { 61 | return false; 62 | } 63 | 64 | @Override 65 | public boolean containsSlot(int slot) { 66 | return false; 67 | } 68 | 69 | @Override 70 | public String getSlot(int slot) { 71 | return null; 72 | } 73 | 74 | @Override 75 | public boolean isEmpty() { 76 | return false; 77 | } 78 | 79 | @Override 80 | public String apply(String s) { 81 | return null; 82 | } 83 | 84 | @Override 85 | public void apply(StringBuilder builder, String key) { 86 | } 87 | 88 | @Override 89 | public void apply(StringBuilder builder, int key) { 90 | } 91 | 92 | @Override 93 | public String getKey(String key) { 94 | return null; 95 | } 96 | }; 97 | } 98 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/karlatemp/mxlib/formatter/SimpleFormatTemplate.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright (c) 2018-2020 Karlatemp. All rights reserved. 3 | * @author Karlatemp 4 | * @create 2020/03/09 22:32:11 5 | * 6 | * UntilTheEnd/UntilTheEnd/SimpleFormatTemplate.java 7 | */ 8 | 9 | package ute.internal.karlatemp.mxlib.formatter; 10 | 11 | import org.jetbrains.annotations.NotNull; 12 | 13 | import java.util.Locale; 14 | 15 | public class SimpleFormatTemplate implements FormatTemplate { 16 | private final FormatAction action; 17 | 18 | public SimpleFormatTemplate(FormatAction action) { 19 | this.action = action; 20 | } 21 | 22 | @Override 23 | public String format(Locale locale, @NotNull Replacer replacer) { 24 | return action.get(locale, replacer); 25 | } 26 | 27 | public FormatAction getAction() { 28 | return action; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/NameBin.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | import java.io.File; 6 | 7 | /** 8 | * Create at 2020/3/8 0:28 9 | * Copyright Karlatemp 10 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 11 | */ 12 | public class NameBin extends BinStore { 13 | @Override 14 | protected File openFile(File playerData, OfflinePlayer player) { 15 | return new File(playerData, player.getName() + ".bin"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/PlayerDataLoaderImpl.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import ute.UntilTheEnd; 4 | import ute.api.spi.PlayerDataLoader; 5 | 6 | /** 7 | * Create at 2020/3/8 0:07 8 | * Copyright Karlatemp 9 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 10 | */ 11 | public class PlayerDataLoaderImpl { 12 | public static PlayerDataLoader loader; 13 | 14 | static { 15 | switch (UntilTheEnd.getInstance().getConfig().getString("saving", "name")) { 16 | case "nameV2": 17 | loader = new PlayerNameYmlV2(); 18 | break; 19 | case "uuid": 20 | loader = new PlayerUUIDYml(); 21 | break; 22 | case "uuid-bin": 23 | loader = new UUIDBin(); 24 | break; 25 | case "name-bin": 26 | loader = new NameBin(); 27 | break; 28 | case "name": 29 | default: 30 | loader = new PlayerNameYml(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/PlayerNameYml.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import ute.api.spi.PlayerDataLoader; 4 | import org.bukkit.OfflinePlayer; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | /** 12 | * Create at 2020/3/8 0:08 13 | * Copyright Karlatemp 14 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 15 | */ 16 | public class PlayerNameYml implements PlayerDataLoader { 17 | @Override 18 | public Map load(File playerdata, OfflinePlayer player) { 19 | File file = new File(playerdata, player.getName() + ".yml"); 20 | if (!file.isFile()) return null; 21 | final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(file); 22 | return configuration.getConfigurationSection(player.getName()).getValues(false); 23 | } 24 | 25 | @Override 26 | public void save(File playerdata, OfflinePlayer player, Map data) throws IOException { 27 | File file = new File(playerdata, player.getName() + ".yml"); 28 | final YamlConfiguration configuration = new YamlConfiguration(); 29 | configuration.set(player.getName(), data); 30 | configuration.save(file); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/PlayerNameYmlV2.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import ute.api.spi.PlayerDataLoader; 4 | import org.bukkit.OfflinePlayer; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | /** 12 | * Create at 2020/3/8 0:08 13 | * Copyright Karlatemp 14 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 15 | */ 16 | public class PlayerNameYmlV2 implements PlayerDataLoader { 17 | @Override 18 | public Map load(File playerdata, OfflinePlayer player) { 19 | File file = new File(playerdata, player.getName() + ".yml"); 20 | if (!file.isFile()) return null; 21 | final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(file); 22 | return configuration.getValues(false); 23 | } 24 | 25 | @Override 26 | public void save(File playerdata, OfflinePlayer player, Map data) throws IOException { 27 | File file = new File(playerdata, player.getName() + ".yml"); 28 | final YamlConfiguration configuration = new YamlConfiguration(); 29 | for (Map.Entry entry : data.entrySet()) { 30 | configuration.set(entry.getKey(), entry.getValue()); 31 | } 32 | configuration.save(file); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/PlayerUUIDYml.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import ute.api.spi.PlayerDataLoader; 4 | import org.bukkit.OfflinePlayer; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.io.File; 8 | import java.io.IOException; 9 | import java.util.Map; 10 | 11 | /** 12 | * Create at 2020/3/8 0:08 13 | * Copyright Karlatemp 14 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 15 | */ 16 | public class PlayerUUIDYml implements PlayerDataLoader { 17 | @Override 18 | public Map load(File playerdata, OfflinePlayer player) { 19 | File file = new File(playerdata, player.getUniqueId() + ".yml"); 20 | if (!file.isFile()) return null; 21 | final YamlConfiguration configuration = YamlConfiguration.loadConfiguration(file); 22 | return configuration.getValues(false); 23 | } 24 | 25 | @Override 26 | public void save(File playerdata, OfflinePlayer player, Map data) throws IOException { 27 | File file = new File(playerdata, player.getUniqueId() + ".yml"); 28 | final YamlConfiguration configuration = new YamlConfiguration(); 29 | for (Map.Entry entry : data.entrySet()) { 30 | configuration.set(entry.getKey(), entry.getValue()); 31 | } 32 | configuration.save(file); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/ute/internal/pdl/UUIDBin.java: -------------------------------------------------------------------------------- 1 | package ute.internal.pdl; 2 | 3 | import org.bukkit.OfflinePlayer; 4 | 5 | import java.io.File; 6 | 7 | /** 8 | * Create at 2020/3/8 0:28 9 | * Copyright Karlatemp 10 | * UntilTheEnd $ HamsterYDS.UntilTheEnd.internal.pdl 11 | */ 12 | public class UUIDBin extends BinStore { 13 | @Override 14 | protected File openFile(File playerData, OfflinePlayer player) { 15 | return new File(playerData, player.getUniqueId() + ".bin"); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/item/ItemProvider.java: -------------------------------------------------------------------------------- 1 | package ute.item; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.configuration.file.YamlConfiguration; 5 | import org.bukkit.entity.EntityType; 6 | import ute.Logging; 7 | import ute.internal.UTEi18n; 8 | 9 | import java.io.File; 10 | import java.util.HashMap; 11 | import java.util.List; 12 | import java.util.logging.Level; 13 | 14 | public class ItemProvider { 15 | public static HashMap> entityDrops = new HashMap>(); 16 | public static HashMap> blockDrops = new HashMap>(); 17 | public static YamlConfiguration yaml; 18 | 19 | public static void loadDrops() { 20 | File file = new File(ItemManager.plugin.getDataFolder(), "drops.yml"); 21 | if (!file.exists()) 22 | ItemManager.plugin.saveResource("drops.yml", true); 23 | yaml = YamlConfiguration.loadConfiguration(file); 24 | 25 | for (String path : yaml.getKeys(false)) { 26 | List items = yaml.getStringList(path + ".dropitems"); 27 | List percents = yaml.getDoubleList(path + ".percents"); 28 | HashMap drop = new HashMap(); 29 | for (int index = 0; index < items.size(); index++) { 30 | drop.put(items.get(index), percents.get(index)); 31 | //方块也输出“生物” TODO 32 | Logging.getLogger().log(Level.INFO, 33 | UTEi18n.parse("item.provider.drops.rule", path, String.valueOf(items.get(index)), String.valueOf(percents.get(index))) 34 | ); 35 | } 36 | try { 37 | entityDrops.put(EntityType.valueOf(path), drop); 38 | } catch (Exception exception) { 39 | try { 40 | blockDrops.put(Material.valueOf(path), drop); 41 | } catch (Exception exception2) { 42 | Logging.getLogger().log(Level.SEVERE, "Failed to load drops [" + path + "] from drops.yml", exception); 43 | } 44 | } 45 | } 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/ute/item/UTEItemStack.java: -------------------------------------------------------------------------------- 1 | package ute.item; 2 | 3 | import ute.api.GuideApi; 4 | import ute.guide.craft.CraftGuide; 5 | import org.bukkit.inventory.Inventory; 6 | import org.bukkit.inventory.ItemStack; 7 | 8 | import java.util.HashMap; 9 | import java.util.List; 10 | 11 | public class UTEItemStack { 12 | private static int[] slots = new int[]{24, 23, 25, 15, 14, 16, 33, 32, 34}; 13 | public boolean canPlace; 14 | public boolean isConsume; 15 | public String id; 16 | public String displayName; 17 | public int needLevel; 18 | public ItemStack item; 19 | public List lores; 20 | public HashMap craft; 21 | 22 | public UTEItemStack(boolean canPlace, boolean isConsume, String id, String displayName, int needLevel, 23 | ItemStack item, List lores) { 24 | this.canPlace = canPlace; 25 | this.isConsume = isConsume; 26 | this.id = id; 27 | this.displayName = displayName; 28 | this.needLevel = needLevel; 29 | this.item = item; 30 | this.lores = lores; 31 | } 32 | 33 | public void registerRecipe(HashMap craft, String category) { 34 | Inventory guideInv = CraftGuide.get_simple_craft_guide(this.displayName.replace("§6", "§8")); 35 | guideInv.setItem(19, this.item); 36 | switch(this.needLevel){ 37 | case 0: 38 | break; 39 | case 1: 40 | guideInv.setItem(21, ItemManager.items.get("ScienceMachine").item); 41 | break; 42 | case 2: 43 | guideInv.setItem(21, ItemManager.items.get("AlchemyEngine").item); 44 | break; 45 | case 3: 46 | guideInv.setItem(21, ItemManager.items.get("Prestihatitator").item); 47 | break; 48 | } 49 | int index = 0; 50 | for (ItemStack material : craft.keySet()) { 51 | int amount = craft.get(material); 52 | craft.put(material, amount); 53 | ItemStack materialClone = material.clone(); 54 | materialClone.setAmount(amount); 55 | guideInv.setItem(slots[index], materialClone); 56 | index++; 57 | } 58 | this.craft = craft; 59 | GuideApi.add_guide_to_item(this.item, guideInv); 60 | GuideApi.add_item_to_category(GuideApi.AvaliableCategories.valueOf(category), this.item); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /src/main/java/ute/item/basics/Ashes.java: -------------------------------------------------------------------------------- 1 | package ute.item.basics; 2 | 3 | import ute.Config; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.block.BlockBurnEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class Ashes implements Listener { 11 | public static double percent = ItemManager.itemAttributes.getDouble("Ashes.percent"); 12 | 13 | public Ashes() { 14 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 15 | } 16 | 17 | @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) 18 | public void onBurn(BlockBurnEvent event) { 19 | if (event.isCancelled()) 20 | return; 21 | if (!Config.enableWorlds.contains(event.getBlock().getWorld())) return; 22 | if (Math.random() <= percent) { 23 | event.getBlock().getWorld().dropItem(event.getBlock().getLocation(), ItemManager.items.get("Ashes").item); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ute/item/basics/SpiderGland.java: -------------------------------------------------------------------------------- 1 | package ute.item.basics; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.event.player.CustomItemInteractEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class SpiderGland implements Listener { 11 | public static double heal = ItemManager.itemAttributes.getDouble("SpiderGland.heal"); 12 | 13 | public SpiderGland() { 14 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 15 | } 16 | 17 | @EventHandler(priority = EventPriority.NORMAL) 18 | public void onInteract(CustomItemInteractEvent event) { 19 | Player player=event.getWho(); 20 | if (event.getUteItem().id.equalsIgnoreCase("SpiderGland")) { 21 | event.setCancelled(true); 22 | if (player.getHealth() + heal >= player.getMaxHealth()) 23 | player.setHealth(player.getMaxHealth()); 24 | else 25 | player.setHealth(player.getHealth() + heal); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/BushesHat.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.entity.EntityTargetEvent; 9 | import org.bukkit.event.entity.EntityTargetEvent.TargetReason; 10 | import org.bukkit.inventory.ItemStack; 11 | import ute.Config; 12 | import ute.item.ItemManager; 13 | 14 | public class BushesHat implements Listener { 15 | public BushesHat() { 16 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 17 | } 18 | 19 | @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) 20 | public void onTarget(EntityTargetEvent event) { 21 | if (!Config.enableWorlds.contains(event.getEntity().getWorld())) return; 22 | if (event.getTarget() instanceof Player) { 23 | Player player = (Player) event.getTarget(); 24 | ItemStack item = player.getInventory().getHelmet(); 25 | if (ItemManager.isSimilar(item, getClass())){ 26 | 27 | if (item.getDurability() >= item.getType().getMaxDurability()) 28 | item.setType(Material.AIR); 29 | if (Math.random() <= 0.03) 30 | item.setDurability((short) (item.getDurability() + 1)); 31 | 32 | if (event.getReason() == TargetReason.CLOSEST_PLAYER) 33 | event.setCancelled(true); 34 | } 35 | ItemStack[] clothes = ClothesContainer.getInventory(player).getStorageContents(); 36 | for (ItemStack cloth : clothes) 37 | if (ItemManager.isSimilar(cloth, getClass())) { 38 | 39 | if (cloth.getDurability() >= cloth.getType().getMaxDurability()) 40 | cloth.setType(Material.AIR); 41 | if (Math.random() <= 0.03) 42 | cloth.setDurability((short) (cloth.getDurability() + 1)); 43 | 44 | if (event.getReason() == TargetReason.CLOSEST_PLAYER) 45 | event.setCancelled(true); 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/ConstantTemperatureClothes.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import ute.cap.tem.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class ConstantTemperatureClothes { 7 | public ConstantTemperatureClothes() { 8 | ChangeTasks.clothesChangeTemperature.put(ItemManager.items.get("ConstantTemperatureClothes").displayName, 2.0); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/Earmuff.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import ute.cap.tem.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class Earmuff { 7 | public static double percent = ItemManager.itemAttributes.getDouble("Earmuff.percent"); 8 | 9 | public Earmuff() { 10 | ChangeTasks.clothesChangeTemperature.put(ItemManager.items.get("Earmuff").displayName, -percent); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/Garland.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import ute.cap.san.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class Garland { 7 | public static int sanityImprove = ItemManager.itemAttributes.getInt("Garland.sanityImprove"); 8 | 9 | public Garland() { 10 | ChangeTasks.clothesChangeSanity.put(ItemManager.items.get("Garland").displayName, sanityImprove); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/StrawHat.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import ute.cap.tem.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class StrawHat { 7 | public static double percent = ItemManager.itemAttributes.getDouble("StrawHat.percent"); 8 | 9 | public StrawHat() { 10 | ChangeTasks.clothesChangeTemperature.put(ItemManager.items.get("StrawHat").displayName, percent); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/item/clothes/SwimmingSuit.java: -------------------------------------------------------------------------------- 1 | package ute.item.clothes; 2 | 3 | import ute.cap.hum.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class SwimmingSuit { 7 | public SwimmingSuit() { 8 | ChangeTasks.waterProofSuits.add(ItemManager.items.get("SwimmingSuit").displayName); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/combat/BlowArrow1.java: -------------------------------------------------------------------------------- 1 | package ute.item.combat; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.inventory.ItemStack; 9 | import ute.api.event.player.CustomItemInteractEvent; 10 | import ute.internal.ArrowManager; 11 | import ute.item.ItemManager; 12 | 13 | public class BlowArrow1 implements Listener { 14 | public static double damage = ItemManager.itemAttributes.getDouble("BlowArrow1.damage"); 15 | public static double range = ItemManager.itemAttributes.getDouble("BlowArrow1.range"); 16 | public static int maxDist = ItemManager.itemAttributes.getInt("BlowArrow1.maxDist"); 17 | 18 | public BlowArrow1() { 19 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 20 | } 21 | 22 | @EventHandler(priority = EventPriority.NORMAL) 23 | public void onInteract(CustomItemInteractEvent event) { 24 | Player player=event.getWho(); 25 | if (event.getUteItem().id.equalsIgnoreCase("BlowArrow1")) { 26 | event.setCancelled(true); 27 | ArrowManager.startFire(e -> e.damage(damage), null, new ItemStack(Material.IRON_SWORD), 28 | player.getLocation().add(0, 1, 0), maxDist, ItemManager.plugin.getConfig().getInt("item.blowarrow.autoclear"), 29 | player, range); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/ute/item/combat/BlowArrow2.java: -------------------------------------------------------------------------------- 1 | package ute.item.combat; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.inventory.ItemStack; 9 | import ute.api.event.player.CustomItemInteractEvent; 10 | import ute.internal.ArrowManager; 11 | import ute.item.ItemManager; 12 | 13 | public class BlowArrow2 implements Listener { 14 | public static double damage = ItemManager.itemAttributes.getDouble("BlowArrow2.damage"); 15 | public static double range = ItemManager.itemAttributes.getDouble("BlowArrow2.range"); 16 | public static int maxDist = ItemManager.itemAttributes.getInt("BlowArrow2.maxDist"); 17 | public static int firePeriod = ItemManager.itemAttributes.getInt("BlowArrow2.firePeriod"); 18 | 19 | public BlowArrow2() { 20 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 21 | } 22 | 23 | @EventHandler(priority = EventPriority.NORMAL) 24 | public void onInteract(CustomItemInteractEvent event) { 25 | Player player=event.getWho(); 26 | if (event.getUteItem().id.equalsIgnoreCase("BlowArrow2")) { 27 | event.setCancelled(true); 28 | ArrowManager.startFire(e -> { 29 | e.damage(damage); 30 | e.setFireTicks(firePeriod * 20); 31 | }, null, new ItemStack(Material.GOLD_SWORD), 32 | player.getLocation().add(0, 1, 0), 33 | maxDist, 34 | ItemManager.plugin.getConfig().getInt("item.blowarrow.autoclear"), 35 | player, range); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ute/item/combat/BlowArrow3.java: -------------------------------------------------------------------------------- 1 | package ute.item.combat; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.inventory.ItemStack; 9 | import org.bukkit.potion.PotionEffect; 10 | import org.bukkit.potion.PotionEffectType; 11 | import ute.api.event.player.CustomItemInteractEvent; 12 | import ute.internal.ArrowManager; 13 | import ute.item.ItemManager; 14 | 15 | public class BlowArrow3 implements Listener { 16 | public static double damage = ItemManager.itemAttributes.getDouble("BlowArrow3.damage"); 17 | public static double range = ItemManager.itemAttributes.getDouble("BlowArrow3.range"); 18 | public static int maxDist = ItemManager.itemAttributes.getInt("BlowArrow3.maxDist"); 19 | public static int blindPeriod = ItemManager.itemAttributes.getInt("BlowArrow3.blindPeriod"); 20 | 21 | public BlowArrow3() { 22 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 23 | } 24 | 25 | @EventHandler(priority = EventPriority.NORMAL) 26 | public void onInteract(CustomItemInteractEvent event) { 27 | Player player=event.getWho(); 28 | if (event.getUteItem().id.equalsIgnoreCase("BlowArrow3")) { 29 | event.setCancelled(true); 30 | ArrowManager.startFire(le -> { 31 | le.damage(damage); 32 | le.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, blindPeriod * 20, 0)); 33 | le.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, blindPeriod * 20, 0)); 34 | }, null, new ItemStack(Material.STONE_SWORD), 35 | player.getLocation().add(0, 1, 0), 36 | maxDist, 37 | ItemManager.plugin.getConfig().getInt("item.blowarrow.autoclear"), 38 | player, range); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/ute/item/magic/ChilledAmulet.java: -------------------------------------------------------------------------------- 1 | package ute.item.magic; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.World; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.inventory.ItemStack; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | import ute.Config; 10 | import ute.UntilTheEnd; 11 | import ute.api.PlayerApi; 12 | import ute.cap.san.ChangeTasks; 13 | import ute.api.event.cap.TemperatureChangeEvent; 14 | import ute.internal.NPCChecker; 15 | import ute.item.ItemManager; 16 | import ute.item.clothes.ClothesContainer; 17 | 18 | public class ChilledAmulet implements Listener { 19 | public static int sanityImprove = ItemManager.itemAttributes.getInt("ChilledAmulet.sanityImprove"); 20 | 21 | public ChilledAmulet() { 22 | ChangeTasks.clothesChangeSanity.put(ItemManager.items.get("ChilledAmulet").displayName, sanityImprove); 23 | UntilTheEnd.getInstance().getServer().getPluginManager().registerEvents(this, UntilTheEnd.getInstance()); 24 | new BukkitRunnable() { 25 | @Override 26 | public void run() { 27 | for (World world : Config.enableWorlds) 28 | for (Player player : world.getPlayers()) { 29 | if (NPCChecker.isNPC(player)) continue; 30 | ItemStack[] clothes = ClothesContainer.getInventory(player).getStorageContents(); 31 | for (ItemStack cloth : clothes) { 32 | if (ItemManager.isSimilar(cloth, ItemManager.items.get("ChilledAmulet").item)) { 33 | if (cloth.getDurability() >= cloth.getType().getMaxDurability()) 34 | cloth.setType(Material.AIR); 35 | PlayerApi.TemperatureOperations.changeTemperature(player, TemperatureChangeEvent.ChangeCause.CLOTHES,-1); 36 | if (Math.random() <= 0.3) 37 | cloth.setDurability((short) (cloth.getDurability() + 1)); 38 | } 39 | } 40 | } 41 | } 42 | 43 | }.runTaskTimer(UntilTheEnd.getInstance(), 0L, 200L); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/ute/item/magic/Tracker.java: -------------------------------------------------------------------------------- 1 | package ute.item.magic; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.Material; 5 | import org.bukkit.entity.Arrow; 6 | import org.bukkit.entity.Entity; 7 | import org.bukkit.entity.LivingEntity; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.event.entity.EntityShootBowEvent; 12 | import org.bukkit.inventory.ItemStack; 13 | import org.bukkit.scheduler.BukkitRunnable; 14 | import org.bukkit.util.Vector; 15 | import ute.UntilTheEnd; 16 | import ute.item.ItemManager; 17 | 18 | public class Tracker implements Listener { 19 | 20 | public Tracker() { 21 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 22 | } 23 | 24 | @EventHandler 25 | public void onShoot(EntityShootBowEvent event){ 26 | if(event.getEntity() instanceof Player){ 27 | Player player= (Player) event.getEntity(); 28 | Arrow arrow= (Arrow) event.getProjectile(); 29 | ItemStack item=event.getBow(); 30 | if(ItemManager.isSimilar(item,getClass())){ 31 | new BukkitRunnable(){ 32 | int counter=0; 33 | @Override 34 | public void run() { 35 | counter++; 36 | if (counter >= 1200 || arrow.getLocation().getBlock().getType() != Material.AIR){ 37 | cancel(); 38 | return; 39 | } 40 | if(counter%5==0) { 41 | Location loc = arrow.getLocation(); 42 | Entity target=null; 43 | double minn=1e9; 44 | for (Entity entity : arrow.getNearbyEntities(5, 5, 5)) { 45 | if (entity.getUniqueId().equals(player.getUniqueId())) continue; 46 | if (!(entity instanceof LivingEntity)) continue; 47 | if(entity.getLocation().distance(arrow.getLocation())<=minn){ 48 | minn=entity.getLocation().distance(arrow.getLocation()); 49 | target=entity; 50 | } 51 | } 52 | if(target==null) return; 53 | Location entityLoc = target.getLocation().add(0,0.5,0); 54 | Vector perfectDirection = loc.clone().subtract(entityLoc).toVector(); 55 | perfectDirection.normalize(); 56 | perfectDirection.multiply(-1); 57 | arrow.setVelocity(perfectDirection.multiply(0.5)); 58 | return; 59 | } 60 | } 61 | }.runTaskTimer(UntilTheEnd.getInstance(),0L,1L); 62 | } 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /src/main/java/ute/item/materials/Fern.java: -------------------------------------------------------------------------------- 1 | package ute.item.materials; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.event.player.CustomItemInteractEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class Fern implements Listener { 11 | public static double heal = ItemManager.itemAttributes.getDouble("Fern.heal"); 12 | 13 | public Fern() { 14 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 15 | } 16 | 17 | @EventHandler(priority = EventPriority.NORMAL) 18 | public void onInteract(CustomItemInteractEvent event) { 19 | Player player=event.getWho(); 20 | if (event.getUteItem().id.equalsIgnoreCase("Fern")) { 21 | event.setCancelled(true); 22 | if (player.getHealth() + heal >= player.getMaxHealth()) player.setHealth(player.getMaxHealth()); 23 | else player.setHealth(player.getHealth() + heal); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/ute/item/materials/Hail.java: -------------------------------------------------------------------------------- 1 | package ute.item.materials; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.PlayerApi; 8 | import ute.api.event.cap.TemperatureChangeEvent; 9 | import ute.api.event.player.CustomItemInteractEvent; 10 | import ute.item.ItemManager; 11 | 12 | public class Hail implements Listener { 13 | public static int temperatureReduce = ItemManager.itemAttributes.getInt("Hail.temperatureReduce"); 14 | 15 | public Hail() { 16 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 17 | } 18 | 19 | @EventHandler(priority = EventPriority.NORMAL) 20 | public void onInteract(CustomItemInteractEvent event) { 21 | Player player=event.getWho(); 22 | if (event.getUteItem().id.equalsIgnoreCase("Hail")) { 23 | event.setCancelled(true); 24 | PlayerApi.TemperatureOperations.changeTemperature(player, TemperatureChangeEvent.ChangeCause.ITEMS,temperatureReduce); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ute/item/materials/NightMare.java: -------------------------------------------------------------------------------- 1 | package ute.item.materials; 2 | 3 | import ute.cap.san.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class NightMare { 7 | public static int sanityReduce = ItemManager.itemAttributes.getInt("NightMare.sanityReduce"); 8 | 9 | public NightMare() { 10 | ChangeTasks.itemsChangeSanity.put(ItemManager.items.get("NightMare").displayName, sanityReduce); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/BluePrint.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.Particle; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.player.PlayerInteractEvent; 9 | import org.bukkit.inventory.ItemStack; 10 | 11 | import ute.item.ItemManager; 12 | import ute.player.PlayerManager; 13 | 14 | public class BluePrint implements Listener { 15 | public BluePrint() { 16 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 17 | } 18 | 19 | @EventHandler 20 | public void onRight(PlayerInteractEvent event) { 21 | Player player=event.getPlayer(); 22 | ItemStack item=player.getInventory().getItemInMainHand(); 23 | if(item==null) return; 24 | if(item.hasItemMeta()) 25 | if(item.getItemMeta().hasDisplayName()) 26 | if(item.getItemMeta().getDisplayName().contains(ItemManager.items.get("BluePrint").displayName)) { 27 | String name=item.getItemMeta().getDisplayName(); 28 | String recipeName=name.replace(ItemManager.items.get("BluePrint").displayName,""); 29 | String id=ItemManager.ids.get(recipeName); 30 | if(PlayerManager.checkUnLockedRecipes(player).contains(id)) 31 | event.setCancelled(true); 32 | else{ 33 | PlayerManager.addUnLockedRecipes(player,id); 34 | Location location=player.getLocation(); 35 | for (double i = 0; i < 180; i += 180 / 6) { 36 | double radians = Math.toRadians(i)*2; 37 | double radius = Math.sin(radians); 38 | double y = Math.cos(radians); 39 | for (double j = 0; j < 360; j += 180 / 6) { 40 | double radiansCircle = Math.toRadians(j); 41 | double x = Math.cos(radiansCircle) * radius; 42 | double z = Math.sin(radiansCircle) * radius; 43 | location.add(x, y, z); 44 | location.getWorld().spawnParticle(Particle.VILLAGER_HAPPY, location, 1); 45 | location.subtract(x, y, z); 46 | } 47 | } 48 | } 49 | item.setAmount(item.getAmount()-1); 50 | player.getInventory().setItemInMainHand(item); 51 | } 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/ColdFire.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Bukkit; 4 | import org.bukkit.Location; 5 | import org.bukkit.Material; 6 | import org.bukkit.Particle; 7 | import org.bukkit.block.BlockFace; 8 | import org.bukkit.entity.Player; 9 | import org.bukkit.event.EventHandler; 10 | import org.bukkit.event.EventPriority; 11 | import org.bukkit.event.Listener; 12 | import org.bukkit.scheduler.BukkitRunnable; 13 | import ute.UntilTheEnd; 14 | import ute.cap.tem.TemperatureProvider; 15 | import ute.api.event.block.CustomBlockPlaceEvent; 16 | import ute.api.event.player.CustomItemInteractEvent; 17 | import ute.item.ItemManager; 18 | 19 | public class ColdFire implements Listener { 20 | public ColdFire() { 21 | TemperatureProvider.uteBlockTemperatures.put("ColdFire", 0); 22 | Bukkit.getPluginManager().registerEvents(this, UntilTheEnd.getInstance()); 23 | } 24 | 25 | @EventHandler 26 | public void onPlace(CustomBlockPlaceEvent event) { 27 | if (event.getItem().id.equalsIgnoreCase("ColdFire")) { 28 | new BukkitRunnable() { 29 | int counter = 0; 30 | 31 | @Override 32 | public void run() { 33 | if (counter >= 90) { 34 | event.getBlock().getWorld().dropItemNaturally(event.getBlock().getLocation(), 35 | ItemManager.items.get("Ashes").item.clone()); 36 | event.getBlock().setType(Material.AIR); 37 | cancel(); 38 | } 39 | counter++; 40 | event.getBlock().getWorld().spawnParticle(Particle.CRIT_MAGIC, 41 | event.getBlock().getLocation().add(0.5, 0.5, 0.5), 3); 42 | } 43 | }.runTaskTimer(UntilTheEnd.getInstance(), 0L, 20L); 44 | } 45 | } 46 | 47 | @EventHandler(priority = EventPriority.NORMAL) 48 | public void onInteract(CustomItemInteractEvent event) { 49 | Player player=event.getWho(); 50 | if (event.getUteItem().id.equalsIgnoreCase("ColdFire")) { 51 | event.setCancelled(true); 52 | BlockFace face = event.getClickedFace(); 53 | Location loc = new Location(event.getClickedBlock().getWorld(), face.getModX(), face.getModY(), 54 | face.getModZ()); 55 | if (loc.getBlock().getType() == Material.AIR) { 56 | loc.getBlock().setType(Material.FIRE); 57 | } 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/CombinedTools.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Material; 4 | import org.bukkit.block.Block; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.EventPriority; 8 | import org.bukkit.event.Listener; 9 | import org.bukkit.inventory.ItemStack; 10 | import ute.api.event.player.CustomItemInteractEvent; 11 | import ute.item.ItemManager; 12 | 13 | public class CombinedTools implements Listener { 14 | public CombinedTools() { 15 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 16 | } 17 | 18 | @EventHandler(priority = EventPriority.NORMAL) 19 | public void onInteract(CustomItemInteractEvent event) { 20 | Player player=event.getWho(); 21 | if (event.getUteItem().id.equalsIgnoreCase("CombinedTools")) { 22 | ItemStack item=event.getItem(); 23 | if (event.getClickedBlock()!=null) { 24 | Block block = event.getClickedBlock(); 25 | if (block.getType().toString().contains("GRASS") 26 | || block.getType().toString().contains("DIRT") 27 | || block.getType().toString().contains("SAND") 28 | || block.getType().toString().contains("GRAVEL") 29 | || block.getType().toString().contains("CLAY")) { 30 | item.setType(Material.DIAMOND_SPADE); 31 | return; 32 | } 33 | if (block.getType().toString().contains("PLANK") 34 | || block.getType().toString().contains("LOG")) { 35 | item.setType(Material.DIAMOND_AXE); 36 | return; 37 | } 38 | item.setType(Material.DIAMOND_PICKAXE); 39 | return; 40 | } 41 | item.setType(Material.DIAMOND_SWORD); 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/Hygrometer.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.block.Block; 5 | import org.bukkit.entity.ArmorStand; 6 | import org.bukkit.entity.EntityType; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | import ute.Config; 13 | import ute.api.BlockApi; 14 | import ute.api.event.block.CustomBlockInteractEvent; 15 | import ute.internal.UTEi18n; 16 | import ute.item.ItemManager; 17 | 18 | import java.util.ArrayList; 19 | 20 | public class Hygrometer implements Listener { 21 | public static int existPeriod = ItemManager.itemAttributes.getInt("Hygrometer.existPeriod"); 22 | 23 | public Hygrometer() { 24 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 25 | } 26 | 27 | ArrayList clicked = new ArrayList(); 28 | 29 | @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) 30 | public void onClick(CustomBlockInteractEvent event) { 31 | Player player = event.getWho(); 32 | if (!Config.enableWorlds.contains(player.getWorld())) return; 33 | Block block = event.getClickedBlock(); 34 | Location loc = block.getLocation(); 35 | String toString = BlockApi.locToStr(loc); 36 | if (event.getCustomItem().id.equalsIgnoreCase("Hygrometer")) { 37 | if (clicked.contains(toString)) return; 38 | clicked.add(toString); 39 | String text = UTEi18n.parse("item.hygrometer.main.main", (loc.getWorld().hasStorm() 40 | ? UTEi18n.cache("item.hygrometer.main.rain") : UTEi18n.cache("item.hygrometer.main.sun")) 41 | ); 42 | String text2 = UTEi18n.parse("item.hygrometer.sub.text", String.valueOf(loc.getWorld().getWeatherDuration() / 20)); 43 | ArmorStand armor = (ArmorStand) player.getWorld().spawnEntity(loc.clone().add(0.5, 0.5, 0.5), EntityType.ARMOR_STAND); 44 | armor.setVisible(false); 45 | armor.setSmall(true); 46 | armor.setGravity(false); 47 | armor.setCustomName(text); 48 | armor.setCustomNameVisible(true); 49 | ArmorStand armor2 = (ArmorStand) player.getWorld().spawnEntity(loc.clone().add(0.5, 0.15, 0.5), EntityType.ARMOR_STAND); 50 | armor2.setVisible(false); 51 | armor2.setSmall(true); 52 | armor2.setGravity(false); 53 | armor2.setCustomName(text2); 54 | armor2.setCustomNameVisible(true); 55 | new BukkitRunnable() { 56 | @Override 57 | public void run() { 58 | armor.remove(); 59 | armor2.remove(); 60 | clicked.remove(toString); 61 | cancel(); 62 | } 63 | }.runTaskTimer(ItemManager.plugin, existPeriod * 20, 1); 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/IceFlingomatic.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.Particle; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.Listener; 7 | import org.bukkit.event.block.BlockIgniteEvent; 8 | import org.bukkit.util.Vector; 9 | import ute.Config; 10 | import ute.api.BlockApi; 11 | import ute.item.ItemManager; 12 | 13 | public class IceFlingomatic implements Listener { 14 | public static int range = ItemManager.itemAttributes.getInt("IceFlingomatic.range"); 15 | 16 | public IceFlingomatic() { 17 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 18 | } 19 | 20 | @EventHandler 21 | public void onBurn(BlockIgniteEvent event) { 22 | if (event.getBlock() == null) return; 23 | if (!Config.enableWorlds.contains(event.getBlock().getWorld())) return; 24 | Location igniteLoc = event.getBlock().getLocation(); 25 | for (String str : BlockApi.getSpecialBlocks("IceFlingomatic")) { 26 | Location loc = BlockApi.strToLoc(str); 27 | if (loc.distance(igniteLoc) <= range) { 28 | buildLine(loc,igniteLoc); 29 | event.setCancelled(true); 30 | } 31 | } 32 | } 33 | 34 | public static void buildLine(Location locA, Location locB) { 35 | Vector vectorAB = locB.clone().subtract(locA).toVector(); 36 | double vectorLength = vectorAB.length(); 37 | vectorAB.normalize(); 38 | for (double i = 0; i < vectorLength; i += 0.1) { 39 | Vector vector = vectorAB.clone().multiply(i); 40 | locA.add(vector); 41 | locA.getWorld().spawnParticle(Particle.SNOWBALL, locA.clone().add(0.5, 1.0, 0.5), 1); 42 | locA.subtract(vector); 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/LightningArrester.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import ute.Config; 4 | import org.bukkit.Location; 5 | import org.bukkit.Particle; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.weather.LightningStrikeEvent; 9 | import ute.api.BlockApi; 10 | import ute.item.ItemManager; 11 | 12 | public class LightningArrester implements Listener { 13 | public LightningArrester() { 14 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 15 | } 16 | 17 | @EventHandler 18 | public void onLight(LightningStrikeEvent event) { 19 | Location loc = event.getLightning().getLocation(); 20 | if (!Config.enableWorlds.contains(loc.getWorld())) return; 21 | for (String str : BlockApi.getSpecialBlocks("LightningArrester")) { 22 | Location loc2 = BlockApi.strToLoc(str); 23 | if(!loc2.getWorld().getName().equalsIgnoreCase(loc.getWorld().getName())) 24 | continue; 25 | if (loc.distance(loc2) <= 20) { 26 | event.setCancelled(true); 27 | loc.getWorld().strikeLightning(loc2.add(0.5, 0.5, 0.5)); 28 | loc2.getWorld().spawnParticle(Particle.CRIT, loc2.add(0.0, 0.5, 0.0), 10); 29 | loc2.getWorld().spawnParticle(Particle.TOTEM, loc2.add(0.0, 0.5, 0.0), 10); 30 | } 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/Refridgerator.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import ute.food.RottenFoodEvents; 4 | import ute.item.ItemManager; 5 | 6 | public class Refridgerator { 7 | public static int fridgeEffecience = ItemManager.itemAttributes.getInt("Refridgerator.fridgeEffecience"); 8 | 9 | public Refridgerator() { 10 | RottenFoodEvents.titleFactors.put(ItemManager.items.get("Refridgerator").displayName, fridgeEffecience); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/item/science/Thermometer.java: -------------------------------------------------------------------------------- 1 | package ute.item.science; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.block.Block; 5 | import org.bukkit.entity.ArmorStand; 6 | import org.bukkit.entity.EntityType; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.event.EventHandler; 9 | import org.bukkit.event.EventPriority; 10 | import org.bukkit.event.Listener; 11 | import org.bukkit.scheduler.BukkitRunnable; 12 | import ute.Config; 13 | import ute.api.BlockApi; 14 | import ute.cap.tem.TemperatureProvider; 15 | import ute.api.event.block.CustomBlockInteractEvent; 16 | import ute.item.ItemManager; 17 | 18 | import java.util.ArrayList; 19 | 20 | public class Thermometer implements Listener { 21 | public static int existPeriod = ItemManager.itemAttributes.getInt("Thermometer.existPeriod"); 22 | 23 | public Thermometer() { 24 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 25 | } 26 | 27 | ArrayList clicked = new ArrayList(); 28 | 29 | @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) 30 | public void onClick(CustomBlockInteractEvent event) { 31 | Player player = event.getWho(); 32 | if (!Config.enableWorlds.contains(player.getWorld())) return; 33 | Block block = event.getClickedBlock(); 34 | Location loc = block.getLocation(); 35 | String toString = BlockApi.locToStr(loc); 36 | if (event.getCustomItem().id.equalsIgnoreCase("Thermometer")) { 37 | if (clicked.contains(toString)) return; 38 | clicked.add(toString); 39 | int tem = (int) TemperatureProvider.getBlockTemperature(loc); 40 | String text = "§e§l温度§d§l" + tem + "§e§l°C"; 41 | ArmorStand armor = (ArmorStand) player.getWorld().spawnEntity(loc.clone().add(0.5, 0.5, 0.5), EntityType.ARMOR_STAND); 42 | armor.setVisible(false); 43 | armor.setSmall(true); 44 | armor.setGravity(false); 45 | armor.setCustomName(text); 46 | armor.setCustomNameVisible(true); 47 | new BukkitRunnable() { 48 | @Override 49 | public void run() { 50 | armor.remove(); 51 | clicked.remove(toString); 52 | cancel(); 53 | } 54 | }.runTaskTimer(ItemManager.plugin, existPeriod * 20, 1); 55 | } 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/ACDDrug.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.event.player.CustomItemInteractEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class ACDDrug implements Listener { 11 | public ACDDrug() { 12 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 13 | } 14 | 15 | @EventHandler(priority = EventPriority.NORMAL) 16 | public void onInteract(CustomItemInteractEvent event) { 17 | Player player=event.getWho(); 18 | if (event.getUteItem().id.equalsIgnoreCase("ACDDrug")) { 19 | event.setCancelled(true); 20 | player.setMaxHealth(player.getMaxHealth() + 6.0); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/FlowerUmbrella.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import ute.cap.hum.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class FlowerUmbrella { 7 | public FlowerUmbrella() { 8 | ChangeTasks.umbrellas.add(ItemManager.items.get("FlowerUmbrella").displayName); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/HealingSalve.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.event.player.CustomItemInteractEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class HealingSalve implements Listener { 11 | public HealingSalve() { 12 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 13 | } 14 | 15 | @EventHandler(priority = EventPriority.NORMAL) 16 | public void onInteract(CustomItemInteractEvent event) { 17 | Player player=event.getWho(); 18 | if (event.getUteItem().id.equalsIgnoreCase("HealingSalve")) { 19 | event.setCancelled(true); 20 | if (player.getHealth() + 10.0 >= player.getMaxHealth()) player.setHealth(player.getMaxHealth()); 21 | else player.setHealth(player.getHealth() + 10.0); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/HoneyPoultice.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.entity.Player; 4 | import org.bukkit.event.EventHandler; 5 | import org.bukkit.event.EventPriority; 6 | import org.bukkit.event.Listener; 7 | import ute.api.event.player.CustomItemInteractEvent; 8 | import ute.item.ItemManager; 9 | 10 | public class HoneyPoultice implements Listener { 11 | public HoneyPoultice() { 12 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 13 | } 14 | 15 | @EventHandler(priority = EventPriority.NORMAL) 16 | public void onInteract(CustomItemInteractEvent event) { 17 | Player player=event.getWho(); 18 | if (event.getUteItem().id.equalsIgnoreCase("HoneyPoultice")) { 19 | event.setCancelled(true); 20 | if (player.getHealth() + 12.0 >= player.getMaxHealth()) player.setHealth(player.getMaxHealth()); 21 | else player.setHealth(player.getHealth() + 12.0); 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/LuxuryFan.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.entity.Entity; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import ute.api.PlayerApi; 9 | import ute.api.event.cap.TemperatureChangeEvent; 10 | import ute.api.event.player.CustomItemInteractEvent; 11 | import ute.item.ItemManager; 12 | import ute.player.PlayerManager; 13 | 14 | public class LuxuryFan implements Listener { 15 | public LuxuryFan() { 16 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 17 | } 18 | 19 | @EventHandler(priority = EventPriority.NORMAL) 20 | public void onInteract(CustomItemInteractEvent event) { 21 | Player player=event.getWho(); 22 | if (event.getUteItem().id.equalsIgnoreCase("LuxuryFan")) { 23 | event.setCancelled(true); 24 | if (PlayerManager.check(player, PlayerManager.CheckType.TEMPERATURE) >= 45) 25 | PlayerApi.TemperatureOperations.changeTemperature(player, TemperatureChangeEvent.ChangeCause.ITEMS,-30); 26 | else 27 | PlayerApi.TemperatureOperations.changeTemperature(player,TemperatureChangeEvent.ChangeCause.ITEMS,15- PlayerApi.TemperatureOperations.getTemperature(player)); 28 | for (Entity entity : player.getNearbyEntities(5.0, 5.0, 5.0)) { 29 | if (entity instanceof Player) { 30 | if (PlayerManager.check((Player) entity, PlayerManager.CheckType.TEMPERATURE) >= 45) 31 | PlayerApi.TemperatureOperations.changeTemperature(player, TemperatureChangeEvent.ChangeCause.ITEMS,-30); 32 | else 33 | PlayerApi.TemperatureOperations.changeTemperature(player,TemperatureChangeEvent.ChangeCause.ITEMS,15- PlayerApi.TemperatureOperations.getTemperature(player)); 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/MovablePack.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import ute.item.ItemManager; 4 | import ute.player.PlayerInventoryAdapt; 5 | 6 | public class MovablePack { 7 | public MovablePack() { 8 | PlayerInventoryAdapt.containerSizes.put(ItemManager.items.get("MovablePack").displayName, 4); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/NormalPack.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import ute.item.ItemManager; 4 | import ute.player.PlayerInventoryAdapt; 5 | 6 | public class NormalPack { 7 | public NormalPack() { 8 | PlayerInventoryAdapt.containerSizes.put(ItemManager.items.get("NormalPack").displayName, 8); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/PigPack.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import ute.item.ItemManager; 4 | import ute.player.PlayerInventoryAdapt; 5 | 6 | public class PigPack { 7 | public PigPack() { 8 | PlayerInventoryAdapt.containerSizes.put(ItemManager.items.get("PigPack").displayName, 12); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/Umbrella.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import ute.cap.hum.ChangeTasks; 4 | import ute.item.ItemManager; 5 | 6 | public class Umbrella { 7 | public Umbrella() { 8 | ChangeTasks.umbrellas.add(ItemManager.items.get("Umbrella").displayName); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/WarmStone.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.event.EventHandler; 4 | import org.bukkit.event.Listener; 5 | import org.bukkit.event.player.PlayerDropItemEvent; 6 | import org.bukkit.inventory.ItemStack; 7 | import org.bukkit.inventory.meta.ItemMeta; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | import ute.cap.tem.TemperatureProvider; 10 | import ute.item.ItemManager; 11 | 12 | import java.util.List; 13 | 14 | public class WarmStone implements Listener { 15 | public WarmStone() { 16 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 17 | } 18 | 19 | @EventHandler 20 | public void onThrow(PlayerDropItemEvent event) { 21 | ItemStack ritem = event.getItemDrop().getItemStack(); 22 | ItemStack item = event.getItemDrop().getItemStack(); 23 | if (!item.hasItemMeta()) return; 24 | if (!item.getItemMeta().hasDisplayName()) return; 25 | if (item.getItemMeta().getDisplayName().equalsIgnoreCase(ItemManager.items.get("WarmStone").displayName)) { 26 | ItemMeta meta = item.getItemMeta(); 27 | List lores = meta.getLore(); 28 | for (String str : lores) { 29 | if (str.contains("§8- §8§l温度 ")) { 30 | lores.remove(str); 31 | break; 32 | } 33 | } 34 | new BukkitRunnable() { 35 | @Override 36 | public void run() { 37 | lores.add("§8- §8§l温度 " + (int) TemperatureProvider.getBlockTemperature(event.getItemDrop().getLocation())); 38 | meta.setLore(lores); 39 | ritem.setItemMeta(meta); 40 | event.getItemDrop().setItemStack(ritem); 41 | } 42 | }.runTaskLater(ItemManager.plugin, 20); 43 | } 44 | } 45 | 46 | public static boolean hasTemperature(ItemStack item) { 47 | if (!item.hasItemMeta()) return false; 48 | if (!item.getItemMeta().hasLore()) return false; 49 | ItemMeta meta = item.getItemMeta(); 50 | List lores = meta.getLore(); 51 | for (String str : lores) 52 | if (str.contains("§8- §8§l温度 ")) 53 | if (!str.replace("§8- §8§l温度 ", "").equalsIgnoreCase("")) 54 | return true; 55 | return false; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/ute/item/survival/WaterBalloon.java: -------------------------------------------------------------------------------- 1 | package ute.item.survival; 2 | 3 | import org.bukkit.Location; 4 | import org.bukkit.Material; 5 | import org.bukkit.block.Block; 6 | import org.bukkit.entity.Player; 7 | import org.bukkit.event.EventHandler; 8 | import org.bukkit.event.EventPriority; 9 | import org.bukkit.event.Listener; 10 | import ute.api.PlayerApi; 11 | import ute.api.event.cap.HumidityChangeEvent; 12 | import ute.api.event.cap.TemperatureChangeEvent; 13 | import ute.api.event.player.CustomItemInteractEvent; 14 | import ute.item.ItemManager; 15 | 16 | public class WaterBalloon implements Listener { 17 | public WaterBalloon() { 18 | ItemManager.plugin.getServer().getPluginManager().registerEvents(this, ItemManager.plugin); 19 | } 20 | 21 | @EventHandler(priority = EventPriority.NORMAL) 22 | public void onInteract(CustomItemInteractEvent event) { 23 | Player player=event.getWho(); 24 | if (event.getUteItem().id.equalsIgnoreCase("WaterBalloon")) { 25 | event.setCancelled(true); 26 | PlayerApi.TemperatureOperations.changeTemperature(player,TemperatureChangeEvent.ChangeCause.ITEMS,-10); 27 | PlayerApi.HumidityOperations.changeHumidity(player, HumidityChangeEvent.ChangeCause.ITEMS,5); 28 | Location loc = player.getLocation(); 29 | for (int x = -3; x <= 3; x++) 30 | for (int y = -3; y <= 3; y++) 31 | for (int z = -3; z <= 3; z++) { 32 | Block block = new Location(loc.getWorld(), loc.getX() + x, loc.getY() + y, loc.getZ() + z).getBlock(); 33 | if (block == null) continue; 34 | if (block.getType() == Material.FIRE) 35 | block.setType(Material.AIR); 36 | if (block.isLiquid()) 37 | block.setType(Material.AIR); 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/ute/manager/WetManager.java: -------------------------------------------------------------------------------- 1 | package ute.manager; 2 | 3 | import org.bukkit.inventory.ItemStack; 4 | import org.bukkit.inventory.meta.ItemMeta; 5 | import ute.cap.hum.HumidityProvider; 6 | import ute.internal.ItemFactory; 7 | import ute.internal.UTEi18n; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | public class WetManager { 13 | private static final String LORE = UTEi18n.cache("item.machine.wet.lore"); 14 | 15 | public static void setWet(ItemStack stack, boolean state) { 16 | if (stack == null) return; 17 | if (getName(stack).equalsIgnoreCase(UTEi18n.cache("item.locked"))) return; 18 | if (state) { 19 | if (HumidityProvider.moistness.containsKey(ItemFactory.getType(stack))) 20 | stack.setType(HumidityProvider.moistness.get(ItemFactory.getType(stack))); 21 | } else { 22 | if (HumidityProvider.driness.containsKey(ItemFactory.getType(stack))) 23 | stack.setType(HumidityProvider.driness.get(ItemFactory.getType(stack))); 24 | } 25 | final ItemMeta meta = stack.getItemMeta(); 26 | if (meta == null) return; 27 | List lore = meta.getLore(); 28 | if (lore == null) lore = new ArrayList<>(); 29 | if (state) { 30 | if (!lore.contains(LORE)) 31 | lore.add(LORE); 32 | } else lore.remove(LORE); 33 | meta.setLore(lore); 34 | stack.setItemMeta(meta); 35 | } 36 | 37 | public static String getName(ItemStack item) { 38 | if (item == null) return ""; 39 | if (item.hasItemMeta()) 40 | if (item.getItemMeta().hasDisplayName()) 41 | return item.getItemMeta().getDisplayName(); 42 | return ""; 43 | } 44 | 45 | public static boolean isWet(ItemStack item) { 46 | if (item == null) return true; 47 | if (!item.hasItemMeta()) return false; 48 | if (!item.getItemMeta().hasLore()) return false; 49 | ItemMeta meta = item.getItemMeta(); 50 | List lore = meta.getLore(); 51 | if (lore != null) return lore.contains(LORE); 52 | return false; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/ActionBarManager.java: -------------------------------------------------------------------------------- 1 | package ute.nms; 2 | 3 | import org.bukkit.entity.Player; 4 | 5 | public abstract class ActionBarManager { 6 | public static final ActionBarManager implement; 7 | 8 | public static void initialize() { 9 | ActionBarManager.class.getClassLoader(); 10 | } 11 | 12 | static { 13 | implement = ReflectionImplAllocator.allocate("ActionBarManagerImpl", ActionBarManager.class); 14 | } 15 | 16 | protected abstract void sendActionBar0(Player player, String line); 17 | 18 | public static void sendActionBar(Player player, String line) { 19 | implement.sendActionBar0(player, line); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/NMSHelper.java: -------------------------------------------------------------------------------- 1 | package ute.nms; 2 | 3 | import org.bukkit.entity.Entity; 4 | 5 | import java.lang.invoke.LambdaMetafactory; 6 | import java.lang.invoke.MethodHandles; 7 | import java.lang.invoke.MethodType; 8 | import java.lang.reflect.Field; 9 | import java.lang.reflect.Method; 10 | import java.util.function.BiConsumer; 11 | import java.util.function.Function; 12 | 13 | // For Debugging 14 | public class NMSHelper { 15 | public static final Class CraftEntity = ReflectionUtil.getOBCClass("entity.CraftEntity"); 16 | public static final Method CraftEntity$getHandle = ReflectionUtil.getMethod(CraftEntity, "getHandle"); 17 | private static final Function CraftEntity$getHandle0 = ReflectionUtil.bindTo(Object.class, CraftEntity$getHandle); 18 | public static final Class EntityPlayer = ReflectionUtil.getNMSClass("EntityPlayer"); 19 | public static final Field EntityPlayer$playerConnection = ReflectionUtil.getField(EntityPlayer, "playerConnection"); 20 | private static final Function EntityPlayer$getPlayerConnection = 21 | ReflectionUtil.bindTo(Object.class, EntityPlayer$playerConnection); 22 | public static final Class PlayerConnection = ReflectionUtil.getNMSClass("PlayerConnection"); 23 | public static final Class Packet = ReflectionUtil.getNMSClass("Packet"); 24 | 25 | @SuppressWarnings("unchecked") 26 | private static final BiConsumer PlayerConnection$sendPacket = ReflectionUtil.runUncheck((args) -> { 27 | final MethodHandles.Lookup lookup = MethodHandles.lookup(); 28 | return (BiConsumer) LambdaMetafactory.metafactory(lookup, "accept", 29 | MethodType.methodType(BiConsumer.class), 30 | MethodType.methodType(void.class, Object.class, Object.class), 31 | lookup.unreflect(PlayerConnection.getMethod("sendPacket", Packet)), 32 | MethodType.methodType(void.class, Packet)).getTarget().invoke(); 33 | 34 | }); 35 | 36 | public static Object getHandle(Entity entity) { 37 | return CraftEntity$getHandle0.apply(entity); 38 | } 39 | 40 | public static Object getPlayerConnection(Object entityPlayer) { 41 | return EntityPlayer$getPlayerConnection.apply(entityPlayer); 42 | } 43 | 44 | public static void sendPacket(Object playerConnection, Object packet) { 45 | PlayerConnection$sendPacket.accept(playerConnection, packet); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/NMSManager.java: -------------------------------------------------------------------------------- 1 | package ute.nms; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | public class NMSManager { 6 | public static String version = Bukkit.getServer().getClass().getPackage().getName().replace(".", ",").split(",")[3]; 7 | 8 | public static Class getClass(String name) { 9 | try { 10 | return Class.forName("net.minecraft.server." + version + "." + name); 11 | } catch (ClassNotFoundException e) { 12 | try { 13 | return Class.forName("org.bukkit.craftbukkit." + version + "." + name); 14 | } catch (ClassNotFoundException e1) { 15 | return null; 16 | } 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/ReflectionImplAllocator.java: -------------------------------------------------------------------------------- 1 | package ute.nms; 2 | 3 | public class ReflectionImplAllocator { 4 | static final String package_name = ReflectionImplAllocator.class.getPackage().getName() + '.'; 5 | 6 | public static T allocate(String name, Class type) { 7 | try { 8 | return Class.forName(package_name + ReflectionUtil.getVersion() + name) 9 | .asSubclass(type).newInstance(); 10 | } catch (Throwable r0) { 11 | try { 12 | return Class.forName(package_name + "reflect." + name) 13 | .asSubclass(type).newInstance(); 14 | } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { 15 | RuntimeException re = new RuntimeException(e); 16 | re.addSuppressed(r0); 17 | throw re; 18 | } 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/reflect/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.reflect; 2 | 3 | import ute.UntilTheEnd; 4 | import ute.nms.ActionBarManager; 5 | import ute.nms.NMSHelper; 6 | import ute.nms.ReflectionUtil; 7 | import org.bukkit.entity.Player; 8 | 9 | import java.lang.reflect.Constructor; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | static final ReflectionUtil.UncheckedCode packetAllocator; 13 | 14 | // EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | // player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | static { 17 | Class PacketPlayOutChat = ReflectionUtil.getNMSClass("PacketPlayOutChat"); 18 | Class ChatMessageType = ReflectionUtil.getNMSClass("ChatMessageType"); 19 | Class ChatComponentText = ReflectionUtil.getNMSClass("ChatComponentText"); 20 | Constructor ChatComponentText$new = ReflectionUtil.getConstructor(ChatComponentText, String.class); 21 | assert ChatComponentText$new != null; 22 | ChatComponentText$new.setAccessible(false); 23 | 24 | Class IChatBaseComponent = ReflectionUtil.getNMSClass("IChatBaseComponent"); 25 | ReflectionUtil.UncheckedCode newComponentText = ChatComponentText$new::newInstance; 26 | if (ChatMessageType == null) { 27 | // 1.12.2 - 28 | Constructor PacketPlayOutChat$CCT_byte = ReflectionUtil.getConstructor(PacketPlayOutChat, IChatBaseComponent, byte.class); 29 | assert PacketPlayOutChat$CCT_byte != null; 30 | PacketPlayOutChat$CCT_byte.setAccessible(false); 31 | Byte b = (byte) 2; 32 | packetAllocator = args -> PacketPlayOutChat$CCT_byte.newInstance(newComponentText.call(args), b); 33 | } else { 34 | // 1.12.2 + 35 | Constructor PacketPlayOutChat$CCT_Type = ReflectionUtil.getConstructor(PacketPlayOutChat, IChatBaseComponent, ChatMessageType); 36 | assert PacketPlayOutChat$CCT_Type != null; 37 | PacketPlayOutChat$CCT_Type.setAccessible(false); 38 | // ChatMessageType.GAME_INFO 39 | Object GAME_INFO = ReflectionUtil.runUncheck(args -> ChatMessageType.getField("GAME_INFO").get(null)); 40 | packetAllocator = args -> PacketPlayOutChat$CCT_Type.newInstance(newComponentText.call(args), GAME_INFO); 41 | } 42 | 43 | } 44 | 45 | @Override 46 | protected void sendActionBar0(Player player, String line) { 47 | if(!UntilTheEnd.getInstance().getConfig().getBoolean("actionbartips")){ 48 | return; 49 | } 50 | NMSHelper.sendPacket( 51 | NMSHelper.getPlayerConnection( 52 | NMSHelper.getHandle(player) 53 | ), 54 | ReflectionUtil.runUncheck(packetAllocator, line) 55 | ); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_12_R1/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_12_R1; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_12_R1.ChatComponentText; 5 | import net.minecraft.server.v1_12_R1.ChatMessageType; 6 | import net.minecraft.server.v1_12_R1.EntityPlayer; 7 | import net.minecraft.server.v1_12_R1.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_12_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | @Override 13 | protected void sendActionBar0(Player player, String line) { 14 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_13_R1/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_13_R1; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_13_R1.ChatComponentText; 5 | import net.minecraft.server.v1_13_R1.ChatMessageType; 6 | import net.minecraft.server.v1_13_R1.EntityPlayer; 7 | import net.minecraft.server.v1_13_R1.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_13_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | @Override 13 | protected void sendActionBar0(Player player, String line) { 14 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_13_R2/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_13_R2; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_13_R2.ChatComponentText; 5 | import net.minecraft.server.v1_13_R2.ChatMessageType; 6 | import net.minecraft.server.v1_13_R2.EntityPlayer; 7 | import net.minecraft.server.v1_13_R2.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_13_R2.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | @Override 13 | protected void sendActionBar0(Player player, String line) { 14 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_14_R1/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_14_R1; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_14_R1.ChatComponentText; 5 | import net.minecraft.server.v1_14_R1.ChatMessageType; 6 | import net.minecraft.server.v1_14_R1.EntityPlayer; 7 | import net.minecraft.server.v1_14_R1.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_14_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | @Override 13 | protected void sendActionBar0(Player player, String line) { 14 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_15_R1/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_15_R1; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_15_R1.ChatComponentText; 5 | import net.minecraft.server.v1_15_R1.ChatMessageType; 6 | import net.minecraft.server.v1_15_R1.EntityPlayer; 7 | import net.minecraft.server.v1_15_R1.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_15_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | public class ActionBarManagerImpl extends ActionBarManager { 12 | @Override 13 | protected void sendActionBar0(Player player, String line) { 14 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 15 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_16_R1/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_16_R1; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_16_R1.ChatComponentText; 5 | import net.minecraft.server.v1_16_R1.ChatMessageType; 6 | import net.minecraft.server.v1_16_R1.EntityPlayer; 7 | import net.minecraft.server.v1_16_R1.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_16_R1.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | import java.util.UUID; 12 | 13 | public class ActionBarManagerImpl extends ActionBarManager { 14 | private static final UUID ZERO = new UUID(0, 0); 15 | 16 | @Override 17 | protected void sendActionBar0(Player player, String line) { 18 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 19 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO, ZERO)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_16_R2/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_16_R2; 2 | 3 | import ute.nms.ActionBarManager; 4 | import net.minecraft.server.v1_16_R2.ChatComponentText; 5 | import net.minecraft.server.v1_16_R2.ChatMessageType; 6 | import net.minecraft.server.v1_16_R2.EntityPlayer; 7 | import net.minecraft.server.v1_16_R2.PacketPlayOutChat; 8 | import org.bukkit.craftbukkit.v1_16_R2.entity.CraftPlayer; 9 | import org.bukkit.entity.Player; 10 | 11 | import java.util.UUID; 12 | 13 | public class ActionBarManagerImpl extends ActionBarManager { 14 | private static final UUID ZERO = new UUID(0, 0); 15 | 16 | @Override 17 | protected void sendActionBar0(Player player, String line) { 18 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 19 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO, ZERO)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_16_R3/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_16_R3; 2 | 3 | import net.minecraft.server.v1_16_R3.ChatComponentText; 4 | import net.minecraft.server.v1_16_R3.ChatMessageType; 5 | import net.minecraft.server.v1_16_R3.EntityPlayer; 6 | import net.minecraft.server.v1_16_R3.PacketPlayOutChat; 7 | import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; 8 | import org.bukkit.entity.Player; 9 | import ute.nms.ActionBarManager; 10 | 11 | import java.util.UUID; 12 | 13 | public class ActionBarManagerImpl extends ActionBarManager { 14 | private static final UUID ZERO = new UUID(0, 0); 15 | 16 | @Override 17 | protected void sendActionBar0(Player player, String line) { 18 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 19 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO, ZERO)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/nms/v1_16_R4/ActionBarManagerImpl.java: -------------------------------------------------------------------------------- 1 | package ute.nms.v1_16_R4; 2 | 3 | import net.minecraft.server.v1_16_R3.ChatComponentText; 4 | import net.minecraft.server.v1_16_R3.ChatMessageType; 5 | import net.minecraft.server.v1_16_R3.EntityPlayer; 6 | import net.minecraft.server.v1_16_R3.PacketPlayOutChat; 7 | import org.bukkit.craftbukkit.v1_16_R3.entity.CraftPlayer; 8 | import org.bukkit.entity.Player; 9 | import ute.nms.ActionBarManager; 10 | 11 | import java.util.UUID; 12 | 13 | public class ActionBarManagerImpl extends ActionBarManager { 14 | private static final UUID ZERO = new UUID(0, 0); 15 | 16 | @Override 17 | protected void sendActionBar0(Player player, String line) { 18 | EntityPlayer player1 = ((CraftPlayer) player).getHandle(); 19 | player1.playerConnection.sendPacket(new PacketPlayOutChat(new ChatComponentText(line), ChatMessageType.GAME_INFO, ZERO)); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/player/Player.java: -------------------------------------------------------------------------------- 1 | package ute.player; 2 | 3 | import org.bukkit.Bukkit; 4 | 5 | import ute.UntilTheEnd; 6 | import ute.player.death.DeathMessage; 7 | import ute.player.role.events.EventLoader; 8 | import ute.player.role.tasks.TaskLoader; 9 | 10 | public class Player { 11 | 12 | public static void initialize(UntilTheEnd plugin) { 13 | new PlayerManager(plugin); 14 | for (org.bukkit.entity.Player player : Bukkit.getOnlinePlayers()) 15 | PlayerManager.load(player); 16 | new PlayerInventoryAdapt(plugin); 17 | plugin.getServer().getPluginManager().registerEvents(new DeathMessage(), plugin); 18 | new EventLoader(plugin); 19 | new TaskLoader(plugin); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/ute/player/death/DeathCause.java: -------------------------------------------------------------------------------- 1 | package ute.player.death; 2 | 3 | public enum DeathCause { 4 | COLDNESS, HOTNESS, DARKNESS, BEEMINE, TOOTHTRAP, BLOWARROW, INVALIDSLEEPNESS; 5 | } 6 | -------------------------------------------------------------------------------- /src/main/java/ute/player/death/DeathMessage.java: -------------------------------------------------------------------------------- 1 | package ute.player.death; 2 | 3 | import org.bukkit.event.Listener; 4 | 5 | import java.util.HashMap; 6 | 7 | public class DeathMessage implements Listener { 8 | public static HashMap causes = new HashMap(); 9 | 10 | // @EventHandler(priority = EventPriority.LOWEST) 11 | // public void onDeath(PlayerDeathEvent event) { 12 | // Player player = event.getEntity(); 13 | // if (causes.containsKey(player.getName())) { 14 | // DeathCause cause = causes.get(player.getName()); 15 | // switch (cause) { 16 | // case COLDNESS: 17 | // broadDeathMessage(UTEi18n.cache("death.coldness").replace("{player}", player.getName())); 18 | // break; 19 | // case HOTNESS: 20 | // broadDeathMessage(UTEi18n.cache("death.hotness").replace("{player}", player.getName())); 21 | // break; 22 | // case DARKNESS: 23 | // broadDeathMessage(UTEi18n.cache("death.darkness").replace("{player}", player.getName())); 24 | // break; 25 | // case BEEMINE: 26 | // broadDeathMessage(UTEi18n.cache("death.beemine").replace("{player}", player.getName())); 27 | // break; 28 | // case TOOTHTRAP: 29 | // broadDeathMessage(UTEi18n.cache("death.toothtrap").replace("{player}", player.getName())); 30 | // break; 31 | // case BLOWARROW: 32 | // broadDeathMessage(UTEi18n.cache("death.blowarrow").replace("{player}", player.getName())); 33 | // break; 34 | // case INVALIDSLEEPNESS: 35 | // broadDeathMessage(UTEi18n.cache("death.invalidsleepness").replace("{player}", player.getName())); 36 | // break; 37 | // default: 38 | // break; 39 | // } 40 | // causes.remove(player.getName()); 41 | // } 42 | // } 43 | // 44 | // private void broadDeathMessage(String replace) { 45 | // for(Player player: Bukkit.getOnlinePlayers()) 46 | // player.sendMessage(replace); 47 | // } 48 | } 49 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/IRole.java: -------------------------------------------------------------------------------- 1 | package ute.player.role; 2 | 3 | public class IRole { 4 | public int level; 5 | public int sanMax; 6 | public int healthMax; 7 | public double damageLevel; 8 | 9 | public IRole(int level, int sanMax, int healthMax, double damageLevel) { 10 | this.level = level; 11 | this.sanMax = sanMax; 12 | this.healthMax = healthMax; 13 | this.damageLevel = damageLevel; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/events/EventLoader.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.events; 2 | 3 | import ute.UntilTheEnd; 4 | 5 | public class EventLoader { 6 | public EventLoader(UntilTheEnd plugin) { 7 | plugin.getServer().getPluginManager().registerEvents(new GeneralEvents(), plugin); 8 | plugin.getServer().getPluginManager().registerEvents(new Willow(), plugin); 9 | plugin.getServer().getPluginManager().registerEvents(new WX78(), plugin); 10 | plugin.getServer().getPluginManager().registerEvents(new Wendy(), plugin); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/events/GeneralEvents.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.events; 2 | 3 | import ute.Config; 4 | import ute.Logging; 5 | import org.bukkit.entity.Player; 6 | import org.bukkit.event.EventHandler; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.entity.EntityDamageByEntityEvent; 9 | 10 | import ute.player.PlayerManager; 11 | import ute.player.PlayerManager.CheckType; 12 | 13 | public class GeneralEvents implements Listener { 14 | @EventHandler 15 | public void onAttack(EntityDamageByEntityEvent event) { 16 | if (!Config.enableWorlds.contains(event.getDamager().getWorld())) return; 17 | if (event.getDamager() instanceof Player) { 18 | Player player = (Player) event.getDamager(); 19 | double damageLevel = PlayerManager.check(player, CheckType.DAMAGELEVEL); 20 | double dm = event.getDamage(); 21 | event.setDamage(dm * damageLevel); 22 | Logging.getLogger().fine(() -> "Role'd damage{source=" + dm + ", lv=" + damageLevel + ", changed=" + event.getDamage() + "}"); 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/events/WX78.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.events; 2 | 3 | import org.bukkit.entity.Entity; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.entity.EntityDamageEvent; 9 | import org.bukkit.event.player.PlayerInteractEvent; 10 | import org.bukkit.inventory.ItemStack; 11 | import org.bukkit.potion.PotionEffect; 12 | import org.bukkit.potion.PotionEffectType; 13 | 14 | import ute.Config; 15 | import ute.internal.DisableManager; 16 | import ute.internal.EventHelper; 17 | import ute.item.ItemManager; 18 | import ute.player.PlayerManager; 19 | import ute.player.PlayerManager.CheckType; 20 | import ute.player.role.Roles; 21 | 22 | public class WX78 implements Listener { 23 | //抗雷 24 | @EventHandler 25 | public void onLightned(EntityDamageEvent event) { 26 | Entity entity=event.getEntity(); 27 | if(entity instanceof Player) { 28 | Player player=(Player) entity; 29 | if(PlayerManager.checkRole(player)==Roles.WX78) { 30 | event.setDamage(0.0); 31 | player.addPotionEffect(new PotionEffect(PotionEffectType.INCREASE_DAMAGE,3600,2)); 32 | player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,3600,2)); 33 | } 34 | } 35 | } 36 | 37 | @EventHandler(priority = EventPriority.MONITOR) 38 | public void onRight(PlayerInteractEvent event) { 39 | Player player = event.getPlayer(); 40 | if(PlayerManager.checkRole(player)!=Roles.WX78) return; 41 | if (!Config.enableWorlds.contains(player.getWorld())) return; 42 | if (event.isCancelled() && !DisableManager.bypass_right_action_cancelled) return; 43 | if (!event.hasItem()) return; 44 | if (!EventHelper.isRight(event.getAction())) return; 45 | ItemStack item = event.getItem(); 46 | if (ItemManager.isSimilar(item, ItemManager.items.get("Gear").item)) { 47 | event.setCancelled(true); 48 | //常数放进Config可设置 49 | /* 50 | * 0.1:升级概率 51 | * 5:最高等级 52 | * 语言 53 | */ 54 | if(PlayerManager.check(player,CheckType.LEVEL)<=5) { 55 | player.sendMessage("§6[§cUntilTheEnd§6]§r 已经达到最高等级!"); 56 | event.setCancelled(false); 57 | return; 58 | } 59 | if(Math.random()<=0.1) { 60 | PlayerManager.change(player,CheckType.LEVEL, 61 | PlayerManager.check(player,CheckType.LEVEL)+1); 62 | PlayerManager.change(player,CheckType.DAMAGELEVEL, 63 | PlayerManager.check(player,CheckType.DAMAGELEVEL)+0.2); 64 | player.sendMessage("§6[§cUntilTheEnd§6]§r 升级成功,您现在的等级:§l"+PlayerManager.check(player,CheckType.LEVEL)); 65 | } 66 | } 67 | } 68 | } 69 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/events/Willow.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.events; 2 | 3 | import ute.Config; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.event.EventHandler; 6 | import org.bukkit.event.EventPriority; 7 | import org.bukkit.event.Listener; 8 | import org.bukkit.event.entity.EntityDamageEvent; 9 | import org.bukkit.event.entity.EntityDamageEvent.DamageCause; 10 | 11 | import ute.api.PlayerApi; 12 | import ute.player.role.Roles; 13 | 14 | public class Willow implements Listener { 15 | @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) 16 | public void onAttack(EntityDamageEvent event) { 17 | if (!Config.enableWorlds.contains(event.getEntity().getWorld())) return; 18 | if (event.getEntity() instanceof Player) { 19 | Player player = (Player) event.getEntity(); 20 | if (PlayerApi.RoleOperations.getRole(player) == Roles.WILLOW) { 21 | if (event.getCause() == DamageCause.FIRE) event.setCancelled(true); 22 | if (event.getCause() == DamageCause.FIRE_TICK) event.setCancelled(true); 23 | if (event.getCause() == DamageCause.LAVA) event.setCancelled(true); 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/tasks/TaskLoader.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.tasks; 2 | 3 | import ute.UntilTheEnd; 4 | 5 | public class TaskLoader { 6 | public TaskLoader(UntilTheEnd plugin) { 7 | new Wilson(plugin); 8 | new Willow(plugin); 9 | new Wolfgang(plugin); 10 | new WX78(plugin); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/tasks/WX78.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.tasks; 2 | 3 | import org.bukkit.World; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | 7 | import ute.Config; 8 | import ute.UntilTheEnd; 9 | import ute.api.PlayerApi; 10 | import ute.internal.NPCChecker; 11 | import ute.internal.ResidenceChecker; 12 | import ute.player.PlayerManager; 13 | import ute.player.PlayerManager.CheckType; 14 | import ute.player.role.Roles; 15 | 16 | public class WX78 { 17 | public WX78(UntilTheEnd plugin) { 18 | new SetHud().runTaskTimer(plugin, 0L, 40L); 19 | } 20 | 21 | public static class SetHud extends BukkitRunnable { 22 | @Override 23 | public void run() { 24 | for (World world : Config.enableWorlds) 25 | for (Player player : world.getPlayers()) { 26 | if (NPCChecker.isNPC(player)|| ResidenceChecker.isProtected(player.getLocation())) continue; 27 | if (PlayerApi.RoleOperations.getRole(player) == Roles.WX78) { 28 | player.setMaxHealth(PlayerManager.check(player,CheckType.LEVEL)*4+20); 29 | double humidity=PlayerManager.check(player,CheckType.HUMIDITY); 30 | //10.0-扣血比率 31 | if(humidity>0) { 32 | player.damage(humidity/10.0); 33 | } 34 | } 35 | } 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/tasks/Willow.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.tasks; 2 | 3 | import ute.api.event.cap.SanityChangeEvent; 4 | import ute.internal.NPCChecker; 5 | import ute.internal.ResidenceChecker; 6 | 7 | import org.bukkit.Location; 8 | import org.bukkit.World; 9 | import org.bukkit.entity.Player; 10 | import org.bukkit.scheduler.BukkitRunnable; 11 | 12 | import ute.Config; 13 | import ute.UntilTheEnd; 14 | import ute.api.PlayerApi; 15 | import ute.player.PlayerManager; 16 | import ute.player.PlayerManager.CheckType; 17 | import ute.player.role.Roles; 18 | 19 | public class Willow { 20 | public Willow(UntilTheEnd plugin) { 21 | new FireAndWater().runTaskTimer(plugin, 0L, 60L); 22 | } 23 | 24 | public static class FireAndWater extends BukkitRunnable { 25 | @Override 26 | public void run() { 27 | for (World world : Config.enableWorlds) 28 | for (Player player : world.getPlayers()) { 29 | if (NPCChecker.isNPC(player) || ResidenceChecker.isProtected(player.getLocation())) continue; 30 | if (PlayerApi.RoleOperations.getRole(player) == Roles.WILLOW) { 31 | Location loc = player.getLocation(); 32 | for (int x = -5; x <= 5; x++) 33 | for (int y = -5; y <= 5; y++) 34 | for (int z = -5; z <= 5; z++) { 35 | Location newLoc = loc.clone().add(x, y, z); 36 | switch (newLoc.getBlock().getType()) { 37 | case FIRE: 38 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,1); 39 | break; 40 | case LAVA: 41 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,2); 42 | break; 43 | case STATIONARY_LAVA: 44 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,2); 45 | break; 46 | case WATER: 47 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,-1); 48 | break; 49 | case STATIONARY_WATER: 50 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,-1); 51 | break; 52 | default: 53 | break; 54 | } 55 | } 56 | if (PlayerManager.check(player, CheckType.HUMIDITY) >= 3) { 57 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.WILLOW,-2); 58 | } 59 | } 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/tasks/Wilson.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.tasks; 2 | 3 | import ute.internal.NPCChecker; 4 | import ute.internal.ResidenceChecker; 5 | 6 | import org.bukkit.World; 7 | import org.bukkit.entity.Player; 8 | import org.bukkit.scheduler.BukkitRunnable; 9 | 10 | import ute.Config; 11 | import ute.UntilTheEnd; 12 | import ute.api.PlayerApi; 13 | import ute.item.ItemManager; 14 | import ute.player.role.Roles; 15 | 16 | public class Wilson { 17 | public Wilson(UntilTheEnd plugin) { 18 | new Beard().runTaskTimer(plugin, 0L, 1200L); 19 | } 20 | 21 | public static class Beard extends BukkitRunnable { 22 | @Override 23 | public void run() { 24 | for (World world : Config.enableWorlds) 25 | for (Player player : world.getPlayers()) { 26 | if (NPCChecker.isNPC(player)|| ResidenceChecker.isProtected(player.getLocation())) continue; 27 | if (PlayerApi.RoleOperations.getRole(player) == Roles.WILSON) { 28 | if (Math.random() <= 0.1) { 29 | player.getInventory().addItem(ItemManager.items.get("Beard").item); 30 | } 31 | } 32 | } 33 | } 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/ute/player/role/tasks/Wolfgang.java: -------------------------------------------------------------------------------- 1 | package ute.player.role.tasks; 2 | 3 | import org.bukkit.World; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | 7 | import ute.Config; 8 | import ute.UntilTheEnd; 9 | import ute.api.PlayerApi; 10 | import ute.api.event.cap.SanityChangeEvent; 11 | import ute.internal.NPCChecker; 12 | import ute.internal.ResidenceChecker; 13 | import ute.player.PlayerManager; 14 | import ute.player.PlayerManager.CheckType; 15 | import ute.player.role.Roles; 16 | 17 | public class Wolfgang { 18 | public Wolfgang(UntilTheEnd plugin) { 19 | new Task().runTaskTimer(plugin, 0L, 60L); 20 | } 21 | 22 | public static class Task extends BukkitRunnable { 23 | @Override 24 | public void run() { 25 | for (World world : Config.enableWorlds) 26 | for (Player player : world.getPlayers()) { 27 | if (NPCChecker.isNPC(player)|| ResidenceChecker.isProtected(player.getLocation())) continue; 28 | if (PlayerApi.RoleOperations.getRole(player) == Roles.WOLFGANG) { 29 | if (world.getTime() >= 14000 && world.getTime() <=21000) 30 | PlayerApi.SanityOperations.changeSanity(player, SanityChangeEvent.ChangeCause.NIGHT,-2); 31 | double hungerPercent = (double) (player.getFoodLevel()) / 20.0; 32 | player.setMaxHealth(hungerPercent * 30); 33 | PlayerManager.change(player, CheckType.HEALTHMAX, 34 | hungerPercent * 30 - PlayerManager.check(player, CheckType.HEALTHMAX)); 35 | PlayerManager.change(player, CheckType.DAMAGELEVEL, 36 | hungerPercent * 1.5 - PlayerManager.check(player, CheckType.DAMAGELEVEL)); 37 | } 38 | } 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /src/main/java/ute/world/World.java: -------------------------------------------------------------------------------- 1 | package ute.world; 2 | 3 | import ute.Logging; 4 | import ute.UntilTheEnd; 5 | import org.bukkit.configuration.file.YamlConfiguration; 6 | 7 | import java.io.File; 8 | import java.util.logging.Level; 9 | //import HamsterYDS.UntilTheEnd.world.nms.DarkNight; 10 | 11 | public class World { 12 | public static File file; 13 | public static YamlConfiguration yaml; 14 | 15 | public static void initialize(UntilTheEnd plugin) { 16 | file = new File(plugin.getDataFolder(), "worlds.yml"); 17 | yaml = YamlConfiguration.loadConfiguration(file); 18 | Logging.getLogger().log(Level.FINER, () -> "[World] Loading world data."); 19 | Logging.getLogger().log(Level.FINER, () -> "[World] File: " + file); 20 | Logging.getLogger().log(Level.FINER, () -> "[World] Yaml: " + yaml); 21 | assert yaml != null : "Error: Yaml not loaded."; 22 | WorldProvider.loadWorlds(); 23 | WorldProvider.registerListener(); 24 | new WorldCounter().runTaskTimer(plugin, 0L, 20L); 25 | InfluenceTasks.initialize(plugin); 26 | // new DarkNight().runTaskTimer(plugin,0L,50L); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/ute/world/WorldCounter.java: -------------------------------------------------------------------------------- 1 | package ute.world; 2 | 3 | import org.bukkit.World; 4 | import org.bukkit.entity.Player; 5 | import org.bukkit.scheduler.BukkitRunnable; 6 | import ute.Config; 7 | import ute.cap.tem.TemperatureProvider; 8 | import ute.internal.NPCChecker; 9 | import ute.internal.UTEi18n; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | import java.util.UUID; 14 | import java.util.concurrent.atomic.AtomicLong; 15 | 16 | public class WorldCounter extends BukkitRunnable { 17 | // private HashSet changingWorlds=new HashSet(); 18 | private final Map lateTime = new HashMap<>(); 19 | 20 | @Override 21 | public void run() { 22 | for (World world : Config.enableWorlds) { 23 | long time = world.getTime(); 24 | UUID uid = world.getUID(); 25 | final AtomicLong atomicLong = lateTime.get(uid); 26 | if (atomicLong == null) { 27 | lateTime.put(uid, new AtomicLong(time)); 28 | // 没值的时候到底需不需要把这玩意进入下一天 29 | // newDay(world); 30 | } else { 31 | if (atomicLong.get() > time) { // Loop 32 | newDay(world); 33 | } 34 | atomicLong.set(time); 35 | } 36 | } 37 | } 38 | 39 | private void newDay(World world) { 40 | WorldProvider.IWorld state = WorldProvider.worldStates.get(world.getName()); 41 | // int days = state.day; 42 | if (state.season != WorldProvider.Season.NULL) { 43 | if (state.day < state.loop) { 44 | state.day++; 45 | } else { 46 | state.day = 1; 47 | state.loop = (state.season = state.season.next()).newLoop(); 48 | } 49 | } 50 | WorldProvider.saveWorlds(); 51 | tellPlayers(world); 52 | TemperatureProvider.loadWorldTemperature(world); 53 | } 54 | 55 | public static void tellPlayers(World world) { 56 | WorldProvider.IWorld state = WorldProvider.worldStates.get(world.getName()); 57 | for (Player player : world.getPlayers()) 58 | if (!NPCChecker.isNPC(player)) 59 | player.sendTitle(UTEi18n.parse("mechanism.world.next-day.main", state.season.name), UTEi18n.parse("mechanism.world.next-day.sub", String.valueOf(state.day)), 10, 70, 20); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/main/java/ute/world/structure/StructureManager.java: -------------------------------------------------------------------------------- 1 | package ute.world.structure; 2 | 3 | import java.util.HashMap; 4 | 5 | public class StructureManager { 6 | public static HashMap structures=new HashMap(); 7 | } 8 | -------------------------------------------------------------------------------- /src/main/resources/LightingCompensation.yml: -------------------------------------------------------------------------------- 1 | # 光照补偿机制 2 | # 由于光照系统目前只用于 0 亮度受伤, 所以只要值高于 0 都可以让玩家在世界表面游玩 3 | # 可以填负数提供反向补偿 4 | # 地狱默认无效, 因为地狱正常情况下上不去世界表面! 5 | world: 0 6 | world_the_end: 5 7 | world_nether: 0 8 | -------------------------------------------------------------------------------- /src/main/resources/crops.yml: -------------------------------------------------------------------------------- 1 | crops: 2 | season: true #是否开启季节性农作物 3 | takewaterup: 4 | enable: true #是否开启农作物吸水 5 | takeWaterPercent: 0.1 #农作物生长时吸水的几率 6 | #季节性作物 7 | seasonCrops: 8 | CROPS: #作物Material名字 9 | seasons: #只在哪个季节生长 10 | - SUMMER #夏天 11 | - SPRING #春天 12 | percents: 13 | - 0.3 #夏天的速率 14 | - 0.2 #春天的速率 15 | MELON_ITEM: 16 | seasons: 17 | - SUMMER 18 | percents: 19 | - 0.2 20 | PUMPKIN_ITEM: 21 | seasons: 22 | - AUTUMN 23 | percents: 24 | - 0.2 25 | SUGAR_CANE: 26 | seasons: 27 | - WINTER 28 | percents: 29 | - 0.2 30 | POTATO: 31 | seasons: 32 | - SUMMER 33 | - AUTUMN 34 | percents: 35 | - 0.3 36 | - 0.2 37 | CARROT: 38 | seasons: 39 | - AUTUMN 40 | - WINTER 41 | percents: 42 | - 0.3 43 | - 0.2 44 | COCOA: 45 | seasons: 46 | - SPRING 47 | - AUTUMN 48 | percents: 49 | - 0.4 50 | - 0.2 -------------------------------------------------------------------------------- /src/main/resources/disable.yml: -------------------------------------------------------------------------------- 1 | # 禁用特性 2 | 3 | # 禁用的属性检查 4 | check-type: 5 | world: 6 | list: [] 7 | # 映射 8 | mirror: [world_the_end, "$default"] 9 | 10 | #禁用的职业 11 | roles: [] 12 | 13 | #是否关闭自带的PAPI替换 14 | chatting_placeholder_api: false 15 | 16 | # 是否绕过AuthMe/服务器本身的右键检查 17 | # 当设置为true的时候, 将会继续执行被服务器/插件取消掉的右键点击事件 18 | bypass_right_action_cancelled: true 19 | 20 | # 是否关闭 Cave 世界 21 | disable_cave_world: true 22 | 23 | #是否关闭actionbar的温馨提示(true表示关闭) 24 | disable_actionbar: false -------------------------------------------------------------------------------- /src/main/resources/drops.yml: -------------------------------------------------------------------------------- 1 | PIG: 2 | dropitems: 3 | - PigSkin 4 | percents: 5 | - 1.5 6 | OCELOT: 7 | dropitems: 8 | - CatTail 9 | percents: 10 | - 0.3 11 | COW: 12 | dropitems: 13 | - Horn 14 | - CowHair 15 | percents: 16 | - 1.0 17 | - 1.5 18 | WOLF: 19 | dropitems: 20 | - DogTooth 21 | percents: 22 | - 2.5 23 | RABBIT: 24 | dropitems: 25 | - RabbitFur 26 | percents: 27 | - 0.3 28 | ENDER_DRAGON: 29 | dropitems: 30 | - Scale 31 | percents: 32 | - 15.0 33 | SKELETON: 34 | dropitems: 35 | - Sclerite 36 | percents: 37 | - 1.2 38 | SPIDER: 39 | dropitems: 40 | - SpiderGland 41 | percents: 42 | - 0.3 43 | CAVE_SPIDER: 44 | dropitems: 45 | - SpiderGland 46 | percents: 47 | - 0.3 48 | LLAMA: 49 | dropitems: 50 | - Spit 51 | percents: 52 | - 0.2 53 | WITHER_SKELETON: 54 | dropitems: 55 | - Gear 56 | percents: 57 | - 0.2 58 | WITHER: 59 | dropitems: 60 | - AnimateWood 61 | percents: 62 | - 10 63 | WOOD: 64 | dropitems: 65 | - AnimateWood 66 | percents: 67 | - 0.02 68 | STONE: 69 | dropitems: 70 | - RedGum 71 | - BlueGum 72 | - GreenGum 73 | - Nitre 74 | percents: 75 | - 0.005 76 | - 0.005 77 | - 0.002 78 | - 0.01 79 | -------------------------------------------------------------------------------- /src/main/resources/food.yml: -------------------------------------------------------------------------------- 1 | food: 2 | hunger: 3 | enable: true #是否开启加速饥饿 4 | speed: 30 #每多少秒固定减少1点饥饿值 5 | rotten: 6 | invenable: true #是否打开背包食物腐烂机制 7 | guienable: true #是否打开箱子GUI内食物腐烂机制 8 | invspeed: 30 #背包食物每多少秒计算一次新鲜度-1 9 | guispeed: 300 #箱子GUI内食物每多少秒计算一次新鲜度-1 10 | foodBeBadUnder: 60 #新鲜度低于多少是算作变味食物 11 | rottenFoodSanityPunishment: -30 #食用腐烂食物理智值变化多少 -------------------------------------------------------------------------------- /src/main/resources/hud.yml: -------------------------------------------------------------------------------- 1 | #HUD设置########################################################## 2 | 3 | #理智值状态对应的颜色 4 | sanityColor: 5 | 120: "§a§l" 6 | 90: "§6§l" 7 | 60: "§c§l" 8 | 30: "§4§l" 9 | 0: "§0§l" 10 | 11 | #湿度状态对应的颜色 12 | humidityColor: 13 | 5: "§b§l" 14 | 15: "§3§l" 15 | 25: "§1§l" 16 | 17 | #温度状态对应的颜色 18 | temperatureColor: 19 | 15: "§9§l" 20 | 50: "§6§l" 21 | 75: "§4§l" 22 | 23 | #季节文字对应的颜色 24 | seasonColor: 25 | SPRING: "§2§l" 26 | SUMMER: "§e§l" 27 | AUTUMN: "§6§l" 28 | WINTER: "§7§l" 29 | 30 | bar: 31 | #是否开启Boss血量条显示固有属性 32 | enable: true 33 | 34 | #字符属性条设置 35 | messageBar: 36 | length: 40 #血量条长度 37 | sancolor: '§b' #理智条有颜色的颜色代码 38 | humcolor: '§a' #湿度条有颜色的颜色代码 39 | temcolor: '§c' #温度条有颜色的颜色代码 40 | tircolor: '§d' #疲劳条有颜色的颜色代码 41 | 42 | nocolor: '§r' #条没有颜色处的颜色代码 43 | unit: '|' #条中每个字符单位 44 | 45 | #HUD多少刻刷新一次 46 | fresh: 10 -------------------------------------------------------------------------------- /src/main/resources/humidity.yml: -------------------------------------------------------------------------------- 1 | # 在雨中湿度没多少刻上升1 2 | weahterChangePeriod: 10 3 | # 在水中湿度没多少刻上升1 4 | stateChangePeriod: 5 5 | # 玩家湿度高于多少触发挖掘疲劳效果 6 | effectHumidity: 10 7 | #玩家背包内物品受潮计算周期(数值越大,受潮越快) 8 | dampPeriod: 50 9 | #玩家背包内物品风干计算周期(数值越大,风干越快) 10 | seasonPeriod: 50 11 | #每次计算时受潮的概率 12 | dampPercent: 0.3 13 | #每次计算时风干的概率 14 | seasonPercent: 0.3 15 | #玩家湿度低于多少背包内物品开始风干 16 | seasonHumidity: 3 17 | #玩家湿度高于多少背包内物品开始潮湿 18 | dampHumidity: 10 19 | 20 | #物品受潮之后变样的设定 21 | wetBlocks: 22 | #格式: 23 | #方块Material名字: 变样的方块Material名字 24 | COBBLESTONE: MOSSY_COBBLESTONE #圆石→苔石 25 | STONE: COBBLESTONE 26 | SAND: GRAVEL 27 | CONCRETE: STAINED_CLAY 28 | DIRT: GRASS 29 | POTATO: POISONOUS_POTATO 30 | WOOL: STRING 31 | BUCKET: WATER_BUCKET 32 | -------------------------------------------------------------------------------- /src/main/resources/plugin.yml: -------------------------------------------------------------------------------- 1 | name: UntilTheEnd 2 | main: ute.UntilTheEnd 3 | version: "Development" 4 | softdepend: 5 | - PlaceholderAPI 6 | - ProtocolLib 7 | - Multiverse-Core 8 | - LibsDisguises 9 | - Citizens 10 | - Vault 11 | authors: 12 | - "南外丶仓鼠" 13 | - "瑞瑞瑞瑞阿" 14 | - "Karlatemp" 15 | commands: 16 | ute: 17 | usage: /ute 18 | #api-version: "1.13" -------------------------------------------------------------------------------- /src/main/resources/roles.yml: -------------------------------------------------------------------------------- 1 | enabled: true 2 | # 是否在玩家死亡的时候重置职业 3 | reset-on-death: true 4 | 5 | # 金币选择 6 | # 需要Vault支持 7 | economy: 8 | enable: false 9 | use-js: false 10 | script: "role-script.js" 11 | coins: 20 12 | 13 | 14 | 15 | default: 16 | name: "未选择" 17 | originLevel: 0 18 | originSanMax: 200 19 | originHealthMax: 20 20 | originDamageLevel: 1.0 21 | wilson: 22 | name: "威尔逊" 23 | originLevel: 0 24 | originSanMax: 200 25 | originHealthMax: 20 26 | originDamageLevel: 1.0 27 | willpw: 28 | name: "薇洛" 29 | originLevel: 0 30 | originSanMax: 120 31 | originHealthMax: 20 32 | originDamageLevel: 1.0 33 | wolfgang: 34 | name: "沃尔夫冈" 35 | originLevel: 0 36 | originSanMax: 200 37 | originHealthMax: 30 38 | originDamageLevel: 1.0 39 | wendy: 40 | name: "温蒂" 41 | originLevel: 0 42 | originSanMax: 250 43 | originHealthMax: 20 44 | originDamageLevel: 0.75 45 | wx78: 46 | name: "AI->WX-78" 47 | originLevel: 0 48 | originSanMax: 100 49 | originHealthMax: 10 50 | originDamageLevel: 1.0 51 | wickerbottom: 52 | name: "维克波顿" 53 | originLevel: 0 54 | originSanMax: 250 55 | originHealthMax: 20 56 | originDamageLevel: 1.0 57 | woodie: 58 | name: "伍迪" 59 | originLevel: 0 60 | originSanMax: 200 61 | originHealthMax: 20 62 | originDamageLevel: 1.0 63 | wes: 64 | name: "维斯" 65 | originLevel: 0 66 | originSanMax: 150 67 | originHealthMax: 15 68 | originDamageLevel: 0.75 69 | wigfrid: 70 | name: "威戈芙瑞德" 71 | originLevel: 0 72 | originSanMax: 120 73 | originHealthMax: 25 74 | originDamageLevel: 1.25 75 | webber: 76 | name: "韦伯" 77 | originLevel: 0 78 | originSanMax: 100 79 | originHealthMax: 22 80 | originDamageLevel: 1.0 81 | maxwell: 82 | name: "麦克斯韦" 83 | originLevel: 0 84 | originSanMax: 200 85 | originHealthMax: 10 86 | originDamageLevel: 1.0 87 | 88 | -------------------------------------------------------------------------------- /src/main/resources/sanity.yml: -------------------------------------------------------------------------------- 1 | #变形范围(东西) 2 | disguiseRangeX: 10.0 3 | #变形范围(上下) 4 | disguiseRangeY: 5.0 5 | #变形范围(南北) 6 | disguiseRangeZ: 10.0 7 | #玩家理智低于多少时,生物开始在玩家眼中变形(0-1) 8 | disguiseSanity: 0.15 9 | #玩家理智低于多少是,开始反胃(0-1) 10 | confusionSanity: 0.6 11 | #玩家理智低于百分之几,移动有几率晕头转向(0-1) 12 | moveWronglySanity: 0.45 13 | #晕头转向的几率 14 | moveWronglyPercent: 0.05 15 | #玩家理智低于多少,说出的话是乱码(0-1) 16 | chatablessSanity: 0.3 17 | 18 | #理智光环判定范围(东西) 19 | auraRangeX: 5.0 20 | #理智光环判定范围(上下) 21 | auraRangeY: 3.0 22 | #理智光环判定范围(南北) 23 | auraRangeZ: 5.0 24 | #玩家周围有怪物时 单位时间auraPeriod 变化的理智值 25 | monsterChangeSanity: -1 26 | #玩家周围有别的玩家 单位时间auraPeriod 内变化的理智值 27 | playerChangeSanity: 1 28 | #单位时间(刻) 29 | auraPeriod: 40 30 | #玩家湿度影响理智多少刻计算一次 31 | humidityPeriod: 100 32 | #世界时间影响理智多少刻计算一次(黑夜为该值*2)(黄昏为该值) 33 | timePeriod: 150 34 | #黄昏开始的时间(MC世界时间刻) 35 | evening: 13000 36 | #黑夜开始的时间(MC世界时间刻) 37 | night: 16000 38 | #白天开始的时间(MC世界时间刻) 39 | day: 23000 40 | 41 | #不同怪物给玩家的光环效果(以单位时间auraPeriod为周期变化) 42 | creatureAura: 43 | #格式 44 | #生物EntityType名: 每单位时间改变的理智值 45 | GHAST: -1 46 | #例如这个是恶魂:-1 47 | #可以再添加 48 | 49 | # 当理智过低时采用的转换格式 50 | # 可选 51 | # v1 - 老版本的方法 52 | # v2 - 稍微有些优化的方法 53 | # OrderDisorder - 只会打乱说话循序 54 | # 55 | # [其他] - [扩展]当做class类处理, 要求实现 Function 56 | # Eg: cn.mcres.karlatemp.ute.ext.ChattingFunc 57 | # # File: ChattingFunc.java 58 | # package cn.mcres.karlatemp.ute.ext; 59 | # import java.util.function.Function; 60 | # public class ChattingFunc implements Function{ 61 | # public String apply(String source) {return "wwwwwwwwwwwwwww";} 62 | # } 63 | function: v2 -------------------------------------------------------------------------------- /src/main/resources/season-tmp.yml: -------------------------------------------------------------------------------- 1 | # 这是定义季节的温度算法文件 2 | # 以下内容的值定义全部统一 3 | # default: 默认 4 | # 其他: 采用js文件 5 | # 6 | # 例如 "spring.js", 将使用 plugins/UntilTheEnd/scripts/spring.js 7 | # 例如 "summer.js", 将使用 plugins/UntilTheEnd/scripts/summer.js 8 | # 关于自定义公式, 请看 9 | # https://www.w3school.com.cn/jsref/jsref_obj_math.asp 10 | # https://www.runoob.com/jsref/jsref-obj-math.html 11 | # https://www.runoob.com/js/js-obj-math.html 12 | 13 | spring: default 14 | summer: default 15 | autumn: default 16 | winter: default -------------------------------------------------------------------------------- /src/main/resources/temperature.yml: -------------------------------------------------------------------------------- 1 | enable: 2 | smoulder: false #是否开启闷烧 3 | fmChange: false #是否开启温度改变方块 4 | 5 | #闷烧的几率(大于0小于1) 6 | smoulderPercent: 0.05 7 | #闷烧计算的数量(数值越小,闷烧出现越频繁) 8 | smoulderSpeed: 20 9 | #闷烧开始后到方块开始着火的可熄灭时间 10 | smoulderTimeout: 200 11 | #踩灭闷烧的玩家将得到多久的燃烧效果 12 | smoulderCancellerFireTicks: 40 13 | #寒冷标准温度(低于这个温度判定为寒冷状态,开始扣血+缓慢) 14 | coldTem: 10 15 | #炎热标准温度(高于这个温度判定为炎热状态,开始扣血+闷烧) 16 | hotTem: 55 17 | #有暖石的玩家温度随暖石变化的速度(越小变化越快,反之变化越慢) 18 | temperatureChangeSpeedStone: 1 19 | #没有暖石的玩家温度随环境变化的速度(越小变化越快,反之变化越慢) 20 | temperatureChangeSpeedNatural: 5 21 | #暖石温度随自然变化的速率(大于0小于1) 22 | stoneChangePercent: 0.1 23 | #玩家温度随湿度的变化速度(数值越小,变化越快,反之变化越慢) 24 | humidityChangeSpeed: 150 25 | #每多少刻判定一次温度影响方块(影响的方块在fmBlocks下设置) 26 | fmChangeSpeed: 200 27 | 28 | #方块的温度(没有设置的方块为环境温度) 29 | blockTemperature: 30 | #方块Material名字: 温度 31 | LAVA: 75 32 | STATIONARY_LAVA: 75 33 | FIRE: 75 34 | FROSTED_ICE: 0 35 | ICE: 0 36 | PACKED_ICE: 0 37 | NETHERRACK: 55 38 | SOUL_SAND: 65 39 | MAGMA: 75 40 | BEACON: 37 41 | ENDER_STONE: 0 42 | #可以继续添加 43 | 44 | #随着温度变化,背包内物品也变化的方块设定 45 | fmBlocks: 46 | #格式: 47 | #物品Material名: 48 | # increase: true/false (true代表高于温度变化,false代表低于温度变化) 49 | # temperature: 0 (高于/低于某个温度时变化) 50 | # newBlock: 变化成的新物品的Material名 51 | WATER_BUCKET: 52 | increase: false 53 | temperature: 0 54 | newMaterial: ICE 55 | ICE: 56 | increase: true 57 | temperature: 10 58 | newMaterial: AIR 59 | MAGMA: 60 | increase: false 61 | temperature: 40 62 | newMaterial: NETHERRACK 63 | LAVA_BUCKET: 64 | increase: false 65 | temperature: 40 66 | newMaterial: OBSIDIAN 67 | ENDER_STONE: 68 | increase: true 69 | temperature: 20 70 | newMaterial: STONE 71 | STONE: 72 | increase: true 73 | temperature: 50 74 | newMaterial: COBBLESTONE 75 | SOUL_SAND: 76 | increase: false 77 | temperature: 40 78 | newMaterial: SAND 79 | FIRE: 80 | increase: false 81 | temperature: 10 82 | newMaterial: AIR -------------------------------------------------------------------------------- /src/main/resources/tiredness.yml: -------------------------------------------------------------------------------- 1 | change: 2 | task: #每2秒计算一次 3 | sprint: 1 #疾跑疲劳+2 4 | sit: -2 #左下疲劳-2 5 | sleep: -4 #睡觉疲劳-4 6 | block: 0.5 #正在敲打方块疲劳+2 7 | glide: 1.5 #正在滑翔+3 8 | move: 0.2 #正在移动+1 9 | stop: -0.2 #停在原地较长时间-1 10 | item: #背包内物品重量 11 | #格式: 12 | #物品Material名: 权重 13 | DIAMOND: 0.1 #钻石每一个增加的疲劳 14 | GOLD_INGOT: 0.2 #金锭每一个增加的疲劳 15 | default: 0 #背包其它未定义物品每一个增加的疲劳值 16 | event: #每次事件计算一次 17 | teleport: 1.5 #传送+3 18 | break: 0.5 #破坏方块 19 | chat: 0.2 #发言 20 | tab: 1 #TAB补全 21 | damage: 0.5 #伤害别的生物 22 | beDamaged: 0.5 #被生物伤害 23 | enchant: 5 #附魔 24 | 25 | influence: 26 | slowness: 50 #高于多少开始有缓慢效果(效果等级为 (疲劳-该值)/15) 27 | slowdigging: 50 #高于多少开始有挖掘缓慢效果(效果等级为 (疲劳-该值)/15) 28 | hunger: 75 #高于多少开始有饥饿效果(效果等级为 (疲劳-该值)/5) 29 | wither: 90 #高于多少开始有凋零效果(效果等级为 (疲劳-该值)/5) 30 | weak: 50 #高于多少开始有虚弱效果(效果等级为 (疲劳-该值)/15) 31 | event: 32 | talk: 70 #高于该值则不能说话 33 | sprint: 50 #高于该值则不能疾跑 34 | attack: 50 #高于该值则不能攻击 35 | place: 70 #高于该值则不能放置物品 36 | break: 70 #高于该值则不能破坏 37 | teleport: 25 #高于该值则不能传送 --------------------------------------------------------------------------------