Update android capability stuff

This commit is contained in:
DBotThePony 2021-12-31 18:24:05 +07:00
parent 9efb4d6176
commit e859b93350
Signed by: DBot
GPG Key ID: DCC23B5715498507
5 changed files with 100 additions and 104 deletions

View File

@ -5,7 +5,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.components.Button;
import net.minecraft.client.gui.screens.DeathScreen;
import net.minecraft.client.gui.screens.InBedChatScreen;
import net.minecraft.client.gui.screens.Screen;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.resources.ResourceLocation;
@ -16,7 +15,6 @@ import net.minecraftforge.client.event.ScreenEvent;
import net.minecraftforge.client.event.ScreenOpenEvent;
import net.minecraftforge.client.event.RenderGameOverlayEvent;
import net.minecraftforge.client.gui.ForgeIngameGui;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.EventPriority;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import org.apache.logging.log4j.LogManager;
@ -27,7 +25,6 @@ import ru.dbotthepony.mc.otm.capability.android.IAndroidCapability;
import ru.dbotthepony.mc.otm.capability.MatteryCapability;
import ru.dbotthepony.mc.otm.core.Fraction;
import java.math.BigDecimal;
import java.util.Optional;
import java.util.Random;
@ -75,7 +72,7 @@ public class AndroidGui {
}
mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (!((AndroidCapabilityPlayer) cap).will_become_android) {
if (!((AndroidCapabilityPlayer) cap).willBecomeAndroid) {
known_button.x = known_button_x;
known_button.y = known_button_y;
known_button_x = -1;
@ -114,7 +111,7 @@ public class AndroidGui {
known_button_screen = screen;
mc.player.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (((AndroidCapabilityPlayer) cap).will_become_android) {
if (((AndroidCapabilityPlayer) cap).willBecomeAndroid) {
known_button_screen = screen;
}
});

View File

@ -35,9 +35,9 @@ public record AndroidStatusPacket(Type type, boolean status) {
ply.getCapability(MatteryCapability.ANDROID).ifPresent(cap -> {
if (cap instanceof AndroidCapabilityPlayer pcap) {
if (type == Type.IS_ANDROID)
pcap.is_android = status;
pcap.isAndroid = status;
else if (type == Type.WILL_BECOME_ANDROID)
pcap.will_become_android = status;
pcap.willBecomeAndroid = status;
}
});
}

View File

@ -43,27 +43,26 @@ import java.util.*
@MethodsReturnNonnullByDefault
@ParametersAreNonnullByDefault
open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapabilityProvider, IAndroidCapability, INBTSerializable<CompoundTag?> {
@JvmField
protected var energy_stored = Fraction.ZERO
@JvmField
protected var energy_stored_max = Fraction(60000)
@JvmField protected var battery = Fraction.ZERO
@JvmField protected var maxBattery = Fraction(60000)
override var batteryItemStack = ItemStack.EMPTY
private var network_energy = Fraction(-1)
private var network_energy_max = Fraction(-1)
private var network_battery = ItemStack.EMPTY
private var remoteBattery = Fraction(-1)
private var remoteMaxBattery = Fraction(-1)
private var remoteBatteryStack = ItemStack.EMPTY
@JvmField protected val features: MutableMap<AndroidFeatureType<*>?, AndroidFeature> = HashMap()
@JvmField protected val network_queue = ArrayList<Any>()
@JvmField protected val delayed_tick_server = ArrayList<Runnable>()
@JvmField protected var network_first = false
@JvmField protected val networkQueue = ArrayList<Any>()
@JvmField protected val queuedTicks = ArrayList<Runnable>()
@JvmField protected var networkFirst = false
protected fun addFeature(feature: AndroidFeature): Boolean {
if (features.containsKey(feature.type)) return false
features[feature.type] = feature
if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { feature.applyModifiers() })
queuedTicks.add(Runnable { feature.applyModifiers() })
}
if (ent is ServerPlayer) {
sendNetwork(AndroidFeaturePacket(true, feature))
@ -80,7 +79,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
features[feature] = factory
if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { factory!!.applyModifiers() })
queuedTicks.add(Runnable { factory!!.applyModifiers() })
}
if (ent is ServerPlayer) {
@ -95,7 +94,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
if (removed != null) {
if (!ent.level.isClientSide) {
delayed_tick_server.add { removed.removeModifiers() }
queuedTicks.add { removed.removeModifiers() }
}
if (ent is ServerPlayer) {
@ -122,9 +121,9 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
}
override fun invalidateNetworkState() {
network_energy = Fraction.MINUS_ONE
network_energy_max = Fraction.MINUS_ONE
network_battery = ItemStack.EMPTY
remoteBattery = Fraction.MINUS_ONE
remoteMaxBattery = Fraction.MINUS_ONE
remoteBatteryStack = ItemStack.EMPTY
if (ent is ServerPlayer) {
for (feature in features.values) {
@ -134,15 +133,15 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
}
}
override fun setEnergy(value: Fraction?) {
energy_stored = value!!
override fun setEnergy(value: Fraction) {
battery = value
}
override fun setMaxEnergy(value: Fraction?) {
energy_stored_max = value!!
override fun setMaxEnergy(value: Fraction) {
maxBattery = value
}
override fun onHurt(event: LivingHurtEvent?) {
override fun onHurt(event: LivingHurtEvent) {
for (feature in features.values) {
feature.onHurt(event)
}
@ -151,8 +150,8 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
override fun serializeNBT(): CompoundTag {
val tag = CompoundTag()
tag["energy_stored"] = energy_stored.serializeNBT()
tag["energy_stored_max"] = energy_stored_max.serializeNBT()
tag["energy_stored"] = battery.serializeNBT()
tag["energy_stored_max"] = maxBattery.serializeNBT()
tag["battery"] = batteryItemStack.serializeNBT()
val featureList = ListTag()
@ -173,11 +172,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
compound!!
compound.ifHas("energy_stored") {
energy_stored = Fraction.deserializeNBT(it)
battery = Fraction.deserializeNBT(it)
}
compound.ifHas("energy_stored_max") {
energy_stored_max = Fraction.deserializeNBT(it)
maxBattery = Fraction.deserializeNBT(it)
}
compound.ifHas("battery", CompoundTag::class.java) {
@ -199,7 +198,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
addFeature(feature)
if (!ent.level.isClientSide) {
delayed_tick_server.add(Runnable { feature.applyModifiers() })
queuedTicks.add(Runnable { feature.applyModifiers() })
}
}
}
@ -214,39 +213,39 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
protected fun sendNetwork(packet: Any) {
if (ent is ServerPlayer) {
if (network_first) {
if (networkFirst) {
MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with { ent }, packet)
} else {
network_queue.add(packet)
networkQueue.add(packet)
}
}
}
protected open fun tickNetwork() {
network_first = true
networkFirst = true
if (ent is ServerPlayer) {
if (energy_stored != network_energy) {
network_energy = energy_stored
sendNetwork(AndroidEnergyPacket(false, energy_stored))
if (battery != remoteBattery) {
remoteBattery = battery
sendNetwork(AndroidEnergyPacket(false, battery))
}
if (energy_stored_max != network_energy_max) {
network_energy_max = energy_stored_max
sendNetwork(AndroidEnergyPacket(true, energy_stored_max))
if (maxBattery != remoteMaxBattery) {
remoteMaxBattery = maxBattery
sendNetwork(AndroidEnergyPacket(true, maxBattery))
}
if (!network_battery.equals(batteryItemStack, false)) {
network_battery = batteryItemStack.copy()
if (!remoteBatteryStack.equals(batteryItemStack, false)) {
remoteBatteryStack = batteryItemStack.copy()
sendNetwork(AndroidBatteryPacket(batteryItemStack))
}
if (network_queue.size != 0) {
for (packet in network_queue) {
if (networkQueue.size != 0) {
for (packet in networkQueue) {
MatteryNetworking.CHANNEL.send(PacketDistributor.PLAYER.with {ent}, packet)
}
network_queue.clear()
networkQueue.clear()
}
}
}
@ -255,7 +254,7 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
protected open fun tickInnerClientAlways() {}
override fun tickClient() {
delayed_tick_server.clear()
queuedTicks.clear()
if (!ent.isAlive) return
tickInnerClientAlways()
if (isAndroid()) {
@ -275,10 +274,10 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
feature.tickServer()
}
}
for (runnable in delayed_tick_server) {
for (runnable in queuedTicks) {
runnable.run()
}
delayed_tick_server.clear()
queuedTicks.clear()
tickNetwork()
}
@ -292,12 +291,12 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
if (ent.hasEffect(effect))
ent.removeEffect(effect)
if (!batteryItemStack.isEmpty && energy_stored < energy_stored_max) {
if (!batteryItemStack.isEmpty && battery < maxBattery) {
batteryItemStack.getCapability(CapabilityEnergy.ENERGY).ifPresent {
if (it is IMatteryEnergyStorage) {
energy_stored += it.extractEnergyInner(energy_stored_max - energy_stored, false)
battery += it.extractEnergyInner(maxBattery - battery, false)
} else {
energy_stored += it.extractEnergy(energy_stored_max - energy_stored, false)
battery += it.extractEnergy(maxBattery - battery, false)
}
}
}
@ -333,11 +332,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
}
}
val new = (energy_stored - howMuch).moreThanZero()
drained += energy_stored - new
val new = (battery - howMuch).moreThanZero()
drained += battery - new
if (!simulate) {
energy_stored = new
battery = new
if (ent is ServerPlayer) {
ent.awardStat(Registry.Names.POWER_CONSUMED, drained.toInt() * 10)
@ -369,11 +368,11 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
}
}
val new = (energy_stored + howMuch).min(energy_stored_max)
received += new - energy_stored
val new = (battery + howMuch).min(maxBattery)
received += new - battery
if (!simulate) {
energy_stored = new
battery = new
}
return received
@ -395,14 +394,14 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
val it = resolver.get()
if (it is IMatteryEnergyStorage) {
return energy_stored + it.batteryLevel
return battery + it.batteryLevel
} else {
return energy_stored + it.energyStored
return battery + it.energyStored
}
}
}
return energy_stored
return battery
}
override fun getMaxBatteryLevel(): Fraction {
@ -413,14 +412,14 @@ open class AndroidCapability(@JvmField protected val ent: LivingEntity) : ICapab
val it = resolver.get()
if (it is IMatteryEnergyStorage) {
return energy_stored_max + it.maxBatteryLevel
return maxBattery + it.maxBatteryLevel
} else {
return energy_stored_max + it.maxEnergyStored
return maxBattery + it.maxEnergyStored
}
}
}
return energy_stored_max
return maxBattery
}
private val resolver = LazyOptional.of { this }

View File

@ -25,63 +25,63 @@ import java.util.*
class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply) {
@JvmField
var is_android = false
private var network_is_android = false
var isAndroid = false
private var isAndroidNetwork = false
@JvmField
var will_become_android = false
private var network_will_become_android = false
var willBecomeAndroid = false
private var willBecomeAndroidNetwork = false
private val research = ArrayList<AndroidResearch>()
override fun invalidateNetworkState() {
super.invalidateNetworkState()
network_is_android = false
network_will_become_android = false
isAndroidNetwork = false
willBecomeAndroidNetwork = false
for (instance in research) {
instance.dirty = true
}
}
override fun isAndroid(): Boolean = is_android
fun isEverAndroid(): Boolean = is_android || will_become_android
override fun isAndroid(): Boolean = isAndroid
fun isEverAndroid(): Boolean = isAndroid || willBecomeAndroid
fun becomeAndroidSoft() {
if (is_android || will_become_android) return
will_become_android = true
if (isAndroid || willBecomeAndroid) return
willBecomeAndroid = true
(ply as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message").withStyle(ChatFormatting.GRAY), false)
}
fun becomeAndroid() {
if (is_android) return
if (isAndroid) return
is_android = true
will_become_android = false
energy_stored = Fraction(60000)
energy_stored_max = Fraction(60000)
isAndroid = true
willBecomeAndroid = false
battery = Fraction(60000)
maxBattery = Fraction(60000)
}
fun becomeAndroidAndKill() {
if (is_android) return
if (isAndroid) return
becomeAndroid()
ply.hurt(Registry.DAMAGE_BECOME_ANDROID, ply.maxHealth * 2)
}
fun becomeHumane() {
if (will_become_android) will_become_android = false
if (!is_android) return
if (willBecomeAndroid) willBecomeAndroid = false
if (!isAndroid) return
is_android = false
energy_stored = Fraction(0)
energy_stored_max = Fraction(60000)
isAndroid = false
battery = Fraction(0)
maxBattery = Fraction(60000)
dropBattery()
}
fun becomeHumaneAndKill() {
if (will_become_android) will_become_android = false
if (!is_android) return
if (willBecomeAndroid) willBecomeAndroid = false
if (!isAndroid) return
becomeHumane()
ply.hurt(Registry.DAMAGE_BECOME_HUMANE, ply.maxHealth * 2)
@ -90,8 +90,8 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun deserializeNBT(compound: CompoundTag?) {
super.deserializeNBT(compound!!)
is_android = compound.getBoolean("is_android")
will_become_android = compound.getBoolean("will_become_android")
isAndroid = compound.getBoolean("is_android")
willBecomeAndroid = compound.getBoolean("will_become_android")
research.clear()
val list = compound.getList("research", Tag.TAG_COMPOUND.toInt())
@ -112,8 +112,8 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun serializeNBT(): CompoundTag {
val tag = super.serializeNBT()
tag["is_android"] = is_android
tag["will_become_android"] = will_become_android
tag["is_android"] = isAndroid
tag["will_become_android"] = willBecomeAndroid
val list = ListTag()
@ -146,14 +146,14 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickNetwork() {
super.tickNetwork()
if (is_android != network_is_android) {
network_is_android = is_android
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.IS_ANDROID, is_android))
if (isAndroid != isAndroidNetwork) {
isAndroidNetwork = isAndroid
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.IS_ANDROID, isAndroid))
}
if (will_become_android != network_will_become_android) {
network_will_become_android = will_become_android
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.WILL_BECOME_ANDROID, will_become_android))
if (willBecomeAndroid != willBecomeAndroidNetwork) {
willBecomeAndroidNetwork = willBecomeAndroid
sendNetwork(AndroidStatusPacket(AndroidStatusPacket.Type.WILL_BECOME_ANDROID, willBecomeAndroid))
}
for (instance in research) {
@ -170,7 +170,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickInnerClientAlways() {
super.tickInnerClientAlways()
if (will_become_android) {
if (willBecomeAndroid) {
if (ply.isSleeping) {
sleep_ticks++
} else {
@ -182,7 +182,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
override fun tickServerAlways() {
super.tickServerAlways()
if (will_become_android) {
if (willBecomeAndroid) {
if (ply.isSleeping) {
sleep_ticks++
@ -268,7 +268,7 @@ class AndroidCapabilityPlayer(@JvmField val ply: Player) : AndroidCapability(ply
val original = resolver.resolve().get() as AndroidCapabilityPlayer
if (original.will_become_android && event.isWasDeath) {
if (original.willBecomeAndroid && event.isWasDeath) {
original.becomeAndroid()
(event.player as? ServerPlayer)?.displayClientMessage(TranslatableComponent("otm.pill.message_finish").withStyle(ChatFormatting.DARK_RED), false)
}

View File

@ -37,9 +37,9 @@ interface IAndroidCapability : IMatteryEnergyStorage, INBTSerializable<CompoundT
fun isAndroid(): Boolean = true
fun onHurt(event: LivingHurtEvent?) {}
fun onHurt(event: LivingHurtEvent) {}
var batteryItemStack: ItemStack
fun invalidateNetworkState() // tell capability that player forgot everything, and everything needs to be re-networked
fun setEnergy(value: Fraction?)
fun setMaxEnergy(value: Fraction?)
fun setEnergy(value: Fraction)
fun setMaxEnergy(value: Fraction)
}