diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp index abf4d4c7f..3e2661984 100644 --- a/library/LuaApi.cpp +++ b/library/LuaApi.cpp @@ -1535,6 +1535,7 @@ static const LuaWrapper::FunctionReg dfhack_units_module[] = { WRAPM(Units, isHunter), WRAPM(Units, isAvailableForAdoption), WRAPM(Units, isOwnCiv), + WRAPM(Units, isOwnGroup), WRAPM(Units, isOwnRace), WRAPM(Units, getRaceName), WRAPM(Units, getRaceNamePlural), diff --git a/library/include/modules/Units.h b/library/include/modules/Units.h index e5210013b..0c7be6f80 100644 --- a/library/include/modules/Units.h +++ b/library/include/modules/Units.h @@ -240,6 +240,7 @@ DFHACK_EXPORT bool isWar(df::unit* unit); DFHACK_EXPORT bool isHunter(df::unit* unit); DFHACK_EXPORT bool isAvailableForAdoption(df::unit* unit); DFHACK_EXPORT bool isOwnCiv(df::unit* unit); +DFHACK_EXPORT bool isOwnGroup(df::unit* unit); DFHACK_EXPORT bool isOwnRace(df::unit* unit); DFHACK_EXPORT std::string getRaceNameById(int32_t race_id); diff --git a/library/modules/Units.cpp b/library/modules/Units.cpp index 08c2191ec..341a90b22 100644 --- a/library/modules/Units.cpp +++ b/library/modules/Units.cpp @@ -888,6 +888,22 @@ bool Units::isOwnCiv(df::unit* unit) return unit->civ_id == ui->civ_id; } +// check if creature belongs to the player's group +bool Units::isOwnGroup(df::unit* unit) +{ + CHECK_NULL_POINTER(unit); + auto histfig = df::historical_figure::find(unit->hist_figure_id); + if (!histfig) + return false; + for (size_t i = 0; i < histfig->entity_links.size(); i++) + { + auto link = histfig->entity_links[i]; + if (link->entity_id == ui->group_id && (*link).getType() == df::histfig_entity_link_type::MEMBER) + return true; + } + return false; +} + // check if creature belongs to the player's race // (in combination with check for civ helps to filter out own dwarves) bool Units::isOwnRace(df::unit* unit) diff --git a/plugins/manipulator.cpp b/plugins/manipulator.cpp index 067ed1497..ae21080eb 100644 --- a/plugins/manipulator.cpp +++ b/plugins/manipulator.cpp @@ -1146,6 +1146,9 @@ viewscreen_unitlaborsst::viewscreen_unitlaborsst(vector &src, int cur if (!Units::isOwnCiv(unit)) cur->allowEdit = false; + if (!Units::isOwnGroup(unit)) + cur->allowEdit = false; + if (unit->flags1.bits.dead) cur->allowEdit = false;