InteractionManager class
Пакет: com.hypixel.hytale.server.core.entity
Файл: com/hypixel/hytale/server/core/entity/InteractionManager.java
implements: Component<EntityStore>
Поля (226)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
double |
MAX_REACH_DISTANCE |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
return |
|
private final InteractionState |
state |
|
World |
var1 |
|
InteractionManager |
var1 |
|
HytaleLogger.Api |
var10 |
|
|
var10 |
|
WaitForDataFrom |
var10 |
|
TimeResource |
var10 |
|
boolean |
var10 |
|
|
var10 |
|
ItemStack |
var10 |
|
TimeResource |
var10 |
|
Player |
var10 |
|
String |
var10 |
|
Deque |
var11 |
|
|
var11 |
|
InteractionChain |
var11 |
|
long |
var11 |
|
float |
var11 |
|
TimeResource |
var11 |
|
ItemStack |
var11 |
|
float |
var11 |
|
GameMode |
var11 |
|
InteractionChain.TempChain |
var12 |
|
|
var12 |
|
long |
var12 |
|
long |
var12 |
|
float |
var12 |
|
String |
var12 |
|
RootInteractionSettings |
var12 |
|
ForkedChainId |
var13 |
|
|
var13 |
|
Operation |
var13 |
|
InteractionContext |
var13 |
|
String |
var13 |
|
int |
var13 |
|
HytaleLogger.Api |
var14 |
|
|
var14 |
|
HytaleLogger.Api |
var14 |
|
byte |
var14 |
|
InteractionSyncData |
var14 |
|
long |
var15 |
|
byte |
var15 |
|
int |
var15 |
|
InteractionChain |
var16 |
|
|
var16 |
|
InteractionSyncData |
var16 |
|
InteractionChain |
var16 |
|
InteractionEntry |
var16 |
|
World |
var17 |
|
boolean |
var18 |
|
ChunkStore |
var18 |
|
HytaleLogger.Api |
var19 |
|
BlockPosition |
var19 |
|
|
var19 |
|
Player |
var2 |
|
boolean |
var2 |
|
int |
var2 |
|
ObjectIterator |
var2 |
|
boolean |
var2 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
long |
var20 |
|
|
var20 |
|
|
var20 |
|
Ref |
var20 |
|
HytaleLogger.Api |
var21 |
|
|
var21 |
|
BlockSection |
var21 |
|
int |
var22 |
|
Ref |
var23 |
|
BlockSection |
var24 |
|
|
var24 |
|
int |
var25 |
|
int |
var25 |
|
float |
var26 |
|
|
var26 |
|
int |
var26 |
|
int |
var27 |
|
boolean |
var28 |
|
|
var28 |
|
HytaleLogger.Api |
var28 |
|
HytaleLogger.Api |
var29 |
|
Iterator |
var3 |
|
HytaleLogger.Api |
var3 |
|
InteractionChain |
var3 |
|
|
var3 |
|
long |
var3 |
|
RootInteraction |
var3 |
|
ObjectList |
var3 |
|
int |
var3 |
|
InteractionChain |
var3 |
|
int |
var3 |
|
|
var3 |
|
SyncInteractionChain[] |
var3 |
|
|
var3 |
|
|
var3 |
|
HytaleLogger.Api |
var30 |
|
HytaleLogger.Api |
var31 |
|
String |
var32 |
|
RootInteraction |
var33 |
|
HytaleLogger.Api |
var34 |
|
InventoryComponent.Hotbar |
var35 |
|
HytaleLogger.Api |
var36 |
|
HytaleLogger.Api |
var37 |
|
HytaleLogger.Api |
var38 |
|
HytaleLogger.Api |
var39 |
|
ObjectListIterator |
var4 |
|
boolean |
var4 |
|
|
var4 |
|
HytaleLogger.Api |
var4 |
|
int |
var4 |
|
RootInteraction |
var4 |
|
|
var4 |
|
|
var4 |
|
|
var4 |
|
long |
var4 |
|
InteractionType |
var4 |
|
SyncInteractionChain |
var4 |
|
List |
var4 |
|
String |
var4 |
|
Interaction |
var4 |
|
HytaleLogger.Api |
var40 |
|
EntityStore |
var41 |
|
Vector3fc |
var42 |
|
Ref |
var43 |
|
HytaleLogger.Api |
var44 |
|
HytaleLogger.Api |
var45 |
|
HytaleLogger.Api |
var46 |
|
HytaleLogger.Api |
var47 |
|
InteractionChain |
var5 |
|
boolean |
var5 |
|
|
var5 |
|
InteractionChain |
var5 |
|
HytaleLogger.Api |
var5 |
|
InteractionEntry |
var5 |
|
int |
var5 |
|
|
var5 |
|
|
var5 |
|
|
var5 |
|
RootInteraction |
var5 |
|
RootInteraction |
var5 |
|
InteractionContext |
var5 |
|
|
var5 |
|
|
var5 |
|
List |
var5 |
|
InteractionCooldown |
var5 |
|
|
var5 |
|
ItemStack |
var5 |
|
|
var5 |
|
Operation |
var5 |
|
float |
var6 |
|
|
var6 |
|
int |
var6 |
|
|
var6 |
|
long |
var6 |
|
Operation |
var6 |
|
int |
var6 |
|
|
var6 |
|
|
var6 |
|
|
var6 |
|
Operation |
var6 |
|
HytaleLogger.Api |
var6 |
|
Operation |
var6 |
|
UUID |
var6 |
|
InteractionChain |
var6 |
|
InteractionChain |
var6 |
|
String |
var6 |
|
|
var6 |
|
|
var6 |
|
InventoryComponent.Armor |
var6 |
|
InteractionChain |
var6 |
|
boolean |
var7 |
|
|
var7 |
|
|
var7 |
|
|
var7 |
|
TimeResource |
var7 |
|
InteractionContext |
var7 |
|
int |
var7 |
|
InteractionEntry |
var7 |
|
long |
var7 |
|
InteractionEntry |
var7 |
|
World |
var7 |
|
InteractionChainData |
var7 |
|
float |
var7 |
|
|
var7 |
|
|
var7 |
|
RootInteraction |
var7 |
|
SyncInteractionChain |
var7 |
|
SyncInteractionChain |
var8 |
|
TimeResource |
var8 |
|
int |
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
InteractionSyncData |
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
InteractionContext |
var8 |
|
Ref |
var8 |
|
RootInteraction |
var8 |
|
float[] |
var8 |
|
|
var8 |
|
|
var8 |
|
InteractionContext |
var8 |
|
HytaleLogger.Api |
var9 |
|
long |
var9 |
|
InteractionChain |
var9 |
|
boolean |
var9 |
|
HytaleLogger.Api |
var9 |
|
float |
var9 |
|
|
var9 |
|
InventoryComponent.Utility |
var9 |
|
HytaleLogger.Api |
var9 |
|
Operation |
var9 |
|
boolean |
var9 |
|
|
var9 |
|
|
var9 |
|
InventoryComponent.Utility |
var9 |
Методы (150)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public |
ChainCancelledExceptionpublic ChainCancelledException(@Nonnull InteractionState var1) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException() |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Can't shift backwards") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("No interaction ID found for " + var1 + ", " + var2) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("No interactions are defined for " + var1 + ", " + var2) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Failed to find interaction: " + var3) |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Attempted to tick Interaction Manager for an invalid entity reference!") |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Entity ref was null or invalid during chain tick!") |
abstract |
return new |
InteractionChainreturn new InteractionChain(var2, var3, var1, var4, var5, var6 || !this.hasRemoteClient) |
abstract |
throw new |
RuntimeExceptionthrow new RuntimeException("Simulation failed") |
public |
boolean |
applyRulesboolean applyRules(@Nonnull InteractionContext var1, @Nonnull InteractionChainData var2, @Nonnull InteractionType var3, @Nonnull RootInteraction var4) |
static |
boolean |
applyRulesboolean applyRules(@Nullable InteractionChainData var0,
@Nonnull InteractionType var1,
int var2,
@Nullable RootInteraction var3,
@Nonnull Map<?, InteractionChain> var4,
@Nullable List<InteractionChain> var5) |
abstract |
return |
applyRulesreturn applyRules(null, var1, var2, var3, this.chains, null) |
public |
boolean |
canRunboolean canRun(@Nonnull InteractionType var1, @Nonnull RootInteraction var2) |
public |
boolean |
canRunboolean canRun(@Nonnull InteractionType var1, short var2, @Nonnull RootInteraction var3) |
public |
void |
cancelChainsvoid cancelChains(@Nonnull InteractionChain var1) |
public |
void |
clearvoid clear() |
public |
void |
clearAllGlobalTimeShiftvoid clearAllGlobalTimeShift(float var1) |
private |
void |
doTickChainvoid doTickChain(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) |
public |
void |
executeChainvoid executeChain(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionChain var3) |
private |
void |
executeChain0void executeChain0(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) |
|
|
for for(float var10 : this.globalTimeShift) |
|
|
for for(ForkedChainId var10 = var8.forkedId; var10 != null; var10 = var10.forkedId) |
|
|
for for(ForkedChainId var17 = var10.forkedId; var17 != null; var17 = var17.forkedId) |
|
|
for for(ForkedChainId var4 = var2; var4 != null; var4 = var4.forkedId) |
|
|
for for(SyncInteractionChain var7 : var3.newForks) |
|
|
for for(int var12 = 0; var12 < var3.interactionData.length; var12++) |
|
|
for for(InteractionChain var7 : var5) |
|
|
for for(int var3 = 0; var3 < this.globalTimeShift.length; var3++) |
|
|
for for(String var7 : var3) |
abstract |
|
for for(int var5 = 0; var5 < var4.size() |
public |
<T> T |
forEachInteraction<T> T forEachInteraction(@Nonnull TriFunction<InteractionChain, Interaction, T, T> var1, T var2) |
static |
<T> T |
forEachInteraction<T> T forEachInteraction(@Nonnull Map<?, InteractionChain> var0, @Nonnull TriFunction<InteractionChain, Interaction, T, T> var1, T var2) |
abstract |
return |
forEachInteractionreturn forEachInteraction(this.chains, var1, var2) |
public |
float |
getGlobalTimeShiftfloat getGlobalTimeShift(@Nonnull InteractionType var1) |
private |
long |
getOperationTimeoutThresholdlong getOperationTimeoutThreshold() |
public |
ObjectList<SyncInteractionChain> |
getSyncPacketsObjectList<SyncInteractionChain> getSyncPackets() |
private |
void |
handleCancelledChainvoid handleCancelledChain(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) |
|
|
if if(this.playerRef != null) |
|
|
if if(this.playerRef != null) |
|
|
if if(var6 > 0.0F) |
|
|
if if(var8.desync) |
|
|
if if(var16 != null && var8.forkedId != null) |
|
|
if if(var11 == null) |
|
|
if if(var12 != null) |
|
|
if if(this.packetQueueTime == 0L) |
|
|
if if(!var5 && !var18) |
|
|
if if(var2) |
|
|
if if(var3 != null && var2 != null) |
|
|
if if(var5 == null) |
|
|
if if(!this.hasRemoteClient) |
|
|
if if(!this.hasRemoteClient) |
|
|
if if(var3 > var6) |
|
|
if if(var5 != null) |
|
|
if if(var6 == null) |
|
|
if if(var6 >= var5) |
|
|
if if(var8 == 0 && var6 >= var5) |
|
|
if if(!this.hasRemoteClient && var10 != WaitForDataFrom.Server) |
|
|
if if(!this.hasRemoteClient && var10 == WaitForDataFrom.Server) |
|
|
if if(!this.hasRemoteClient) |
|
|
if if(var6 >= var5) |
|
|
if if(var6 < var5 || var8 == 0) |
|
|
if if(var8 == 0 && var6 >= var5) |
|
|
if if(!this.hasRemoteClient) |
|
|
if if(var9) |
|
|
if if(var11 == 1.0F && var12 > var15) |
|
|
if if(var4 > var7) |
|
|
if if(var6 == null) |
|
|
if if(!var2.initial) |
|
|
if if(var2.forkedId == null) |
|
|
if if(var3 <= 0) |
|
|
if if(var8 == null) |
|
|
if if(var32 == null) |
|
|
if if(var33 == null) |
|
|
if if(var35 == null) |
|
|
if if(var9 == null) |
|
|
if if(var2.activeHotbarSlot != var14) |
|
|
if if(this.playerRef != null) |
|
|
if if(this.playerRef != null) |
|
|
if if(var2.data.blockPosition != null) |
|
|
if if(var21 == null) |
|
|
if if(var22 != 0) |
|
|
if if(var24 == null) |
|
|
if if(var25 != var26) |
|
|
if if(var25 != 0) |
|
|
if if(var2.data.entityId >= 0) |
|
|
if if(var43 != null) |
|
|
if if(var2.data.targetSlot != Integer.MIN_VALUE) |
|
|
if if(var2.data.hitLocation != null) |
|
|
if if(var2.data.hitDetail != null) |
|
|
if if(var3.newForks != null) |
|
|
if if(var3.interactionData == null) |
|
|
if if(var14 != null) |
|
|
if if(var16 != null && var2 instanceof InteractionChain var8) |
|
|
if if(var5 != null) |
|
|
if if(var5 != null) |
|
|
if if(var3 >= 0) |
|
|
if if(var5 != null) |
|
|
if if(var5.chargeTimes != null && var5.chargeTimes.length > 0) |
|
|
if if(var5.cooldownId != null) |
|
|
if if(var5.interruptRecharge) |
|
|
if if(var5.clickBypass && var4) |
|
|
if if(var12 != null) |
|
|
if if(var5 != null) |
|
|
if if(var5.chargeTimes != null && var5.chargeTimes.length > 0) |
|
|
if if(var5.cooldownId != null) |
|
|
if if(var5.interruptRecharge) |
|
|
if if(var5.clickBypass && var4) |
|
|
if if(var12.allowSkipChainOnClick && var4) |
|
|
if if(var9 != null) |
|
|
if if(var4 == -1) |
|
|
if if(var6 != null) |
|
|
if if(var10 != null) |
|
|
if if(this.playerRef != null) |
|
|
if if(this.playerRef != null) |
|
|
if if(this.timeShiftsDirty) |
|
|
if if(!this.globalTimeShiftDirty[var3]) |
|
|
if if(var2) |
|
|
if if(var2 < 0.0F) |
|
|
if if(var3 == null) |
|
|
if if(var4 == null) |
|
|
if if(var3 == null) |
|
|
if if(var3 == null) |
|
|
if if(var4 == null) |
private |
boolean |
isOnCooldownboolean isOnCooldown(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionType var2, @Nonnull RootInteraction var3, boolean var4) |
public |
void |
queueExecuteChainvoid queueExecuteChain(@Nonnull InteractionChain var1) |
private |
void |
removeInteractionIfFinishedvoid removeInteractionIfFinished(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2, @Nonnull InteractionEntry var3) |
private |
void |
sendCancelPacketvoid sendCancelPacket(@Nonnull InteractionChain var1) |
public |
void |
sendCancelPacketvoid sendCancelPacket(int var1, ForkedChainId var2) |
public |
void |
sendSyncPacketvoid sendSyncPacket(@Nonnull InteractionChain var1, int var2, @Nullable List<InteractionSyncData> var3) |
public |
void |
setGlobalTimeShiftvoid setGlobalTimeShift(@Nonnull InteractionType var1, float var2) |
private |
void |
simulationTickvoid simulationTick(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2, long var3) |
public |
void |
startChainvoid startChain(@Nonnull Ref<EntityStore> var1,
@Nonnull CommandBuffer<EntityStore> var2,
@Nonnull InteractionType var3,
@Nonnull InteractionContext var4,
@Nonnull RootInteraction var5) |
public |
void |
syncvoid sync(@Nonnull Ref<EntityStore> var1, @Nonnull ChainSyncStorage var2, @Nonnull SyncInteractionChain var3) |
private |
boolean |
syncStartboolean syncStart(@Nonnull Ref<EntityStore> var1, @Nonnull SyncInteractionChain var2) |
public |
void |
tickvoid tick(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, float var3) |
private |
boolean |
tickChainboolean tickChain(@Nonnull InteractionChain var1) |
private |
boolean |
tryConsumePacketQueueboolean tryConsumePacketQueue(@Nonnull Ref<EntityStore> var1, @Nonnull Deque<SyncInteractionChain> var2) |
public |
void |
tryRunHeldInteractionvoid tryRunHeldInteraction(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionType var3) |
public |
void |
tryRunHeldInteractionvoid tryRunHeldInteraction(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionType var3, short var4) |
public |
boolean |
tryStartChainboolean tryStartChain(@Nonnull Ref<EntityStore> var1,
@Nonnull CommandBuffer<EntityStore> var2,
@Nonnull InteractionType var3,
@Nonnull InteractionContext var4,
@Nonnull RootInteraction var5) |
private |
boolean |
waitingForClientboolean waitingForClient(@Nonnull Ref<EntityStore> var1) |
public |
void |
walkChainvoid walkChain(@Nonnull Ref<EntityStore> var1, @Nonnull Collector var2, @Nonnull InteractionType var3, @Nonnull ComponentAccessor<EntityStore> var4) |
public |
void |
walkChainvoid walkChain(@Nonnull Ref<EntityStore> var1,
@Nonnull Collector var2,
@Nonnull InteractionType var3,
@Nullable RootInteraction var4,
@Nonnull ComponentAccessor<EntityStore> var5) |
static |
void |
walkChainvoid walkChain(@Nonnull Collector var0, @Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nullable RootInteraction var3) |
static |
boolean |
walkInteractionboolean walkInteraction(@Nonnull Collector var0, @Nonnull InteractionContext var1, @Nonnull CollectorTag var2, @Nullable String var3) |
static |
boolean |
walkInteractionsboolean walkInteractions(@Nonnull Collector var0, @Nonnull InteractionContext var1, @Nonnull CollectorTag var2, @Nonnull String[] var3) |
|
|
while while(true) |
|
|
while while(var8 > 0 && var6 >= var5) |
|
|
while while(var8 > 0) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.entity;
class="kw">import com.hypixel.hytale.common.util.FormatUtil;
class="kw">import com.hypixel.hytale.common.util.ListUtil;
class="kw">import com.hypixel.hytale.component.CommandBuffer;
class="kw">import com.hypixel.hytale.component.Component;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.function.function.TriFunction;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.protocol.BlockPosition;
class="kw">import com.hypixel.hytale.protocol.ForkedChainId;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.InteractionChainData;
class="kw">import com.hypixel.hytale.protocol.InteractionCooldown;
class="kw">import com.hypixel.hytale.protocol.InteractionState;
class="kw">import com.hypixel.hytale.protocol.InteractionSyncData;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.RootInteractionSettings;
class="kw">import com.hypixel.hytale.protocol.WaitForDataFrom;
class="kw">import com.hypixel.hytale.protocol.packets.interaction.CancelInteractionChain;
class="kw">import com.hypixel.hytale.protocol.packets.interaction.SyncInteractionChain;
class="kw">import com.hypixel.hytale.protocol.packets.inventory.SetActiveSlot;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.io.handlers.game.GamePacketHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.IInteractionSimulationHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.CooldownHandler;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.InteractionTypeUtils;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.Collector;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.data.CollectorTag;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.operation.Operation;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.util.InteractionValidation;
class="kw">import com.hypixel.hytale.server.core.modules.time.TimeResource;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import com.hypixel.hytale.server.core.util.UUIDUtil;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
class="kw">import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectIterator;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectList;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectListIterator;
class="kw">import java.util.Arrays;
class="kw">import java.util.Deque;
class="kw">import java.util.Iterator;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3fc;
class="kw">import org.joml.Vector4d;
class="kw">public class InteractionManager class="kw">implements Component<EntityStore> {
class="kw">public class="kw">static class="kw">final double MAX_REACH_DISTANCE = 8.0;
class="kw">public class="kw">static class="kw">final float[] DEFAULT_CHARGE_TIMES = new float[]{0.0F};
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
@Nonnull
class="kw">private class="kw">final Int2ObjectMap<InteractionChain> chains = new Int2ObjectOpenHashMap();
@Nonnull
class="kw">private class="kw">final Int2ObjectMap<InteractionChain> unmodifiableChains = Int2ObjectMaps.unmodifiable(this.chains);
@Nonnull
class="kw">private class="kw">final CooldownHandler cooldownHandler = new CooldownHandler();
@Nullable
class="kw">private Ref<EntityStore> ref;
@Nullable
class="kw">private class="kw">final PlayerRef playerRef;
class="kw">private boolean hasRemoteClient;
@Nonnull
class="kw">private class="kw">final IInteractionSimulationHandler interactionSimulationHandler;
@Nonnull
class="kw">private class="kw">final ObjectList<InteractionSyncData> tempSyncDataList = new ObjectArrayList();
class="kw">private int lastServerChainId;
class="kw">private int lastClientChainId;
class="kw">private long packetQueueTime;
class="kw">private class="kw">final float[] globalTimeShift = new float[InteractionType.VALUES.length];
class="kw">private class="kw">final boolean[] globalTimeShiftDirty = new boolean[InteractionType.VALUES.length];
class="kw">private boolean timeShiftsDirty;
class="kw">private class="kw">final ObjectList<SyncInteractionChain> syncPackets = new ObjectArrayList();
class="kw">private long currentTime = 1L;
@Nonnull
class="kw">private class="kw">final ObjectList<InteractionChain> chainStartQueue = new ObjectArrayList();
@Nonnull
class="kw">private class="kw">final Predicate<InteractionChain> cachedTickChain = this::tickChain;
@Nullable
class="kw">protected CommandBuffer<EntityStore> commandBuffer;
class="kw">public InteractionManager(@Nullable PlayerRef var1, @Nonnull IInteractionSimulationHandler var2) {
this.playerRef = var1;
this.hasRemoteClient = var1 != null;
this.interactionSimulationHandler = var2;
}
@Nonnull
class="kw">public Int2ObjectMap<InteractionChain> getChains() {
class="kw">return this.unmodifiableChains;
}
@Nonnull
class="kw">public IInteractionSimulationHandler getInteractionSimulationHandler() {
class="kw">return this.interactionSimulationHandler;
}
class="kw">private long getOperationTimeoutThreshold() {
if (this.playerRef != null) {
class="kw">return this.playerRef.getPacketHandler().getOperationTimeoutThreshold();
}
assert this.commandBuffer != null;
World var1 = this.commandBuffer.getExternalData().getWorld();
class="kw">return var1.getTickStepNanos() / 1000000L * 10L;
}
class="kw">private boolean waitingForClient(@Nonnull Ref<EntityStore> var1) {
assert this.commandBuffer != null;
Player var2 = this.commandBuffer.getComponent(var1, Player.getComponentType());
class="kw">return var2 != null ? var2.isWaitingForClientReady() : false;
}
@Deprecated(forRemoval = true)
class="kw">public void setHasRemoteClient(boolean var1) {
this.hasRemoteClient = var1;
}
@Deprecated
class="kw">public void copyFrom(@Nonnull InteractionManager var1) {
this.chains.putAll(var1.chains);
}
class="kw">public void tick(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, float var3) {
if (!var1.isValid()) {
throw new IllegalStateException("Attempted to tick Interaction Manager for an invalid entity reference!");
}
this.currentTime = this.currentTime + var2.getExternalData().getWorld().getTickStepNanos();
this.ref = var1;
this.commandBuffer = var2;
this.clearAllGlobalTimeShift(var3);
this.cooldownHandler.tick(var3);
ObjectListIterator var4 = this.chainStartQueue.iterator();
while (var4.hasNext()) {
InteractionChain var5 = (InteractionChain)var4.next();
this.executeChain0(var1, var5);
}
this.chainStartQueue.clear();
Deque var11 = null;
if (this.playerRef != null) {
var11 = ((GamePacketHandler)this.playerRef.getPacketHandler()).getInteractionPacketQueue();
}
if (var11 != null && !var11.isEmpty()) {
for (boolean var12 = true; this.tryConsumePacketQueue(var1, var11) || var12; var12 = false) {
if (!this.chains.isEmpty()) {
this.chains.values().removeIf(this.cachedTickChain);
}
float var6 = 0.0F;
for (float var10 : this.globalTimeShift) {
var6 = Math.max(var6, var10);
}
if (var6 > 0.0F) {
this.cooldownHandler.tick(var6);
}
}
this.commandBuffer = null;
} else {
if (!this.chains.isEmpty()) {
this.chains.values().removeIf(this.cachedTickChain);
}
this.ref = null;
this.commandBuffer = null;
}
}
class="kw">private boolean tryConsumePacketQueue(@Nonnull Ref<EntityStore> var1, @Nonnull Deque<SyncInteractionChain> var2) {
Iterator var3 = var2.iterator();
boolean var4 = false;
boolean var5 = false;
int var6 = -1;
boolean var7 = false;
label116:
while (var3.hasNext()) {
SyncInteractionChain var8 = var3.next();
if (var8.desync) {
HytaleLogger.Api var9 = LOGGER.at(Level.FINE);
if (var9.isEnabled()) {
var9.log("Client packet flagged as desync");
}
var5 = true;
}
InteractionChain var16 = (InteractionChain)this.chains.get(var8.chainId);
if (var16 != null && var8.forkedId != null) {
for (ForkedChainId var10 = var8.forkedId; var10 != null; var10 = var10.forkedId) {
InteractionChain var11 = var16.getForkedChain(var10);
if (var11 == null) {
InteractionChain.TempChain var12 = var16.getTempForkedChain(var10);
if (var12 != null) {
var12.setBaseForkedChainId(var10);
ForkedChainId var13 = var10;
for (ForkedChainId var17 = var10.forkedId; var17 != null; var17 = var17.forkedId) {
var12 = var12.getOrCreateTempForkedChain(var17);
var12.setBaseForkedChainId(var17);
var13 = var17;
}
var12.setForkedChainId(var8.forkedId);
var12.setBaseForkedChainId(var13);
var12.setChainData(var8.data);
this.sync(var1, var12, var8);
var7 = true;
var3.remove();
this.packetQueueTime = 0L;
}
class="kw">continue label116;
}
var16 = var11;
}
}
var6 = Math.max(var6, var8.chainId);
boolean var18 = var8.data != null && !UUIDUtil.isEmptyOrNull(var8.data.proxyId);
if (var16 == null && (!var4 || var18)) {
if (this.syncStart(var1, var8)) {
var7 = true;
var3.remove();
this.packetQueueTime = 0L;
} else {
if (!this.waitingForClient(var1)) {
long var20;
if (this.packetQueueTime == 0L) {
this.packetQueueTime = this.currentTime;
var20 = 0L;
} else {
var20 = this.currentTime - this.packetQueueTime;
}
HytaleLogger.Api var21 = LOGGER.at(Level.FINE);
if (var21.isEnabled()) {
var21.log("Queued chain %d for %s", var8.chainId, FormatUtil.nanosToString(var20));
}
if (var20 > TimeUnit.MILLISECONDS.toNanos(this.getOperationTimeoutThreshold())) {
this.sendCancelPacket(var8.chainId, var8.forkedId);
var3.remove();
var21 = LOGGER.at(Level.FINE);
if (var21.isEnabled()) {
var21.log("Discarding packet due to queuing for too long: %s", var8);
}
}
}
if (!var5 && !var18) {
var4 = true;
}
}
} else if (var16 != null) {
this.sync(var1, var16, var8);
var7 = true;
var3.remove();
this.packetQueueTime = 0L;
} else if (var5) {
this.sendCancelPacket(var8.chainId, var8.forkedId);
var3.remove();
HytaleLogger.Api var19 = LOGGER.at(Level.FINE);
var19.log("Discarding packet due to desync: %s", var8);
}
}
if (var5 && !var2.isEmpty()) {
HytaleLogger.Api var14 = LOGGER.at(Level.FINE);
if (var14.isEnabled()) {
var14.log("Discarding previous packets in queue: (before) %d", var2.size());
}
var2.removeIf(var1x -> {
boolean var2 = this.getChain(var1x.chainId, var1x.forkedId) == null && UUIDUtil.isEmptyOrNull(var1x.data.proxyId) && var1x.initial;
if (var2) {
HytaleLogger.Api var3 = LOGGER.at(Level.FINE);
if (var3.isEnabled()) {
var3.log("Discarding: %s", var1x);
}
this.sendCancelPacket(var1x.chainId, var1x.forkedId);
}
class="kw">return var2;
});
var14 = LOGGER.at(Level.FINE);
if (var14.isEnabled()) {
var14.log("Discarded previous packets in queue: (after) %d", var2.size());
}
}
class="kw">return var7;
}
@Nullable
class="kw">private InteractionChain getChain(int var1, @Nullable ForkedChainId var2) {
InteractionChain var3 = (InteractionChain)this.chains.get(var1);
if (var3 != null && var2 != null) {
for (ForkedChainId var4 = var2; var4 != null; var4 = var4.forkedId) {
InteractionChain var5 = var3.getForkedChain(var4);
if (var5 == null) {
class="kw">return null;
}
var3 = var5;
}
}
class="kw">return var3;
}
class="kw">private boolean tickChain(@Nonnull InteractionChain var1) {
if (var1.wasPreTicked()) {
var1.setPreTicked(false);
class="kw">return false;
}
if (this.ref != null && this.ref.isValid()) {
if (!this.hasRemoteClient) {
var1.updateSimulatedState();
}
var1.getForkedChains().values().removeIf(this.cachedTickChain);
if (var1.getServerState() != InteractionState.NotFinished) {
if (var1.requiresClient() && var1.getClientState() == InteractionState.NotFinished) {
if (!this.waitingForClient(this.ref)) {
if (var1.getWaitingForClientFinished() == 0L) {
var1.setWaitingForClientFinished(this.currentTime);
}
long var9 = TimeUnit.NANOSECONDS.toMillis(this.currentTime - var1.getWaitingForClientFinished());
HytaleLogger.Api var4 = LOGGER.at(Level.FINE);
if (var4.isEnabled()) {
var4.log("Server finished chain but client hasn't! %d, %s, %s", var1.getChainId(), var1, var9);
}
long var12 = this.getOperationTimeoutThreshold();
TimeResource var7 = this.commandBuffer.getResource(TimeResource.getResourceType());
if (var7.getTimeDilationModifier() == 1.0F && var9 > var12) {
this.cancelChains(var1);
class="kw">return var1.getForkedChains().isEmpty();
}
}
class="kw">return false;
} else {
LOGGER.at(Level.FINE).log("Remove Chain: %d, %s", var1.getChainId(), var1);
this.handleCancelledChain(this.ref, var1);
var1.onCompletion(this.cooldownHandler, this.hasRemoteClient);
class="kw">return var1.getForkedChains().isEmpty();
}
} else {
int var2 = var1.getOperationIndex();
try {
this.doTickChain(this.ref, var1);
} catch (InteractionManager.ChainCancelledException var8) {
var1.setServerState(var8.state);
var1.setClientState(var8.state);
var1.updateServerState();
if (!this.hasRemoteClient) {
var1.updateSimulatedState();
}
if (var1.requiresClient()) {
this.sendSyncPacket(var1, var2, this.tempSyncDataList);
this.sendCancelPacket(var1);
}
}
if (var1.getServerState() != InteractionState.NotFinished) {
HytaleLogger.Api var10 = LOGGER.at(Level.FINE);
if (var10.isEnabled()) {
var10.log("Server finished chain: %d-%s, %s in %fs", var1.getChainId(), var1.getForkedChainId(), var1, var1.getTimeInSeconds());
}
if (!var1.requiresClient() || var1.getClientState() != InteractionState.NotFinished) {
var10 = LOGGER.at(Level.FINE);
if (var10.isEnabled()) {
var10.log("Remove Chain: %d-%s, %s", var1.getChainId(), var1.getForkedChainId(), var1);
}
this.handleCancelledChain(this.ref, var1);
var1.onCompletion(this.cooldownHandler, this.hasRemoteClient);
class="kw">return var1.getForkedChains().isEmpty();
}
} else if (var1.getClientState() != InteractionState.NotFinished && !this.waitingForClient(this.ref)) {
if (var1.getWaitingForServerFinished() == 0L) {
var1.setWaitingForServerFinished(this.currentTime);
}
long var3 = TimeUnit.NANOSECONDS.toMillis(this.currentTime - var1.getWaitingForServerFinished());
HytaleLogger.Api var5 = LOGGER.at(Level.FINE);
if (var5.isEnabled()) {
var5.log("Client finished chain but server hasn't! %d, %s, %s", var1.getChainId(), var1, var3);
}
long var6 = this.getOperationTimeoutThreshold();
if (var3 > var6) {
LOGGER.at(Level.FINE).log("Client finished chain earlier than server! %d, %s", var1.getChainId(), var1);
this.cancelChains(var1);
}
}
class="kw">return false;
}
} else {
throw new IllegalStateException("Entity ref was null or invalid during chain tick!");
}
}
class="kw">private void handleCancelledChain(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) {
assert this.commandBuffer != null;
RootInteraction var3 = var2.getRootInteraction();
int var4 = var3.getOperationMax();
if (var2.getOperationCounter() < var4) {
InteractionEntry var5 = var2.getInteraction(var2.getOperationIndex());
if (var5 != null) {
Operation var6 = var3.getOperation(var2.getOperationCounter());
if (var6 == null) {
throw new IllegalStateException("Failed to find operation during simulation tick of chain '" + var3.getId() + "'");
}
InteractionContext var7 = var2.getContext();
var5.getServerState().state = InteractionState.Failed;
if (var5.getClientState() != null) {
var5.getClientState().state = InteractionState.Failed;
}
try {
var7.initEntry(var2, var5, var1);
TimeResource var8 = this.commandBuffer.getResource(TimeResource.getResourceType());
var6.handle(var1, false, var5.getTimeInSeconds(this.currentTime) * var8.getTimeDilationModifier(), var2.getType(), var7);
} class="kw">finally {
var7.deinitEntry(var2, var5, var1);
}
var2.setOperationCounter(var4);
}
}
}
class="kw">private void doTickChain(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) {
ObjectList var3 = this.tempSyncDataList;
var3.clear();
RootInteraction var4 = var2.getRootInteraction();
int var5 = var4.getOperationMax();
int var6 = var2.getOperationCounter();
int var7 = var2.getOperationIndex();
int var8 = var2.getCallDepth();
if (var2.consumeFirstRun()) {
if (var2.getForkedChainId() == null) {
var2.setTimeShift(this.getGlobalTimeShift(var2.getType()));
} else {
InteractionChain var9 = (InteractionChain)this.chains.get(var2.getChainId());
var2.setFirstRun(var9 != null && var9.isFirstRun());
}
} else {
var2.setTimeShift(0.0F);
}
if (!var2.getContext().getEntity().isValid()) {
throw new InteractionManager.ChainCancelledException(var2.getServerState());
}
while (true) {
if (var6 >= var5) {
while (var8 > 0 && var6 >= var5) {
var2.popRoot();
var8 = var2.getCallDepth();
var6 = var2.getOperationCounter();
var4 = var2.getRootInteraction();
var5 = var4.getOperationMax();
}
if (var8 == 0 && var6 >= var5) {
break;
}
}
Operation var13 = !this.hasRemoteClient ? var4.getOperation(var2.getSimulatedOperationCounter()) : null;
WaitForDataFrom var10 = var13 != null ? var13.getWaitForDataFrom() : null;
long var11 = this.currentTime;
if (!this.hasRemoteClient && var10 != WaitForDataFrom.Server) {
this.simulationTick(var1, var2, var11);
}
var3.add(this.serverTick(var1, var2, var11));
if (!var2.getContext().getEntity().isValid() && var2.getServerState() != InteractionState.Finished && var2.getServerState() != InteractionState.Failed
)
{
throw new InteractionManager.ChainCancelledException(var2.getServerState());
}
if (!this.hasRemoteClient && var10 == WaitForDataFrom.Server) {
this.simulationTick(var1, var2, var11);
}
if (!this.hasRemoteClient) {
if (var2.getRootInteraction() != var2.getSimulatedRootInteraction()) {
throw new IllegalStateException(
"Simulation and server tick are not in sync (root interaction).\n"
+ var2.getRootInteraction().getId()
+ " vs "
+ var2.getSimulatedRootInteraction()
);
}
if (var2.getOperationCounter() != var2.getSimulatedOperationCounter()) {
throw new IllegalStateException(
"Simulation and server tick are not in sync (operation position).\nRoot: "
+ var2.getRootInteraction().getId()
+ "\nCounter: "
+ var2.getOperationCounter()
+ " vs "
+ var2.getSimulatedOperationCounter()
+ "\nIndex: "
+ var2.getOperationIndex()
);
}
}
if (var8 != var2.getCallDepth()) {
var8 = var2.getCallDepth();
var4 = var2.getRootInteraction();
var5 = var4.getOperationMax();
} else if (var6 == var2.getOperationCounter()) {
break;
}
var2.nextOperationIndex();
var6 = var2.getOperationCounter();
if (var6 >= var5) {
while (var8 > 0) {
var2.popRoot();
var8 = var2.getCallDepth();
var6 = var2.getOperationCounter();
var4 = var2.getRootInteraction();
var5 = var4.getOperationMax();
if (var6 < var5 || var8 == 0) {
break;
}
}
if (var8 == 0 && var6 >= var5) {
break;
}
}
}
var2.updateServerState();
if (!this.hasRemoteClient) {
var2.updateSimulatedState();
}
if (var2.requiresClient()) {
this.sendSyncPacket(var2, var7, var3);
}
}
@Nullable
class="kw">private InteractionSyncData serverTick(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2, long var3) {
assert this.commandBuffer != null;
RootInteraction var5 = var2.getRootInteraction();
Operation var6 = var5.getOperation(var2.getOperationCounter());
assert var6 != null;
InteractionEntry var7 = var2.getOrCreateInteractionEntry(var2.getOperationIndex());
InteractionSyncData var8 = null;
boolean var9 = var7.consumeDesyncFlag();
if (var7.getClientState() == null) {
var9 |= !var7.setClientState(var2.removeInteractionSyncData(var2.getOperationIndex()));
}
if (var9) {
var8 = var7.getServerState();
var2.flagDesync();
var2.clearInteractionSyncData(var2.getOperationIndex());
}
TimeResource var10 = this.commandBuffer.getResource(TimeResource.getResourceType());
float var11 = var10.getTimeDilationModifier();
if (var6.getWaitForDataFrom() != WaitForDataFrom.Client || var7.getClientState() != null) {
int var25 = var7.getServerDataHashCode();
InteractionContext var13 = var2.getContext();
float var26 = var7.getTimeInSeconds(var3);
boolean var28 = false;
if (var7.getTimestamp() == 0L) {
var26 = var2.getTimeShift();
var7.setTimestamp(var3, var26);
var28 = true;
}
var26 *= var11;
try {
var13.initEntry(var2, var7, var1);
var6.tick(var1, var28, var26, var2.getType(), var13, this.cooldownHandler);
} class="kw">finally {
var13.deinitEntry(var2, var7, var1);
}
InteractionSyncData var16 = var7.getServerState();
if (var28 || var25 != var7.getServerDataHashCode()) {
var8 = var16;
}
try {
var13.initEntry(var2, var7, var1);
var6.handle(var1, var28, var26, var2.getType(), var13);
} class="kw">finally {
var13.deinitEntry(var2, var7, var1);
}
this.removeInteractionIfFinished(var1, var2, var7);
class="kw">return var8;
} else {
if (this.waitingForClient(var1)) {
class="kw">return null;
}
if (var7.getWaitingForSyncData() == 0L) {
var7.setWaitingForSyncData(this.currentTime);
}
long var12 = TimeUnit.NANOSECONDS.toMillis(this.currentTime - var7.getWaitingForSyncData());
HytaleLogger.Api var14 = LOGGER.at(Level.FINE);
if (var14.isEnabled()) {
var14.log("Wait for interaction clientData: %d, %s, %s", var2.getOperationIndex(), var7, var12);
}
long var15 = this.getOperationTimeoutThreshold();
if (var11 == 1.0F && var12 > var15) {
((HytaleLogger.Api)LOGGER.atWarning()).log("Client failed to send client data, ending early to prevent desync.");
var2.setServerState(InteractionState.Failed);
var2.setClientState(InteractionState.Failed);
this.cancelChains(var2);
class="kw">return null;
}
if (var7.consumeSendInitial() || var9) {
var8 = var7.getServerState();
}
class="kw">return var8;
}
}
class="kw">private void removeInteractionIfFinished(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2, @Nonnull InteractionEntry var3) {
if (var2.getOperationIndex() == var3.getIndex() && var3.getServerState().state != InteractionState.NotFinished) {
var2.setFinalState(var3.getServerState().state);
}
if (var3.getServerState().state != InteractionState.NotFinished) {
LOGGER.at(Level.FINE).log("Server finished interaction: %d, %s", var3.getIndex(), var3);
if (!var2.requiresClient() || var3.getClientState() != null && var3.getClientState().state != InteractionState.NotFinished) {
LOGGER.at(Level.FINER).log("Remove Interaction: %d, %s", var3.getIndex(), var3);
var2.removeInteractionEntry(this, var3.getIndex());
}
} else if (var3.getClientState() != null && var3.getClientState().state != InteractionState.NotFinished && !this.waitingForClient(var1)) {
if (var3.getWaitingForServerFinished() == 0L) {
var3.setWaitingForServerFinished(this.currentTime);
}
long var4 = TimeUnit.NANOSECONDS.toMillis(this.currentTime - var3.getWaitingForServerFinished());
HytaleLogger.Api var6 = LOGGER.at(Level.FINE);
if (var6.isEnabled()) {
var6.log("Client finished interaction but server hasn't! %s, %d, %s, %s", var3.getClientState().state, var3.getIndex(), var3, var4);
}
long var7 = this.getOperationTimeoutThreshold();
if (var4 > var7) {
HytaleLogger.Api var9 = LOGGER.at(Level.FINE);
if (var9.isEnabled()) {
var9.log("Client finished interaction earlier than server! %d, %s", var3.getIndex(), var3);
}
this.cancelChains(var2);
}
}
}
class="kw">private void simulationTick(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2, long var3) {
assert this.commandBuffer != null;
RootInteraction var5 = var2.getRootInteraction();
Operation var6 = var5.getOperation(var2.getSimulatedOperationCounter());
if (var6 == null) {
throw new IllegalStateException("Failed to find operation during simulation tick of chain '" + var5.getId() + "'");
}
InteractionEntry var7 = var2.getOrCreateInteractionEntry(var2.getClientOperationIndex());
InteractionContext var8 = var2.getContext();
var7.setUseSimulationState(true);
try {
var8.initEntry(var2, var7, var1);
float var9 = var7.getTimeInSeconds(var3);
boolean var10 = false;
if (var7.getTimestamp() == 0L) {
var9 = var2.getTimeShift();
var7.setTimestamp(var3, var9);
var10 = true;
}
TimeResource var11 = this.commandBuffer.getResource(TimeResource.getResourceType());
float var12 = var11.getTimeDilationModifier();
var9 *= var12;
var6.simulateTick(var1, var10, var9, var2.getType(), var8, this.cooldownHandler);
} class="kw">finally {
var8.deinitEntry(var2, var7, var1);
var7.setUseSimulationState(false);
}
if (!var7.setClientState(var7.getSimulationState())) {
throw new RuntimeException("Simulation failed");
}
this.removeInteractionIfFinished(var1, var2, var7);
}
class="kw">private boolean syncStart(@Nonnull Ref<EntityStore> var1, @Nonnull SyncInteractionChain var2) {
assert this.commandBuffer != null;
int var3 = var2.chainId;
if (!var2.initial) {
if (var2.forkedId == null) {
HytaleLogger.Api var29 = LOGGER.at(Level.FINE);
if (var29.isEnabled()) {
var29.log("Got syncStart for %d-%s but packet wasn't the first.", var3, var2.forkedId);
}
this.sendCancelPacket(var3, var2.forkedId);
}
class="kw">return true;
} else if (var2.forkedId != null) {
HytaleLogger.Api var28 = LOGGER.at(Level.FINE);
if (var28.isEnabled()) {
var28.log("Can't start a forked chain from the client: %d %s", var3, var2.forkedId);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else {
InteractionType var4 = var2.interactionType;
if (var3 <= 0) {
HytaleLogger.Api var31 = LOGGER.at(Level.FINE);
if (var31.isEnabled()) {
var31.log("Invalid client chainId! Got %d but client id's should be > 0", var3);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else if (var3 <= this.lastClientChainId) {
HytaleLogger.Api var30 = LOGGER.at(Level.FINE);
if (var30.isEnabled()) {
var30.log("Invalid client chainId! The last clientChainId was %d but just got %d", this.lastClientChainId, var3);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else {
InteractionContext var5;
if (var2.data != null && !UUIDUtil.isEmptyOrNull(var2.data.proxyId)) {
UUID var6 = var2.data.proxyId;
World var7 = this.commandBuffer.getExternalData().getWorld();
Ref var8 = var7.getEntityStore().getRefFromUUID(var6);
if (var8 == null) {
if (this.packetQueueTime != 0L
&& this.currentTime - this.packetQueueTime > TimeUnit.MILLISECONDS.toNanos(this.getOperationTimeoutThreshold()) / 2L) {
HytaleLogger.Api var36 = LOGGER.at(Level.FINE);
if (var36.isEnabled()) {
var36.log("Proxy entity never spawned");
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
class="kw">return false;
}
if (!InteractionValidation.isAccessibleProxyTarget(var1, var8, var4)) {
LOGGER.at(Level.WARNING).log("%s cannot access entity %s as interaction proxy", EntityUtils.getEntityName(var1, this.commandBuffer), var6);
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
var5 = InteractionContext.forProxyEntity(this, var1, var8, this.commandBuffer);
} else {
var5 = InteractionContext.forInteraction(this, var1, var4, var2.equipSlot, this.commandBuffer);
}
String var32 = var5.getRootInteractionId(var4);
if (var32 == null) {
HytaleLogger.Api var34 = LOGGER.at(Level.FINE);
if (var34.isEnabled()) {
var34.log("Missing root interaction: %d, %s, %s", var3, InventoryComponent.getItemInHand(this.commandBuffer, var1), var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else {
RootInteraction var33 = RootInteraction.getRootInteractionOrUnknown(var32);
if (var33 == null) {
class="kw">return false;
}
if (var33.getOperationMax() == 0) {
((HytaleLogger.Api)LOGGER.atWarning()).log("Root interaction '%s' has no operations, cancelling chain %d (%s)", var32, var3, var4);
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
if (!this.applyRules(var5, var2.data, var4, var33)) {
class="kw">return false;
}
InventoryComponent.Hotbar var35 = this.commandBuffer.getComponent(var1, InventoryComponent.Hotbar.getComponentType());
if (var35 == null) {
class="kw">return false;
}
InventoryComponent.Utility var9 = this.commandBuffer.getComponent(var1, InventoryComponent.Utility.getComponentType());
if (var9 == null) {
class="kw">return false;
}
ItemStack var10 = var35.getActiveItem();
ItemStack var11 = var9.getActiveItem();
String var12 = var10 != null ? var10.getItemId() : null;
String var13 = var11 != null ? var11.getItemId() : null;
byte var14 = var35.getActiveSlot();
byte var15 = var9.getActiveSlot();
if (var2.activeHotbarSlot != var14) {
HytaleLogger.Api var40 = LOGGER.at(Level.FINE);
if (var40.isEnabled()) {
var40.log("Active slot miss match: %d, %d != %d, %s, %s, %s", var3, var14, var2.activeHotbarSlot, var12, var2.itemInHandId, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
if (this.playerRef != null) {
this.playerRef.getPacketHandler().writeNoCache(new SetActiveSlot(-1, var14));
}
class="kw">return true;
} else if (var2.activeUtilitySlot != var15) {
HytaleLogger.Api var39 = LOGGER.at(Level.FINE);
if (var39.isEnabled()) {
var39.log("Active slot miss match: %d, %d != %d, %s, %s, %s", var3, var15, var2.activeUtilitySlot, var12, var2.itemInHandId, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
if (this.playerRef != null) {
this.playerRef.getPacketHandler().writeNoCache(new SetActiveSlot(-5, var15));
}
class="kw">return true;
} else if (!Objects.equals(var12, var2.itemInHandId)) {
HytaleLogger.Api var38 = LOGGER.at(Level.FINE);
if (var38.isEnabled()) {
var38.log("ItemInHand miss match: %d, %s, %s, %s", var3, var12, var2.itemInHandId, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else if (!Objects.equals(var13, var2.utilityItemId)) {
HytaleLogger.Api var37 = LOGGER.at(Level.FINE);
if (var37.isEnabled()) {
var37.log("UtilityItem miss match: %d, %s, %s, %s", var3, var13, var2.utilityItemId, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
} else {
if (this.isOnCooldown(var1, var4, var33, true)) {
class="kw">return false;
}
InteractionChain var16 = this.initChain(var2.data, var4, var5, var33, null, true);
var16.setChainId(var3);
this.sync(var1, var16, var2);
World var17 = this.commandBuffer.getExternalData().getWorld();
if (var2.data.blockPosition != null) {
ChunkStore var18 = var17.getChunkStore();
BlockPosition var19 = var2.data.blockPosition;
Ref var20 = var18.getChunkSectionReferenceAtBlock(var19.x, var19.y, var19.z);
if (var20 == null || !var20.isValid()) {
HytaleLogger.Api var44 = LOGGER.at(Level.FINE);
if (var44.isEnabled()) {
var44.log("Unloaded section interacted with: %d, %s", var3, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
BlockSection var21 = var18.getStore().getComponent(var20, BlockSection.getComponentType());
if (var21 == null) {
HytaleLogger.Api var45 = LOGGER.at(Level.FINE);
if (var45.isEnabled()) {
var45.log("Unloaded section interacted with: %d, %s", var3, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
int var22 = var21.getFiller(var19.x, var19.y, var19.z);
if (var22 != 0) {
var19 = new BlockPosition(
var19.x - FillerBlockUtil.unpackX(var22), var19.y - FillerBlockUtil.unpackY(var22), var19.z - FillerBlockUtil.unpackZ(var22)
);
}
var5.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK, var19);
var5.getMetaStore().putMetaObject(Interaction.TARGET_BLOCK_RAW, var2.data.blockPosition);
if (!var2.data.blockPosition.equals(var19)) {
BlockSection var24 = var21;
if (!ChunkUtil.isSameChunkSection(
var19.x, var19.y, var19.z, var2.data.blockPosition.x, var2.data.blockPosition.y, var2.data.blockPosition.z
)) {
Ref var23 = var18.getChunkSectionReferenceAtBlock(var19.x, var19.y, var19.z);
if (var23 == null || !var23.isValid()) {
HytaleLogger.Api var47 = LOGGER.at(Level.FINE);
if (var47.isEnabled()) {
var47.log("Unloaded section interacted with: %d, %s", var3, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
var24 = var18.getStore().getComponent(var23, BlockSection.getComponentType());
if (var24 == null) {
HytaleLogger.Api var46 = LOGGER.at(Level.FINE);
if (var46.isEnabled()) {
var46.log("Unloaded section interacted with: %d, %s", var3, var4);
}
this.sendCancelPacket(var3, var2.forkedId);
class="kw">return true;
}
}
int var25 = var24.get(var19.x, var19.y, var19.z);
int var26 = var21.get(var2.data.blockPosition.x, var2.data.blockPosition.y, var2.data.blockPosition.z);
if (var25 != var26) {
int var27 = 1036;
if (var25 != 0) {
var27 |= 16;
}
BlockOperations.setBlock(
var18, var20, var2.data.blockPosition.x, var2.data.blockPosition.y, var2.data.blockPosition.z, 0, BlockType.EMPTY, 0, 0, var27
);
}
}
}
if (var2.data.entityId >= 0) {
EntityStore var41 = var17.getEntityStore();
Ref var43 = var41.getRefFromNetworkId(var2.data.entityId);
if (var43 != null) {
var5.getMetaStore().putMetaObject(Interaction.TARGET_ENTITY, var43);
}
}
if (var2.data.targetSlot != Integer.MIN_VALUE) {
var5.getMetaStore().putMetaObject(Interaction.TARGET_SLOT, var2.data.targetSlot);
}
if (var2.data.hitLocation != null) {
Vector3fc var42 = var2.data.hitLocation;
var5.getMetaStore().putMetaObject(Interaction.HIT_LOCATION, new Vector4d(var42.x(), var42.y(), var42.z(), 1.0));
}
if (var2.data.hitDetail != null) {
var5.getMetaStore().putMetaObject(Interaction.HIT_DETAIL, var2.data.hitDetail);
}
this.lastClientChainId = var3;
if (!this.tickChain(var16)) {
var16.setPreTicked(true);
this.chains.put(var3, var16);
}
class="kw">return true;
}
}
}
}
}
class="kw">public void sync(@Nonnull Ref<EntityStore> var1, @Nonnull ChainSyncStorage var2, @Nonnull SyncInteractionChain var3) {
assert this.commandBuffer != null;
if (var3.newForks != null) {
for (SyncInteractionChain var7 : var3.newForks) {
var2.syncFork(var1, this, var7);
}
}
if (var3.interactionData == null) {
var2.setClientState(var3.state);
} else {
for (int var12 = 0; var12 < var3.interactionData.length; var12++) {
InteractionSyncData var14 = var3.interactionData[var12];
if (var14 != null) {
int var15 = var3.operationBaseIndex + var12;
if (!var2.isSyncDataOutOfOrder(var15)) {
InteractionEntry var16 = var2.getInteraction(var15);
if (var16 != null && var2 class="kw">instanceof InteractionChain var8) {
if (var16.getClientState() != null
&& var16.getClientState().state != InteractionState.NotFinished
&& var14.state == InteractionState.NotFinished
|| !var16.setClientState(var14)) {
var2.clearInteractionSyncData(var15);
var16.flagDesync();
var8.flagDesync();
class="kw">return;
}
var2.updateSyncPosition(var15);
HytaleLogger.Api var9 = LOGGER.at(Level.FINEST);
if (var9.isEnabled()) {
TimeResource var10 = this.commandBuffer.getResource(TimeResource.getResourceType());
float var11 = var10.getTimeDilationModifier();
var9.log(
"%d, %d: Time (Sync) - Server: %s vs Client: %s",
var3.chainId,
var15,
var16.getTimeInSeconds(this.currentTime) * var11,
var16.getClientState().progress
);
}
this.removeInteractionIfFinished(var1, var8, var16);
} else {
var2.putInteractionSyncData(var15, var14);
}
}
}
}
int var13 = var3.operationBaseIndex + var3.interactionData.length;
var2.clearInteractionSyncData(var13);
var2.setClientState(var3.state);
}
}
class="kw">public boolean canRun(@Nonnull InteractionType var1, @Nonnull RootInteraction var2) {
class="kw">return this.canRun(var1, (short)-1, var2);
}
class="kw">public boolean canRun(@Nonnull InteractionType var1, short var2, @Nonnull RootInteraction var3) {
class="kw">return applyRules(null, var1, var2, var3, this.chains, null);
}
class="kw">public boolean applyRules(@Nonnull InteractionContext var1, @Nonnull InteractionChainData var2, @Nonnull InteractionType var3, @Nonnull RootInteraction var4) {
List var5 = new ObjectArrayList();
if (!applyRules(var2, var3, var1.getHeldItemSlot(), var4, this.chains, var5)) {
class="kw">return false;
}
for (InteractionChain var7 : var5) {
this.cancelChains(var7);
}
class="kw">return true;
}
class="kw">public void cancelChains(@Nonnull InteractionChain var1) {
var1.setServerState(InteractionState.Failed);
var1.setClientState(InteractionState.Failed);
this.sendCancelPacket(var1);
ObjectIterator var2 = var1.getForkedChains().values().iterator();
while (var2.hasNext()) {
InteractionChain var3 = (InteractionChain)var2.next();
this.cancelChains(var3);
}
}
class="kw">private class="kw">static boolean applyRules(
@Nullable InteractionChainData var0,
@Nonnull InteractionType var1,
int var2,
@Nullable RootInteraction var3,
@Nonnull Map<?, InteractionChain> var4,
@Nullable List<InteractionChain> var5
) {
if (!var4.isEmpty() && var3 != null) {
for (InteractionChain var7 : var4.values()) {
if ((var7.getForkedChainId() == null || var7.isPredicted())
&& (var0 == null || Objects.equals(var7.getChainData().proxyId, var0.proxyId))
&& (var1 != InteractionType.Equipped || var7.getType() != InteractionType.Equipped || var7.getContext().getHeldItemSlot() == var2)) {
if (var7.getServerState() == InteractionState.NotFinished) {
RootInteraction var8 = var7.getRootInteraction();
Operation var9 = var8.getOperation(var7.getOperationCounter());
if (var3.getRules().validateInterrupts(var1, var3.getData().getTags(), var7.getType(), var8.getData().getTags(), var8.getRules())) {
if (var5 != null) {
var5.add(var7);
}
} else if (var9 != null
&& var9.getRules() != null
&& var3.getRules().validateInterrupts(var1, var3.getData().getTags(), var7.getType(), var9.getTags(), var9.getRules())) {
if (var5 != null) {
var5.add(var7);
}
} else {
if (var3.getRules().validateBlocked(var1, var3.getData().getTags(), var7.getType(), var8.getData().getTags(), var8.getRules())) {
class="kw">return false;
}
if (var9 != null
&& var9.getRules() != null
&& var3.getRules().validateBlocked(var1, var3.getData().getTags(), var7.getType(), var9.getTags(), var9.getRules())) {
class="kw">return false;
}
}
}
if ((var5 == null || var5.isEmpty()) && !applyRules(var0, var1, var2, var3, var7.getForkedChains(), var5)) {
class="kw">return false;
}
}
}
class="kw">return true;
} else {
class="kw">return true;
}
}
class="kw">public boolean tryStartChain(
@Nonnull Ref<EntityStore> var1,
@Nonnull CommandBuffer<EntityStore> var2,
@Nonnull InteractionType var3,
@Nonnull InteractionContext var4,
@Nonnull RootInteraction var5
) {
InteractionChain var6 = this.initChain(var3, var4, var5, false);
if (!this.applyRules(var4, var6.getChainData(), var3, var5)) {
class="kw">return false;
}
this.executeChain(var1, var2, var6);
class="kw">return true;
}
class="kw">public void startChain(
@Nonnull Ref<EntityStore> var1,
@Nonnull CommandBuffer<EntityStore> var2,
@Nonnull InteractionType var3,
@Nonnull InteractionContext var4,
@Nonnull RootInteraction var5
) {
InteractionChain var6 = this.initChain(var3, var4, var5, false);
this.executeChain(var1, var2, var6);
}
@Nonnull
class="kw">public InteractionChain initChain(@Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nonnull RootInteraction var3, boolean var4) {
class="kw">return this.initChain(var1, var2, var3, -1, null, var4);
}
@Nonnull
class="kw">public InteractionChain initChain(
@Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nonnull RootInteraction var3, int var4, @Nullable BlockPosition var5, boolean var6
) {
InteractionChainData var7 = new InteractionChainData(var4, UUIDUtil.EMPTY_UUID, null, null, var5, Integer.MIN_VALUE, null);
class="kw">return this.initChain(var7, var1, var2, var3, null, var6);
}
@Nonnull
class="kw">public InteractionChain initChain(
@Nonnull InteractionChainData var1,
@Nonnull InteractionType var2,
@Nonnull InteractionContext var3,
@Nonnull RootInteraction var4,
@Nullable Runnable var5,
boolean var6
) {
class="kw">return new InteractionChain(var2, var3, var1, var4, var5, var6 || !this.hasRemoteClient);
}
class="kw">public void queueExecuteChain(@Nonnull InteractionChain var1) {
this.chainStartQueue.add(var1);
}
class="kw">public void executeChain(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionChain var3) {
this.commandBuffer = var2;
this.ref = var1;
this.executeChain0(var1, var3);
this.ref = null;
this.commandBuffer = null;
}
class="kw">private void executeChain0(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionChain var2) {
if (this.isOnCooldown(var1, var2.getType(), var2.getInitialRootInteraction(), false)) {
var2.setServerState(InteractionState.Failed);
var2.setClientState(InteractionState.Failed);
} else {
int var3 = --this.lastServerChainId;
if (var3 >= 0) {
var3 = this.lastServerChainId = -1;
}
var2.setChainId(var3);
if (!this.tickChain(var2)) {
LOGGER.at(Level.FINE).log("Add Chain: %d, %s", var3, var2);
var2.setPreTicked(true);
this.chains.put(var3, var2);
}
}
}
class="kw">private boolean isOnCooldown(@Nonnull Ref<EntityStore> var1, @Nonnull InteractionType var2, @Nonnull RootInteraction var3, boolean var4) {
assert this.commandBuffer != null;
InteractionCooldown var5 = var3.getCooldown();
String var6 = var3.getId();
float var7 = InteractionTypeUtils.getDefaultCooldown(var2);
float[] var8 = DEFAULT_CHARGE_TIMES;
boolean var9 = false;
if (var5 != null) {
var7 = var5.cooldown;
if (var5.chargeTimes != null && var5.chargeTimes.length > 0) {
var8 = var5.chargeTimes;
}
if (var5.cooldownId != null) {
var6 = var5.cooldownId;
}
if (var5.interruptRecharge) {
var9 = true;
}
if (var5.clickBypass && var4) {
this.cooldownHandler.resetCooldown(var6, var7, var8, var9);
class="kw">return false;
}
}
Player var10 = this.commandBuffer.getComponent(var1, Player.getComponentType());
GameMode var11 = var10 != null ? var10.getGameMode() : GameMode.Adventure;
RootInteractionSettings var12 = var3.getSettings().get(var11);
if (var12 != null) {
var5 = var12.cooldown;
if (var5 != null) {
var7 = var5.cooldown;
if (var5.chargeTimes != null && var5.chargeTimes.length > 0) {
var8 = var5.chargeTimes;
}
if (var5.cooldownId != null) {
var6 = var5.cooldownId;
}
if (var5.interruptRecharge) {
var9 = true;
}
if (var5.clickBypass && var4) {
this.cooldownHandler.resetCooldown(var6, var7, var8, var9);
class="kw">return false;
}
}
if (var12.allowSkipChainOnClick && var4) {
this.cooldownHandler.resetCooldown(var6, var7, var8, var9);
class="kw">return false;
}
}
class="kw">return this.cooldownHandler.isOnCooldown(var3, var6, var7, var8, var9);
}
class="kw">public void tryRunHeldInteraction(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionType var3) {
this.tryRunHeldInteraction(var1, var2, var3, (short)-1);
}
class="kw">public void tryRunHeldInteraction(@Nonnull Ref<EntityStore> var1, @Nonnull CommandBuffer<EntityStore> var2, @Nonnull InteractionType var3, short var4) {
ItemStack var5 = null;
var5 = class="kw">switch (var3) {
case Held -> InventoryComponent.getItemInHand(var2, var1);
case HeldOffhand -> {
InventoryComponent.Utility var9 = var2.getComponent(var1, InventoryComponent.Utility.getComponentType());
if (var9 != null) {
yield var9.getActiveItem();
}
}
case Equipped -> {
if (var4 == -1) {
throw new IllegalArgumentException();
}
InventoryComponent.Armor var6 = var2.getComponent(var1, InventoryComponent.Armor.getComponentType());
if (var6 != null) {
yield var6.getInventory().getItemStack(var4);
}
}
class="kw">default -> throw new IllegalArgumentException();
};
if (var5 != null && !var5.isEmpty()) {
String var10 = var5.getItem().getInteractions().get(var3);
if (var10 != null) {
RootInteraction var7 = RootInteraction.getAssetMap().getAsset(var10);
if (var7 != null && this.canRun(var3, var4, var7)) {
InteractionContext var8 = InteractionContext.forInteraction(this, var1, var3, var4, var2);
this.startChain(var1, var2, var3, var8, var7);
}
}
}
}
class="kw">public void sendSyncPacket(@Nonnull InteractionChain var1, int var2, @Nullable List<InteractionSyncData> var3) {
if (!var1.hasSentInitial() || var3 != null && !ListUtil.emptyOrAllNull(var3) || !var1.getNewForks().isEmpty()) {
if (this.playerRef != null) {
SyncInteractionChain var4 = makeSyncPacket(var1, var2, var3);
this.syncPackets.add(var4);
}
}
}
@Nonnull
class="kw">private class="kw">static SyncInteractionChain makeSyncPacket(@Nonnull InteractionChain var0, int var1, @Nullable List<InteractionSyncData> var2) {
SyncInteractionChain[] var3 = null;
List var4 = var0.getNewForks();
if (!var4.isEmpty()) {
var3 = new SyncInteractionChain[var4.size()];
for (int var5 = 0; var5 < var4.size(); var5++) {
InteractionChain var6 = var4.get(var5);
var3[var5] = makeSyncPacket(var6, 0, null);
}
var4.clear();
}
SyncInteractionChain var7 = new SyncInteractionChain(
0,
0,
0,
null,
null,
null,
!var0.hasSentInitial(),
false,
var0.hasSentInitial() ? Integer.MIN_VALUE : RootInteraction.getRootInteractionIdOrUnknown(var0.getInitialRootInteraction().getId()),
var0.getType(),
var0.getContext().getHeldItemSlot(),
var0.getChainId(),
var0.getForkedChainId(),
var0.getChainData(),
var0.getServerState(),
var3,
var1,
var2 == null ? null : var2.toArray(InteractionSyncData[]::new)
);
var0.setSentInitial(true);
class="kw">return var7;
}
class="kw">private void sendCancelPacket(@Nonnull InteractionChain var1) {
this.sendCancelPacket(var1.getChainId(), var1.getForkedChainId());
}
class="kw">public void sendCancelPacket(int var1, ForkedChainId var2) {
if (this.playerRef != null) {
this.playerRef.getPacketHandler().writeNoCache(new CancelInteractionChain(var1, var2));
}
}
class="kw">public void clear() {
this.forEachInteraction((var1, var2, var3) -> {
var1.setServerState(InteractionState.Failed);
var1.setClientState(InteractionState.Failed);
this.sendCancelPacket(var1);
class="kw">return null;
}, null);
this.chainStartQueue.clear();
}
class="kw">public void clearAllGlobalTimeShift(float var1) {
if (this.timeShiftsDirty) {
boolean var2 = true;
for (int var3 = 0; var3 < this.globalTimeShift.length; var3++) {
if (!this.globalTimeShiftDirty[var3]) {
this.globalTimeShift[var3] = 0.0F;
} else {
var2 = false;
this.globalTimeShift[var3] = this.globalTimeShift[var3] + var1;
}
}
Arrays.fill(this.globalTimeShiftDirty, false);
if (var2) {
this.timeShiftsDirty = false;
}
}
}
class="kw">public void setGlobalTimeShift(@Nonnull InteractionType var1, float var2) {
if (var2 < 0.0F) {
throw new IllegalArgumentException("Can't shift backwards");
}
this.globalTimeShift[var1.ordinal()] = var2;
this.globalTimeShiftDirty[var1.ordinal()] = true;
this.timeShiftsDirty = true;
}
class="kw">public float getGlobalTimeShift(@Nonnull InteractionType var1) {
class="kw">return this.globalTimeShift[var1.ordinal()];
}
class="kw">public <T> T forEachInteraction(@Nonnull TriFunction<InteractionChain, Interaction, T, T> var1, T var2) {
class="kw">return forEachInteraction(this.chains, var1, var2);
}
class="kw">private class="kw">static <T> T forEachInteraction(@Nonnull Map<?, InteractionChain> var0, @Nonnull TriFunction<InteractionChain, Interaction, T, T> var1, T var2) {
if (var0.isEmpty()) {
class="kw">return var2;
}
for (InteractionChain var4 : var0.values()) {
Operation var5 = var4.getRootInteraction().getOperation(var4.getOperationCounter());
if (var5 != null && var5.getInnerOperation() class="kw">instanceof Interaction var6) {
var2 = var1.apply(var4, var6, var2);
}
var2 = forEachInteraction(var4.getForkedChains(), var1, var2);
}
class="kw">return var2;
}
class="kw">public void walkChain(@Nonnull Ref<EntityStore> var1, @Nonnull Collector var2, @Nonnull InteractionType var3, @Nonnull ComponentAccessor<EntityStore> var4) {
this.walkChain(var1, var2, var3, null, var4);
}
class="kw">public void walkChain(
@Nonnull Ref<EntityStore> var1,
@Nonnull Collector var2,
@Nonnull InteractionType var3,
@Nullable RootInteraction var4,
@Nonnull ComponentAccessor<EntityStore> var5
) {
walkChain(var2, var3, InteractionContext.forInteraction(this, var1, var3, var5), var4);
}
class="kw">public class="kw">static void walkChain(@Nonnull Collector var0, @Nonnull InteractionType var1, @Nonnull InteractionContext var2, @Nullable RootInteraction var3) {
if (var3 == null) {
String var4 = var2.getRootInteractionId(var1);
if (var4 == null) {
throw new IllegalArgumentException("No interaction ID found for " + var1 + ", " + var2);
}
var3 = RootInteraction.getAssetMap().getAsset(var4);
}
if (var3 == null) {
throw new IllegalArgumentException("No interactions are defined for " + var1 + ", " + var2);
}
var0.start();
var0.into(var2, null);
walkInteractions(var0, var2, CollectorTag.ROOT, var3.getInteractionIds());
var0.outof();
var0.finished();
}
class="kw">public class="kw">static boolean walkInteractions(@Nonnull Collector var0, @Nonnull InteractionContext var1, @Nonnull CollectorTag var2, @Nonnull String[] var3) {
for (String var7 : var3) {
if (walkInteraction(var0, var1, var2, var7)) {
class="kw">return true;
}
}
class="kw">return false;
}
class="kw">public class="kw">static boolean walkInteraction(@Nonnull Collector var0, @Nonnull InteractionContext var1, @Nonnull CollectorTag var2, @Nullable String var3) {
if (var3 == null) {
class="kw">return false;
}
Interaction var4 = Interaction.getAssetMap().getAsset(var3);
if (var4 == null) {
throw new IllegalArgumentException("Failed to find interaction: " + var3);
}
if (var0.collect(var2, var1, var4)) {
class="kw">return true;
}
var0.into(var1, var4);
var4.walk(var0, var1);
var0.outof();
class="kw">return false;
}
class="kw">public ObjectList<SyncInteractionChain> getSyncPackets() {
class="kw">return this.syncPackets;
}
@Nonnull
@Override
class="kw">public Component<EntityStore> clone() {
InteractionManager var1 = new InteractionManager(this.playerRef, this.interactionSimulationHandler);
var1.copyFrom(this);
class="kw">return var1;
}
class="kw">public class="kw">static class ChainCancelledException class="kw">extends RuntimeException {
@Nonnull
class="kw">private class="kw">final InteractionState state;
class="kw">public ChainCancelledException(@Nonnull InteractionState var1) {
this.state = var1;
}
}
}