Merge pull request #866 from MihailRis/new-entity-event

add on_player_set entity component event
This commit is contained in:
MihailRis 2026-07-18 20:18:06 +03:00 • committed by GitHub
commit 9d8d00209c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 40 additions and 15 deletions

View file

@ -264,3 +264,9 @@ function on_used(playerid: int)
``` ```
Called when an entity is used (RMB by entity). The player ID is passed as an argument. Called when an entity is used (RMB by entity). The player ID is passed as an argument.
```lua
function on_player_set(playerid: int)
```
Called when an entity is attached to a player.

View file

@ -265,3 +265,8 @@ function on_used(playerid: int)
Вызывается при использовании сущности (ПКМ по сущности). ID игрока передается в качестве аргумента. Вызывается при использовании сущности (ПКМ по сущности). ID игрока передается в качестве аргумента.
```lua
function on_player_set(playerid: int)
```
Вызывается при прикреплении сущности к игроку.

View file

@ -142,14 +142,16 @@ end
function is_flight() return flight end function is_flight() return flight end
function set_flight(flag) flight = flag end function set_flight(flag)
flight = flag
body:set_gravity_scale(flight and 0.0 or props.gravity_scale)
end
local prev_angle = (vec2.angle({dir[3], dir[1]})) % 360 local prev_angle = (vec2.angle({dir[3], dir[1]})) % 360
function on_physics_update(delta) function on_physics_update(delta)
local grounded = body:is_grounded() local grounded = body:is_grounded()
body:set_vdamping(flight) body:set_vdamping(flight)
body:set_gravity_scale(flight and 0.0 or props.gravity_scale)
body:set_linear_damping( body:set_linear_damping(
(flight or not grounded) and props.air_damping or props.ground_damping (flight or not grounded) and props.air_damping or props.ground_damping
) )

View file

@ -58,16 +58,12 @@ local function process_player_inputs(pid, rot, delta)
end end
end end
local prepared = false function on_player_set(pid)
body:set_enabled(false) mob.set_flight(player.is_flight(pid))
mob.set_flight(true) body:set_body_type(player.is_noclip(pid) and "kinematic" or "dynamic")
end
function on_physics_update(delta) function on_physics_update(delta)
if not prepared then
prepared = true
body:set_enabled(true)
end
local pid = entity:get_player() local pid = entity:get_player()
if pid == -1 then if pid == -1 then
return return

View file

@ -82,7 +82,6 @@ void LevelController::update(float delta, bool pause) {
continue; continue;
} }
player->rotationInterpolation.updateTimer(delta); player->rotationInterpolation.updateTimer(delta);
player->updateEntity();
glm::vec3 position = player->getPosition(); glm::vec3 position = player->getPosition();
player->chunks->configure( player->chunks->configure(
glm::floor(position.x), glm::floor(position.x),
@ -96,9 +95,9 @@ void LevelController::update(float delta, bool pause) {
*player, *player,
player.get() == clientPlayer player.get() == clientPlayer
); );
player->updateEntity();
} }
if (!pause) { if (!pause) {
// update all objects that needed
blocks->update(delta, settings.chunks.padding.get()); blocks->update(delta, settings.chunks.padding.get());
level->entities->update(delta); level->entities->update(delta);
for (const auto& [_, player] : *level->players) { for (const auto& [_, player] : *level->players) {

View file

@ -142,6 +142,7 @@ namespace scripting {
void on_entity_grounded(const Entity& entity, float force); void on_entity_grounded(const Entity& entity, float force);
void on_entity_fall(const Entity& entity); void on_entity_fall(const Entity& entity);
void on_entity_save(const Entity& entity); void on_entity_save(const Entity& entity);
void on_entity_player_set(const Entity& entity, int64_t pid);
void on_entities_update(int tps, int parts, int part); void on_entities_update(int tps, int parts, int part);
void on_entities_physics_update(float delta); void on_entities_physics_update(float delta);
void on_entities_render(float delta); void on_entities_render(float delta);

View file

@ -71,6 +71,7 @@ static void init_component_events(
funcsset.on_aim_off = lua::hasfield(L, "on_aim_off"); funcsset.on_aim_off = lua::hasfield(L, "on_aim_off");
funcsset.on_attacked = lua::hasfield(L, "on_attacked"); funcsset.on_attacked = lua::hasfield(L, "on_attacked");
funcsset.on_used = lua::hasfield(L, "on_used"); funcsset.on_used = lua::hasfield(L, "on_used");
funcsset.on_player_set = lua::hasfield(L, "on_player_set");
lua::pop(L); lua::pop(L);
} }
@ -238,6 +239,15 @@ void scripting::on_entity_save(const Entity& entity) {
); );
} }
void scripting::on_entity_player_set(const Entity& entity, int64_t pid) {
process_entity_callback(
entity,
"on_player_set",
&EntityFuncsSet::on_player_set,
[pid](auto L) { return lua::pushinteger(L, pid); }
);
}
void scripting::on_sensor_enter( void scripting::on_sensor_enter(
const Entity& entity, size_t index, entityid_t oid const Entity& entity, size_t index, entityid_t oid
) { ) {

View file

@ -113,6 +113,11 @@ int64_t Entity::getPlayer() const {
} }
void Entity::setPlayer(int64_t id) { void Entity::setPlayer(int64_t id) {
registry.get<EntityId>(entity).player = id; auto& eid = registry.get<EntityId>(entity);
if (eid.player == id) {
return;
}
eid.player = id;
scripting::on_entity_player_set(*this, id);
} }

View file

@ -81,7 +81,7 @@ void Player::updateEntity() {
} }
} }
Hitbox* Player::getHitbox() { Hitbox* Player::getHitbox() const {
if (auto entity = level.entities->get(eid)) { if (auto entity = level.entities->get(eid)) {
return &entity->getRigidbody().hitbox; return &entity->getRigidbody().hitbox;
} }

View file

@ -135,7 +135,7 @@ public:
bool isCurrentCameraBuiltin() const; bool isCurrentCameraBuiltin() const;
Hitbox* getHitbox(); Hitbox* getHitbox() const;
void setSpawnPoint(glm::vec3 point); void setSpawnPoint(glm::vec3 point);
glm::vec3 getSpawnPoint() const; glm::vec3 getSpawnPoint() const;

View file

@ -17,6 +17,7 @@ struct EntityFuncsSet {
bool on_aim_off; bool on_aim_off;
bool on_attacked; bool on_attacked;
bool on_used; bool on_used;
bool on_player_set;
}; };
struct UserComponent { struct UserComponent {