diff --git a/glow_squid.lua b/glow_squid.lua new file mode 100644 index 0000000..68d7168 --- /dev/null +++ b/glow_squid.lua @@ -0,0 +1,65 @@ +--MCmobs v0.4 +--maikerumine +--made for MC like Survival game +--License for code WTFPL and otherwise stated in readmes + +local S = minetest.get_translator("extra_mobs") + +mobs:register_mob("extra_mobs:glow_squid",{ + type = "animal", + spawn_class = "water", + can_despawn = true, + passive = true, + hp_min = 10, + hp_max = 10, + xp_min = 1, + xp_max = 3, + armor = 100, + -- FIXME: If the qlow squid is near the floor, it turns black + collisionbox = {-0.4, 0.0, -0.4, 0.4, 0.9, 0.4}, + visual = "mesh", + mesh = "extra_mobs_glow_squid.b3d", + textures = { + {"extra_mobs_glow_squid.png"} + }, + sounds = { + damage = {name="mobs_mc_squid_hurt", gain=0.3}, + death = {name="mobs_mc_squid_death", gain=0.4}, + flop = "mobs_mc_squid_flop", + distance = 16, + }, + animation = { + stand_start = 1, + stand_end = 60, + walk_start = 1, + walk_end = 60, + run_start = 1, + run_end = 60, + }, + drops = { + {name = "extra_mobs:glow_ink_sac", + chance = 1, + min = 1, + max = 3, + looting = "common",}, + }, + visual_size = {x=3, y=3}, + makes_footstep_sound = false, + fly = true, + fly_in = { mobs_mc.items.water_source, mobs_mc.items.river_water_source }, + breathes_in_water = true, + jump = false, + view_range = 16, + runaway = true, + fear_height = 4, + glow = minetest.LIGHT_MAX, +}) + + +-- spawning + +local water = mobs_mc.spawn_height.water +mobs:spawn_specific("extra_mobs:glow_squid", mobs_mc.spawn.water, {mobs_mc.items.water_source}, 0, minetest.LIGHT_MAX+1, 30, 10000, 3, water-16, water) + +-- spawn egg +mobs:register_egg("extra_mobs:glow_squid", S("Glow Squid"), "extra_mobs_spawn_icon_glow_squid.png", 0) diff --git a/glow_squid_items.lua b/glow_squid_items.lua new file mode 100644 index 0000000..fa4dcd8 --- /dev/null +++ b/glow_squid_items.lua @@ -0,0 +1,328 @@ +local S = minetest.get_translator("extra_mobs") + +minetest.register_craftitem("extra_mobs:glow_ink_sac", { + description = S("Glow Ink Sac"), + _doc_items_longdesc = S("Use it to craft the Glow Item Frame."), + _doc_items_usagehelp = S("Use the Glow Ink Sac and the normal Item Frame to craft the Glow Item Frame."), + inventory_image = "extra_mobs_glow_ink_sac.png", + groups = { craftitem = 1 }, +}) + + +-------------------- + +--[[This mod is originally by Zeg9, but heavily modified for MineClone 2. + +Model created by 22i, licensed under the +GNU GPLv3 . + +Source: +]] + + +local VISUAL_SIZE = 0.3 + +minetest.register_entity("extra_mobs:glow_item_frame_item",{ + hp_max = 1, + visual = "wielditem", + visual_size = {x=VISUAL_SIZE, y=VISUAL_SIZE}, + physical = false, + pointable = false, + textures = { "blank.png" }, + _texture = "blank.png", + _scale = 1, + + on_activate = function(self, staticdata) + if staticdata ~= nil and staticdata ~= "" then + local data = staticdata:split(';') + if data and data[1] and data[2] then + self._nodename = data[1] + self._texture = data[2] + if data[3] then + self._scale = data[3] + else + self._scale = 1 + end + end + end + if self._texture ~= nil then + self.object:set_properties({ + textures={self._texture}, + visual_size={x=VISUAL_SIZE/self._scale, y=VISUAL_SIZE/self._scale}, + }) + end + end, + get_staticdata = function(self) + if self._nodename ~= nil and self._texture ~= nil then + local ret = self._nodename .. ';' .. self._texture + if self._scale ~= nil then + ret = ret .. ';' .. self._scale + end + return ret + end + return "" + end, + + _update_texture = function(self) + if self._texture ~= nil then + self.object:set_properties({ + textures={self._texture}, + visual_size={x=VISUAL_SIZE/self._scale, y=VISUAL_SIZE/self._scale}, + }) + end + end, +}) + + +local facedir = {} +facedir[0] = {x=0,y=0,z=1} +facedir[1] = {x=1,y=0,z=0} +facedir[2] = {x=0,y=0,z=-1} +facedir[3] = {x=-1,y=0,z=0} + +local remove_item_entity = function(pos, node) + local objs = nil + if node.name == "extra_mobs:glow_item_frame" then + objs = minetest.get_objects_inside_radius(pos, .5) + end + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "extra_mobs:glow_item_frame_item" then + obj:remove() + end + end + end +end + +local update_item_entity = function(pos, node, param2) + remove_item_entity(pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local item = inv:get_stack("main", 1) + if not item:is_empty() then + if not param2 then + param2 = node.param2 + end + if node.name == "extra_mobs:glow_item_frame" then + local posad = facedir[param2] + pos.x = pos.x + posad.x*6.5/16 + pos.y = pos.y + posad.y*6.5/16 + pos.z = pos.z + posad.z*6.5/16 + end + local e = minetest.add_entity(pos, "extra_mobs:glow_item_frame_item") + local lua = e:get_luaentity() + lua._nodename = node.name + local itemname = item:get_name() + if itemname == "" or itemname == nil then + lua._texture = "blank.png" + lua._scale = 1 + else + lua._texture = itemname + local def = minetest.registered_items[itemname] + if def and def.wield_scale then + lua._scale = def.wield_scale.x + else + lua._scale = 1 + end + end + lua:_update_texture() + if node.name == "extra_mobs:glow_item_frame" then + local yaw = math.pi*2 - param2 * math.pi/2 + e:set_yaw(yaw) + end + end +end + +local drop_item = function(pos, node, meta, clicker) + local cname = "" + if clicker and clicker:is_player() then + cname = clicker:get_player_name() + end + if node.name == "extra_mobs:glow_item_frame" and not minetest.is_creative_enabled(cname) then + local inv = meta:get_inventory() + local item = inv:get_stack("main", 1) + if not item:is_empty() then + minetest.add_item(pos, item) + end + end + meta:set_string("infotext", "") + remove_item_entity(pos, node) +end + +minetest.register_node("extra_mobs:glow_item_frame",{ + description = S("Glow Item Frame"), + _tt_help = S("Can hold an item and glows"), + _doc_items_longdesc = S("Glow Item frames are decorative blocks in which items can be placed."), + _doc_items_usagehelp = S("Just place any item on the item frame. Use the item frame again to retrieve the item."), + drawtype = "mesh", + is_ground_content = false, + mesh = "extra_mobs_glow_item_frame.obj", + selection_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, + collision_box = { type = "fixed", fixed = {-6/16, -6/16, 7/16, 6/16, 6/16, 0.5} }, + tiles = {"extra_mobs_glow_item_frame_border.png", "extra_mobs_glow_item_frame_border.png", "extra_mobs_glow_item_frame_border.png", "extra_mobs_glow_item_frame_border.png", "extra_mobs_glow_item_frame_border.png", "extra_mobs_glow_item_frame_border.png"}, + inventory_image = "extra_mobs_glow_item_frame_item.png", + wield_image = "extra_mobs_glow_item_frame.png", + paramtype = "light", + paramtype2 = "facedir", + + --FIXME: should only be glowing, no light source. How is that possible with a node? + light_source = minetest.LIGHT_MAX, + + sunlight_propagates = true, + groups = { dig_immediate=3,deco_block=1,dig_by_piston=1,container=7,attached_node_facedir=1 }, + sounds = mcl_sounds.node_sound_defaults(), + node_placement_prediction = "", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- Use pointed node's on_rightclick function first, if present + local node = minetest.get_node(pointed_thing.under) + if placer and not placer:get_player_control().sneak then + if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].on_rightclick then + return minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) or itemstack + end + end + + return minetest.item_place(itemstack, placer, pointed_thing, minetest.dir_to_facedir(vector.direction(pointed_thing.above, pointed_thing.under))) + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("main", 1) + end, + on_rightclick = function(pos, node, clicker, itemstack) + if not itemstack then + return + end + local pname = clicker:get_player_name() + if minetest.is_protected(pos, pname) then + minetest.record_protection_violation(pos, pname) + return + end + local meta = minetest.get_meta(pos) + drop_item(pos, node, meta, clicker) + local inv = meta:get_inventory() + if itemstack:is_empty() then + remove_item_entity(pos, node) + meta:set_string("infotext", "") + inv:set_stack("main", 1, "") + return itemstack + end + local put_itemstack = ItemStack(itemstack) + put_itemstack:set_count(1) + inv:set_stack("main", 1, put_itemstack) + update_item_entity(pos, node) + -- Add node infotext when item has been named + local imeta = itemstack:get_meta() + local iname = imeta:get_string("name") + if iname then + meta:set_string("infotext", iname) + end + + if not minetest.is_creative_enabled(clicker:get_player_name()) then + itemstack:take_item() + end + return itemstack + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return count + end + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local name = player:get_player_name() + if minetest.is_protected(pos, name) then + minetest.record_protection_violation(pos, name) + return 0 + else + return stack:get_count() + end + end, + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + drop_item(pos, node, meta) + end, + on_rotate = function(pos, node, user, mode, param2) + if mode == screwdriver.ROTATE_FACE then + -- Rotate face + local meta = minetest.get_meta(pos) + local node = minetest.get_node(pos) + + local objs = nil + if node.name == "extra_mobs:glow_item_frame" then + objs = minetest.get_objects_inside_radius(pos, .5) + end + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "extra_mobs:glow_item_frame_item" then + update_item_entity(pos, node, (node.param2+1) % 4) + break + end + end + end + return + elseif mode == screwdriver.ROTATE_AXIS then + return false + end + end, + +}) + +minetest.register_craft({ + type = "shapeless", + output = 'extra_mobs:glow_item_frame', + recipe = {'mcl_itemframes:item_frame', 'extra_mobs:glow_ink_sac'}, +}) + +minetest.register_lbm({ + label = "Update legacy item frames", + name = "extra_mobs:update_legacy_glow_item_frames", + nodenames = {"extra_mobs:glow_frame"}, + action = function(pos, node) + -- Swap legacy node, then respawn entity + node.name = "extra_mobs:glow_item_frame" + local meta = minetest.get_meta(pos) + local item = meta:get_string("item") + minetest.swap_node(pos, node) + if item ~= "" then + local itemstack = ItemStack(minetest.deserialize(meta:get_string("itemdata"))) + local inv = meta:get_inventory() + inv:set_size("main", 1) + if not itemstack:is_empty() then + inv:set_stack("main", 1, itemstack) + end + end + update_item_entity(pos, node) + end, +}) + +-- FIXME: Item entities can get destroyed by /clearobjects +minetest.register_lbm({ + label = "Respawn item frame item entities", + name = "extra_mobs:respawn_entities", + nodenames = {"extra_mobs:glow_item_frame"}, + run_at_every_load = true, + action = function(pos, node) + update_item_entity(pos, node) + end, +}) + +minetest.register_alias("extra_mobs:glow_frame", "extra_mobs:glow_item_frame") + +-------------------- \ No newline at end of file diff --git a/init.lua b/init.lua index 175800b..28fab0e 100644 --- a/init.lua +++ b/init.lua @@ -20,5 +20,9 @@ dofile(path .. "/fox.lua") dofile(path .. "/cod.lua") dofile(path .. "/salmon.lua") dofile(path .. "/dolphin.lua") +dofile(path .. "/glow_squid.lua") + +--Items +dofile(path .. "/glow_squid_items.lua") diff --git a/models/extra_mobs_glow_item_frame.obj b/models/extra_mobs_glow_item_frame.obj new file mode 100644 index 0000000..d0a5b0c --- /dev/null +++ b/models/extra_mobs_glow_item_frame.obj @@ -0,0 +1,156 @@ +# Blender v2.76 (sub 0) OBJ File: 'itemframe1facedir.blend' +# www.blender.org +mtllib itemframe1facedir.mtl +o right.frame_Cube.005 +v -0.313413 -0.313413 0.435326 +v -0.313413 0.313413 0.435326 +v -0.313413 -0.313413 0.498008 +v -0.313413 0.313413 0.498008 +v -0.376095 -0.313413 0.435326 +v -0.376095 0.313413 0.435326 +v -0.376095 -0.313413 0.498008 +v -0.376095 0.313413 0.498008 +vt 0.875000 0.812500 +vt 0.812500 0.812500 +vt 0.812500 0.187500 +vt 0.875000 0.187500 +vt 1.000000 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.187500 +vt 1.000000 0.187500 +vt -0.000000 0.937500 +vt 0.062500 0.937500 +vt 0.062500 1.000000 +vt -0.000000 1.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 2/1/1 4/2/1 3/3/1 1/4/1 +f 4/1/2 8/2/2 7/3/2 3/4/2 +f 8/5/3 6/6/3 5/7/3 7/8/3 +f 6/1/4 2/2/4 1/3/4 5/4/4 +f 1/9/5 3/10/5 7/11/5 5/12/5 +f 6/9/6 8/10/6 4/11/6 2/12/6 +o left.frame_Cube.004 +v 0.376095 -0.313413 0.435326 +v 0.376095 0.313413 0.435326 +v 0.376095 -0.313413 0.498008 +v 0.376095 0.313413 0.498008 +v 0.313413 -0.313413 0.435326 +v 0.313413 0.313413 0.435326 +v 0.313413 -0.313413 0.498008 +v 0.313413 0.313413 0.498008 +vt 0.875000 0.812500 +vt 0.812500 0.812500 +vt 0.812500 0.187500 +vt 0.875000 0.187500 +vt 1.000000 0.812500 +vt 0.937500 0.812500 +vt 0.937500 0.187500 +vt 1.000000 0.187500 +vt -0.000000 0.937500 +vt 0.062500 0.937500 +vt 0.062500 1.000000 +vt -0.000000 1.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 10/13/7 12/14/7 11/15/7 9/16/7 +f 12/13/8 16/14/8 15/15/8 11/16/8 +f 16/17/9 14/18/9 13/19/9 15/20/9 +f 14/13/10 10/14/10 9/15/10 13/16/10 +f 9/21/11 11/22/11 15/23/11 13/24/11 +f 14/21/12 16/22/12 12/23/12 10/24/12 +o lower.frame_Cube.003 +v 0.376095 -0.376095 0.435326 +v 0.376095 -0.313413 0.435326 +v 0.376095 -0.376095 0.498008 +v 0.376095 -0.313413 0.498008 +v -0.376095 -0.376095 0.435326 +v -0.376095 -0.313413 0.435326 +v -0.376095 -0.376095 0.498008 +v -0.376095 -0.313413 0.498008 +vt 0.187500 0.187500 +vt 0.125000 0.187500 +vt 0.125000 0.125000 +vt 0.187500 0.125000 +vt 0.875000 0.187500 +vt 0.875000 0.125000 +vt 0.812500 0.187500 +vt 0.812500 0.125000 +vt 0.875000 0.937500 +vt 0.875000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.937500 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 18/25/13 20/26/13 19/27/13 17/28/13 +f 20/29/14 24/26/14 23/27/14 19/30/14 +f 24/29/15 22/31/15 21/32/15 23/30/15 +f 22/29/16 18/26/16 17/27/16 21/30/16 +f 17/33/17 19/34/17 23/35/17 21/36/17 +f 22/30/18 24/29/18 20/26/18 18/27/18 +o upper.frame_Cube.002 +v 0.376095 0.313413 0.435326 +v 0.376095 0.376095 0.435326 +v 0.376095 0.313413 0.498008 +v 0.376095 0.376095 0.498008 +v -0.376095 0.313413 0.435326 +v -0.376095 0.376095 0.435326 +v -0.376095 0.313413 0.498008 +v -0.376095 0.376095 0.498008 +vt 0.187500 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.812500 +vt 0.187500 0.812500 +vt 0.875000 0.875000 +vt 0.875000 0.812500 +vt 0.812500 0.875000 +vt 0.812500 0.812500 +vt 0.875000 0.937500 +vt 0.875000 1.000000 +vt 0.125000 1.000000 +vt 0.125000 0.937500 +vn 1.000000 0.000000 0.000000 +vn 0.000000 0.000000 1.000000 +vn -1.000000 0.000000 0.000000 +vn -0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 0.000000 1.000000 0.000000 +usemtl None +s off +f 26/37/19 28/38/19 27/39/19 25/40/19 +f 28/41/20 32/38/20 31/39/20 27/42/20 +f 32/41/21 30/43/21 29/44/21 31/42/21 +f 30/41/22 26/38/22 25/39/22 29/42/22 +f 25/45/23 27/46/23 31/47/23 29/48/23 +f 30/48/24 32/38/24 28/41/24 26/45/24 +o background_Plane +v 0.313413 -0.313413 0.466667 +v -0.313413 -0.313413 0.466667 +v 0.313413 0.313413 0.466667 +v -0.313413 0.313413 0.466667 +vt 0.187500 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.812500 +vt 0.187500 0.812500 +vn -0.000000 0.000000 -1.000000 +usemtl None +s off +f 33/49/25 34/50/25 36/51/25 35/52/25 diff --git a/models/extra_mobs_glow_squid.b3d b/models/extra_mobs_glow_squid.b3d new file mode 100644 index 0000000..887576b Binary files /dev/null and b/models/extra_mobs_glow_squid.b3d differ diff --git a/textures/extra_mobs_glow_ink_sac.png b/textures/extra_mobs_glow_ink_sac.png new file mode 100644 index 0000000..6628e6a Binary files /dev/null and b/textures/extra_mobs_glow_ink_sac.png differ diff --git a/textures/extra_mobs_glow_item_frame.png b/textures/extra_mobs_glow_item_frame.png new file mode 100644 index 0000000..e83b4e0 Binary files /dev/null and b/textures/extra_mobs_glow_item_frame.png differ diff --git a/textures/extra_mobs_glow_item_frame_border.png b/textures/extra_mobs_glow_item_frame_border.png new file mode 100644 index 0000000..e83b4e0 Binary files /dev/null and b/textures/extra_mobs_glow_item_frame_border.png differ diff --git a/textures/extra_mobs_glow_item_frame_item.png b/textures/extra_mobs_glow_item_frame_item.png new file mode 100644 index 0000000..e83b4e0 Binary files /dev/null and b/textures/extra_mobs_glow_item_frame_item.png differ diff --git a/textures/extra_mobs_glow_squid.png b/textures/extra_mobs_glow_squid.png new file mode 100644 index 0000000..ccbdb97 Binary files /dev/null and b/textures/extra_mobs_glow_squid.png differ diff --git a/textures/extra_mobs_spawn_icon_glow_squid.png b/textures/extra_mobs_spawn_icon_glow_squid.png new file mode 100644 index 0000000..e7b8bba Binary files /dev/null and b/textures/extra_mobs_spawn_icon_glow_squid.png differ