Ребят, привет. Немного запутался, подскажите пожалуйста
Эта система инвентаря. Если точнее, игрок выбрасывает предмет на землю.
Логика:
1) СЕРВЕР. Я создаю объект на сервере
2) Прямо объекту присваиваю variable
3) Далее ВСЕМ игрокам на карте отправляю событие на клиент, передав туда IDшник созданного объекта на сервере
4) КЛИЕНТ. Далее я на клиенте включаю object.notifyStreaming = true; (это нужно для того, чтобы созданный объект на серверной части мог отображаться в ивенте entityStreamIn на клиетнской части).
5) Финал. Также на клиенте я ожидал , что ивент entityStreamIn вызовется и коллизия выключиться.
Суть проблемы: когда только сервер запускаю и выбрасываю первый предмет на землю , то пункт 5 (ивент entityStreamIn) - не вызывается (хотя по идеи, если ты делаешь object.notifyStreaming = true, то вызваться должен , я это делаю в пункте 4). Потом еще раз что то выбрасываю из инвентаря - и все работает. Последующие выброшенные вещи дальше -тоже работают. Я также делал задержку до появления handle в пункте 4 (await isLoadedEntity handle), но это не помогло.
В целом логика правильная ? правильно ли я создаю объект, даю ему setVariable, передаю данные, через forEach оповещаю игроков, правильно ли делаю синхронизацию и тд тд ? Как вы это делаете, какие варианты у вас ?
Ну и главный вопрос, почему ивент entityStreamIn не вызывается (при первом выбрасывании) после object.notifyStreaming = true ?
UPDATE:
Вот наглядный пример. Выкинул первый предмет, entityStreamIn не вызвался (после object.notifyStreaming = true) и игрок одной ногой стоит на нем.
Выкинул еще, всё отработало прекрасно и коллизия выключилась.
Эта система инвентаря. Если точнее, игрок выбрасывает предмет на землю.
Логика:
1) СЕРВЕР. Я создаю объект на сервере
Код:
const newDropItem = mp.objects.new(
mp.joaat(itemData.joaatName),
new mp.Vector3(p.x, p.y, p.z - Z_OBJECT),
{
rotation: ZERO_VECTOR,
alpha: 255,
dimension: player.dimension,
},
);
2) Прямо объекту присваиваю variable
Код:
newDropItem.setVariable("inv:drop-item:collision", false);
3) Далее ВСЕМ игрокам на карте отправляю событие на клиент, передав туда IDшник созданного объекта на сервере
Код:
mp.players.forEach((user: PlayerMp) => {
user.call(Inventory["SRV-CLI:enable-stream-in:drop-item"], [
newDropItem.id,
]);
});
4) КЛИЕНТ. Далее я на клиенте включаю object.notifyStreaming = true; (это нужно для того, чтобы созданный объект на серверной части мог отображаться в ивенте entityStreamIn на клиетнской части).
Код:
addServer(
Inventory["SRV-CLI:enable-stream-in:drop-item"],
(remoteObjId: number) => {
const object = mp.objects.atRemoteId(remoteObjId);
if (!object) return;
object.notifyStreaming = true;
},
);
5) Финал. Также на клиенте я ожидал , что ивент entityStreamIn вызовется и коллизия выключиться.
Код:
mp.events.add("entityStreamIn", (entity: EntityMp) => {
if (!entity || entity.type !== "object" || entity.handle === 0) {
return;
}
const value = entity.getVariable("inv:drop-item:collision");
if (typeof value === "boolean") {
entity.setCollision(value, value);
}
});
Суть проблемы: когда только сервер запускаю и выбрасываю первый предмет на землю , то пункт 5 (ивент entityStreamIn) - не вызывается (хотя по идеи, если ты делаешь object.notifyStreaming = true, то вызваться должен , я это делаю в пункте 4). Потом еще раз что то выбрасываю из инвентаря - и все работает. Последующие выброшенные вещи дальше -тоже работают. Я также делал задержку до появления handle в пункте 4 (await isLoadedEntity handle), но это не помогло.
В целом логика правильная ? правильно ли я создаю объект, даю ему setVariable, передаю данные, через forEach оповещаю игроков, правильно ли делаю синхронизацию и тд тд ? Как вы это делаете, какие варианты у вас ?
Ну и главный вопрос, почему ивент entityStreamIn не вызывается (при первом выбрасывании) после object.notifyStreaming = true ?
UPDATE:
Вот наглядный пример. Выкинул первый предмет, entityStreamIn не вызвался (после object.notifyStreaming = true) и игрок одной ногой стоит на нем.
Выкинул еще, всё отработало прекрасно и коллизия выключилась.
Последнее редактирование: