Дмитрий, ты волшебник.
Спасибо за очередные примеры и пояснения. Чем больше будет примеров, тем быстрей я освоюсь в написании плагинов. За ссылки на уроки тоже спасибо. Я сейчас читаю книгу
Прохоренок Н.А. Программирование на С++ в Visual Studio 2010 Express (2010) и дополнительный материал будет кстати.
По примерам:
с первым примером разобрался, всё нормально. Для теста написал небольшой код, глянь верно ли? Можно, что-то оптимизировать? Хотел ещё вывести скорость авто, но что-то не вышло, вот это
CVector GetSpeed(CVector direction) оно или нет? С вектором не понял, как работать. Также не понятно, как вывести название транспорта. Пожалуйста пример.
#include <plugin.h>
#include "game_sa\common.h"
#include "game_sa\CFont.h"
using namespace plugin;
class VehicleGetPosition {
public:
VehicleGetPosition() {
Events::drawingEvent += [] {
CVehicle *vehicle = FindPlayerVehicle(-1, false);
if (vehicle) {
// Настраивем вывод текста
CFont::SetScale(0.5f, 1.0f);
CFont::SetColor(CRGBA(255, 255, 255, 255));
CFont::SetAlignment(ALIGN_LEFT);
CFont::SetOutlinePosition(1);
CFont::SetDropColor(CRGBA(0, 0, 0, 255));
CFont::SetBackground(false, false);
CFont::SetFontStyle(FONT_SUBTITLES);
CFont::SetProp(true);
CFont::SetWrapx(600.0f);
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
float vhealth = vehicle->m_fHealth;
float vmass = vehicle->m_fMass;
CVector posn = vehicle->GetPosition();
char t_speed[16];
char t_health[16];
char t_vmass[16];
char t_posnx[16];
char t_posny[16];
char t_posnz[16];
sprintf(t_speed, "speed %.0f km/h", speed);
sprintf(t_health, "health %.0f \%\%", vhealth/10.0f);
sprintf(t_vmass, "massa %.1f kg", vmass);
sprintf(t_posnx, "posn x %.2f", posn.x);
sprintf(t_posny, "posn y %.2f", posn.y);
sprintf(t_posnz, "posn z %.2f", posn.z);
CFont::PrintString(5.0f, 5.0f, t_speed);
CFont::PrintString(5.0f, 25.0f, t_health);
CFont::PrintString(5.0f, 45.0f, t_vmass);
CFont::PrintString(5.0f, 65.0f, t_posnx);
CFont::PrintString(5.0f, 85.0f, t_posny);
CFont::PrintString(5.0f, 105.0f, t_posnz);
}
};
}
} vehicleGetPosition;
во втором примере пишет
namespase "plugin::Events" не содержит члена "vehicleSetModelEvent"
Пример вызова
Спасибо, теперь ясно. Но есть одно но - при RwMatrixScale если вращать компонент, например дверь, то она принимает стандартный размер. В клео я поэтому вызывал RwFrameScale - тогда компонент при вращении остаётся запланированного масштаба. По примеру попробовал вызвать RwFrameScale так:
RwFrameScale(automobile->m_aCarNodes[CAR_DOOR_LR], &scale, rwCOMBINEPRECONCAT);
Не знаю правильно или нет, но компонент масштабируется, но при вращении опять становится стандартного размера. А при rwCOMBINEREPLACE так и вовсе оказывается в центре модели (как и при вращении с этим параметром после RwMatrixScale). В клео нормально работало, что я делаю не так?
UPD:
RwV3d savedPosn = automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos;
RwV3d scale = { 2.0f, 2.0f, 2.0f };
RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LF]->modelling, &scale, rwCOMBINEREPLACE);
automobile->m_aCarNodes[CAR_DOOR_LF]->modelling.pos = savedPosn;
Можно, как ты написал до этого:
RwV3d scale = { 2.0f, 2.0f, 2.0f };
RwMatrixScale(&automobile->m_aCarNodes[CAR_DOOR_LR]->modelling, &scale, rwCOMBINEPRECONCAT);
только combine поменять на rwCOMBINEPRECONCAT
Но всё равно в обоих вариантах после вращения масштабирование сбрасывается в стандарт.
UPD2:Обновил sdk, пересобрал плагин, теперь
пример, показывает как использовать VehicleExtendedData.
работает.
А практически для чего например можно это использовать в плагине?
UPD3:Со скоростью "разобрался" так:
CVector vspeed = vehicle->m_vLinearVelocity;
float speed = sqrt(vspeed.x*vspeed.x + vspeed.y*vspeed.y + vspeed.z*vspeed.z);
speed *= 180;
Верно?