Multiloader on Cloche #1

closed
opened by lesbian.skin targeting master from push-zsprnqmwvuxm

Move to a 1.20.1 Forge/Fabric multiloader setup using cloche to improve maintainability

Changed files
+659 -382
src
common
main
resources
assets
data
fabric
forge
main
-16
src/main/kotlin/xyz/naomieow/asbestos/AsbestosModClient.kt
···
-
package xyz.naomieow.asbestos
-
-
import net.fabricmc.api.ClientModInitializer
-
import net.fabricmc.api.EnvType
-
import net.fabricmc.api.Environment
-
import net.minecraft.client.gui.screens.MenuScreens
-
import xyz.naomieow.asbestos.screen.CancerMeterScreen
-
import xyz.naomieow.asbestos.screen.ModMenuTypes
-
-
@Environment(EnvType.CLIENT)
-
class AsbestosModClient : ClientModInitializer {
-
override fun onInitializeClient() {
-
MenuScreens.register(ModMenuTypes.CancerMeter, ::CancerMeterScreen)
-
}
-
-
}
+24
src/main/kotlin/xyz/naomieow/asbestos/client/AsbestosModClient.kt
···
+
package xyz.naomieow.asbestos.client
+
+
import net.fabricmc.api.ClientModInitializer
+
import net.fabricmc.api.EnvType
+
import net.fabricmc.api.Environment
+
import net.minecraft.client.gui.screens.MenuScreens
+
import net.minecraft.resources.ResourceLocation
+
import xyz.naomieow.asbestos.client.screen.CancerMeterScreen
+
import xyz.naomieow.asbestos.client.screen.ModMenuTypes
+
+
const val MOD_ID: String = "asbestos"
+
+
internal inline fun id(path: String): ResourceLocation {
+
return ResourceLocation(MOD_ID, path)
+
}
+
+
@Environment(EnvType.CLIENT)
+
class AsbestosModClient : ClientModInitializer {
+
override fun onInitializeClient() {
+
ModMenuTypes.register()
+
MenuScreens.register(ModMenuTypes.CancerMeter, ::CancerMeterScreen)
+
}
+
+
}
+67
src/main/kotlin/xyz/naomieow/asbestos/client/ModMenuIntegration.kt
···
+
package xyz.naomieow.asbestos.client
+
+
import com.terraformersmc.modmenu.api.ConfigScreenFactory
+
import com.terraformersmc.modmenu.api.ModMenuApi
+
import dev.isxander.yacl3.api.ConfigCategory
+
import dev.isxander.yacl3.api.Option
+
import dev.isxander.yacl3.api.OptionDescription
+
import dev.isxander.yacl3.api.YetAnotherConfigLib
+
import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder
+
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder
+
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder
+
import net.minecraft.network.chat.Component
+
import xyz.naomieow.asbestos.config.AsbestosConfig.Companion.exsanguination
+
import xyz.naomieow.asbestos.config.AsbestosConfig.Companion.offset
+
import xyz.naomieow.asbestos.config.AsbestosConfig.Companion.period
+
import xyz.naomieow.asbestos.config.AsbestosConfig.Companion.threshold
+
+
class ModMenuIntegration: ModMenuApi {
+
override fun getModConfigScreenFactory(): ConfigScreenFactory<*> {
+
return ConfigScreenFactory { parent ->
+
YetAnotherConfigLib.createBuilder()
+
.title(Component.translatable("text.config.asbestos_config.title"))
+
.category(ConfigCategory.createBuilder()
+
.name(Component.translatable("text.config.asbestos_config.title"))
+
.option(Option.createBuilder<Int>()
+
.name(Component.translatable("text.config.asbestos_config.option.offset"))
+
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.offset.desc")))
+
.binding(3, { offset }) { value ->
+
offset = value
+
}
+
.controller {
+
IntegerSliderControllerBuilder
+
.create(it)
+
.step(1)
+
.range(0, 32)
+
}
+
.build())
+
.option(Option.createBuilder<Float>()
+
.name(Component.translatable("text.config.asbestos_config.option.period"))
+
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.period.desc")))
+
.binding(5.0f, { period }) { value ->
+
period = value
+
}
+
.controller(FloatFieldControllerBuilder::create)
+
.build())
+
.option(Option.createBuilder<Int>()
+
.name(Component.translatable("text.config.asbestos_config.option.threshold"))
+
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.threshold.desc")))
+
.binding(180, { threshold }) { value ->
+
threshold = value
+
}
+
.controller(IntegerFieldControllerBuilder::create)
+
.build())
+
.option(Option.createBuilder<Float>()
+
.name(Component.translatable("text.config.asbestos_config.option.exsanguination"))
+
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.exsanguination.desc")))
+
.binding(1.0f, { exsanguination }) { value ->
+
exsanguination = value
+
}
+
.controller(FloatFieldControllerBuilder::create)
+
.build())
+
.build())
+
.build()
+
.generateScreen(parent)
+
}
+
}
+
}
+3 -3
src/main/kotlin/xyz/naomieow/asbestos/screen/CancerMeterScreen.kt src/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreen.kt
···
-
package xyz.naomieow.asbestos.screen
+
package xyz.naomieow.asbestos.client.screen
import net.fabricmc.api.EnvType
import net.fabricmc.api.Environment
···
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Inventory
-
import xyz.naomieow.asbestos.id
+
import xyz.naomieow.asbestos.client.screen.util.MouseUtil
+
import xyz.naomieow.asbestos.client.id
import xyz.naomieow.asbestos.config.AsbestosConfig
-
import xyz.naomieow.asbestos.screen.util.MouseUtil
import java.util.Optional
@Environment(EnvType.CLIENT)
+1 -1
src/main/kotlin/xyz/naomieow/asbestos/screen/CancerMeterScreenHandler.kt src/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreenHandler.kt
···
-
package xyz.naomieow.asbestos.screen
+
package xyz.naomieow.asbestos.client.screen
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.world.entity.EquipmentSlot
-61
src/main/kotlin/xyz/naomieow/asbestos/config/AsbestosConfig.kt
···
package xyz.naomieow.asbestos.config
-
import dev.isxander.yacl3.api.ConfigCategory
-
import dev.isxander.yacl3.api.Option
-
import dev.isxander.yacl3.api.OptionDescription
-
import dev.isxander.yacl3.api.YetAnotherConfigLib
-
import dev.isxander.yacl3.api.controller.ControllerBuilder
-
import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder
-
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder
-
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder
import dev.isxander.yacl3.config.v2.api.ConfigClassHandler
import dev.isxander.yacl3.config.v2.api.SerialEntry
import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder
-
import dev.isxander.yacl3.dsl.binding
-
import dev.isxander.yacl3.dsl.controller
-
import dev.isxander.yacl3.gui.controllers.slider.IntegerSliderController
-
import dev.isxander.yacl3.impl.YetAnotherConfigLibImpl
import net.fabricmc.loader.api.FabricLoader
-
import net.minecraft.client.gui.screens.Screen
-
import net.minecraft.network.chat.Component
import xyz.naomieow.asbestos.id
class AsbestosConfig {
···
@SerialEntry
var exsanguination: Float = 1.0f
-
fun screen(parent: Screen?): Screen {
-
return YetAnotherConfigLib.createBuilder()
-
.title(Component.translatable("text.config.asbestos_config.title"))
-
.category(ConfigCategory.createBuilder()
-
.name(Component.translatable("text.config.asbestos_config.title"))
-
.option(Option.createBuilder<Int>()
-
.name(Component.translatable("text.config.asbestos_config.option.offset"))
-
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.offset.desc")))
-
.binding(3, { offset }) { value ->
-
offset = value
-
}
-
.controller {
-
IntegerSliderControllerBuilder
-
.create(it)
-
.step(1)
-
.range(0, 32)
-
}
-
.build())
-
.option(Option.createBuilder<Float>()
-
.name(Component.translatable("text.config.asbestos_config.option.period"))
-
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.period.desc")))
-
.binding(5.0f, { period }) { value ->
-
period = value
-
}
-
.controller(FloatFieldControllerBuilder::create)
-
.build())
-
.option(Option.createBuilder<Int>()
-
.name(Component.translatable("text.config.asbestos_config.option.threshold"))
-
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.threshold.desc")))
-
.binding(180, { threshold }) { value ->
-
threshold = value
-
}
-
.controller(IntegerFieldControllerBuilder::create)
-
.build())
-
.option(Option.createBuilder<Float>()
-
.name(Component.translatable("text.config.asbestos_config.option.exsanguination"))
-
.description(OptionDescription.of(Component.translatable("text.config.asbestos_config.option.exsanguination.desc")))
-
.binding(1.0f, { exsanguination }) { value ->
-
exsanguination = value
-
}
-
.controller(FloatFieldControllerBuilder::create)
-
.build())
-
.build())
-
.build()
-
.generateScreen(parent)
-
}
-
val Handler: ConfigClassHandler<AsbestosConfig> = ConfigClassHandler.createBuilder(AsbestosConfig::class.java)
.id(id("asbestos_config"))
.serializer { config ->
-13
src/main/kotlin/xyz/naomieow/asbestos/config/ModMenuIntegration.kt
···
-
package xyz.naomieow.asbestos.config
-
-
import com.terraformersmc.modmenu.api.ConfigScreenFactory
-
import com.terraformersmc.modmenu.api.ModMenuApi
-
import net.minecraft.client.gui.screens.Screen
-
-
class ModMenuIntegration: ModMenuApi {
-
override fun getModConfigScreenFactory(): ConfigScreenFactory<*> {
-
return ConfigScreenFactory { parent ->
-
AsbestosConfig.screen(parent)
-
}
-
}
-
}
+1 -1
src/main/kotlin/xyz/naomieow/asbestos/inventory/CancerMeterInventory.kt
···
import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
-
import xyz.naomieow.asbestos.screen.CancerMeterScreenHandler
+
import xyz.naomieow.asbestos.client.screen.CancerMeterScreenHandler
class CancerMeterInventory(
private var stack: ItemStack,
+43
src/common/main/kotlin/xyz/naomieow/asbestos/Asbestos.kt
···
+
package xyz.naomieow.asbestos
+
+
import dev.mayaqq.cynosure.events.api.EventSubscriber
+
import net.minecraft.core.registries.Registries
+
import net.minecraft.resources.ResourceKey
+
import net.minecraft.resources.ResourceLocation
+
import net.minecraft.world.level.block.Block
+
import net.minecraft.world.level.levelgen.placement.PlacedFeature
+
import org.slf4j.Logger
+
import org.slf4j.LoggerFactory
+
import uwu.serenity.kritter.RegistryManager
+
import xyz.naomieow.asbestos.block.AsbestosBlocks
+
import xyz.naomieow.asbestos.item.AsbestosCreativeTabs
+
import xyz.naomieow.asbestos.item.AsbestosItems
+
import xyz.naomieow.asbestos.mob_effect.AsbestosMobEffects
+
+
public const val MOD_ID: String = "asbestos"
+
public const val MOD_NAME: String = "Carcinogenic Fibrous Silicate"
+
+
@Suppress("NOTHING_TO_INLINE")
+
public inline fun id(path: String): ResourceLocation {
+
return ResourceLocation(MOD_ID, path)
+
}
+
+
@EventSubscriber
+
public object Asbestos:
+
Logger by LoggerFactory.getLogger(MOD_NAME),
+
RegistryManager by RegistryManager(MOD_ID)
+
{
+
public val harmfulPassiveBlocks: Array<Block> by lazy { arrayOf(AsbestosBlocks.AsbestosBlock) }
+
public val serpentinitePlacedKey: ResourceKey<PlacedFeature> = ResourceKey.create(
+
Registries.PLACED_FEATURE,
+
id("serpentinite")
+
)
+
+
public fun init() {
+
AsbestosMobEffects.register()
+
AsbestosBlocks.register()
+
AsbestosItems.register()
+
AsbestosCreativeTabs.register()
+
info("Now entitled to financial compensation..")
+
}
+
}
+3 -3
src/main/kotlin/xyz/naomieow/asbestos/armor/ProtectiveMaterial.kt src/common/main/kotlin/xyz/naomieow/asbestos/armor/ProtectiveMaterial.kt
···
import net.minecraft.world.item.Items
import net.minecraft.world.item.crafting.Ingredient
-
class ProtectiveMaterial : ArmorMaterial {
+
public class ProtectiveMaterial : ArmorMaterial {
override fun getDurabilityForType(type: ArmorItem.Type): Int {
return BASE_DURABILITY[type.slot.index]
}
···
return 0f
}
-
companion object {
+
public companion object {
private val BASE_DURABILITY = intArrayOf(13, 15, 16, 11)
private val PROTECTION_VALUES = intArrayOf(1, 1, 2, 1)
-
val INSTANCE: ProtectiveMaterial = ProtectiveMaterial()
+
public val INSTANCE: ProtectiveMaterial = ProtectiveMaterial()
}
}
+8 -8
src/main/kotlin/xyz/naomieow/asbestos/block/ModBlocks.kt src/common/main/kotlin/xyz/naomieow/asbestos/block/AsbestosBlocks.kt
···
import net.minecraft.world.level.block.Blocks
import uwu.serenity.kritter.api.Registrar
import uwu.serenity.kritter.stdlib.block
-
import xyz.naomieow.asbestos.AsbestosMod
+
import xyz.naomieow.asbestos.Asbestos
@Suppress("UNUSED")
-
object ModBlocks: Registrar<Block> by AsbestosMod..Registries.BLOCK {
-
val AsbestosBlock: Block by block("asbestos_block", { properties ->
+
public object AsbestosBlocks: Registrar<Block> by Asbestos..Registries.BLOCK {
+
public val AsbestosBlock: Block by block("asbestos_block", { properties ->
CarcinogenicBlock(properties, 40)
}) {
copyProperties(Blocks::WHITE_WOOL)
···
}
}
-
val SerpentiniteBlock: Block by block("serpentinite_block", { properties ->
+
public val SerpentiniteBlock: Block by block("serpentinite_block", { properties ->
CarcinogenicBlock(properties, 20)
}) {
copyProperties(Blocks::STONE)
···
}
}
-
val PopcornCeilingBlock: Block by block("popcorn_ceiling_block", { properties ->
+
public val PopcornCeilingBlock: Block by block("popcorn_ceiling_block", { properties ->
CarcinogenicBlock(properties, 20)
}) {
copyProperties(Blocks::OAK_PLANKS)
···
}
}
-
val AsbestosTileBlock: Block by block("asbestos_tile_block", { properties ->
+
public val AsbestosTileBlock: Block by block("asbestos_tile_block", { properties ->
CarcinogenicBlock(properties, 20)
}) {
copyProperties(Blocks::NETHER_BRICKS)
···
}
}
-
val AsbestosRoofBlock: Block by block("asbestos_roof_block", { properties ->
-
CarcinogenicBlock(properties, 20)
+
public val AsbestosRoofBlock: Block by block("asbestos_roof_block", { properties ->
+
AsbestosRoofBlock(properties, 20)
}) {
copyProperties { AsbestosTileBlock }
properties {
+9 -10
src/main/kotlin/xyz/naomieow/asbestos/block/AsbestosRoofBlock.kt src/common/main/kotlin/xyz/naomieow/asbestos/block/AsbestosRoofBlock.kt
···
package xyz.naomieow.asbestos.block
-
import net.fabricmc.api.EnvType
-
import net.fabricmc.api.Environment
-
import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap
-
import net.fabricmc.loader.api.FabricLoader
-
import net.minecraft.client.renderer.RenderType
+
//import net.fabricmc.api.EnvType
+
//import net.fabricmc.api.Environment
+
//import net.fabricmc.fabric.api.blockrenderlayer.v1.BlockRenderLayerMap
+
//import net.fabricmc.loader.api.FabricLoader
+
//import net.minecraft.client.renderer.RenderType
import net.minecraft.core.BlockPos
import net.minecraft.core.Direction
import net.minecraft.world.item.context.BlockPlaceContext
···
import net.minecraft.world.phys.shapes.Shapes
import net.minecraft.world.phys.shapes.VoxelShape
-
class AsbestosRoofBlock(settings: Properties, dangerLevel: Int) : CarcinogenicBlock(settings, dangerLevel) {
+
public class AsbestosRoofBlock(settings: Properties, dangerLevel: Int) : CarcinogenicBlock(settings, dangerLevel) {
init {
registerDefaultState(
this.getStateDefinition().any()
.setValue<Direction?, Direction?>(BlockStateProperties.HORIZONTAL_FACING, Direction.NORTH)
)
-
if (FabricLoader.getInstance().environmentType != EnvType.SERVER) {
-
BlockRenderLayerMap.INSTANCE.putBlock(this, RenderType.cutout())
-
}
+
// if (FabricLoader.getInstance().environmentType != EnvType.SERVER) {
+
// BlockRenderLayerMap.INSTANCE.putBlock(this, RenderType.cutout())
+
// }
}
override fun createBlockStateDefinition(builder: StateDefinition.Builder<Block?, BlockState?>) {
···
}
@Deprecated("Deprecated in Java")
-
@Environment(EnvType.CLIENT)
override fun getShadeBrightness(state: BlockState, world: BlockGetter, pos: BlockPos): Float {
return 1.0f
}
+54
src/common/main/kotlin/xyz/naomieow/asbestos/block/CarcinogenicBlock.kt
···
+
package xyz.naomieow.asbestos.block
+
+
import net.minecraft.core.BlockPos
+
import net.minecraft.server.level.ServerLevel
+
import net.minecraft.util.RandomSource
+
import net.minecraft.world.entity.player.Player
+
import net.minecraft.world.item.Item
+
import net.minecraft.world.level.Level
+
import net.minecraft.world.level.block.Block
+
import net.minecraft.world.level.block.state.BlockState
+
import xyz.naomieow.asbestos.config.AsbestosConfig
+
import xyz.naomieow.asbestos.item.AsbestosItems
+
import xyz.naomieow.asbestos.util.toVector3i
+
import xyz.naomieow.asbestos.mesothelioma.getMesothelioma
+
import xyz.naomieow.asbestos.mesothelioma.setMesothelioma
+
import kotlin.math.sqrt
+
+
public open class CarcinogenicBlock(settings: Properties, private val dangerLevel: Int) : Block(settings) {
+
override fun playerWillDestroy(world: Level, pos: BlockPos, state: BlockState, player: Player) {
+
super.playerWillDestroy(world, pos, state, player)
+
if (!isProtectedFromAsbestos(player)) {
+
val exposure = player.getMesothelioma()
+
player.setMesothelioma(exposure + 1)
+
}
+
}
+
+
@Deprecated("Deprecated in Java")
+
override fun tick(state: BlockState, level: ServerLevel, pos: BlockPos, random: RandomSource) {
+
if (level.server.tickCount % (AsbestosConfig.period * 20.0f) != 0.0f) return
+
level.players().forEach { player ->
+
val dist = sqrt(pos.distSqr(player.position().toVector3i()))
+
if (dist > AsbestosConfig.offset || isProtectedFromAsbestos(player)) return@forEach
+
}
+
+
}
+
+
public companion object {
+
public val PROTECTIVE_ARMOUR: Array<Item> by lazy { arrayOf<Item>(
+
AsbestosItems.PPEHelmet,
+
AsbestosItems.PPEChestplate,
+
AsbestosItems.PPELeggings,
+
AsbestosItems.PPEBoots
+
) }
+
+
public fun isProtectedFromAsbestos(player: Player): Boolean {
+
for (item in player.armorSlots) {
+
if (!listOf(*PROTECTIVE_ARMOUR).contains(item.item)) {
+
return false
+
}
+
}
+
return true
+
}
+
}
+
}
+10
src/common/main/kotlin/xyz/naomieow/asbestos/client/AsbestosClient.kt
···
+
@file:EventSubscriber(env = [Environment.CLIENT])
+
package xyz.naomieow.asbestos.client
+
+
import dev.mayaqq.cynosure.core.Environment
+
import dev.mayaqq.cynosure.events.api.EventSubscriber
+
import xyz.naomieow.asbestos.client.screen.ModMenuTypes
+
+
public fun asbestosClient() {
+
ModMenuTypes.register()
+
}
+9 -12
src/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreen.kt src/common/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreen.kt
···
package xyz.naomieow.asbestos.client.screen
-
import net.fabricmc.api.EnvType
-
import net.fabricmc.api.Environment
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.screens.inventory.AbstractContainerScreen
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.entity.player.Inventory
-
import xyz.naomieow.asbestos.client.screen.util.MouseUtil
-
import xyz.naomieow.asbestos.client.id
import xyz.naomieow.asbestos.config.AsbestosConfig
+
import xyz.naomieow.asbestos.id
+
import xyz.naomieow.asbestos.util.MouseUtil
import java.util.Optional
-
@Environment(EnvType.CLIENT)
-
class CancerMeterScreen(
+
public class CancerMeterScreen(
abstractContainerMenu: CancerMeterScreenHandler,
inventory: Inventory,
component: Component,
···
inventory,
component
) {
-
private val TEXTURE: ResourceLocation = id("textures/gui/cancer_meter.png")
-
var screenHandler = abstractContainerMenu;
+
private val texture: ResourceLocation = id("textures/gui/cancer_meter.png")
+
public var screenHandler: CancerMeterScreenHandler = abstractContainerMenu;
override fun render(context: GuiGraphics, mouseX: Int, mouseY: Int, delta: Float) {
renderBackground(context)
···
val x = (width - imageWidth) / 2
val y = (height - imageHeight) / 2
context.blit(
-
TEXTURE,
+
texture,
x, y,
0, 0,
imageWidth,
···
font,
listOf(
Component.literal(
-
screenHandler.getCancerMeter().toString() + "/" + AsbestosConfig.threshold
+
screenHandler.getCancerMeter().toString() + "/" + AsbestosConfig.Companion.threshold
)
),
Optional.empty(),
···
}
private fun drawCancerProgress(context: GuiGraphics, x: Int, y: Int) {
-
val offset = screenHandler.getCancerMeter() * 58 / AsbestosConfig.threshold
+
val offset = screenHandler.getCancerMeter() * 58 / AsbestosConfig.Companion.threshold
context.blit(
-
TEXTURE,
+
texture,
x, y,
176, 56,
offset, 7
+16 -14
src/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreenHandler.kt src/common/main/kotlin/xyz/naomieow/asbestos/client/screen/CancerMeterScreenHandler.kt
···
import net.minecraft.world.item.ItemStack
import xyz.naomieow.asbestos.inventory.CancerMeterInventory
import xyz.naomieow.asbestos.inventory.ICancerMeterInventory
+
import xyz.naomieow.asbestos.item.AsbestosItems
import xyz.naomieow.asbestos.item.CancerMeterItem
-
import xyz.naomieow.asbestos.item.ModItems
-
import java.util.*
+
import java.util.Objects
-
class CancerMeterScreenHandler(
-
type: MenuType<*>,
+
public class CancerMeterScreenHandler(
syncId: Int,
-
var playerInventory: Inventory,
-
var inventory: ICancerMeterInventory,
-
): AbstractContainerMenu(type, syncId) {
-
constructor(
+
public var playerInventory: Inventory
+
): AbstractContainerMenu(ModMenuTypes.CancerMeter, syncId) {
+
public lateinit var inventory: ICancerMeterInventory
+
+
public constructor(
syncId: Int,
playerInventory: Inventory,
buf: FriendlyByteBuf
): this(syncId, playerInventory, createInventory(playerInventory, buf))
-
constructor(
+
public constructor(
syncId: Int,
playerInventory: Inventory,
inventory: ICancerMeterInventory,
-
): this(ModMenuTypes.CancerMeter, syncId, playerInventory, inventory)
+
): this(syncId, playerInventory) {
+
this.inventory = inventory
+
}
init {
addSlot(object : Slot(inventory.getInventory(), 0, 80, 54) {
override fun mayPlace(stack: ItemStack): Boolean {
-
return stack.`is`(ModItems.FilledSyringe)
+
return stack.`is`(AsbestosItems.FilledSyringe)
}
})
···
return ItemStack.EMPTY
}
slot.onQuickCraft(stackInSlot, itemStack)
-
} else if (itemStack.`is`(ModItems.FilledSyringe)) {
+
} else if (itemStack.`is`(AsbestosItems.FilledSyringe)) {
if (!this.moveItemStackTo(stackInSlot, 0, 1, false)) {
return ItemStack.EMPTY
}
···
}
}
-
fun getCancerMeter(): Int {
+
public fun getCancerMeter(): Int {
val nbt = this.inventory.getInventory().getItem(0).getOrCreateTag()
return if (nbt.contains("CancerMeter")) nbt.getInt("CancerMeter") else 0
}
-
companion object {
+
private companion object {
private const val INVENTORY_START: Int = 1
private const val INVENTORY_END: Int = 28
private const val HOTBAR_START: Int = 28
+12
src/common/main/kotlin/xyz/naomieow/asbestos/client/screen/ModMenuTypes.kt
···
+
package xyz.naomieow.asbestos.client.screen
+
+
import net.minecraft.core.registries.Registries
+
import net.minecraft.world.flag.FeatureFlags
+
import net.minecraft.world.inventory.MenuType
+
import uwu.serenity.kritter.api.Registrar
+
import uwu.serenity.kritter.api.entry
+
import xyz.naomieow.asbestos.Asbestos
+
+
public object ModMenuTypes: Registrar<MenuType<*>> by Asbestos..Registries.MENU {
+
public val CancerMeter: MenuType<CancerMeterScreenHandler> by entry("cancer_meter", {MenuType(::CancerMeterScreenHandler, FeatureFlags.DEFAULT_FLAGS)})
+
}
+10 -11
src/main/kotlin/xyz/naomieow/asbestos/config/AsbestosConfig.kt src/common/main/kotlin/xyz/naomieow/asbestos/config/AsbestosConfig.kt
···
import dev.isxander.yacl3.config.v2.api.ConfigClassHandler
import dev.isxander.yacl3.config.v2.api.SerialEntry
import dev.isxander.yacl3.config.v2.api.serializer.GsonConfigSerializerBuilder
-
import net.fabricmc.loader.api.FabricLoader
+
import dev.isxander.yacl3.platform.YACLPlatform
import xyz.naomieow.asbestos.id
-
class AsbestosConfig {
-
companion object {
+
public class AsbestosConfig {
+
public companion object {
@JvmField
@SerialEntry
-
var offset: Int = 3
+
public var offset: Int = 3
@JvmField
@SerialEntry
-
var period: Float = 5.0f
+
public var period: Float = 5.0f
@JvmField
@SerialEntry
-
var threshold: Int = 180
+
public var threshold: Int = 180
@JvmField
@SerialEntry
-
var exsanguination: Float = 1.0f
+
public var exsanguination: Float = 1.0f
-
val Handler: ConfigClassHandler<AsbestosConfig> = ConfigClassHandler.createBuilder(AsbestosConfig::class.java)
+
public val Handler: ConfigClassHandler<AsbestosConfig> = ConfigClassHandler.createBuilder(AsbestosConfig::class.java)
.id(id("asbestos_config"))
.serializer { config ->
GsonConfigSerializerBuilder.create(config)
-
.setPath(FabricLoader
-
.getInstance()
-
.configDir
+
.setPath(YACLPlatform
+
.getConfigDir()
.resolve("asbestos.json5")
)
.setJson5(true)
+4 -4
src/main/kotlin/xyz/naomieow/asbestos/damage/ModDamageTypes.kt src/common/main/kotlin/xyz/naomieow/asbestos/damage/AsbestosDamageTypes.kt
···
import net.minecraft.world.level.Level
import xyz.naomieow.asbestos.id
-
object ModDamageTypes {
-
val MESOTHELIOMA: ResourceKey<DamageType> = ResourceKey.create(
+
public object AsbestosDamageTypes {
+
public val MESOTHELIOMA: ResourceKey<DamageType> = ResourceKey.create(
Registries.DAMAGE_TYPE,
id("mesothelioma")
)
-
val BLOOD_EXTRACT: ResourceKey<DamageType> = ResourceKey.create(
+
public val BLOOD_EXTRACT: ResourceKey<DamageType> = ResourceKey.create(
Registries.DAMAGE_TYPE,
id("blood_extract")
)
-
fun of(level: Level, key: ResourceKey<DamageType>): DamageSource {
+
public fun of(level: Level, key: ResourceKey<DamageType>): DamageSource {
return DamageSource(level
.registryAccess()
.registryOrThrow(Registries.DAMAGE_TYPE)
+13 -28
src/main/kotlin/xyz/naomieow/asbestos/inventory/CancerMeterInventory.kt src/common/main/kotlin/xyz/naomieow/asbestos/inventory/CancerMeterInventory.kt
···
package xyz.naomieow.asbestos.inventory
-
import net.fabricmc.fabric.api.screenhandler.v1.ExtendedScreenHandlerFactory
import net.minecraft.core.NonNullList
import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag
-
import net.minecraft.network.FriendlyByteBuf
import net.minecraft.network.chat.Component
-
import net.minecraft.server.level.ServerPlayer
-
import net.minecraft.world.entity.player.Inventory
+
import net.minecraft.world.SimpleMenuProvider
import net.minecraft.world.entity.player.Player
-
import net.minecraft.world.inventory.AbstractContainerMenu
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
import xyz.naomieow.asbestos.client.screen.CancerMeterScreenHandler
-
class CancerMeterInventory(
+
public class CancerMeterInventory(
private var stack: ItemStack,
private val player: Player,
private val screenId: Byte,
···
readAllData(stack.orCreateTag)
}
-
fun setStack(itemStack: ItemStack) {
+
public fun setStack(itemStack: ItemStack) {
stack = itemStack
}
···
}
}
-
companion object {
-
fun openHandledScreen(player: Player, stack: ItemStack, screenID: Byte) {
+
public companion object {
+
public fun openHandledScreen(player: Player, stack: ItemStack, screenID: Byte) {
if (!player.level().isClientSide()) {
-
player.openMenu(object : ExtendedScreenHandlerFactory {
-
override fun writeScreenOpeningData(player: ServerPlayer, buf: FriendlyByteBuf) {
-
buf.writeByte(screenID.toInt())
-
}
-
-
override fun getDisplayName(): Component {
-
return Component.translatable("screen.asbestos.cancer_meter")
-
}
-
-
override fun createMenu(
-
syncId: Int,
-
playerInventory: Inventory,
-
player: Player
-
): AbstractContainerMenu {
-
return CancerMeterScreenHandler(
-
syncId,
-
playerInventory,
+
player.openMenu(SimpleMenuProvider(
+
{id, inventory, player ->
+
CancerMeterScreenHandler(
+
id,
+
inventory,
CancerMeterInventory(stack, player, screenID)
)
-
}
-
})
+
},
+
Component.translatable("screen.asbestos.cancer_meter")
+
))
}
}
+27
src/common/main/kotlin/xyz/naomieow/asbestos/inventory/ICancerMeterInventory.kt
···
+
package xyz.naomieow.asbestos.inventory
+
+
import net.minecraft.nbt.CompoundTag
+
import net.minecraft.world.entity.player.Player
+
import net.minecraft.world.item.ItemStack
+
import net.minecraft.world.level.Level
+
+
public interface ICancerMeterInventory {
+
public fun writeItems(tag: CompoundTag)
+
public fun readItems(tag: CompoundTag)
+
public fun writeAllData(tag: CompoundTag)
+
public fun readAllData(tag: CompoundTag)
+
public fun getInventory(): InventoryImproved
+
public fun getScreenID(): Byte
+
public fun getLevel(): Level
+
public fun getItemStack(): ItemStack
+
public fun setUsingPlayer(player: Player?)
+
public fun markDataDirty(vararg dataIds: Byte)
+
public fun markDirty()
+
+
public companion object {
+
public const val INVENTORY_DATA: Byte = 0
+
public const val COMBINED_INVENTORY_DATA: Byte = 1
+
public const val SLOT_DATA: Byte = 2
+
public const val ALL_DATA: Byte = 3
+
}
+
}
+4 -4
src/main/kotlin/xyz/naomieow/asbestos/inventory/InventoryImproved.kt src/common/main/kotlin/xyz/naomieow/asbestos/inventory/InventoryImproved.kt
···
import net.minecraft.world.ContainerHelper
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.ItemStack
-
import xyz.naomieow.asbestos.item.ModItems
+
import xyz.naomieow.asbestos.item.AsbestosItems
/*
* Converted from Tiviacz1337's InventoryImproved from Travelers Backpack:
* https://github.com/Tiviacz1337/Travelers-Backpack/blob/3dc0bfeec381537a5ce85c2ae1e6e00d62542206/src/main/java/com/tiviacz/travelersbackpack/inventory/InventoryImproved.java
*/
-
abstract class InventoryImproved(
+
public abstract class InventoryImproved(
@get:JvmName("getInventoryStacks")
protected var stacks: NonNullList<ItemStack>
): Container {
-
fun getStacks(): NonNullList<ItemStack> {
+
public fun getStacks(): NonNullList<ItemStack> {
return stacks
}
···
abstract override fun setChanged()
override fun canPlaceItem(slot: Int, itemStack: ItemStack): Boolean {
-
return itemStack.item !== ModItems.CancerMeter
+
return itemStack.item !== AsbestosItems.CancerMeter
}
override fun stillValid(player: Player): Boolean {
+36
src/common/main/kotlin/xyz/naomieow/asbestos/item/AsbestosCreativeTabs.kt
···
+
package xyz.naomieow.asbestos.item
+
+
import net.minecraft.core.registries.Registries
+
import net.minecraft.network.chat.Component
+
import net.minecraft.world.item.CreativeModeTab
+
import uwu.serenity.kritter.api.Registrar
+
import uwu.serenity.kritter.api.entry.RegistryEntry
+
import uwu.serenity.kritter.stdlib.creativeTab
+
import xyz.naomieow.asbestos.Asbestos
+
import xyz.naomieow.asbestos.block.AsbestosBlocks
+
+
@Suppress("UNUSED")
+
public object AsbestosCreativeTabs: Registrar<CreativeModeTab> by Asbestos..Registries.CREATIVE_MODE_TAB {
+
public val Asbestos: RegistryEntry<CreativeModeTab> = creativeTab("asbestos") {
+
title = Component.translatable("itemGroup.asbestos.asbestos")
+
icon { AsbestosItems.AsbestosFibers.defaultInstance }
+
displayItems {
+
// Items
+
accept(AsbestosItems.AsbestosFibers)
+
accept(AsbestosItems.IronScraper)
+
accept(AsbestosItems.EmptySyringe)
+
accept(AsbestosItems.FilledSyringe)
+
accept(AsbestosItems.CancerMeter)
+
accept(AsbestosItems.PPEHelmet)
+
accept(AsbestosItems.PPEChestplate)
+
accept(AsbestosItems.PPELeggings)
+
accept(AsbestosItems.PPEBoots)
+
// Blocks
+
accept(AsbestosBlocks.AsbestosBlock)
+
accept(AsbestosBlocks.SerpentiniteBlock)
+
accept(AsbestosBlocks.PopcornCeilingBlock)
+
accept(AsbestosBlocks.AsbestosTileBlock)
+
accept(AsbestosBlocks.AsbestosRoofBlock)
+
}
+
}
+
}
+11 -11
src/main/kotlin/xyz/naomieow/asbestos/item/ModItems.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/AsbestosItems.kt
···
import net.minecraft.world.item.Item
import uwu.serenity.kritter.api.Registrar
import uwu.serenity.kritter.stdlib.item
-
import xyz.naomieow.asbestos.AsbestosMod
+
import xyz.naomieow.asbestos.Asbestos
import xyz.naomieow.asbestos.armor.ProtectiveMaterial
@Suppress("UNUSED")
-
object ModItems: Registrar<Item> by AsbestosMod..Registries.ITEM {
-
val AsbestosFibers by item("asbestos_fibers", ::Item) {
+
public object AsbestosItems: Registrar<Item> by Asbestos..Registries.ITEM {
+
public val AsbestosFibers: Item by item("asbestos_fibers", ::Item) {
properties {
fireResistant()
food(FoodProperties.Builder()
···
}
}
-
val IronScraper by item("iron_scraper", { properties ->
+
public val IronScraper: Item by item("iron_scraper", { properties ->
ScraperItem(
ScraperItemMaterial.INSTANCE,
0.0f, -3.0f,
···
)
})
-
val FilledSyringe by item("filled_syringe", ::FilledSyringeItem) {
+
public val FilledSyringe: Item by item("filled_syringe", ::FilledSyringeItem) {
properties {
stacksTo(1)
}
}
-
val EmptySyringe by item("empty_syringe", ::EmptySyringeItem) {
+
public val EmptySyringe: Item by item("empty_syringe", ::EmptySyringeItem) {
properties {
stacksTo(16)
}
}
-
val CancerMeter by item("cancer_meter", ::CancerMeterItem) {
+
public val CancerMeter: Item by item("cancer_meter", ::CancerMeterItem) {
properties {
stacksTo(1)
}
}
-
val PPEHelmet by item("ppe_helmet", { properties ->
+
public val PPEHelmet: Item by item("ppe_helmet", { properties ->
ArmorItem(
ProtectiveMaterial.INSTANCE,
ArmorItem.Type.HELMET,
···
)
})
-
val PPEChestplate by item("ppe_chestplate", { properties ->
+
public val PPEChestplate: Item by item("ppe_chestplate", { properties ->
ArmorItem(
ProtectiveMaterial.INSTANCE,
ArmorItem.Type.CHESTPLATE,
···
)
})
-
val PPELeggings by item("ppe_leggings", { properties ->
+
public val PPELeggings: Item by item("ppe_leggings", { properties ->
ArmorItem(
ProtectiveMaterial.INSTANCE,
ArmorItem.Type.LEGGINGS,
···
)
})
-
val PPEBoots by item("ppe_boots", { properties ->
+
public val PPEBoots: Item by item("ppe_boots", { properties ->
ArmorItem(
ProtectiveMaterial.INSTANCE,
ArmorItem.Type.BOOTS,
+1 -1
src/main/kotlin/xyz/naomieow/asbestos/item/CancerMeterItem.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/CancerMeterItem.kt
···
import net.minecraft.world.level.Level
import xyz.naomieow.asbestos.inventory.CancerMeterInventory
-
class CancerMeterItem(
+
public class CancerMeterItem(
properties: Properties
): Item(
properties
+9 -11
src/main/kotlin/xyz/naomieow/asbestos/item/EmptySyringeItem.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/EmptySyringeItem.kt
···
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
import net.minecraft.world.level.Level
-
import xyz.naomieow.asbestos.AsbestosMod
import xyz.naomieow.asbestos.config.AsbestosConfig
-
import xyz.naomieow.asbestos.damage.ModDamageTypes
+
import xyz.naomieow.asbestos.damage.AsbestosDamageTypes
-
class EmptySyringeItem(
-
properties: Item.Properties
+
public class EmptySyringeItem(
+
properties: Properties
): Item(
properties
) {
···
entity: LivingEntity,
hand: InteractionHand
): InteractionResult {
-
val world = user.level()
-
useEmptySyringe(user, entity, hand, world)
+
useEmptySyringe(user, entity, hand, user.level())
return InteractionResult.CONSUME
}
···
1.0f, 1.0f
)
val handStack = user.getItemInHand(hand)
-
val newStack = ItemStack(ModItems.FilledSyringe, 1)
+
val newStack = ItemStack(AsbestosItems.FilledSyringe, 1)
newStack.tag = handStack.getOrCreateTag().copy()
FilledSyringeItem.writeNbt(target, newStack)
target.hurt(
-
ModDamageTypes.of(user.level(), ModDamageTypes.BLOOD_EXTRACT),
+
AsbestosDamageTypes.of(user.level(), AsbestosDamageTypes.BLOOD_EXTRACT),
AsbestosConfig.exsanguination
)
-
if (!user.inventory.add(newStack)) {
-
user.drop(newStack, false)
-
}
if (!user.abilities.instabuild) {
handStack.shrink(1)
}
+
if (!user.inventory.add(newStack)) {
+
user.drop(newStack, false)
+
}
}
}
+6 -7
src/main/kotlin/xyz/naomieow/asbestos/item/FilledSyringeItem.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/FilledSyringeItem.kt
···
import net.minecraft.world.entity.player.Player
import net.minecraft.world.item.Item
import net.minecraft.world.item.ItemStack
-
import xyz.naomieow.asbestos.AsbestosMod
+
import xyz.naomieow.asbestos.mesothelioma.getMesothelioma
-
class FilledSyringeItem(
+
public class FilledSyringeItem(
properties: Properties
): Item(
properties
) {
-
companion object {
+
public companion object {
private const val TYPE_KEY: String = "EntityType"
private const val CANCER_KEY: String = "CancerMeter"
-
fun writeNbt(target: LivingEntity, syringe: ItemStack) {
+
public fun writeNbt(target: LivingEntity, syringe: ItemStack) {
val nbt = syringe.getOrCreateTag()
-
syringe.setHoverName(Component.translatable(
+
syringe.hoverName = Component.translatable(
"item.asbestos.filled_syringe",
target.name)
.withStyle(ChatFormatting.RESET)
-
)
nbt.putString(TYPE_KEY, EntityType.getKey(target.type).toString())
if (target is Player) {
-
nbt.putInt(CANCER_KEY, AsbestosMod.MESOTHELIOMA.get(target).getMeso())
+
nbt.putInt(CANCER_KEY, target.getMesothelioma())
}
}
}
+2 -2
src/main/kotlin/xyz/naomieow/asbestos/item/ScraperItem.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/ScraperItem.kt
···
import net.minecraft.world.level.block.Block
import xyz.naomieow.asbestos.id
-
class ScraperItem(
+
public class ScraperItem(
tier: Tier,
attackDamage: Float,
attackSpeed: Float,
···
AFFECTED_BLOCKS,
properties
) {
-
companion object {
+
public companion object {
private val AFFECTED_BLOCKS: TagKey<Block> = TagKey.create(
Registries.BLOCK,
id("scrapeable")
+4 -3
src/main/kotlin/xyz/naomieow/asbestos/item/ScraperItemMaterial.kt src/common/main/kotlin/xyz/naomieow/asbestos/item/ScraperItemMaterial.kt
···
import net.minecraft.world.item.Tier
import net.minecraft.world.item.crafting.Ingredient
-
class ScraperItemMaterial: Tier {
+
public class ScraperItemMaterial: Tier {
override fun getUses(): Int {
return 300
}
···
return 2.5f
}
+
@Deprecated("Deprecated in Java")
override fun getLevel(): Int {
return 1
}
···
return Ingredient.of(Items.IRON_INGOT)
}
-
companion object {
-
val INSTANCE: ScraperItemMaterial = ScraperItemMaterial()
+
public companion object {
+
public val INSTANCE: ScraperItemMaterial = ScraperItemMaterial()
}
}
+6
src/common/main/kotlin/xyz/naomieow/asbestos/mesothelioma/Mesothelioma.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.world.entity.player.Player
+
+
public expect fun Player.getMesothelioma(): Int
+
public expect fun Player.setMesothelioma(value: Int)
+11
src/common/main/kotlin/xyz/naomieow/asbestos/mob_effect/AsbestosMobEffects.kt
···
+
package xyz.naomieow.asbestos.mob_effect
+
+
import net.minecraft.core.registries.Registries
+
import net.minecraft.world.effect.MobEffect
+
import uwu.serenity.kritter.api.Registrar
+
import uwu.serenity.kritter.api.entry
+
import xyz.naomieow.asbestos.Asbestos
+
+
public object AsbestosMobEffects: Registrar<MobEffect> by Asbestos..Registries.MOB_EFFECT {
+
public val mesotheliomaMobEffect: MesotheliomaMobEffect by entry("mesothelioma", ::MesotheliomaMobEffect)
+
}
+8 -8
src/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesoStatusEffect.kt src/common/main/kotlin/xyz/naomieow/asbestos/mob_effect/MesotheliomaMobEffect.kt
···
-
package xyz.naomieow.asbestos.mesothelioma
+
package xyz.naomieow.asbestos.mob_effect
import net.minecraft.world.effect.MobEffect
import net.minecraft.world.effect.MobEffectCategory
···
import net.minecraft.world.effect.MobEffects
import net.minecraft.world.entity.LivingEntity
import net.minecraft.world.entity.player.Player
-
import xyz.naomieow.asbestos.AsbestosMod
import xyz.naomieow.asbestos.config.AsbestosConfig
-
import xyz.naomieow.asbestos.damage.ModDamageTypes
+
import xyz.naomieow.asbestos.damage.AsbestosDamageTypes
+
import xyz.naomieow.asbestos.mesothelioma.getMesothelioma
-
class MesoStatusEffect: MobEffect(
+
public class MesotheliomaMobEffect: MobEffect(
MobEffectCategory.HARMFUL,
0x302412,
) {
···
override fun applyEffectTick(entity: LivingEntity, amplifier: Int) {
super.applyEffectTick(entity, amplifier)
if (entity is Player) {
-
val exposure: Int = AsbestosMod.MESOTHELIOMA.get(entity).getMeso()
-
if (exposure >= (AsbestosConfig.threshold / 1.5f)) {
+
val exposure: Int = entity.getMesothelioma()
+
if (exposure >= (AsbestosConfig.Companion.threshold / 1.5f)) {
entity.addEffect(MobEffectInstance(MobEffects.MOVEMENT_SLOWDOWN, -1, 1))
}
-
if (exposure >= AsbestosConfig.threshold) {
-
entity.hurt(ModDamageTypes.of(entity.level(), ModDamageTypes.MESOTHELIOMA), (1 shl amplifier).toFloat())
+
if (exposure >= AsbestosConfig.Companion.threshold) {
+
entity.hurt(AsbestosDamageTypes.of(entity.level(), AsbestosDamageTypes.MESOTHELIOMA), (1 shl amplifier).toFloat())
}
}
}
+15
src/common/main/kotlin/xyz/naomieow/asbestos/util/MouseUtil.kt
···
+
package xyz.naomieow.asbestos.util
+
+
public object MouseUtil {
+
public fun isMouseOver(mouseX: Double, mouseY: Double, x: Int, y: Int): Boolean {
+
return isMouseOver(mouseX, mouseY, x, y, 16)
+
}
+
+
public fun isMouseOver(mouseX: Double, mouseY: Double, x: Int, y: Int, size: Int): Boolean {
+
return isMouseOver(mouseX, mouseY, x, y, size, size)
+
}
+
+
public fun isMouseOver(mouseX: Double, mouseY: Double, x: Int, y: Int, sizeX: Int, sizeY: Int): Boolean {
+
return (mouseX >= x && mouseX <= x + sizeX) && (mouseY >= y && mouseY <= y + sizeY)
+
}
+
}
+12
src/common/main/kotlin/xyz/naomieow/asbestos/util/VectorUtil.kt
···
+
package xyz.naomieow.asbestos.util
+
+
import net.minecraft.core.Vec3i
+
import net.minecraft.world.phys.Vec3
+
+
public fun Vec3.toVector3i(): Vec3i {
+
return Vec3i(
+
this.x.toInt(),
+
this.y.toInt(),
+
this.z.toInt(),
+
)
+
}
src/main/resources/assets/asbestos/blockstates/asbestos_block.json src/common/resources/assets/asbestos/blockstates/asbestos_block.json
src/main/resources/assets/asbestos/blockstates/asbestos_roof_block.json src/common/resources/assets/asbestos/blockstates/asbestos_roof_block.json
src/main/resources/assets/asbestos/blockstates/asbestos_tile_block.json src/common/resources/assets/asbestos/blockstates/asbestos_tile_block.json
src/main/resources/assets/asbestos/blockstates/popcorn_ceiling_block.json src/common/resources/assets/asbestos/blockstates/popcorn_ceiling_block.json
src/main/resources/assets/asbestos/blockstates/serpentinite_block.json src/common/resources/assets/asbestos/blockstates/serpentinite_block.json
src/main/resources/assets/asbestos/icon.png src/common/resources/assets/asbestos/icon.png
src/main/resources/assets/asbestos/icon.svg src/common/resources/assets/asbestos/icon.svg
src/main/resources/assets/asbestos/lang/en_us.json src/common/resources/assets/asbestos/lang/en_us.json
src/main/resources/assets/asbestos/models/block/asbestos_block.json src/common/resources/assets/asbestos/models/block/asbestos_block.json
src/main/resources/assets/asbestos/models/block/asbestos_roof_block.json src/common/resources/assets/asbestos/models/block/asbestos_roof_block.json
src/main/resources/assets/asbestos/models/block/asbestos_tile_block.json src/common/resources/assets/asbestos/models/block/asbestos_tile_block.json
src/main/resources/assets/asbestos/models/block/popcorn_ceiling_block.json src/common/resources/assets/asbestos/models/block/popcorn_ceiling_block.json
src/main/resources/assets/asbestos/models/block/serpentinite_block.json src/common/resources/assets/asbestos/models/block/serpentinite_block.json
src/main/resources/assets/asbestos/models/item/asbestos_block.json src/common/resources/assets/asbestos/models/item/asbestos_block.json
src/main/resources/assets/asbestos/models/item/asbestos_fibers.json src/common/resources/assets/asbestos/models/item/asbestos_fibers.json
src/main/resources/assets/asbestos/models/item/asbestos_roof_block.json src/common/resources/assets/asbestos/models/item/asbestos_roof_block.json
src/main/resources/assets/asbestos/models/item/asbestos_tile_block.json src/common/resources/assets/asbestos/models/item/asbestos_tile_block.json
src/main/resources/assets/asbestos/models/item/cancer_meter.json src/common/resources/assets/asbestos/models/item/cancer_meter.json
src/main/resources/assets/asbestos/models/item/empty_syringe.json src/common/resources/assets/asbestos/models/item/empty_syringe.json
src/main/resources/assets/asbestos/models/item/filled_syringe.json src/common/resources/assets/asbestos/models/item/filled_syringe.json
src/main/resources/assets/asbestos/models/item/iron_scraper.json src/common/resources/assets/asbestos/models/item/iron_scraper.json
src/main/resources/assets/asbestos/models/item/popcorn_ceiling_block.json src/common/resources/assets/asbestos/models/item/popcorn_ceiling_block.json
src/main/resources/assets/asbestos/models/item/ppe_boots.json src/common/resources/assets/asbestos/models/item/ppe_boots.json
src/main/resources/assets/asbestos/models/item/ppe_chestplate.json src/common/resources/assets/asbestos/models/item/ppe_chestplate.json
src/main/resources/assets/asbestos/models/item/ppe_helmet.json src/common/resources/assets/asbestos/models/item/ppe_helmet.json
src/main/resources/assets/asbestos/models/item/ppe_leggings.json src/common/resources/assets/asbestos/models/item/ppe_leggings.json
src/main/resources/assets/asbestos/models/item/serpentinite_block.json src/common/resources/assets/asbestos/models/item/serpentinite_block.json
src/main/resources/assets/asbestos/textures/block/asbestos_block.png src/common/resources/assets/asbestos/textures/block/asbestos_block.png
src/main/resources/assets/asbestos/textures/block/asbestos_roof_side.png src/common/resources/assets/asbestos/textures/block/asbestos_roof_side.png
src/main/resources/assets/asbestos/textures/block/asbestos_roof_top.png src/common/resources/assets/asbestos/textures/block/asbestos_roof_top.png
src/main/resources/assets/asbestos/textures/block/asbestos_tiles.png src/common/resources/assets/asbestos/textures/block/asbestos_tiles.png
src/main/resources/assets/asbestos/textures/block/popcorn_bottom.png src/common/resources/assets/asbestos/textures/block/popcorn_bottom.png
src/main/resources/assets/asbestos/textures/block/popcorn_side.png src/common/resources/assets/asbestos/textures/block/popcorn_side.png
src/main/resources/assets/asbestos/textures/block/popcorn_top.png src/common/resources/assets/asbestos/textures/block/popcorn_top.png
src/main/resources/assets/asbestos/textures/block/serpentinite_block.png src/common/resources/assets/asbestos/textures/block/serpentinite_block.png
src/main/resources/assets/asbestos/textures/gui/cancer_meter.ase src/common/resources/assets/asbestos/textures/gui/cancer_meter.ase
src/main/resources/assets/asbestos/textures/gui/cancer_meter.png src/common/resources/assets/asbestos/textures/gui/cancer_meter.png
src/main/resources/assets/asbestos/textures/item/asbestos_fibers.png src/common/resources/assets/asbestos/textures/item/asbestos_fibers.png
src/main/resources/assets/asbestos/textures/item/cancer_meter.aseprite src/common/resources/assets/asbestos/textures/item/cancer_meter.aseprite
src/main/resources/assets/asbestos/textures/item/cancer_meter.png src/common/resources/assets/asbestos/textures/item/cancer_meter.png
src/main/resources/assets/asbestos/textures/item/empty_syringe.aseprite src/common/resources/assets/asbestos/textures/item/empty_syringe.aseprite
src/main/resources/assets/asbestos/textures/item/empty_syringe.png src/common/resources/assets/asbestos/textures/item/empty_syringe.png
src/main/resources/assets/asbestos/textures/item/filled_syringe.aseprite src/common/resources/assets/asbestos/textures/item/filled_syringe.aseprite
src/main/resources/assets/asbestos/textures/item/filled_syringe.png src/common/resources/assets/asbestos/textures/item/filled_syringe.png
src/main/resources/assets/asbestos/textures/item/iron_scraper.png src/common/resources/assets/asbestos/textures/item/iron_scraper.png
src/main/resources/assets/asbestos/textures/item/ppe_boots.png src/common/resources/assets/asbestos/textures/item/ppe_boots.png
src/main/resources/assets/asbestos/textures/item/ppe_chestplate.png src/common/resources/assets/asbestos/textures/item/ppe_chestplate.png
src/main/resources/assets/asbestos/textures/item/ppe_helmet.png src/common/resources/assets/asbestos/textures/item/ppe_helmet.png
src/main/resources/assets/asbestos/textures/item/ppe_leggings.png src/common/resources/assets/asbestos/textures/item/ppe_leggings.png
src/main/resources/assets/asbestos/textures/mob_effect/mesothelioma.png src/common/resources/assets/asbestos/textures/mob_effect/mesothelioma.png
src/main/resources/assets/minecraft/textures/models/armor/asbestos_protective_layer_1.png src/common/resources/assets/minecraft/textures/models/armor/asbestos_protective_layer_1.png
src/main/resources/assets/minecraft/textures/models/armor/asbestos_protective_layer_2.png src/common/resources/assets/minecraft/textures/models/armor/asbestos_protective_layer_2.png
src/main/resources/data/asbestos/damage_type/blood_extract.json src/common/resources/data/asbestos/damage_type/blood_extract.json
src/main/resources/data/asbestos/damage_type/mesothelioma.json src/common/resources/data/asbestos/damage_type/mesothelioma.json
src/main/resources/data/asbestos/loot_tables/blocks/asbestos_block.json src/common/resources/data/asbestos/loot_tables/blocks/asbestos_block.json
src/main/resources/data/asbestos/loot_tables/blocks/asbestos_roof_block.json src/common/resources/data/asbestos/loot_tables/blocks/asbestos_roof_block.json
src/main/resources/data/asbestos/loot_tables/blocks/asbestos_tile_block.json src/common/resources/data/asbestos/loot_tables/blocks/asbestos_tile_block.json
src/main/resources/data/asbestos/loot_tables/blocks/popcorn_ceiling_block.json src/common/resources/data/asbestos/loot_tables/blocks/popcorn_ceiling_block.json
src/main/resources/data/asbestos/loot_tables/blocks/serpentinite_block.json src/common/resources/data/asbestos/loot_tables/blocks/serpentinite_block.json
src/main/resources/data/asbestos/recipes/asbestos_block.json src/common/resources/data/asbestos/recipes/asbestos_block.json
src/main/resources/data/asbestos/recipes/asbestos_roof_block.json src/common/resources/data/asbestos/recipes/asbestos_roof_block.json
src/main/resources/data/asbestos/recipes/asbestos_tile_block.json src/common/resources/data/asbestos/recipes/asbestos_tile_block.json
src/main/resources/data/asbestos/recipes/cancer_meter.json src/common/resources/data/asbestos/recipes/cancer_meter.json
src/main/resources/data/asbestos/recipes/empty_syringe.json src/common/resources/data/asbestos/recipes/empty_syringe.json
src/main/resources/data/asbestos/recipes/iron_scraper.json src/common/resources/data/asbestos/recipes/iron_scraper.json
src/main/resources/data/asbestos/recipes/popcorn_ceiling_block.json src/common/resources/data/asbestos/recipes/popcorn_ceiling_block.json
src/main/resources/data/asbestos/recipes/ppe_boots.json src/common/resources/data/asbestos/recipes/ppe_boots.json
src/main/resources/data/asbestos/recipes/ppe_chestplate.json src/common/resources/data/asbestos/recipes/ppe_chestplate.json
src/main/resources/data/asbestos/recipes/ppe_helmet.json src/common/resources/data/asbestos/recipes/ppe_helmet.json
src/main/resources/data/asbestos/recipes/ppe_leggings.json src/common/resources/data/asbestos/recipes/ppe_leggings.json
src/main/resources/data/asbestos/tags/blocks/scrapable.json src/common/resources/data/asbestos/tags/blocks/scrapable.json
src/main/resources/data/asbestos/worldgen/configured_feature/serpentinite_overworld.json src/common/resources/data/asbestos/worldgen/configured_feature/serpentinite_overworld.json
src/main/resources/data/asbestos/worldgen/placed_feature/serpentinite.json src/common/resources/data/asbestos/worldgen/placed_feature/serpentinite.json
src/main/resources/data/minecraft/tags/blocks/mineable/axe.json src/common/resources/data/minecraft/tags/blocks/mineable/axe.json
src/main/resources/data/minecraft/tags/blocks/mineable/pickaxe.json src/common/resources/data/minecraft/tags/blocks/mineable/pickaxe.json
src/main/resources/data/minecraft/tags/damage_type/bypasses_cooldown.json src/common/resources/data/minecraft/tags/damage_type/bypasses_cooldown.json
+24
src/fabric/main/kotlin/xyz/naomieow/asbestos/AsbestosFabric.kt
···
+
@file:JvmName("AsbestosFabric")
+
package xyz.naomieow.asbestos
+
+
public fun init() {
+
Asbestos.init()
+
}
+
//
+
// override fun onInitialize() {
+
//
+
// Registry.register(
+
// BuiltInRegistries.MOB_EFFECT,
+
// id("mesothelioma"),
+
// MESO_STATUS
+
// )
+
//
+
// BiomeModifications.addFeature(
+
// BiomeSelectors.foundInOverworld(),
+
// GenerationStep.Decoration.UNDERGROUND_ORES,
+
// Asbestos.serpentinitePlacedKey
+
// )
+
//
+
// ModScheduler.init()
+
// }
+
//}
+7 -4
src/main/kotlin/xyz/naomieow/asbestos/ModScheduler.kt src/fabric/main/kotlin/xyz/naomieow/asbestos/ModScheduler.kt
···
import xyz.naomieow.asbestos.block.CarcinogenicBlock
import xyz.naomieow.asbestos.config.AsbestosConfig
import java.util.function.Consumer
+
import xyz.naomieow.asbestos.mesothelioma.getMesothelioma
+
import xyz.naomieow.asbestos.mesothelioma.setMesothelioma
+
import xyz.naomieow.asbestos.mob_effect.AsbestosMobEffects
object ModScheduler {
fun init() {
···
server.allLevels.forEach(Consumer { level: ServerLevel ->
level.players().forEach(
Consumer { player: ServerPlayer ->
-
val exposure = AsbestosMod.MESOTHELIOMA.get(player).getMeso()
+
val exposure = player.getMesothelioma()
if (exposure >= (AsbestosConfig.threshold / 2)) {
-
player.addEffect(MobEffectInstance(AsbestosMod.MESO_STATUS, -1))
+
player.addEffect(MobEffectInstance(AsbestosMobEffects.mesotheliomaMobEffect, -1))
}
if (CarcinogenicBlock.isProtectedFromAsbestos(player)) {
···
offsetPos.z().toInt()
)
val block = level.getBlockState(pos).block
-
if (listOf(*AsbestosMod.HARMFUL_PASSIVE_BLOCKS)
+
if (listOf(*Asbestos.harmfulPassiveBlocks)
.contains(block)
) {
-
AsbestosMod.MESOTHELIOMA.get(player).setMeso(exposure + 1)
+
player.setMesothelioma(exposure + 1)
break@findasbestos
}
}
+6
src/fabric/main/kotlin/xyz/naomieow/asbestos/client/AsbestosClientFabric.kt
···
+
@file:JvmName("AsbestosClientFabric")
+
package xyz.naomieow.asbestos.client
+
+
public fun init() {
+
asbestosClient()
+
}
-8
src/main/kotlin/xyz/naomieow/asbestos/client/AsbestosModClient.kt src/fabric/main/kotlin/xyz/naomieow/asbestos/client/AsbestosModClient.kt
···
import net.fabricmc.api.EnvType
import net.fabricmc.api.Environment
import net.minecraft.client.gui.screens.MenuScreens
-
import net.minecraft.resources.ResourceLocation
import xyz.naomieow.asbestos.client.screen.CancerMeterScreen
import xyz.naomieow.asbestos.client.screen.ModMenuTypes
-
const val MOD_ID: String = "asbestos"
-
-
internal inline fun id(path: String): ResourceLocation {
-
return ResourceLocation(MOD_ID, path)
-
}
-
@Environment(EnvType.CLIENT)
class AsbestosModClient : ClientModInitializer {
override fun onInitializeClient() {
-
ModMenuTypes.register()
MenuScreens.register(ModMenuTypes.CancerMeter, ::CancerMeterScreen)
}
src/main/kotlin/xyz/naomieow/asbestos/client/ModMenuIntegration.kt src/fabric/main/kotlin/xyz/naomieow/asbestos/client/ModMenuIntegration.kt
+13
src/fabric/main/kotlin/xyz/naomieow/asbestos/mesothelioma/Mesothelioma.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.world.entity.player.Player
+
+
@Suppress("ACTUAL_WITHOUT_EXPECT")
+
public actual fun Player.getMesothelioma(): Int {
+
return this.getAttachedOrSet(MesotheliomaAttachment.mesothelioma, 0);
+
}
+
+
@Suppress("ACTUAL_WITHOUT_EXPECT")
+
public actual fun Player.setMesothelioma(value: Int) {
+
return this.setAttachment(MesotheliomaAttachment.mesothelioma, value);
+
}
+14
src/fabric/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesotheliomaAttachment.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import com.mojang.serialization.Codec
+
+
import net.fabricmc.fabric.api.attachment.v1.AttachmentRegistry
+
import net.fabricmc.fabric.api.attachment.v1.AttachmentType
+
import xyz.naomieow.asbestos.id
+
+
public object MesotheliomaAttachment {
+
public val mesothelioma: AttachmentType<Int> = AttachmentRegistry.createPersistent(
+
id("mesothelioma"),
+
Codec.INT,
+
);
+
}
+36
src/forge/main/kotlin/xyz/naomieow/asbestos/AsbestosForge.kt
···
+
package xyz.naomieow.asbestos
+
+
import net.minecraft.world.entity.Entity
+
import net.minecraft.world.entity.player.Player
+
import net.minecraft.world.inventory.MenuType
+
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent
+
import net.minecraftforge.event.AttachCapabilitiesEvent
+
import net.minecraftforge.eventbus.api.SubscribeEvent
+
import net.minecraftforge.fml.common.Mod
+
import net.minecraftforge.registries.DeferredRegister
+
import net.minecraftforge.registries.ForgeRegistries
+
import xyz.naomieow.asbestos.mesothelioma.MesotheliomaCapability
+
import xyz.naomieow.asbestos.mesothelioma.MesotheliomaCapabilityProvider
+
+
@Mod(MOD_ID)
+
public class AsbestosForge {
+
init {
+
Asbestos.init()
+
}
+
+
@SubscribeEvent
+
public fun registerCapabilities(event: RegisterCapabilitiesEvent) {
+
MesotheliomaCapability.register(event)
+
}
+
+
@SubscribeEvent
+
public fun attachEntityCapabilities(event: AttachCapabilitiesEvent<Entity>) {
+
when (event.`object`) {
+
is Player -> MesotheliomaCapabilityProvider.attach(event)
+
}
+
}
+
+
public companion object {
+
public val menuTypeRegister: DeferredRegister<MenuType<*>> = DeferredRegister.create(ForgeRegistries.MENU_TYPES, MOD_ID)
+
}
+
}
+12
src/forge/main/kotlin/xyz/naomieow/asbestos/client/AsbestosClientForge.kt
···
+
@file:EventBusSubscriber(modid = MOD_ID, bus = EventBusSubscriber.Bus.MOD)
+
package xyz.naomieow.asbestos.client
+
+
import net.minecraftforge.eventbus.api.SubscribeEvent
+
import net.minecraftforge.fml.common.Mod.EventBusSubscriber
+
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent
+
import xyz.naomieow.asbestos.MOD_ID
+
+
@SubscribeEvent
+
public fun onClientInit(event: FMLClientSetupEvent) {
+
event.enqueueWork(::asbestosClient)
+
}
+9
src/forge/main/kotlin/xyz/naomieow/asbestos/mesothelioma/IMesotheliomaCapability.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.nbt.CompoundTag
+
import net.minecraftforge.common.util.INBTSerializable
+
+
public interface IMesotheliomaCapability: INBTSerializable<CompoundTag> {
+
public fun getValue(): Int
+
public fun setValue(value: Int)
+
}
+13
src/forge/main/kotlin/xyz/naomieow/asbestos/mesothelioma/Mesothelioma.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.world.entity.player.Player
+
+
@Suppress("ACTUAL_WITHOUT_EXPECT")
+
public actual fun Player.getMesothelioma(): Int {
+
return this.getCapability(MesotheliomaCapability.instance).resolve().get().getValue()
+
}
+
+
@Suppress("ACTUAL_WITHOUT_EXPECT")
+
public actual fun Player.setMesothelioma(value: Int) {
+
this.getCapability(MesotheliomaCapability.instance).resolve().get().setValue(value)
+
}
+12
src/forge/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesotheliomaCapability.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraftforge.common.capabilities.*
+
+
public object MesotheliomaCapability {
+
public val instance: Capability<IMesotheliomaCapability> =
+
CapabilityManager.get<IMesotheliomaCapability>(object : CapabilityToken<IMesotheliomaCapability>() {})
+
+
public fun register(event: RegisterCapabilitiesEvent) {
+
event.register(IMesotheliomaCapability::class.java)
+
}
+
}
+44
src/forge/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesotheliomaCapabilityProvider.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.core.Direction
+
import net.minecraft.nbt.CompoundTag
+
import net.minecraft.world.entity.Entity
+
import net.minecraftforge.common.capabilities.Capability
+
import net.minecraftforge.common.capabilities.ICapabilitySerializable
+
import net.minecraftforge.common.util.LazyOptional
+
import net.minecraftforge.event.AttachCapabilitiesEvent
+
import xyz.naomieow.asbestos.id
+
+
public class MesotheliomaCapabilityProvider: ICapabilitySerializable<CompoundTag> {
+
private val backend: IMesotheliomaCapability = MesotheliomaImplementation()
+
private val optionalData: LazyOptional<IMesotheliomaCapability> = LazyOptional.of { backend }
+
+
private fun invalidiate() {
+
optionalData.invalidate()
+
}
+
+
override fun <T : Any?> getCapability(
+
capability: Capability<T?>,
+
direction: Direction?
+
): LazyOptional<T?> {
+
return MesotheliomaCapability.instance.orEmpty(capability, this.optionalData)
+
}
+
+
override fun serializeNBT(): CompoundTag {
+
return this.backend.serializeNBT()
+
}
+
+
override fun deserializeNBT(tag: CompoundTag) {
+
return this.backend.deserializeNBT(tag)
+
}
+
+
public companion object {
+
public val identifier = id("mesothelioma_cap")
+
+
public fun attach(event: AttachCapabilitiesEvent<Entity>) {
+
val provider: MesotheliomaCapabilityProvider = MesotheliomaCapabilityProvider()
+
+
event.addCapability(identifier, provider)
+
}
+
}
+
}
+30
src/forge/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesotheliomaImplementation.kt
···
+
package xyz.naomieow.asbestos.mesothelioma
+
+
import net.minecraft.nbt.CompoundTag
+
+
public class MesotheliomaImplementation: IMesotheliomaCapability {
+
private var mesothelioma: Int = 0;
+
+
override fun getValue(): Int {
+
return mesothelioma
+
}
+
+
override fun setValue(value: Int) {
+
mesothelioma = value
+
}
+
+
override fun serializeNBT(): CompoundTag {
+
val tag: CompoundTag = CompoundTag();
+
tag.putInt(MESOTHELIOMA_NBT_KEY, mesothelioma)
+
return tag
+
}
+
+
override fun deserializeNBT(tag: CompoundTag) {
+
mesothelioma = tag.getInt(MESOTHELIOMA_NBT_KEY)
+
}
+
+
private companion object {
+
private const val MESOTHELIOMA_NBT_KEY: String = "mesothelioma"
+
}
+
+
}
-38
src/main/kotlin/xyz/naomieow/asbestos/block/CarcinogenicBlock.kt
···
-
package xyz.naomieow.asbestos.block
-
-
import net.minecraft.core.BlockPos
-
import net.minecraft.world.entity.player.Player
-
import net.minecraft.world.item.Item
-
import net.minecraft.world.level.Level
-
import net.minecraft.world.level.block.Block
-
import net.minecraft.world.level.block.state.BlockState
-
import xyz.naomieow.asbestos.AsbestosMod
-
import xyz.naomieow.asbestos.item.ModItems
-
-
open class CarcinogenicBlock(settings: Properties, private val dangerLevel: Int) : Block(settings) {
-
override fun playerWillDestroy(world: Level, pos: BlockPos, state: BlockState, player: Player) {
-
super.playerWillDestroy(world, pos, state, player)
-
if (!isProtectedFromAsbestos(player)) {
-
val exposure = AsbestosMod.MESOTHELIOMA.get(player).getMeso()
-
AsbestosMod.MESOTHELIOMA.get(player).setMeso(exposure + dangerLevel)
-
}
-
}
-
-
companion object {
-
val PROTECTIVE_ARMOUR: Array<Item> by lazy { arrayOf<Item>(
-
ModItems.PPEHelmet,
-
ModItems.PPEChestplate,
-
ModItems.PPELeggings,
-
ModItems.PPEBoots
-
) }
-
-
fun isProtectedFromAsbestos(player: Player): Boolean {
-
for (item in player.armorSlots) {
-
if (!listOf(*PROTECTIVE_ARMOUR).contains(item.item)) {
-
return false
-
}
-
}
-
return true
-
}
-
}
-
}
-27
src/main/kotlin/xyz/naomieow/asbestos/inventory/ICancerMeterInventory.kt
···
-
package xyz.naomieow.asbestos.inventory
-
-
import net.minecraft.nbt.CompoundTag
-
import net.minecraft.world.entity.player.Player
-
import net.minecraft.world.item.ItemStack
-
import net.minecraft.world.level.Level
-
-
interface ICancerMeterInventory {
-
fun writeItems(tag: CompoundTag)
-
fun readItems(tag: CompoundTag)
-
fun writeAllData(tag: CompoundTag)
-
fun readAllData(tag: CompoundTag)
-
fun getInventory(): InventoryImproved
-
fun getScreenID(): Byte
-
fun getLevel(): Level
-
fun getItemStack(): ItemStack
-
fun setUsingPlayer(player: Player?)
-
fun markDataDirty(vararg dataIds: Byte)
-
fun markDirty()
-
-
companion object {
-
const val INVENTORY_DATA: Byte = 0
-
const val COMBINED_INVENTORY_DATA: Byte = 1
-
const val SLOT_DATA: Byte = 2
-
const val ALL_DATA: Byte = 3
-
}
-
}
-36
src/main/kotlin/xyz/naomieow/asbestos/item/ModCreativeTabs.kt
···
-
package xyz.naomieow.asbestos.item
-
-
import net.minecraft.core.registries.Registries
-
import net.minecraft.network.chat.Component
-
import net.minecraft.world.item.CreativeModeTab
-
import uwu.serenity.kritter.api.Registrar
-
import uwu.serenity.kritter.api.entry.RegistryEntry
-
import uwu.serenity.kritter.stdlib.creativeTab
-
import xyz.naomieow.asbestos.AsbestosMod
-
import xyz.naomieow.asbestos.block.ModBlocks
-
-
@Suppress("UNUSED")
-
object ModCreativeTabs: Registrar<CreativeModeTab> by AsbestosMod..Registries.CREATIVE_MODE_TAB {
-
val Asbestos: RegistryEntry<CreativeModeTab> = creativeTab("asbestos") {
-
title = Component.translatable("itemGroup.asbestos.asbestos")
-
icon { ModItems.AsbestosFibers.defaultInstance }
-
displayItems {
-
// Items
-
accept(ModItems.AsbestosFibers)
-
accept(ModItems.IronScraper)
-
accept(ModItems.EmptySyringe)
-
accept(ModItems.FilledSyringe)
-
accept(ModItems.CancerMeter)
-
accept(ModItems.PPEHelmet)
-
accept(ModItems.PPEChestplate)
-
accept(ModItems.PPELeggings)
-
accept(ModItems.PPEBoots)
-
// Blocks
-
accept(ModBlocks.AsbestosBlock)
-
accept(ModBlocks.SerpentiniteBlock)
-
accept(ModBlocks.PopcornCeilingBlock)
-
accept(ModBlocks.AsbestosTileBlock)
-
accept(ModBlocks.AsbestosRoofBlock)
-
}
-
}
-
}
-8
src/main/kotlin/xyz/naomieow/asbestos/mesothelioma/MesoComponent.kt
···
-
package xyz.naomieow.asbestos.mesothelioma
-
-
import dev.onyxstudios.cca.api.v3.component.ComponentV3
-
-
interface IMesoComponent: ComponentV3 {
-
fun getMeso(): Int
-
fun setMeso(exposure: Int)
-
}
-29
src/main/kotlin/xyz/naomieow/asbestos/mesothelioma/PlayerMesoComponent.kt
···
-
package xyz.naomieow.asbestos.mesothelioma
-
-
import dev.onyxstudios.cca.api.v3.component.sync.AutoSyncedComponent
-
import net.minecraft.nbt.CompoundTag
-
import net.minecraft.world.entity.player.Player
-
import xyz.naomieow.asbestos.AsbestosMod
-
-
class PlayerMesoComponent(
-
var playerEntity: Player
-
): IMesoComponent, AutoSyncedComponent {
-
private var mesothelioma: Int = 0
-
-
override fun readFromNbt(tag: CompoundTag) {
-
setMeso(tag.getInt("mesothelioma"))
-
}
-
-
override fun writeToNbt(tag: CompoundTag) {
-
tag.putInt("mesothelioma", getMeso())
-
}
-
-
override fun getMeso(): Int {
-
return mesothelioma
-
}
-
-
override fun setMeso(exposure: Int) {
-
mesothelioma = exposure
-
AsbestosMod.MESOTHELIOMA.sync(playerEntity)
-
}
-
}