mirror of
https://github.com/minetest/minetest.git
synced 2024-11-30 11:33:44 +01:00
UnitSAO: Prevent circular attachments
This commit is contained in:
parent
ff48619a85
commit
5bf72468f3
@ -6314,6 +6314,8 @@ object you are working with still exists.
|
|||||||
Default `{x=0, y=0, z=0}`
|
Default `{x=0, y=0, z=0}`
|
||||||
* `forced_visible`: Boolean to control whether the attached entity
|
* `forced_visible`: Boolean to control whether the attached entity
|
||||||
should appear in first person. Default `false`.
|
should appear in first person. Default `false`.
|
||||||
|
* This command may fail silently (do nothing) when it would result
|
||||||
|
in circular attachments.
|
||||||
* `get_attach()`: returns parent, bone, position, rotation, forced_visible,
|
* `get_attach()`: returns parent, bone, position, rotation, forced_visible,
|
||||||
or nil if it isn't attached.
|
or nil if it isn't attached.
|
||||||
* `get_children()`: returns a list of ObjectRefs that are attached to the
|
* `get_children()`: returns a list of ObjectRefs that are attached to the
|
||||||
|
@ -124,6 +124,19 @@ void UnitSAO::sendOutdatedData()
|
|||||||
void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position,
|
void UnitSAO::setAttachment(int parent_id, const std::string &bone, v3f position,
|
||||||
v3f rotation, bool force_visible)
|
v3f rotation, bool force_visible)
|
||||||
{
|
{
|
||||||
|
auto *obj = parent_id ? m_env->getActiveObject(parent_id) : nullptr;
|
||||||
|
if (obj) {
|
||||||
|
// Do checks to avoid circular references
|
||||||
|
// The chain of wanted parent must not refer or contain "this"
|
||||||
|
for (obj = obj->getParent(); obj; obj = obj->getParent()) {
|
||||||
|
if (obj == this) {
|
||||||
|
warningstream << "Mod bug: Attempted to attach object " << m_id << " to parent "
|
||||||
|
<< parent_id << " but former is an (in)direct parent of latter." << std::endl;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Attachments need to be handled on both the server and client.
|
// Attachments need to be handled on both the server and client.
|
||||||
// If we just attach on the server, we can only copy the position of the parent.
|
// If we just attach on the server, we can only copy the position of the parent.
|
||||||
// Attachments are still sent to clients at an interval so players might see them
|
// Attachments are still sent to clients at an interval so players might see them
|
||||||
|
Loading…
Reference in New Issue
Block a user