როგორც ხედავთ ჩვენ შეგვიძლია ჩავტვირთოთ Custom მოდელები და დავუყენოთ ის ნებისმიერ მოთამაშეს(ობიექტს, დანებს და ასე შემდეგ). CS:GO-ში იყო precache რითიც თამაში ტვირთავდა მოდელებს მეხსიერებაში წინასწარ რათა გამოეყენებინა მომავალში და ნუ თავისთავად ჩვენ შეგვეძლო ეგ precache ფუნქცია გვეპოვა და გამოგვეყენებინა Custom მოდელებისთვის. precache CS2-შიც არსებობს ResourceManager-ში რასაც გამოვიყენებთ ჩვენ რომ ჩავტვირთოთ შემდგომ მოდელი.

თქვენ დაგჭირდებათ CBufferString, აქ კი დავპოსტავდი მაგრამ სამწუხაროდ გამაფრთხილეს რომ არ გამეზიარებინა ამიტომაც ამ პოსტში განვიხილავ ალტერნატივას.


პირველ რიგში ჩვენ დაგვჭირდება CS2-დან ResourceSystem013-ის ამოღება.
Code:
c_resource_system* resource_system = get_interface<c_resource_system>("resourcesystem.dll", "ResourceSystem013");
Code:
template <typename typet = cinterface>
inline typet* get_interface( const char* dll, const char* name )
{
const HINSTANCE module_handle = GetModuleHandle(dll);
if ( !module_handle )
return nullptr;
using create_interface_t = typet * ( * )( const char*, int* );
const create_interface_t create_interface = reinterpret_cast<create_interface_t>( GetProcAddress( module_handle, "CreateInterface" ) );
if ( !create_interface )
return nullptr;
return create_interface( name, nullptr );
};
რადგანაც ინტერფეისი ამოვიღეთ მოდი ახლა გადავიდეთ მთავარ საქმეზე ანუ მოდელის მეხსიერებაში ჩატვირთვაზე, ჩვენ ამისთვის შეგვიძლია გამოვიყენოთ ResourceSystem013-ში 48 ნომერი VTable რომელიც პასუხისმგებელია ჩატვირთვაზე.
Code:
class c_resource_system {
public:
void* LoadResource(const char* path, const char* szName)
{
return vmt::call_virtual<void*>(this, 48U, path, szName);
}
};


ახლა ჩვენ გვესაჭიროება ფუნქცია რომ დავაყენოთ მოდელი, ეს კოდი შეგიძლიათ მოათავსოთ Base_Entity-ს კლასში სადაც გექნებათ სიცოცხლის, ფლეგების და სხვა მნიშვნელოვანი სქემები:
Code:
void set_model( const char* model_name ) {
static auto fn = reinterpret_cast<void* ( __fastcall* )( void*, const char* )>( scan_absolute( "client.dll", "E8 ? ? ? ? 41 8B 55 70", 0x1 ) );
fn( this, model_name );
}
ახლა გადავდივართ ჩატვირთვაში და მოდელის დაყენებაში, ეგზემპლად გამოვიყენებ ლოკალურ მოთამაშის Pawn-ს ანუ აგენტს.
Code:
auto local_player = /*LOCALPLAYER_PAWN*/;
...
std::string modelPath = "characters\\models\\madebyruzh\\ballas1\\ballas1.vmdl";
std::ostringstream ss;
ss << "characte" << modelPath;
std::string result = ss.str();
resource_system->LoadResource(result.c_str(), ""); //result.c_cstr() == charactecharacters\models\madebyruzh\ballas1\ballas1.vmdl
local_player->set_model( modelPath );
გაითვალისწინეთ რომ ფაილებში .vmdl_c იქნება მაგრამ აქ ისე უნდა ჩავტვირთოთ როგორც .vmdl.
გაგიზიარებთ მოდელების ნაკრებს: https://cdn.princeofhell.lol/u/characters.rar
characters ფოლდერი უნდა ჩააგდოთ Steam\steamapps\common\Counter-Strike Global Offensive\game\csgo-ში

წესით სულ ეს არის და მეტი მგონი არაფერი გამომრჩა მაგრამ სხვა ლოგიკას როგორ დასახავთ როგორც შემოწმებას, მენიუში ჩაშენებას და ასე შემდეგ არის დამოკიდებული თქვენზე.
