вынос кд и макс. кд в базовый класс, отображение прогресса кд при применении
This commit is contained in:
parent
89ae6e9f2c
commit
34cd04fb2d
@ -12,7 +12,6 @@ abstract class AndroidActiveFeature(type: AndroidFeatureType<*>, android: Matter
|
|||||||
abstract fun activate(isClient: Boolean): Boolean
|
abstract fun activate(isClient: Boolean): Boolean
|
||||||
|
|
||||||
open val previewRenderStage: RenderLevelStageEvent.Stage get() = RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS
|
open val previewRenderStage: RenderLevelStageEvent.Stage get() = RenderLevelStageEvent.Stage.AFTER_TRANSLUCENT_BLOCKS
|
||||||
open val isOnCooldown: Boolean get() = false
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called on client inside world render context to render previews of ability activation
|
* Called on client inside world render context to render previews of ability activation
|
||||||
|
@ -23,6 +23,20 @@ abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: Ma
|
|||||||
open val allowToSwitchByPlayer: Boolean get() = true
|
open val allowToSwitchByPlayer: Boolean get() = true
|
||||||
open val allowToSwitchByPlayerWhileSpectator: Boolean get() = true
|
open val allowToSwitchByPlayerWhileSpectator: Boolean get() = true
|
||||||
|
|
||||||
|
open val maxCooldown: Int get() = 0
|
||||||
|
open var cooldown by synchronizer.int()
|
||||||
|
val isOnCooldown: Boolean
|
||||||
|
get() = maxCooldown > 0 && cooldown > 0
|
||||||
|
|
||||||
|
fun getCooldownPercent(): Float {
|
||||||
|
if (maxCooldown <= 0) return 0.0f
|
||||||
|
return (cooldown.toFloat() / maxCooldown.toFloat()).coerceIn(0.0f, 1.0f)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun putOnCooldown() {
|
||||||
|
cooldown = maxCooldown
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: PoseStack is stripped from server dist
|
// TODO: PoseStack is stripped from server dist
|
||||||
// but it doesn't seem to cause issues?
|
// but it doesn't seem to cause issues?
|
||||||
abstract fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float)
|
abstract fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float)
|
||||||
@ -30,11 +44,20 @@ abstract class AndroidSwitchableFeature(type: AndroidFeatureType<*>, android: Ma
|
|||||||
override fun serializeNBT(): CompoundTag {
|
override fun serializeNBT(): CompoundTag {
|
||||||
return super.serializeNBT().also {
|
return super.serializeNBT().also {
|
||||||
it["isActive"] = isActive
|
it["isActive"] = isActive
|
||||||
|
it["cooldown"] = cooldown
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun deserializeNBT(nbt: CompoundTag) {
|
override fun deserializeNBT(nbt: CompoundTag) {
|
||||||
super.deserializeNBT(nbt)
|
super.deserializeNBT(nbt)
|
||||||
isActive = nbt.getBoolean("isActive")
|
isActive = nbt.getBoolean("isActive")
|
||||||
|
cooldown = nbt.getInt("cooldown")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun tickServer() {
|
||||||
|
super.tickServer()
|
||||||
|
if (cooldown > 0) {
|
||||||
|
cooldown--
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,28 +57,16 @@ import kotlin.math.roundToInt
|
|||||||
import kotlin.math.sin
|
import kotlin.math.sin
|
||||||
|
|
||||||
class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiveFeature(AndroidFeatures.ENDER_TELEPORTER, capability) {
|
class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiveFeature(AndroidFeatures.ENDER_TELEPORTER, capability) {
|
||||||
var cooldown by synchronizer.int()
|
|
||||||
var lastTeleport = 0
|
var lastTeleport = 0
|
||||||
private set
|
private set
|
||||||
|
|
||||||
override val isOnCooldown: Boolean
|
override val maxCooldown: Int
|
||||||
get() = cooldown > 0
|
get() = ServerConfig.EnderTeleporter.COOLDOWN
|
||||||
|
|
||||||
private fun canUse(): Boolean {
|
private fun canUse(): Boolean {
|
||||||
return !isOnCooldown && android.androidEnergy.extractEnergyInnerExact(ServerConfig.EnderTeleporter.ENERGY_COST, true).isPositive
|
return !isOnCooldown && android.androidEnergy.extractEnergyInnerExact(ServerConfig.EnderTeleporter.ENERGY_COST, true).isPositive
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun serializeNBT(): CompoundTag {
|
|
||||||
return super.serializeNBT().also {
|
|
||||||
it["cooldown"] = cooldown
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun deserializeNBT(nbt: CompoundTag) {
|
|
||||||
super.deserializeNBT(nbt)
|
|
||||||
cooldown = nbt.getInt("cooldown")
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun isValidGround(blockPos: BlockPos): Boolean {
|
private fun isValidGround(blockPos: BlockPos): Boolean {
|
||||||
return canSupportPlayer(blockPos) && !isWall(blockPos)
|
return canSupportPlayer(blockPos) && !isWall(blockPos)
|
||||||
}
|
}
|
||||||
@ -301,7 +289,7 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!isClient) {
|
if (!isClient) {
|
||||||
cooldown = ServerConfig.EnderTeleporter.COOLDOWN
|
putOnCooldown()
|
||||||
|
|
||||||
if (!canUse) {
|
if (!canUse) {
|
||||||
android.androidEnergy.extractEnergyInnerExact(ServerConfig.EnderTeleporter.ENERGY_COST, false)
|
android.androidEnergy.extractEnergyInnerExact(ServerConfig.EnderTeleporter.ENERGY_COST, false)
|
||||||
@ -328,12 +316,6 @@ class EnderTeleporterFeature(capability: MatteryPlayerCapability) : AndroidActiv
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tickServer() {
|
|
||||||
if (cooldown > 0) {
|
|
||||||
cooldown--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override val previewRenderStage: RenderLevelStageEvent.Stage
|
override val previewRenderStage: RenderLevelStageEvent.Stage
|
||||||
get() = RenderLevelStageEvent.Stage.AFTER_PARTICLES
|
get() = RenderLevelStageEvent.Stage.AFTER_PARTICLES
|
||||||
|
|
||||||
|
@ -56,7 +56,10 @@ object TriggerJumpBoostPacket : MatteryPacket {
|
|||||||
class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.JUMP_BOOST, capability) {
|
class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.JUMP_BOOST, capability) {
|
||||||
private var tickCooldownClient = false
|
private var tickCooldownClient = false
|
||||||
|
|
||||||
var cooldown by synchronizer.int(setter = setter@{ value, access, setByRemote ->
|
override val maxCooldown: Int
|
||||||
|
get() = (ServerConfig.AndroidJumpBoost.BASE_COOLDOWN - ServerConfig.AndroidJumpBoost.COOLDOWN_REDUCTION * level).coerceAtLeast(0)
|
||||||
|
|
||||||
|
override var cooldown by synchronizer.int(setter = setter@{ value, access, setByRemote ->
|
||||||
access.write(value)
|
access.write(value)
|
||||||
|
|
||||||
if (setByRemote) {
|
if (setByRemote) {
|
||||||
@ -64,21 +67,6 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
override fun serializeNBT(): CompoundTag {
|
|
||||||
return super.serializeNBT().also {
|
|
||||||
it["cooldown"] = cooldown
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun deserializeNBT(nbt: CompoundTag) {
|
|
||||||
super.deserializeNBT(nbt)
|
|
||||||
cooldown = nbt.getInt("cooldown")
|
|
||||||
}
|
|
||||||
|
|
||||||
fun putOnCooldown() {
|
|
||||||
cooldown = (ServerConfig.AndroidJumpBoost.BASE_COOLDOWN - ServerConfig.AndroidJumpBoost.COOLDOWN_REDUCTION * level).coerceAtLeast(0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private var lastGround = false
|
private var lastGround = false
|
||||||
|
|
||||||
fun movementTick(isJumping: Boolean, isShifting: Boolean) {
|
fun movementTick(isJumping: Boolean, isShifting: Boolean) {
|
||||||
@ -104,12 +92,6 @@ class JumpBoostFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun tickServer() {
|
|
||||||
if (cooldown > 0) {
|
|
||||||
cooldown--
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float) {
|
override fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float) {
|
||||||
if (cooldown > 0) {
|
if (cooldown > 0) {
|
||||||
RenderSystem.setShaderColor(1f, 0.4f, 0.4f, 1f)
|
RenderSystem.setShaderColor(1f, 0.4f, 0.4f, 1f)
|
||||||
|
@ -53,7 +53,7 @@ object TriggerShockwavePacket : MatteryPacket {
|
|||||||
context.enqueueWork {
|
context.enqueueWork {
|
||||||
val shockwave = context.sender?.matteryPlayer?.getFeature(AndroidFeatures.SHOCKWAVE) as ShockwaveFeature? ?: return@enqueueWork
|
val shockwave = context.sender?.matteryPlayer?.getFeature(AndroidFeatures.SHOCKWAVE) as ShockwaveFeature? ?: return@enqueueWork
|
||||||
|
|
||||||
if (shockwave.cooldown <= 0 && shockwave.isActive && shockwave.airTicks > 0) {
|
if (!shockwave.isOnCooldown && shockwave.isActive && shockwave.airTicks > 0) {
|
||||||
shockwave.shockwave()
|
shockwave.shockwave()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -61,7 +61,8 @@ object TriggerShockwavePacket : MatteryPacket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.SHOCKWAVE, capability) {
|
class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableFeature(AndroidFeatures.SHOCKWAVE, capability) {
|
||||||
var cooldown by synchronizer.int()
|
override val maxCooldown: Int
|
||||||
|
get() = ServerConfig.Shockwave.COOLDOWN
|
||||||
|
|
||||||
private var wasMidair = false
|
private var wasMidair = false
|
||||||
private var highestSpeed = 0.0
|
private var highestSpeed = 0.0
|
||||||
@ -73,7 +74,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
!ply.isSpectator &&
|
!ply.isSpectator &&
|
||||||
isActive &&
|
isActive &&
|
||||||
ply.isShiftKeyDown &&
|
ply.isShiftKeyDown &&
|
||||||
cooldown <= 0 &&
|
!isOnCooldown &&
|
||||||
android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive &&
|
android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive &&
|
||||||
ply.deltaMovement.y < -0.01
|
ply.deltaMovement.y < -0.01
|
||||||
) {
|
) {
|
||||||
@ -84,11 +85,11 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun shockwave() {
|
fun shockwave() {
|
||||||
if (ply.isSpectator || cooldown > 0 || !android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, false).isPositive) {
|
if (ply.isSpectator || isOnCooldown || !android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, false).isPositive) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
cooldown = ServerConfig.Shockwave.COOLDOWN
|
putOnCooldown()
|
||||||
|
|
||||||
if (ply is ServerPlayer) {
|
if (ply is ServerPlayer) {
|
||||||
ShockwaveTrigger.trigger(ply as ServerPlayer)
|
ShockwaveTrigger.trigger(ply as ServerPlayer)
|
||||||
@ -169,7 +170,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
airTicks = (airTicks - 1).coerceAtLeast(0)
|
airTicks = (airTicks - 1).coerceAtLeast(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ply.isSpectator && isActive && cooldown <= 0 && android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive) {
|
if (!ply.isSpectator && isActive && !isOnCooldown && android.androidEnergy.extractEnergyInnerExact(ServerConfig.Shockwave.ENERGY_COST, true).isPositive) {
|
||||||
val old = wasMidair
|
val old = wasMidair
|
||||||
wasMidair = !ply.isOnGround
|
wasMidair = !ply.isOnGround
|
||||||
|
|
||||||
@ -182,7 +183,7 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
// I HATE SELF-UPDATING PLAYERS
|
// I HATE SELF-UPDATING PLAYERS
|
||||||
// I HATE SELF-UPDATING PLAYERS
|
// I HATE SELF-UPDATING PLAYERS
|
||||||
// fix "bug" where shockwave doesn't trigger even when player is falling faster than orbiting satellite
|
// fix "bug" where shockwave doesn't trigger even when player is falling faster than orbiting satellite
|
||||||
cooldown = ServerConfig.Shockwave.COOLDOWN
|
putOnCooldown()
|
||||||
MatteryPlayerNetworkChannel.sendToServer(TriggerShockwavePacket)
|
MatteryPlayerNetworkChannel.sendToServer(TriggerShockwavePacket)
|
||||||
} else {
|
} else {
|
||||||
shockwave()
|
shockwave()
|
||||||
@ -199,21 +200,19 @@ class ShockwaveFeature(capability: MatteryPlayerCapability) : AndroidSwitchableF
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun tickServer() {
|
override fun tickServer() {
|
||||||
if (cooldown > 0) {
|
super.tickServer()
|
||||||
cooldown--
|
|
||||||
}
|
|
||||||
|
|
||||||
ticker(false)
|
ticker(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float) {
|
override fun renderIcon(stack: PoseStack, x: Float, y: Float, width: Float, height: Float) {
|
||||||
if (cooldown > 0) {
|
if (isOnCooldown) {
|
||||||
RenderSystem.setShaderColor(1f, 0.4f, 0.4f, 1f)
|
RenderSystem.setShaderColor(1f, 0.4f, 0.4f, 1f)
|
||||||
}
|
}
|
||||||
|
|
||||||
ResearchIcons.ICON_SHOCKWAVE.render(stack, x, y, width, height)
|
ResearchIcons.ICON_SHOCKWAVE.render(stack, x, y, width, height)
|
||||||
|
|
||||||
if (cooldown > 0) {
|
if (isOnCooldown) {
|
||||||
RenderSystem.setShaderColor(1f, 1f, 1f, 1f)
|
RenderSystem.setShaderColor(1f, 1f, 1f, 1f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package ru.dbotthepony.mc.otm.client
|
package ru.dbotthepony.mc.otm.client
|
||||||
|
|
||||||
import com.mojang.blaze3d.platform.InputConstants
|
import com.mojang.blaze3d.platform.InputConstants
|
||||||
|
import com.mojang.blaze3d.systems.RenderSystem
|
||||||
import net.minecraft.client.KeyMapping
|
import net.minecraft.client.KeyMapping
|
||||||
import net.minecraftforge.client.event.RegisterKeyMappingsEvent
|
import net.minecraftforge.client.event.RegisterKeyMappingsEvent
|
||||||
import net.minecraftforge.client.event.RenderGuiEvent
|
import net.minecraftforge.client.event.RenderGuiEvent
|
||||||
@ -10,10 +11,12 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters
|
|||||||
import ru.dbotthepony.mc.otm.android.AndroidActiveFeature
|
import ru.dbotthepony.mc.otm.android.AndroidActiveFeature
|
||||||
import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
import ru.dbotthepony.mc.otm.capability.matteryPlayer
|
||||||
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
import ru.dbotthepony.mc.otm.client.render.Widgets18
|
||||||
|
import ru.dbotthepony.mc.otm.client.render.drawRect
|
||||||
import ru.dbotthepony.mc.otm.client.render.is3DContext
|
import ru.dbotthepony.mc.otm.client.render.is3DContext
|
||||||
import ru.dbotthepony.mc.otm.core.RGBAColor
|
import ru.dbotthepony.mc.otm.core.RGBAColor
|
||||||
import ru.dbotthepony.mc.otm.network.ActivateAndroidFeaturePacket
|
import ru.dbotthepony.mc.otm.network.ActivateAndroidFeaturePacket
|
||||||
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
|
import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel
|
||||||
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConflictContext.IN_GAME, InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_V), OverdriveThatMatters.MOD_ID) {
|
object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConflictContext.IN_GAME, InputConstants.Type.KEYSYM.getOrCreate(InputConstants.KEY_V), OverdriveThatMatters.MOD_ID) {
|
||||||
private var feature: AndroidActiveFeature? = null
|
private var feature: AndroidActiveFeature? = null
|
||||||
@ -62,6 +65,18 @@ object AndroidAbilityKeyMapping : KeyMapping("key.otm.android_ability", KeyConfl
|
|||||||
if (feature.isOnCooldown) {
|
if (feature.isOnCooldown) {
|
||||||
RGBAColor.WHITE.setSystemColor()
|
RGBAColor.WHITE.setSystemColor()
|
||||||
|
|
||||||
|
val cooldownPct = feature.getCooldownPercent()
|
||||||
|
|
||||||
|
if (cooldownPct > 0.0f) {
|
||||||
|
RenderSystem.setShaderColor(1f, 1f, 1f, 0.5f)
|
||||||
|
|
||||||
|
val nodrawpixels = (iconSize * (1 - cooldownPct)).roundToInt().toFloat()
|
||||||
|
drawRect(event.poseStack, x, y + nodrawpixels, iconSize, iconSize - nodrawpixels)
|
||||||
|
|
||||||
|
RenderSystem.setShaderColor(1f, 1f, 1f, 1f)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Widgets18.COOLDOWN.render(event.poseStack, x, y + iconSize, iconSize, iconSize)
|
Widgets18.COOLDOWN.render(event.poseStack, x, y + iconSize, iconSize, iconSize)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user