Some backporting

This commit is contained in:
DBotThePony 2024-01-01 03:22:05 +07:00
parent cc82146f0a
commit e563b85946
Signed by: DBot
GPG Key ID: DCC23B5715498507
55 changed files with 225 additions and 214 deletions

View File

@ -34,7 +34,7 @@ public class FoodDataMixin {
// полностью подменяем логику если андроид // полностью подменяем логику если андроид
lastFoodLevel = foodLevel; lastFoodLevel = foodLevel;
if (player.level().getDifficulty() == Difficulty.PEACEFUL) { if (player.level.getDifficulty() == Difficulty.PEACEFUL) {
exhaustionLevel = 0f; exhaustionLevel = 0f;
} else { } else {
tickTimer = 0; tickTimer = 0;

View File

@ -29,7 +29,7 @@ public class MixinAbstractHurtingProjectile {
AbstractHurtingProjectile proj = (AbstractHurtingProjectile)(Object)this; AbstractHurtingProjectile proj = (AbstractHurtingProjectile)(Object)this;
if (cap.isAndroid() && proj.getOwner() != entity) { if (cap.isAndroid() && proj.getOwner() != entity) {
entity.level().playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + entity.level().random.nextFloat() * 0.1f); entity.level.playSound(entity, proj.blockPosition(), MSoundEvents.INSTANCE.getANDROID_PROJ_PARRY(), SoundSource.PLAYERS, 1.0f, 0.95f + entity.level.random.nextFloat() * 0.1f);
} }
}); });
} }

View File

@ -34,7 +34,7 @@ abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: Ma
val cooldownPercent: Float get() { val cooldownPercent: Float get() {
if (maxCooldown <= 0) return 0.0f if (maxCooldown <= 0) return 0.0f
if (ply.level() is ClientLevel) { if (ply.level is ClientLevel) {
return ((cooldown.toFloat() - minecraft.partialTick) / maxCooldown.toFloat()).coerceIn(0.0f, 1.0f) return ((cooldown.toFloat() - minecraft.partialTick) / maxCooldown.toFloat()).coerceIn(0.0f, 1.0f)
} }

View File

@ -71,29 +71,29 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
} }
private fun canSupportPlayer(blockPos: BlockPos): Boolean { private fun canSupportPlayer(blockPos: BlockPos): Boolean {
val state = ply.level().getBlockState(blockPos) val state = ply.level.getBlockState(blockPos)
if (state.`is`(BlockTags.CLIMBABLE)) { if (state.`is`(BlockTags.CLIMBABLE)) {
return true // ladders can always support player return true // ladders can always support player
} }
val shape = state.getCollisionShape(ply.level(), blockPos, CollisionContext.of(ply)) val shape = state.getCollisionShape(ply.level, blockPos, CollisionContext.of(ply))
return Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_SUPPORT_PLAYER, BooleanOp.AND) return Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_SUPPORT_PLAYER, BooleanOp.AND)
} }
private fun isWall(blockPos: BlockPos): Boolean { private fun isWall(blockPos: BlockPos): Boolean {
val shape = ply.level().getBlockState(blockPos).getCollisionShape(ply.level(), blockPos, CollisionContext.of(ply)) val shape = ply.level.getBlockState(blockPos).getCollisionShape(ply.level, blockPos, CollisionContext.of(ply))
return Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_NOT_FENCE, BooleanOp.AND) return Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_NOT_FENCE, BooleanOp.AND)
} }
private fun isAirGap(blockPos: BlockPos): Boolean { private fun isAirGap(blockPos: BlockPos): Boolean {
val state = ply.level().getBlockState(blockPos) val state = ply.level.getBlockState(blockPos)
if (state.isAir) { if (state.isAir) {
return true return true
} }
val shape = state.getCollisionShape(ply.level(), blockPos, CollisionContext.of(ply)) val shape = state.getCollisionShape(ply.level, blockPos, CollisionContext.of(ply))
return shape.isEmpty || !Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_SUPPORT_PLAYER, BooleanOp.AND) return shape.isEmpty || !Shapes.joinIsNotEmpty(shape, SHAPE_CHECK_SUPPORT_PLAYER, BooleanOp.AND)
} }
@ -140,7 +140,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
val headPosition = ply.eyePosition val headPosition = ply.eyePosition
val aimVector = ply.getViewVector(1f) val aimVector = ply.getViewVector(1f)
val result = ply.level().clip(ClipContext( val result = ply.level.clip(ClipContext(
headPosition, headPosition,
headPosition + aimVector * (AndroidConfig.EnderTeleporter.MAX_DISTANCE * 2.0), headPosition + aimVector * (AndroidConfig.EnderTeleporter.MAX_DISTANCE * 2.0),
ClipContext.Block.COLLIDER, ClipContext.Block.COLLIDER,
@ -199,14 +199,14 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
val searchDirection: IntProgression val searchDirection: IntProgression
if (ply.isShiftKeyDown) { if (ply.isShiftKeyDown) {
searchDirection = -1 downTo ply.level().minBuildHeight - ply.level().maxBuildHeight searchDirection = -1 downTo ply.level.minBuildHeight - ply.level.maxBuildHeight
} else { } else {
searchDirection = (if (ply.level().getBlockState(result.blockPos).`is`(BlockTags.CLIMBABLE)) -1 else 0) .. ply.level().maxBuildHeight - ply.level().minBuildHeight searchDirection = (if (ply.level.getBlockState(result.blockPos).`is`(BlockTags.CLIMBABLE)) -1 else 0) .. ply.level.maxBuildHeight - ply.level.minBuildHeight
} }
for (y in searchDirection) { for (y in searchDirection) {
val pos = BlockPos(result.blockPos.x, result.blockPos.y + y + 1, result.blockPos.z) val pos = BlockPos(result.blockPos.x, result.blockPos.y + y + 1, result.blockPos.z)
val state = ply.level().getBlockState(pos) val state = ply.level.getBlockState(pos)
if (state.`is`(Blocks.BEDROCK)) { if (state.`is`(Blocks.BEDROCK)) {
// Can't phase through bedrock // Can't phase through bedrock
@ -258,9 +258,9 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
phasedBlocks = 0 phasedBlocks = 0
phasedBlocksList.clear() phasedBlocksList.clear()
for (y in 0 downTo ply.level().maxBuildHeight - ply.level().minBuildHeight) { for (y in 0 downTo ply.level.maxBuildHeight - ply.level.minBuildHeight) {
val pos = BlockPos(result.blockPos.x, result.blockPos.y + y, result.blockPos.z) val pos = BlockPos(result.blockPos.x, result.blockPos.y + y, result.blockPos.z)
val state = ply.level().getBlockState(pos) val state = ply.level.getBlockState(pos)
if (state.`is`(Blocks.BEDROCK)) { if (state.`is`(Blocks.BEDROCK)) {
// Can't phase through bedrock // Can't phase through bedrock
@ -302,7 +302,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
val event = ForgeEventFactory.onEnderTeleport(ply, blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5) val event = ForgeEventFactory.onEnderTeleport(ply, blockPos.x + 0.5, blockPos.y.toDouble(), blockPos.z + 0.5)
if (event.isCanceled) { if (event.isCanceled) {
(ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level().random.nextLong())) (ply as ServerPlayer).connection.send(ClientboundSoundEntityPacket(SoundEvents.ITEM_BREAK.holder, SoundSource.PLAYERS, ply, 0.3f, 0.5f, ply.level.random.nextLong()))
return false return false
} }
@ -310,9 +310,9 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
lastTeleport = ply.server!!.tickCount lastTeleport = ply.server!!.tickCount
android.androidEnergy.extractEnergy(AndroidConfig.EnderTeleporter.ENERGY_COST, false) android.androidEnergy.extractEnergy(AndroidConfig.EnderTeleporter.ENERGY_COST, false)
ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level().random.nextFloat() * 0.4f) ply.level.playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 0.3f, 0.8f + ply.level.random.nextFloat() * 0.4f)
ply.teleportTo(event.targetX, event.targetY, event.targetZ) ply.teleportTo(event.targetX, event.targetY, event.targetZ)
ply.level().playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level().random.nextFloat() * 0.4f) ply.level.playSound(null, ply, SoundEvents.ENDERMAN_TELEPORT, SoundSource.PLAYERS, 1f, 0.8f + ply.level.random.nextFloat() * 0.4f)
ply.deltaMovement = Vector(0.0, 0.0, 0.0) ply.deltaMovement = Vector(0.0, 0.0, 0.0)
ply.resetFallDistance() ply.resetFallDistance()
@ -352,8 +352,8 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
val builder = source.getBuffer(linesIgnoreZRenderType) val builder = source.getBuffer(linesIgnoreZRenderType)
for (blockPos in phasedBlocks) { for (blockPos in phasedBlocks) {
val blockState = ply.level().getBlockState(blockPos) val blockState = ply.level.getBlockState(blockPos)
val shape = blockState.getShape(ply.level(), blockPos, collisionContext) val shape = blockState.getShape(ply.level, blockPos, collisionContext)
LevelRenderer.renderShape( LevelRenderer.renderShape(
poseStack, poseStack,

View File

@ -45,7 +45,7 @@ class ItemEntityDataPacket(val itemUUID: Int, val owner: UUID? = null, val age:
} }
override fun play(context: MNetworkContext) { override fun play(context: MNetworkContext) {
val level = minecraft.player?.level() as ClientLevel? ?: return val level = minecraft.player?.level as ClientLevel? ?: return
val entity = level.getEntity(itemUUID) as ItemEntity? ?: return val entity = level.getEntity(itemUUID) as ItemEntity? ?: return
datatable[entity] = SharedItemEntityData(owner, age, lifespan, hasPickupDelay) datatable[entity] = SharedItemEntityData(owner, age, lifespan, hasPickupDelay)
} }
@ -69,7 +69,7 @@ class ItemMagnetFeature(capability: MatteryPlayerCapability) : AndroidSwitchable
return return
} }
val entities = ply.level().getEntitiesInEllipsoid( val entities = ply.level.getEntitiesInEllipsoid(
ply.position, ply.position,
Vector(AndroidConfig.Magnet.RADIUS_HORIZONTAL, AndroidConfig.Magnet.RADIUS_VERTICAL, AndroidConfig.Magnet.RADIUS_HORIZONTAL), Vector(AndroidConfig.Magnet.RADIUS_HORIZONTAL, AndroidConfig.Magnet.RADIUS_VERTICAL, AndroidConfig.Magnet.RADIUS_HORIZONTAL),
if (server) Predicate<Entity> { it is ItemEntity } else clientPredicate if (server) Predicate<Entity> { it is ItemEntity } else clientPredicate

View File

@ -38,7 +38,7 @@ object TriggerJumpBoostPacket : MatteryPacket {
if (feature.isActive && feature.cooldown <= 4 && mattery.androidEnergy.extractEnergyExact(AndroidConfig.JumpBoost.ENERGY_COST, false)) { if (feature.isActive && feature.cooldown <= 4 && mattery.androidEnergy.extractEnergyExact(AndroidConfig.JumpBoost.ENERGY_COST, false)) {
feature.putOnCooldown() feature.putOnCooldown()
context.sender.level().playSound( context.sender.level.playSound(
context.sender, context.sender, context.sender, context.sender,
MSoundEvents.ANDROID_JUMP_BOOST, SoundSource.PLAYERS, MSoundEvents.ANDROID_JUMP_BOOST, SoundSource.PLAYERS,
1f, 1f 1f, 1f
@ -73,20 +73,20 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
} }
val old = lastGround val old = lastGround
lastGround = ply.onGround() lastGround = ply.isOnGround
if (isActive && cooldown <= 0 && old != lastGround && !lastGround && isJumping && isShifting && ply.xRot <= ClientConfig.JUMP_BOOST_LOOK_ANGLE && android.androidEnergy.extractEnergyExact(AndroidConfig.JumpBoost.ENERGY_COST, true)) { if (isActive && cooldown <= 0 && old != lastGround && !lastGround && isJumping && isShifting && ply.xRot <= ClientConfig.JUMP_BOOST_LOOK_ANGLE && android.androidEnergy.extractEnergyExact(AndroidConfig.JumpBoost.ENERGY_COST, true)) {
ply.deltaMovement += Vector(0.0, AndroidConfig.JumpBoost.POWER * (level + 1) / 20.0, 0.0) ply.deltaMovement += Vector(0.0, AndroidConfig.JumpBoost.POWER * (level + 1) / 20.0, 0.0)
putOnCooldown() putOnCooldown()
MatteryPlayerNetworkChannel.sendToServer(TriggerJumpBoostPacket) MatteryPlayerNetworkChannel.sendToServer(TriggerJumpBoostPacket)
ply.level().playSound( ply.level.playSound(
ply, ply, ply, ply,
MSoundEvents.ANDROID_JUMP_BOOST, SoundSource.PLAYERS, MSoundEvents.ANDROID_JUMP_BOOST, SoundSource.PLAYERS,
1f, 1f 1f, 1f
) )
SmokeParticlesPacket.makeSmoke(ply.x, ply.y, ply.z, ply.random, ply.level()) SmokeParticlesPacket.makeSmoke(ply.x, ply.y, ply.z, ply.random, ply.level)
} }
} }

View File

@ -17,7 +17,7 @@ class NanobotsRegenerationFeature(android: MatteryPlayerCapability) : AndroidFea
private var healTicks = 0 private var healTicks = 0
override fun tickServer() { override fun tickServer() {
if (ply.isHurt && ply.level().gameRules.getBoolean(GameRules.RULE_NATURAL_REGENERATION)) { if (ply.isHurt && ply.level.gameRules.getBoolean(GameRules.RULE_NATURAL_REGENERATION)) {
ticksPassed++ ticksPassed++
val waitTime = AndroidConfig.NanobotsRegeneration.COOLDOWN.getOrElse(healTicks) { AndroidConfig.NanobotsRegeneration.COOLDOWN.last() } val waitTime = AndroidConfig.NanobotsRegeneration.COOLDOWN.getOrElse(healTicks) { AndroidConfig.NanobotsRegeneration.COOLDOWN.last() }

View File

@ -93,7 +93,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
ShockwaveTrigger.trigger(ply as ServerPlayer) ShockwaveTrigger.trigger(ply as ServerPlayer)
MatteryPlayerNetworkChannel.sendTrackingAndSelf(ply, ShockwaveEffectPacket(ply.position)) MatteryPlayerNetworkChannel.sendTrackingAndSelf(ply, ShockwaveEffectPacket(ply.position))
ply.level().playSound( ply.level.playSound(
null, null,
ply, ply,
MSoundEvents.ANDROID_SHOCKWAVE, MSoundEvents.ANDROID_SHOCKWAVE,
@ -104,13 +104,13 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
} }
// TODO: raycasting // TODO: raycasting
val entities = ply.level().getEntitiesInEllipsoid( val entities = ply.level.getEntitiesInEllipsoid(
ply.position, ply.position,
Vector(AndroidConfig.Shockwave.RADIUS_HORIZONTAL, AndroidConfig.Shockwave.RADIUS_VERTICAL, AndroidConfig.Shockwave.RADIUS_HORIZONTAL), Vector(AndroidConfig.Shockwave.RADIUS_HORIZONTAL, AndroidConfig.Shockwave.RADIUS_VERTICAL, AndroidConfig.Shockwave.RADIUS_HORIZONTAL),
except = ply, except = ply,
) { (it !is LivingEntity || !it.isSpectator && it.isAlive) } ) { (it !is LivingEntity || !it.isSpectator && it.isAlive) }
val wardens = ply.level().getEntitiesInEllipsoid( val wardens = ply.level.getEntitiesInEllipsoid(
Warden::class.java, Warden::class.java,
ply.position, ply.position,
Vector(AndroidConfig.Shockwave.RADIUS_HORIZONTAL_WARDEN, AndroidConfig.Shockwave.RADIUS_VERTICAL_WARDEN, AndroidConfig.Shockwave.RADIUS_HORIZONTAL_WARDEN), Vector(AndroidConfig.Shockwave.RADIUS_HORIZONTAL_WARDEN, AndroidConfig.Shockwave.RADIUS_VERTICAL_WARDEN, AndroidConfig.Shockwave.RADIUS_HORIZONTAL_WARDEN),
@ -122,7 +122,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
seen.add(entity) seen.add(entity)
val multiplier = (1.0 - distanceMultiplier).pow(0.5) val multiplier = (1.0 - distanceMultiplier).pow(0.5)
val source = MatteryDamageSource(ply.level().registryAccess().damageType(MDamageTypes.SHOCKWAVE), ply) val source = MatteryDamageSource(ply.level.registryAccess().damageType(MDamageTypes.SHOCKWAVE), ply)
val damage = multiplier.toFloat() * AndroidConfig.Shockwave.DAMAGE.toFloat() * AndroidConfig.Shockwave.WARDEN_DAMAGE_MULT.toFloat() val damage = multiplier.toFloat() * AndroidConfig.Shockwave.DAMAGE.toFloat() * AndroidConfig.Shockwave.WARDEN_DAMAGE_MULT.toFloat()
entity.hurt(source, damage) entity.hurt(source, damage)
entity.deltaMovement += (entity.position - ply.position).normalize() * (multiplier * 3.0) entity.deltaMovement += (entity.position - ply.position).normalize() * (multiplier * 3.0)
@ -138,7 +138,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
// don't hurt items, arrows, etc etc // don't hurt items, arrows, etc etc
if (entity is LivingEntity) { if (entity is LivingEntity) {
val source = MatteryDamageSource(ply.level().registryAccess().damageType(MDamageTypes.SHOCKWAVE), ply) val source = MatteryDamageSource(ply.level.registryAccess().damageType(MDamageTypes.SHOCKWAVE), ply)
val damage = multiplier.toFloat() * AndroidConfig.Shockwave.DAMAGE.toFloat() val damage = multiplier.toFloat() * AndroidConfig.Shockwave.DAMAGE.toFloat()
entity.hurt(source, damage) entity.hurt(source, damage)
entity.deltaMovement += (entity.position - ply.position).normalize() * (multiplier * 3.0) entity.deltaMovement += (entity.position - ply.position).normalize() * (multiplier * 3.0)
@ -158,21 +158,21 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
for (blockPos in getEllipsoidBlockPositions(AndroidConfig.Shockwave.RADIUS_HORIZONTAL.roundToInt(), AndroidConfig.Shockwave.RADIUS_VERTICAL.roundToInt(), AndroidConfig.Shockwave.RADIUS_HORIZONTAL.roundToInt())) { for (blockPos in getEllipsoidBlockPositions(AndroidConfig.Shockwave.RADIUS_HORIZONTAL.roundToInt(), AndroidConfig.Shockwave.RADIUS_VERTICAL.roundToInt(), AndroidConfig.Shockwave.RADIUS_HORIZONTAL.roundToInt())) {
val newBlockPos = blockPos + rounded val newBlockPos = blockPos + rounded
val blockState = ply.level().getBlockState(newBlockPos) val blockState = ply.level.getBlockState(newBlockPos)
if (!blockState.isAir && blockState.getExplosionResistance(ply.level(), newBlockPos) <= 0f && ply.level().getBlockEntity(newBlockPos) == null && blockState.block.defaultDestroyTime() >= 0f) { if (!blockState.isAir && blockState.getExplosionResistance(ply.level, newBlockPos) <= 0f && ply.level.getBlockEntity(newBlockPos) == null && blockState.block.defaultDestroyTime() >= 0f) {
// Block.dropResources(blockState, ply.level(), newBlockPos) // Block.dropResources(blockState, ply.level, newBlockPos)
// blockState.block.destroy(ply.level(), newBlockPos, blockState) // blockState.block.destroy(ply.level, newBlockPos, blockState)
// ply.level().setBlock(newBlockPos, blockState.fluidState.createLegacyBlock(), Block.UPDATE_ALL) // ply.level.setBlock(newBlockPos, blockState.fluidState.createLegacyBlock(), Block.UPDATE_ALL)
ply.level().destroyBlock(newBlockPos, true) ply.level.destroyBlock(newBlockPos, true)
} }
} }
} }
} }
private fun ticker(isClient: Boolean) { private fun ticker(isClient: Boolean) {
if (!ply.onGround() || ply.isSpectator) { if (!ply.isOnGround || ply.isSpectator) {
airTicks = (airTicks + 1).coerceAtMost(3) airTicks = (airTicks + 1).coerceAtMost(3)
} else { } else {
airTicks = (airTicks - 1).coerceAtLeast(0) airTicks = (airTicks - 1).coerceAtLeast(0)
@ -192,7 +192,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
creativeFlightTicks == 0 creativeFlightTicks == 0
) { ) {
val old = wasMidair val old = wasMidair
wasMidair = !ply.onGround() wasMidair = !ply.isOnGround
if (wasMidair) { if (wasMidair) {
highestSpeed = (-ply.deltaMovement.y).coerceAtLeast(highestSpeed) highestSpeed = (-ply.deltaMovement.y).coerceAtLeast(highestSpeed)

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.block package ru.dbotthepony.mc.otm.block
import net.minecraft.core.BlockPos import net.minecraft.core.BlockPos
import net.minecraft.world.item.DyeColor
import net.minecraft.world.level.BlockGetter import net.minecraft.world.level.BlockGetter
import net.minecraft.world.level.Level import net.minecraft.world.level.Level
import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.Block
@ -10,7 +11,7 @@ import net.minecraft.world.level.block.entity.BlockEntity
import net.minecraft.world.level.block.entity.BlockEntityTicker import net.minecraft.world.level.block.entity.BlockEntityTicker
import net.minecraft.world.level.block.entity.BlockEntityType import net.minecraft.world.level.block.entity.BlockEntityType
import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.level.block.state.BlockState
import net.minecraft.world.level.material.MapColor import net.minecraft.world.level.material.Material
import net.minecraft.world.level.material.PushReaction import net.minecraft.world.level.material.PushReaction
import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.CollisionContext
import net.minecraft.world.phys.shapes.VoxelShape import net.minecraft.world.phys.shapes.VoxelShape
@ -19,7 +20,7 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities
import ru.dbotthepony.mc.otm.shapes.BlockShapes import ru.dbotthepony.mc.otm.shapes.BlockShapes
class BlackHoleBlock : class BlackHoleBlock :
Block(Properties.of().mapColor(MapColor.COLOR_BLACK).noCollission().pushReaction(PushReaction.BLOCK).sound(SoundType.STONE).strength(-1f, 7200000.0f)), EntityBlock { Block(Properties.of(Material.AIR, DyeColor.BLACK).noCollission().pushReaction(PushReaction.BLOCK).sound(SoundType.STONE).strength(-1f, 7200000.0f)), EntityBlock {
override fun getShape( override fun getShape(
p_60555_: BlockState, p_60555_: BlockState,
p_60556_: BlockGetter, p_60556_: BlockGetter,

View File

@ -33,7 +33,7 @@ class ExperienceStorage(val maxExperience: DoubleSupplier = DoubleSupplier { Dou
if (whole > 0) { if (whole > 0) {
experience -= whole experience -= whole
ExperienceOrb.award(player.level() as ServerLevel, player.position(), whole) ExperienceOrb.award(player.level as ServerLevel, player.position(), whole)
} }
} }

View File

@ -149,7 +149,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
@Cancelable @Cancelable
data class PreTick(val capability: MatteryPlayerCapability) : Event() { data class PreTick(val capability: MatteryPlayerCapability) : Event() {
val player get() = capability.ply val player get() = capability.ply
val level: Level get() = capability.ply.level() val level: Level get() = capability.ply.level
override fun isCancelable(): Boolean { override fun isCancelable(): Boolean {
return true return true
@ -161,7 +161,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
*/ */
data class PostTick(val capability: MatteryPlayerCapability) : Event() { data class PostTick(val capability: MatteryPlayerCapability) : Event() {
val player get() = capability.ply val player get() = capability.ply
val level: Level get() = capability.ply.level() val level: Level get() = capability.ply.level
override fun isCancelable(): Boolean { override fun isCancelable(): Boolean {
return false return false
@ -174,7 +174,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
*/ */
data class ItemStackLeftoverEvent(val stack: ItemStack, val capability: MatteryPlayerCapability) : Event() { data class ItemStackLeftoverEvent(val stack: ItemStack, val capability: MatteryPlayerCapability) : Event() {
val player get() = capability.ply val player get() = capability.ply
val level: Level get() = capability.ply.level() val level: Level get() = capability.ply.level
override fun isCancelable(): Boolean { override fun isCancelable(): Boolean {
return false return false
@ -525,7 +525,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
override fun computeNextJob(): JobContainer<ItemJob> { override fun computeNextJob(): JobContainer<ItemJob> {
if (!exopackEnergy.batteryLevel.isPositive) return JobContainer.noEnergy() if (!exopackEnergy.batteryLevel.isPositive) return JobContainer.noEnergy()
val level = ply.level() as? ServerLevel ?: return JobContainer.failure() val level = ply.level as? ServerLevel ?: return JobContainer.failure()
val recipe = cache.getRecipeFor(input, level) val recipe = cache.getRecipeFor(input, level)
if (recipe.isEmpty) { if (recipe.isEmpty) {
@ -542,7 +542,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
override fun onJobTick(status: JobStatus<ItemJob>) { override fun onJobTick(status: JobStatus<ItemJob>) {
super.onJobTick(status) super.onJobTick(status)
if (isExopackVisible && ply.level().random.nextFloat() <= 0.05f) { if (isExopackVisible && ply.level.random.nextFloat() <= 0.05f) {
MatteryPlayerNetworkChannel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with { ply as ServerPlayer }, ExopackSmokePacket(ply.uuid)) MatteryPlayerNetworkChannel.send(PacketDistributor.TRACKING_ENTITY_AND_SELF.with { ply as ServerPlayer }, ExopackSmokePacket(ply.uuid))
} }
} }
@ -685,7 +685,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
becomeAndroid() becomeAndroid()
if (!ply.abilities.invulnerable) if (!ply.abilities.invulnerable)
ply.hurt(MatteryDamageSource(ply.level().registryAccess().damageType(MDamageTypes.BECOME_ANDROID)), ply.maxHealth * 2) ply.hurt(MatteryDamageSource(ply.level.registryAccess().damageType(MDamageTypes.BECOME_ANDROID)), ply.maxHealth * 2)
} }
/** /**
@ -747,7 +747,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
becomeHumane() becomeHumane()
if (!ply.abilities.invulnerable) if (!ply.abilities.invulnerable)
ply.hurt(MatteryDamageSource(ply.level().registryAccess().damageType(MDamageTypes.BECOME_HUMANE)), ply.maxHealth * 2) ply.hurt(MatteryDamageSource(ply.level.registryAccess().damageType(MDamageTypes.BECOME_HUMANE)), ply.maxHealth * 2)
} }
/** /**
@ -808,7 +808,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
if (featureMap.containsKey(feature.type)) return false if (featureMap.containsKey(feature.type)) return false
featureMap[feature.type] = feature featureMap[feature.type] = feature
if (!ply.level().isClientSide) { if (!ply.level.isClientSide) {
queuedTicks.add(feature::applyModifiers) queuedTicks.add(feature::applyModifiers)
} }
@ -836,7 +836,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
featureMap[feature] = factory featureMap[feature] = factory
if (!ply.level().isClientSide && isAndroid) { if (!ply.level.isClientSide && isAndroid) {
queuedTicks.add(factory::applyModifiers) queuedTicks.add(factory::applyModifiers)
} }
@ -861,7 +861,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
val removed = featureMap.remove(feature) val removed = featureMap.remove(feature)
if (removed != null) { if (removed != null) {
if (!ply.level().isClientSide && isAndroid) { if (!ply.level.isClientSide && isAndroid) {
queuedTicks.add(removed::removeModifiers) queuedTicks.add(removed::removeModifiers)
} }
@ -1034,7 +1034,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
instance.deserializeNBT(featureTag) instance.deserializeNBT(featureTag)
addFeature(instance) addFeature(instance)
if (!ply.level().isClientSide) { if (!ply.level.isClientSide) {
queuedTicks.add(instance::applyModifiers) queuedTicks.add(instance::applyModifiers)
} }
} }
@ -1088,7 +1088,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
if (hasExopack) { if (hasExopack) {
for ((i, stack) in exopackContainer.withIndex()) { for ((i, stack) in exopackContainer.withIndex()) {
if (!stack.isEmpty) { if (!stack.isEmpty) {
stack.inventoryTick(ply.level(), ply, i + 41, false) stack.inventoryTick(ply.level, ply, i + 41, false)
} }
} }
} }
@ -1197,8 +1197,8 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
ply.isSwimming = false ply.isSwimming = false
if (ply is ServerPlayer) { if (ply is ServerPlayer) {
if (ply.level().dimension().location() != lastDimension) { if (ply.level.dimension().location() != lastDimension) {
lastDimension = ply.level().dimension().location() lastDimension = ply.level.dimension().location()
wasInLiquid = false wasInLiquid = false
lastOutsideLiquid = ply.position lastOutsideLiquid = ply.position
} }
@ -1243,7 +1243,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
while (stats.foodLevel > 18 && androidEnergy.receiveEnergyExact(AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT / 2, false)) { while (stats.foodLevel > 18 && androidEnergy.receiveEnergyExact(AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT / 2, false)) {
stats.foodLevel-- stats.foodLevel--
} }
} else if (ply.level().difficulty != Difficulty.PEACEFUL) { } else if (ply.level.difficulty != Difficulty.PEACEFUL) {
stats.foodLevel = stats.foodLevel.coerceAtMost(18) stats.foodLevel = stats.foodLevel.coerceAtMost(18)
} }
@ -1255,7 +1255,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
stats.setSaturation(stats.saturationLevel + (extracted / AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT).toFloat()) stats.setSaturation(stats.saturationLevel + (extracted / AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT).toFloat())
} }
if (androidEnergy.batteryLevel <= Decimal.TEN && !ply.isCreative && ply.level().difficulty != Difficulty.PEACEFUL) { if (androidEnergy.batteryLevel <= Decimal.TEN && !ply.isCreative && ply.level.difficulty != Difficulty.PEACEFUL) {
if (stats.saturationLevel > 1f) { if (stats.saturationLevel > 1f) {
if (androidEnergy.receiveEnergyExact(AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT, false)) { if (androidEnergy.receiveEnergyExact(AndroidConfig.ANDROID_ENERGY_PER_HUNGER_POINT, false)) {
stats.setSaturation(stats.saturationLevel - 1f) stats.setSaturation(stats.saturationLevel - 1f)
@ -1272,7 +1272,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
} }
if (androidEnergy.batteryLevel <= Decimal.TEN) { if (androidEnergy.batteryLevel <= Decimal.TEN) {
if (--nextDischargeHurt <= 0 && ply.hurt(DamageSource(ply.level().registryAccess().damageType(MDamageTypes.ANDROID_DISCHARGE)), 1f)) { if (--nextDischargeHurt <= 0 && ply.hurt(DamageSource(ply.level.registryAccess().damageType(MDamageTypes.ANDROID_DISCHARGE)), 1f)) {
nextDischargeHurt = 20 nextDischargeHurt = 20
} }
@ -1285,13 +1285,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
} else { } else {
nextDischargeHurt = 20 nextDischargeHurt = 20
if (ply.isHurt && ply.level().gameRules.getBoolean(GameRules.RULE_NATURAL_REGENERATION)) { if (ply.isHurt && ply.level.gameRules.getBoolean(GameRules.RULE_NATURAL_REGENERATION)) {
if (--nextHealTick <= 0) { if (--nextHealTick <= 0) {
nextHealTick = if (ply.level().difficulty == Difficulty.PEACEFUL) 10 else AndroidConfig.TIME_BETWEEN_NATURAL_REGENERATION nextHealTick = if (ply.level.difficulty == Difficulty.PEACEFUL) 10 else AndroidConfig.TIME_BETWEEN_NATURAL_REGENERATION
ply.heal(1f) ply.heal(1f)
} }
} else { } else {
nextHealTick = if (ply.level().difficulty == Difficulty.PEACEFUL) 10 else AndroidConfig.TIME_BETWEEN_NATURAL_REGENERATION nextHealTick = if (ply.level.difficulty == Difficulty.PEACEFUL) 10 else AndroidConfig.TIME_BETWEEN_NATURAL_REGENERATION
} }
} }
} }
@ -1418,7 +1418,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
pos.mul(RenderSystem.getProjectionMatrix()) pos.mul(RenderSystem.getProjectionMatrix())
pos.mul(poseStack.last().pose()) pos.mul(poseStack.last().pose())
makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level().random, ply.level()) makeSmoke(cam.x + pos.x, cam.y + pos.y, cam.z + pos.z, ply.level.random, ply.level)
} }
} }
@ -1513,13 +1513,13 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, INBTSerial
val ent = event.player val ent = event.player
if (event.phase == TickEvent.Phase.START) { if (event.phase == TickEvent.Phase.START) {
if (!ent.level().isClientSide) { if (!ent.level.isClientSide) {
ent.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK { ent.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK {
it.preTick() it.preTick()
} }
} }
} else { } else {
if (ent.level().isClientSide) { if (ent.level.isClientSide) {
ent.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK { ent.getCapability(MatteryCapability.MATTERY_PLAYER).ifPresentK {
it.tickClient() it.tickClient()
} }

View File

@ -56,7 +56,7 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
val x = minecraft.window.guiScaledWidth.toFloat() * .5f + iconSize / 2f val x = minecraft.window.guiScaledWidth.toFloat() * .5f + iconSize / 2f
val y = minecraft.window.guiScaledHeight.toFloat() * .5f - iconSize / 2f val y = minecraft.window.guiScaledHeight.toFloat() * .5f - iconSize / 2f
val wrap = MGUIGraphics(event.guiGraphics) val wrap = MGUIGraphics(event.poseStack)
feature.renderIcon(wrap, x, y, iconSize, iconSize) feature.renderIcon(wrap, x, y, iconSize, iconSize)

View File

@ -155,7 +155,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
RenderSystem.setShaderColor(0f, 0f, 0f, 0.6f) RenderSystem.setShaderColor(0f, 0f, 0f, 0.6f)
val size = minecraft.window.guiScaledHeight.coerceAtMost(minecraft.window.guiScaledWidth).toFloat() * 0.35f val size = minecraft.window.guiScaledHeight.coerceAtMost(minecraft.window.guiScaledWidth).toFloat() * 0.35f
val wrap = MGUIGraphics(event.guiGraphics) val wrap = MGUIGraphics(event.poseStack)
wrap.drawArc( wrap.drawArc(
minecraft.window.guiScaledWidth / 2f, minecraft.window.guiScaledWidth / 2f,
@ -241,7 +241,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
val iconSize = size * 0.25f val iconSize = size * 0.25f
val poseStack = event.guiGraphics.pose() val poseStack = event.poseStack
poseStack.pushPose() poseStack.pushPose()
poseStack.translate(minecraft.window.guiScaledWidth.toDouble() / 2f, minecraft.window.guiScaledHeight.toDouble() / 2f, 0.0) poseStack.translate(minecraft.window.guiScaledWidth.toDouble() / 2f, minecraft.window.guiScaledHeight.toDouble() / 2f, 0.0)
@ -294,7 +294,7 @@ object AndroidMenuKeyMapping : KeyMapping("key.otm.android_menu", KeyConflictCon
val y = minecraft.window.guiScaledHeight * 0.2f val y = minecraft.window.guiScaledHeight * 0.2f
var x = minecraft.window.guiScaledWidth * 0.5f - (features.size.toFloat() * COOLDOWN_ICON_SIZE / 2f + (features.size - 1).toFloat() * (COOLDOWN_ICON_MARGIN / 2f)) var x = minecraft.window.guiScaledWidth * 0.5f - (features.size.toFloat() * COOLDOWN_ICON_SIZE / 2f + (features.size - 1).toFloat() * (COOLDOWN_ICON_MARGIN / 2f))
val wrap = MGUIGraphics(event.guiGraphics) val wrap = MGUIGraphics(event.poseStack)
for (feature in features) { for (feature in features) {
feature.renderIcon(wrap, x, y, COOLDOWN_ICON_SIZE, COOLDOWN_ICON_SIZE) feature.renderIcon(wrap, x, y, COOLDOWN_ICON_SIZE, COOLDOWN_ICON_SIZE)

View File

@ -60,7 +60,7 @@ fun onMovementInputUpdate(event: MovementInputUpdateEvent) {
cap.lastJumpTicks = 14 cap.lastJumpTicks = 14
} else { } else {
if (ply.isInWater) { if (ply.isInWater) {
if (ply.onGround()) { if (ply.isOnGround) {
cap.lastJumpTicks = 14 cap.lastJumpTicks = 14
} }

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.client package ru.dbotthepony.mc.otm.client
import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.gui.Font import net.minecraft.client.gui.Font
import net.minecraft.client.gui.components.Button import net.minecraft.client.gui.components.Button
@ -141,7 +142,7 @@ object MatteryGUI {
return return
} }
val guiGraphics = MGUIGraphics(event.guiGraphics) val guiGraphics = MGUIGraphics(event.poseStack)
val stack = guiGraphics.pose val stack = guiGraphics.pose
val window = event.window val window = event.window
@ -253,7 +254,7 @@ object MatteryGUI {
val leftPadding = ceil(level * 80f - 0.5f) val leftPadding = ceil(level * 80f - 0.5f)
val guiGraphics = MGUIGraphics(event.guiGraphics) val guiGraphics = MGUIGraphics(event.poseStack)
if (ply.hasEffect(MobEffects.HUNGER)) { if (ply.hasEffect(MobEffects.HUNGER)) {
CHARGE_HUNGER_BG.render(guiGraphics, left.toFloat(), top.toFloat()) CHARGE_HUNGER_BG.render(guiGraphics, left.toFloat(), top.toFloat())
@ -323,7 +324,7 @@ object MatteryGUI {
val top: Int = height - gui.leftHeight val top: Int = height - gui.leftHeight
gui.leftHeight += 10 gui.leftHeight += 10
val guiGraphics = MGUIGraphics(event.guiGraphics) val guiGraphics = MGUIGraphics(event.poseStack)
HEALTH_BG.render(guiGraphics, left.toFloat(), top.toFloat()) HEALTH_BG.render(guiGraphics, left.toFloat(), top.toFloat())
@ -360,7 +361,7 @@ object MatteryGUI {
} }
} }
fun renderShieldCooldownOverlay(graphics: GuiGraphics, font: Font, stack: ItemStack, x: Int, y: Int): Boolean { fun renderShieldCooldownOverlay(pose: PoseStack, font: Font, stack: ItemStack, x: Int, y: Int): Boolean {
if (!stack.isEmpty && stack.item is ShieldItem) { if (!stack.isEmpty && stack.item is ShieldItem) {
if (!stack.canPerformAction(ToolActions.SHIELD_BLOCK)) return false if (!stack.canPerformAction(ToolActions.SHIELD_BLOCK)) return false
@ -369,7 +370,7 @@ object MatteryGUI {
val percent = ((stack.item.getUseDuration(stack) - ply.useItemRemainingTicks + minecraft.partialTick) / 5f).coerceIn(0f, 1f) val percent = ((stack.item.getUseDuration(stack) - ply.useItemRemainingTicks + minecraft.partialTick) / 5f).coerceIn(0f, 1f)
RenderSystem.setShaderColor(1f, 1f, 1f, 0.5f) RenderSystem.setShaderColor(1f, 1f, 1f, 0.5f)
drawArc(graphics.pose(), x + 8f, y + 8f, 8f, 0f, PI / 2.0, PI / 2.0 + PI * 2.0 * percent, alignAtCenter = true) drawArc(pose, x + 8f, y + 8f, 8f, 0f, PI / 2.0, PI / 2.0 + PI * 2.0 * percent, alignAtCenter = true)
RenderSystem.setShaderColor(1f, 1f, 1f, 1f) RenderSystem.setShaderColor(1f, 1f, 1f, 1f)
return true return true

View File

@ -1,9 +1,12 @@
package ru.dbotthepony.mc.otm.client.render package ru.dbotthepony.mc.otm.client.render
import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack import com.mojang.blaze3d.vertex.PoseStack
import com.mojang.blaze3d.vertex.Tesselator
import net.minecraft.client.gui.Font import net.minecraft.client.gui.Font
import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.MultiBufferSource
import net.minecraft.client.renderer.RenderBuffers
import net.minecraft.client.renderer.texture.TextureAtlasSprite import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
@ -15,15 +18,14 @@ import kotlin.math.PI
import kotlin.math.roundToInt import kotlin.math.roundToInt
// polyfill class for 1.19.4 and older // polyfill class for 1.19.4 and older
class MGUIGraphics(val parent: GuiGraphics) { class MGUIGraphics(val pose: PoseStack) {
val pose: PoseStack get() = parent.pose() val bufferSource: MultiBufferSource.BufferSource get() = minecraft.renderBuffers().crumblingBufferSource()
val bufferSource: MultiBufferSource.BufferSource get() = parent.bufferSource() val width get() = minecraft.window.guiScaledWidth
val width get() = parent.guiWidth() val height get() = minecraft.window.guiScaledHeight
val height get() = parent.guiHeight()
val font: Font get() = minecraft.font val font: Font get() = minecraft.font
fun setColor(red: Float, green: Float, blue: Float, alpha: Float) { fun setColor(red: Float, green: Float, blue: Float, alpha: Float) {
parent.setColor(red, green, blue, alpha) RenderSystem.setShaderColor(red, green, blue, alpha)
} }
fun renderFakeItem(itemStack: ItemStack, x: Int, y: Int) { fun renderFakeItem(itemStack: ItemStack, x: Int, y: Int) {
@ -83,7 +85,6 @@ class MGUIGraphics(val parent: GuiGraphics) {
} }
fun flush() { fun flush() {
parent.flush()
} }
fun draw( fun draw(

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.client.screen package ru.dbotthepony.mc.otm.client.screen
import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.systems.RenderSystem
import com.mojang.blaze3d.vertex.PoseStack
import it.unimi.dsi.fastutil.ints.Int2ObjectFunction import it.unimi.dsi.fastutil.ints.Int2ObjectFunction
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
import net.minecraft.ChatFormatting import net.minecraft.ChatFormatting
@ -610,7 +611,7 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
return super.keyPressed(key, scancode, mods) return super.keyPressed(key, scancode, mods)
} }
override fun renderBg(p_283065_: GuiGraphics, p_97788_: Float, p_97789_: Int, p_97790_: Int) {} override fun renderBg(p_283065_: PoseStack, p_97788_: Float, p_97789_: Int, p_97790_: Int) {}
var returnSlot: Slot? = null var returnSlot: Slot? = null
@ -643,13 +644,13 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
return false return false
} }
override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) { override fun render(poseStack: PoseStack, mouseX: Int, mouseY: Int, partialTick: Float) {
val wrap = MGUIGraphics(graphics) val wrap = MGUIGraphics(poseStack)
val mouseXf = mouseX.toFloat() val mouseXf = mouseX.toFloat()
val mouseYf = mouseY.toFloat() val mouseYf = mouseY.toFloat()
// dark background // dark background
this.renderBackground(graphics) this.renderBackground(poseStack)
super.hoveredSlot = null super.hoveredSlot = null
var hovered = false var hovered = false
@ -673,17 +674,17 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
} }
RenderSystem.depthFunc(GL11.GL_LESS) RenderSystem.depthFunc(GL11.GL_LESS)
MinecraftForge.EVENT_BUS.post(Background(this, graphics, mouseX, mouseY)) MinecraftForge.EVENT_BUS.post(Background(this, poseStack, mouseX, mouseY))
RenderSystem.disableDepthTest() RenderSystem.disableDepthTest()
// Screen.super.render // Screen.super.render
for (widget in renderables) { for (widget in renderables) {
widget.render(graphics, mouseX, mouseY, partialTick) widget.render(poseStack, mouseX, mouseY, partialTick)
} }
// /Screen.super.render // /Screen.super.render
RenderSystem.disableDepthTest() RenderSystem.disableDepthTest()
MinecraftForge.EVENT_BUS.post(Foreground(this, graphics, mouseX, mouseY)) MinecraftForge.EVENT_BUS.post(Foreground(this, poseStack, mouseX, mouseY))
var itemstack = if (draggingItem.isEmpty) menu.carried else draggingItem var itemstack = if (draggingItem.isEmpty) menu.carried else draggingItem
@ -701,14 +702,14 @@ abstract class MatteryScreen<T : MatteryMenu>(menu: T, inventory: Inventory, tit
} }
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
renderFloatingItem(graphics, itemstack, mouseX - 8, mouseY - i2, overrideCount) renderFloatingItem(poseStack, itemstack, mouseX - 8, mouseY - i2, overrideCount)
} }
if (menu.carried.isEmpty) { if (menu.carried.isEmpty) {
val hoveredSlot = super.hoveredSlot val hoveredSlot = super.hoveredSlot
if (hoveredSlot != null && hoveredSlot.hasItem()) { if (hoveredSlot != null && hoveredSlot.hasItem()) {
this.renderTooltip(graphics, mouseX, mouseY) this.renderTooltip(poseStack, mouseX, mouseY)
} else { } else {
for (panel in panels) { for (panel in panels) {
RenderSystem.disableDepthTest() RenderSystem.disableDepthTest()

View File

@ -156,7 +156,7 @@ class PainterScreen(menu: PainterMenu, inventory: Inventory, title: Component) :
set(value) {} set(value) {}
override fun innerRenderTooltips(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean { override fun innerRenderTooltips(graphics: MGUIGraphics, mouseX: Float, mouseY: Float, partialTick: Float): Boolean {
val list = getTooltipFromItem(minecraft!!, recipeOutput) val list = getTooltipFromItem(recipeOutput)
recipe.value.dyes.forEach { recipe.value.dyes.forEach {
val (dye, amount) = it val (dye, amount) = it

View File

@ -1,6 +1,7 @@
package ru.dbotthepony.mc.otm.client.screen.panels package ru.dbotthepony.mc.otm.client.screen.panels
import com.mojang.blaze3d.vertex.PoseStack
import net.minecraft.client.gui.components.Renderable import net.minecraft.client.gui.components.Renderable
import net.minecraft.client.gui.components.events.GuiEventListener import net.minecraft.client.gui.components.events.GuiEventListener
import net.minecraft.client.gui.screens.Screen import net.minecraft.client.gui.screens.Screen
@ -14,13 +15,13 @@ class Panel2Widget<out S: Screen, out P : EditablePanel<S>>(
require(panel.parent == null) { "Widget wrapped panels can't have a parent ($panel has parent ${panel.parent})" } require(panel.parent == null) { "Widget wrapped panels can't have a parent ($panel has parent ${panel.parent})" }
} }
override fun render(graphics: GuiGraphics, mouseX: Int, mouseY: Int, partialTick: Float) { override fun render(stack: PoseStack, mouseX: Int, mouseY: Int, partialTick: Float) {
panel.tick() panel.tick()
val xFloat = mouseX.toFloat() val xFloat = mouseX.toFloat()
val yFloat = mouseY.toFloat() val yFloat = mouseY.toFloat()
val wrap = MGUIGraphics(graphics) val wrap = MGUIGraphics(stack)
panel.tickHover(xFloat, yFloat) panel.tickHover(xFloat, yFloat)
panel.render(wrap, xFloat, yFloat, partialTick) panel.render(wrap, xFloat, yFloat, partialTick)

View File

@ -2,6 +2,9 @@ package ru.dbotthepony.mc.otm.compat.jade.providers
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.entity.WorkerState
import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
@ -16,16 +19,14 @@ import snownee.jade.api.config.IPluginConfig
import snownee.jade.api.ui.BoxStyle import snownee.jade.api.ui.BoxStyle
import snownee.jade.api.ui.IElementHelper import snownee.jade.api.ui.IElementHelper
object MatterBottlerProvider : IBlockComponentProvider, IServerDataProvider<BlockAccessor> { object MatterBottlerProvider : IBlockComponentProvider, IServerDataProvider<BlockEntity> {
override fun getUid(): ResourceLocation = JadeUids.MATTER_BOTTLER override fun getUid(): ResourceLocation = JadeUids.MATTER_BOTTLER
override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { override fun appendServerData(data: CompoundTag, player: ServerPlayer, level: Level, bottler: BlockEntity?, state: Boolean) {
if (accessor.blockEntity is MatterBottlerBlockEntity) { if (bottler is MatterBottlerBlockEntity) {
val bottler = accessor.blockEntity as MatterBottlerBlockEntity
val bottlerData = CompoundTag() val bottlerData = CompoundTag()
bottlerData.putBoolean("isBottling", bottler.isBottling) bottlerData.putBoolean("isBottling", bottler.isBottling)
bottlerData.putBoolean("isIdling", accessor.blockState.getValue(WorkerState.SEMI_WORKER_STATE) !== WorkerState.WORKING) bottlerData.putBoolean("isIdling", bottler.blockState.getValue(WorkerState.SEMI_WORKER_STATE) !== WorkerState.WORKING)
bottlerData.putFloat("workProgress", bottler.workProgress) bottlerData.putFloat("workProgress", bottler.workProgress)
data.put(JadeTagKeys.MATTER_BOTTLER_DATA, bottlerData) data.put(JadeTagKeys.MATTER_BOTTLER_DATA, bottlerData)
} }

View File

@ -2,6 +2,9 @@ package ru.dbotthepony.mc.otm.compat.jade.providers
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import ru.dbotthepony.mc.otm.block.entity.matter.MatterReconstructorBlockEntity import ru.dbotthepony.mc.otm.block.entity.matter.MatterReconstructorBlockEntity
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
import ru.dbotthepony.mc.otm.compat.jade.JadeUids import ru.dbotthepony.mc.otm.compat.jade.JadeUids
@ -15,13 +18,11 @@ import snownee.jade.api.config.IPluginConfig
import snownee.jade.api.ui.BoxStyle import snownee.jade.api.ui.BoxStyle
import snownee.jade.api.ui.IElementHelper import snownee.jade.api.ui.IElementHelper
object MatterReconstructorProvider : IBlockComponentProvider, IServerDataProvider<BlockAccessor> { object MatterReconstructorProvider : IBlockComponentProvider, IServerDataProvider<BlockEntity> {
override fun getUid(): ResourceLocation = JadeUids.MATTER_RECONSTRUCTOR override fun getUid(): ResourceLocation = JadeUids.MATTER_RECONSTRUCTOR
override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { override fun appendServerData(data: CompoundTag, player: ServerPlayer, level: Level, reconstructor: BlockEntity?, state: Boolean) {
if (accessor.blockEntity is MatterReconstructorBlockEntity) { if (reconstructor is MatterReconstructorBlockEntity) {
val reconstructor = accessor.blockEntity as MatterReconstructorBlockEntity
val item = reconstructor.repairContainer.get(0) val item = reconstructor.repairContainer.get(0)
if (!item.isEmpty && item.isDamageableItem && item.maxDamage != 0) { if (!item.isEmpty && item.isDamageableItem && item.maxDamage != 0) {

View File

@ -4,6 +4,9 @@ import net.minecraft.ChatFormatting
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.compat.jade.JadeColors import ru.dbotthepony.mc.otm.compat.jade.JadeColors
@ -24,11 +27,11 @@ import snownee.jade.api.config.IPluginConfig
import snownee.jade.api.ui.BoxStyle import snownee.jade.api.ui.BoxStyle
import snownee.jade.api.ui.IElementHelper import snownee.jade.api.ui.IElementHelper
object MatterStorageProvider : IBlockComponentProvider, IServerDataProvider<BlockAccessor> { object MatterStorageProvider : IBlockComponentProvider, IServerDataProvider<BlockEntity> {
override fun getUid(): ResourceLocation = JadeUids.MATTER_STORAGE override fun getUid(): ResourceLocation = JadeUids.MATTER_STORAGE
override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { override fun appendServerData(data: CompoundTag, player: ServerPlayer, level: Level, blockEntity: BlockEntity?, state: Boolean) {
accessor.blockEntity?.getCapability(MatteryCapability.MATTER)?.ifPresentK { blockEntity?.getCapability(MatteryCapability.MATTER)?.ifPresentK {
val matterData = CompoundTag() val matterData = CompoundTag()
matterData.putDecimal("storedMatter", it.storedMatter) matterData.putDecimal("storedMatter", it.storedMatter)

View File

@ -4,6 +4,9 @@ import net.minecraft.ChatFormatting
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.network.chat.Component import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage import ru.dbotthepony.mc.otm.capability.AbstractProfiledStorage
import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryCapability
import ru.dbotthepony.mc.otm.compat.jade.JadeColors import ru.dbotthepony.mc.otm.compat.jade.JadeColors
@ -21,11 +24,11 @@ import snownee.jade.api.config.IPluginConfig
import snownee.jade.api.ui.BoxStyle import snownee.jade.api.ui.BoxStyle
import snownee.jade.api.ui.IElementHelper import snownee.jade.api.ui.IElementHelper
object MatteryEnergyProvider : IBlockComponentProvider, IServerDataProvider<BlockAccessor> { object MatteryEnergyProvider : IBlockComponentProvider, IServerDataProvider<BlockEntity> {
override fun getUid(): ResourceLocation = JadeUids.MATTERY_ENERGY override fun getUid(): ResourceLocation = JadeUids.MATTERY_ENERGY
override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { override fun appendServerData(data: CompoundTag, player: ServerPlayer, level: Level, blockEntity: BlockEntity?, state: Boolean) {
accessor.blockEntity?.getCapability(MatteryCapability.ENERGY)?.ifPresentK { blockEntity?.getCapability(MatteryCapability.ENERGY)?.ifPresentK {
val energyData = CompoundTag() val energyData = CompoundTag()
energyData.putDecimal("batteryLevel", it.batteryLevel) energyData.putDecimal("batteryLevel", it.batteryLevel)

View File

@ -3,6 +3,9 @@ package ru.dbotthepony.mc.otm.compat.jade.providers
import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.CompoundTag
import net.minecraft.nbt.ListTag import net.minecraft.nbt.ListTag
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer
import net.minecraft.world.level.Level
import net.minecraft.world.level.block.entity.BlockEntity
import ru.dbotthepony.mc.otm.block.entity.ItemJob import ru.dbotthepony.mc.otm.block.entity.ItemJob
import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity
import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys import ru.dbotthepony.mc.otm.compat.jade.JadeTagKeys
@ -19,13 +22,11 @@ import snownee.jade.api.config.IPluginConfig
import snownee.jade.api.ui.BoxStyle import snownee.jade.api.ui.BoxStyle
import snownee.jade.api.ui.IElementHelper import snownee.jade.api.ui.IElementHelper
object MatteryWorkerProvider : IBlockComponentProvider, IServerDataProvider<BlockAccessor> { object MatteryWorkerProvider : IBlockComponentProvider, IServerDataProvider<BlockEntity> {
override fun getUid(): ResourceLocation = JadeUids.MATTERY_WORKER override fun getUid(): ResourceLocation = JadeUids.MATTERY_WORKER
override fun appendServerData(data: CompoundTag, accessor: BlockAccessor) { override fun appendServerData(data: CompoundTag, player: ServerPlayer, level: Level, worker: BlockEntity?, state: Boolean) {
if (accessor.blockEntity is MatteryWorkerBlockEntity<*>) { if (worker is MatteryWorkerBlockEntity<*>) {
val worker = accessor.blockEntity as MatteryWorkerBlockEntity<*>
val workerData = CompoundTag() val workerData = CompoundTag()
workerData["jobs"] = ListTag().also { workerData["jobs"] = ListTag().also {

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.compat.jei package ru.dbotthepony.mc.otm.compat.jei
import com.mojang.blaze3d.vertex.PoseStack
import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.drawable.IDrawable
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
@ -14,7 +15,7 @@ class IGUIRenderable2IDrawable(val parent: IGUIRenderable) : IDrawable {
return parent.height.toInt() return parent.height.toInt()
} }
override fun draw(guiGraphics: GuiGraphics, xOffset: Int, yOffset: Int) { override fun draw(stack: PoseStack, xOffset: Int, yOffset: Int) {
parent.render(MGUIGraphics(guiGraphics), xOffset.toFloat(), yOffset.toFloat()) parent.render(MGUIGraphics(stack), xOffset.toFloat(), yOffset.toFloat())
} }
} }

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.compat.jei package ru.dbotthepony.mc.otm.compat.jei
import com.mojang.blaze3d.vertex.PoseStack
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder import mezz.jei.api.gui.builder.IRecipeLayoutBuilder
import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.drawable.IDrawable
import mezz.jei.api.gui.ingredient.IRecipeSlotsView import mezz.jei.api.gui.ingredient.IRecipeSlotsView
@ -61,8 +62,8 @@ object MatterEntanglerRecipeCategory : IRecipeCategory<IMatterEntanglerRecipe>,
builder.addSlot(RecipeIngredientRole.OUTPUT, 116, 18 + 4).addItemStack(recipe.result) builder.addSlot(RecipeIngredientRole.OUTPUT, 116, 18 + 4).addItemStack(recipe.result)
} }
override fun draw(guiGraphics: GuiGraphics, xOffset: Int, yOffset: Int) { override fun draw(stack: PoseStack, xOffset: Int, yOffset: Int) {
val wrap = MGUIGraphics(guiGraphics) val wrap = MGUIGraphics(stack)
for (x in 0 until 3) { for (x in 0 until 3) {
for (y in 0 until 3) { for (y in 0 until 3) {

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.compat.jei package ru.dbotthepony.mc.otm.compat.jei
import com.mojang.blaze3d.vertex.PoseStack
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder import mezz.jei.api.gui.builder.IRecipeLayoutBuilder
import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.drawable.IDrawable
import mezz.jei.api.gui.ingredient.IRecipeSlotsView import mezz.jei.api.gui.ingredient.IRecipeSlotsView
@ -14,7 +15,6 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.render.RenderGravity
import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel
import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel
@ -45,14 +45,14 @@ object MicrowaveRecipeCategory : IRecipeCategory<MicrowaveRecipe>, IDrawable {
return MItems.POWERED_SMOKER.description return MItems.POWERED_SMOKER.description
} }
override fun draw(graphics: GuiGraphics, xOffset: Int, yOffset: Int) { override fun draw(stack: PoseStack, xOffset: Int, yOffset: Int) {
@Suppress("name_shadowing") @Suppress("name_shadowing")
val xOffset = xOffset.toFloat() val xOffset = xOffset.toFloat()
@Suppress("name_shadowing") @Suppress("name_shadowing")
val yOffset = yOffset.toFloat() val yOffset = yOffset.toFloat()
val wrap = MGUIGraphics(graphics) val wrap = MGUIGraphics(stack)
AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_INPUT + xOffset, Y_INPUT + yOffset) AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_INPUT + xOffset, Y_INPUT + yOffset)
AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_OUTPUT + xOffset, Y_OUTPUT + yOffset) AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_OUTPUT + xOffset, Y_OUTPUT + yOffset)

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.compat.jei package ru.dbotthepony.mc.otm.compat.jei
import com.mojang.blaze3d.vertex.PoseStack
import mezz.jei.api.constants.VanillaTypes import mezz.jei.api.constants.VanillaTypes
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder import mezz.jei.api.gui.builder.IRecipeLayoutBuilder
import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.drawable.IDrawable
@ -71,8 +72,8 @@ object PainterRecipeCategory : IRecipeCategory<PainterRecipe>, IDrawable {
builder.addSlot(RecipeIngredientRole.OUTPUT, 100, 22).addIngredients(VanillaTypes.ITEM_STACK, listOf(recipe.output)) builder.addSlot(RecipeIngredientRole.OUTPUT, 100, 22).addIngredients(VanillaTypes.ITEM_STACK, listOf(recipe.output))
} }
override fun draw(guiGraphics: GuiGraphics, xOffset: Int, yOffset: Int) { override fun draw(stack: PoseStack, xOffset: Int, yOffset: Int) {
val wrap = MGUIGraphics(guiGraphics) val wrap = MGUIGraphics(stack)
for (x in 0 .. 1) { for (x in 0 .. 1) {
for (y in 0 .. 2) { for (y in 0 .. 2) {

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.mc.otm.compat.jei package ru.dbotthepony.mc.otm.compat.jei
import com.mojang.blaze3d.vertex.PoseStack
import mezz.jei.api.gui.builder.IRecipeLayoutBuilder import mezz.jei.api.gui.builder.IRecipeLayoutBuilder
import mezz.jei.api.gui.drawable.IDrawable import mezz.jei.api.gui.drawable.IDrawable
import mezz.jei.api.gui.ingredient.IRecipeSlotsView import mezz.jei.api.gui.ingredient.IRecipeSlotsView
@ -14,7 +15,6 @@ import net.minecraft.world.item.ItemStack
import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.item.crafting.Ingredient
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters
import ru.dbotthepony.mc.otm.client.render.MGUIGraphics import ru.dbotthepony.mc.otm.client.render.MGUIGraphics
import ru.dbotthepony.mc.otm.client.minecraft
import ru.dbotthepony.mc.otm.client.render.RenderGravity import ru.dbotthepony.mc.otm.client.render.RenderGravity
import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel
import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel
@ -45,14 +45,14 @@ object PlatePressRecipeCategory : IRecipeCategory<PlatePressRecipe>, IDrawable {
return MItems.PLATE_PRESS.description return MItems.PLATE_PRESS.description
} }
override fun draw(graphics: GuiGraphics, xOffset: Int, yOffset: Int) { override fun draw(stack: PoseStack, xOffset: Int, yOffset: Int) {
@Suppress("name_shadowing") @Suppress("name_shadowing")
val xOffset = xOffset.toFloat() val xOffset = xOffset.toFloat()
@Suppress("name_shadowing") @Suppress("name_shadowing")
val yOffset = yOffset.toFloat() val yOffset = yOffset.toFloat()
val wrap = MGUIGraphics(graphics) val wrap = MGUIGraphics(stack)
AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_INPUT + xOffset, Y_INPUT + yOffset) AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_INPUT + xOffset, Y_INPUT + yOffset)
AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_OUTPUT + xOffset, Y_OUTPUT + yOffset) AbstractSlotPanel.SLOT_BACKGROUND.render(wrap, X_OUTPUT + xOffset, Y_OUTPUT + yOffset)
@ -68,11 +68,11 @@ object PlatePressRecipeCategory : IRecipeCategory<PlatePressRecipe>, IDrawable {
override fun draw( override fun draw(
recipe: PlatePressRecipe, recipe: PlatePressRecipe,
recipeSlotsView: IRecipeSlotsView, recipeSlotsView: IRecipeSlotsView,
graphics: GuiGraphics, stack: PoseStack,
mouseX: Double, mouseX: Double,
mouseY: Double mouseY: Double
) { ) {
val wrap = MGUIGraphics(graphics) val wrap = MGUIGraphics(stack)
wrap.draw(TranslatableComponent("otm.gui.recipe.ticks", recipe.workTime), 40f, 30f, gravity = RenderGravity.TOP_CENTER, color = RGBAColor.BLACK) wrap.draw(TranslatableComponent("otm.gui.recipe.ticks", recipe.workTime), 40f, 30f, gravity = RenderGravity.TOP_CENTER, color = RGBAColor.BLACK)

View File

@ -56,7 +56,7 @@ object CreativeMenuItemComparator : Comparator<Item> {
if (item2index.isEmpty()) { if (item2index.isEmpty()) {
val player = minecraft.player ?: return val player = minecraft.player ?: return
// creative tabs were not populated yet // creative tabs were not populated yet
CreativeModeTabs.tryRebuildTabContents(player.connection.enabledFeatures(), false /* operator tabs */, player.level().registryAccess()) CreativeModeTabs.tryRebuildTabContents(player.connection.enabledFeatures(), false /* operator tabs */, player.level.registryAccess())
doRebuild() doRebuild()
} }

View File

@ -89,7 +89,7 @@ class MinecartCargoCrate(
if (interactingPlayers++ == 0) { if (interactingPlayers++ == 0) {
if (!isRemoved) { if (!isRemoved) {
level().playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level().random.nextFloat() * 0.2f) level.playSound(null, this, MSoundEvents.CARGO_CRATE_OPEN, SoundSource.BLOCKS, 1f, 0.8f + level.random.nextFloat() * 0.2f)
this.gameEvent(GameEvent.CONTAINER_OPEN, player) this.gameEvent(GameEvent.CONTAINER_OPEN, player)
PiglinAi.angerNearbyPiglins(player, true) PiglinAi.angerNearbyPiglins(player, true)
} }
@ -102,7 +102,7 @@ class MinecartCargoCrate(
if (--interactingPlayers == 0) { if (--interactingPlayers == 0) {
if (!isRemoved) { if (!isRemoved) {
level().gameEvent(GameEvent.CONTAINER_CLOSE, position, GameEvent.Context.of(this)) level.gameEvent(GameEvent.CONTAINER_CLOSE, position, GameEvent.Context.of(this))
} }
} }
} }

View File

@ -29,7 +29,7 @@ class PlasmaProjectile(level: Level) : Projectile(MEntityTypes.PLASMA as EntityT
override fun onHit(p_37260_: HitResult) { override fun onHit(p_37260_: HitResult) {
super.onHit(p_37260_) super.onHit(p_37260_)
if (!level().isClientSide) { if (!level.isClientSide) {
discard() discard()
} }
} }
@ -37,8 +37,8 @@ class PlasmaProjectile(level: Level) : Projectile(MEntityTypes.PLASMA as EntityT
override fun onHitEntity(p_37259_: EntityHitResult) { override fun onHitEntity(p_37259_: EntityHitResult) {
super.onHitEntity(p_37259_) super.onHitEntity(p_37259_)
if (!level().isClientSide) { if (!level.isClientSide) {
p_37259_.entity.hurt(MatteryDamageSource(level().registryAccess().damageType(MDamageTypes.PLASMA), owner, inflictor), damage) p_37259_.entity.hurt(MatteryDamageSource(level.registryAccess().damageType(MDamageTypes.PLASMA), owner, inflictor), damage)
} }
} }
@ -54,17 +54,17 @@ class PlasmaProjectile(level: Level) : Projectile(MEntityTypes.PLASMA as EntityT
super.tick() super.tick()
val trace = ProjectileUtil.getHitResultOnMoveVector(this, this::canHitEntity) val trace = ProjectileUtil.getHitResult(this, this::canHitEntity)
if (trace.type == HitResult.Type.BLOCK) { if (trace.type == HitResult.Type.BLOCK) {
val pos = (trace as BlockHitResult).blockPos val pos = (trace as BlockHitResult).blockPos
val state = level().getBlockState(pos) val state = level.getBlockState(pos)
if (state.`is`(Blocks.NETHER_PORTAL) || state.`is`(Blocks.END_GATEWAY)) { if (state.`is`(Blocks.NETHER_PORTAL) || state.`is`(Blocks.END_GATEWAY)) {
onHitBlock(trace) onHitBlock(trace)
// don't teleport plasma projectile // don't teleport plasma projectile
if (!level().isClientSide) if (!level.isClientSide)
discard() discard()
return return
@ -85,7 +85,7 @@ class PlasmaProjectile(level: Level) : Projectile(MEntityTypes.PLASMA as EntityT
// extinguish // extinguish
for (i in 0 .. 4) { for (i in 0 .. 4) {
level().addParticle( level.addParticle(
ParticleTypes.BUBBLE, ParticleTypes.BUBBLE,
x - deltaMovement.x * 0.25, x - deltaMovement.x * 0.25,
y - deltaMovement.y * 0.25, y - deltaMovement.y * 0.25,
@ -96,9 +96,9 @@ class PlasmaProjectile(level: Level) : Projectile(MEntityTypes.PLASMA as EntityT
) )
} }
if (!level().isClientSide) { if (!level.isClientSide) {
discard() discard()
level().levelEvent(LevelEvent.LAVA_FIZZ, blockPosition(), 0) level.levelEvent(LevelEvent.LAVA_FIZZ, blockPosition(), 0)
} }
return return

View File

@ -22,11 +22,11 @@ class EssenceServoItem : Item(Properties().stacksTo(64)) {
} }
fun useServo(player: Player, pos: BlockPos): InteractionResult { fun useServo(player: Player, pos: BlockPos): InteractionResult {
val block = player.level().getBlockEntity(pos) ?: return InteractionResult.FAIL val block = player.level.getBlockEntity(pos) ?: return InteractionResult.FAIL
// TODO: опыт как жидкость // TODO: опыт как жидкость
if (block is EssenceStorageBlockEntity) { if (block is EssenceStorageBlockEntity) {
if (player.level().isClientSide) return InteractionResult.SUCCESS if (player.level.isClientSide) return InteractionResult.SUCCESS
if (player !is ServerPlayer) return InteractionResult.FAIL if (player !is ServerPlayer) return InteractionResult.FAIL
if (player.isCrouching) { // выгружаем в блок if (player.isCrouching) { // выгружаем в блок

View File

@ -114,16 +114,16 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
actionResult.result actionResult.result
} }
if (!player.abilities.instabuild && !player.level().isClientSide) { if (!player.abilities.instabuild && !player.level.isClientSide) {
item.shrink(1) item.shrink(1)
if (item.isEmpty) return InteractionResultHolder.sidedSuccess(targetItem, player.level().isClientSide) if (item.isEmpty) return InteractionResultHolder.sidedSuccess(targetItem, player.level.isClientSide)
if (!player.inventory.add(targetItem)) { if (!player.inventory.add(targetItem)) {
player.spawnAtLocation(targetItem) player.spawnAtLocation(targetItem)
} }
} }
return InteractionResultHolder.sidedSuccess(item, player.level().isClientSide) return InteractionResultHolder.sidedSuccess(item, player.level.isClientSide)
} }
return InteractionResultHolder.pass(item) return InteractionResultHolder.pass(item)
@ -143,7 +143,7 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
} }
override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean { override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean {
return player.level().getBlockState(context.blockPos).`is`(Blocks.CAULDRON) return player.level.getBlockState(context.blockPos).`is`(Blocks.CAULDRON)
} }
override fun interact(item: ItemStack, player: Player, context: Context): InteractionResult { override fun interact(item: ItemStack, player: Player, context: Context): InteractionResult {
@ -158,12 +158,12 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
val drained = cap.drain(toDrain, IFluidHandler.FluidAction.SIMULATE) val drained = cap.drain(toDrain, IFluidHandler.FluidAction.SIMULATE)
if (!drained.isEmpty && drained.amount == 1000) { if (!drained.isEmpty && drained.amount == 1000) {
player.level().playSound(player, context.blockPos, soundEvent, SoundSource.BLOCKS) player.level.playSound(player, context.blockPos, soundEvent, SoundSource.BLOCKS)
val level = player.level() as? ServerLevel ?: return InteractionResult.SUCCESS val level = player.level as? ServerLevel ?: return InteractionResult.SUCCESS
level.setBlock(context.blockPos, newState, Block.UPDATE_ALL) level.setBlock(context.blockPos, newState, Block.UPDATE_ALL)
cap.drain(toDrain, IFluidHandler.FluidAction.EXECUTE) cap.drain(toDrain, IFluidHandler.FluidAction.EXECUTE)
if (item.count != 1 && !player.level().isClientSide) { if (item.count != 1 && !player.level.isClientSide) {
item.count-- item.count--
if (!player.inventory.add(targetItem)) { if (!player.inventory.add(targetItem)) {
@ -186,7 +186,7 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
} }
override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean { override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean {
return player.level().getBlockState(context.blockPos) in mapping return player.level.getBlockState(context.blockPos) in mapping
} }
override fun interact(item: ItemStack, player: Player, context: Context): InteractionResult { override fun interact(item: ItemStack, player: Player, context: Context): InteractionResult {
@ -202,13 +202,13 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
val fill = cap.fill(toFill, IFluidHandler.FluidAction.SIMULATE) val fill = cap.fill(toFill, IFluidHandler.FluidAction.SIMULATE)
if (fill != 1000) return InteractionResult.FAIL if (fill != 1000) return InteractionResult.FAIL
player.level().playSound(player, context.blockPos, mapped.second, SoundSource.BLOCKS) player.level.playSound(player, context.blockPos, mapped.second, SoundSource.BLOCKS)
val level = player.level() as? ServerLevel ?: return InteractionResult.SUCCESS val level = player.level as? ServerLevel ?: return InteractionResult.SUCCESS
level.setBlock(context.blockPos, Blocks.CAULDRON.defaultBlockState(), Block.UPDATE_ALL) level.setBlock(context.blockPos, Blocks.CAULDRON.defaultBlockState(), Block.UPDATE_ALL)
cap.fill(toFill, IFluidHandler.FluidAction.EXECUTE) cap.fill(toFill, IFluidHandler.FluidAction.EXECUTE)
if (item.count != 1 && !player.level().isClientSide) { if (item.count != 1 && !player.level.isClientSide) {
item.count-- item.count--
if (!player.inventory.add(targetItem)) { if (!player.inventory.add(targetItem)) {
@ -216,13 +216,13 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
} }
} }
return InteractionResult.sidedSuccess(player.level().isClientSide) return InteractionResult.sidedSuccess(player.level.isClientSide)
} }
} }
private object FillEmptyCapability : Interaction { private object FillEmptyCapability : Interaction {
override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean { override fun canInteract(item: ItemStack, player: Player, context: Context): Boolean {
val target = player.level().getBlockEntity(context.blockPos)?.getCapability(ForgeCapabilities.FLUID_HANDLER, context.side)?.orNull() ?: return false val target = player.level.getBlockEntity(context.blockPos)?.getCapability(ForgeCapabilities.FLUID_HANDLER, context.side)?.orNull() ?: return false
val cap = item.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orNull() ?: return false val cap = item.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orNull() ?: return false
return target.iterator().any { !it.isEmpty } || cap.iterator().any { !it.isEmpty } return target.iterator().any { !it.isEmpty } || cap.iterator().any { !it.isEmpty }
} }
@ -233,21 +233,21 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
val targetItem = if (item.count == 1) item else item.copyWithCount(1) val targetItem = if (item.count == 1) item else item.copyWithCount(1)
val itemCap = targetItem.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orNull() ?: return InteractionResult.FAIL val itemCap = targetItem.getCapability(ForgeCapabilities.FLUID_HANDLER_ITEM).orNull() ?: return InteractionResult.FAIL
val blockCap = player.level().getBlockEntity(context.blockPos)?.getCapability(ForgeCapabilities.FLUID_HANDLER, context.side)?.orNull() ?: return InteractionResult.FAIL val blockCap = player.level.getBlockEntity(context.blockPos)?.getCapability(ForgeCapabilities.FLUID_HANDLER, context.side)?.orNull() ?: return InteractionResult.FAIL
val fluid = itemCap[0] val fluid = itemCap[0]
if (fluid.isEmpty) { if (fluid.isEmpty) {
// заполняем из блока // заполняем из блока
val moveResult = moveFluid(source = blockCap, destination = itemCap, actuallyDrain = !player.level().isClientSide, actuallyFill = !player.level().isClientSide) val moveResult = moveFluid(source = blockCap, destination = itemCap, actuallyDrain = !player.level.isClientSide, actuallyFill = !player.level.isClientSide)
if (!moveResult.isEmpty) { if (!moveResult.isEmpty) {
val sound = moveResult.fluid.fluidType.getSound(moveResult, SoundActions.BUCKET_FILL) val sound = moveResult.fluid.fluidType.getSound(moveResult, SoundActions.BUCKET_FILL)
if (sound != null) { if (sound != null) {
player.level().playSound(player, context.blockPos, sound, SoundSource.BLOCKS) player.level.playSound(player, context.blockPos, sound, SoundSource.BLOCKS)
} }
if (item.count != 1 && !player.level().isClientSide) { if (item.count != 1 && !player.level.isClientSide) {
item.count-- item.count--
if (!player.inventory.add(targetItem)) { if (!player.inventory.add(targetItem)) {
@ -255,21 +255,21 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
} }
} }
return InteractionResult.sidedSuccess(player.level().isClientSide) return InteractionResult.sidedSuccess(player.level.isClientSide)
} else { } else {
return InteractionResult.FAIL return InteractionResult.FAIL
} }
} else { } else {
val moveResult = moveFluid(source = itemCap, destination = blockCap, actuallyDrain = !player.level().isClientSide, actuallyFill = !player.level().isClientSide) val moveResult = moveFluid(source = itemCap, destination = blockCap, actuallyDrain = !player.level.isClientSide, actuallyFill = !player.level.isClientSide)
if (!moveResult.isEmpty) { if (!moveResult.isEmpty) {
val sound = moveResult.fluid.fluidType.getSound(moveResult, SoundActions.BUCKET_EMPTY) val sound = moveResult.fluid.fluidType.getSound(moveResult, SoundActions.BUCKET_EMPTY)
if (sound != null) { if (sound != null) {
player.level().playSound(player, context.blockPos, sound, SoundSource.BLOCKS) player.level.playSound(player, context.blockPos, sound, SoundSource.BLOCKS)
} }
if (item.count != 1 && !player.level().isClientSide) { if (item.count != 1 && !player.level.isClientSide) {
item.count-- item.count--
if (!player.inventory.add(targetItem)) { if (!player.inventory.add(targetItem)) {
@ -277,7 +277,7 @@ class FluidCapsuleItem(val capacity: IntSupplier) : Item(Properties().stacksTo(6
} }
} }
return InteractionResult.sidedSuccess(player.level().isClientSide) return InteractionResult.sidedSuccess(player.level.isClientSide)
} else { } else {
return InteractionResult.FAIL return InteractionResult.FAIL
} }

View File

@ -145,7 +145,7 @@ class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
val matterHalf = getMatterValue(pStack)?.matter?.div(2) ?: return true val matterHalf = getMatterValue(pStack)?.matter?.div(2) ?: return true
val halfStack = pStack.copyWithCount(1) val halfStack = pStack.copyWithCount(1)
matter(halfStack, -addMatterValue(pStack, -matterHalf, pPlayer.level().isClientSide())) matter(halfStack, -addMatterValue(pStack, -matterHalf, pPlayer.level.isClientSide()))
pSlot.set(halfStack) pSlot.set(halfStack)
if (getMatterValue(pStack)?.matter!! <= Decimal.ZERO) { if (getMatterValue(pStack)?.matter!! <= Decimal.ZERO) {
@ -175,13 +175,13 @@ class MatterDustItem : Item(Properties().stacksTo(64)), IMatterItem {
val matterHalf = getMatterValue(pStack)?.matter?.div(2) ?: return true val matterHalf = getMatterValue(pStack)?.matter?.div(2) ?: return true
val halfStack = pStack.copyWithCount(1) val halfStack = pStack.copyWithCount(1)
matter(halfStack, -addMatterValue(pStack, -matterHalf, pPlayer.level().isClientSide())) matter(halfStack, -addMatterValue(pStack, -matterHalf, pPlayer.level.isClientSide()))
pAccess.set(halfStack) pAccess.set(halfStack)
return true return true
} else if (pOther.item is MatterDustItem && pOther.count == 1) { } else if (pOther.item is MatterDustItem && pOther.count == 1) {
val matterOther = getMatterValue(pOther)?.matter ?: return true val matterOther = getMatterValue(pOther)?.matter ?: return true
val diff = addMatterValue(pStack, matterOther, pPlayer.level().isClientSide()) val diff = addMatterValue(pStack, matterOther, pPlayer.level.isClientSide())
if (matterOther - diff <= Decimal.ZERO) { if (matterOther - diff <= Decimal.ZERO) {
pOther.shrink(1) pOther.shrink(1)

View File

@ -78,19 +78,19 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1)
override fun getCraftingRemainingItem(itemStack: ItemStack): ItemStack { override fun getCraftingRemainingItem(itemStack: ItemStack): ItemStack {
val player = ForgeHooks.getCraftingPlayer() ?: return itemStack.copy() val player = ForgeHooks.getCraftingPlayer() ?: return itemStack.copy()
if (player.level().isClientSide) return itemStack.copy() if (player.level.isClientSide) return itemStack.copy()
if (!isPrimed(itemStack)) { if (!isPrimed(itemStack)) {
itemStack.hurtAndBreak(1, player) {} itemStack.hurtAndBreak(1, player) {}
} else { } else {
val level = player.level() as ServerLevel val level = player.level as ServerLevel
itemStack.hurtAndBreak(level.random.nextInt(1, 20), player) {} itemStack.hurtAndBreak(level.random.nextInt(1, 20), player) {}
unprime(itemStack) unprime(itemStack)
val (ex, ey, ez) = Vector.atCenterOf(player.blockPosition()) val (ex, ey, ez) = Vector.atCenterOf(player.blockPosition())
val exp = Explosion(player.level(), player, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP) val exp = Explosion(player.level, player, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP)
exp.explode() exp.explode()
exp.finalizeExplosion(true) exp.finalizeExplosion(true)
@ -150,20 +150,20 @@ class ExplosiveHammerItem(durability: Int = 512) : Item(Properties().stacksTo(1)
} }
fun attackAt(itemStack: ItemStack, attacker: LivingEntity, pos: Vec3, aim: Vec3, hand: InteractionHand) { fun attackAt(itemStack: ItemStack, attacker: LivingEntity, pos: Vec3, aim: Vec3, hand: InteractionHand) {
if (!isPrimed(itemStack) || attacker.level().isClientSide || attacker is Player && attacker.getAttackStrengthScale(0.4f) < 0.98f) if (!isPrimed(itemStack) || attacker.level.isClientSide || attacker is Player && attacker.getAttackStrengthScale(0.4f) < 0.98f)
return return
val (ex, ey, ez) = pos val (ex, ey, ez) = pos
// взрыв в месте удара молотком // взрыв в месте удара молотком
val exp = Explosion(attacker.level(), attacker, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP) val exp = Explosion(attacker.level, attacker, ex, ey, ez, 1f, false, if (ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) Explosion.BlockInteraction.DESTROY_WITH_DECAY else Explosion.BlockInteraction.KEEP)
exp.explode() exp.explode()
exp.finalizeExplosion(true) exp.finalizeExplosion(true)
if (!ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS) if (!ToolsConfig.ExplosiveHammer.EXPLOSION_DAMAGE_BLOCKS)
exp.clearToBlow() exp.clearToBlow()
val level = attacker.level() as ServerLevel val level = attacker.level as ServerLevel
val hitEntities = ObjectArraySet<LivingEntity>() val hitEntities = ObjectArraySet<LivingEntity>()
hitEntities.add(attacker) hitEntities.add(attacker)

View File

@ -101,7 +101,7 @@ class EnergySwordItem : Item(Properties().stacksTo(1).rarity(Rarity.RARE)), Vani
victim.matteryPlayer?.let { victim.matteryPlayer?.let {
if (it.isAndroid) { if (it.isAndroid) {
victim.invulnerableTime = 0 victim.invulnerableTime = 0
victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f) victim.hurt(MatteryDamageSource(attacker.level.registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f)
} }
} }
@ -110,11 +110,11 @@ class EnergySwordItem : Item(Properties().stacksTo(1).rarity(Rarity.RARE)), Vani
itemStack.getCapability(MatteryCapability.ENERGY).ifPresentK { itemStack.getCapability(MatteryCapability.ENERGY).ifPresentK {
if (it.extractEnergyExact(ENERGY_PER_SWING, false)) { if (it.extractEnergyExact(ENERGY_PER_SWING, false)) {
it.extractEnergy(attacker.level().random.nextVariance(ENERGY_PER_SWING_VARIANCE), false) it.extractEnergy(attacker.level.random.nextVariance(ENERGY_PER_SWING_VARIANCE), false)
victim.matteryPlayer?.let { victim.matteryPlayer?.let {
if (it.isAndroid && it.androidEnergy.extractEnergyExact(ENERGY_ZAP, false)) { if (it.isAndroid && it.androidEnergy.extractEnergyExact(ENERGY_ZAP, false)) {
it.androidEnergy.extractEnergy(attacker.level().random.nextVariance(ENERGY_ZAP_VARIANCE), false) it.androidEnergy.extractEnergy(attacker.level.random.nextVariance(ENERGY_ZAP_VARIANCE), false)
victim.hurt(MatteryDamageSource(attacker.level().registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f) victim.hurt(MatteryDamageSource(attacker.level.registryAccess().damageType(MDamageTypes.EMP), attacker, itemStack), 8f)
} }
} }
} }
@ -163,12 +163,12 @@ class EnergySwordItem : Item(Properties().stacksTo(1).rarity(Rarity.RARE)), Vani
if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) { if (blockState.`is`(BlockTags.SWORD_EFFICIENT)) {
if (energy?.extractEnergyExact(PLANT_POWER_COST, false) == true) if (energy?.extractEnergyExact(PLANT_POWER_COST, false) == true)
energy.extractEnergyExact(user.level().random.nextVariance(PLANT_POWER_COST_VARIANCE), false) energy.extractEnergyExact(user.level.random.nextVariance(PLANT_POWER_COST_VARIANCE), false)
} }
if (blockState.`is`(Blocks.COBWEB)) { if (blockState.`is`(Blocks.COBWEB)) {
if (energy?.extractEnergyExact(COBWEB_POWER_COST, false) == true) if (energy?.extractEnergyExact(COBWEB_POWER_COST, false) == true)
energy.extractEnergyExact(user.level().random.nextVariance(COBWEB_POWER_COST_VARIANCE), false) energy.extractEnergyExact(user.level.random.nextVariance(COBWEB_POWER_COST_VARIANCE), false)
} }
} }

View File

@ -25,8 +25,8 @@ class PlasmaRifleItem : PlasmaWeaponItem<PlasmaWeaponDataTable>(PlasmaWeaponData
get() = Angle(-0.02, 0.0, 0.0) get() = Angle(-0.02, 0.0, 0.0)
override fun primaryFire(itemStack: ItemStack, player: Player, dt: PlasmaWeaponDataTable): Boolean { override fun primaryFire(itemStack: ItemStack, player: Player, dt: PlasmaWeaponDataTable): Boolean {
if (!player.level().isClientSide) { if (!player.level.isClientSide) {
val arrow = PlasmaProjectile(player.level()) val arrow = PlasmaProjectile(player.level)
arrow.position = player.eyePosition arrow.position = player.eyePosition
val calc = VelocityCalculation(player, force = 4.0, deviation = 0.3) val calc = VelocityCalculation(player, force = 4.0, deviation = 0.3)
@ -34,14 +34,14 @@ class PlasmaRifleItem : PlasmaWeaponItem<PlasmaWeaponDataTable>(PlasmaWeaponData
arrow.owner = player arrow.owner = player
player.level().addFreshEntity(arrow) player.level.addFreshEntity(arrow)
} else { } else {
dt.doFireAnim(deviation = rotFireAnimDeviation) dt.doFireAnim(deviation = rotFireAnimDeviation)
} }
receiveHeat(itemStack, player, 10.0, dt) receiveHeat(itemStack, player, 10.0, dt)
player.level().playSound( player.level.playSound(
player, player,
player, player,
MSoundEvents.RIFLE_SHOT, MSoundEvents.RIFLE_SHOT,

View File

@ -280,7 +280,7 @@ abstract class PlasmaWeaponItem<D : PlasmaWeaponDataTable>(tables: KClass<D>, pr
dt.heatCooldown = overheatCooldown dt.heatCooldown = overheatCooldown
if (!before) { if (!before) {
player.level().playSound(player, player, MSoundEvents.PLASMA_WEAPON_OVERHEAT, SoundSource.PLAYERS, 1f, 1f) player.level.playSound(player, player, MSoundEvents.PLASMA_WEAPON_OVERHEAT, SoundSource.PLAYERS, 1f, 1f)
} }
} }
} }

View File

@ -90,7 +90,7 @@ class VelocityCalculation(
if (owner != null) { if (owner != null) {
val ownerVel = owner.deltaMovement val ownerVel = owner.deltaMovement
if (owner.onGround()) { if (owner.isOnGround) {
velocity += ownerVel velocity += ownerVel
} else { } else {
velocity += Vec3(ownerVel.x, 0.0, ownerVel.z) velocity += Vec3(ownerVel.x, 0.0, ownerVel.z)

View File

@ -84,10 +84,10 @@ class ExopackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
} }
private fun popFurnaceExp() { private fun popFurnaceExp() {
if (capability.isExopackSmeltingInstalled && capability.exopackSmelterExperience >= 1f && !player.level().isClientSide) { if (capability.isExopackSmeltingInstalled && capability.exopackSmelterExperience >= 1f && !player.level.isClientSide) {
val whole = capability.exopackSmelterExperience.toInt() val whole = capability.exopackSmelterExperience.toInt()
capability.exopackSmelterExperience -= whole capability.exopackSmelterExperience -= whole
ExperienceOrb.award(player.level() as ServerLevel, player.position(), whole) ExperienceOrb.award(player.level as ServerLevel, player.position(), whole)
} }
} }
@ -144,7 +144,7 @@ class ExopackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
super.slotsChanged(container) super.slotsChanged(container)
if (container == craftingGrid) { if (container == craftingGrid) {
CraftingMenu.slotChangedCraftingGrid(this, capability.ply.level(), capability.ply, craftingGrid, craftingResultContainer) CraftingMenu.slotChangedCraftingGrid(this, capability.ply.level, capability.ply, craftingGrid, craftingResultContainer)
} }
} }
@ -168,7 +168,7 @@ class ExopackInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen
craftingResultContainer.clearContent() craftingResultContainer.clearContent()
if (!player.level().isClientSide) { if (!player.level.isClientSide) {
for (slot in craftingGrid.slotIterator()) { for (slot in craftingGrid.slotIterator()) {
val leftover = moveItemStackToSlots(slot.item, playerInventorySlots) val leftover = moveItemStackToSlots(slot.item, playerInventorySlots)

View File

@ -406,7 +406,7 @@ abstract class MatteryMenu(
override fun stillValid(player: Player): Boolean { override fun stillValid(player: Player): Boolean {
if (tile == null) return true if (tile == null) return true
if (player.level().getBlockEntity(tile.blockPos) !== tile) { if (player.level.getBlockEntity(tile.blockPos) !== tile) {
return false return false
} }

View File

@ -57,7 +57,7 @@ class PainterMenu(
return super.mayPlace(itemStack) return super.mayPlace(itemStack)
} }
return super.mayPlace(itemStack) && inventory.player.level().recipeManager.byType(MRecipes.PAINTER).values.any { it.value.matches(itemStack) } return super.mayPlace(itemStack) && inventory.player.level.recipeManager.byType(MRecipes.PAINTER).values.any { it.value.matches(itemStack) }
} }
} }
@ -128,7 +128,7 @@ class PainterMenu(
private fun rescan() { private fun rescan() {
possibleRecipes.clear() possibleRecipes.clear()
possibleRecipes.addAll(inventory.player.level().recipeManager.byType(MRecipes.PAINTER).values.iterator().filter { it.value.matches(inputContainer[0]) }) possibleRecipes.addAll(inventory.player.level.recipeManager.byType(MRecipes.PAINTER).values.iterator().filter { it.value.matches(inputContainer[0]) })
listeners.accept(Unit) listeners.accept(Unit)
if (tile !is PainterBlockEntity) return if (tile !is PainterBlockEntity) return
@ -136,12 +136,12 @@ class PainterMenu(
if (inputContainer.isEmpty || selectedRecipe == null) { if (inputContainer.isEmpty || selectedRecipe == null) {
outputContainer.clearContent() outputContainer.clearContent()
} else { } else {
val recipe = inventory.player.level().recipeManager.byKey(selectedRecipe!!).get() as AbstractPainterRecipe? val recipe = inventory.player.level.recipeManager.byKey(selectedRecipe!!).get() as AbstractPainterRecipe?
if (recipe == null || !recipe.value.canCraft(dyeStoredDirect) || !recipe.value.matches(inputContainer, inventory.player.level())) { if (recipe == null || !recipe.value.canCraft(dyeStoredDirect) || !recipe.value.matches(inputContainer, inventory.player.level)) {
outputContainer.clearContent() outputContainer.clearContent()
} else { } else {
outputContainer[0] = recipe.value.assemble(inputContainer, inventory.player.level().registryAccess()) outputContainer[0] = recipe.value.assemble(inputContainer, inventory.player.level.registryAccess())
lastRecipe = recipe lastRecipe = recipe
} }
} }

View File

@ -47,7 +47,7 @@ class MatterEntanglerMenu(
object : MatterySlot(it, i) { object : MatterySlot(it, i) {
override fun mayPlace(itemStack: ItemStack): Boolean { override fun mayPlace(itemStack: ItemStack): Boolean {
val shadow = ShadowCraftingContainer.shadow(it, i, itemStack) val shadow = ShadowCraftingContainer.shadow(it, i, itemStack)
val level = player.level() val level = player.level
return super.mayPlace(itemStack) && (level ?: return false) return super.mayPlace(itemStack) && (level ?: return false)
.recipeManager .recipeManager

View File

@ -324,7 +324,7 @@ class MatterPanelMenu(
} }
fun fullPatternBroadcast() { fun fullPatternBroadcast() {
if (inventory.player.level().isClientSide) { if (inventory.player.level.isClientSide) {
initialSend = true initialSend = true
return return
} }

View File

@ -30,7 +30,7 @@ class SmokeParticlesPacket(val x: Double, val y: Double, val z: Double) : Matter
} }
override fun play(context: MNetworkContext) { override fun play(context: MNetworkContext) {
minecraft.player?.level()?.let { minecraft.player?.level?.let {
makeSmoke(x, y, z, it.random, it) makeSmoke(x, y, z, it.random, it)
} }
} }
@ -54,7 +54,7 @@ class BlockEntitySyncPacket(val position: BlockPos, val buffer: ByteArray, val v
} }
private fun execute() { private fun execute() {
val level = minecraft.player?.level() val level = minecraft.player?.level
if (level == null) { if (level == null) {
LOGGER.error("Received BlockEntitySyncPacket before we are in valid level.") LOGGER.error("Received BlockEntitySyncPacket before we are in valid level.")
@ -127,7 +127,7 @@ object GenericNetworkChannel : MatteryNetworkChannel(
} }
fun makeSmoke(excluded: ServerPlayer, x: Double, y: Double, z: Double) { fun makeSmoke(excluded: ServerPlayer, x: Double, y: Double, z: Double) {
send(PacketDistributor.NEAR.with { PacketDistributor.TargetPoint(excluded, x, y, z, 64.0, excluded.level().dimension()) }, SmokeParticlesPacket(x, y, z)) send(PacketDistributor.NEAR.with { PacketDistributor.TargetPoint(excluded, x, y, z, 64.0, excluded.level.dimension()) }, SmokeParticlesPacket(x, y, z))
} }
fun register() { fun register() {

View File

@ -523,9 +523,9 @@ data class ExopackSmokePacket(val player: UUID) : MatteryPacket {
override fun play(context: MNetworkContext) { override fun play(context: MNetworkContext) {
context.packetHandled = true context.packetHandled = true
// minecraft.player?.level()?.getPlayerByUUID(player)?.matteryPlayer?.spawnExopackSmoke = true // minecraft.player?.level?.getPlayerByUUID(player)?.matteryPlayer?.spawnExopackSmoke = true
minecraft.player?.level()?.getPlayerByUUID(player)?.let { ply -> minecraft.player?.level?.getPlayerByUUID(player)?.let { ply ->
if (ply != minecraft.player || minecraft.gameRenderer.mainCamera.isDetached) { if (ply != minecraft.player || minecraft.gameRenderer.mainCamera.isDetached) {
var (x, y, z) = ply.position var (x, y, z) = ply.position
@ -535,7 +535,7 @@ data class ExopackSmokePacket(val player: UUID) : MatteryPacket {
x += kotlin.math.cos(deg) * -0.4 x += kotlin.math.cos(deg) * -0.4
z += kotlin.math.sin(deg) * -0.4 z += kotlin.math.sin(deg) * -0.4
val level = ply.level() val level = ply.level
val random = level.random val random = level.random
for (i in 0 .. random.nextInt(2, 4)) for (i in 0 .. random.nextInt(2, 4))

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer
import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.OverdriveThatMatters

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.DamagePredicate import net.minecraft.advancements.critereon.DamagePredicate
import net.minecraft.advancements.critereon.DamageSourcePredicate import net.minecraft.advancements.critereon.DamageSourcePredicate
import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.EntityPredicate

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.ItemPredicate import net.minecraft.advancements.critereon.ItemPredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer

View File

@ -14,7 +14,6 @@ import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap
import net.minecraft.advancements.Criterion import net.minecraft.advancements.Criterion
import net.minecraft.advancements.CriterionTrigger import net.minecraft.advancements.CriterionTrigger
import net.minecraft.advancements.CriterionTriggerInstance import net.minecraft.advancements.CriterionTriggerInstance
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.DeserializationContext import net.minecraft.advancements.critereon.DeserializationContext
import net.minecraft.advancements.critereon.EntityPredicate import net.minecraft.advancements.critereon.EntityPredicate
import net.minecraft.advancements.critereon.SerializationContext import net.minecraft.advancements.critereon.SerializationContext
@ -28,6 +27,8 @@ import ru.dbotthepony.mc.otm.core.toJsonStrict
import java.util.Optional import java.util.Optional
import java.util.function.Predicate import java.util.function.Predicate
typealias ContextAwarePredicate = EntityPredicate.Composite
// allows to support both 1.20.1 and 1.20.2 with ease // allows to support both 1.20.1 and 1.20.2 with ease
// and has slightly less memory footprint than vanilla SimpleCriterionTrigger // and has slightly less memory footprint than vanilla SimpleCriterionTrigger
abstract class MCriterionTrigger<T : MCriterionTrigger<T>.AbstractInstance>(private val id: ResourceLocation) : CriterionTrigger<T> { abstract class MCriterionTrigger<T : MCriterionTrigger<T>.AbstractInstance>(private val id: ResourceLocation) : CriterionTrigger<T> {
@ -112,7 +113,7 @@ abstract class MCriterionTrigger<T : MCriterionTrigger<T>.AbstractInstance>(priv
val context = deserializationContext.get().lastOrNull() ?: return DataResult.error { "Not current deserializing trigger instance" } val context = deserializationContext.get().lastOrNull() ?: return DataResult.error { "Not current deserializing trigger instance" }
return try { return try {
DataResult.success(Pair.of(EntityPredicate.fromJson(JsonObject().also { it["a"] = ops.convertTo(JsonOps.INSTANCE, input) }, "a", context), ops.empty())) DataResult.success(Pair.of(EntityPredicate.Composite.fromJson(JsonObject().also { it["a"] = ops.convertTo(JsonOps.INSTANCE, input) }, "a", context), ops.empty()))
} catch (err: Exception) { } catch (err: Exception) {
DataResult.error { "Failed to deserialize ContextAwarePredicate: " + err.message } DataResult.error { "Failed to deserialize ContextAwarePredicate: " + err.message }
} }

View File

@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.advancements.critereon.MinMaxBounds.Doubles import net.minecraft.advancements.critereon.MinMaxBounds.Doubles
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import net.minecraft.server.level.ServerPlayer import net.minecraft.server.level.ServerPlayer

View File

@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.triggers
import com.mojang.serialization.Codec import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.advancements.Criterion import net.minecraft.advancements.Criterion
import net.minecraft.advancements.critereon.ContextAwarePredicate
import net.minecraft.resources.ResourceLocation import net.minecraft.resources.ResourceLocation
import java.util.* import java.util.*