Начинающий
Начинающий
- Статус
- Оффлайн
- Регистрация
- 18 Май 2025
- Сообщения
- 3
- Реакции
- 0
Я обновил darkside скинченджер, он заменяет скины на оружия перчатки, но ножи нет, сама модель заменяется а анимации и вся хуйня нет, я правильно понял что это из за того что убрали m_pViewModelServices через который надо было вызывать как и для оружия set mesh group mask? если да то есть какая то альтернатива как можно обновить нож во вью моделе игрока сейчас? так же скины на оружия кривые, кто сможет помочь отпишите @sdfhjsdhfj324
skins.hpp:
#pragma once
#include "../../darkside.hpp"
class c_dumped_skins {
public:
const char* m_name = "";
int m_id = 0;
int m_rarity = 0;
};
class c_dumped_item {
public:
const char* m_name = "";
uint16_t m_def_index = 0;
int m_rarity = 0;
bool m_unusual_item = false;
std::vector<c_dumped_skins> m_dumped_skins{};
c_dumped_skins* m_selected_skin = nullptr;
};
enum e_material_magic_numbers : std::uint32_t {
MATERIAL_NUMBER_GLOVES = 0xF143B82A
};
class c_material_record {
public:
std::uint32_t m_unknown;
e_material_magic_numbers m_magic_number;
std::uint32_t m_handle;
std::uint32_t m_type;
};
class c_material_data {
public:
c_material_record* m_records;
std::int32_t m_records_size;
};
class c_skins {
public:
std::vector<c_dumped_item> m_dumped_items;
bool update = false;
struct {
std::array<int, 20> m_knife_idxs = { 500, 503, 505, 506, 507, 508, 509, 512, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 525, 526 };
std::vector<const char*> m_dumped_knife_models;
std::vector<const char*> m_dumped_knife_name;
} m_knives;
struct {
std::vector<const char*> m_dumped_glove_models;
std::vector<const char*> m_dumped_glove_name;
std::vector<int> m_glove_idxs;
} m_gloves;
void dump_items( );
void glove_changer( );
void knife_changer( int stage );
};
inline const auto g_skins = std::make_unique<c_skins>( );
skins.cpp:
#include "skins.hpp"
static bool is_paint_kit_for_weapon( c_paint_kit* paint_kit, const char* weapon_id )
{
auto path = "panorama/images/econ/default_generated/" + std::string( weapon_id ) + "_" + paint_kit->m_name + "_light_png.vtex_c";
return g_interfaces->m_file_system->exists( path.c_str(), "GAME" );
}
void c_skins::dump_items( ) {
auto item_schema = g_interfaces->m_client->get_econ_item_system( )->get_econ_item_schema( );
if ( !item_schema )
return;
if ( !m_dumped_items.empty( ) )
return;
const auto& vec_items = item_schema->get_sorted_item_definition_map();
const auto& paint_kits = item_schema->get_paint_kits();
for ( const auto& it : vec_items )
{
c_econ_item_definition* item = it.m_value;
if ( !item )
continue;
const bool is_weapon = item->is_weapon( );
const bool is_agent = item->is_agent( );
const bool is_knife = item->is_knife( true );
const bool is_glove = item->is_glove( true );
const char* item_base_name = item->m_item_base_name();
if ( !item_base_name || item_base_name[ 0 ] == '\0' )
continue;
if ( is_knife )
{
m_knives.m_dumped_knife_models.emplace_back( item->get_model_name( ) );
m_knives.m_dumped_knife_name.emplace_back( g_interfaces->m_localize->find_key( item->m_item_base_name()) );
}
if ( is_glove ) {
m_gloves.m_dumped_glove_models.emplace_back( item->get_model_name( ) );
m_gloves.m_dumped_glove_name.emplace_back( g_interfaces->m_localize->find_key( item->m_item_base_name()) );
m_gloves.m_glove_idxs.emplace_back( item->m_definition_index());
}
if ( !is_weapon && !is_knife && !is_glove )
continue;
c_dumped_item dumped_item{};
dumped_item.m_name = g_interfaces->m_localize->find_key( item_base_name );
dumped_item.m_def_index = item->m_definition_index();
dumped_item.m_rarity = item->m_item_rarity();
if ( is_knife || is_glove )
dumped_item.m_unusual_item = true;
for ( const auto& it : paint_kits )
{
c_paint_kit* paint_kit = it.m_value;
if ( !paint_kit || paint_kit->m_id == 0 || paint_kit->m_id == 9001 )
continue;
if ( !is_paint_kit_for_weapon( paint_kit, item->get_simple_weapon_name() ) )
continue;
c_dumped_skins dumped_skin;
dumped_skin.m_name = g_interfaces->m_localize->find_key( paint_kit->m_description_tag );
dumped_skin.m_id = paint_kit->m_id;
dumped_skin.m_rarity = paint_kit->m_rarity;
dumped_item.m_dumped_skins.emplace_back(dumped_skin);
}
if ( !dumped_item.m_dumped_skins.empty( ) && is_weapon )
std::sort( dumped_item.m_dumped_skins.begin( ), dumped_item.m_dumped_skins.end( ), []( const c_dumped_skins& a, const c_dumped_skins& b ) { return a.m_rarity > b.m_rarity; } );
m_dumped_items.emplace_back( dumped_item );
}
}
void c_skins::glove_changer() {
c_cs_player_pawn* local_player = g_ctx->m_local_pawn;
if ( m_gloves.m_dumped_glove_models.empty( ) )
return;
auto item_schema = g_interfaces->m_client->get_econ_item_system( )->get_econ_item_schema( );
if ( !item_schema )
return;
c_econ_item_view* econ_glove = &local_player->m_econ_glove( );
int currnet_model = m_gloves.m_glove_idxs[ g_cfg->skins.m_gloves.m_selected ];
int model_skin = g_cfg->skins.m_skin_settings[ g_cfg->skins.m_selected_weapon ].m_paint_kit;
static int last_skin = -1;
static float last_spawn_time = -1.f;
if ( econ_glove->m_defenition_index( ) != currnet_model || local_player->m_spawn_time_index( ) != last_spawn_time )
econ_glove->m_defenition_index( ) = currnet_model;
if ( model_skin != last_skin && model_skin > 0 || local_player->m_spawn_time_index( ) != last_spawn_time ) {
static auto create_new_paint_kit = reinterpret_cast<c_paint_kit * ( __fastcall* )( c_econ_item_view* )>( g_opcodes->scan( g_modules->m_modules.client_dll.get_name( ), "48 89 5C 24 10 56 48 83 EC 20 48 8B 01 FF 50 10 48 8B 1D ? ? ? ?" ) );
auto paint_kit = create_new_paint_kit( econ_glove );
if ( paint_kit && paint_kit->m_name )
{
last_skin = model_skin;
auto current_paint_kit = item_schema->get_paint_kits().find_by_key( model_skin );
if ( current_paint_kit.has_value( ) )
paint_kit->m_name = current_paint_kit.value( )->m_name;
}
econ_glove->m_initialized( ) = true;
local_player->set_body_group( );
local_player->m_need_to_reapply_glove( ) = true;
last_spawn_time = local_player->m_spawn_time_index( );
}
}
void c_skins::knife_changer( int stage ) {
if ( !g_ctx->m_local_pawn || m_knives.m_dumped_knife_models.empty( ) )
return;
c_player_weapon_service* weapon_service = g_ctx->m_local_pawn->m_weapon_services( );
if ( !weapon_service )
return;
if ( stage == 6 )
glove_changer();
c_network_utl_vector<c_base_handle>& my_weapons = weapon_service->m_weapon( );
for ( auto i = 0; i < my_weapons.m_size; i++ )
{
c_econ_entity* weapon = reinterpret_cast<c_econ_entity*>( g_interfaces->m_entity_system->get_base_entity( my_weapons.m_elements[ i ].get_entry_index( ) ) );
if ( !weapon )
continue;
c_attribute_container* attribute_manager = weapon->m_attribute_manager( );
if ( !attribute_manager )
continue;
c_econ_item_view* item = attribute_manager->m_item( );
if ( !item )
continue;
c_econ_item_definition* item_defenition = item->get_static_data( );
if ( !item_defenition )
continue;
auto weapon_scene = weapon->m_scene_node( );
if ( !weapon_scene )
continue;
auto item_schema = g_interfaces->m_client->get_econ_item_system( )->get_econ_item_schema( );
if ( !item_schema )
return;
bool is_knife = item_defenition->is_knife( false );
int current_weapon = get_skin_config( item->m_defenition_index( ) );
if ( !is_knife && current_weapon == CONFIG_UNKNOWN )
continue;
auto current_skin = &g_cfg->skins.m_skin_settings[ current_weapon ];
if ( current_skin->m_paint_kit > 0 ) {
auto paint_kit = item_schema->get_paint_kits().find_by_key( current_skin->m_paint_kit );
bool use_old_model = paint_kit.has_value( ) && *reinterpret_cast<bool*>( reinterpret_cast<uintptr_t>( paint_kit.value( ) ) + 0xB2 );
uint64_t mesh_mask = 1 + static_cast<uint64_t>( use_old_model );
weapon->m_statrack( ) = 1337;
weapon->m_paint_kit( ) = current_skin->m_paint_kit;
item->m_item_id_high( ) = -1;
weapon_scene->set_mesh_group_mask(mesh_mask);
}[ATTACH type="full" size="1920x1080"]322111[/ATTACH]
if (is_knife && stage == 6) {
int selectedKnife = g_cfg->skins.m_knives.m_selected;
int new_def_index = m_knives.m_knife_idxs.at(selectedKnife);
weapon->set_model(m_knives.m_dumped_knife_models.at(selectedKnife));
item->m_defenition_index() = new_def_index;
weapon->m_nSubclassID() = new_def_index;
}
}
}