event initiators

This commit is contained in:
Bixilon 2021-05-27 16:54:50 +02:00
parent 013beb7057
commit 5b36103e4d
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
22 changed files with 97 additions and 143 deletions

View File

@ -19,11 +19,12 @@ import de.bixilon.minosoft.util.enum.ValuesEnum
enum class EventInitiators {
CLIENT,
SERVER,
UNKNOWN,
;
companion object : ValuesEnum<EventInitiators> {
override val VALUES: Array<EventInitiators> = values()
override val NAME_MAP: Map<String, EventInitiators> = KUtil.getEnumValues(VALUES)
val DEFAULT = UNKNOWN
}
}

View File

@ -23,10 +23,10 @@ import glm_.vec3.Vec3i
*/
class BlockSetEvent(
connection: PlayConnection,
initiator: EventInitiators = EventInitiators.DEFAULT,
val blockPosition: Vec3i,
val blockState: BlockState?,
val initiator: EventInitiators = EventInitiators.CLIENT,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: BlockSetS2CP) : this(connection, packet.blockPosition, packet.blockState, EventInitiators.SERVER)
constructor(connection: PlayConnection, packet: BlockSetS2CP) : this(connection, EventInitiators.SERVER, packet.blockPosition, packet.blockState)
}

View File

@ -12,8 +12,12 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
abstract class CancelableEvent(connection: PlayConnection) : PlayConnectionEvent(connection) {
abstract class CancelableEvent @JvmOverloads constructor(
connection: PlayConnection,
initiator: EventInitiators = EventInitiators.DEFAULT,
) : PlayConnectionEvent(connection, initiator) {
var isCancelled = false
}

View File

@ -12,6 +12,10 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.Connection
abstract class ConnectionEvent(open val connection: Connection) : Event()
abstract class ConnectionEvent @JvmOverloads constructor(
open val connection: Connection,
val initiator: EventInitiators = EventInitiators.DEFAULT,
) : Event()

View File

@ -12,6 +12,7 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.c2s.play.ContainerCloseC2SP
import de.bixilon.minosoft.protocol.packets.s2c.play.ContainerCloseS2CP
@ -21,16 +22,12 @@ import de.bixilon.minosoft.protocol.packets.s2c.play.ContainerCloseS2CP
*/
class ContainerCloseEvent(
connection: PlayConnection,
initiator: EventInitiators,
val containerId: Int,
val initiator: Initiators,
) : CancelableEvent(connection) {
) : CancelableEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: ContainerCloseS2CP) : this(connection, packet.containerId, Initiators.SERVER)
constructor(connection: PlayConnection, packet: ContainerCloseS2CP) : this(connection, EventInitiators.SERVER, packet.containerId)
constructor(connection: PlayConnection, packet: ContainerCloseC2SP) : this(connection, packet.containerId, Initiators.CLIENT)
constructor(connection: PlayConnection, packet: ContainerCloseC2SP) : this(connection, EventInitiators.CLIENT, packet.containerId)
enum class Initiators {
CLIENT,
SERVER,
}
}

View File

@ -13,23 +13,16 @@
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.EntityDestroyS2CP
class EntityDestroyEvent(
connection: PlayConnection,
initiator: EventInitiators,
val entities: List<Entity>,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: EntityDestroyS2CP) : this(connection, packet.entityIds.resolveEntityIds(connection))
constructor(connection: PlayConnection, packet: EntityDestroyS2CP) : this(connection, EventInitiators.SERVER, packet.entityIds.entities(connection))
companion object {
private fun List<Int>.resolveEntityIds(connection: PlayConnection): List<Entity> {
val entities: MutableList<Entity> = mutableListOf()
for (id in this) {
entities += connection.world.entities[id] ?: continue
}
return entities.toList()
}
}
}

View File

@ -15,14 +15,16 @@ package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.data.inventory.InventorySlots.EquipmentSlots
import de.bixilon.minosoft.data.inventory.ItemStack
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.EntityEquipmentS2CP
class EntityEquipmentChangeEvent(
connection: PlayConnection,
initiator: EventInitiators,
val entity: Entity,
val equipment: Map<EquipmentSlots, ItemStack?>,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: EntityEquipmentS2CP) : this(connection, connection.world.entities[packet.entityId]!!, packet.equipment)
constructor(connection: PlayConnection, packet: EntityEquipmentS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.entityId]!!, packet.equipment)
}

View File

@ -13,13 +13,15 @@
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.EntityMetadataS2CP
class EntityMetaDataChangeEvent(
connection: PlayConnection,
initiator: EventInitiators,
val entity: Entity,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: EntityMetadataS2CP) : this(connection, connection.world.entities[packet.entityId]!!)
constructor(connection: PlayConnection, packet: EntityMetadataS2CP) : this(connection, EventInitiators.SERVER, connection.world.entities[packet.entityId]!!)
}

View File

@ -13,4 +13,18 @@
package de.bixilon.minosoft.modding.event.events
abstract class Event
import de.bixilon.minosoft.data.entities.entities.Entity
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
abstract class Event {
companion object {
fun List<Int>.entities(connection: PlayConnection): List<Entity> {
val entities: MutableList<Entity> = mutableListOf()
for (id in this) {
entities += connection.world.entities[id] ?: continue
}
return entities.toList()
}
}
}

View File

@ -12,18 +12,20 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.ExplosionS2CP
import glm_.vec3.Vec3
class ExplosionEvent(
connection: PlayConnection,
initiator: EventInitiators,
val position: Vec3,
val power: Float,
val explodedBlocks: List<Vec3>,
val velocity: Vec3,
) : PlayConnectionEvent(connection) {
constructor(connection: PlayConnection, packet: ExplosionS2CP) : this(connection, packet.position, packet.power, packet.explodedBlocks, packet.velocity)
constructor(connection: PlayConnection, packet: ExplosionS2CP) : this(connection, EventInitiators.SERVER, packet.position, packet.power, packet.explodedBlocks, packet.velocity)
}

View File

@ -24,11 +24,11 @@ import glm_.vec3.Vec3i
*/
class MassBlockSetEvent(
connection: PlayConnection,
initiator: EventInitiators,
val blocks: Map<Vec3i, BlockState?>,
val chunkPosition: Vec2i,
val initiator: EventInitiators = EventInitiators.CLIENT,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: MassBlockSetS2CP) : this(connection, packet.blocks, packet.chunkPosition, EventInitiators.SERVER)
constructor(connection: PlayConnection, packet: MassBlockSetS2CP) : this(connection, EventInitiators.SERVER, packet.blocks, packet.chunkPosition)
}

View File

@ -13,22 +13,24 @@
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.mappings.particle.data.ParticleData
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.ParticleS2CP
import glm_.vec3.Vec3
class ParticleSpawnEvent(
connection: PlayConnection,
initiator: EventInitiators,
position: Vec3,
offset: Vec3,
val speed: Float,
val count: Int,
val data: ParticleData,
) : CancelableEvent(connection) {
) : CancelableEvent(connection, initiator) {
val position: Vec3 = position
get() = Vec3(field)
val offset: Vec3 = offset
get() = Vec3(field)
constructor(connection: PlayConnection, packet: ParticleS2CP) : this(connection, packet.position, packet.offset, packet.speed, packet.count, packet.data)
constructor(connection: PlayConnection, packet: ParticleS2CP) : this(connection, EventInitiators.SERVER, packet.position, packet.offset, packet.speed, packet.count, packet.data)
}

View File

@ -12,6 +12,10 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
abstract class PlayConnectionEvent(override val connection: PlayConnection) : ConnectionEvent(connection)
abstract class PlayConnectionEvent @JvmOverloads constructor(
override val connection: PlayConnection,
initiator: EventInitiators = EventInitiators.DEFAULT,
) : ConnectionEvent(connection, initiator)

View File

@ -15,20 +15,22 @@ package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.SoundCategories
import de.bixilon.minosoft.data.mappings.sounds.SoundEvent
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.SoundEventS2CP
import glm_.vec3.Vec3i
class PlaySoundEvent(
connection: PlayConnection,
initiator: EventInitiators,
val category: SoundCategories?,
position: Vec3i,
val soundEvent: SoundEvent,
val volume: Float,
val pitch: Float,
) : CancelableEvent(connection) {
) : CancelableEvent(connection, initiator) {
val position: Vec3i = position
get() = Vec3i(field)
constructor(connection: PlayConnection, packet: SoundEventS2CP) : this(connection, packet.category, packet.position, packet.soundEvent, packet.volume, packet.pitch)
constructor(connection: PlayConnection, packet: SoundEventS2CP) : this(connection, EventInitiators.SERVER, packet.category, packet.position, packet.soundEvent, packet.volume, packet.pitch)
}

View File

@ -1,43 +0,0 @@
/*
* Minosoft
* Copyright (C) 2020 Moritz Zwerger
*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* This software is not affiliated with Mojang AB, the original developer of Minecraft.
*/
package de.bixilon.minosoft.modding.event.events;
import de.bixilon.minosoft.data.text.ChatComponent;
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.s2c.play.TabListTextSetS2CP;
public class PlayerListInfoChangeEvent extends CancelableEvent {
private final ChatComponent header;
private final ChatComponent footer;
public PlayerListInfoChangeEvent(PlayConnection connection, ChatComponent header, ChatComponent footer) {
super(connection);
this.header = header;
this.footer = footer;
}
public PlayerListInfoChangeEvent(PlayConnection connection, TabListTextSetS2CP pkg) {
super(connection);
this.header = pkg.getHeader();
this.footer = pkg.getFooter();
}
public ChatComponent getHeader() {
return this.header;
}
public ChatComponent getFooter() {
return this.footer;
}
}

View File

@ -12,7 +12,17 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.entities.entities.player.PlayerEntity
import de.bixilon.minosoft.data.text.ChatComponent
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.TabListTextSetS2CP
class OwnEntityMetaDataChangeEvent(connection: PlayConnection, val entity: PlayerEntity) : PlayConnectionEvent(connection)
class PlayerListInfoChangeEvent(
connection: PlayConnection,
initiator: EventInitiators,
val header: ChatComponent,
val footer: ChatComponent,
) : CancelableEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: TabListTextSetS2CP) : this(connection, EventInitiators.SERVER, packet.header, packet.footer)
}

View File

@ -13,17 +13,19 @@
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.data.mappings.ResourceLocation
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.PluginMessageS2CP
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
class PluginMessageReceiveEvent(
connection: PlayConnection,
initiators: EventInitiators,
val channel: ResourceLocation,
data: PlayInByteBuffer,
) : CancelableEvent(connection) {
) : CancelableEvent(connection, initiators) {
val data: PlayInByteBuffer = data
get() = PlayInByteBuffer(field)
constructor(connection: PlayConnection, packet: PluginMessageS2CP) : this(connection, packet.channel, packet.data)
constructor(connection: PlayConnection, packet: PluginMessageS2CP) : this(connection, EventInitiators.SERVER, packet.channel, packet.data)
}

View File

@ -12,16 +12,18 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.c2s.play.HotbarSlotSetC2SP
import de.bixilon.minosoft.protocol.packets.s2c.play.HotbarSlotSetS2CP
class SelectHotbarSlotEvent(
connection: PlayConnection,
initiator: EventInitiators,
val slot: Int,
) : PlayConnectionEvent(connection) {
) : PlayConnectionEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: HotbarSlotSetC2SP) : this(connection, packet.slot)
constructor(connection: PlayConnection, packet: HotbarSlotSetC2SP) : this(connection, EventInitiators.CLIENT, packet.slot)
constructor(connection: PlayConnection, packet: HotbarSlotSetS2CP) : this(connection, packet.slot)
constructor(connection: PlayConnection, packet: HotbarSlotSetS2CP) : this(connection, EventInitiators.SERVER, packet.slot)
}

View File

@ -12,15 +12,17 @@
*/
package de.bixilon.minosoft.modding.event.events
import de.bixilon.minosoft.modding.event.EventInitiators
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.play.WorldTimeSetS2CP
class TimeChangeEvent(
connection: PlayConnection,
initiator: EventInitiators,
val age: Long,
val time: Long,
) : CancelableEvent(connection) {
) : CancelableEvent(connection, initiator) {
constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, packet.age, packet.time)
constructor(connection: PlayConnection, packet: WorldTimeSetS2CP) : this(connection, EventInitiators.SERVER, packet.age, packet.time)
}

View File

@ -14,7 +14,6 @@ package de.bixilon.minosoft.protocol.packets.s2c.play
import de.bixilon.minosoft.data.entities.meta.EntityMetaData
import de.bixilon.minosoft.modding.event.events.EntityMetaDataChangeEvent
import de.bixilon.minosoft.modding.event.events.OwnEntityMetaDataChangeEvent
import de.bixilon.minosoft.protocol.network.connection.PlayConnection
import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket
import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer
@ -30,11 +29,7 @@ class EntityMetadataS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val entity = connection.world.entities[entityId] ?: return
entity.entityMetaData = metaData
connection.fireEvent(EntityMetaDataChangeEvent(connection, entity))
if (entity === connection.player.entity) {
connection.fireEvent(OwnEntityMetaDataChangeEvent(connection, entity))
}
connection.fireEvent(EntityMetaDataChangeEvent(connection, this))
}

View File

@ -21,10 +21,10 @@ import de.bixilon.minosoft.util.logging.LogLevels
import de.bixilon.minosoft.util.logging.LogMessageType
class HotbarSlotSetS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() {
val slot: Int = buffer.readByte().toInt()
val slot: Int = buffer.readUnsignedByte()
override fun handle(connection: PlayConnection) {
connection.fireEvent(SelectHotbarSlotEvent(connection, slot))
connection.fireEvent(SelectHotbarSlotEvent(connection, this))
connection.player.selectedHotbarSlot = slot
}

View File

@ -14,22 +14,16 @@
package de.bixilon.minosoft.protocol.protocol;
import de.bixilon.minosoft.data.ChatTextPositions;
import de.bixilon.minosoft.data.entities.EntityRotation;
import de.bixilon.minosoft.data.mappings.ResourceLocation;
import de.bixilon.minosoft.data.player.Hands;
import de.bixilon.minosoft.data.text.ChatComponent;
import de.bixilon.minosoft.modding.event.events.ChatMessageReceivingEvent;
import de.bixilon.minosoft.modding.event.events.ChatMessageSendingEvent;
import de.bixilon.minosoft.modding.event.events.ContainerCloseEvent;
import de.bixilon.minosoft.protocol.network.connection.PlayConnection;
import de.bixilon.minosoft.protocol.packets.c2s.login.LoginPluginResponseC2SP;
import de.bixilon.minosoft.protocol.packets.c2s.play.*;
import de.bixilon.minosoft.protocol.packets.c2s.play.ChatMessageC2SP;
import de.bixilon.minosoft.protocol.packets.c2s.play.ClientActionC2SP;
import de.bixilon.minosoft.util.logging.Log;
import de.bixilon.minosoft.util.logging.LogMessageType;
import glm_.vec3.Vec3;
import java.util.UUID;
@Deprecated
public class PacketSender {
public static final char[] ILLEGAL_CHAT_CHARS = {'§'};
private final PlayConnection connection;
@ -38,10 +32,6 @@ public class PacketSender {
this.connection = connection;
}
public void setFlyStatus(boolean flying) {
this.connection.sendPacket(new FlyToggleC2SP(flying));
}
public void sendChatMessage(String message) {
if (message.isBlank()) {
// throw new IllegalArgumentException(("Chat message is blank!"));
@ -61,22 +51,6 @@ public class PacketSender {
this.connection.sendPacket(new ChatMessageC2SP(event.getMessage()));
}
public void spectateEntity(UUID entityUUID) {
this.connection.sendPacket(new EntitySpectateC2SP(entityUUID));
}
public void swingArm(Hands hand) {
this.connection.sendPacket(new ArmSwingC2SP(hand));
}
public void closeWindow(byte windowId) {
ContainerCloseEvent event = new ContainerCloseEvent(this.connection, windowId, ContainerCloseEvent.Initiators.CLIENT);
if (this.connection.fireEvent(event)) {
return;
}
this.connection.sendPacket(new ContainerCloseC2SP(windowId));
}
public void respawn() {
sendClientStatus(ClientActionC2SP.ClientActions.PERFORM_RESPAWN);
@ -86,21 +60,6 @@ public class PacketSender {
this.connection.sendPacket(new ClientActionC2SP(status));
}
public void sendPluginMessageData(ResourceLocation channel, OutByteBuffer toSend) {
this.connection.sendPacket(new PluginMessageC2SP(channel, toSend.toByteArray()));
}
public void sendLoginPluginMessageResponse(int messageId, OutByteBuffer toSend) {
this.connection.sendPacket(new LoginPluginResponseC2SP(messageId, toSend.toByteArray()));
}
public void setLocation(Vec3 position, EntityRotation rotation, boolean onGround) {
this.connection.sendPacket(new PositionAndRotationC2SP(position, rotation, onGround));
this.connection.getPlayer().getEntity().setPosition(position);
this.connection.getPlayer().getEntity().setRotation(rotation);
}
public void sendFakeChatMessage(ChatComponent message, ChatTextPositions position) {
this.connection.fireEvent(new ChatMessageReceivingEvent(this.connection, message, position, null));
}