C++ Animlayers moving resolver (full/low delta) [LW]

Статус
В этой теме нельзя размещать новые ответы.
get good get legendware
Участник
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
437
Реакции[?]
201
Поинты[?]
48K
main resolver part

C++:
void CResolver::check_low()
{
    float delta_center = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[0][6].m_flPlaybackRate);
    float delta_right = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[1][6].m_flPlaybackRate);
    float delta_left = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[2][6].m_flPlaybackRate);
    float delta_low_right = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[3][6].m_flPlaybackRate);
    float delta_low_left = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[4][6].m_flPlaybackRate);

    auto e = player;

    if (delta_left > delta_center && delta_left > delta_low_left)
        // full left

    if (delta_right > delta_center && delta_right > delta_low_right)
        // full right

    if (delta_low_left > delta_left && delta_low_left > delta_center)
        // low left

    if (delta_low_right > delta_right && delta_low_right > delta_center)
        // low right

}

animfix part
C++:
        // --- first --- \\
      
        animstate->m_flGoalFeetYaw = middle;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, NONE);
      
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[0], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.zero, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\



        // --- second --- \\

        animstate->m_flGoalFeetYaw = right;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, FIRST);

        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[1], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.first, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\




        // --- third --- \\

        animstate->m_flGoalFeetYaw = left;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, SECOND);
      
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[2], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\



        // --- low second --- \\

        animstate->m_flGoalFeetYaw = low_right;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, LOW_FIRST);
      
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[3], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\




        // --- low third --- \\

        animstate->m_flGoalFeetYaw = low_left;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, LOW_SECOND);

        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[4], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));

in the header
C++:
    AnimationLayer resolver_layers[5][15];


usage example :-
C++:
    float speed = e->m_vecVelocity().Length();
    bool move_anim = false;
    if (int(player_record->layers[6].m_flWeight * 1000.f) == int(previous_layers[6].m_flWeight * 1000.f))
        move_anim = true;

    auto animstate = player->get_animation_state();
    if (!animstate)
        return;

    bool ducking = animstate->m_fDuckAmount && e->m_fFlags() & FL_ONGROUND && !animstate->m_bInHitGroundAnimation;

    auto valid_move = true;
    if (animstate->m_velocity > 0.1f || fabs(animstate->flUpVelocity) > 100.f)
        valid_move = animstate->m_flTimeSinceStartedMoving < 0.22f;


if (!valid_move && move_anim || /*micromovement check pog*/ speed >= 3.1f && ducking || speed >= 1.2f && !ducking)
    {
        if ((speed >= 1.2f && speed < 134.f) &&!ducking && (slow_walking1 || slow_walking2))
            player_record->curMode = SLOW_WALKING;
        else
        player_record->curMode = MOVING;
      
      
        // resolve here , if you miss a shot then switch side
    }
 
Пользователь
Статус
Оффлайн
Регистрация
9 Мар 2021
Сообщения
272
Реакции[?]
42
Поинты[?]
2K
main resolver part

C++:
void CResolver::check_low()
{
    float delta_center = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[0][6].m_flPlaybackRate);
    float delta_right = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[1][6].m_flPlaybackRate);
    float delta_left = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[2][6].m_flPlaybackRate);
    float delta_low_right = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[3][6].m_flPlaybackRate);
    float delta_low_left = abs(player_record->layers[6].m_flPlaybackRate - resolver_layers[4][6].m_flPlaybackRate);

    auto e = player;

    if (delta_left > delta_center && delta_left > delta_low_left)
        // full left

    if (delta_right > delta_center && delta_right > delta_low_right)
        // full right

    if (delta_low_left > delta_left && delta_low_left > delta_center)
        // low left

    if (delta_low_right > delta_right && delta_low_right > delta_center)
        // low right

}

animfix part
C++:
        // --- first --- \\
     
        animstate->m_flGoalFeetYaw = middle;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, NONE);
     
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[0], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.zero, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\



        // --- second --- \\

        animstate->m_flGoalFeetYaw = right;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, FIRST);

        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[1], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.first, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\




        // --- third --- \\

        animstate->m_flGoalFeetYaw = left;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, SECOND);
     
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[2], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\



        // --- low second --- \\

        animstate->m_flGoalFeetYaw = low_right;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, LOW_FIRST);
     
        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[3], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));
        // --- \\




        // --- low third --- \\

        animstate->m_flGoalFeetYaw = low_left;
        g_ctx.globals.updating_animation = true;
        e->m_bClientSideAnimation() = true;
        e->update_clientside_animation();
        e->m_bClientSideAnimation() = false;
        g_ctx.globals.updating_animation = false;
        setup_matrix(e, animlayers, LOW_SECOND);

        memcpy(animstate, &state, sizeof(c_baseplayeranimationstate));
        memcpy(player_resolver[e->EntIndex()].resolver_layers[4], e->get_animlayers(), e->animlayer_count() * sizeof(AnimationLayer));
        memcpy(e->m_CachedBoneData().Base(), record->matrixes_data.second, e->m_CachedBoneData().Count() * sizeof(matrix3x4_t));

in the header
C++:
    AnimationLayer resolver_layers[5][15];


usage example :-
C++:
    float speed = e->m_vecVelocity().Length();
    bool move_anim = false;
    if (int(player_record->layers[6].m_flWeight * 1000.f) == int(previous_layers[6].m_flWeight * 1000.f))
        move_anim = true;

    auto animstate = player->get_animation_state();
    if (!animstate)
        return;

    bool ducking = animstate->m_fDuckAmount && e->m_fFlags() & FL_ONGROUND && !animstate->m_bInHitGroundAnimation;

    auto valid_move = true;
    if (animstate->m_velocity > 0.1f || fabs(animstate->flUpVelocity) > 100.f)
        valid_move = animstate->m_flTimeSinceStartedMoving < 0.22f;


if (!valid_move && move_anim || /*micromovement check pog*/ speed >= 3.1f && ducking || speed >= 1.2f && !ducking)
    {
        if ((speed >= 1.2f && speed < 134.f) &&!ducking && (slow_walking1 || slow_walking2))
            player_record->curMode = SLOW_WALKING;
        else
        player_record->curMode = MOVING;
     
     
        // resolve here , if you miss a shot then switch side
    }
урааа!! давайте теперь создадим 13 дельт и начнем их делить друг на друга, ну аче зачем нам 3-4 дельты
 
Escalation Project
Забаненный
Статус
Оффлайн
Регистрация
9 Май 2019
Сообщения
275
Реакции[?]
74
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
get good get legendware
Участник
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
437
Реакции[?]
201
Поинты[?]
48K
" || " works when 1st condition not correct.

in that case ur first check will be works all time
jesus fucking christ please stop shitposting when u have no idea what ur talking about
Пожалуйста, авторизуйтесь для просмотра ссылки.

also is that ur superior resolver ?

take a look at ur code and then come teach me about operators
and just for the record because i know you have an iq of a sheep

C++:
(slow_walking1 || slow_walking2)
if one or more inside the () is true
then the enemy is slow_walking
 
Escalation Project
Забаненный
Статус
Оффлайн
Регистрация
9 Май 2019
Сообщения
275
Реакции[?]
74
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
get good get legendware
Участник
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
437
Реакции[?]
201
Поинты[?]
48K
show me ur code of slow_walking1 and slow_walking2 tho
C++:
bool CResolver::slow_walking1()
{
    auto entity = player;
    //float large = 0;
    float velocity_2D[64], old_velocity_2D[64];
    if (entity->m_vecVelocity().Length2D() != velocity_2D[entity->EntIndex()] && entity->m_vecVelocity().Length2D() != NULL) {
        old_velocity_2D[entity->EntIndex()] = velocity_2D[entity->EntIndex()];
        velocity_2D[entity->EntIndex()] = entity->m_vecVelocity().Length2D();
    }
    //if (large == 0)return false;
    Vector velocity = entity->m_vecVelocity();
    Vector direction = entity->m_angEyeAngles();

    float speed = velocity.Length();
    direction.y = entity->m_angEyeAngles().y - direction.y;
    //method 1
    if (velocity_2D[entity->EntIndex()] > 1) {
        int tick_counter[64];
        if (velocity_2D[entity->EntIndex()] == old_velocity_2D[entity->EntIndex()])
            tick_counter[entity->EntIndex()] += 1;
        else
            tick_counter[entity->EntIndex()] = 0;

        while (tick_counter[entity->EntIndex()] > (1 / m_globals()->m_intervalpertick) * fabsf(0.1f))//should give use 100ms in ticks if their speed stays the same for that long they are definetely up to something..
            return true;
    }


    return false;
}
C++:
bool CResolver::slow_walking2()
{
    auto e = player;


    auto anim_layers = player_record->layers;
    bool s_1 = false,
        s_2 = false,
        s_3 = false;

    for (int i = 0; i < e->animlayer_count(); i++)
    {
        anim_layers[i] = e->get_animlayers()[i];
        if (anim_layers[i].m_nSequence == 26 && anim_layers[i].m_flWeight < 0.47f)
            s_1 = true;
        if (anim_layers[i].m_nSequence == 7 && anim_layers[i].m_flWeight > 0.001f)
            s_2 = true;
        if (anim_layers[i].m_nSequence == 2 && anim_layers[i].m_flWeight == 0)
            s_3 = true;
    }
    bool  m_fakewalking;
    if (s_1 && s_2)
        if (s_3)
            m_fakewalking = true;
        else
            m_fakewalking = false;
    else
        m_fakewalking = false;

    return m_fakewalking;
}
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,550
Реакции[?]
585
Поинты[?]
101K
AnimationLayer resolver_layers[5][15];
As I know, there are only 13 layers in csgo, but it`s not 100% info.
I`m really happy, that you made all layers in your animfix.
Now, try to debug them and show us that all of these layers have different Weight, Cycle and Playbackrate. I hope that they have.
(speed >= 1.2f && speed < 134.f)
Speed should be more than 3.5 I think, btw there is no point in trying to understand if somebody uses slowwalk or not.
It`s enough of using using them (slow_walking1 || slow_walking2).
By the way, try to look at first version of desync.vip made on getze.us by L3D451R7 or enrage.
 
Escalation Project
Забаненный
Статус
Оффлайн
Регистрация
9 Май 2019
Сообщения
275
Реакции[?]
74
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Модератор форума
Участник
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
378
Реакции[?]
157
Поинты[?]
9K
C++:
bool CResolver::slow_walking1()
{
    auto entity = player;
    //float large = 0;
    float velocity_2D[64], old_velocity_2D[64];
    if (entity->m_vecVelocity().Length2D() != velocity_2D[entity->EntIndex()] && entity->m_vecVelocity().Length2D() != NULL) {
        old_velocity_2D[entity->EntIndex()] = velocity_2D[entity->EntIndex()];
        velocity_2D[entity->EntIndex()] = entity->m_vecVelocity().Length2D();
    }
    //if (large == 0)return false;
    Vector velocity = entity->m_vecVelocity();
    Vector direction = entity->m_angEyeAngles();

    float speed = velocity.Length();
    direction.y = entity->m_angEyeAngles().y - direction.y;
    //method 1
    if (velocity_2D[entity->EntIndex()] > 1) {
        int tick_counter[64];
        if (velocity_2D[entity->EntIndex()] == old_velocity_2D[entity->EntIndex()])
            tick_counter[entity->EntIndex()] += 1;
        else
            tick_counter[entity->EntIndex()] = 0;

        while (tick_counter[entity->EntIndex()] > (1 / m_globals()->m_intervalpertick) * fabsf(0.1f))//should give use 100ms in ticks if their speed stays the same for that long they are definetely up to something..
            return true;
    }


    return false;
}
C++:
bool CResolver::slow_walking2()
{
    auto e = player;


    auto anim_layers = player_record->layers;
    bool s_1 = false,
        s_2 = false,
        s_3 = false;

    for (int i = 0; i < e->animlayer_count(); i++)
    {
        anim_layers[i] = e->get_animlayers()[i];
        if (anim_layers[i].m_nSequence == 26 && anim_layers[i].m_flWeight < 0.47f)
            s_1 = true;
        if (anim_layers[i].m_nSequence == 7 && anim_layers[i].m_flWeight > 0.001f)
            s_2 = true;
        if (anim_layers[i].m_nSequence == 2 && anim_layers[i].m_flWeight == 0)
            s_3 = true;
    }
    bool  m_fakewalking;
    if (s_1 && s_2)
        if (s_3)
            m_fakewalking = true;
        else
            m_fakewalking = false;
    else
        m_fakewalking = false;

    return m_fakewalking;
}
а нахуй вы детектите слоуволк то вопрос? Сделайте нормальный аним фикс, это решит все ваши проблемы.
 
get good get legendware
Участник
Статус
Оффлайн
Регистрация
22 Сен 2020
Сообщения
437
Реакции[?]
201
Поинты[?]
48K
As I know, there are only 13 layers in csgo, but it`s not 100% info.

I`m really happy, that you made all layers in your animfix.
Now, try to debug them and show us that all of these layers have different Weight, Cycle and Playbackrate. I hope that they have.

Speed should be more than 3.5 I think, btw there is no point in trying to understand if somebody uses slowwalk or not.
It`s enough of using using them (slow_walking1 || slow_walking2).
By the way, try to look at first version of desync.vip made on getze.us by L3D451R7 or enrage.
well the reason im detecting slow walking is for my resolver logic, i dont witch side if i miss , i start with 20.f delta and increase 20 with each shot,
also thanks for the feed back ill check enrage and desync.vip, :seemsgood:
and if u have direct links for them that would be nice, cheers
 
Начинающий
Статус
Оффлайн
Регистрация
6 Янв 2022
Сообщения
38
Реакции[?]
5
Поинты[?]
0
а нахуй вы детектите слоуволк то вопрос? Сделайте нормальный аним фикс, это решит все ваши проблемы.
Интересно как слоуволк взаимосвязан с анимфиксом?
 
Keep Ev0lving, Stay Fatal
Эксперт
Статус
Оффлайн
Регистрация
6 Фев 2018
Сообщения
1,550
Реакции[?]
585
Поинты[?]
101K
Начинающий
Статус
Оффлайн
Регистрация
6 Янв 2022
Сообщения
38
Реакции[?]
5
Поинты[?]
0
C++:
    AnimationLayer resolver_layers[5][15];
Код:
enum animstate_layer_t
{
    ANIMATION_LAYER_AIMMATRIX = 0,
    ANIMATION_LAYER_WEAPON_ACTION,
    ANIMATION_LAYER_WEAPON_ACTION_RECROUCH,
    ANIMATION_LAYER_ADJUST,
    ANIMATION_LAYER_MOVEMENT_JUMP_OR_FALL,
    ANIMATION_LAYER_MOVEMENT_LAND_OR_CLIMB,
    ANIMATION_LAYER_MOVEMENT_MOVE,
    ANIMATION_LAYER_MOVEMENT_STRAFECHANGE,
    ANIMATION_LAYER_WHOLE_BODY,
    ANIMATION_LAYER_FLASHED,
    ANIMATION_LAYER_FLINCH,
    ANIMATION_LAYER_ALIVELOOP,
    ANIMATION_LAYER_LEAN,
    ANIMATION_LAYER_COUNT,
};
Ты в глаза долбишься, где ты тут 15 лееров ты увидил
ребилд велосити к примеру
Против микромувмента он тебе очень поможет
 
Модератор форума
Участник
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
378
Реакции[?]
157
Поинты[?]
9K
C++:
    AnimationLayer resolver_layers[5][15];
Код:
enum animstate_layer_t
{
    ANIMATION_LAYER_AIMMATRIX = 0,
    ANIMATION_LAYER_WEAPON_ACTION,
    ANIMATION_LAYER_WEAPON_ACTION_RECROUCH,
    ANIMATION_LAYER_ADJUST,
    ANIMATION_LAYER_MOVEMENT_JUMP_OR_FALL,
    ANIMATION_LAYER_MOVEMENT_LAND_OR_CLIMB,
    ANIMATION_LAYER_MOVEMENT_MOVE,
    ANIMATION_LAYER_MOVEMENT_STRAFECHANGE,
    ANIMATION_LAYER_WHOLE_BODY,
    ANIMATION_LAYER_FLASHED,
    ANIMATION_LAYER_FLINCH,
    ANIMATION_LAYER_ALIVELOOP,
    ANIMATION_LAYER_LEAN,
    ANIMATION_LAYER_COUNT,
};
Ты в глаза долбишься, где ты тут 15 лееров ты увидил

Против микромувмента он тебе очень поможет
если рук нету, то конечно не поможет
 
Начинающий
Статус
Оффлайн
Регистрация
26 Янв 2020
Сообщения
7
Реакции[?]
4
Поинты[?]
0
C++:
    AnimationLayer resolver_layers[5][15];
Код:
enum animstate_layer_t
{
    ANIMATION_LAYER_AIMMATRIX = 0,
    ANIMATION_LAYER_WEAPON_ACTION,
    ANIMATION_LAYER_WEAPON_ACTION_RECROUCH,
    ANIMATION_LAYER_ADJUST,
    ANIMATION_LAYER_MOVEMENT_JUMP_OR_FALL,
    ANIMATION_LAYER_MOVEMENT_LAND_OR_CLIMB,
    ANIMATION_LAYER_MOVEMENT_MOVE,
    ANIMATION_LAYER_MOVEMENT_STRAFECHANGE,
    ANIMATION_LAYER_WHOLE_BODY,
    ANIMATION_LAYER_FLASHED,
    ANIMATION_LAYER_FLINCH,
    ANIMATION_LAYER_ALIVELOOP,
    ANIMATION_LAYER_LEAN,
    ANIMATION_LAYER_COUNT,
};
You peck in the eye, where are you here 15 rails you saw

Against micromovement it will help you a lot
The engine supports a maximum of 15 anim layers however the CSGO player animations have 13 layers hope this helps to clarify better for people
 
Начинающий
Статус
Оффлайн
Регистрация
6 Янв 2022
Сообщения
38
Реакции[?]
5
Поинты[?]
0
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу