From 6d84a139d6064d2f0420c0ccf967dad1a5a3f45b Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Wed, 23 Aug 2017 03:50:22 +0200 Subject: [PATCH] Render enderman's carried block --- mods/ENTITIES/mobs_mc/0_gameconfig.lua | 4 +- mods/ENTITIES/mobs_mc/enderman.lua | 180 ++++++++++++++++-- .../mobs_mc/models/mobs_mc_enderman.b3d | Bin 108266 -> 683474 bytes 3 files changed, 171 insertions(+), 13 deletions(-) diff --git a/mods/ENTITIES/mobs_mc/0_gameconfig.lua b/mods/ENTITIES/mobs_mc/0_gameconfig.lua index 410719f6..5e47ecbe 100644 --- a/mods/ENTITIES/mobs_mc/0_gameconfig.lua +++ b/mods/ENTITIES/mobs_mc/0_gameconfig.lua @@ -228,7 +228,9 @@ mobs_mc.enderman_takable = { "default:dirt_with_snow", "default:dirt_with_rainforest_litter", "default:dirt_with_grass_footsteps", - "default:cactus", +-- FIXME: For some reason, Minetest has a Lua error when an enderman tries to place a Minetest Game cactus. +-- Maybe this is because default:cactus has rotate_and_place? +-- "default:cactus", -- TODO: Re-enable cactus when it works again "default:gravel", "default:clay", "flowers:mushroom_red", diff --git a/mods/ENTITIES/mobs_mc/enderman.lua b/mods/ENTITIES/mobs_mc/enderman.lua index 80381ea8..ceaddbf7 100644 --- a/mods/ENTITIES/mobs_mc/enderman.lua +++ b/mods/ENTITIES/mobs_mc/enderman.lua @@ -18,6 +18,139 @@ local pr = PseudoRandom(os.time()*(-334)) local take_frequency = 10 local place_frequency = 10 +-- Create the textures table for the enderman, depending on which kind of block +-- the enderman holds (if any). +local create_enderman_textures = function(block_type, itemstring) + local base = "mobs_mc_enderman.png^mobs_mc_enderman_eyes.png" + + --[[ Order of the textures in the texture table: + Flower, 90 degrees + Flower, 45 degrees + Held block, backside + Held block, bottom + Held block, front + Held block, left + Held block, right + Held block, top + Enderman texture (base) + ]] + -- Regular cube + if block_type == "cube" then + local tiles = minetest.registered_nodes[itemstring].tiles + local textures = {} + local last + for i = 1, 6 do + if type(tiles[i]) == "string" then + last = tiles[i] + elseif type(tiles[i]) == "table" then + if tiles[i].name then + last = tiles[i].name + end + end + table.insert(textures, last) + end + return { + "blank.png", + "blank.png", + textures[5], + textures[2], + textures[6], + textures[3], + textures[4], + textures[1], + base, -- Enderman texture + } + -- Node of plantlike drawtype, 45° (recommended) + elseif block_type == "plantlike45" then + local textures = minetest.registered_nodes[itemstring].tiles + return { + "blank.png", + textures[1], + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, + } + -- Node of plantlike drawtype, 90° + elseif block_type == "plantlike90" then + local textures = minetest.registered_nodes[itemstring].tiles + return { + textures[1], + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, + } + elseif block_type == "unknown" then + return { + "blank.png", + "blank.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + "unknown_node.png", + base, -- Enderman texture + } + -- No block held (for initial texture) + elseif block_type == "nothing" or block_type == nil then + return { + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + "blank.png", + base, -- Enderman texture + } + end +end + +-- Select a new animation definition. +local select_enderman_animation = function(animation_type) + -- Enderman holds a block + if animation_type == "block" then + return { + walk_speed = 25, + run_speed = 50, + stand_speed = 25, + stand_start = 200, + stand_end = 200, + walk_start = 161, + walk_end = 200, + run_start = 161, + run_end = 200, + punch_start = 121, + punch_end = 160, + } + -- Enderman doesn't hold a block + elseif animation_type == "normal" or animation_type == nil then + return { + walk_speed = 25, + run_speed = 50, + stand_speed = 25, + stand_start = 40, + stand_end = 80, + walk_start = 0, + walk_end = 40, + run_start = 0, + run_end = 40, + punch_start = 81, + punch_end = 120, + } + end +end + mobs:register_mob("mobs_mc:enderman", { type = "monster", runaway = true, @@ -28,9 +161,7 @@ mobs:register_mob("mobs_mc:enderman", { collisionbox = {-0.3, -0.01, -0.3, 0.3, 2.89, 0.3}, visual = "mesh", mesh = "mobs_mc_enderman.b3d", - textures = { - {"mobs_mc_enderman.png^(mobs_mc_enderman_eyes.png^[makealpha:0,0,0)"}, - }, + textures = create_enderman_textures(), visual_size = {x=3, y=3}, makes_footstep_sound = true, sounds = { @@ -49,12 +180,7 @@ mobs:register_mob("mobs_mc:enderman", { min = 0, max = 1,}, }, - animation = { - speed_normal = 25, speed_run = 50, - stand_start = 40, stand_end = 80, - walk_start = 0, walk_end = 40, - run_start = 0, run_end = 40, - }, + animation = select_enderman_animation("normal"), _taken_node = "", do_custom = function(self, dtime) -- Take and put nodes @@ -63,7 +189,7 @@ mobs:register_mob("mobs_mc:enderman", { return end self._take_place_timer = self._take_place_timer + dtime - if (self._taken_node == nil or self._taken_node == "") and self._take_place_timer >= take_frequency then + if (self._taken_node == nil or self._taken_node == "") and self._take_place_timer >= take_frequency then -- Take random node self._take_place_timer = 0 local pos = self.object:getpos() @@ -75,8 +201,35 @@ mobs:register_mob("mobs_mc:enderman", { local dug = minetest.dig_node(take_pos) if dug then self._taken_node = node.name - -- TODO: Update enderman model (enderman holding block) local def = minetest.registered_nodes[self._taken_node] + -- Update animation and texture accordingly (adds visibly carried block) + local block_type + -- Cube-shaped + if def.drawtype == "normal" or + def.drawtype == "nodebox" or + def.drawtype == "liquid" or + def.drawtype == "flowingliquid" or + def.drawtype == "glasslike" or + def.drawtype == "glasslike_framed" or + def.drawtype == "glasslike_framed_optional" or + def.drawtype == "allfaces" or + def.drawtype == "allfaces_optional" or + def.drawtype == nil then + block_type = "cube" + elseif def.drawtype == "plantlike" then + -- Flowers and stuff + block_type = "plantlike45" + elseif def.drawtype == "airlike" then + -- Just air + block_type = nil + else + -- Fallback for complex drawtypes + block_type = "unknown" + end + self.base_texture = create_enderman_textures(block_type, self._taken_node) + self.object:set_properties({ textures = self.base_texture }) + self.animation = select_enderman_animation("block") + mobs:set_animation(self, self.animation.current) if def.sounds and def.sounds.dug then minetest.sound_play(def.sounds.dug, {pos = take_pos, max_hear_distance = 16}) end @@ -93,6 +246,9 @@ mobs:register_mob("mobs_mc:enderman", { -- ... but only if there's a free space minetest.place_node(place_pos, {name = self._taken_node}) local def = minetest.registered_nodes[self._taken_node] + -- Update animation accordingly (removes visible block) + self.animation = select_enderman_animation("normal") + mobs:set_animation(self, self.animation.current) if def.sounds and def.sounds.place then minetest.sound_play(def.sounds.place, {pos = place_pos, max_hear_distance = 16}) end @@ -147,7 +303,7 @@ mobs:register_mob("mobs_mc:enderman", { -- End spawn -mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 18, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) +mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, minetest.LIGHT_MAX+1, 30, 3000, 12, mobs_mc.spawn_height.end_min, mobs_mc.spawn_height.end_max) -- Overworld spawn mobs:spawn_specific("mobs_mc:enderman", mobs_mc.spawn.solid, {"air"}, 0, 7, 30, 9000, 4, mobs_mc.spawn_height.overworld_min, mobs_mc.spawn_height.overworld_max) -- Nether spawn (rare) diff --git a/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d b/mods/ENTITIES/mobs_mc/models/mobs_mc_enderman.b3d index ac92259907e6b11363dca2372006ba7107780bcc..30f42632b6d9b3b1710f08003de3a3da2e1b4d62 100644 GIT binary patch delta 39533 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 TCCk{rzWGQF#7@vXRvk(JUz5W} delta 16542 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 SKI7QV_kK9|@Z1)b4kZAT^V((r