Fix dropped item look (#6370)
authoryou <ovvv@web.de>
Mon, 11 Sep 2017 06:20:06 +0000 (08:20 +0200)
committerLoïc Blot <nerzhul@users.noreply.github.com>
Mon, 11 Sep 2017 06:20:06 +0000 (08:20 +0200)
* Abort set_item when it does nothing

* Do not adjust dropped item size linearly

Instead use cube root because the item count is proportional to the volume, not to the length.

* Make the item rotate slower when it's bigger

Bigger items chafe more on the ground, so they can't rotate as fast as small ones

* Fix items flying in air

builtin/game/item_entity.lua

index 0026c1387f3d34af033f2bf7c0a6c6d89cd12596..718c94fb24e715109194e73549fac0312f560589 100644 (file)
@@ -37,32 +37,35 @@ core.register_entity(":__builtin:item", {
        slippery_state = false,
        age = 0,
 
-       set_item = function(self, itemstring)
-               local stack = ItemStack(itemstring or self.itemstring)
+       set_item = function(self, item)
+               local stack = ItemStack(item or self.itemstring)
                self.itemstring = stack:to_string()
+               if self.itemstring == "" then
+                       -- item not yet known
+                       return
+               end
 
                -- Backwards compatibility: old clients use the texture
                -- to get the type of the item
-               local itemname = stack:get_name()
+               local itemname = stack:is_known() and stack:get_name() or "unknown"
 
                local max_count = stack:get_stack_max()
                local count = math.min(stack:get_count(), max_count)
-               local size = 0.2 + 0.1 * (count / max_count)
-
-               if not stack:is_known() then
-                       itemname = "unknown"
-               end
+               local size = 0.2 + 0.1 * (count / max_count) ^ (1 / 3)
+               local coll_height = size * 0.75
 
                self.object:set_properties({
                        is_visible = true,
                        visual = "wielditem",
                        textures = {itemname},
                        visual_size = {x = size, y = size},
-                       collisionbox = {-size, -size, -size, size, size, size},
-                       automatic_rotate = math.pi * 0.5,
+                       collisionbox = {-size, -coll_height, -size,
+                               size, coll_height, size},
+                       selectionbox = {-size, -size, -size, size, size, size},
+                       automatic_rotate = math.pi * 0.5 * 0.2 / size,
                        wield_item = self.itemstring,
                })
-               
+
        end,
 
        get_staticdata = function(self)
@@ -154,7 +157,7 @@ core.register_entity(":__builtin:item", {
                        is_slippery = slippery ~= 0
                        if is_slippery then
                                is_physical = true
-       
+
                                -- Horizontal deceleration
                                local slip_factor = 4.0 / (slippery + 4)
                                self.object:set_acceleration({