Newer
Older
void-pack-super-server / work / decompile-ee3ecae0 / net / minecraft / server / BehaviorInteractDoor.java
package net.minecraft.server;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class BehaviorInteractDoor extends Behavior<EntityLiving> {

    public BehaviorInteractDoor() {
        super(ImmutableMap.of(MemoryModuleType.PATH, MemoryStatus.VALUE_PRESENT, MemoryModuleType.INTERACTABLE_DOORS, MemoryStatus.VALUE_PRESENT, MemoryModuleType.OPENED_DOORS, MemoryStatus.REGISTERED));
    }

    @Override
    protected void a(WorldServer worldserver, EntityLiving entityliving, long i) {
        BehaviorController<?> behaviorcontroller = entityliving.getBehaviorController();
        PathEntity pathentity = (PathEntity) behaviorcontroller.getMemory(MemoryModuleType.PATH).get();
        List<GlobalPos> list = (List) behaviorcontroller.getMemory(MemoryModuleType.INTERACTABLE_DOORS).get();
        List<BlockPosition> list1 = (List) pathentity.d().stream().map((pathpoint) -> {
            return new BlockPosition(pathpoint.a, pathpoint.b, pathpoint.c);
        }).collect(Collectors.toList());
        Set<BlockPosition> set = this.a(worldserver, list, list1);
        int j = pathentity.f() - 1;

        this.a(worldserver, list1, set, j, entityliving, behaviorcontroller);
    }

    private Set<BlockPosition> a(WorldServer worldserver, List<GlobalPos> list, List<BlockPosition> list1) {
        Stream stream = list.stream().filter((globalpos) -> {
            return globalpos.getDimensionManager() == worldserver.getWorldProvider().getDimensionManager();
        }).map(GlobalPos::getBlockPosition);

        list1.getClass();
        return (Set) stream.filter(list1::contains).collect(Collectors.toSet());
    }

    private void a(WorldServer worldserver, List<BlockPosition> list, Set<BlockPosition> set, int i, EntityLiving entityliving, BehaviorController<?> behaviorcontroller) {
        set.forEach((blockposition) -> {
            int j = list.indexOf(blockposition);
            IBlockData iblockdata = worldserver.getType(blockposition);
            Block block = iblockdata.getBlock();

            if (TagsBlock.WOODEN_DOORS.isTagged(block) && block instanceof BlockDoor) {
                boolean flag = j >= i;

                ((BlockDoor) block).setDoor(worldserver, blockposition, flag);
                GlobalPos globalpos = GlobalPos.create(worldserver.getWorldProvider().getDimensionManager(), blockposition);

                if (!behaviorcontroller.getMemory(MemoryModuleType.OPENED_DOORS).isPresent() && flag) {
                    behaviorcontroller.setMemory(MemoryModuleType.OPENED_DOORS, (Object) Sets.newHashSet(new GlobalPos[]{globalpos}));
                } else {
                    behaviorcontroller.getMemory(MemoryModuleType.OPENED_DOORS).ifPresent((set1) -> {
                        if (flag) {
                            set1.add(globalpos);
                        } else {
                            set1.remove(globalpos);
                        }

                    });
                }
            }

        });
        a(worldserver, list, i, entityliving, behaviorcontroller);
    }

    public static void a(WorldServer worldserver, List<BlockPosition> list, int i, EntityLiving entityliving, BehaviorController<?> behaviorcontroller) {
        behaviorcontroller.getMemory(MemoryModuleType.OPENED_DOORS).ifPresent((set) -> {
            Iterator iterator = set.iterator();

            while (iterator.hasNext()) {
                GlobalPos globalpos = (GlobalPos) iterator.next();
                BlockPosition blockposition = globalpos.getBlockPosition();
                int j = list.indexOf(blockposition);

                if (worldserver.getWorldProvider().getDimensionManager() != globalpos.getDimensionManager()) {
                    iterator.remove();
                } else {
                    IBlockData iblockdata = worldserver.getType(blockposition);
                    Block block = iblockdata.getBlock();

                    if (TagsBlock.WOODEN_DOORS.isTagged(block) && block instanceof BlockDoor && j < i && blockposition.a((IPosition) entityliving.getPositionVector(), 4.0D)) {
                        ((BlockDoor) block).setDoor(worldserver, blockposition, false);
                        iterator.remove();
                    }
                }
            }

        });
    }
}