mirror of
https://github.com/GeyserMC/Geyser.git
synced 2024-08-14 23:57:35 +00:00
Player effect cache cleanup
Only cache effects and not their values unless we actually use the value.
This commit is contained in:
parent
ce748990a4
commit
ac17963baa
5 changed files with 352 additions and 322 deletions
|
@ -26,29 +26,53 @@
|
||||||
package org.geysermc.connector.network.session.cache;
|
package org.geysermc.connector.network.session.cache;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
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;
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.EnumSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class EntityEffectCache {
|
public class EntityEffectCache {
|
||||||
|
/**
|
||||||
|
* Used to clear effects on dimension switch.
|
||||||
|
*/
|
||||||
@Getter
|
@Getter
|
||||||
private final Object2IntMap<Effect> entityEffects = new Object2IntOpenHashMap<>();
|
private final Set<Effect> entityEffects = EnumSet.noneOf(Effect.class);
|
||||||
|
|
||||||
public void addEffect(Effect effect, int effectAmplifier) {
|
/* Used to track mining speed */
|
||||||
if (effect != null) {
|
@Getter
|
||||||
entityEffects.putIfAbsent(effect, effectAmplifier + 1);
|
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) {
|
public void removeEffect(Effect effect) {
|
||||||
if (entityEffects.containsKey(effect)) {
|
switch (effect) {
|
||||||
int effectLevel = entityEffects.getInt(effect);
|
case CONDUIT_POWER:
|
||||||
entityEffects.remove(effect, effectLevel);
|
conduitPower = 0;
|
||||||
|
break;
|
||||||
|
case FASTER_DIG:
|
||||||
|
haste = 0;
|
||||||
|
break;
|
||||||
|
case SLOWER_DIG:
|
||||||
|
miningFatigue = 0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
entityEffects.remove(effect);
|
||||||
|
|
||||||
public int getEffectLevel(Effect effect) {
|
|
||||||
return entityEffects.getOrDefault(effect, 0);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,10 +38,12 @@ public class JavaEntityEffectTranslator extends PacketTranslator<ServerEntityEff
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(ServerEntityEffectPacket packet, GeyserSession session) {
|
public void translate(ServerEntityEffectPacket packet, GeyserSession session) {
|
||||||
Entity entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
|
Entity entity;
|
||||||
if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) {
|
if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) {
|
||||||
entity = session.getPlayerEntity();
|
entity = session.getPlayerEntity();
|
||||||
session.getEffectCache().addEffect(packet.getEffect(), packet.getAmplifier());
|
session.getEffectCache().setEffect(packet.getEffect(), packet.getAmplifier());
|
||||||
|
} else {
|
||||||
|
entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
|
||||||
}
|
}
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -38,10 +38,12 @@ public class JavaEntityRemoveEffectTranslator extends PacketTranslator<ServerEnt
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void translate(ServerEntityRemoveEffectPacket packet, GeyserSession session) {
|
public void translate(ServerEntityRemoveEffectPacket packet, GeyserSession session) {
|
||||||
Entity entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
|
Entity entity;
|
||||||
if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) {
|
if (packet.getEntityId() == session.getPlayerEntity().getEntityId()) {
|
||||||
entity = session.getPlayerEntity();
|
entity = session.getPlayerEntity();
|
||||||
session.getEffectCache().removeEffect(packet.getEffect());
|
session.getEffectCache().removeEffect(packet.getEffect());
|
||||||
|
} else {
|
||||||
|
entity = session.getEntityCache().getEntityByJavaId(packet.getEntityId());
|
||||||
}
|
}
|
||||||
if (entity == null)
|
if (entity == null)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
package org.geysermc.connector.utils;
|
package org.geysermc.connector.utils;
|
||||||
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
|
import com.github.steveice10.mc.protocol.data.game.entity.metadata.Position;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
import com.nukkitx.math.vector.Vector3i;
|
import com.nukkitx.math.vector.Vector3i;
|
||||||
|
@ -171,8 +170,8 @@ public class BlockUtils {
|
||||||
false, false);
|
false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
hasteLevel = Math.max(session.getEffectCache().getEffectLevel(Effect.FASTER_DIG), session.getEffectCache().getEffectLevel(Effect.CONDUIT_POWER));
|
hasteLevel = Math.max(session.getEffectCache().getHaste(), session.getEffectCache().getConduitPower());
|
||||||
miningFatigueLevel = session.getEffectCache().getEffectLevel(Effect.SLOWER_DIG);
|
miningFatigueLevel = session.getEffectCache().getMiningFatigue();
|
||||||
|
|
||||||
boolean isInWater = session.getCollisionManager().isPlayerInWater();
|
boolean isInWater = session.getCollisionManager().isPlayerInWater();
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@ package org.geysermc.connector.utils;
|
||||||
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
import com.github.steveice10.mc.protocol.data.game.entity.Effect;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
import com.github.steveice10.opennbt.tag.builtin.CompoundTag;
|
||||||
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
import com.github.steveice10.opennbt.tag.builtin.StringTag;
|
||||||
import com.nukkitx.math.vector.Vector3i;
|
import com.nukkitx.math.vector.Vector3f;
|
||||||
import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket;
|
import com.nukkitx.protocol.bedrock.packet.ChangeDimensionPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.MobEffectPacket;
|
import com.nukkitx.protocol.bedrock.packet.MobEffectPacket;
|
||||||
import com.nukkitx.protocol.bedrock.packet.StopSoundPacket;
|
import com.nukkitx.protocol.bedrock.packet.StopSoundPacket;
|
||||||
|
@ -36,6 +36,8 @@ import org.geysermc.connector.GeyserConnector;
|
||||||
import org.geysermc.connector.entity.Entity;
|
import org.geysermc.connector.entity.Entity;
|
||||||
import org.geysermc.connector.network.session.GeyserSession;
|
import org.geysermc.connector.network.session.GeyserSession;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
public class DimensionUtils {
|
public class DimensionUtils {
|
||||||
|
|
||||||
// Changes if the above-bedrock Nether building workaround is applied
|
// Changes if the above-bedrock Nether building workaround is applied
|
||||||
|
@ -63,27 +65,28 @@ public class DimensionUtils {
|
||||||
session.getLecternCache().clear();
|
session.getLecternCache().clear();
|
||||||
session.getSkullCache().clear();
|
session.getSkullCache().clear();
|
||||||
|
|
||||||
Vector3i pos = Vector3i.from(0, Short.MAX_VALUE, 0);
|
Vector3f pos = Vector3f.from(0, Short.MAX_VALUE, 0);
|
||||||
|
|
||||||
ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket();
|
ChangeDimensionPacket changeDimensionPacket = new ChangeDimensionPacket();
|
||||||
changeDimensionPacket.setDimension(bedrockDimension);
|
changeDimensionPacket.setDimension(bedrockDimension);
|
||||||
changeDimensionPacket.setRespawn(true);
|
changeDimensionPacket.setRespawn(true);
|
||||||
changeDimensionPacket.setPosition(pos.toFloat());
|
changeDimensionPacket.setPosition(pos);
|
||||||
session.sendUpstreamPacket(changeDimensionPacket);
|
session.sendUpstreamPacket(changeDimensionPacket);
|
||||||
session.setDimension(javaDimension);
|
session.setDimension(javaDimension);
|
||||||
player.setPosition(pos.toFloat());
|
player.setPosition(pos);
|
||||||
session.setSpawned(false);
|
session.setSpawned(false);
|
||||||
session.setLastChunkPosition(null);
|
session.setLastChunkPosition(null);
|
||||||
|
|
||||||
for (Effect effect : session.getEffectCache().getEntityEffects().keySet()) {
|
Set<Effect> entityEffects = session.getEffectCache().getEntityEffects();
|
||||||
|
for (Effect effect : entityEffects) {
|
||||||
MobEffectPacket mobEffectPacket = new MobEffectPacket();
|
MobEffectPacket mobEffectPacket = new MobEffectPacket();
|
||||||
mobEffectPacket.setEvent(MobEffectPacket.Event.REMOVE);
|
mobEffectPacket.setEvent(MobEffectPacket.Event.REMOVE);
|
||||||
mobEffectPacket.setRuntimeEntityId(session.getPlayerEntity().getGeyserId());
|
mobEffectPacket.setRuntimeEntityId(player.getGeyserId());
|
||||||
mobEffectPacket.setEffectId(EntityUtils.toBedrockEffectId(effect));
|
mobEffectPacket.setEffectId(EntityUtils.toBedrockEffectId(effect));
|
||||||
session.sendUpstreamPacket(mobEffectPacket);
|
session.sendUpstreamPacket(mobEffectPacket);
|
||||||
}
|
}
|
||||||
// Effects are re-sent from server
|
// Effects are re-sent from server
|
||||||
session.getEffectCache().getEntityEffects().clear();
|
entityEffects.clear();
|
||||||
|
|
||||||
//let java server handle portal travel sound
|
//let java server handle portal travel sound
|
||||||
StopSoundPacket stopSoundPacket = new StopSoundPacket();
|
StopSoundPacket stopSoundPacket = new StopSoundPacket();
|
||||||
|
|
Loading…
Reference in a new issue