mirror of
https://github.com/XLabsProject/s1x-client.git
synced 2023-08-02 15:02:12 +02:00
Support endon for scripts
This commit is contained in:
parent
9e301934dd
commit
918adb652a
@ -328,6 +328,7 @@ namespace scripting::lua
|
||||
|
||||
void context::notify(const event& e)
|
||||
{
|
||||
this->scheduler_.dispatch(e);
|
||||
this->event_handler_.dispatch(e);
|
||||
}
|
||||
|
||||
|
@ -14,6 +14,11 @@ namespace scripting::lua
|
||||
{
|
||||
this->remove(handle);
|
||||
};
|
||||
|
||||
event_listener_handle_type["endon"] = [this](const event_listener_handle& handle, const entity& entity, const std::string& event)
|
||||
{
|
||||
this->add_endon_condition(handle, entity, event);
|
||||
};
|
||||
}
|
||||
|
||||
void event_handler::dispatch(const event& event)
|
||||
@ -24,6 +29,7 @@ namespace scripting::lua
|
||||
callbacks_.access([&](task_list& tasks)
|
||||
{
|
||||
this->merge_callbacks();
|
||||
this->handle_endon_conditions(event);
|
||||
|
||||
for (auto i = tasks.begin(); i != tasks.end();)
|
||||
{
|
||||
@ -70,6 +76,27 @@ namespace scripting::lua
|
||||
return {id};
|
||||
}
|
||||
|
||||
void event_handler::add_endon_condition(const event_listener_handle& handle, const entity& entity,
|
||||
const std::string& event)
|
||||
{
|
||||
auto merger = [&](task_list& tasks)
|
||||
{
|
||||
for(auto& task : tasks)
|
||||
{
|
||||
if(task.id == handle.id)
|
||||
{
|
||||
task.endon_conditions.emplace_back(entity, event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
callbacks_.access([&](task_list& tasks)
|
||||
{
|
||||
merger(tasks);
|
||||
new_callbacks_.access(merger);
|
||||
});
|
||||
}
|
||||
|
||||
void event_handler::clear()
|
||||
{
|
||||
callbacks_.access([&](task_list& tasks)
|
||||
@ -106,13 +133,33 @@ namespace scripting::lua
|
||||
{
|
||||
new_callbacks_.access([&](task_list& new_tasks)
|
||||
{
|
||||
tasks.insert(tasks.end(), std::move_iterator<task_list::iterator>(new_tasks.begin()),
|
||||
std::move_iterator<task_list::iterator>(new_tasks.end()));
|
||||
tasks.insert(tasks.end(), std::move_iterator(new_tasks.begin()),
|
||||
std::move_iterator(new_tasks.end()));
|
||||
new_tasks = {};
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
void event_handler::handle_endon_conditions(const event& event)
|
||||
{
|
||||
auto deleter = [&](task_list& tasks)
|
||||
{
|
||||
for(auto& task : tasks)
|
||||
{
|
||||
for(auto& condition : task.endon_conditions)
|
||||
{
|
||||
if(condition.first == event.entity && condition.second == event.name)
|
||||
{
|
||||
task.is_deleted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
callbacks_.access(deleter);
|
||||
}
|
||||
|
||||
event_arguments event_handler::build_arguments(const event& event) const
|
||||
{
|
||||
event_arguments arguments;
|
||||
|
@ -19,6 +19,7 @@ namespace scripting::lua
|
||||
event_callback callback = {};
|
||||
bool is_volatile = false;
|
||||
bool is_deleted = false;
|
||||
std::vector<std::pair<scripting::entity, std::string>> endon_conditions{};
|
||||
};
|
||||
|
||||
class event_handler final
|
||||
@ -48,6 +49,9 @@ namespace scripting::lua
|
||||
|
||||
void remove(const event_listener_handle& handle);
|
||||
void merge_callbacks();
|
||||
void handle_endon_conditions(const event& event);
|
||||
|
||||
void add_endon_condition(const event_listener_handle& handle, const entity& entity, const std::string& event);
|
||||
|
||||
event_arguments build_arguments(const event& event) const;
|
||||
};
|
||||
|
@ -12,6 +12,35 @@ namespace scripting::lua
|
||||
{
|
||||
this->remove(handle);
|
||||
};
|
||||
|
||||
task_handle_type["endon"] = [this](const task_handle& handle, const entity& entity, const std::string& event)
|
||||
{
|
||||
this->add_endon_condition(handle, entity, event);
|
||||
};
|
||||
}
|
||||
|
||||
void scheduler::dispatch(const event& event)
|
||||
{
|
||||
auto deleter = [&](task_list& tasks)
|
||||
{
|
||||
for(auto& task : tasks)
|
||||
{
|
||||
for(auto& condition : task.endon_conditions)
|
||||
{
|
||||
if(condition.first == event.entity && condition.second == event.name)
|
||||
{
|
||||
task.is_deleted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
callbacks_.access([&](task_list& tasks)
|
||||
{
|
||||
deleter(tasks);
|
||||
new_callbacks_.access(deleter);
|
||||
});
|
||||
}
|
||||
|
||||
void scheduler::run_frame()
|
||||
@ -89,6 +118,26 @@ namespace scripting::lua
|
||||
return {id};
|
||||
}
|
||||
|
||||
void scheduler::add_endon_condition(const task_handle& handle, const entity& entity, const std::string& event)
|
||||
{
|
||||
auto merger = [&](task_list& tasks)
|
||||
{
|
||||
for(auto& task : tasks)
|
||||
{
|
||||
if(task.id == handle.id)
|
||||
{
|
||||
task.endon_conditions.emplace_back(entity, event);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
callbacks_.access([&](task_list& tasks)
|
||||
{
|
||||
merger(tasks);
|
||||
new_callbacks_.access(merger);
|
||||
});
|
||||
}
|
||||
|
||||
void scheduler::remove(const task_handle& handle)
|
||||
{
|
||||
auto mask_as_deleted = [&](task_list& tasks)
|
||||
|
@ -19,6 +19,7 @@ namespace scripting::lua
|
||||
std::chrono::milliseconds delay{};
|
||||
bool is_volatile = false;
|
||||
bool is_deleted = false;
|
||||
std::vector<std::pair<entity, std::string>> endon_conditions{};
|
||||
};
|
||||
|
||||
class scheduler final
|
||||
@ -32,6 +33,7 @@ namespace scripting::lua
|
||||
scheduler(const scheduler&) = delete;
|
||||
scheduler& operator=(const scheduler&) = delete;
|
||||
|
||||
void dispatch(const event& event);
|
||||
void run_frame();
|
||||
void clear();
|
||||
|
||||
@ -44,6 +46,8 @@ namespace scripting::lua
|
||||
utils::concurrency::container<task_list, std::recursive_mutex> callbacks_;
|
||||
std::atomic_int64_t current_task_id_ = 0;
|
||||
|
||||
void add_endon_condition(const task_handle& handle, const entity& entity, const std::string& event);
|
||||
|
||||
void remove(const task_handle& handle);
|
||||
void merge_callbacks();
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user