Better formspec prepend hack for 0.4 clients
This commit is contained in:
parent
915f986e3d
commit
e739e47273
@ -51,9 +51,8 @@ void NodeMetadata::serialize(std::ostream &os, u8 version, bool disk,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
os << serializeString16(sv.first);
|
os << serializeString16(sv.first);
|
||||||
if (!formspec_prepend.empty() && sv.first == "formspec" &&
|
if (!formspec_prepend.empty() && sv.first == "formspec")
|
||||||
sv.second.find("no_prepend[]") == std::string::npos)
|
os << serializeString32(insert_formspec_prepend(sv.second, formspec_prepend));
|
||||||
os << serializeString32(sv.second + formspec_prepend);
|
|
||||||
else
|
else
|
||||||
os << serializeString32(sv.second);
|
os << serializeString32(sv.second);
|
||||||
if (version >= 2)
|
if (version >= 2)
|
||||||
|
@ -1542,9 +1542,8 @@ void Server::SendShowFormspecMessage(session_t peer_id, const std::string &forms
|
|||||||
} else {
|
} else {
|
||||||
m_formspec_state_data[peer_id] = formname;
|
m_formspec_state_data[peer_id] = formname;
|
||||||
RemotePlayer *player = m_env->getPlayer(peer_id);
|
RemotePlayer *player = m_env->getPlayer(peer_id);
|
||||||
if (player && player->protocol_version < 37 &&
|
if (player && player->protocol_version < 37)
|
||||||
formspec.find("no_prepend[]") == std::string::npos)
|
pkt.putLongString(insert_formspec_prepend(formspec, player->formspec_prepend));
|
||||||
pkt.putLongString(formspec + player->formspec_prepend);
|
|
||||||
else
|
else
|
||||||
pkt.putLongString(formspec);
|
pkt.putLongString(formspec);
|
||||||
}
|
}
|
||||||
@ -1935,10 +1934,9 @@ void Server::SendPlayerInventoryFormspec(session_t peer_id)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
NetworkPacket pkt(TOCLIENT_INVENTORY_FORMSPEC, 0, peer_id);
|
NetworkPacket pkt(TOCLIENT_INVENTORY_FORMSPEC, 0, peer_id);
|
||||||
if (player->protocol_version < 37 && player->inventory_formspec.find(
|
if (player->protocol_version < 37)
|
||||||
"no_prepend[]") == std::string::npos)
|
pkt.putLongString(insert_formspec_prepend(player->inventory_formspec,
|
||||||
pkt.putLongString(player->inventory_formspec +
|
player->formspec_prepend));
|
||||||
player->formspec_prepend);
|
|
||||||
else
|
else
|
||||||
pkt.putLongString(player->inventory_formspec);
|
pkt.putLongString(player->inventory_formspec);
|
||||||
|
|
||||||
|
@ -894,3 +894,36 @@ std::string sanitizeDirName(const std::string &str, const std::string &optional_
|
|||||||
|
|
||||||
return wide_to_utf8(safe_name);
|
return wide_to_utf8(safe_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string insert_formspec_prepend(const std::string &formspec, const std::string &prepend) {
|
||||||
|
size_t pos = 0;
|
||||||
|
size_t pos2;
|
||||||
|
while ((pos2 = formspec.find('[', pos)) != std::string::npos) {
|
||||||
|
const std::string element_type = trim(formspec.substr(pos, pos2 - pos));
|
||||||
|
|
||||||
|
// If a no_prepend[] is found then don't insert the prepend
|
||||||
|
if (element_type == "no_prepend")
|
||||||
|
return formspec;
|
||||||
|
|
||||||
|
// Insert the prepend before this element if it isn't size, position,
|
||||||
|
// or anchor.
|
||||||
|
if (element_type != "size" && element_type != "position" &&
|
||||||
|
element_type != "anchor") {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Search for the closing ] and continue iterating
|
||||||
|
// Valid size, position, and anchor elements only have numbers so
|
||||||
|
// escaping doesn't have to be accounted for here.
|
||||||
|
pos = formspec.find(']', pos2);
|
||||||
|
if (pos == std::string::npos)
|
||||||
|
return formspec;
|
||||||
|
pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make a copy of the const string and insert the formspec prepend in the
|
||||||
|
// correct location.
|
||||||
|
std::string prepended_fs = formspec;
|
||||||
|
prepended_fs.insert(pos, prepend);
|
||||||
|
return prepended_fs;
|
||||||
|
}
|
||||||
|
@ -728,3 +728,11 @@ inline irr::core::stringw utf8_to_stringw(const std::string &input)
|
|||||||
* 2. Remove 'unsafe' characters from the name by replacing them with '_'
|
* 2. Remove 'unsafe' characters from the name by replacing them with '_'
|
||||||
*/
|
*/
|
||||||
std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix);
|
std::string sanitizeDirName(const std::string &str, const std::string &optional_prefix);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param formspec The version 1 formspec string
|
||||||
|
* @param prepend The formspec prepend
|
||||||
|
* @return A copy of \p formspec with \p prepend added if possible.
|
||||||
|
*/
|
||||||
|
std::string insert_formspec_prepend(const std::string &formspec, const std::string &prepend);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user