Privacy policy / Opium

Prince of Hell

სასწაული ფორუმი


Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
კოდი Custom Model Changer CS2-სთვის
#1
Tongue 

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

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

პირველ რიგში ჩვენ დაგვჭირდება CS2-დან ResourceSystem013-ის ამოღება.
Code:
c_resource_system* resource_system = get_interface<c_resource_system>("resourcesystem.dll", "ResourceSystem013");
ასე მარტივად ჩვენ ამოვიღებთ ResourceSystem013-ს, წესით თუ აქამდე მოხვედით უნდა გაგაჩნდეთ Interface-ს ამოღების ფუნქცია მაგრამ ვისაც არ გააჩნია შეგიძლიათ გამოიყენოთ შემდეგი:
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 );
};
გაითვალისწინეთ რომ ამ პოსტს იმ მიზნით არ ვდებ რომ კოდი ასე უბრალოდ გაგიზიაროთ, გამოიყენეთ ეს და სხვა პოსტები როგორც სასწავლად და არა იმ მიზნით რომ უბრალოდ Copy + Paste ქნათ თქვენს ჩეთში, მთავარი ხალისი და მუღამი იმაშია რომ პრობლემები თქვენით აღმოპყვრათ, მაგრამ თუ რაიმე პრობლემა გაგიჩნდათ რასაც ვერ ასწორებთ რამოდენიმე საათიანი წვალების შემდგომ შეგიძლიათ დატოვოთ კომენტარი/პოსტი.

რადგანაც ინტერფეისი ამოვიღეთ მოდი ახლა გადავიდეთ მთავარ საქმეზე ანუ მოდელის მეხსიერებაში ჩატვირთვაზე, ჩვენ ამისთვის შეგვიძლია გამოვიყენოთ 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);
    }
};
ეჭვი მეპარება VTable გადაადგილონ მაგრამ თუ ეგრე მოხდა შეგიძლიათ IDA-ში ან რომელიმე დისასემბლერში მარტივად მონახოთ.  Dodgy Dodgy

ახლა ჩვენ გვესაჭიროება ფუნქცია რომ დავაყენოთ მოდელი, ეს კოდი შეგიძლიათ მოათავსოთ 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-ში  Tongue

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


Reply
Topic Options
Forum Jump:




Users browsing this thread: 1 Guest(s)