aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/kr/syeyoung/dungeonsguide/dungeon/data/OffsetPoint.java
blob: 36317878218d1cd77d89e3594901c0fa928adb11 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 *     Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
 *     Copyright (C) 2021  cyoung06
 *
 *     This program is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU Affero General Public License as published
 *     by the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 *
 *     This program is distributed in the hope that it will be useful,
 *     but WITHOUT ANY WARRANTY; without even the implied warranty of
 *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *     GNU Affero General Public License for more details.
 *
 *     You should have received a copy of the GNU Affero General Public License
 *     along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package kr.syeyoung.dungeonsguide.dungeon.data;

import kr.syeyoung.dungeonsguide.dungeon.roomfinder.DungeonRoom;
import kr.syeyoung.dungeonsguide.utils.VectorUtils;
import lombok.AllArgsConstructor;
import lombok.Data;
import net.minecraft.block.Block;
import net.minecraft.util.BlockPos;
import net.minecraft.util.Vec3;

import javax.vecmath.Vector2d;
import java.io.Serializable;

@Data
@AllArgsConstructor
public class OffsetPoint implements Cloneable, Serializable {
    private static final long serialVersionUID = 3102336358774967540L;

    private int x;
    private int y;
    private int z;

    public OffsetPoint(DungeonRoom dungeonRoom, BlockPos pos) {
        setPosInWorld(dungeonRoom, pos);
    }
    public OffsetPoint(DungeonRoom dungeonRoom, Vec3 pos) {
        setPosInWorld(dungeonRoom, new BlockPos((int)pos.xCoord, (int)pos.yCoord, (int)pos.zCoord));
    }


    public void setPosInWorld(DungeonRoom dungeonRoom, BlockPos pos) {
        Vector2d vector2d = new Vector2d(pos.getX() - dungeonRoom.getMin().getX(), pos.getZ() - dungeonRoom.getMin().getZ());
        for (int i = 0; i < dungeonRoom.getRoomMatcher().getRotation(); i++) {
            vector2d = VectorUtils.rotateClockwise(vector2d);
            if (i % 2 == 0) {
                vector2d.x += dungeonRoom.getDungeonRoomInfo().getBlocks()[0].length - 1; // + Z
            } else {
                vector2d.x += dungeonRoom.getDungeonRoomInfo().getBlocks().length - 1; // + X
            }
        }

        this.x = (int) vector2d.x;
        this.z = (int) vector2d.y;
        this.y = pos.getY()-dungeonRoom.getMin().getY();
    }

    public BlockPos toRotatedRelBlockPos(DungeonRoom dungeonRoom) {
        int rot = dungeonRoom.getRoomMatcher().getRotation();
        Vector2d rot2 = new Vector2d(x,z);
        for (int i = 0; i < dungeonRoom.getRoomMatcher().getRotation(); i++) {
            rot2 = VectorUtils.rotateCounterClockwise(rot2);
            if (i % 2 == 0) {
                rot2.y += dungeonRoom.getMax().getZ() - dungeonRoom.getMin().getZ() + 1; // + Z
            } else {
                rot2.y += dungeonRoom.getMax().getX() - dungeonRoom.getMin().getX() + 1; // + X
            }
        }

        return new BlockPos(rot2.x, y, rot2.y);
    }

    public Block getBlock(DungeonRoom dungeonRoom) {
        BlockPos relBp = toRotatedRelBlockPos(dungeonRoom);

        Block b = dungeonRoom.getRelativeBlockAt(relBp.getX(), relBp.getY(), relBp.getZ());
        return b;
    }
    public BlockPos getBlockPos(DungeonRoom dungeonRoom) {
        BlockPos relBp = toRotatedRelBlockPos(dungeonRoom);
        return dungeonRoom.getRelativeBlockPosAt(relBp.getX(), relBp.getY(), relBp.getZ());
    }

    public int getData(DungeonRoom dungeonRoom) {
        BlockPos relBp = toRotatedRelBlockPos(dungeonRoom);

        int b = dungeonRoom.getRelativeBlockDataAt(relBp.getX(), relBp.getY(), relBp.getZ());
        return b;
    }

    @Override
    public Object clone() throws CloneNotSupportedException {
        return new OffsetPoint(x,y,z);
    }

    @Override
    public String toString() {
        return "OffsetPoint{x=" + x +
                ", y=" + y +
                ", z=" + z +
                '}';
    }
}