Как сделать рандомный слип например от 50 до 100 мс?
Google: CreateRemoteThreadВсем здравствуйте. Надеюсь, эксперты помогут мне в решении проблемы. Суть в том, что хочу как-то использовать встоенные в GTA SA функции (пример: написать белый текст снизу экрана) своей программой. У DarkP1xel`я заметил следующее:
Но это для DLL библиотеки, я же хочу для стандартного "консольного приложения".
float pos[3];
for (int i = 0; i < SAMP_MAX_OBJECTS; i++)
{
if (SF->getSAMP()->getInfo()->pPools->pObject->iIsListed[i] != 1)
continue;
if (SF->getSAMP()->getInfo()->pPools->pObject->object[i] == NULL)
continue;
if (SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity == NULL)
continue;
pos[0] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[0];
pos[1] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[1];
pos[2] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[2];
Как получить коорды объекта / модели? Попытался сам написать, что-то не то вообщем
C++:float pos[3]; for (int i = 0; i < SAMP_MAX_OBJECTS; i++) { if (SF->getSAMP()->getInfo()->pPools->pObject->iIsListed[i] != 1) continue; if (SF->getSAMP()->getInfo()->pPools->pObject->object[i] == NULL) continue; if (SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity == NULL) continue; pos[0] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[0]; pos[1] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[1]; pos[2] = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->fPos[2];
if (pObj->iModel == objes[4])
{
memcpy(pos, &SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.matrix[12], sizeof(float)* 3);
// uint16_t model_id = SF->getSAMP()->getInfo()->pPools->pObject->object[i]->pGTAEntity->base.model_alt_id;
SF->getGame()->convert3DCoordsToScreen(position[0], position[1], position[2], &obmypos[0], &obmypos[1]);
SF->getGame()->convert3DCoordsToScreen(pos[0], pos[1], pos[2], &obsreen[0], &obsreen[1]);
if (IsOnScreen(i))
{
SF->getRender()->DrawLine(obmypos[0], obmypos[1], obsreen[0], obsreen[1], sizelin[4], 0xFF00FF00);
}
}
#include <iostream>
using namespace std;
class Man1 {
public:
void do1() {
cout << "Man1" << endl;
}
};
class Man2 {
public:
void do2() {
cout << "Man2" << endl;
}
};
class Cell {
public:
enum class Type {
man1, man2
}; // Всевозможные типы
Type type;
void *pMan; // Указатель на Man1 или Man2, в зависимости от того, что находится в type
Cell(Type x, void *px) : type(x), pMan(px) {}
};
int main(void)
{
Cell *cell = new Cell(Cell::Type::man2, new Man2);
if(cell->type == Cell::Type::man1) // false
static_cast<Man1*>(cell->pMan)->do1();
else if (cell->type == Cell::Type::man2) // true
static_cast<Man2*>(cell->pMan)->do2(); // выведет Man2
return 0;
}
Cell(Cell::Type::man1, new Man2);
{"as":"AS21127 JSC \"Zap-Sib TransTeleCom\", FFFFFFF","city":"FFFFFFF","country":"SSSSSS","countryCode":"RU","isp":"JSC \"Zap-Sib TransTeleCom\"","lat":12.1234,"lon":23.34,"org":"JSC Zap-Sib TransTeleCom","query":"97.1445.1541.67","region":"WER","regionName":"QWERTY","status":"success","timezone":"Asia/ESFFF","zip":"653008"}
https://github.com/nlohmann/jsonКак из данной строки получить "97.1445.1541.67" ?
Код:{"as":"AS21127 JSC \"Zap-Sib TransTeleCom\", FFFFFFF","city":"FFFFFFF","country":"SSSSSS","countryCode":"RU","isp":"JSC \"Zap-Sib TransTeleCom\"","lat":12.1234,"lon":23.34,"org":"JSC Zap-Sib TransTeleCom","query":"97.1445.1541.67","region":"WER","regionName":"QWERTY","status":"success","timezone":"Asia/ESFFF","zip":"653008"}
через регулярки можно же вроде без json. На LUA делал - работало.
ip = text:match('"query":"(.*)","region"')
DLL
Есть ли уроки по созданию меню (не imgui)?
Мне кажется, немножко детали упущены по поводу того, как это все должно использоваться. Это к тому, что, возможно, задачу можно будет свести к использованию обвертки с помощью std::bind или лямбда-выражения, либо же, всегда применить другую парадигму.Небольшая абстрактная задачка
#include <variant>
using Cell = std::variant<Man1*, Man2*>;
void usage_one(Cell cell) {
if (auto man1 = std::get_if<Man1*>(&cell)) {
(*man1)->do1();
} else if (auto man2 = std::get_if<Man2*>(&cell)) {
(*man2)->do2();
}
}
#include <type_traits>
namespace std {
template <class T, class... R>
struct is_any : std::disjunction<std::is_same<T, R>...> {};
}
template <typename C>
class CellWrapper {
public:
C* pMan;
CellWrapper(C* ptr) : pMan(ptr) {
// static_assert(std::is_class<C>::value);
static_assert(std::is_any<C, Man1, Man2>::value,
"CellWrapper could be created only with Man1 and Man2"
);
};
C* operator->() {
return this->pMan;
}
};
template<typename C>
void usage_two(CellWrapper<C>* cell) {
if constexpr (std::is_same<C, Man1>()) {
(*cell)->do1();
} else if constexpr (std::is_same<C, Man2>()) {
(*cell)->do2();
}
}
int main(void) {
{
auto cell = Cell(new Man1);
usage_one(cell);
}
{
auto cell = CellWrapper(new Man2);
usage_two(&cell); // как и просилось, именно указатель
}
}
Есть массив (обертка не подойдет) объектов Cell. Из этого массива произвольным образом выбирается элемент, и, в зависимости от типа ассоциированного с ним объекта другого класса, выполняются определенные действия. По сути, полиморфизм времени выполнения. На псевдокоде это выглядит так:Мне кажется, немножко детали упущены по поводу того, как это все должно использоваться.
// Cell type1 fileds: index, name, doSmth11(), doSmth12()
// Cell type2 fileds: cost, group, doSmth21(), doSmth22()
Cell cellArr[N];
fill(cellArr);
a = cellArr[random(0,N-1)];
if (a.type == type1)
{
a.doSmth11();
a.doSmth12();
}
else if (a.type == type2)
{
a.doSmth21();
a.doSmth22();
}
upd: На cppReference ничего об этом не сказано. Также безрезультатно гуглил в других сточниках. Можно поинтересоваться, откуда информация?P.S. Хотелось бы посоветовать не использовать new в современных проектах: начиная с C++20 new является deprecated. Даже в примерах выше по причине использования new была продемонстрирована утечка памяти
Последний из способов, наверное, наиболее благоприятный по причине низкой посадки по рантаймуХотелось бы увидеть реализацию подобного на c++
#include <iostream>
#include <vector>
#include <any>
#include <typeindex>
#include <typeinfo>
struct Man1 {
unsigned long long index = 0LL;
std::string name = "Name";
void doSmth11() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->index << std::endl;
}
void doSmth12() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->name << std::endl;
}
};
struct Man2 {
unsigned long long cost = 2222LL;
std::string group = "Group";
void doSmth21() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->cost << std::endl;
}
void doSmth22() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->group << std::endl;
}
};
int main() {
std::vector<std::any> pool;
pool.push_back(Man1{});
pool.push_back(Man2{});
for (auto&& e : pool) {
if (std::type_index(e.type()) == std::type_index(typeid(Man1))) {
auto restoredMan1 = std::any_cast<Man1>(e);
restoredMan1.doSmth11();
restoredMan1.doSmth12();
} else if (e.type().hash_code() == typeid(Man2).hash_code()) {
auto restoredMan2 = std::any_cast<Man2>(e);
restoredMan2.doSmth21();
restoredMan2.doSmth22();
}
}
}
#include <iostream>
#include <vector>
struct ManEssential {
virtual void __unused(void) {};
};
struct Man1 : ManEssential {
unsigned long long index = 0LL;
std::string name = "Name";
void doSmth11() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->index << std::endl;
}
void doSmth12() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->name << std::endl;
}
};
struct Man2 : ManEssential {
unsigned long long cost = 2222LL;
std::string group = "Group";
void doSmth21() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->cost << std::endl;
}
void doSmth22() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->group << std::endl;
}
};
int main() {
std::vector<ManEssential*> pool;
pool.push_back(new Man2);
pool.push_back(new Man1);
for (auto&& e : pool) {
if (auto restoredMan1 = dynamic_cast<Man1*>(e)) {
restoredMan1->doSmth11();
restoredMan1->doSmth12();
} else if (auto restoredMan2 = dynamic_cast<Man2*>(e)) {
restoredMan2->doSmth21();
restoredMan2->doSmth22();
}
}
}
#include <iostream>
#include <vector>
struct Man1 {
unsigned long long index = 0LL;
std::string name = "Name";
void doSmth11() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->index << std::endl;
}
void doSmth12() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->name << std::endl;
}
};
struct Man2 {
unsigned long long cost = 2222LL;
std::string group = "Group";
void doSmth21() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->cost << std::endl;
}
void doSmth22() {
std::cout << __PRETTY_FUNCTION__ << ' ' <<
this->group << std::endl;
}
};
enum class ManSubtype {
kMan1,
kMan2
};
struct ObjectSlicing : public Man1, public Man2 {
const ManSubtype type;
template<typename T>
ObjectSlicing(const T&& man) : type([=] {
if constexpr (std::is_same<T, Man1>()) {
return ManSubtype::kMan1;
} else if constexpr (std::is_same<T, Man2>()) {
return ManSubtype::kMan2;
}
}())
{}
};
int main() {
std::vector<class ObjectSlicing> pool;
pool.push_back(ObjectSlicing(Man1{}));
pool.push_back(ObjectSlicing(Man2{}));
for (auto&& e : pool) {
if (e.type == ManSubtype::kMan1) {
Man1 restoredMan1 = e;
restoredMan1.doSmth11();
restoredMan1.doSmth12();
} else if (e.type == ManSubtype::kMan2) {
Man2 restoredMan2 = e;
restoredMan2.doSmth21();
restoredMan2.doSmth22();
}
}
}
Первоапрельская шутка 2018 года, не воспринимайте всерьезМожно поинтересоваться, откуда информация?
samp.dll + 0x66655 =>Каким образом можно поменять расположение киллстата по вертикали?