Другое С/С++ Вопрос - Ответ

Jack_Savage

Участник
150
17
Передача float через ракнет (не samp).
Внимание вопрос: Почему RakNet передает вместо флоат какой то бред ?

k796NSe.png

C++:
enum GameMessages
{
    ID_DATA = ID_USER_PACKET_ENUM + 1,
    OUT_SEND_SYNC,
};

client
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
RakNet::BitStream bsOut;
bsOut.Write((RakNet::MessageID)OUT_SEND_SYNC);
bsOut.Write(position[0]);
bsOut.Write(position[1]);
bsOut.Write(position[2]);
peerInterface->Send(&bsOut, HIGH_PRIORITY, RELIABLE_ORDERED, 0, server, false);
Debug("sendPacket");

server         
void PlayerSync(RakNet::Packet* packet)
{
    Player* p = players->FindByNetID(packet->systemAddress);
    if (p != NULL)
    {
        RakNet::BitStream bsIn(packet->data, packet->length, false);
        float x, y, z;

        bsIn.Read(x);
        bsIn.Read(y);
        bsIn.Read(z);

        printf("MAIN::PlayerSync %f, %f, %f\n", x, y, z);
    }
}
Что за фигня ?
 

ishi

Известный
493
110
ты уверен что там всё правильно?
у меня так бывало, когда я ошибался с адресом на пару байт. и считывал по кускам два значения, которые в итоге выдавали какую-то ересь
 

Jack_Savage

Участник
150
17
ты уверен что там всё правильно?
у меня так бывало, когда я ошибался с адресом на пару байт. и считывал по кускам два значения, которые в итоге выдавали какую-то ересь
float *position = (*(DWORD *)0xB6F5F0) ? (float *)(*(DWORD *)(*(DWORD *)0xB6F5F0 + 0x14) + 0x30) : NULL;
Если ты про это то оно работает и если на клиенте выводить его значение то все нормально
 

Jack_Savage

Участник
150
17
это чтение данных из памяти, ты использщуешь адреса для игры. В RakNet другие адреса. Да и вообще в RakNet они не нужны
Я это приложыл чтобы ясно было что за position...
Мне координаты из воздуха брать что ли...

Я отправляю float, принимаю float уже какой то не такой как надо...
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,460
Ты уверен, что в packet->data хранится только 12 байт, а не 13?
 

ishi

Известный
493
110
Можно как-нибудь выполнить объявление переменной для конкретной функции, не переобъявляя с каждой итерацией функции, и не делая глобальной? (и если кто будет отвечать, то заодно напишите, пожалуйста, окажет ли подобная "подгонка" положительное влияние на производительность, или это лишь усложнит задачу компу)

И ещё один вопрос назрел, пока писал. Я вот так "упрощаю" работу процессору (наверное, так выполнение должно быть быстрее)
C++:
char* PTS;
char* ppts = new char(sstring[144]);
unsigned __int16 nocis, scrx1, screex = 0;
unsigned char red, green, blue = rand();
и вот когда я пытаюсь так же объединить указатели на символьные массивы, как обычные переменные - мне выдаёт ошибку. Можно как-нибудь "упростить" объявление указателей, сгруппировать что ли для пущей производительности?
 
Последнее редактирование:

return

Новичок
82
5
Можно как-нибудь выполнить объявление переменной для конкретной функции, не переобъявляя с каждой итерацией функции, и не делая глобальной?
Один вопрос, для чего?
Читаю твои сообщения и не понимаю тебя... Зачем изобретать какую то дичь, если до тебя уже всё придумали?
 

ishi

Известный
493
110
Один вопрос, для чего?
Читаю твои сообщения и не понимаю тебя... Зачем изобретать какую то дичь, если до тебя уже всё придумали?
Если бы до меня придумали всё, не существовало бы ошибки в коде, которую не смог бы исправить компилятор, анализируя контекст. Если тебе нечего мне сказать по делу - пройди мимо, обоим будет лучше.
 

ishi

Известный
493
110
C++:
short PTC=0;
PTCs = ppts + PTC;
Почему так крашит уже через пару итераций?
C++:
short PTC=1;
PTCs = ppts + PTC;
Вопреки тому, что так не крашит вовсе

это указатель на символ в строчке, если шо