Skip to content

Commit

Permalink
Добавлен метод alife():spawn_id( имя ),
Browse files Browse the repository at this point in the history
 который возвращает `spawn_id` из `all.spawn` по имени объекта.

Co-Authored-By: Denis Shaposhnikov <993498+dsh2dsh@users.noreply.github.com>
  • Loading branch information
xrSimpodin and dsh2dsh committed Apr 30, 2021
1 parent fd2a9d7 commit 544daa9
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 37 deletions.
78 changes: 59 additions & 19 deletions ogsr_engine/Luabind/luabind/class.hpp
Expand Up @@ -873,20 +873,20 @@ namespace luabind
}

template<typename F>
class_&& def(const char* name, F f) &&
class_&& def(const char* name, const F f) &&
{
return std::move(*this).virtual_def(name, f, detail::policy_cons<>(), detail::policy_cons<>(), std::true_type());
}

// virtual functions
template<typename F, typename DefaultOrPolicies>
class_&& def(char const* name, F fn, DefaultOrPolicies default_or_policies) &&
class_&& def(char const* name, const F fn, DefaultOrPolicies default_or_policies) &&
{
return std::move(*this).virtual_def(name, fn, default_or_policies, detail::policy_cons<>(), detail::is_policy_cons<DefaultOrPolicies>());
}

template<typename F, typename Default, typename... Policies>
class_&& def(char const* name, F fn, Default default_, const detail::policy_cons<Policies...> policies) &&
class_&& def(char const* name, const F fn, Default default_, const detail::policy_cons<Policies...> policies) &&
{
return std::move(*this).virtual_def(name, fn, default_, policies, std::false_type());
}
Expand Down Expand Up @@ -1137,43 +1137,83 @@ namespace luabind

// these handle default implementation of virtual functions
template<typename F, typename... Policies>
class_&& virtual_def(char const* name, F const& fn, const detail::policy_cons<Policies...> policies, const detail::policy_cons<>, std::true_type /*is policy_cons*/) &&
class_&& virtual_def(char const* name, const F fn, const detail::policy_cons<Policies...> policies, const detail::policy_cons<>, std::true_type /*is policy_cons*/) &&
{
// normal def() call
detail::overload_rep o(fn, policies);

o.set_match_fun(detail::mem_fn_matcher<F, T, Policies...>(fn));
o.set_fun(detail::mem_fn_callback<F, T, Policies...>(fn));
if constexpr (!std::is_function_v<std::remove_pointer_t<F>> && !std::is_member_function_pointer_v<F>)
{
constexpr auto lambda_cast = cdecl_cast(fn, &F::operator());

detail::overload_rep o(lambda_cast, policies);

o.set_match_fun(detail::mem_fn_matcher<decltype(lambda_cast), T, Policies...>(lambda_cast));
o.set_fun(detail::mem_fn_callback<decltype(lambda_cast), T, Policies...>(lambda_cast));

#ifndef LUABIND_NO_ERROR_CHECKING
o.set_sig_fun(&detail::get_member_signature<F>::apply);
o.set_sig_fun(&detail::get_member_signature<decltype(lambda_cast)>::apply);
#endif
this->add_method(name, std::move(o));
return std::move(*this);
this->add_method(name, std::move(o));
}
else
{
detail::overload_rep o(fn, policies);

o.set_match_fun(detail::mem_fn_matcher<F, T, Policies...>(fn));
o.set_fun(detail::mem_fn_callback<F, T, Policies...>(fn));

#ifndef LUABIND_NO_ERROR_CHECKING
o.set_sig_fun(&detail::get_member_signature<F>::apply);
#endif
this->add_method(name, std::move(o));
}

return std::move(*this);
}

template<typename F, typename Default, typename... Policies>
class_&& virtual_def(char const* name, F const& fn, Default const& default_, const detail::policy_cons<Policies...> policies, std::false_type /*is policy_cons*/) &&
class_&& virtual_def(char const* name, const F fn, Default const& default_, const detail::policy_cons<Policies...> policies, std::false_type /*is policy_cons*/) &&
{
// default_ is a default implementation
// policies is either null_type or a policy list

// normal def() call
detail::overload_rep o(fn, policies);

o.set_match_fun(detail::mem_fn_matcher<F, T, Policies...>(fn));
o.set_fun(detail::mem_fn_callback<F, T, Policies...>(fn));
if constexpr (!std::is_function_v<std::remove_pointer_t<F>> && !std::is_member_function_pointer_v<F>)
{
constexpr auto lambda_cast = cdecl_cast(fn, &F::operator());

detail::overload_rep o(lambda_cast, policies);

o.set_match_fun(detail::mem_fn_matcher<decltype(lambda_cast), T, Policies...>(lambda_cast));
o.set_fun(detail::mem_fn_callback<decltype(lambda_cast), T, Policies...>(lambda_cast));

o.set_fun_static(detail::mem_fn_callback<Default, T, Policies...>(default_));

#ifndef LUABIND_NO_ERROR_CHECKING
o.set_sig_fun(&detail::get_member_signature<decltype(lambda_cast)>::apply);
#endif

this->add_method(name, std::move(o));
}
else
{
detail::overload_rep o(fn, policies);

o.set_fun_static(
detail::mem_fn_callback<Default, T, Policies...>(default_));
o.set_match_fun(detail::mem_fn_matcher<F, T, Policies...>(fn));
o.set_fun(detail::mem_fn_callback<F, T, Policies...>(fn));

o.set_fun_static(detail::mem_fn_callback<Default, T, Policies...>(default_));

#ifndef LUABIND_NO_ERROR_CHECKING
o.set_sig_fun(&detail::get_member_signature<F>::apply);
o.set_sig_fun(&detail::get_member_signature<F>::apply);
#endif

this->add_method(name, std::move(o));
this->add_method(name, std::move(o));
}

// register virtual function
return std::move(*this);
return std::move(*this);
}

template<typename... Policies, typename... Ts>
Expand Down
8 changes: 2 additions & 6 deletions ogsr_engine/xrGame/alife_simulator_script.cpp
Expand Up @@ -270,11 +270,6 @@ CSE_Abstract *CALifeSimulator__spawn_ammo (CALifeSimulator *self, LPCSTR sectio
return (self->server().Process_spawn(packet,clientID));
}

ALife::_SPAWN_ID CALifeSimulator__spawn_id (CALifeSimulator *self, ALife::_SPAWN_STORY_ID spawn_story_id)
{
return (((const CALifeSimulator *)self)->spawns().spawn_id(spawn_story_id));
}

void CALifeSimulator__release (CALifeSimulator *self, CSE_Abstract *object, bool)
{
VERIFY (self);
Expand Down Expand Up @@ -448,7 +443,8 @@ void CALifeSimulator::script_register (lua_State *L)
.def("create", &CALifeSimulator__spawn_item)
.def("create_ammo", &CALifeSimulator__spawn_ammo)
.def("release", &CALifeSimulator__release)
.def("spawn_id", &CALifeSimulator__spawn_id)
.def("spawn_id", [](CALifeSimulator* self, ALife::_SPAWN_STORY_ID spawn_story_id) { return self->spawns().spawn_id(spawn_story_id); })
.def("spawn_id", [](CALifeSimulator* self, const char* obj_name) { return self->spawns().spawn_id(obj_name); })
.def("actor", &get_actor)
.def("has_info", &has_info)
.def("dont_has_info", &dont_has_info)
Expand Down
26 changes: 24 additions & 2 deletions ogsr_engine/xrGame/alife_spawn_registry.cpp
Expand Up @@ -219,22 +219,44 @@ void CALifeSpawnRegistry::build_story_spawns()
{
const auto* object = smart_cast<const CSE_ALifeObject*>(&obj->data()->object());

m_spawn_ids_by_name.emplace(object->name_replace(), id);

if (object->m_spawn_story_id != INVALID_SPAWN_STORY_ID) {
#ifdef USE_STORY_ID_AS_SPAWN_ID
//Особо умные могут назначить одинаковые спавн айди куче разных объектов.
ASSERT_FMT(m_spawn_story_ids.find(object->m_spawn_story_id) == m_spawn_story_ids.end(), "!!Twoy allspawn - xyina, davai po novoy!");
#endif
//Msg("--[%s] Adding spawn_id to object: [%s] spawn_story_id: [%u] story_id: [%u] object_id: [%u]", __FUNCTION__, object->name_replace(), object->m_spawn_story_id, object->m_story_id, id);
m_spawn_story_ids.insert({ object->m_spawn_story_id, id });
m_spawn_story_ids.emplace(object->m_spawn_story_id, id);
}
#ifdef USE_STORY_ID_AS_SPAWN_ID
else if (object->m_story_id != INVALID_STORY_ID) {
//Особо умные могут назначить одинаковые спавн/стори айди куче разных объектов либо разные одному и тому же.
ASSERT_FMT(m_spawn_story_ids.find(object->m_story_id) == m_spawn_story_ids.end(), "!!Twoy allspawn - xyina, davai po novoy!");

//Msg("~~[%s] Adding spawn_id (story_id) to object: [%s] spawn_story_id: [%u] story_id: [%u] object_id: [%u]", __FUNCTION__, object->name_replace(), object->m_spawn_story_id, object->m_story_id, id);
m_spawn_story_ids.insert({ object->m_story_id, id });
m_spawn_story_ids.emplace(object->m_story_id, id);
}
#endif
}
}

ALife::_SPAWN_ID CALifeSpawnRegistry::spawn_id(const ALife::_SPAWN_STORY_ID& spawn_story_id) const
{
auto it = m_spawn_story_ids.find(spawn_story_id);
if (it != m_spawn_story_ids.end())
return it->second;

//KRodin: В оригинале при ненахождении стори айди, возвращался рандомный мусор, на мой взгляд лучше вернуть -1 и в лог написать, потому что там стоял VERIFY. Хотя я не уверен что надо писать...
Msg("!![%s] Spawn story id [%u] cannot be found!", __FUNCTION__, spawn_story_id);
return ALife::_SPAWN_ID(-1);
}

ALife::_SPAWN_ID CALifeSpawnRegistry::spawn_id(const char* obj_name) const {
auto it = m_spawn_ids_by_name.find(obj_name);
if (it != m_spawn_ids_by_name.end())
return it->second;

//KRodin: а вот тут надо в лог писать или нет? Хз, надеюсь т.к. метод новый, код с его использованием будут писать более адекватно и поэтому вывод в лог не нужен.
return ALife::_SPAWN_ID(-1);
}
11 changes: 8 additions & 3 deletions ogsr_engine/xrGame/alife_spawn_registry.h
Expand Up @@ -25,7 +25,6 @@ class CALifeSpawnRegistry : CRandom {

public:
typedef xr_vector<ALife::_SPAWN_ID> SPAWN_IDS;
typedef associative_vector<ALife::_SPAWN_STORY_ID,ALife::_OBJECT_ID> SPAWN_STORY_IDS;

private:
CALifeSpawnHeader m_header{};
Expand All @@ -35,7 +34,9 @@ class CALifeSpawnRegistry : CRandom {
SPAWN_IDS m_spawn_roots;
SPAWN_IDS m_temp0;
SPAWN_IDS m_temp1;
SPAWN_STORY_IDS m_spawn_story_ids;

std::unordered_map<ALife::_SPAWN_STORY_ID, ALife::_SPAWN_ID> m_spawn_story_ids;
string_unordered_map<shared_str, ALife::_SPAWN_ID> m_spawn_ids_by_name;

protected:
//void save_updates (IWriter &stream);
Expand Down Expand Up @@ -63,7 +64,11 @@ class CALifeSpawnRegistry : CRandom {
IC const CALifeSpawnHeader &header () const;
IC const SPAWN_GRAPH &spawns () const;
//IC void assign_artefact_position (CSE_ALifeAnomalousZone *anomaly, CSE_ALifeDynamicObject *object) const;
IC const ALife::_SPAWN_ID &spawn_id (const ALife::_SPAWN_STORY_ID &spawn_story_id) const;

//Используется только в луа
ALife::_SPAWN_ID spawn_id(const ALife::_SPAWN_STORY_ID& spawn_story_id) const;
//Используется только в луа
ALife::_SPAWN_ID spawn_id(const char* obj_name) const;
};

#include "alife_spawn_registry_inline.h"
7 changes: 0 additions & 7 deletions ogsr_engine/xrGame/alife_spawn_registry_inline.h
Expand Up @@ -44,10 +44,3 @@ IC void CALifeSpawnRegistry::process_spawns (SPAWN_IDS &spawns)
spawns.end()
);
}

IC const ALife::_SPAWN_ID &CALifeSpawnRegistry::spawn_id (const ALife::_SPAWN_STORY_ID &spawn_story_id) const
{
SPAWN_STORY_IDS::const_iterator I = m_spawn_story_ids.find(spawn_story_id);
VERIFY2 (I != m_spawn_story_ids.end(),"Spawn story id cannot be found");
return ((*I).second);
}

0 comments on commit 544daa9

Please sign in to comment.