Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно. Вам необходимо обновить браузер или попробовать использовать другой.
Проверка на индекс не корректная. Первый созданный для игрока имеет индекс 0 и поэтому он игнорируется в OptimizeSampPools__get_vehicle_id
В остальных сущностях так-же.
Еще вопрос. Не нужно ли удалять удалять с вектора адресс при удалении сущности игрой? Он же просто растёт как грибы и при продолжительной игре будет работать в ущерб производительности
Еще вопрос. Не нужно ли удалять удалять с вектора адресс при удалении сущности игрой? Он же просто растёт как грибы и при продолжительной игре будет работать в ущерб производительности
Не нужно и не растет. Тут вектор в максимальной своей размерности совпадает с размером игрового пула. На производительность это не влияет.
О том как это работает
В игре есть пул:
C++:
struct CVehiclePool {
CHeli *objects; // CHeli самый большой класс машин, по этому пул его использует
flag_t *flags;
uint32_t size;
};
В этом пуле objects создается примерно так: objects = new CHeli[size]. Т.е. Это динамически аллоцированыей массив, к объектам которого можно обращаться по индексам, как если бы это был статичный пул CHeli objects[size];.
Мои вектора по типу vehicle_ids это аналогичные пулы, где size часть структуры вектора, а вместо CHeli хранится самповский id.
Я хукаю создание объекта сампом, и из указателя CHeli* вычисляю его индекс в пуле. Это очень простая арифметическая операция без перебора: const auto index = vehicle_ptr - pool->objects (по факту в коде еще есть деление, но это потому что я не завез настоящих игровых структур. С ними деление добавил бы компилятор).
После получения индекса я проверяю, что он не выходит за пределы пула, что бы не ресайзить свой пул (vehicle_ids) больше игрового пула.
Ну и оптимизация самповских циклов работает по такому же принципу. По дефолту сам вызывает функцию поиска id, где перебирает все элементы своего пула и сравнивает указатель на игровой объект. Плагин вместо цикла использует вычитание для получения индекса в игровом пуле (const auto index = vehicle_ptr - pool->objects) и далее просто достает id по этому индексу: const auto samp_id = vehicle_ids[index];.
Edit: залил поправленную версию
TODO: пухукать initgame с id локального игрока
серверная функция GetPlayerTargetActor срабатывает так-же и на обычных игроков. Клиент посылает взаимодействие. Мне кажется эти баги связаны с тем, что у игроков и актёров общий пул
Зашел на самп или евольв, там объекты которые ставят прозрачным, не пропадают - это не должно быть
Обычно без оптимизации плагина, после установки объектов от сервера и убирает для 3д текст - объекты становится прозрачным
Eklenti, gereksiz döngüleri kaldırarak örnek havuzlarıyla çalışmayı optimize eder. Eklenti, id'leri bulmak için döngüler kullanmak yerine oyun yapılarını genişletiyor ve id'leri bunların içine yazıyor.
Eğer bir geliştiriciyseniz, SAMP fonksiyonları aracılığıyla varlık kimliği aramasını kullanarak kodunuzu optimize edebilirsiniz:
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall PlayerPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAPed(struct CPed *gta_ped)[/KOD] İşlev adresi R1: 0x10420 İşlev adresi R3: 0x13570
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ActorPool::findByGTAPed(struct PlayerPool *this, struct CPed *gta_ped)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAPed(struct CPed *gta_ped)[/KOD] R1 ve R3 fonksiyonlarının adresi : 0x18A0
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ObjectPool::findByGTAObject(struct PlayerPool *this, struct CObject *gta_object)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall findByGTAObject(struct CObject *gta_object)[/KOD] Fonksiyon adresi R1: 0xF560 İşlev adresi R3: 0x126C0
[KOD lang="cpp" title="Orijinal imza"]KELİME __thiscall ObjectPool::getVehicleId(struct PlayerPool *this, struct CVehicle *gta_vehicle)[/KOD]
Ancak optimize edilmiş bir fonksiyon basitleştirilmiş bir imza ile çağrılabilir
[KOD lang="cpp" title="Basitleştirilmiş imza"]KELİME __stdcall getVehicleId(struct CVehicle *gta_vehicle)[/KOD] Fonksiyon adresi R1: 0x1B0A0 İşlev adresi R3: 0x1E440
Eklenti, örnek havuzlarına erişmeden kimlik elde etmek için işlevleri dışa aktarır ( dev.zip arşivine bakın ):
[KOD lang="c" title="C ve lua FFI için"]// Türler
typedef int16_t ped_id_t;
typedef int16_t araç_kimliği_t;
typedef int16_t nesne_kimliği_t;