Compare commits

...

5 Commits

Author SHA1 Message Date
Lars Müller d8ce7ba84e
Fix invalid player object crash 2022-07-29 08:28:43 +02:00
Lars Mueller a2acecd330 Fix warning & crash on player leave 2022-07-21 12:25:11 +02:00
Lars Mueller 2a8051a5ba Fix crash when wielding unknown items 2022-04-20 12:20:02 +02:00
Lars Mueller 640317878e Fix crash on player leave 2022-02-17 11:13:20 +01:00
Lars Mueller d28cc59bea Fix link in Readme 2022-01-24 16:58:33 +01:00
2 changed files with 17 additions and 11 deletions

View File

@ -7,7 +7,7 @@ Shows wielded items in-world.
Modern alternative to [`wield3d`](https://github.com/stujones11/wield3d):
* Relies less on deprecated engine APIs, doesn't aim to support older MT versions
* Supports colored items. Works well with [`epidermis`](https://github.com/epidermis).
* Supports colored items. Works well with [`epidermis`](https://github.com/appgurueu/epidermis).
* Supports glow (for environmental lighting use a wielded light mod)
* Indicates size of stacks
* Provides a proper API for mods to use

View File

@ -1,19 +1,19 @@
visible_wielditem = {}
local entity_name = "visible_wielditem:visible_wielditem"
local entities = {}
local function create_entity(player)
local entity = minetest.add_entity(player:get_pos(), "visible_wielditem:visible_wielditem"):get_luaentity()
entity:_set_player(player)
entities[player:get_player_name()] = entity
local pos = player:get_pos()
if not pos then return end -- HACK deal with player object being invalidated before on_leaveplayer has been called
minetest.add_entity(pos, entity_name):get_luaentity():_set_player(player)
end
minetest.register_on_joinplayer(create_entity)
minetest.register_on_leaveplayer(function(player)
local player_name = player:get_player_name()
entities[player_name]:remove()
entities[player_name] = nil
entities[player:get_player_name()]:_remove()
end)
visible_wielditem.model_attachments = {
@ -72,9 +72,9 @@ function visible_wielditem.get_attachment(modelname, itemname)
end
if tweaks.scale then attachment.scale = attachment.scale * tweaks.scale end
end
local def = minetest.registered_items[itemname]
local def = minetest.registered_items[itemname] or {}
local item_tweaks = visible_wielditem.item_tweaks
apply_tweaks(item_tweaks.types[def and def.type or "unknown"])
apply_tweaks(item_tweaks.types[def.type or "unknown"])
for groupname, rating in pairs(def.groups or {}) do
if rating ~= 0 then
apply_tweaks(item_tweaks.groups[groupname])
@ -85,7 +85,7 @@ function visible_wielditem.get_attachment(modelname, itemname)
return attachment
end
minetest.register_entity("visible_wielditem:visible_wielditem", {
minetest.register_entity(entity_name, {
initial_properties = {
physical = false,
collide_with_objects = false,
@ -127,6 +127,7 @@ minetest.register_entity("visible_wielditem:visible_wielditem", {
self._player = player -- HACK this assumes that PlayerRefs don't change
self:_set_item(player:get_wielded_item())
self:_update_attachment()
entities[player:get_player_name()] = self
end,
on_deactivate = function(self)
create_entity(self._player)
@ -148,6 +149,11 @@ minetest.register_entity("visible_wielditem:visible_wielditem", {
}
self:_update_attachment()
end,
_remove = function(self)
self.on_deactivate = modlib.func.no_op -- don't recreate entity; it's supposed to be removed
self.object:remove()
entities[self._player:get_player_name()] = nil
end
-- TODO on_step: reattach regularly to work around engine bugs?
})
@ -158,4 +164,4 @@ modlib.minetest.register_on_wielditem_change(function(player, _, _, item)
else -- recreate entity if necessary
create_entity(player)
end
end)
end)