Skip to content

Commit

Permalink
Fix collision issues and properly implement tags
Browse files Browse the repository at this point in the history
  • Loading branch information
AlexProgrammerDE committed Feb 27, 2024
1 parent 25c5ff9 commit 48e6491
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 87 deletions.
30 changes: 18 additions & 12 deletions src/main/java/com/soulfiremc/server/plugins/POVServer.java
Expand Up @@ -54,6 +54,7 @@
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundChangeDifficultyPacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundLoginPacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundPlayerInfoUpdatePacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundRespawnPacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundStartConfigurationPacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundSystemChatPacket;
import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundTabListPacket;
Expand Down Expand Up @@ -433,14 +434,25 @@ private void syncBotAndUser() {
session.send(
new ClientboundRegistryDataPacket(MinecraftProtocol.loadNetworkCodec()));
var tagsPacket = new ClientboundUpdateTagsPacket();
tagsPacket.getTags().putAll(sessionDataManager.tagsState().exportTagData());
tagsPacket.getTags().putAll(sessionDataManager.tagsState().exportTags());

session.send(new ClientboundFinishConfigurationPacket());
awaitReceived(ServerboundFinishConfigurationPacket.class);

((MinecraftProtocol) session.getPacketProtocol())
.setState(ProtocolState.GAME);

var spawnInfo =
new PlayerSpawnInfo(
sessionDataManager.currentDimension().dimensionType(),
sessionDataManager.currentDimension().worldName(),
sessionDataManager.currentDimension().hashedSeed(),
sessionDataManager.gameMode(),
sessionDataManager.previousGameMode(),
sessionDataManager.currentDimension().debug(),
sessionDataManager.currentDimension().flat(),
sessionDataManager.lastDeathPos(),
sessionDataManager.portalCooldown());
session.send(
new ClientboundLoginPacket(
sessionDataManager.clientEntity().entityId(),
Expand All @@ -452,16 +464,8 @@ private void syncBotAndUser() {
sessionDataManager.clientEntity().showReducedDebug(),
sessionDataManager.enableRespawnScreen(),
sessionDataManager.doLimitedCrafting(),
new PlayerSpawnInfo(
sessionDataManager.currentDimension().dimensionType(),
sessionDataManager.currentDimension().worldName(),
sessionDataManager.currentDimension().hashedSeed(),
sessionDataManager.gameMode(),
sessionDataManager.previousGameMode(),
sessionDataManager.currentDimension().debug(),
sessionDataManager.currentDimension().flat(),
null,
0)));
spawnInfo));
session.send(new ClientboundRespawnPacket(spawnInfo, false, false));

if (sessionDataManager.difficultyData() != null) {
session.send(
Expand All @@ -481,7 +485,9 @@ private void syncBotAndUser() {
sessionDataManager.abilitiesData().walkSpeed()));
}

session.send(new ClientboundGameEventPacket(GameEvent.CHANGE_GAMEMODE, sessionDataManager.gameMode()));
session.send(
new ClientboundGameEventPacket(
GameEvent.CHANGE_GAMEMODE, sessionDataManager.gameMode()));

if (sessionDataManager.borderState() != null) {
session.send(
Expand Down
Expand Up @@ -205,6 +205,7 @@ public final class SessionDataManager {
private int serverViewDistance = -1;
private int serverSimulationDistance = -1;
private @Nullable GlobalPos lastDeathPos;
private int portalCooldown = -1;
private @Nullable DifficultyData difficultyData;
private @Nullable AbilitiesData abilitiesData;
private @Nullable DefaultSpawnData defaultSpawnData;
Expand Down Expand Up @@ -297,6 +298,7 @@ private void processSpawnInfo(PlayerSpawnInfo spawnInfo) {
gameMode = spawnInfo.getGameMode();
previousGameMode = spawnInfo.getPreviousGamemode();
lastDeathPos = spawnInfo.getLastDeathPos();
portalCooldown = spawnInfo.getPortalCooldown();
}

@EventHandler
Expand Down Expand Up @@ -1150,8 +1152,8 @@ public void tick() {
borderState.tick();
}

// Tick item cooldowns
tickCoolDowns();
// Tick cooldowns
tickCooldowns();

var tickHookState = TickHookContext.INSTANCE.get();

Expand All @@ -1165,7 +1167,11 @@ public void tick() {
tickHookState.callHooks(TickHookContext.HookType.POST_ENTITY_TICK);
}

private void tickCoolDowns() {
private void tickCooldowns() {
if (portalCooldown > 0) {
portalCooldown--;
}

synchronized (itemCoolDowns) {
var iterator = itemCoolDowns.int2IntEntrySet().iterator();
while (iterator.hasNext()) {
Expand Down
102 changes: 30 additions & 72 deletions src/main/java/com/soulfiremc/server/protocol/bot/state/TagsState.java
Expand Up @@ -20,96 +20,54 @@
import com.soulfiremc.server.data.BlockType;
import com.soulfiremc.server.data.EntityType;
import com.soulfiremc.server.data.ItemType;
import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
import it.unimi.dsi.fastutil.ints.IntSet;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import lombok.Getter;

@Getter
public class TagsState {
private final Map<String, Set<BlockType>> blockTags = new Object2ObjectOpenHashMap<>();
private final Map<String, Set<ItemType>> itemTags = new Object2ObjectOpenHashMap<>();
private final Map<String, Set<EntityType>> entityTags = new Object2ObjectOpenHashMap<>();
private final Map<String, Map<String, IntSet>> tags = new Object2ObjectOpenHashMap<>();

public void handleTagData(Map<String, Map<String, int[]>> tags) {
for (var registry : tags.entrySet()) {
var registryKey = registry.getKey();

switch (registryKey) {
case "minecraft:block" -> handleBlocks(registry.getValue());
case "minecraft:item" -> handleItems(registry.getValue());
case "minecraft:entity_type" -> handleEntities(registry.getValue());
}
// Ignore everything else, we just need these three for now
}
}

private void handleBlocks(Map<String, int[]> blocks) {
for (var block : blocks.entrySet()) {
var blockKey = block.getKey();
var blockSet =
blockTags.computeIfAbsent(blockKey, k -> new HashSet<>(block.getValue().length));

for (var i : block.getValue()) {
blockSet.add(BlockType.getById(i));
}
}
}

private void handleItems(Map<String, int[]> items) {
for (var item : items.entrySet()) {
var itemKey = item.getKey();
var itemSet = itemTags.computeIfAbsent(itemKey, k -> new HashSet<>(item.getValue().length));

for (var i : item.getValue()) {
itemSet.add(ItemType.getById(i));
}
}
}

private void handleEntities(Map<String, int[]> entities) {
for (var entity : entities.entrySet()) {
var entityKey = entity.getKey();
var entitySet =
entityTags.computeIfAbsent(entityKey, k -> new HashSet<>(entity.getValue().length));

for (var i : entity.getValue()) {
entitySet.add(EntityType.getById(i));
public void handleTagData(Map<String, Map<String, int[]>> updateTags) {
for (var entry : updateTags.entrySet()) {
var tagMap = new Object2ObjectOpenHashMap<String, IntSet>();
for (var tagEntry : entry.getValue().entrySet()) {
var set = new IntOpenHashSet(tagEntry.getValue());
tagMap.put(tagEntry.getKey(), set);
}
tags.put(entry.getKey(), tagMap);
}
}

public boolean isBlockInTag(BlockType blockType, String tagName) {
return blockTags.getOrDefault(tagName, Set.of()).contains(blockType);
return tags.getOrDefault("minecraft:block", Map.of())
.getOrDefault(tagName, IntSet.of())
.contains(blockType.id());
}

public boolean isItemInTag(ItemType itemType, String tagName) {
return itemTags.getOrDefault(tagName, Set.of()).contains(itemType);
return tags.getOrDefault("minecraft:item", Map.of())
.getOrDefault(tagName, IntSet.of())
.contains(itemType.id());
}

public boolean isEntityInTag(EntityType entityType, String tagName) {
return entityTags.getOrDefault(tagName, Set.of()).contains(entityType);
return tags.getOrDefault("minecraft:entity_type", Map.of())
.getOrDefault(tagName, IntSet.of())
.contains(entityType.id());
}

public Map<String, Map<String, int[]>> exportTagData() {
var tags = new Object2ObjectOpenHashMap<String, Map<String, int[]>>();
var blockMap = new Object2ObjectOpenHashMap<String, int[]>();
for (var block : blockTags.entrySet()) {
var blockArray = block.getValue().stream().mapToInt(BlockType::id).toArray();
blockMap.put(block.getKey(), blockArray);
}
tags.put("minecraft:block", blockMap);
var itemMap = new Object2ObjectOpenHashMap<String, int[]>();
for (var item : itemTags.entrySet()) {
var itemArray = item.getValue().stream().mapToInt(ItemType::id).toArray();
itemMap.put(item.getKey(), itemArray);
}
tags.put("minecraft:item", itemMap);
var entityMap = new Object2ObjectOpenHashMap<String, int[]>();
for (var entity : entityTags.entrySet()) {
var entityArray = entity.getValue().stream().mapToInt(EntityType::id).toArray();
entityMap.put(entity.getKey(), entityArray);
public Map<String, Map<String, int[]>> exportTags() {
var result = new Object2ObjectOpenHashMap<String, Map<String, int[]>>();
for (var entry : tags.entrySet()) {
var tagMap = new Object2ObjectOpenHashMap<String, int[]>();
for (var tagEntry : entry.getValue().entrySet()) {
tagMap.put(tagEntry.getKey(), tagEntry.getValue().toIntArray());
}
result.put(entry.getKey(), tagMap);
}
tags.put("minecraft:entity_type", entityMap);
return tags;
return result;
}
}

0 comments on commit 48e6491

Please sign in to comment.