diff --git a/mods/CORE/mcl_mapgen/init.lua b/mods/CORE/mcl_mapgen/init.lua index 0edaffc38..d751e9eb4 100644 --- a/mods/CORE/mcl_mapgen/init.lua +++ b/mods/CORE/mcl_mapgen/init.lua @@ -30,6 +30,7 @@ mcl_mapgen.LAST_BLOCK = mcl_mapgen.CS - 1 mcl_mapgen.LAST_NODE_IN_BLOCK = mcl_mapgen.BS - 1 mcl_mapgen.LAST_NODE_IN_CHUNK = mcl_mapgen.CS_NODES - 1 mcl_mapgen.HALF_CS_NODES = math_floor(mcl_mapgen.CS_NODES / 2) +mcl_mapgen.HALF_BS = math_floor(mcl_mapgen.BS / 2) mcl_mapgen.CS_3D = mcl_mapgen.CS^3 mcl_mapgen.CHUNK_WITH_SHELL = mcl_mapgen.CS + 2 mcl_mapgen.CHUNK_WITH_SHELL_3D = mcl_mapgen.CHUNK_WITH_SHELL^3 @@ -166,40 +167,38 @@ local function is_chunk_finished(minp) return true end -local function unsigned(v) - if v < 0 then - v = 0x100000000 - (math.abs(v) % 0x100000000) +local function uint32_t(v) + if v >= 0 then + return v % 0x100000000 end - return v % 0x100000000 + return 0x100000000 - (math.abs(v) % 0x100000000) end -local function bitwise_xor_32(a, b) - local a = unsigned(a) - local b = unsigned(b) - local c = 0 - for n = 31, 0, -1 do - local mask = math.floor(2^n) - if (a >= mask) ~= (b >= mask) then - c = c + mask - end - a = a % mask - b = b % mask - end - return c +local function get_block_seed(pos, current_seed) + local current_seed = current_seed or uint32_t(tonumber(seed)) + return uint32_t(uint32_t(23 * pos.x) + uint32_t(42123 * pos.y) + uint32_t(38134234 * pos.z) + current_seed) end -local function getBlockSeed2(pos, seed) - local seed = seed or mcl_mapgen.seed - local n = unsigned(unsigned(1619 * pos.x) + unsigned(31337 * pos.y) + unsigned(52591 * pos.z) + unsigned(1013 * seed)) - n = bitwise_xor_32(math.floor(n / 0x2000), n) - return unsigned((n * unsigned(n * n * 60493 + 19990303) + 1376312589)) +local function get_block_seed2(pos, current_seed) + local current_seed = current_seed or uint32_t(tonumber(seed)) + local n = uint32_t(uint32_t(1619 * pos.x) + uint32_t(31337 * pos.y) + uint32_t(52591 * pos.z) + uint32_t(1013 * current_seed)) + n = bit.bxor(bit.rshift(n, 13), n) + local seed = uint32_t((n * uint32_t(n * n * 60493 + 19990303) + 1376312589)) + return seed +end + +local function get_block_seed3(pos, current_seed) + local current_seed = uint32_t(current_seed or uint32_t(tonumber(seed))) + local x = uint32_t((pos.x + 32768) * 13) + local y = uint32_t((pos.y + 32767) * 13873) + local z = uint32_t((pos.z + 76705) * 115249) + local seed = uint32_t(bit.bxor(current_seed, x, y, z)) + return seed end minetest.register_on_generated(function(minp, maxp, chunkseed) local minp, maxp, chunkseed = minp, maxp, chunkseed local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") - minetest_log("action", "[mcl_mapgen] New_chunk=" .. minetest_pos_to_string(minp) .. "..." .. minetest_pos_to_string(maxp) .. ", shell=" .. minetest_pos_to_string(emin) .. "..." .. minetest_pos_to_string(emax) .. ", chunkseed=" .. tostring(chunkseed)) - data = vm:get_data(lvm_buffer) area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) vm_context = { @@ -256,10 +255,10 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) end local number_of_blocks = 0 for k, offset in pairs(ready_blocks) do - if queue_blocks_lvm_counter > 0 then + if queue_blocks_lvm_counter > 0 or nodes_block > 0 then local block_minp = p0 + vector.multiply(offset, BS) local block_maxp = vector.add(block_minp, LAST_NODE_IN_BLOCK) - local blockseed = getBlockSeed2(block_minp) + local blockseed = get_block_seed3(block_minp) vm_context.minp, vm_context.maxp, vm_context.blockseed = block_minp, block_maxp, blockseed -- -- -- mcl_mapgen.register_mapgen_block_lvm(function(vm_context), order_number) -- @@ -268,7 +267,7 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) v.callback_function(vm_context) end if nodes_block > 0 then - current_blocks[#current_blocks + 1] = { minp = block_minp, maxp = block_maxp, seed = blockseed } + current_blocks[#current_blocks + 1] = { minp = block_minp, maxp = block_maxp, blockseed = blockseed } end end number_of_blocks = number_of_blocks + 1 @@ -306,7 +305,7 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) for i, chunk_minp in pairs(current_chunks) do local chunk_maxp = vector.add(chunk_minp, LAST_NODE_IN_CHUNK) - local chunkseed = getBlockSeed2(chunk_minp) + local current_chunk_seed = get_block_seed3(vector.subtract(chunk_minp, BS)) area = VoxelArea:new({MinEdge=minp, MaxEdge=maxp}) vm_context = { data = data, @@ -320,7 +319,7 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) emax = chunk_maxp, minp = chunk_minp, maxp = chunk_maxp, - chunkseed = chunkseedseed, + chunkseed = current_chunk_seed, } -- -- -- mcl_mapgen.register_mapgen_lvm(function(vm_context), order_number) -- @@ -332,7 +331,7 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) -- mcl_mapgen.register_mapgen(function(minp, maxp, chunkseed, vm_context), order_number) -- -- -- for _, v in pairs(queue_chunks_nodes) do - v.f(chunk_minp, chunk_maxp, chunkseed, vm_context) + v.f(chunk_minp, chunk_maxp, current_chunk_seed, vm_context) end if vm_context.write or vm_context.write_param2 or vm_context.write_light then if vm_context.write then @@ -353,12 +352,12 @@ minetest.register_on_generated(function(minp, maxp, chunkseed) end end - for i, b in pairs(current_blocks) do + for _, b in pairs(current_blocks) do -- -- -- mcl_mapgen.register_mapgen_block(function(minp, maxp, blockseed), order_number) -- -- -- for _, v in pairs(queue_blocks_nodes) do - v.f(b.minp, b.maxp, b.seed) + v.f(b.minp, b.maxp, b.blockseed) end end end) diff --git a/mods/ITEMS/mcl_amethyst/geode.lua b/mods/ITEMS/mcl_amethyst/geode.lua new file mode 100644 index 000000000..cefcfbb8a --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/geode.lua @@ -0,0 +1,93 @@ +local radius_min = 3 +local radius_max = mcl_mapgen.HALF_BS +local layers = { + { + [8] = "mcl_blackstone:basalt_polished", + [92] = "mcl_deepslate:deepslate", + }, + { + [100] = "mcl_amethyst:calcite", + }, + { + [85] = "mcl_amethyst:amethyst_block", + [15] = "mcl_amethyst:budding_amethyst_block", + }, + { + [98] = "mcl_amethyst:amethyst_block", + [2] = "mcl_amethyst:budding_amethyst_block", + }, + { + [100] = "air", + } +} + +local function round(v) + if v < 0 then + return math.ceil(v - 0.5) + end + return math.floor(v + 0.5) +end + +local function place(pos, rotation, pr) + local radius1 = vector.new( + -pr:next(radius_min, radius_max), + -pr:next(radius_min, radius_max), + -pr:next(radius_min, radius_max) + ) + local radius2 = vector.new( + pr:next(radius_min, radius_max), + pr:next(radius_min, radius_max), + pr:next(radius_min, radius_max) + ) + local layer_radius = pr:next(radius_min, radius_max) + local radius1_normalized = vector.normalize(radius1) + local radius2_normalized = vector.normalize(radius2) + local pos = vector.subtract(pos, radius1) + for x = radius1.x, radius2.x do + local max_x = (x < 0) and radius1.x or radius2.x + for y = radius1.y, radius2.y do + local max_y = (y < 0) and radius1.y or radius2.y + for z = radius1.z, radius2.z do + local max_z = (z < 0) and radius1.z or radius2.z + local normal_abs = vector.new(x / max_x, y / max_y, z / max_z) + local inverted_layer = round(vector.length(normal_abs) * layer_radius) + if inverted_layer <= layer_radius then + local layer = math.min(math.max(1, layer_radius - inverted_layer + 1), #layers) + local offset = vector.new(x, y, z) + local node_pos = pos + offset + local node_candidates = layers[layer] + local node_name + local chance_index = pr:next(1, 100) + local current_weight = 0 + for chance, node_name_iterated in pairs(node_candidates) do + if chance_index <= current_weight + chance then + node_name = node_name_iterated + break + end + current_weight = current_weight + chance + end + minetest.swap_node(node_pos, {name = node_name}) + end + end + end + end +end + +mcl_structures.register_structure({ + name = "amethyst_geode", + place_function = place, +}) + +local decrease_scan_area = 1 +local mapblock_opacity_placement_threshold = 0.98 +local threshold = math.floor(((mcl_mapgen.BS - 2 * decrease_scan_area)^3) * mapblock_opacity_placement_threshold) +local upper_than = mcl_mapgen.overworld.bedrock_max +mcl_mapgen.register_mapgen_block(function(minp, maxp, blockseed) + local y = minp.y + if y <= upper_than then return end + local pr = PseudoRandom(blockseed + 143) + if pr:next(1, 120) ~= 54 then return end + local opacity_counter = #minetest.find_nodes_in_area(vector.add(minp, decrease_scan_area), vector.subtract(maxp, decrease_scan_area), "group:opaque") + if opacity_counter < threshold then return end + place(minp, nil, pr) +end) diff --git a/mods/ITEMS/mcl_amethyst/grow.lua b/mods/ITEMS/mcl_amethyst/grow.lua new file mode 100644 index 000000000..97d379ba2 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/grow.lua @@ -0,0 +1,54 @@ +local S = minetest.get_translator(minetest.get_current_modname()) + +local interval = 10 +local chance = 5 + +local function grow(pos, node) + local def = minetest.registered_nodes[node.name] + local next_gen = def._mcl_amethyst_next_grade + if not next_gen then return end + + local dir = minetest.wallmounted_to_dir(node.param2) + local ba_pos = vector.add(pos, dir) + local ba_node = minetest.get_node(ba_pos) + if ba_node.name ~= "mcl_amethyst:budding_amethyst_block" then return end + + local swap_result = table.copy(node) + swap_result.name = next_gen + minetest.swap_node(pos, swap_result) +end + +minetest.register_abm({ + label = "Amethyst Bud Growth", + nodenames = {"group:amethyst_buds"}, + neighbors = {"mcl_amethyst:budding_amethyst_block"}, + interval = interval, + chance = chance, + action = grow, +}) + +local all_directions = { + vector.new(1,0,0), + vector.new(0,1,0), + vector.new(0,0,1), + vector.new(-1,0,0), + vector.new(0,-1,0), + vector.new(0,0,-1), +} + +minetest.register_abm({ + label = "Spawn Amethyst Bud", + nodenames = {"mcl_amethyst:budding_amethyst_block"}, + neighbors = {"air", "group:water"}, + interval = 20, + chance = 2, + action = function(pos) + local check_pos = vector.add(all_directions[math.random(1, #all_directions)], pos) + local check_node = minetest.get_node(check_pos) + local check_node_name = check_node.name + if check_node_name ~= "air" and minetest.get_item_group(check_node_name, "water") == 0 then return end + local param2 = minetest.dir_to_wallmounted(vector.subtract(pos, check_pos)) + local new_node = {name = "mcl_amethyst:medium_amethyst_bud", param2 = param2} + minetest.swap_node(check_pos, new_node) + end, +}) diff --git a/mods/ITEMS/mcl_amethyst/init.lua b/mods/ITEMS/mcl_amethyst/init.lua new file mode 100644 index 000000000..d3bead7f2 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/init.lua @@ -0,0 +1,234 @@ +local S = minetest.get_translator(minetest.get_current_modname()) +local modname = minetest.get_current_modname() +local modpath = minetest.get_modpath(modname) +mcl_amethyst = {} + +-- Amethyst block +minetest.register_node("mcl_amethyst:amethyst_block",{ + description = S("Block of Amethyst"), + tiles = {"amethyst_block.png"}, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + groups = { + pickaxey = 1, + building_block = 1, + }, + sounds = mcl_sounds.node_sound_glass_defaults(), + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("The Block of Amethyst is a decoration block crafted from amethyst shards."), +}) + +-- Budding Amethyst block +minetest.register_node("mcl_amethyst:budding_amethyst_block",{ + description = S("Budding Amethyst"), + tiles = {"budding_amethyst.png"}, + drop = "", + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + groups = { + pickaxey = 1, + building_block = 1, + dig_by_piston = 1, + }, + sounds = mcl_sounds.node_sound_glass_defaults(), + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("The Budding Amethyst can grow amethyst"), +}) + +-- Amethyst Shard +minetest.register_craftitem("mcl_amethyst:amethyst_shard",{ + description = S("Amethyst Shard"), + inventory_image = "amethyst_shard.png", + stack_max = 64, + groups = { + craftitem = 1, + }, + _doc_items_longdesc = S("An amethyst shard is a crystalline mineral."), +}) + +-- Calcite +minetest.register_node("mcl_amethyst:calcite",{ + description = S("Calcite"), + tiles = {"calcite.png"}, + _mcl_hardness = 0.75, + _mcl_blast_resistance = 0.75, + groups = { + pickaxey = 1, + building_block = 1, + }, + sounds = mcl_sounds.node_sound_stone_defaults(), + is_ground_content = true, + stack_max = 64, + _doc_items_longdesc = S("Calcite can be found as part of amethyst geodes."), +}) + +-- Tinied Glass +minetest.register_node("mcl_amethyst:tinted_glass",{ + description = S("Tinted Glass"), + tiles = {"tinted_glass.png"}, + _mcl_hardness = 0.3, + _mcl_blast_resistance = 0.3, + drawtype = "glasslike", + use_texture_alpha = "clip", + sunlight_propagates = false, + groups = { + handy = 1, + building_block = 1, + deco_block = 1, + }, + sounds = mcl_sounds.node_sound_glass_defaults(), + is_ground_content = false, + stack_max = 64, + _doc_items_longdesc = S("Tinted Glass is a type of glass which blocks lights while it is visually transparent."), +}) + +-- Amethyst Cluster +local bud_def = { + { + size = "small", + description = S("Small Amethyst Bud"), + long_desc = S("Small Amethyst Bud is the first growth of amethyst bud."), + light_source = 3, + next_stage = "mcl_amethyst:medium_amethyst_bud", + }, + { + size = "medium", + description = S("Medium Amethyst Bud"), + long_desc = S("Medium Amethyst Bud is the second growth of amethyst bud."), + light_source = 4, + next_stage = "mcl_amethyst:large_amethyst_bud", + }, + { + size = "large", + description = S("Large Amethyst Bud"), + long_desc = S("Large Amethyst Bud is the third growth of amethyst bud."), + light_source = 5, + next_stage = "mcl_amethyst:amethyst_cluster", + }, +} +for _, def in pairs(bud_def) do + local size = def.size + local name = "mcl_amethyst:" .. size .. "_amethyst_bud" + local tile = size .. "_amethyst_bud.png" + local inventory_image = size .. "_amethyst_bud.png" + minetest.register_node(name, { + description = def.description, + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + drop = "", + tiles = {tile}, + inventory_image = inventory_image, + paramtype1 = "light", + paramtype2 = "wallmounted", + drawtype = "plantlike", + use_texture_alpha = "clip", + sunlight_propagates = true, + light_source = def.light_source, + groups = { + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + pickaxey = 1, + deco_block = 1, + amethyst_buds = 1, + attached_node = 1, + }, + selection_box = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + }, + collision_box = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + }, + _mcl_silk_touch_drop = true, + _mcl_amethyst_next_grade = def.next_stage, + _doc_items_longdesc = def.longdesc, + }) +end + +minetest.register_node("mcl_amethyst:amethyst_cluster",{ + description = "Amethyst Cluster", + _mcl_hardness = 1.5, + _mcl_blast_resistance = 1.5, + _doc_items_longdesc = S("Amethyst Cluster is the final growth of amethyst bud."), + drop = { + max_items = 1, + items = { + { + tools = {"~mcl_tools:pick_"}, + items = {"mcl_amethyst:amethyst_shard 4"}, + }, + { + items = {"mcl_amethyst:amethyst_shard 2"}, + }, + } + }, + tiles = {"amethyst_cluster.png",}, + inventory_image = "amethyst_cluster.png", + paramtype2 = "wallmounted", + drawtype = "plantlike", + paramtype1 = "light", + use_texture_alpha = "clip", + sunlight_propagates = true, + light_source = 7, + groups = { + dig_by_water = 1, + destroy_by_lava_flow = 1, + dig_by_piston = 1, + pickaxey = 1, + deco_block = 1, + attached_node = 1, + }, + selection_box = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + }, + collision_box = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + }, + _mcl_silk_touch_drop = true, +}) + +-- Register Crafts +minetest.register_craft({ + output = "mcl_amethyst:amethyst_block", + recipe = { + {"mcl_amethyst:amethyst_shard","mcl_amethyst:amethyst_shard",}, + {"mcl_amethyst:amethyst_shard","mcl_amethyst:amethyst_shard",}, + }, +}) + +minetest.register_craft({ + output = "mcl_amethyst:tinted_glass 2", + recipe = { + {"","mcl_amethyst:amethyst_shard",""}, + {"mcl_amethyst:amethyst_shard","mcl_core:glass","mcl_amethyst:amethyst_shard",}, + {"","mcl_amethyst:amethyst_shard",""}, + }, +}) + +if minetest.get_modpath("mcl_spyglass") then + minetest.clear_craft({output = "mcl_spyglass:spyglass",}) + local function craft_spyglass(ingot) + minetest.register_craft({ + output = "mcl_spyglass:spyglass", + recipe = { + {"mcl_amethyst:amethyst_shard"}, + {ingot}, + {ingot}, + } + }) + end + if minetest.get_modpath("mcl_copper") then + craft_spyglass("mcl_copper:copper_ingot") + else + craft_spyglass("mcl_core:iron_ingot") + end +end + +dofile(modpath .. "/grow.lua") +dofile(modpath .. "/geode.lua") diff --git a/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr new file mode 100644 index 000000000..9f1d0f572 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/locale/mcl_amethyst.ru.tr @@ -0,0 +1,19 @@ +# textdomain: mcl_amethyst +Amethyst Cluster=Аметистовая друза +Amethyst Cluster is the final growth of amethyst bud.=Аметистовая друза - это последняя 4-я стадия роста аметистового бутона. +Amethyst Shard=Осколок аметиста +An amethyst shard is a crystalline mineral.=Осколок аметиста - это кристаллический минерал, получаемый в результате разрушения кластеров аметиста. +Block of Amethyst=Аметистовый блок +Budding Amethyst=Растущий аметист +Calcite=Кальцит +Calcite can be found as part of amethyst geodes.=Кальцит можно найти в составе аметистовых жеод. +Large Amethyst Bud=Большой росток аметиста +Large Amethyst Bud is the third growth of amethyst bud.=Большой росток - третья стадия роста аметиста. +Medium Amethyst Bud=Средний росток аметиста +Medium Amethyst Bud is the second growth of amethyst bud.=Средний росток - вторая стадия роста аметиста. +Small Amethyst Bud=Маленький росток аметиста +Small Amethyst Bud is the first growth of amethyst bud.=Маленький росток - первая стадия роста аметиста. +The Block of Amethyst is a decoration block crafted from amethyst shards.=Блок аметиста - декоративный блок, скрафченный из осколков аметиста. +The Budding Amethyst can grow amethyst=Растущий аметист может вырастить аметист +Tinted Glass=Тонированное стекло +Tinted Glass is a type of glass which blocks lights while it is visually transparent.=Тонированное стекло блокирует свет, но визуально прозрачно. diff --git a/mods/ITEMS/mcl_amethyst/locale/template.txt b/mods/ITEMS/mcl_amethyst/locale/template.txt new file mode 100644 index 000000000..7f23e9965 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/locale/template.txt @@ -0,0 +1,19 @@ +# textdomain: mcl_amethyst +Amethyst Cluster= +Amethyst Cluster is the final growth of amethyst bud.= +Amethyst Shard= +An amethyst shard is a crystalline mineral.= +Block of Amethyst= +Budding Amethyst= +Calcite= +Calcite can be found as part of amethyst geodes.= +Large Amethyst Bud= +Large Amethyst Bud is the third growth of amethyst bud.= +Medium Amethyst Bud= +Medium Amethyst Bud is the second growth of amethyst bud.= +Small Amethyst Bud= +Small Amethyst Bud is the first growth of amethyst bud.= +The Block of Amethyst is a decoration block crafted from amethyst shards.= +The Budding Amethyst can grow amethyst= +Tinted Glass= +Tinted Glass is a type of glass which blocks lights while it is visually transparent.= diff --git a/mods/ITEMS/mcl_amethyst/mod.conf b/mods/ITEMS/mcl_amethyst/mod.conf new file mode 100644 index 000000000..2ebc1cc13 --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/mod.conf @@ -0,0 +1,5 @@ +name = mcl_amethyst +author = Emojiminetest, kay27 +description = Amethyst related stuff for MCL5 +depends = mcl_init, mcl_core, mcl_wip, mcl_mapgen, mcl_structures, mcl_blackstone, mcl_deepslate +optional_depends = mcl_spyglass, mcl_copper diff --git a/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt b/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt new file mode 100644 index 000000000..f0993b6ce --- /dev/null +++ b/mods/ITEMS/mcl_amethyst/textures/LICENSE.txt @@ -0,0 +1 @@ +Nova_Wostra Creative Commons Attribution-Share Alike 4.0 International License https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png new file mode 100644 index 000000000..bc172f2a0 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_block.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png new file mode 100644 index 000000000..1097d97b1 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png new file mode 100644 index 000000000..7ea932bf8 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_cluster_block.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png b/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png new file mode 100644 index 000000000..0d718c47a Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/amethyst_shard.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png b/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png new file mode 100644 index 000000000..6dee8ee9b Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/budding_amethyst.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/calcite.png b/mods/ITEMS/mcl_amethyst/textures/calcite.png new file mode 100644 index 000000000..48e3ce5d9 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/calcite.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png new file mode 100644 index 000000000..5c7309434 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/large_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png new file mode 100644 index 000000000..5a54f63dc Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/medium_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png b/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png new file mode 100644 index 000000000..7a414235b Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/small_amethyst_bud.png differ diff --git a/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png b/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png new file mode 100644 index 000000000..18e797789 Binary files /dev/null and b/mods/ITEMS/mcl_amethyst/textures/tinted_glass.png differ