Есть ли в сф аналог printStringNow() из мунлоадера?
void printStringNow(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))0x69F1E0)(text, time, flag, bPreviousBrief);
}
Как узнать открыт ли чат? (SF)
SF->getSamp()->getInput()->bEnabled
void render()
{
if (tab4.act)
{
float mycord[3];
float objcord[3];
float pos[2];
int distance = 0;
int model = 0;
for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
{
if (IsObjOnScreen(i))//крашит тут, функция отсюда: blast.hk/threads/10970/post-529339
{
//player cooord
mycord[0] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[0];
mycord[1] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[1];
mycord[2] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[2];
//objects coords
objcord[0] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[0];
objcord[1] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[1];
objcord[2] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[2];
////next
distance = floor(sqrt(pow((mycord[0] - objcord[0]), 2) + pow((mycord[1] - objcord[1]), 2) + pow((mycord[2] - objcord[2]), 2)));
model = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->model[&i];
SF->getGame()->convert3DCoordsToScreen(objcord[0], objcord[1], objcord[2], &pos[0], &pos[1]);//крашит тут
if (tab2.cases && model == 1239)//крашит тут
{
SF->getRender()->DrawLine(640, 900, 500, 500, 5, 0xFF00FF00);
}
}
}
}
}
Ты в 16, 17,18 ищешь коорды по id объектакрашит игру, я отметил где предположительно происходит краш
help me:void render() { if (tab4.act) { float mycord[3]; float objcord[3]; float pos[2]; int distance = 0; int model = 0; for (int i = 0; i < SAMP_MAX_OBJECTS; i++) { if (IsObjOnScreen(i))//крашит тут, функция отсюда: blast.hk/threads/10970/post-529339 { //player cooord mycord[0] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[0]; mycord[1] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[1]; mycord[2] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[2]; //objects coords objcord[0] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[0]; objcord[1] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[1]; objcord[2] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[2]; ////next distance = floor(sqrt(pow((mycord[0] - objcord[0]), 2) + pow((mycord[1] - objcord[1]), 2) + pow((mycord[2] - objcord[2]), 2))); model = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->model[&i]; SF->getGame()->convert3DCoordsToScreen(objcord[0], objcord[1], objcord[2], &pos[0], &pos[1]);//крашит тут if (tab2.cases && model == 1239)//крашит тут { SF->getRender()->DrawLine(640, 900, 500, 500, 5, 0xFF00FF00); } } } } }
аойТы в 16, 17,18 ищешь коорды по id объекта
все равно крашитТы в 16, 17,18 ищешь коорды по id объекта
Функция рендера вроде должна возвращать true (как в гайде)аой
все равно крашит
тут сурс естькрашит игру, я отметил где предположительно происходит краш
help me:void render() { if (tab4.act) { float mycord[3]; float objcord[3]; float pos[2]; int distance = 0; int model = 0; for (int i = 0; i < SAMP_MAX_OBJECTS; i++) { if (IsObjOnScreen(i))//крашит тут, функция отсюда: blast.hk/threads/10970/post-529339 { //player cooord mycord[0] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[0]; mycord[1] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[1]; mycord[2] = SF->getSAMP()->getPlayers()->remotePlayerInfo[i]->data->onFootPos[2]; //objects coords objcord[0] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[0]; objcord[1] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[1]; objcord[2] = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->position[2]; ////next distance = floor(sqrt(pow((mycord[0] - objcord[0]), 2) + pow((mycord[1] - objcord[1]), 2) + pow((mycord[2] - objcord[2]), 2))); model = SF->getSAMP()->getNetGame()->pools->objectPool->object[i]->model[&i]; SF->getGame()->convert3DCoordsToScreen(objcord[0], objcord[1], objcord[2], &pos[0], &pos[1]);//крашит тут if (tab2.cases && model == 1239)//крашит тут { SF->getRender()->DrawLine(640, 900, 500, 500, 5, 0xFF00FF00); } } } } }
#include <iostream>
char __attribute__ ((section (".TST"))) buffer[0x20];
int main(int argc, char* argv[])
{
std::cout << "0x" << std::hex << (void*)buffer << std::endl;
return 0;
}
stFontInfo* TFONT; //перед маинлупом
TFONT = SF->getRender()->CreateNewFont("Tahoma", 10, FCR_BORDER); //в маинлупе
TFONT->Print("тест", D3DCOLOR_ARGB( 255, 255, 255, 255 ), scr.x, scr.y, false ); //в каллбеке презент
//в итоге выводит тупо закорючки, пробовал разные шрифты так же, многобайтовая кодировка включена
У меня всё работает, возможно у винды есть какие-то особые требования к секциям, либо баги линкера под виндуЕсть код:
C++:#include <iostream> char __attribute__ ((section (".TST"))) buffer[0x20]; int main(int argc, char* argv[]) { std::cout << "0x" << std::hex << (void*)buffer << std::endl; return 0; }
Получившийся в результате компиляции(g++) и линковки виндовый x86 экзешник работает корректно.
Если же добавляю линковщику флаг --section-start,.TST=0x500000, собравшийся .exe не запускается:
Посмотреть вложение 170497
Сравнил оба .exe файла, никаких серьезных различий не нашел. Например, вот отличия между IMAGE_OPTIONAL_HEADER32 рабочего .exe файла (слева) и нерабочего (справа). Отличия подчеркнул красным для удобства
Посмотреть вложение 170498
Тут все справедливо: все адреса после 0x4000 смещены, потому что по адресу 0x4000 располагается .TST секция
Также вот секционные заголовки рабочего (слева) и нерабочего (справа) экзешников:
Посмотреть вложение 170500
Тоже все выглядит нормально.
У меня было только одно предположение - в выравнивании. Явно укзаал линковщику выравнивание кратное 512 --section-alignment=0x1000 --file-alignment=0x1000. Не помогло.
Куда копать, в чем проблема?