Skip to content
This repository has been archived by the owner on Dec 14, 2019. It is now read-only.

Bug in eat_node call (the "sheep bug") #14

Open
Acuddle opened this issue May 9, 2017 · 1 comment
Open

Bug in eat_node call (the "sheep bug") #14

Acuddle opened this issue May 9, 2017 · 1 comment

Comments

@Acuddle
Copy link

Acuddle commented May 9, 2017

I got annoyed at the "sheep bug" that make the server crash ever now and then and had previously reported by enigma and ParaklataChotou of the minetest forums.
2016-07-22 17:31:09: ERROR[Main]: ServerError: Lua: Runtime error from mod 'sheep' in callback luaentity_Step(): {location of minetest directory}/.minetest/mods/cme/creatures/functions.lua:483: attempt to index field 'last_node' (a nil value) 2016-07-22 17:31:09: ERROR[Main]: stack traceback: 2016-07-22 17:31:09: ERROR[Main]: {location of minetest directory}/.minetest/mods/cme/creatures/functions.lua:483: in function 'on_step' 2016-07-22 17:31:09: ERROR[Main]: {location of minetest directory} /.minetest/mods/cme/creatures/register.lua:216: in function <{location of minetest directory}/.minetest/mods/cme/creatures/register.lua:211>

I had a stab at it and maybe found the origin of the error.
It happens when the sheeps eat.

  if current_mode == "eat" and not self.eat_node then
    local nodes = modes[current_mode].nodes
    local p = {x = current_pos.x, y = current_pos.y - 1, z = current_pos.z}
    local sn = core.get_node_or_nil(p)
    local eat_node
    for _,name in pairs(nodes) do
      if name == self.last_node.name then
        eat_node = current_pos
        break
      elseif sn and sn.name == name then
        eat_node = p
        break
      end
    end
    if not eat_node then
      current_mode = "idle"
    else
      self.eat_node = eat_node
    end
  end

I do not have any experience in Lua and I don't know when self.last_node would be nil (maybe if the sheep is in mid-air while eating, which may be true if the sheep is "dangling" to a node while being directly at the top of none), but I went and put a verification at the beginning.

  if current_mode == "eat" and not self.eat_node then
    local nodes = modes[current_mode].nodes
    local p = {x = current_pos.x, y = current_pos.y - 1, z = current_pos.z}
    local sn = core.get_node_or_nil(p)
    local eat_node
    for _,name in pairs(nodes) do
      if not self.last_node then
        break
      else
        if name == self.last_node.name then
          eat_node = current_pos
          break
        elseif sn and sn.name == name then
          eat_node = p
          break
        end
      end

    end

    if not eat_node then
      current_mode = "idle"
    else
      self.eat_node = eat_node
    end
  end

I don't know if the fix worked, but it doesn't crash when the sheep eat normally, so I guess it's better than nothing. The "sn" variable may be useful in more precise fixing (it would depend on the propension of the core.get_node_or_nil to get nodes and no nils).

Here's the "fixed" functions.lua (in a zip, sorry for the inconvenience).

functions.zip

@diogogomes
Copy link

@BlockMen has abandoned the development of this repository.

Please, open issues and make pull requests in Mob Engine of Minetest Mods Team.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants