[mod_sa] Телепорт игрока к себе
|
|
CyberSys |
Дата: Вторник, 18.03.2014, 20:17 | Сообщение # 1
|
Боец
Сообщений: 72
Статус: Offline
|
Доброго времени суток! Начну с того, что расскажу как действует метод телепортации к себе игрока, который находится не в машине. Так-же хочется подметить, что урок показывает как пользоваться InCar синхронизацией. Сам метод: Как вы поняли, мы должны находиться в машине, чтобы хоть как-то зацепить игрока. Далее мы получаем координаты игрока по его иду (игрок должен быть в зоне стрима) или получаем координаты игрока, который находится в нашей прорисовке. Я выбрал первый вариант (по иду). После того как мы получили координаты нашей "жертвы" начинается самое интересное: Код struct actor_info *self = actor_info_get(-1, ACTOR_ALIVE); // получаем структуру актера ( то бишь нас ) struct vehicle_info *info = vehicle_info_get( -1, 0 ); // получаем структуру нашей машины float ZRTV[3]; // переменная в которую будет записываться координаты по иду getPlayerPos(Ид_игрока, ZRTV ); // сама запись (вместо "Ид_игрока" вставляем свою переменную set., для того чтобы самому вводить ид игрока(объявляется в ini.h, ini.cpp) float pos[3]; // переменная в которую будет записываться наши координаты vect3_copy(&info->base.matrix[12], pos); // сама запись stInCarData picSync; //Объявляем синхру ( picSync - можно дать своё название )
memset(&picSync, 0, sizeof(stInCarData)); // Обнуляем объявленную структуру BitSream bsVehicleSync; // объявляем пакет picSync.sVehicleID = g_Players->pLocalPlayer->sCurrentVehicleID; // в пакет записывается ид нашей машины picSync.fPosition[0] = ZRTV[0]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(X) picSync.fPosition[1] = ZRTV[1]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(Y) picSync.fPosition[2] = ZRTV[2]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(Z)
picSync.fPosition[2] -= 0.2; // Уменьшаем координату по Z на 0.2, для того, чтобы лучше захватить игрока cheat_vehicle_teleport(info,picSync.fPosition,0); // телепорт нашей машины на координаты объявленные выше
picSync.fMoveSpeed[0] = info->speed[0]; // запись в пакет скорость нашей машины по X picSync.fMoveSpeed[1] = info->speed[1]; // запись в пакет скорость нашей машины по Y picSync.fMoveSpeed[2] = info->speed[2]; // запись в пакет скорость нашей машины по Z
picSync.fVehicleHealth = info->hitpoints; // запись в пакет "жизни" нашей машины picSync.bytePlayerHealth = self->hitpoints; // запись в пакет наших жизней bsVehicleSync.Write((BYTE)ID_VEHICLE_SYNC); // записываем что используем ID_VEHICLE_SYNC bsVehicleSync.Write((PCHAR)&picSync,sizeof(stInCarData)); // все что писали выше упаковывается g_RakClient->Send(&bsVehicleSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0); // отправление пакета
cheat_vehicle_teleport(info,pos,0); // телепортация машины на наши координаты Лучше всего сделать так, чтобы при нажатии клавиши или кнопки мыши происходило действие, это можно сделать так: Код if ( KEY_DOWN(0x01) ) // Дословно: Если ( Держим(ЛКМ) ) {//тогда наш код; }//конец Осталось только объявить функцию, вставить в ваше меню ( обычное или AntTweakBar ) Код нужно не много доработать, чтобы он работал как часы. Если где-то ошибся можете подправить. Автор: Я, CyberSys Специально для Cheat-master.ru *При размещении данного материала, указывайте ссылку на Cheat-master.ru. Удачи.
Сообщение отредактировал CyberSys - Вторник, 18.03.2014, 20:18 |
|
|
|
[CM]MishaN |
Дата: Вторник, 18.03.2014, 20:52 | Сообщение # 2
|
Cheat-Master
Сообщений: 1308
Статус: Offline
|
Напиши проще - в начало samp.cpp вставить это:
Код void SendFakeDriverSyncData(USHORT VehicleID, float fPos[3], float HealthCar, float Speed[3]) { stInCarData picSync; memset(&picSync, 0, sizeof(stInCarData)); BitStream bsVehicleSync; picSync.sVehicleID = VehicleID; picSync.fPosition[0] = fPos[0]; picSync.fPosition[1] = fPos[1]; picSync.fPosition[2] = fPos[2]; picSync.fVehicleHealth = HealthCar; picSync.fMoveSpeed[0] = Speed[0]; picSync.fMoveSpeed[1] = Speed[1]; picSync.fMoveSpeed[2] = Speed[2];
struct actor_info *self = actor_info_get(-1, ACTOR_ALIVE); picSync.bytePlayerHealth = self->hitpoints; picSync.byteArmor = self->armor;
bsVehicleSync.Write((BYTE) ID_VEHICLE_SYNC); bsVehicleSync.Write((PCHAR)&picSync, sizeof(stInCarData)); g_RakClient->Send(&bsVehicleSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0);
}
* это только тем, у кого не стоит синхра!
после вставить это
Цитата void cmd_ghere (char *param) { struct vehicle_info *vinfo = vehicle_info_get( VEHICLE_SELF, 0 ); if (vinfo == NULL) cheat_state_text("Вы должны находиться в машине!"); else { float fPos[3]; getPlayerPos(atoi(param), fPos); SendFakeDriverSyncData(g_Players->pLocalPlayer->sCurrentVehicleID, fPos, vinfo->hitpoints, vinfo->speed); } } а к командам добавить это:
Код addClientCommand( "ghere", (int)cmd_ghere);
cогласись так код понятнее?
100$ баланса за регистрацию на Digital Ocean [только по данной ссылке] (один из лучших хостингов) RakBot - Качай аккаунты не напрягаясь! Мои товары в CM Shop (NEW!!!)
Сообщение отредактировал [CM]MishaN - Суббота, 19.04.2014, 00:41 |
|
|
|
CyberSys |
Дата: Вторник, 18.03.2014, 21:13 | Сообщение # 3
|
Боец
Сообщений: 72
Статус: Offline
|
[CM]MishaN, разницы 0, мне нравится видеть код. Код не много не доработан, я думаю ты это видишь.
Сообщение отредактировал CyberSys - Вторник, 18.03.2014, 21:14 |
|
|
|
Droider456 |
Дата: Среда, 19.03.2014, 00:28 | Сообщение # 4
|
Новичок
Сообщений: 23
Статус: Offline
|
А можно сделать что бы ближайшего игрока тп на определенные координаты?
|
|
|
|
CyberSys |
Дата: Среда, 19.03.2014, 05:42 | Сообщение # 5
|
Боец
Сообщений: 72
Статус: Offline
|
Droider456, да, можно кинуть в лоадинг или на другие любые координаты.
|
|
|
|
Droider456 |
Дата: Воскресенье, 23.03.2014, 16:11 | Сообщение # 6
|
Новичок
Сообщений: 23
Статус: Offline
|
Цитата Droider456 ( ) CyberSys Так правильно?
Код struct actor_info *self = actor_info_get(-1, ACTOR_ALIVE); // получаем структуру актера ( то бишь нас ) struct vehicle_info *info = vehicle_info_get( -1, 0 ); // получаем структуру нашей машины float ZRTV[3]; // переменная в которую будет записываться координаты по иду getPlayerPos(Ид_игрока, ZRTV ); // сама запись (вместо "Ид_игрока" вставляем свою переменную set., для того чтобы самому вводить ид игрока(объявляется в ini.h, ini.cpp) float pos[3]; // переменная в которую будет записываться наши координаты vect3_copy(&info->base.matrix[12], pos); // сама запись stInCarData picSync; //Объявляем синхру ( picSync - можно дать своё название )
memset(&picSync, 0, sizeof(stInCarData)); // Обнуляем объявленную структуру BitSream bsVehicleSync; // объявляем пакет picSync.sVehicleID = g_Players->pLocalPlayer->sCurrentVehicleID; // в пакет записывается ид нашей машины picSync.fPosition[0] = ZRTV[0]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(X) picSync.fPosition[1] = ZRTV[1]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(Y) picSync.fPosition[2] = ZRTV[2]; // в координаты синхры, вписываем координаты игрока, ид которого вы вписали(Z)
picSync.fPosition[2] -= 0.2; // Уменьшаем координату по Z на 0.2, для того, чтобы лучше захватить игрока cheat_vehicle_teleport(info,picSync.fPosition,0); // телепорт нашей машины на координаты объявленные выше
picSync.fMoveSpeed[0] = info->speed[0]; // запись в пакет скорость нашей машины по X picSync.fMoveSpeed[1] = info->speed[1]; // запись в пакет скорость нашей машины по Y picSync.fMoveSpeed[2] = info->speed[2]; // запись в пакет скорость нашей машины по Z
picSync.fVehicleHealth = info->hitpoints; // запись в пакет "жизни" нашей машины picSync.bytePlayerHealth = self->hitpoints; // запись в пакет наших жизней
bsVehicleSync.Write((BYTE)ID_VEHICLE_SYNC); // записываем что используем ID_VEHICLE_SYNC bsVehicleSync.Write((PCHAR)&picSync,sizeof(stInCarData)); // все что писали выше упаковывается g_RakClient->Send(&bsVehicleSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0); // отправление пакета pPos[0] += 9999999.9; pPos[1] += 9999999.9; pPos[2] += 9999999.9; cheat_vehicle_teleport(vinfo,pPos, 0);
Сообщение отредактировал Droider456 - Воскресенье, 23.03.2014, 16:11 |
|
|
|
CyberSys |
Дата: Воскресенье, 23.03.2014, 17:40 | Сообщение # 7
|
Боец
Сообщений: 72
Статус: Offline
|
Droider456, Ты бы не спрашивал, а проверял. Так тебя кинет самого в лоад.
|
|
|
|
RollUp |
Дата: Понедельник, 24.03.2014, 21:28 | Сообщение # 8
|
Новичок
Сообщений: 8
Статус: Offline
|
getPlayerPos(Ид_игрока, ZRTV); // сама запись (вместо "Ид_игрока" вставляем свою переменную set., для того чтобы самому вводить ид игрока(объявляется в ini.h, ini.cpp) я тут немного не понял что и как что объявлять ?
Сообщение отредактировал RollUp - Понедельник, 24.03.2014, 21:29 |
|
|
|
CyberSys |
Дата: Понедельник, 24.03.2014, 21:42 | Сообщение # 9
|
Боец
Сообщений: 72
Статус: Offline
|
RollUp, смотри, если ты хочешь вводить ид игрока через меню, тебе надо будет объявить. Тебе помочь объявить? Если да, то стучи в лс.
|
|
|
|
Kolapop |
Дата: Суббота, 12.04.2014, 10:18 | Сообщение # 10
|
Любитель
Сообщений: 34
Статус: Offline
|
Так то не плохо
Kopone
|
|
|
|
Edif |
Дата: Суббота, 03.05.2014, 16:31 | Сообщение # 11
|
Боец
Сообщений: 81
Статус: Offline
|
Цитата [CM]MishaN ( ) Напиши проще - в начало samp.cpp вставить это:
Код void SendFakeDriverSyncData(USHORT VehicleID, float fPos[3], float HealthCar, float Speed[3]) { stInCarData picSync; memset(&picSync, 0, sizeof(stInCarData)); BitStream bsVehicleSync; picSync.sVehicleID = VehicleID; picSync.fPosition[0] = fPos[0]; picSync.fPosition[1] = fPos[1]; picSync.fPosition[2] = fPos[2]; picSync.fVehicleHealth = HealthCar; picSync.fMoveSpeed[0] = Speed[0]; picSync.fMoveSpeed[1] = Speed[1]; picSync.fMoveSpeed[2] = Speed[2];
struct actor_info *self = actor_info_get(-1, ACTOR_ALIVE); picSync.bytePlayerHealth = self->hitpoints; picSync.byteArmor = self->armor;
bsVehicleSync.Write((BYTE) ID_VEHICLE_SYNC); bsVehicleSync.Write((PCHAR)&picSync, sizeof(stInCarData)); g_RakClient->Send(&bsVehicleSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0);
} мб в RakClient?
|
|
|
|
|
Edif |
Дата: Суббота, 03.05.2014, 23:35 | Сообщение # 13
|
Боец
Сообщений: 81
Статус: Offline
|
Цитата [CM]MishaN ( ) Edif, без разницы вообще. Хоть в новом файле. а смысл хранить это в samp.cpp? Если вся синхра храниться в RakClient
|
|
|
|
|
Edif |
Дата: Воскресенье, 04.05.2014, 12:38 | Сообщение # 15
|
Боец
Сообщений: 81
Статус: Offline
|
Цитата [CM MishaN;1802592]Edif, я написал, что это для тех у кого ее нет. эм, ты не понял, Цитата [CM MishaN;1621530]Напиши проще - в начало samp.cpp вставить это:
Код void SendFakeDriverSyncData(USHORT VehicleID, float fPos[3], float HealthCar, float Speed[3]) { stInCarData picSync; memset(&picSync, 0, sizeof(stInCarData)); BitStream bsVehicleSync; picSync.sVehicleID = VehicleID; picSync.fPosition[0] = fPos[0]; picSync.fPosition[1] = fPos[1]; picSync.fPosition[2] = fPos[2]; picSync.fVehicleHealth = HealthCar; picSync.fMoveSpeed[0] = Speed[0]; picSync.fMoveSpeed[1] = Speed[1]; picSync.fMoveSpeed[2] = Speed[2];
struct actor_info *self = actor_info_get(-1, ACTOR_ALIVE); picSync.bytePlayerHealth = self->hitpoints; picSync.byteArmor = self->armor;
bsVehicleSync.Write((BYTE) ID_VEHICLE_SYNC); bsVehicleSync.Write((PCHAR)&picSync, sizeof(stInCarData));
g_RakClient->Send(&bsVehicleSync, HIGH_PRIORITY, UNRELIABLE_SEQUENCED, 0);
}
* это только тем, у кого не стоит синхра! я говорю, зачем её в samp.cpp если можно в RakClient?
Сообщение отредактировал Edif - Воскресенье, 04.05.2014, 12:39 |
|
|
|