summaryrefslogtreecommitdiffstats
path: root/src/main/java/net/minecraft/server/ItemBlock.java
blob: dfe188bf07cd9fa3716155823b320914122c3394 (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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
package net.minecraft.server;

// CraftBukkit start
import org.bukkit.craftbukkit.block.CraftBlockState;
import org.bukkit.craftbukkit.event.CraftEventFactory;
import org.bukkit.event.block.BlockPlaceEvent;
// CraftBukkit end

public class ItemBlock extends Item {

    private int id;

    public ItemBlock(int i) {
        super(i);
        this.id = i + 256;
        this.d(Block.byId[i + 256].a(2));
    }

    public int a() {
        return this.id;
    }

    public boolean a(ItemStack itemstack, EntityHuman entityhuman, World world, int i, int j, int k, int l) {
        int clickedX = i, clickedY = j, clickedZ = k; // CraftBukkit
        int i1 = world.getTypeId(i, j, k);

        if (i1 == Block.SNOW.id) {
            l = 0;
        } else if (i1 != Block.VINE.id) {
            if (l == 0) {
                --j;
            }

            if (l == 1) {
                ++j;
            }

            if (l == 2) {
                --k;
            }

            if (l == 3) {
                ++k;
            }

            if (l == 4) {
                --i;
            }

            if (l == 5) {
                ++i;
            }
        }

        if (itemstack.count == 0) {
            return false;
        } else if (!entityhuman.d(i, j, k)) {
            return false;
        } else if (j == world.height - 1 && Block.byId[this.id].material.isBuildable()) {
            return false;
        } else if (world.mayPlace(this.id, i, j, k, false, l)) {
            Block block = Block.byId[this.id];

            // CraftBukkit start - This executes the placement of the block
            CraftBlockState replacedBlockState = CraftBlockState.getBlockState(world, i, j, k);

            // There are like 30 combinations you can mix and match steps and double steps
            // of different materials, so there are a lot of different cases of what
            // would happen if you place x step onto another y step, so let's just keep
            // track of the entire state
            CraftBlockState blockStateBelow = null;
            // Toggles whether the normal or the block below is used for the place event
            boolean eventUseBlockBelow = false;
            if ((world.getTypeId(i, j - 1, k) == Block.STEP.id || world.getTypeId(i, j - 1, k) == Block.DOUBLE_STEP.id)
                    && (itemstack.id == Block.DOUBLE_STEP.id || itemstack.id == Block.STEP.id)) {
                blockStateBelow = CraftBlockState.getBlockState(world, i, j - 1, k);
                // Step is placed on step, forms a doublestep replacing the original step, so we need the lower block
                eventUseBlockBelow = itemstack.id == Block.STEP.id && blockStateBelow.getTypeId() == Block.STEP.id;
            }

            /**
            * @see net.minecraft.server.World#setTypeIdAndData(int i, int j, int k, int l, int i1)
            *
            * This replaces world.setTypeIdAndData(IIIII), we're doing this because we need to
            * hook between the 'placement' and the informing to 'world' so we can
            * sanely undo this.
            *
            * Whenever the call to 'world.setTypeIdAndData' changes we need to figure out again what to
            * replace this with.
            */
            if (world.setRawTypeIdAndData(i, j, k, this.id, this.filterData(itemstack.getData()))) { // <-- world.setTypeIdAndData does this to place the block
                // Make sure the block-rotation already gets set before we call the event
                if (Block.byId[this.id] instanceof BlockStairs) {
                    Block.byId[this.id].postPlace(world, i, j, k, entityhuman);
                }

                BlockPlaceEvent event = CraftEventFactory.callBlockPlaceEvent(world, entityhuman, eventUseBlockBelow ? blockStateBelow : replacedBlockState, clickedX, clickedY, clickedZ, block);

                if (event.isCancelled() || !event.canBuild()) {
                    if (blockStateBelow != null) { // Used for steps
                        world.setTypeIdAndData(i, j, k, replacedBlockState.getTypeId(), replacedBlockState.getRawData());
                        world.setTypeIdAndData(i, j - 1, k, blockStateBelow.getTypeId(), blockStateBelow.getRawData());

                    } else {

                        if (this.id == Block.ICE.id) {
                            // Ice will explode if we set straight to 0
                            world.setTypeId(i, j, k, 20);
                        }

                        world.setTypeIdAndData(i, j, k, replacedBlockState.getTypeId(), replacedBlockState.getRawData());
                    }
                    return true;

                }
                world.update(i, j, k, this.id); // <-- world.setTypeIdAndData does this on success (tell the world)

                // CraftBukkit end

                if (world.getTypeId(i, j, k) == this.id) {
                    Block.byId[this.id].postPlace(world, i, j, k, l);
                    Block.byId[this.id].postPlace(world, i, j, k, entityhuman);
                }

                world.makeSound((double) ((float) i + 0.5F), (double) ((float) j + 0.5F), (double) ((float) k + 0.5F), block.stepSound.getName(), (block.stepSound.getVolume1() + 1.0F) / 2.0F, block.stepSound.getVolume2() * 0.8F);
                --itemstack.count;
            }

            return true;
        } else {
            return false;
        }
    }

    public String a(ItemStack itemstack) {
        return Block.byId[this.id].n();
    }

    public String getName() {
        return Block.byId[this.id].n();
    }
}