mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-16 02:45:13 -04:00
port PlaySession to NetworkConnection
This commit is contained in:
parent
9c5d1cbf7a
commit
aaa195cdc6
@ -202,7 +202,7 @@ abstract class Container(
|
||||
|
||||
if (!force && session.player.items.opened == this) {
|
||||
session.player.items.opened = null
|
||||
session.network.send(CloseContainerC2SP(id))
|
||||
session.connection.send(CloseContainerC2SP(id))
|
||||
}
|
||||
|
||||
session.events.fire(ContainerCloseEvent(session, this))
|
||||
|
@ -33,7 +33,7 @@ class CloneContainerAction(
|
||||
this.copied = stack
|
||||
|
||||
// TODO (1.18.2): use creative inventory packet
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 3, 0, container.actions.createId(this), slotsOf(), stack))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 3, 0, container.actions.createId(this), slotsOf(), stack))
|
||||
|
||||
container.floatingItem = stack
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ class DropContainerAction(
|
||||
}
|
||||
|
||||
val actionId = container.actions.createId(this)
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 4, if (stack) 1 else 0, actionId, slotsOf(slot to item), null))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 4, if (stack) 1 else 0, actionId, slotsOf(slot to item), null))
|
||||
|
||||
// TODO (1.18.2): use creative inventory packet
|
||||
container.commit()
|
||||
|
@ -96,7 +96,7 @@ class FastMoveContainerAction(
|
||||
}
|
||||
}
|
||||
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, this.slot, 1, 0, container.actions.createId(this), changes, null))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, this.slot, 1, 0, container.actions.createId(this), changes, null))
|
||||
} finally {
|
||||
container.commit()
|
||||
}
|
||||
|
@ -67,7 +67,7 @@ class PickAllContainerAction(
|
||||
return
|
||||
}
|
||||
container.floatingItem = floating
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, this.slot, 6, 0, container.actions.createId(this), changes, floating))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, this.slot, 6, 0, container.actions.createId(this), changes, floating))
|
||||
} finally {
|
||||
container.commit()
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ class SimpleContainerAction(
|
||||
}
|
||||
|
||||
container.floatingItem = floatingItem
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to item), floatingItem))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to item), floatingItem))
|
||||
}
|
||||
|
||||
private fun putItem(session: PlaySession, containerId: Int, container: Container, floatingItem: ItemStack) {
|
||||
@ -59,7 +59,7 @@ class SimpleContainerAction(
|
||||
} else {
|
||||
floatingItem.item._count-- // don't use decrease, item + container is already locked
|
||||
}
|
||||
return session.network.send(ContainerClickC2SP(containerId, container.serverRevision, null, 0, count.ordinal, container.actions.createId(this), slotsOf(), null))
|
||||
return session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, null, 0, count.ordinal, container.actions.createId(this), slotsOf(), null))
|
||||
}
|
||||
var target = container[slot]
|
||||
val slotType = container.getSlotType(slot)
|
||||
@ -93,7 +93,7 @@ class SimpleContainerAction(
|
||||
} else {
|
||||
container.floatingItem = null
|
||||
}
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to target), container.floatingItem))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to target), container.floatingItem))
|
||||
return
|
||||
}
|
||||
if (target != null && slotType?.canRemove(container, slot, target) != true) {
|
||||
@ -109,13 +109,13 @@ class SimpleContainerAction(
|
||||
if (count == ContainerCounts.ALL || (!matches && target != null)) {
|
||||
container.floatingItem = target
|
||||
container[slot] = floatingItem
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to floatingItem), target))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to floatingItem), target))
|
||||
} else {
|
||||
floatingItem.item.count--
|
||||
container.floatingItem = floatingItem
|
||||
target = floatingItem.copy(count = 1)
|
||||
container[slot] = target
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to target), floatingItem))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, slot, 0, count.ordinal, container.actions.createId(this), slotsOf(slot to target), floatingItem))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ class SlotSwapContainerAction(
|
||||
container[this.sourceId] = target
|
||||
container[targetId] = source
|
||||
|
||||
session.network.send(ContainerClickC2SP(containerId, container.serverRevision, sourceId, 2, this.target.button, container.actions.createId(this), slotsOf(sourceId to target, targetId to source), source))
|
||||
session.connection.send(ContainerClickC2SP(containerId, container.serverRevision, sourceId, 2, this.target.button, container.actions.createId(this), slotsOf(sourceId to target, targetId to source), source))
|
||||
|
||||
} finally {
|
||||
container.commit()
|
||||
|
@ -99,7 +99,7 @@ class EnchantingContainer(session: PlaySession, type: ContainerType, title: Chat
|
||||
throw IllegalStateException("Can not enchant $index!")
|
||||
}
|
||||
val id = this.id ?: return
|
||||
session.network.send(ContainerButtonC2SP(id, index))
|
||||
session.connection.send(ContainerButtonC2SP(id, index))
|
||||
}
|
||||
|
||||
private object LapislazuliSlot : SlotType {
|
||||
|
@ -105,7 +105,7 @@ class PlayerInventory(
|
||||
|
||||
override fun onOpen() {
|
||||
if (session.version < V_17W13B) {
|
||||
session.network.send(ClientActionC2SP(ClientActionC2SP.ClientActions.OPEN_INVENTORY))
|
||||
session.connection.send(ClientActionC2SP(ClientActionC2SP.ClientActions.OPEN_INVENTORY))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,7 +50,7 @@ class MovementPacketSender(
|
||||
if (this.sprinting == sprinting) {
|
||||
return
|
||||
}
|
||||
session.network.send(EntityActionC2SP(player, session, sprinting.decide(EntityActionC2SP.EntityActions.START_SPRINTING, EntityActionC2SP.EntityActions.STOP_SPRINTING)))
|
||||
session.connection.send(EntityActionC2SP(player, session, sprinting.decide(EntityActionC2SP.EntityActions.START_SPRINTING, EntityActionC2SP.EntityActions.STOP_SPRINTING)))
|
||||
this.sprinting = sprinting
|
||||
}
|
||||
|
||||
@ -58,7 +58,7 @@ class MovementPacketSender(
|
||||
if (this.sneaking == sneaking) {
|
||||
return
|
||||
}
|
||||
session.network.send(EntityActionC2SP(player, session, sneaking.decide(EntityActionC2SP.EntityActions.START_SNEAKING, EntityActionC2SP.EntityActions.STOP_SNEAKING)))
|
||||
session.connection.send(EntityActionC2SP(player, session, sneaking.decide(EntityActionC2SP.EntityActions.START_SNEAKING, EntityActionC2SP.EntityActions.STOP_SNEAKING)))
|
||||
this.sneaking = sneaking
|
||||
}
|
||||
|
||||
@ -70,7 +70,7 @@ class MovementPacketSender(
|
||||
return
|
||||
}
|
||||
this.flying = flying
|
||||
session.network.send(ToggleFlyC2SP(abilities))
|
||||
session.connection.send(ToggleFlyC2SP(abilities))
|
||||
}
|
||||
|
||||
private fun sendMovement(position: Vec3d, rotation: EntityRotation, onGround: Boolean) {
|
||||
@ -87,7 +87,7 @@ class MovementPacketSender(
|
||||
onGround != this.onGround -> GroundChangeC2SP(onGround)
|
||||
else -> null
|
||||
}
|
||||
packet?.let { session.network.send(it) }
|
||||
packet?.let { session.connection.send(it) }
|
||||
|
||||
if (sendPosition) {
|
||||
this.lastPacket = 0
|
||||
@ -111,17 +111,17 @@ class MovementPacketSender(
|
||||
}
|
||||
|
||||
private fun sendVehicle(vehicle: Entity) {
|
||||
session.network.send(RotationC2SP(player.physics.rotation, player.physics.onGround))
|
||||
session.network.send(VehicleInputC2SP(physics.input.sideways, physics.input.forwards, player.input.jump, player.input.sneak))
|
||||
session.connection.send(RotationC2SP(player.physics.rotation, player.physics.onGround))
|
||||
session.connection.send(VehicleInputC2SP(physics.input.sideways, physics.input.forwards, player.input.jump, player.input.sneak))
|
||||
if (vehicle == player || !vehicle.clientControlled) {
|
||||
return
|
||||
}
|
||||
session.network.send(MoveVehicleC2SP(vehicle.physics.position, vehicle.physics.rotation))
|
||||
session.connection.send(MoveVehicleC2SP(vehicle.physics.position, vehicle.physics.rotation))
|
||||
sendSprinting(player.isSprinting)
|
||||
}
|
||||
|
||||
fun sendPositionRotation() {
|
||||
session.network.send(PositionRotationC2SP(physics.position, physics.eyeY, physics.rotation, physics.onGround))
|
||||
session.connection.send(PositionRotationC2SP(physics.position, physics.eyeY, physics.rotation, physics.onGround))
|
||||
}
|
||||
|
||||
override fun tick() {
|
||||
|
@ -48,8 +48,8 @@ class SignatureKeyManagement(
|
||||
|
||||
private fun registerRefresh(millis: Int) {
|
||||
runLater(millis) {
|
||||
val connected = session.connection.nullCast<NetworkConnection>()?.state != null
|
||||
if (session.error != null || (session.established && !connected) || (connected && !session.network.encrypted)) {
|
||||
val connection = session.connection.nullCast<NetworkConnection>() ?: return@runLater
|
||||
if (session.error != null || (session.established && !connection.active) || (connection.active && !connection.client!!.encrypted)) {
|
||||
// session is dead
|
||||
return@runLater
|
||||
}
|
||||
@ -89,16 +89,13 @@ class SignatureKeyManagement(
|
||||
|
||||
fun sendSession() {
|
||||
val key = key?.playerKey ?: return
|
||||
if (session.version.versionId < ProtocolVersions.V_22W43A) {
|
||||
if (session.version.versionId < ProtocolVersions.V_22W43A) return
|
||||
if (session.connection !is NetworkConnection) return
|
||||
if (session.connection.state != ProtocolStates.PLAY) return
|
||||
if (!session.connection.client!!.encrypted) {
|
||||
return
|
||||
}
|
||||
if (session.connection !is NetworkConnection || session.connection.state != ProtocolStates.PLAY) {
|
||||
return
|
||||
}
|
||||
if (!session.network.encrypted) {
|
||||
return
|
||||
}
|
||||
session.network.send(SessionDataC2SP(session.sessionId, key))
|
||||
session.connection.send(SessionDataC2SP(session.sessionId, key))
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
@ -26,7 +26,7 @@ object WinGameHandler : GameEventHandler {
|
||||
val credits = data.toInt() == 0x01
|
||||
session.events.fire(WinGameEvent(session, credits))
|
||||
if (!credits) {
|
||||
session.network.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
session.connection.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -126,6 +126,6 @@ class RenderLoop(
|
||||
context.window.destroy()
|
||||
Log.log(LogMessageType.RENDERING) { "Render window destroyed!" }
|
||||
// disconnect
|
||||
context.session.network.disconnect()
|
||||
context.session.terminate()
|
||||
}
|
||||
}
|
||||
|
@ -110,7 +110,7 @@ class ErosCrashReport : JavaFXWindowController() {
|
||||
})
|
||||
catchAll(executor = {
|
||||
for (session in PlaySession.ACTIVE_CONNECTIONS.toSynchronizedSet()) {
|
||||
session.network.disconnect()
|
||||
session.terminate()
|
||||
}
|
||||
})
|
||||
|
||||
|
@ -66,7 +66,7 @@ class ConnectingDialog(
|
||||
|
||||
@FXML
|
||||
fun cancel() {
|
||||
session.network.disconnect()
|
||||
session.terminate()
|
||||
close()
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
package de.bixilon.minosoft.gui.eros.main.play.server
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedSet
|
||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool.async
|
||||
import de.bixilon.kutil.latch.CallbackLatch
|
||||
@ -174,7 +175,7 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
|
||||
}
|
||||
|
||||
session.events.register(JavaFXEventListener.of<KickEvent> { event ->
|
||||
(if (session.network.state == ProtocolStates.LOGIN) KickDialog(
|
||||
val dialog = if (session.connection.unsafeCast<NetworkConnection>().state == ProtocolStates.LOGIN) KickDialog(
|
||||
title = "minosoft:session.login_kick.title".toResourceLocation(),
|
||||
header = "minosoft:session.login_kick.header".toResourceLocation(),
|
||||
description = TranslatableComponents.CONNECTION_LOGIN_KICK_DESCRIPTION(server, account),
|
||||
@ -184,7 +185,8 @@ class ServerListController : EmbeddedJavaFXController<Pane>(), Refreshable {
|
||||
header = "minosoft:session.kick.header".toResourceLocation(),
|
||||
description = TranslatableComponents.CONNECTION_KICK_DESCRIPTION(server, account),
|
||||
reason = event.reason,
|
||||
)).show()
|
||||
)
|
||||
dialog.show()
|
||||
})
|
||||
val latch = CallbackLatch(1)
|
||||
val assetsDialog = VerifyAssetsDialog(latch = latch).apply { show() }
|
||||
|
@ -57,7 +57,7 @@ class Rendering(private val session: PlaySession) {
|
||||
audioPlayer.exit()
|
||||
} catch (ignored: Throwable) {
|
||||
}
|
||||
session.network.disconnect()
|
||||
session.terminate()
|
||||
session.error = exception
|
||||
latch.minus(audioLatch.count)
|
||||
}
|
||||
@ -85,7 +85,7 @@ class Rendering(private val session: PlaySession) {
|
||||
session.events.fire(WindowCloseEvent(context, window = context.window))
|
||||
} catch (ignored: Throwable) {
|
||||
}
|
||||
session.network.disconnect()
|
||||
session.terminate()
|
||||
session.error = exception
|
||||
}
|
||||
}
|
||||
|
@ -47,7 +47,7 @@ class CreditsScreen(
|
||||
|
||||
override fun onClose() {
|
||||
super.onClose()
|
||||
guiRenderer.session.network.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
guiRenderer.session.connection.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
}
|
||||
|
||||
companion object {
|
||||
|
@ -126,7 +126,7 @@ class SignEditorScreen(
|
||||
override fun onClose() {
|
||||
super.onClose()
|
||||
val text = getText()
|
||||
guiRenderer.session.network.send(SignTextC2SP(blockPosition, this.side, text))
|
||||
guiRenderer.session.connection.send(SignTextC2SP(blockPosition, this.side, text))
|
||||
}
|
||||
|
||||
override fun forceSilentApply() {
|
||||
|
@ -40,11 +40,11 @@ class PauseMenu(guiRenderer: GUIRenderer) : Menu(guiRenderer) {
|
||||
|
||||
this += ButtonElement(guiRenderer, "menu.pause.back_to_game".i18n()) { guiRenderer.gui.popOrPause() }
|
||||
this += ButtonElement(guiRenderer, "menu.pause.options.debug".i18n()) { guiRenderer.gui.push(DebugMenu) }
|
||||
this += NeutralizedButtonElement(guiRenderer, "menu.pause.disconnect".i18n(), "menu.pause.disconnect.confirm".i18n()) { guiRenderer.session.network.disconnect() }
|
||||
this += NeutralizedButtonElement(guiRenderer, "menu.pause.disconnect".i18n(), "menu.pause.disconnect.confirm".i18n()) { guiRenderer.session.terminate() }
|
||||
if (ErosProfileManager.selected.general.hideErosOnceConnected) {
|
||||
add(ButtonElement(guiRenderer, "menu.pause.show_eros".i18n()) { JavaFXUtil.runLater { Eros.setVisibility(true) } })
|
||||
}
|
||||
this += NeutralizedButtonElement(guiRenderer, "menu.pause.exit".i18n(), "menu.pause.exit.confirm".i18n()) { guiRenderer.session.network.disconnect(); ShutdownManager.shutdown() }
|
||||
this += NeutralizedButtonElement(guiRenderer, "menu.pause.exit".i18n(), "menu.pause.exit.confirm".i18n()) { guiRenderer.session.terminate(); ShutdownManager.shutdown() }
|
||||
}
|
||||
|
||||
companion object : GUIBuilder<LayoutedGUIElement<PauseMenu>> {
|
||||
|
@ -14,6 +14,7 @@
|
||||
package de.bixilon.minosoft.gui.rendering.gui.hud.elements.tab
|
||||
|
||||
import de.bixilon.kotlinglm.vec2.Vec2
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.concurrent.pool.DefaultThreadPool
|
||||
import de.bixilon.minosoft.data.abilities.Gamemodes
|
||||
import de.bixilon.minosoft.data.entities.entities.player.additional.PlayerAdditional
|
||||
@ -32,6 +33,7 @@ import de.bixilon.minosoft.gui.rendering.gui.elements.text.TextElement
|
||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexConsumer
|
||||
import de.bixilon.minosoft.gui.rendering.gui.mesh.GUIVertexOptions
|
||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2Util.EMPTY
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.util.KUtil.nullCompare
|
||||
import java.util.*
|
||||
|
||||
@ -80,7 +82,7 @@ class TabListEntryElement(
|
||||
|
||||
init {
|
||||
background = ColorElement(guiRenderer, size, RGBColor(120, 120, 120, 130))
|
||||
DefaultThreadPool += { skinElement.texture = context.textures.skins.getSkin(uuid, item.properties, fetch = guiRenderer.session.network.encrypted, async = false)?.texture }
|
||||
DefaultThreadPool += { skinElement.texture = context.textures.skins.getSkin(uuid, item.properties, fetch = guiRenderer.session.connection.nullCast<NetworkConnection>()?.client?.encrypted == true, async = false)?.texture }
|
||||
forceSilentApply()
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
package de.bixilon.minosoft.gui.rendering.input.key
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
||||
import de.bixilon.minosoft.config.StaticConfiguration
|
||||
import de.bixilon.minosoft.config.key.KeyActions
|
||||
@ -23,6 +24,7 @@ import de.bixilon.minosoft.gui.rendering.RenderContext
|
||||
import de.bixilon.minosoft.gui.rendering.input.key.manager.binding.BindingsManager
|
||||
import de.bixilon.minosoft.gui.rendering.system.base.PolygonModes
|
||||
import de.bixilon.minosoft.gui.rendering.system.window.CursorModes
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.util.KUtil.format
|
||||
|
||||
@ -46,8 +48,9 @@ object DebugKeyBindings {
|
||||
KeyActions.STICKY to setOf(KeyCodes.KEY_I),
|
||||
ignoreConsumer = true,
|
||||
)) {
|
||||
val connection = session.connection.nullCast<NetworkConnection>() ?: return@register
|
||||
session.util.sendDebugMessage("Pausing incoming packets: ${it.format()}")
|
||||
session.network.receiver.paused = it
|
||||
connection.client!!.receiver.paused = it
|
||||
}
|
||||
|
||||
register(PAUSE_OUTGOING, KeyBinding(
|
||||
@ -55,8 +58,9 @@ object DebugKeyBindings {
|
||||
KeyActions.STICKY to setOf(KeyCodes.KEY_O),
|
||||
ignoreConsumer = true,
|
||||
)) {
|
||||
val connection = session.connection.nullCast<NetworkConnection>() ?: return@register
|
||||
session.util.sendDebugMessage("Pausing outgoing packets: ${it.format()}")
|
||||
session.network.sender.paused = it
|
||||
connection.client!!.sender.paused = it
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -64,7 +64,7 @@ class AttackHandler(
|
||||
return
|
||||
}
|
||||
|
||||
interactions.session.network.send(EntityAttackC2SP(target.entity.id ?: return, player.isSneaking))
|
||||
interactions.session.connection.send(EntityAttackC2SP(target.entity.id ?: return, player.isSneaking))
|
||||
if (player.gamemode == Gamemodes.SPECTATOR) {
|
||||
return
|
||||
}
|
||||
|
@ -30,7 +30,7 @@ class DropHandler(
|
||||
session.player.items.inventory.getHotbarSlot()?.item?.decreaseCount()
|
||||
PlayerActionC2SP.Actions.DROP_ITEM
|
||||
}
|
||||
rateLimiter += { session.network.send(PlayerActionC2SP(type)) }
|
||||
rateLimiter += { session.connection.send(PlayerActionC2SP(type)) }
|
||||
}
|
||||
|
||||
fun draw() {
|
||||
|
@ -35,7 +35,7 @@ class HotbarHandler(
|
||||
return
|
||||
}
|
||||
session.player.items.hotbar = slot
|
||||
slotLimiter += { session.network.send(HotbarSlotC2SP(slot)) }
|
||||
slotLimiter += { session.connection.send(HotbarSlotC2SP(slot)) }
|
||||
}
|
||||
|
||||
private fun canSwap(): Boolean {
|
||||
@ -53,7 +53,7 @@ class HotbarHandler(
|
||||
val main = inventory[EquipmentSlots.MAIN_HAND]
|
||||
val off = inventory[EquipmentSlots.OFF_HAND]
|
||||
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.SWAP_ITEMS_IN_HAND))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.SWAP_ITEMS_IN_HAND))
|
||||
|
||||
if (main == null && off == null) {
|
||||
// both are air, we can't swap
|
||||
|
@ -73,7 +73,7 @@ class InteractionManager(val camera: SessionCamera) : Tickable {
|
||||
|
||||
fun swingHand(hand: Hands) {
|
||||
swingArmRateLimiter += {
|
||||
session.network.send(SwingArmC2SP(hand))
|
||||
session.connection.send(SwingArmC2SP(hand))
|
||||
session.player.swingHand(hand)
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ class ItemPickHandler(
|
||||
interactions.hotbar.selectSlot(slot)
|
||||
val selectedSlot = session.player.items.hotbar + PlayerInventory.HOTBAR_OFFSET
|
||||
|
||||
rateLimiter += { session.network.send(ItemStackCreateC2SP(selectedSlot, stack)) }
|
||||
rateLimiter += { session.connection.send(ItemStackCreateC2SP(selectedSlot, stack)) }
|
||||
session.player.items.inventory[selectedSlot] = stack
|
||||
|
||||
// ToDo: Use ItemPickC2SP
|
||||
|
@ -29,7 +29,7 @@ class CreativeBreaker(
|
||||
val sequence = breaking.executor.start(target.blockPosition, target.state)
|
||||
breaking.executor.finish()
|
||||
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.START_DIGGING, target.blockPosition, target.direction, sequence))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.START_DIGGING, target.blockPosition, target.direction, sequence))
|
||||
breaking.interactions.swingHand(Hands.MAIN)
|
||||
return true
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ class SurvivalDigger(
|
||||
|
||||
private fun cancel(status: BlockDigStatus) {
|
||||
breaking.executor.cancel()
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.CANCELLED_DIGGING, status.position, sequence = 0))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.CANCELLED_DIGGING, status.position, sequence = 0))
|
||||
this.status = null
|
||||
}
|
||||
|
||||
@ -50,7 +50,7 @@ class SurvivalDigger(
|
||||
val sequence = breaking.executor.finish()
|
||||
this.status = null
|
||||
if (!instant) {
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.FINISHED_DIGGING, status.position, status.direction, sequence))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.FINISHED_DIGGING, status.position, status.direction, sequence))
|
||||
breaking.addCooldown()
|
||||
}
|
||||
breaking.interactions.swingHand(Hands.MAIN)
|
||||
@ -118,7 +118,7 @@ class SurvivalDigger(
|
||||
} else {
|
||||
nextStatus = BlockDigStatus(target.blockPosition, target.state, slot, productivity, target.direction)
|
||||
val sequence = breaking.executor.start(target.blockPosition, target.state)
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.START_DIGGING, target.blockPosition, target.direction, sequence))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.START_DIGGING, target.blockPosition, target.direction, sequence))
|
||||
}
|
||||
|
||||
if (instant || nextStatus.progress >= 1.0f) {
|
||||
|
@ -51,7 +51,7 @@ class LongUseHandler(
|
||||
stack.item.item.finishUse(session.player, using.hand, stack, using.tick)
|
||||
}
|
||||
if (!force) {
|
||||
session.network.send(PlayerActionC2SP(PlayerActionC2SP.Actions.RELEASE_ITEM))
|
||||
session.connection.send(PlayerActionC2SP(PlayerActionC2SP.Actions.RELEASE_ITEM))
|
||||
}
|
||||
clearUsing()
|
||||
}
|
||||
|
@ -81,7 +81,7 @@ class ShortUseHandler(
|
||||
if (result == InteractionResults.INVALID) {
|
||||
return true
|
||||
}
|
||||
session.network.send(BlockInteractC2SP(
|
||||
session.connection.send(BlockInteractC2SP(
|
||||
position = target.blockPosition,
|
||||
direction = target.direction,
|
||||
cursorPosition = Vec3(target.cursor),
|
||||
@ -105,7 +105,7 @@ class ShortUseHandler(
|
||||
val entityId = session.world.entities.getId(target.entity) ?: return InteractionResults.IGNORED
|
||||
// used in armor stands
|
||||
val player = session.player
|
||||
session.network.send(EntityInteractPositionC2SP(entityId, Vec3(target.position), hand, player.isSneaking))
|
||||
session.connection.send(EntityInteractPositionC2SP(entityId, Vec3(target.position), hand, player.isSneaking))
|
||||
|
||||
if (player.gamemode == Gamemodes.SPECTATOR) {
|
||||
return InteractionResults.IGNORED
|
||||
@ -125,7 +125,7 @@ class ShortUseHandler(
|
||||
// ToDo: return hit.entity.interact(hand) (e.g. equipping saddle)
|
||||
return InteractionResults.IGNORED
|
||||
} finally {
|
||||
session.world.entities.getId(target.entity)?.let { session.network.send(EntityEmptyInteractC2SP(it, hand, player.isSneaking)) }
|
||||
session.world.entities.getId(target.entity)?.let { session.connection.send(EntityEmptyInteractC2SP(it, hand, player.isSneaking)) }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -137,9 +137,9 @@ class UseHandler(
|
||||
|
||||
fun sendItemUse(hand: Hands, stack: ItemStack) {
|
||||
if (session.version < V_15W31A) {
|
||||
session.network.send(BlockInteractC2SP(null, null, null, stack, hand, false, 1))
|
||||
session.connection.send(BlockInteractC2SP(null, null, null, stack, hand, false, 1))
|
||||
}
|
||||
session.network.send(UseItemC2SP(hand, interactions.session.sequence.getAndIncrement()))
|
||||
session.connection.send(UseItemC2SP(hand, interactions.session.sequence.getAndIncrement()))
|
||||
}
|
||||
|
||||
private companion object {
|
||||
|
@ -35,7 +35,7 @@ object ElytraPhysics {
|
||||
private fun LocalPlayerPhysics.startElytraFalling() {
|
||||
entity.isFlyingWithElytra = true
|
||||
val id = entity.session.world.entities.getId(entity) ?: return
|
||||
entity.session.network.send(EntityActionC2SP(id, EntityActionC2SP.EntityActions.START_ELYTRA_FLYING))
|
||||
entity.session.connection.send(EntityActionC2SP(id, EntityActionC2SP.EntityActions.START_ELYTRA_FLYING))
|
||||
}
|
||||
|
||||
private fun LocalPlayerPhysics.canStartElytraFlight(): Boolean {
|
||||
|
@ -54,6 +54,10 @@ class NetworkConnection(
|
||||
client?.disconnect()
|
||||
}
|
||||
|
||||
override fun detach() {
|
||||
client?.detach()
|
||||
}
|
||||
|
||||
override fun send(packet: C2SPacket) {
|
||||
client?.send(packet)
|
||||
}
|
||||
|
@ -23,6 +23,7 @@ interface ServerConnection {
|
||||
|
||||
fun connect(session: Session)
|
||||
fun disconnect()
|
||||
fun detach()
|
||||
|
||||
fun send(packet: C2SPacket)
|
||||
}
|
||||
|
@ -15,7 +15,6 @@ package de.bixilon.minosoft.protocol.network.network.client.netty
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.exception.ExceptionUtil.catchAll
|
||||
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
||||
import de.bixilon.minosoft.config.profile.profiles.other.OtherProfileManager
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.network.client.ClientNetwork
|
||||
@ -54,8 +53,6 @@ class NettyClient(
|
||||
override val connection: NetworkConnection,
|
||||
val session: Session,
|
||||
) : SimpleChannelInboundHandler<Any>(), ClientNetwork {
|
||||
@Deprecated("unused")
|
||||
var state = ProtocolStates.HANDSHAKE // TODO
|
||||
override val sender = PacketSender(this)
|
||||
override val receiver = PacketReceiver(this, session)
|
||||
override var compressionThreshold = -1
|
||||
@ -65,10 +62,6 @@ class NettyClient(
|
||||
override var detached = false
|
||||
private set
|
||||
|
||||
init {
|
||||
connection::state.observe(this) { this.state = it ?: ProtocolStates.HANDSHAKE }
|
||||
}
|
||||
|
||||
override fun connect() {
|
||||
val natives = if (connection.native) TransportNatives.get() else NioNatives
|
||||
val bootstrap = Bootstrap()
|
||||
|
@ -55,7 +55,6 @@ import de.bixilon.minosoft.modding.event.master.GlobalEventMaster
|
||||
import de.bixilon.minosoft.modding.loader.phase.DefaultModPhases
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.connection.ServerConnection
|
||||
import de.bixilon.minosoft.protocol.network.network.client.netty.NettyClient
|
||||
import de.bixilon.minosoft.protocol.network.session.Session
|
||||
import de.bixilon.minosoft.protocol.network.session.play.channel.DefaultChannelHandlers
|
||||
import de.bixilon.minosoft.protocol.network.session.play.channel.SessionChannelHandler
|
||||
@ -83,8 +82,6 @@ class PlaySession(
|
||||
override val version: Version,
|
||||
val profiles: SelectedProfiles = SelectedProfiles(),
|
||||
) : Session() {
|
||||
@Deprecated("connection")
|
||||
val network = NettyClient(connection.unsafeCast(), this)
|
||||
val sessionId = KUtil.secureRandomUUID()
|
||||
val settingsManager = ClientSettingsManager(this)
|
||||
val registries = Registries().apply { updateFlattened(version.flattened) }
|
||||
@ -132,16 +129,18 @@ class PlaySession(
|
||||
RegistriesFixer.register(this)
|
||||
DefaultChannelHandlers.register(this)
|
||||
|
||||
connection.unsafeCast<NetworkConnection>()::state.observe(this) {
|
||||
if (it != null) {
|
||||
connection::active.observe(this) {
|
||||
if (it) {
|
||||
ACTIVE_CONNECTIONS += this
|
||||
ERRORED_CONNECTIONS -= this
|
||||
|
||||
state = PlaySessionStates.HANDSHAKING
|
||||
val address = connection.unsafeCast<NetworkConnection>().address
|
||||
network.send(HandshakeC2SP(address.hostname, address.port, HandshakeC2SP.Actions.PLAY, version.protocolId))
|
||||
// after sending it, switch to next state
|
||||
network.connection.state = ProtocolStates.LOGIN
|
||||
if (connection is NetworkConnection) {
|
||||
state = PlaySessionStates.HANDSHAKING
|
||||
val address = connection.unsafeCast<NetworkConnection>().address
|
||||
connection.send(HandshakeC2SP(address.hostname, address.port, HandshakeC2SP.Actions.PLAY, version.protocolId))
|
||||
// after sending it, switch to next state
|
||||
connection.state = ProtocolStates.LOGIN
|
||||
}
|
||||
} else {
|
||||
established = true
|
||||
assetsManager.unload()
|
||||
@ -152,38 +151,40 @@ class PlaySession(
|
||||
}
|
||||
}
|
||||
}
|
||||
connection.unsafeCast<NetworkConnection>()::state.observe(this) { state ->
|
||||
when (state) {
|
||||
ProtocolStates.HANDSHAKE, ProtocolStates.STATUS -> Broken("Invalid state!")
|
||||
ProtocolStates.LOGIN -> {
|
||||
this.state = PlaySessionStates.LOGGING_IN
|
||||
world.biomes.init()
|
||||
this.network.send(StartC2SP(this.player, this.sessionId))
|
||||
}
|
||||
|
||||
ProtocolStates.PLAY -> {
|
||||
this.state = PlaySessionStates.JOINING
|
||||
|
||||
if (CLI.session == null) {
|
||||
CLI.session = this
|
||||
if (connection is NetworkConnection) {
|
||||
connection::state.observe(this) { state ->
|
||||
when (state) {
|
||||
ProtocolStates.STATUS -> Broken("Invalid state!")
|
||||
ProtocolStates.LOGIN -> {
|
||||
this.state = PlaySessionStates.LOGGING_IN
|
||||
world.biomes.init()
|
||||
connection.send(StartC2SP(this.player, this.sessionId))
|
||||
}
|
||||
|
||||
events.listen<ChatMessageEvent> {
|
||||
val additionalPrefix = when (it.message.type.position) {
|
||||
ChatTextPositions.SYSTEM -> "[SYSTEM] "
|
||||
ChatTextPositions.HOTBAR -> "[HOTBAR] "
|
||||
else -> ""
|
||||
ProtocolStates.PLAY -> {
|
||||
this.state = PlaySessionStates.JOINING
|
||||
|
||||
if (CLI.session == null) {
|
||||
CLI.session = this
|
||||
}
|
||||
Log.log(LogMessageType.CHAT_IN, level = if (it.message.type.position == ChatTextPositions.HOTBAR) LogLevels.VERBOSE else LogLevels.INFO, prefix = ChatComponent.of(additionalPrefix)) { it.message.text }
|
||||
}
|
||||
}
|
||||
|
||||
else -> Unit
|
||||
else -> Unit
|
||||
}
|
||||
}
|
||||
}
|
||||
ticker.init()
|
||||
|
||||
GlobalEventMaster.fire(PlaySessionCreateEvent(this))
|
||||
|
||||
events.listen<ChatMessageEvent> {
|
||||
val additionalPrefix = when (it.message.type.position) {
|
||||
ChatTextPositions.SYSTEM -> "[SYSTEM] "
|
||||
ChatTextPositions.HOTBAR -> "[HOTBAR] "
|
||||
else -> ""
|
||||
}
|
||||
Log.log(LogMessageType.CHAT_IN, level = if (it.message.type.position == ChatTextPositions.HOTBAR) LogLevels.VERBOSE else LogLevels.INFO, prefix = ChatComponent.of(additionalPrefix)) { it.message.text }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -248,7 +249,7 @@ class PlaySession(
|
||||
|
||||
private fun establish(latch: AbstractLatch?) {
|
||||
latch?.dec() // remove initial value
|
||||
network.connect()
|
||||
connection.connect(this)
|
||||
state = PlaySessionStates.ESTABLISHING
|
||||
}
|
||||
|
||||
@ -265,7 +266,7 @@ class PlaySession(
|
||||
}
|
||||
|
||||
override fun terminate() {
|
||||
network.disconnect()
|
||||
connection.disconnect()
|
||||
state = PlaySessionStates.DISCONNECTED
|
||||
}
|
||||
|
||||
|
@ -13,8 +13,10 @@
|
||||
|
||||
package de.bixilon.minosoft.protocol.network.session.play.channel.login
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedList
|
||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.network.session.play.channel.ChannelManager
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.login.ChannelC2SP
|
||||
@ -54,9 +56,9 @@ class LoginChannelManager(
|
||||
}
|
||||
|
||||
fun send(messageId: Int, data: ByteArray?) {
|
||||
if (session.network.state != ProtocolStates.LOGIN) {
|
||||
if (session.connection.nullCast<NetworkConnection>()?.state != ProtocolStates.LOGIN) {
|
||||
throw IllegalStateException("Not in login!")
|
||||
}
|
||||
session.network.send(ChannelC2SP(messageId, data))
|
||||
session.connection.send(ChannelC2SP(messageId, data))
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,10 @@
|
||||
|
||||
package de.bixilon.minosoft.protocol.network.session.play.channel.play
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.collections.CollectionUtil.toSynchronizedList
|
||||
import de.bixilon.minosoft.data.registries.identified.ResourceLocation
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.network.session.play.channel.ChannelManager
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.common.ChannelC2SP
|
||||
@ -45,9 +47,10 @@ class PlayChannelManager(
|
||||
}
|
||||
|
||||
fun send(channel: ResourceLocation, data: ByteArray) {
|
||||
if (session.network.state != ProtocolStates.LOGIN) {
|
||||
throw IllegalStateException("Not in login!")
|
||||
// TODO: Play == ready? what if offline? should not crash
|
||||
if (session.connection.nullCast<NetworkConnection>()?.state != ProtocolStates.PLAY) {
|
||||
throw IllegalStateException("Not in play!")
|
||||
}
|
||||
session.network.send(ChannelC2SP(channel, data))
|
||||
session.connection.send(ChannelC2SP(channel, data))
|
||||
}
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ object BrandHandler {
|
||||
private fun PlaySession.sendBrand(channel: ResourceLocation, brand: String) {
|
||||
val buffer = PlayOutByteBuffer(this)
|
||||
buffer.writeBareByteArray(brand.encodeNetwork())
|
||||
network.send(ChannelC2SP(channel, buffer))
|
||||
connection.send(ChannelC2SP(channel, buffer))
|
||||
}
|
||||
|
||||
fun PlaySession.sendBrand() {
|
||||
|
@ -13,9 +13,11 @@
|
||||
|
||||
package de.bixilon.minosoft.protocol.network.session.play.settings
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.kutil.observer.DataObserver.Companion.observe
|
||||
import de.bixilon.kutil.observer.set.SetObserver.Companion.observeSet
|
||||
import de.bixilon.minosoft.data.language.LanguageUtil
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.common.SettingsC2SP
|
||||
import de.bixilon.minosoft.protocol.protocol.ProtocolStates
|
||||
@ -66,15 +68,16 @@ class ClientSettingsManager(
|
||||
}
|
||||
|
||||
private fun canSendSettings(): Boolean {
|
||||
if (session.network.state == ProtocolStates.PLAY) return true
|
||||
if (session.version > V_1_20_2_PRE1 && session.network.state == ProtocolStates.CONFIGURATION) return true
|
||||
// TODO: what if not a NetworkConnection
|
||||
if (session.connection.nullCast<NetworkConnection>()?.state == ProtocolStates.PLAY) return true
|
||||
if (session.version > V_1_20_2_PRE1 && session.connection.nullCast<NetworkConnection>()?.state == ProtocolStates.CONFIGURATION) return true
|
||||
return false
|
||||
}
|
||||
|
||||
fun sendClientSettings() {
|
||||
if (!canSendSettings()) return
|
||||
|
||||
session.network.send(SettingsC2SP(
|
||||
session.connection.send(SettingsC2SP(
|
||||
locale = language,
|
||||
chatColors = session.profiles.gui.chat.chatColors,
|
||||
viewDistance = session.profiles.block.viewDistance,
|
||||
|
@ -53,7 +53,7 @@ class ChunkReceiver(
|
||||
val end = nanos()
|
||||
val delta = end - start
|
||||
|
||||
session.network.send(NextChunkBatchC2SP(100.0f)) // TODO: calculate size
|
||||
session.connection.send(NextChunkBatchC2SP(100.0f)) // TODO: calculate size
|
||||
reset()
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@
|
||||
|
||||
package de.bixilon.minosoft.protocol.network.session.play.util
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.nullCast
|
||||
import de.bixilon.minosoft.commands.nodes.ChatNode
|
||||
import de.bixilon.minosoft.commands.nodes.SessionNode.Companion.COMMAND_PREFIX
|
||||
import de.bixilon.minosoft.commands.stack.CommandStack
|
||||
@ -30,6 +31,7 @@ import de.bixilon.minosoft.modding.event.events.chat.ChatMessageEvent
|
||||
import de.bixilon.minosoft.modding.event.events.chat.ChatMessageSendEvent
|
||||
import de.bixilon.minosoft.modding.event.events.container.ContainerCloseEvent
|
||||
import de.bixilon.minosoft.protocol.ProtocolUtil.encodeNetwork
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.play.chat.ChatMessageC2SP
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.play.chat.CommandC2SP
|
||||
@ -70,7 +72,7 @@ class SessionUtil(
|
||||
}
|
||||
Log.log(LogMessageType.CHAT_OUT) { trimmed }
|
||||
if (!session.version.requiresSignedChat) {
|
||||
return session.network.send(ChatMessageC2SP(trimmed))
|
||||
return session.connection.send(ChatMessageC2SP(trimmed))
|
||||
}
|
||||
|
||||
val keyManagement = session.player.keyManagement
|
||||
@ -78,7 +80,7 @@ class SessionUtil(
|
||||
try {
|
||||
val key = keyManagement.key
|
||||
if (key == null) {
|
||||
session.network.send(SignedChatMessageC2SP(message.encodeNetwork(), time = Instant.now(), salt = 0, signature = null, false, Acknowledgement.EMPTY))
|
||||
session.connection.send(SignedChatMessageC2SP(message.encodeNetwork(), time = Instant.now(), salt = 0, signature = null, false, Acknowledgement.EMPTY))
|
||||
return
|
||||
}
|
||||
sendSignedMessage(key, trimmed)
|
||||
@ -95,13 +97,13 @@ class SessionUtil(
|
||||
|
||||
val acknowledgement = Acknowledgement.EMPTY
|
||||
|
||||
val signature: ByteArray? = if (session.network.encrypted) {
|
||||
val signature: ByteArray? = if (session.connection.nullCast<NetworkConnection>()?.client?.encrypted == true) {
|
||||
signer.signMessage(privateKey.private, message, null, salt, uuid, time, acknowledgement.lastSeen)
|
||||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
session.network.send(SignedChatMessageC2SP(message.encodeNetwork(), time = time, salt = salt, signature = signature, false, acknowledgement))
|
||||
session.connection.send(SignedChatMessageC2SP(message.encodeNetwork(), time = time, salt = salt, signature = signature, false, acknowledgement))
|
||||
}
|
||||
|
||||
fun sendCommand(command: String, stack: CommandStack) {
|
||||
@ -112,7 +114,7 @@ class SessionUtil(
|
||||
ChatUtil.validateChatMessage(session, trimmed)
|
||||
val time = Instant.now()
|
||||
if (stack.size == 0) {
|
||||
session.network.send(CommandC2SP(trimmed, time, 0L, emptyMap(), false, Acknowledgement.EMPTY)) // TODO: remove
|
||||
session.connection.send(CommandC2SP(trimmed, time, 0L, emptyMap(), false, Acknowledgement.EMPTY)) // TODO: remove
|
||||
Log.log(LogMessageType.OTHER, LogLevels.WARN) { "Command $trimmed failed to parse!" }
|
||||
throw IllegalArgumentException("Empty command stack! Did the command fail to parse?")
|
||||
}
|
||||
@ -126,11 +128,11 @@ class SessionUtil(
|
||||
try {
|
||||
val privateKey = keyManagement.key
|
||||
privateKey?.let { SignatureKeyManagement.verify(privateKey, time) }
|
||||
if (privateKey != null && session.network.encrypted && session.profiles.session.signature.signCommands) {
|
||||
if (privateKey != null && (session.connection is NetworkConnection && session.connection.client!!.encrypted) && session.profiles.session.signature.signCommands) {
|
||||
signature = stack.sign(signer, privateKey.private, salt, time)
|
||||
}
|
||||
|
||||
session.network.send(CommandC2SP(trimmed, time, salt, signature, false, acknowledgement))
|
||||
session.connection.send(CommandC2SP(trimmed, time, salt, signature, false, acknowledgement))
|
||||
} finally {
|
||||
keyManagement.release()
|
||||
}
|
||||
@ -155,6 +157,6 @@ class SessionUtil(
|
||||
}
|
||||
|
||||
fun respawn() {
|
||||
session.network.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
session.connection.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
}
|
||||
}
|
||||
|
@ -12,6 +12,8 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.common
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer
|
||||
@ -24,7 +26,7 @@ class CompressionS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
session.network.setupCompression(threshold)
|
||||
session.connection.unsafeCast<NetworkConnection>().client!!.setupCompression(threshold)
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -34,7 +34,7 @@ class HeartbeatS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
}
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
session.network.send(HeartbeatC2SP(id))
|
||||
session.connection.send(HeartbeatC2SP(id))
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -12,8 +12,10 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.common
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.data.text.ChatComponent
|
||||
import de.bixilon.minosoft.modding.event.events.KickEvent
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySessionStates
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
@ -25,7 +27,7 @@ import de.bixilon.minosoft.util.logging.LogLevels
|
||||
import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
|
||||
class KickS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
val reason: ChatComponent = if (buffer.session.network.state == ProtocolStates.LOGIN && buffer.versionId >= V_23W42A) buffer.readChatComponent() else buffer.readNbtChatComponent()
|
||||
val reason: ChatComponent = if (buffer.session.connection.unsafeCast<NetworkConnection>().state == ProtocolStates.LOGIN && buffer.versionId >= V_23W42A) buffer.readChatComponent() else buffer.readNbtChatComponent()
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
if (!session.connection.active) {
|
||||
@ -34,7 +36,7 @@ class KickS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
session.events.fire(KickEvent(session, reason))
|
||||
// got kicked
|
||||
session.terminate()
|
||||
if (session.network.state == ProtocolStates.LOGIN) {
|
||||
if (session.connection.unsafeCast<NetworkConnection>().state == ProtocolStates.LOGIN) {
|
||||
session.state = PlaySessionStates.ERROR
|
||||
} else {
|
||||
session.state = PlaySessionStates.KICKED
|
||||
|
@ -25,7 +25,7 @@ class PingS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
val payload = buffer.readInt()
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
session.network.send(PongC2SP(payload))
|
||||
session.connection.send(PongC2SP(payload))
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -50,7 +50,7 @@ class ResourcepackS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
if (session.events.fire(event)) {
|
||||
return
|
||||
}
|
||||
session.network.send(ResourcepackC2SP(uuid, hash, ResourcepackC2SP.ResourcePackStates.SUCCESSFULLY)) // ToDo: This fakes it, to not get kicked on most servers
|
||||
session.connection.send(ResourcepackC2SP(uuid, hash, ResourcepackC2SP.ResourcePackStates.SUCCESSFULLY)) // ToDo: This fakes it, to not get kicked on most servers
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -12,6 +12,8 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.configuration
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.configuration.ReadyC2SP
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
@ -26,8 +28,8 @@ class ReadyS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
session.util.prepareSpawn()
|
||||
session.network.send(ReadyC2SP())
|
||||
session.network.state = ProtocolStates.PLAY
|
||||
session.connection.send(ReadyC2SP())
|
||||
session.connection.unsafeCast<NetworkConnection>().state = ProtocolStates.PLAY
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -14,6 +14,8 @@ package de.bixilon.minosoft.protocol.packets.s2c.login
|
||||
|
||||
import com.google.common.primitives.Longs
|
||||
import de.bixilon.kutil.base64.Base64Util.toBase64
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.login.EncryptionC2SP
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
@ -56,12 +58,12 @@ class EncryptionS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
signature.update(Longs.toByteArray(salt))
|
||||
val signed = signature.sign()
|
||||
|
||||
session.network.send(EncryptionC2SP(encryptedSecretKey, EncryptionSignatureData(salt, signed)))
|
||||
session.connection.send(EncryptionC2SP(encryptedSecretKey, EncryptionSignatureData(salt, signed)))
|
||||
} else {
|
||||
session.network.send(EncryptionC2SP(encryptedSecretKey, CryptManager.encryptData(publicKey, nonce)))
|
||||
session.connection.send(EncryptionC2SP(encryptedSecretKey, CryptManager.encryptData(publicKey, nonce)))
|
||||
}
|
||||
|
||||
session.network.setupEncryption(encryptCipher, decryptCipher)
|
||||
session.connection.unsafeCast<NetworkConnection>().client!!.setupEncryption(encryptCipher, decryptCipher)
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -12,9 +12,10 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.login
|
||||
|
||||
import de.bixilon.kutil.primitive.BooleanUtil.decide
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.data.entities.entities.player.properties.PlayerProperties
|
||||
import de.bixilon.minosoft.data.text.ChatComponent
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.network.session.play.channel.vanila.BrandHandler.sendBrand
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.login.ConfigureC2SP
|
||||
@ -28,18 +29,18 @@ import de.bixilon.minosoft.util.logging.LogMessageType
|
||||
import java.util.*
|
||||
|
||||
class SuccessS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
val uuid: UUID = (buffer.versionId < ProtocolVersions.V_20W12A).decide({ buffer.readUUIDString() }, { buffer.readUUID() })
|
||||
val uuid: UUID = if (buffer.versionId < ProtocolVersions.V_20W12A) buffer.readUUIDString() else buffer.readUUID()
|
||||
val name: String = buffer.readString()
|
||||
val properties: PlayerProperties? = if (buffer.versionId >= ProtocolVersions.V_22W17A) buffer.readPlayerProperties() else null
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
if (session.version.hasConfigurationState) {
|
||||
session.network.send(ConfigureC2SP())
|
||||
session.network.state = ProtocolStates.CONFIGURATION
|
||||
session.connection.send(ConfigureC2SP())
|
||||
session.connection.unsafeCast<NetworkConnection>().state = ProtocolStates.CONFIGURATION
|
||||
session.sendBrand()
|
||||
session.settingsManager.sendClientSettings()
|
||||
} else {
|
||||
session.network.state = ProtocolStates.PLAY
|
||||
session.connection.unsafeCast<NetworkConnection>().state = ProtocolStates.PLAY
|
||||
}
|
||||
|
||||
val playerEntity = session.player
|
||||
|
@ -12,6 +12,8 @@
|
||||
*/
|
||||
package de.bixilon.minosoft.protocol.packets.s2c.play
|
||||
|
||||
import de.bixilon.kutil.cast.CastUtil.unsafeCast
|
||||
import de.bixilon.minosoft.protocol.connection.NetworkConnection
|
||||
import de.bixilon.minosoft.protocol.network.session.play.PlaySession
|
||||
import de.bixilon.minosoft.protocol.packets.c2s.play.ReconfigureC2SP
|
||||
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
|
||||
@ -26,8 +28,8 @@ class ReconfigureS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
|
||||
override fun handle(session: PlaySession) {
|
||||
session.util.resetWorld()
|
||||
session.network.send(ReconfigureC2SP())
|
||||
session.network.state = ProtocolStates.CONFIGURATION
|
||||
session.connection.send(ReconfigureC2SP())
|
||||
session.connection.unsafeCast<NetworkConnection>().state = ProtocolStates.CONFIGURATION
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -35,7 +35,7 @@ class MoveVehicleS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
}
|
||||
vehicle.forceTeleport(position)
|
||||
vehicle.forceRotate(EntityRotation(yaw, pitch))
|
||||
session.network.send(MoveVehicleC2SP(vehicle.physics.position, vehicle.physics.rotation))
|
||||
session.connection.send(MoveVehicleC2SP(vehicle.physics.position, vehicle.physics.rotation))
|
||||
}
|
||||
|
||||
override fun log(reducedLog: Boolean) {
|
||||
|
@ -86,9 +86,9 @@ class PositionRotationS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
entity.forceRotate(EntityRotation(yaw, pitch))
|
||||
|
||||
if (session.version.versionId >= ProtocolVersions.V_15W42A) {
|
||||
session.network.send(ConfirmTeleportC2SP(teleportId))
|
||||
session.connection.send(ConfirmTeleportC2SP(teleportId))
|
||||
}
|
||||
session.network.send(PositionRotationC2SP(position, position.y + entity.physics.eyeHeight, rotation, onGround))
|
||||
session.connection.send(PositionRotationC2SP(position, position.y + entity.physics.eyeHeight, rotation, onGround))
|
||||
|
||||
if (session.state == PlaySessionStates.SPAWNING) {
|
||||
session.state = PlaySessionStates.PLAYING
|
||||
|
@ -47,7 +47,7 @@ class HealthS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket {
|
||||
}
|
||||
|
||||
if (session.profiles.session.autoRespawn) {
|
||||
session.network.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
session.connection.send(ClientActionC2SP(ClientActionC2SP.ClientActions.PERFORM_RESPAWN))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -44,7 +44,7 @@ object SessionManageCommand : Command {
|
||||
LiteralNode("select").apply {
|
||||
addFilter(false) { stack, sessions ->
|
||||
val session = sessions.first()
|
||||
if (session.network.connection.state == null) {
|
||||
if (!session.connection.active) {
|
||||
throw CommandException("Session $session not established anymore!")
|
||||
}
|
||||
CLI.session = session
|
||||
|
@ -25,7 +25,7 @@ object DebugCommand : SessionCommand {
|
||||
override var node = LiteralNode("debug")
|
||||
.addChild(LiteralNode("allowFly", executor = { it.fly() }, allowArguments = true).addChild(ArgumentNode("value", BooleanParser, executable = true)))
|
||||
.addChild(LiteralNode("network").addChild(
|
||||
LiteralNode("detach", executor = { it.session.network.detach(); it.print.sendDebugMessage("Now you are alone on the wire...") }),
|
||||
LiteralNode("detach", executor = { it.session.connection.detach(); it.print.sendDebugMessage("Now you are alone on the wire...") }),
|
||||
))
|
||||
.addChild(LiteralNode("cache").addChild(LiteralNode("biome", executor = { it.session.world.biomes.resetCache(); it.print.sendDebugMessage("Biome cache cleared!") })))
|
||||
|
||||
|
@ -294,7 +294,7 @@ object KUtil {
|
||||
URLProtocolStreamHandlers.register("resource", ResourceURLHandler)
|
||||
ShutdownManager += {
|
||||
for (session in PlaySession.ACTIVE_CONNECTIONS.toSynchronizedSet()) {
|
||||
session.network.disconnect()
|
||||
session.terminate()
|
||||
}
|
||||
}
|
||||
ShutdownManager += {
|
||||
|
Loading…
x
Reference in New Issue
Block a user