ShadowNinja
2014-03-31 179364ff8f6e6b7e0361b0b5a85a51d463644515
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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
 
 
local S
if intllib then
    S = intllib.Getter()
else
    S = function(s) return s end
end
 
local chest_mark_colors = {
    {"black", S("Black")},
    {"blue", S("Blue")},
    {"brown", S("Brown")},
    {"cyan", S("Byan")},
    {"dark_green", S("Dark Green")},
    {"dark_grey", S("Dark Grey")},
    {"green", S("Green")},
    {"grey", S("Grey")},
    {"magenta", S("Magenta")},
    {"orange", S("Orange")},
    {"pink", S("Pink")},
    {"red", S("Red")},
    {"violet", S("Violet")},
    {"white", S("White")},
    {"yellow", S("Yellow")},
}
 
 
local function colorid_to_postfix(id)
    return chest_mark_colors[id] and "_"..chest_mark_colors[id][1] or ""
end
 
 
local function get_color_buttons()
    local buttons_string = ""
    for y = 0, 3 do
        for x = 0, 3 do
            local file_name = "technic_colorbutton"..(y * 4 + x)..".png"
            buttons_string = buttons_string.."image_button["
                ..(8.1 + x * 0.7)..","..(6.1 + y * 0.7)
                ..";0.8,0.8;"..file_name..";color_button"
                ..(y * 4 + x + 1)..";]"
        end
    end
    return buttons_string
end
 
 
local function check_color_buttons(pos, meta, chest_name, fields)
    for i = 1, 16 do
        if fields["color_button"..i] then
            technic.swap_node(pos, chest_name..colorid_to_postfix(i))
            meta:set_string("color", i)
            return
        end
    end
end
 
 
local function get_receive_fields(name, data)
    if not data.infotext and not data.color then
        return nil
    end
    local lname = name:lower()
    return function(pos, formname, fields, sender)
        local meta = minetest.get_meta(pos)
        local node = minetest.get_node(pos)
        local page = "main"
        if fields.edit_infotext then
            page = "edit_infotext"
        end
        if fields.save_infotext then
            meta:set_string("infotext", fields.infotext_box)
        end
        local formspec = data.formspec
        local formspec_infotext = minetest.formspec_escape(meta:get_string("infotext"))
        if page == "main" and data.infotext then
            formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
                    .."technic_pencil_icon.png;edit_infotext;]"
                    .."label[3,0;"..formspec_infotext.."]"
        end
        if page == "edit_infotext" then
            formspec = formspec.."image_button[2.1,0.1;0.8,0.8;"
                    .."technic_checkmark_icon.png;save_infotext;]"
                    .."field[3.3,0.2;4.8,1;"
                    .."infotext_box;"..S("Edit chest description:")..";"
                    ..formspec_infotext.."]"
        end
        if data.color then
            -- This sets the node
            local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"
            check_color_buttons(pos, meta, nn, fields)
            local colorID = meta:get_int("color")
            local colorName
            if chest_mark_colors[colorID] then
                colorName = chest_mark_colors[colorID][2]
            else
                colorName = S("None")
            end
            formspec = formspec.."label[8.2,9;"..S("Color Filter: %s"):format(colorName).."]"
        end
        meta:set_string("formspec", formspec)
    end
end
 
 
function technic.chests:register(name, data)
    local lname = name:lower()
    name = S(name)
 
    local width = math.max(data.color and 11 or 8, data.width)
 
    local locked_after_place = nil
    local front = {"technic_"..lname.."_chest_front.png"}
    data.formspec = "invsize["..width..",10;]"..
            "label[0,0;"..name.." Chest]"..
            "list[current_name;main;0,1;"..width..",4;]"..
            "list[current_player;main;0,6;8,4;]"..
            "background[-0.19,-0.25;"..width..".4,10.75;ui_form_bg.png]"..
            "background[0,1;"..width..",4;technic_"..lname.."_chest_inventory.png]"..
            "background[0,6;8,4;ui_main_inventory.png]"
    if data.color then
        data.formspec = data.formspec..get_color_buttons()
    end
 
    if data.locked then
        locked_after_place = function(pos, placer)
            local meta = minetest.get_meta(pos)
            meta:set_string("owner", placer:get_player_name() or "")
            meta:set_string("infotext",
                    S("%s Locked Chest (owned by %s)")
                    :format(name, meta:get_string("owner")))
        end
        table.insert(front, "technic_"..lname.."_chest_lock_overlay.png")
    end
 
    local desc
    if data.locked then
        desc = S("%s Locked Chest"):format(name)
    else
        desc = S("%s Chest"):format(name)
    end
 
    local def = {
        description = desc,
        tiles = {"technic_"..lname.."_chest_top.png", "technic_"..lname.."_chest_top.png",
            "technic_"..lname.."_chest_side.png", "technic_"..lname.."_chest_side.png",
            "technic_"..lname.."_chest_side.png", table.concat(front, "^")},
        paramtype2 = "facedir",
        groups = self.groups,
        tube = self.tube,
        legacy_facedir_simple = true,
        sounds = default.node_sound_wood_defaults(),
        after_place_node = locked_after_place,
        on_construct = function(pos)
            local meta = minetest.get_meta(pos)
            meta:set_string("formspec", data.formspec
                ..(data.color and "label[8.2,9;Color Filter: None" or "")
                ..(data.infotext and "image_button[2.1,0.1;0.8,0.8;"
                    .."technic_pencil_icon.png;edit_infotext;]" or ""))
            meta:set_string("infotext", S("%s Chest"):format(name))
            local inv = meta:get_inventory()
            inv:set_size("main", data.width * 4)
        end,
        can_dig = self.can_dig,
        on_receive_fields = get_receive_fields(name, data),
        on_metadata_inventory_move = self.on_inv_move,
        on_metadata_inventory_put = self.on_inv_put,
        on_metadata_inventory_take = self.on_inv_take,
    }
    if data.locked then
        def.allow_metadata_inventory_move = self.inv_move
        def.allow_metadata_inventory_put = self.inv_put
        def.allow_metadata_inventory_take = self.inv_take
    end
 
    local nn = "technic:"..lname..(data.locked and "_locked" or "").."_chest"
 
    minetest.register_node(":"..nn, def)
 
    if data.color then
        front[3] = front[2]
        for i = 1, 15 do
            local postfix = colorid_to_postfix(i)
            local colordef = {}
            for k, v in pairs(def) do
                colordef[k] = v
            end
            colordef.drop = nn
            colordef.groups = self.groups_noinv
            front[2] = "technic_chest_overlay"..postfix..".png"
            colordef.tiles[6] = table.concat(front, "^")
            minetest.register_node(":"..nn..postfix, colordef)
        end
    end
 
end