mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Hardware coloring for itemstacks
Adds the possibility to colorize item stacks based on their metadata. In the item/node definition you can specify palette (an image file) and color (fallback color if the item has no palette or metadata). Then you can add palette_index to the metadata. Dropped itemstacks with different colors do not merge.
This commit is contained in:
parent
d4e9dd4643
commit
58d83a7bb2
23 changed files with 308 additions and 139 deletions
|
@ -58,6 +58,12 @@ ItemDefinition read_item_definition(lua_State* L,int index,
|
|||
getstringfield(L, index, "description", def.description);
|
||||
getstringfield(L, index, "inventory_image", def.inventory_image);
|
||||
getstringfield(L, index, "wield_image", def.wield_image);
|
||||
getstringfield(L, index, "palette", def.palette_image);
|
||||
|
||||
// Read item color.
|
||||
lua_getfield(L, index, "color");
|
||||
read_color(L, -1, &def.color);
|
||||
lua_pop(L, 1);
|
||||
|
||||
lua_getfield(L, index, "wield_scale");
|
||||
if(lua_istable(L, -1)){
|
||||
|
@ -118,7 +124,7 @@ ItemDefinition read_item_definition(lua_State* L,int index,
|
|||
|
||||
/******************************************************************************/
|
||||
void read_object_properties(lua_State *L, int index,
|
||||
ObjectProperties *prop)
|
||||
ObjectProperties *prop, IItemDefManager *idef)
|
||||
{
|
||||
if(index < 0)
|
||||
index = lua_gettop(L) + 1 + index;
|
||||
|
@ -216,6 +222,10 @@ void read_object_properties(lua_State *L, int index,
|
|||
}
|
||||
lua_pop(L, 1);
|
||||
getstringfield(L, -1, "infotext", prop->infotext);
|
||||
lua_getfield(L, -1, "wield_item");
|
||||
if (!lua_isnil(L, -1))
|
||||
prop->wield_item = read_item(L, -1, idef).getItemString();
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
@ -284,6 +294,8 @@ void push_object_properties(lua_State *L, ObjectProperties *prop)
|
|||
lua_setfield(L, -2, "automatic_face_movement_max_rotation_per_sec");
|
||||
lua_pushlstring(L, prop->infotext.c_str(), prop->infotext.size());
|
||||
lua_setfield(L, -2, "infotext");
|
||||
lua_pushlstring(L, prop->wield_item.c_str(), prop->wield_item.size());
|
||||
lua_setfield(L, -2, "wield_item");
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
|
|
@ -89,7 +89,8 @@ void push_tool_capabilities (lua_State *L,
|
|||
ItemDefinition read_item_definition (lua_State *L, int index,
|
||||
ItemDefinition default_def);
|
||||
void read_object_properties (lua_State *L, int index,
|
||||
ObjectProperties *prop);
|
||||
ObjectProperties *prop,
|
||||
IItemDefManager *idef);
|
||||
void push_object_properties (lua_State *L,
|
||||
ObjectProperties *prop);
|
||||
|
||||
|
|
|
@ -23,6 +23,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
|||
#include "object_properties.h"
|
||||
#include "common/c_converter.h"
|
||||
#include "common/c_content.h"
|
||||
#include "server.h"
|
||||
|
||||
bool ScriptApiEntity::luaentity_Add(u16 id, const char *name)
|
||||
{
|
||||
|
@ -187,11 +188,11 @@ void ScriptApiEntity::luaentity_GetProperties(u16 id,
|
|||
getstringfield(L, -1, "mesh", prop->mesh);
|
||||
|
||||
// Deprecated: read object properties directly
|
||||
read_object_properties(L, -1, prop);
|
||||
read_object_properties(L, -1, prop, getServer()->idef());
|
||||
|
||||
// Read initial_properties
|
||||
lua_getfield(L, -1, "initial_properties");
|
||||
read_object_properties(L, -1, prop);
|
||||
read_object_properties(L, -1, prop, getServer()->idef());
|
||||
lua_pop(L, 1);
|
||||
}
|
||||
|
||||
|
|
|
@ -92,6 +92,10 @@ void ItemStackMetaRef::Register(lua_State *L)
|
|||
lua_pushcfunction(L, gc_object);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pushliteral(L, "__eq");
|
||||
lua_pushcfunction(L, l_equals);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pop(L, 1); // drop metatable
|
||||
|
||||
luaL_openlib(L, 0, methods, 0); // fill methodtable
|
||||
|
@ -111,5 +115,6 @@ const luaL_Reg ItemStackMetaRef::methods[] = {
|
|||
luamethod(MetaDataRef, set_float),
|
||||
luamethod(MetaDataRef, to_table),
|
||||
luamethod(MetaDataRef, from_table),
|
||||
luamethod(MetaDataRef, equals),
|
||||
{0,0}
|
||||
};
|
||||
|
|
|
@ -250,3 +250,17 @@ bool MetaDataRef::handleFromTable(lua_State *L, int table, Metadata *meta)
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
// equals(self, other)
|
||||
int MetaDataRef::l_equals(lua_State *L)
|
||||
{
|
||||
MetaDataRef *ref1 = checkobject(L, 1);
|
||||
Metadata *data1 = ref1->getmeta(false);
|
||||
MetaDataRef *ref2 = checkobject(L, 2);
|
||||
Metadata *data2 = ref2->getmeta(false);
|
||||
if (data1 == NULL || data2 == NULL)
|
||||
lua_pushboolean(L, data1 == data2);
|
||||
else
|
||||
lua_pushboolean(L, *data1 == *data2);
|
||||
return 1;
|
||||
}
|
||||
|
|
|
@ -67,6 +67,9 @@ protected:
|
|||
|
||||
// from_table(self, table)
|
||||
static int l_from_table(lua_State *L);
|
||||
|
||||
// equals(self, other)
|
||||
static int l_equals(lua_State *L);
|
||||
};
|
||||
|
||||
#endif /* L_NODEMETA_H_ */
|
||||
|
|
|
@ -204,6 +204,10 @@ void NodeMetaRef::RegisterCommon(lua_State *L)
|
|||
lua_pushcfunction(L, gc_object);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pushliteral(L, "__eq");
|
||||
lua_pushcfunction(L, l_equals);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pop(L, 1); // drop metatable
|
||||
}
|
||||
|
||||
|
@ -225,6 +229,7 @@ const luaL_Reg NodeMetaRef::methodsServer[] = {
|
|||
luamethod(MetaDataRef, to_table),
|
||||
luamethod(MetaDataRef, from_table),
|
||||
luamethod(NodeMetaRef, get_inventory),
|
||||
luamethod(MetaDataRef, equals),
|
||||
{0,0}
|
||||
};
|
||||
|
||||
|
|
|
@ -737,7 +737,7 @@ int ObjectRef::l_set_properties(lua_State *L)
|
|||
ObjectProperties *prop = co->accessObjectProperties();
|
||||
if (!prop)
|
||||
return 0;
|
||||
read_object_properties(L, 2, prop);
|
||||
read_object_properties(L, 2, prop, getServer(L)->idef());
|
||||
co->notifyObjectPropertiesModified();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -98,6 +98,10 @@ void StorageRef::Register(lua_State *L)
|
|||
lua_pushcfunction(L, gc_object);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pushliteral(L, "__eq");
|
||||
lua_pushcfunction(L, l_equals);
|
||||
lua_settable(L, metatable);
|
||||
|
||||
lua_pop(L, 1); // drop metatable
|
||||
|
||||
luaL_openlib(L, 0, methods, 0); // fill methodtable
|
||||
|
@ -138,5 +142,6 @@ const luaL_Reg StorageRef::methods[] = {
|
|||
luamethod(MetaDataRef, set_float),
|
||||
luamethod(MetaDataRef, to_table),
|
||||
luamethod(MetaDataRef, from_table),
|
||||
luamethod(MetaDataRef, equals),
|
||||
{0,0}
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue