src: add 2 files
This commit is contained in:
@@ -0,0 +1,43 @@
|
|||||||
|
package com.hypixel.hytale.server.core.event.events.ecs;
|
||||||
|
|
||||||
|
import com.hypixel.hytale.component.system.CancellableEcsEvent;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fired when a player changes their active hotbar slot.
|
||||||
|
*/
|
||||||
|
public class ChangeHotbarSlotEvent extends CancellableEcsEvent {
|
||||||
|
private final byte previousSlot;
|
||||||
|
private byte newSlot;
|
||||||
|
private final boolean serverRequest;
|
||||||
|
|
||||||
|
public ChangeHotbarSlotEvent(byte previousSlot, byte newSlot, boolean serverRequest) {
|
||||||
|
this.previousSlot = previousSlot;
|
||||||
|
this.newSlot = newSlot;
|
||||||
|
this.serverRequest = serverRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getPreviousSlot() {
|
||||||
|
return previousSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte getNewSlot() {
|
||||||
|
return newSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNewSlot(byte newSlot) {
|
||||||
|
this.newSlot = newSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isServerRequest() {
|
||||||
|
return serverRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isClientRequest() {
|
||||||
|
return !serverRequest;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "ChangeHotbarSlotEvent{previousSlot=" + previousSlot + ", newSlot=" + newSlot + ", serverRequest=" + serverRequest + "}";
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,166 @@
|
|||||||
|
package com.hypixel.hytale.server.core.modules.interaction.interaction.config.none;
|
||||||
|
|
||||||
|
import com.hypixel.hytale.codec.Codec;
|
||||||
|
import com.hypixel.hytale.codec.KeyedCodec;
|
||||||
|
import com.hypixel.hytale.codec.builder.BuilderCodec;
|
||||||
|
import com.hypixel.hytale.codec.validation.Validators;
|
||||||
|
import com.hypixel.hytale.component.CommandBuffer;
|
||||||
|
import com.hypixel.hytale.component.Ref;
|
||||||
|
import com.hypixel.hytale.protocol.InteractionCooldown;
|
||||||
|
import com.hypixel.hytale.protocol.InteractionState;
|
||||||
|
import com.hypixel.hytale.protocol.InteractionType;
|
||||||
|
import com.hypixel.hytale.protocol.WaitForDataFrom;
|
||||||
|
import com.hypixel.hytale.server.core.entity.EntityUtils;
|
||||||
|
import com.hypixel.hytale.server.core.entity.InteractionContext;
|
||||||
|
import com.hypixel.hytale.server.core.entity.InteractionManager;
|
||||||
|
import com.hypixel.hytale.server.core.entity.LivingEntity;
|
||||||
|
import com.hypixel.hytale.server.core.meta.DynamicMetaStore;
|
||||||
|
import com.hypixel.hytale.server.core.meta.MetaKey;
|
||||||
|
import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
|
||||||
|
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
|
||||||
|
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
|
||||||
|
import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.Collector;
|
||||||
|
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
|
||||||
|
import com.hypixel.hytale.server.core.event.events.ecs.ChangeHotbarSlotEvent;
|
||||||
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
|
public class ChangeActiveSlotInteraction extends Interaction {
|
||||||
|
@Nonnull
|
||||||
|
public static final ChangeActiveSlotInteraction DEFAULT_INTERACTION = new ChangeActiveSlotInteraction("*Change_Active_Slot");
|
||||||
|
@Nonnull
|
||||||
|
public static final RootInteraction DEFAULT_ROOT = new RootInteraction(
|
||||||
|
"*Default_Swap",
|
||||||
|
new InteractionCooldown("ChangeActiveSlot", 0.0F, false, InteractionManager.DEFAULT_CHARGE_TIMES, true, false),
|
||||||
|
DEFAULT_INTERACTION.getId()
|
||||||
|
);
|
||||||
|
@Deprecated
|
||||||
|
public static final MetaKey<Runnable> PLACE_MOVED_ITEM = CONTEXT_META_REGISTRY.registerMetaObject(i -> null);
|
||||||
|
private static final int UNSET_INT = Integer.MIN_VALUE;
|
||||||
|
@Nonnull
|
||||||
|
public static final BuilderCodec<ChangeActiveSlotInteraction> CODEC = BuilderCodec.builder(
|
||||||
|
ChangeActiveSlotInteraction.class, ChangeActiveSlotInteraction::new, Interaction.ABSTRACT_CODEC
|
||||||
|
)
|
||||||
|
.documentation("Changes the active hotbar slot for the user of the interaction.")
|
||||||
|
.<Integer>appendInherited(
|
||||||
|
new KeyedCodec<>("TargetSlot", Codec.INTEGER),
|
||||||
|
(o, i) -> o.targetSlot = i == null ? Integer.MIN_VALUE : i,
|
||||||
|
o -> o.targetSlot == Integer.MIN_VALUE ? null : o.targetSlot,
|
||||||
|
(o, p) -> o.targetSlot = p.targetSlot
|
||||||
|
)
|
||||||
|
.addValidator(Validators.range(0, 8))
|
||||||
|
.add()
|
||||||
|
.afterDecode(i -> i.cancelOnItemChange = false)
|
||||||
|
.build();
|
||||||
|
protected int targetSlot = Integer.MIN_VALUE;
|
||||||
|
|
||||||
|
public ChangeActiveSlotInteraction() {
|
||||||
|
}
|
||||||
|
|
||||||
|
private ChangeActiveSlotInteraction(@Nonnull String id) {
|
||||||
|
super(id);
|
||||||
|
this.cancelOnItemChange = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public WaitForDataFrom getWaitForDataFrom() {
|
||||||
|
return WaitForDataFrom.None;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void tick0(
|
||||||
|
boolean firstRun, float time, @Nonnull InteractionType type, @Nonnull InteractionContext context, @Nonnull CooldownHandler cooldownHandler
|
||||||
|
) {
|
||||||
|
if (!firstRun) {
|
||||||
|
context.getState().state = InteractionState.Finished;
|
||||||
|
} else {
|
||||||
|
CommandBuffer<EntityStore> commandBuffer = context.getCommandBuffer();
|
||||||
|
|
||||||
|
assert commandBuffer != null;
|
||||||
|
|
||||||
|
Ref<EntityStore> ref = context.getEntity();
|
||||||
|
if (EntityUtils.getEntity(ref, commandBuffer) instanceof LivingEntity livingEntity) {
|
||||||
|
DynamicMetaStore var15 = context.getMetaStore();
|
||||||
|
byte slot;
|
||||||
|
if (this.targetSlot == Integer.MIN_VALUE) {
|
||||||
|
slot = ((Number)var15.getMetaObject(TARGET_SLOT)).byteValue();
|
||||||
|
} else {
|
||||||
|
if (livingEntity.getInventory().getActiveHotbarSlot() == this.targetSlot) {
|
||||||
|
context.getState().state = InteractionState.Finished;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
slot = (byte)this.targetSlot;
|
||||||
|
var15.putMetaObject(TARGET_SLOT, Integer.valueOf(slot));
|
||||||
|
}
|
||||||
|
|
||||||
|
byte previousSlot = livingEntity.getInventory().getActiveHotbarSlot();
|
||||||
|
ChangeHotbarSlotEvent event = new ChangeHotbarSlotEvent(previousSlot, slot, false);
|
||||||
|
commandBuffer.invoke(ref, event);
|
||||||
|
if (event.isCancelled()) {
|
||||||
|
context.getState().state = InteractionState.Finished;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
slot = event.getNewSlot();
|
||||||
|
|
||||||
|
livingEntity.getInventory().setActiveHotbarSlot(slot);
|
||||||
|
Runnable action = (Runnable)var15.removeMetaObject(PLACE_MOVED_ITEM);
|
||||||
|
if (action != null) {
|
||||||
|
action.run();
|
||||||
|
}
|
||||||
|
|
||||||
|
InteractionManager interactionManager = context.getInteractionManager();
|
||||||
|
|
||||||
|
assert interactionManager != null;
|
||||||
|
|
||||||
|
InteractionContext forkContext = InteractionContext.forInteraction(interactionManager, ref, InteractionType.SwapTo, commandBuffer);
|
||||||
|
String forkInteractions = forkContext.getRootInteractionId(InteractionType.SwapTo);
|
||||||
|
if (forkInteractions != null) {
|
||||||
|
if (this.targetSlot != Integer.MIN_VALUE) {
|
||||||
|
forkContext.getMetaStore().putMetaObject(TARGET_SLOT, Integer.valueOf(slot));
|
||||||
|
}
|
||||||
|
|
||||||
|
context.fork(InteractionType.SwapTo, forkContext, RootInteraction.getRootInteractionOrUnknown(forkInteractions), action == null);
|
||||||
|
}
|
||||||
|
|
||||||
|
context.getState().state = InteractionState.Finished;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void simulateTick0(
|
||||||
|
boolean firstRun, float time, @Nonnull InteractionType type, @Nonnull InteractionContext context, @Nonnull CooldownHandler cooldownHandler
|
||||||
|
) {
|
||||||
|
context.getState().state = context.getServerState().state;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean walk(@Nonnull Collector collector, @Nonnull InteractionContext context) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsRemoteSync() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
protected com.hypixel.hytale.protocol.Interaction generatePacket() {
|
||||||
|
return new com.hypixel.hytale.protocol.ChangeActiveSlotInteraction();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configurePacket(com.hypixel.hytale.protocol.Interaction packet) {
|
||||||
|
super.configurePacket(packet);
|
||||||
|
com.hypixel.hytale.protocol.ChangeActiveSlotInteraction p = (com.hypixel.hytale.protocol.ChangeActiveSlotInteraction)packet;
|
||||||
|
p.targetSlot = this.targetSlot;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nonnull
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "ChangeActiveSlotInteraction{targetSlot=" + this.targetSlot + "} " + super.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user