From ac17963baa98917141206f63bc4d4778cbc4179e Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 16 Aug 2021 11:53:56 -0400 Subject: [PATCH] Player effect cache cleanup Only cache effects and not their values unless we actually use the value. --- .../session/cache/EntityEffectCache.java | 132 +++-- .../entity/JavaEntityEffectTranslator.java | 6 +- .../JavaEntityRemoveEffectTranslator.java | 4 +- .../geysermc/connector/utils/BlockUtils.java | 515 +++++++++--------- .../connector/utils/DimensionUtils.java | 17 +- 5 files changed, 352 insertions(+), 322 deletions(-) diff --git a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityEffectCache.java b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityEffectCache.java index 1edcc4db0..7cf296be2 100644 --- a/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityEffectCache.java +++ b/connector/src/main/java/org/geysermc/connector/network/session/cache/EntityEffectCache.java @@ -1,54 +1,78 @@ -/* - * Copyright (c) 2019-2021 GeyserMC. http://geysermc.org - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * @author GeyserMC - * @link https://github.com/GeyserMC/Geyser - */ - -package org.geysermc.connector.network.session.cache; - -import com.github.steveice10.mc.protocol.data.game.entity.Effect; -import it.unimi.dsi.fastutil.objects.Object2IntMap; -import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import lombok.Getter; - -public class EntityEffectCache { - - @Getter - private final Object2IntMap entityEffects = new Object2IntOpenHashMap<>(); - - public void addEffect(Effect effect, int effectAmplifier) { - if (effect != null) { - entityEffects.putIfAbsent(effect, effectAmplifier + 1); - } - } - - public void removeEffect(Effect effect) { - if (entityEffects.containsKey(effect)) { - int effectLevel = entityEffects.getInt(effect); - entityEffects.remove(effect, effectLevel); - } - } - - public int getEffectLevel(Effect effect) { - return entityEffects.getOrDefault(effect, 0); - } -} +/* + * Copyright (c) 2019-2021 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + */ + +package org.geysermc.connector.network.session.cache; + +import com.github.steveice10.mc.protocol.data.game.entity.Effect; +import lombok.Getter; + +import java.util.EnumSet; +import java.util.Set; + +public class EntityEffectCache { + /** + * Used to clear effects on dimension switch. + */ + @Getter + private final Set entityEffects = EnumSet.noneOf(Effect.class); + + /* Used to track mining speed */ + @Getter + private int conduitPower; + @Getter + private int haste; + @Getter + private int miningFatigue; + + public void setEffect(Effect effect, int effectAmplifier) { + switch (effect) { + case CONDUIT_POWER: + conduitPower = effectAmplifier + 1; + break; + case FASTER_DIG: + haste = effectAmplifier + 1; + break; + case SLOWER_DIG: + miningFatigue = effectAmplifier + 1; + break; + } + entityEffects.add(effect); + } + + public void removeEffect(Effect effect) { + switch (effect) { + case CONDUIT_POWER: + conduitPower = 0; + break; + case FASTER_DIG: + haste = 0; + break; + case SLOWER_DIG: + miningFatigue = 0; + break; + } + entityEffects.remove(effect); + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityEffectTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityEffectTranslator.java index ff7e5de1b..627b3f2e9 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityEffectTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/entity/JavaEntityEffectTranslator.java @@ -38,10 +38,12 @@ public class JavaEntityEffectTranslator extends PacketTranslator entityEffects = session.getEffectCache().getEntityEffects(); + for (Effect effect : entityEffects) { MobEffectPacket mobEffectPacket = new MobEffectPacket(); mobEffectPacket.setEvent(MobEffectPacket.Event.REMOVE); - mobEffectPacket.setRuntimeEntityId(session.getPlayerEntity().getGeyserId()); + mobEffectPacket.setRuntimeEntityId(player.getGeyserId()); mobEffectPacket.setEffectId(EntityUtils.toBedrockEffectId(effect)); session.sendUpstreamPacket(mobEffectPacket); } // Effects are re-sent from server - session.getEffectCache().getEntityEffects().clear(); + entityEffects.clear(); //let java server handle portal travel sound StopSoundPacket stopSoundPacket = new StopSoundPacket();