BLOG | Вопросы от MayroN'а | и не только...

Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Решил и я создать такую тему - а что же делать то...да и не плодить по несколько тем - пускай всё в одной куче будет
Исключительно буду спрашивать и показывать уже попытки решения,а не просто так.
===========
Функция спавна ножей ( в начале раунда возвращает 3 ножа для броска,даже если в руках не было ножей.т.е. - пустые руки )
Код:
public fwHam_SpawnPlayer_Post(id)
{
    if(!is_user_connected(id))
        return;
        
    if(knifeammo[id] < get_cvar_num("amx_knifeammo")) knifeammo[id] = get_cvar_num("amx_knifeammo")
    if(knifeammo[id] > get_cvar_num("amx_maxknifeammo")) knifeammo[id] = get_cvar_num("amx_maxknifeammo")
    tossdelay[id] = 0.0
    
    new iWeapon = get_pdata_cbase(id, OFFSET_CURRENT_WEAPON);
    
    if(!is_valid_ent(iWeapon))
        return;
    
    ExecuteHamB(Ham_Item_Deploy, iWeapon);
}
Функция подбора ножей с земли ( та ещё ФФункция ))
Код:
public vexd_pfntouch(pToucher, pTouched)
{
    if ( !is_valid_ent(pToucher) ) return

    new Classname[32]
    entity_get_string(pToucher, EV_SZ_classname, Classname, 31)
    new owner = entity_get_edict(pToucher, EV_ENT_owner)
    new Float:kOrigin[3]
    entity_get_vector(pToucher, EV_VEC_origin, kOrigin)

    if(equal(Classname,"knife_pickup")) {
        if ( !is_valid_ent(pTouched) ) return
        
        new Class2[32]     
        entity_get_string(pTouched, EV_SZ_classname, Class2, 31)
        if(!equal(Class2,"player") || knifeammo[pTouched] >= get_cvar_num("amx_maxknifeammo")) return

        if((knifeammo[pTouched] + holdammo[owner]) > get_cvar_num("amx_maxknifeammo")) {
            holdammo[owner] -= get_cvar_num("amx_maxknifeammo") - knifeammo[pTouched]
            knifeammo[pTouched] = get_cvar_num("amx_maxknifeammo")
            emit_sound(pToucher, CHAN_ITEM, KNIFE_DEPLOY, 1.0, ATTN_NORM, 0, PITCH_NORM)
        }
        else {
            knifeammo[pTouched] += holdammo[owner]
            emit_sound(pToucher, CHAN_ITEM, KNIFE_DEPLOY, 1.0, ATTN_NORM, 0, PITCH_NORM)
            remove_entity(pToucher)
        }
    }

    else if(equal(Classname,"throwing_knife")) {
        if(is_user_alive(pTouched)) {
            new movetype = entity_get_int(pToucher, EV_INT_movetype)
            if(movetype == 0 && knifeammo[pTouched] < get_cvar_num("amx_maxknifeammo")) {
                if(knifeammo[pTouched] < get_cvar_num("amx_maxknifeammo")) knifeammo[pTouched] += 1
                client_print(pTouched,print_center,"Вы взяли Меч",knifeammo[pTouched])
                emit_sound(pToucher, CHAN_ITEM, KNIFE_DEPLOY, 1.0, ATTN_NORM, 0, PITCH_NORM)
                                screen_fade(pTouched)
                remove_entity(pToucher)
            }
            else if (movetype != 0) {
                if(owner == pTouched) return

                remove_entity(pToucher)

                if(get_cvar_num("mp_friendlyfire") == 0 && get_user_team(pTouched) == get_user_team(owner)) return

                new pTdead[33]
                entity_set_float(pTouched, EV_FL_dmg_take, get_cvar_num("amx_knifedmg") * 1.0)

                if((get_user_health(pTouched) - get_cvar_num("amx_knifedmg")) <= 0) {
                    pTdead[pTouched] = 1
                }
                else {
                    set_user_health(pTouched, get_user_health(pTouched) - get_cvar_num("amx_knifedmg"))
                }

                if(get_user_team(pTouched) == get_user_team(owner)) {
                    new name[33]
                    get_user_name(owner,name,32)
                }

                emit_sound(pTouched, CHAN_ITEM, KNIFE_HIT, 1.0, ATTN_NORM, 0, PITCH_NORM)

                if(pTdead[pTouched]) {
                    if(get_user_team(pTouched) == get_user_team(owner)) {
                        set_user_frags(owner, get_user_frags(owner) - 1)
                    }
                    else {
                        set_user_frags(owner, get_user_frags(owner) + 1)
                    }

                    new gmsgScoreInfo = get_user_msgid("ScoreInfo")
                    new gmsgDeathMsg = get_user_msgid("DeathMsg")

                    set_msg_block(gmsgDeathMsg,BLOCK_ONCE)
                    set_msg_block(gmsgScoreInfo,BLOCK_ONCE)
                    user_kill(pTouched,1)

                    message_begin(MSG_ALL,gmsgScoreInfo)
                    write_byte(owner)
                    write_short(get_user_frags(owner))
                    write_short(get_user_deaths(owner))
                    write_short(0)
                    write_short(get_user_team(owner))
                    message_end()

                    message_begin(MSG_ALL,gmsgScoreInfo)
                    write_byte(pTouched)
                    write_short(get_user_frags(pTouched))
                    write_short(get_user_deaths(pTouched))
                    write_short(0)
                    write_short(get_user_team(pTouched))
                    message_end()

                    message_begin(MSG_ALL,gmsgDeathMsg,{0,0,0},0)
                    write_byte(owner)
                    write_byte(pTouched)
                    write_byte(0)
                    write_string("knife")
                    message_end()

                    new tknifelog[16]
                    if (get_cvar_num("amx_tknifelog")) tknifelog = "throwing_knife"
                    else tknifelog = "knife"

                    new namea[32], authida[35], teama[32]
                    new namev[32], authidv[35], teamv[32]
                    get_user_name(owner,namea,31)
                    get_user_authid(owner,authida,34)
                    get_user_team(owner,teama,31)
                    get_user_name(pTouched,namev,31)
                    get_user_authid(pTouched,authidv,34)
                    get_user_team(pTouched,teamv,31)

                    log_message("^"%s<%d><%s><%s>^" killed ^"%s<%d><%s><%s>^" with ^"%s^"",
                    namea,get_user_userid(owner),authida,teama,namev,get_user_userid(pTouched),authidv,teamv,tknifelog)
                }
            }
        }
        else {
            entity_set_int(pToucher, EV_INT_movetype, 0)
            emit_sound(pToucher, CHAN_ITEM, KNIFE_HITWALL, 1.0, ATTN_NORM, 0, PITCH_NORM)
        }
    }
}
И нужно сделать так как для спавна...

Пример: если в руках ничего нет ( модель пустых рук ) - то вначале раунда функция вернет и ножи для броска и соответственно даст игроку в руки модель ножа

Вот подхожу я с пустыми руками к ножу он берёться - но нужно его давать в руки,а не прятать ...

Пробовал сделать вот так:
Это просто пихал в функцию подбора и ничего не выйшло - напротив теперь вообще ножи не подбираються
Код:
    new iWeapon = get_pdata_cbase(id, OFFSET_CURRENT_WEAPON);
    ExecuteHamB(Ham_Item_Deploy, iWeapon);

Далее функция полёта ножа заданная по расстоянию
Код:
public command_knife(id)
{
    id -= TASK_BARTIME

    if(!is_user_alive(id) || roundfreeze) return PLUGIN_HANDLED

    if(get_cvar_num("amx_knifeautoswitch"))
        {
        knifeout[id] = true
        client_cmd(id,"weapon_knife")
    }

    if(!knifeammo[id]) client_print(id,print_center,"Больше нет Мечей",knifeammo[id])
    if(!knifeout[id] || !knifeammo[id]) return PLUGIN_HANDLED

    if(tossdelay[id] > get_gametime() - 0.5) return PLUGIN_HANDLED
    else tossdelay[id] = get_gametime()

    knifeammo[id]--

    if (knifeammo[id] == 3) {
        client_print(id,print_center,"Осталось %i Меча",knifeammo[id])
    }
    if (knifeammo[id] == 2) {
        client_print(id,print_center,"Осталось %i Меча",knifeammo[id])
    }
    if (knifeammo[id] == 1) {
        client_print(id,print_center,"Остался %i Меч",knifeammo[id])
    }
    if (knifeammo[id] == 0) {
        client_print(id,print_center,"Больше нет Мечей",knifeammo[id])
                ExecuteHamB(Ham_Item_Deploy, get_pdata_cbase(id, OFFSET_CURRENT_WEAPON))
    }

    new Float: fOriginStart[3], Float: fOriginEnd[3], Float: fAngles[3], Float: fVelocity[3], Float: fDist
    
    get_data_aim(id, fOriginStart, fOriginEnd, fAngles)
    fDist = get_distance_f(fOriginStart, fOriginEnd)
    
    if(fDist > THROW_MIN_DIST)
    {
        new iEnt = create_entity(DEFAULT_CLASSNAME)
        entity_set_string(iEnt, EV_SZ_classname, "throwing_knife")
        entity_set_edict(iEnt, EV_ENT_owner, id)
        entity_set_vector(iEnt, EV_VEC_origin, fOriginStart)
        
                fAngles[0] -= 90
                entity_set_vector(iEnt, EV_VEC_angles, fAngles)

        new Float:MinBox[3] = {-15.0, -20.0, -1.0}
            new Float:MaxBox[3] = {15.0, 20.0, 15.0}
            entity_set_vector(iEnt, EV_VEC_mins, MinBox)
            entity_set_vector(iEnt, EV_VEC_maxs, MaxBox)
        entity_set_model(iEnt, KNIFE_MODEL)
        entity_set_int(iEnt, EV_INT_movetype, 6)
        entity_set_int(iEnt, EV_INT_solid, 1)
                entity_set_float(iEnt, EV_FL_nextthink, get_gametime() + KNIFE_TIME )
        
        for(new i; i < 3; i++)
            fVelocity[i] = (fOriginEnd[i] - fOriginStart[i]) * THROW_MUL_VELOCITY / fDist
        
        entity_set_vector(iEnt, EV_VEC_velocity, fVelocity)
    }
    else
        client_print(id, print_center, "Нет пространства для броска")
        
    return PLUGIN_HANDLED
}
Если расстояние для броска очень маленькое - по центру влупит принт о том,что так и есть
Но следовательно нож один пропадёт из арсенала
Вообще они запускаються по шкале Бара

Этот Бар нужно как-то остановить
Также пробовал его туда и вставить
И опять ничего...

Код:
                   message_begin(MSG_ONE, gMsgBarTime, _, id)
                       write_byte(0)
                       write_byte(0)
                       message_end()
                       return;
Или нужно чёт здесь опредилить с
if(fDist > THROW_MIN_DIST)
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
MayroN, где-то я это видел
Да уж...
Однако у нас есть сходство и так совпало

Здесь за основу брался станд.плагин ножей на Оленях.
Далее плагин Бизона
Это все обьединялось лично мной

От себя добавил:
Новые модели,звуки,шкалу Бара,Анимацию запуска ножа,скринфейд,плавное исчезновение модели с земли,ну и сама функция броска поправлялась,принты и другие дела мелкие...
 
Последнее редактирование:
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Закрыл 2 эти нюанса вот так ( я так думаю,что это костыли ? )

По возврату ножа в руки вместо пустых рук

Зарегал отдельную функцию
Код:
public Give_Knife(pTouched)
{
    if(!is_user_connected(pTouched))
        return;

    new iWeapon = get_pdata_cbase(pTouched, OFFSET_CURRENT_WEAPON)
    
    if(!is_valid_ent(iWeapon))
        return;
    
    ExecuteHamB(Ham_Item_Deploy, iWeapon)
}
И у подборе добавил
Give_Knife(pTouched)
Сюда
Код:
        if(is_user_alive(pTouched)) {
            new movetype = entity_get_int(pToucher, EV_INT_movetype)
            if(movetype == 0 && knifeammo[pTouched] < get_cvar_num("amx_maxknifeammo")) {
                if(knifeammo[pTouched] < get_cvar_num("amx_maxknifeammo")) knifeammo[pTouched] += 1
                client_print(pTouched,print_center,"Вы взяли Меч",knifeammo[pTouched])
                emit_sound(pToucher, CHAN_ITEM, KNIFE_DEPLOY, 1.0, ATTN_NORM, 0, PITCH_NORM)
                                Give_Knife(pTouched)
                                screen_fade(pTouched)
                remove_entity(pToucher)
            }
На запрет броска с малого росстояния
Код:
            if(fDist < THROW_MIN_DIST)
            {
                           client_print(id, print_center, "Нет пространства для броска Меча")

                   message_begin(MSG_ONE, gMsgBarTime, _, id)
                       write_byte(0)
                       write_byte(0)
                       message_end()
                       return;
                }
Сюда
Код:
public CmdStart(id)
{
    if(!is_user_alive(id))
        return;
    
    static iButton; iButton = pev(id, pev_button)
    static iOldButton; iOldButton = pev(id, pev_oldbuttons)

    new Float: fOriginStart[3], Float: fOriginEnd[3], Float: fAngles[3], Float: fDist
    
    get_data_aim(id, fOriginStart, fOriginEnd, fAngles)
    fDist = get_distance_f(fOriginStart, fOriginEnd)

        new weapon,clip,ammo
        weapon = get_user_weapon(id,clip,ammo)

    if( ( iButton & IN_USE ) && !( iOldButton & IN_USE ) )
    {   
           if(weapon == CSW_KNIFE)
           {
        if(!is_user_alive(id))
            return;

            if(fDist < THROW_MIN_DIST)
            {
                           client_print(id, print_center, "Нет пространства для броска Меча")

                   message_begin(MSG_ONE, gMsgBarTime, _, id)
                       write_byte(0)
                       write_byte(0)
                       message_end()
                       return;
                }

            if(knifeammo[id] == 0)
                {
                           client_print(id, print_center, "Больше нет Мечей", knifeammo[id])

                   message_begin(MSG_ONE, gMsgBarTime, _, id)
                       write_byte(0)
                       write_byte(0)
                       message_end()
                       return;
                }

                if(!cs_get_user_shield(id))
                {
                       knife_animation(id, 2, "models/models_wc/v_knife.mdl")
                           emit_sound(id, CHAN_VOICE, KNIFE_SOUND, 1.0, ATTN_NORM, 0, PITCH_NORM)
                }       

        message_begin(MSG_ONE, gMsgBarTime, _, id)
        write_byte(get_pcvar_num(cvar_timeknife))
        write_byte(0)
        message_end()       
    
        set_task(get_pcvar_float(cvar_timeknife), "command_knife", id+TASK_BARTIME)
       }
        }
    
    if( iOldButton & IN_USE && !( iButton & IN_USE ) )
        set_task(0.1, "knife_stop", id)
}
У функции броска стоит вот так
if(fDist > THROW_MIN_DIST)

Поэтому,я поставил скорее всего правильное направление на запрет броска < у CmdStart(id)

Pokemoshka
Мне бы кусок от Вашего кода на это дело. :smile3:
Плиз,если можна в лс
Если нет - буду довольствоваться принтами : D

1.jpg
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Код:
public fwHam_SpawnPlayer_Post(id)
{ 
    new iWeapon = get_pdata_cbase(id, OFFSET_CURRENT_WEAPON);
    if(!is_valid_ent(iWeapon))
        return;
    ExecuteHamB(Ham_Item_Deploy, iWeapon);
}
Так делать не совсем корректно. Вы же вызываете деплой ЛЮБОГО оружия которое сейчас в руках у игрока. Если вам нужно выдать ему аммо, то так и делайте.

Код:
get_data_aim(id, fOriginStart, fOriginEnd, fAngles)
    fDist = get_distance_f(fOriginStart, fOriginEnd)

        new weapon,clip,ammo
        weapon = get_user_weapon(id,clip,ammo)

    if( ( iButton & IN_USE ) && !( iOldButton & IN_USE ) )
    {   
           if(weapon == CSW_KNIFE)
}
Почему вы получаете дистанцию до того, как вы проверили нажата ли кнопка +use?
get_user_weapon - базируется на результате CurWeapon. Можно словить багы. Вы же и так получаете в другом месте m_pActiveItem
как быть с дефюзом и другими ентити, которые имеют Use?

Мне бы кусок от Вашего кода на это дело.
Обычный WeaponList. Использовали вы бы реапи, то сделать подобное можно буквально в пару десяток строк кода
 
Сообщения
578
Реакции
338
Предупреждения
2
Помог
9 раз(а)
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Так делать не совсем корректно. Вы же вызываете деплой ЛЮБОГО оружия которое сейчас в руках у игрока. Если вам нужно выдать ему аммо, то так и делайте.
Понял

Почему вы получаете дистанцию до того, как вы проверили нажата ли кнопка +use?
get_user_weapon - базируется на результате CurWeapon. Можно словить багы. Вы же и так получаете в другом месте m_pActiveItem
как быть с дефюзом и другими ентити, которые имеют Use?
С этим также понятно.

По дефьюзу можно заблокировать эту способность Бара,когда розминирование,вот только я пока не совсем понимаю,как
Нужно событие розминирования бомбы или же момент нажатия по Бару в дефьюзе ( ибо там по Бару вызов ножей )?

Код:
register_event("BarTime", "hook_knife", "be", "1=3")
register_event("BarTime", "give_knife", "b", "1=0");

public hook_knife()
{
         knifeout[id] = false
}

public give_knife()
{
         knifeout[id] = true
}
Ещё в придачу там со щитом были проблемы,если иметься щит с ножом и после всех ножей выкинутых ? ети пустые руки не правильно работали. ?
Тоесть на половину работали - только одна левая атака
Наверное из-за того,что у щита имееться две кнопки - атака и закрытие щитом себя.
Но я сделал проверку на щит,что-бы руки не давало в этом случаи ( но это будет крайне редко со щитом,ибо почти никто его не использует )

И ещё там нужно ещё как-то сделать так,что-бы Анимация броска ножа ( которая имееться в модели ),срабатывала в тот момент,когда ты вытянул нож полностью и она проигралась
В противном случаи - сбиваеться ( но не всегда )

Использовали вы бы реапи, то сделать подобное можно буквально в пару десяток строк кода
Долгая история,но нет
Если коротко,то это так - переход на реапи,соответственно нужен новый билд,переход на новый билд, и МультиМод не работает ( не работают в связке все 9 Модов ).
Виной всему - может сам плагин подгрузки модов - я пробовал и другие не помогло.
По заверению автора - нужен рестарт сервера - что-бы всё заработало - но и это не помогает
Также и Автоматический рестарт не делаеться сам,когда по Новой Игре с Ботами создаешь игру

А пробовал только все плагины с одного Мода Варкрафта впустить в во всё новое - и столкнулся с рядом проблем,которые ещё минут 15 буду описывать...

Поетому решил - пускай работает,по принципу "работает"
Если создавалось всё с нуля с 2010 года

SISA как-то всё сделал на 6153 без реапи,промучился - но выйшло и по рестарту автоматическом всё работает
А я оставил для домашних условий 4554 и для тестов также
 
Последнее редактирование:
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Виной всему - может сам плагин подгрузки модов - я пробовал и другие не помогло.
https://dev-cs.ru/resources/903/
31 Авг 2020
SISA как-то всё сделал на 6153 без реапи,промучился - но выйшло и по рестарту автоматическом всё работает
А я оставил для домашних условий 4554 и для тестов также
Использовать реапи только ради названия не стоит. Конкретно тут на помощь придут некоторые хуки и работа с айтеминфо напрямую. У сисы же есть орфей, и у него еще больше развязаны руки, так как искать оффсеты он умеет.
 

d3m37r4

111111
Сообщения
1,420
Реакции
1,162
Помог
10 раз(а)
Если коротко,то это так - переход на реапи,соответственно нужен новый билд,переход на новый билд, и МультиМод не работает ( не работают в связке все 9 Модов ).
Для человека, который пишет мод - это не проблема.
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Стоит также и это попробовать
так как искать оффсеты он умеет.
Да,да.Он мне о их и говорил ранее.
В основном всё там у меня упиралось в get_pdata_int
Для человека, который пишет мод - это не проблема.
Вот именно,для того кто пишет.
А для того,кто просто его ставит...ну тут ты меня понял)
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
По блоку бросков ножей во время дефьюза на Е ( на удивление так как написал выше - оно и сработало )
Возврат бросков ножей после отмены розминирования также работает
Вот только ещё из new g_iMaxPlayers

Стоит ли проверять на
if(!is_user_alive(id))return; ?

Код:
new g_iMaxPlayers

public plugin_init()
{
    g_iMaxPlayers = get_maxplayers()
    register_event("BarTime", "hook_knife_defuse", "be", "1=3")
    register_event("BarTime", "give_knife_after_defuse", "b", "1=0")
}

public hook_knife_defuse()
{
    for(new id = 1; id <= g_iMaxPlayers; id++)
    {
         if(!is_user_alive(id))
        return;

             knifeout[id] = false
        }
}

public give_knife_after_defuse()
{
    for(new id = 1; id <= g_iMaxPlayers; id++)
    {
         if(!is_user_alive(id))
        return;

             knifeout[id] = true
        }
}
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
fantom,
Всё поправил уже на данный момент.
Единственное ,что осталось,так это ещё в момент запуска Бара,если навести прицел на запретную дистанцию для броска,то нож всёравно пропадает...

Как там его получить?
new origin[3]
get_user_origin(id,origin,3) ?
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Ещё 3 вопроса по TE_DLIGHT

1. Как сделать постоянный TE_DLIGHT без таска вообще ( синком ? )
2. Как заменить позицию от игрока на Энтити ( тоесть ,что-бы освещение только ссылалось на модель и всё - сама карта не подсвечивалась )
3. Как быстро его потушить после захода в команду игрока ( здесь включить момент и наблюдателя )

Пока вот что получилось
Код:
public client_putinserver(id)
{
    if (!is_user_bot(id))
        {
        motd[id] = true
        set_pev(id, pev_viewmodel2, MOTD_MODEL)

                set_task(0.1, "Light", id)
    }
    return PLUGIN_CONTINUE
}

public Light(id)
{
        new Float:fOrigin[3]
        pev(id, pev_origin, fOrigin)
        
        message_begin(MSG_ONE_UNRELIABLE, SVC_TEMPENTITY, _, id)
        write_byte(TE_DLIGHT)
        write_coord(floatround(fOrigin[0]))
        write_coord(floatround(fOrigin[1]))
        write_coord(floatround(fOrigin[2]))
        write_byte(500)
        write_byte(255)
        write_byte(255)
        write_byte(255)
        write_byte(2)
        write_byte(0)
        message_end()   

        set_task(0.1, "Light", id)
}
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Дублирование карт в меню голосования

Такая штука происходит.
Если в списке например 4 карты,то в меню голосования дублирует список из 4-х карт до 5
С учётом того,что #define SELECTMAPS 5

Тоесть вот так:

0501d629e09b.jpg

Я не пойму,что за это отвечает ( может это ? )
Код:
new g_nextName[SELECTMAPS]
new g_voteCount[SELECTMAPS + 2]
new g_mapVoteNum
Нужно сделать как-то так,что-бы если в списке от 1 и до 4 карт - то в меню они бы себя не дублировали до 5-го списка с учётом опять таки #define SELECTMAPS 5
Но и после сыгранной карты не уберать её в меню при повторном голосовании
Одна карта в списке - одна карта и в меню
Три карты в списке - три карты и в меню
P.S. К Мистрику меня не отправлять
Нужно это здесь поправить

Код:
#include <amxmodx>
#include <amxmisc>
#include <ColorChat>
#include <dhudmessage>

#define SELECTMAPS  5

#define charsof(%1) (sizeof(%1)-1)

new Array:g_mapName;
new g_mapNums;

new g_nextName[SELECTMAPS]
new g_voteCount[SELECTMAPS + 2]
new g_mapVoteNum
new g_teamScore[2]
new g_lastMap[32]

new g_coloredMenus
new bool:g_selected = false

new g_BotStop

public plugin_init()
{
    register_plugin("Nextmap Chooser", AMXX_VERSION_STR, "AMXX Dev Team")
    register_dictionary("mapchooser.txt")
    register_dictionary("common.txt")
    
    g_mapName=ArrayCreate(32);
    
    new MenuName[64]
    
    format(MenuName, 63, "%L", "en", "CHOOSE_NEXTM")
    register_menucmd(register_menuid(MenuName), (-1^(-1<<(SELECTMAPS+2))), "countVote")
    register_cvar("amx_extendmap_max", "90")
    register_cvar("amx_extendmap_step", "15")

        g_BotStop = get_cvar_pointer("bot_stop")

    if (cstrike_running())
        register_event("TeamScore", "team_score", "a")

    get_localinfo("lastMap", g_lastMap, 31)
    set_localinfo("lastMap", "")

    new maps_ini_file[64]
    get_configsdir(maps_ini_file, 63);
    format(maps_ini_file, 63, "%s/maps.ini", maps_ini_file);
    
    if (!file_exists(maps_ini_file))
        get_cvar_string("mapcyclefile", maps_ini_file, 63)
    if (loadSettings(maps_ini_file))
        set_task(15.0, "voteNextmap", 987456, "", 0, "b")

    g_coloredMenus = colored_menus()
    
}

public checkVotes()
{

    new b = 0
    
    for (new a = 0; a < g_mapVoteNum; ++a)
        if (g_voteCount[b] < g_voteCount[a])
            b = a

    
    if (g_voteCount[SELECTMAPS] > g_voteCount[b]
        && g_voteCount[SELECTMAPS] > g_voteCount[SELECTMAPS+1])
    {
        new mapname[32]
        
        get_mapname(mapname, 31)
        new Float:steptime = get_cvar_float("amx_extendmap_step")
        set_cvar_float("mp_timelimit", get_cvar_float("mp_timelimit") + steptime)
                ColorChat(0, RED, "^4Голосование завершено.Карта продолжена на ^3%.0f ^4минут", steptime)
        client_cmd(0, "spk Vote/golosovanie_finish")
        set_task(5.0, "changeMap")
        return
    }
    
    new smap[32]
    if (g_voteCount[b] && g_voteCount[SELECTMAPS + 1] <= g_voteCount[b])

        if (!get_playersnum())
        {

        b = 0

        }

    {
        ArrayGetString(g_mapName, g_nextName[b], smap, charsof(smap));
        set_cvar_string("amx_nextmap", smap);
    }

    
    get_cvar_string("amx_nextmap", smap, 31)

        set_dhudmessage(255, 255, 0, -1.0, 0.10, 0, 0.1, 15.0, 0.7, 0.7)
        show_dhudmessage(0, "Голосование завершено^nСледующая Карта^n")

        {

        set_dhudmessage(0, 255, 0, -1.0, 0.17, 0, 0.1, 15.0, 0.7, 0.7)
        show_dhudmessage(0, "%s", smap)

        ColorChat(0, RED, "^4Голосование завершено.Следующая карта ^3%s", smap)
    client_cmd(0, "spk Vote/vote_finish")
        set_task(5.0, "changeMap")
        }       
}

public countVote(id, key)
{
        client_cmd(id, "spk choose_menu/choose_menu")

    if (get_cvar_float("amx_vote_answers"))
    {
        new name[32]
        get_user_name(id, name, 31)
        
        if (key == SELECTMAPS)
                ColorChat(0, RED, "^4%s ^1выбрал ^3продолжение карты", name)
        else if (key < SELECTMAPS)
        {
            new map[32];
            ArrayGetString(g_mapName, g_nextName[key], map, charsof(map));

                        ColorChat(0, RED, "^4%s ^1выбрал ^3%s", name, map)
        }
    }
    ++g_voteCount[key]
    
    return PLUGIN_HANDLED
}

bool:isInMenu(id)
{
    for (new a = 0; a < g_mapVoteNum; ++a)
        if (id == g_nextName[a])
            return true
    return false
}

public voteNextmap()
{
    new winlimit = get_cvar_num("mp_winlimit")
    new maxrounds = get_cvar_num("mp_maxrounds")
    
    if (winlimit)
    {
        new c = winlimit - 2
        
        if ((c > g_teamScore[0]) && (c > g_teamScore[1]))
        {
            g_selected = false
            return
        }
    }
    else if (maxrounds)
    {
        if ((maxrounds - 2) > (g_teamScore[0] + g_teamScore[1]))
        {
            g_selected = false
            return
        }
    } else {
        new timeleft = get_timeleft()
        
        if (timeleft < 1 || timeleft > 0)
        {
            g_selected = false
            return
        }
    }

    if (g_selected)
        return

    g_selected = true
    doVoteNextmap()
}

public doVoteNextmap()
{

    new menu[512], a, mkeys = 0

    new pos = format(menu, 511, g_coloredMenus ? "\y%L:\w^n^n" : "%L:^n^n", LANG_SERVER, "CHOOSE_NEXTM")
    new dmax = (g_mapNums > SELECTMAPS) ? SELECTMAPS : g_mapNums
    new winlimit = get_cvar_num("mp_winlimit")
    new maxrounds = get_cvar_num("mp_maxrounds")
    
    for (g_mapVoteNum = 0; g_mapVoteNum < dmax; ++g_mapVoteNum)
    {
        a = random_num(0, g_mapNums - 1)
        
        while (isInMenu(a))
            if (++a >= g_mapNums) a = 0
        
        g_nextName[g_mapVoteNum] = a
        pos += format(menu[pos], 511, "\r%d.\w %a\d^n", g_mapVoteNum + 1, ArrayGetStringHandle(g_mapName, a));
        mkeys |= (1<<g_mapVoteNum)
        g_voteCount[g_mapVoteNum] = 0
    }
    
    menu[pos++] = '^n'
    g_voteCount[SELECTMAPS] = 0
    g_voteCount[SELECTMAPS + 1] = 0
    
    new mapname[32]
    get_mapname(mapname, 31)

    if ((winlimit + maxrounds) == 0 && (get_cvar_float("mp_timelimit") < get_cvar_float("amx_extendmap_max")))
    {
        pos += format(menu[pos], 511, "\r%d.\w %L^n", SELECTMAPS + 1, LANG_SERVER, "EXTED_MAP", mapname)
        mkeys |= (1<<SELECTMAPS)
    }

    new MenuName[64]
    
    format(MenuName, 63, "%L", "en", "CHOOSE_NEXTM")
    show_menu(0, mkeys, menu, 15, MenuName)
    set_task(15.0, "checkVotes")
        ColorChat(0, RED, "^4Выберите карту...")
}
stock bool:ValidMap(mapname[])
{
    if ( is_map_valid(mapname) )
    {
        return true;
    }
    // If the is_map_valid check failed, check the end of the string
    new len = strlen(mapname) - 4;
    
    // The mapname was too short to possibly house the .bsp extension
    if (len < 0)
    {
        return false;
    }
    if ( equali(mapname[len], ".bsp") )
    {
        // If the ending was .bsp, then cut it off.
        // the string is byref'ed, so this copies back to the loaded text.
        mapname[len] = '^0';
        
        // recheck
        if ( is_map_valid(mapname) )
        {
            return true;
        }
    }
    
    return false;
}

loadSettings(filename[])
{
    if (!file_exists(filename))
        return 0

    new szText[32]
    new currentMap[32]
    
    new buff[256];
    
    ArrayClear(g_mapName);
    g_mapNums = 0;
    get_mapname(currentMap, 31)

    new fp=fopen(filename,"r");
    
    while (!feof(fp))
    {
        buff[0]='^0';
        
        fgets(fp, buff, charsof(buff));
        
        parse(buff, szText, charsof(szText));
        
        
        if (szText[0] != ';' &&
            ValidMap(szText) &&
            !equali(szText, g_lastMap) &&
            !equali(szText, currentMap))
        {
            ArrayPushString(g_mapName, szText);
            ++g_mapNums;
        }
        
    }
    
    fclose(fp);

    return g_mapNums
}

public team_score()
{
    new team[2]
    
    read_data(1, team, 1)
    g_teamScore[(team[0]=='C') ? 0 : 1] = read_data(2)
}

public plugin_end()
{
    new current_map[32]

    get_mapname(current_map, 31)
    set_localinfo("lastMap", current_map)
}

public changeMap(id)
{
    new smap[32]
    get_cvar_string("amx_nextmap", smap, 31)
        set_pcvar_num(g_BotStop, 0)       
    server_cmd("changelevel %s", smap)       
}

public plugin_precache()
{
    precache_sound("choose_menu/choose_menu.wav") 
    precache_sound("Vote/vote_finish.wav")
}
 
Сообщения
658
Реакции
462
Помог
10 раз(а)
строка #201 - как ты в луп не улетел, там цикл бесконечный должен быть, не?
либо ты умнее и добавил одну и ту же карту несколько раз
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
строка #201 - как ты в луп не улетел, там цикл бесконечный должен быть, не?
либо ты умнее и добавил одну и ту же карту несколько раз
А можно по другому?
Я так и не понял ничего.
 
Сообщения
1,480
Реакции
1,476
Помог
2 раз(а)
Регистрирую натив в плагине
Код:
public plugin_natives()
{
    register_native("backweapons", "bacon_item_attachtoplayer_post")
}
Сама функция bacon_item_attachtoplayer_post и сам плагин
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>

#define MAX_PLAYERS         32
#define OFFSET_PRIMARYWEAPON     116
#define OFFSET_WEAPONTYPE     43
#define EXTRAOFFSET_WEAPONS     4
#define OFFSET_AUTOSWITCH     509
#define OFFSET_SHIELD         510
#define HAS_SHIELD         (1<<24)

#define PRIMARY_WEAPONS (1<<CSW_SCOUT | 1<<CSW_XM1014 | 1<<CSW_MAC10 | 1<<CSW_AUG | 1<<CSW_UMP45 | 1<<CSW_SG550 | 1<<CSW_GALIL | 1<<CSW_FAMAS | 1<<CSW_AWP | 1<<CSW_MP5NAVY | 1<<CSW_M249 | 1<<CSW_M3 | 1<<CSW_M4A1 | 1<<CSW_TMP | 1<<CSW_G3SG1 | 1<<CSW_SG552 | 1<<CSW_AK47 | 1<<CSW_P90)

#define is_weapon_primary(%1)      (PRIMARY_WEAPONS & (1<<%1))
#define cs_get_weapon_type(%1)     get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define cs_get_user_hasprim(%1)    get_pdata_int(%1, OFFSET_PRIMARYWEAPON)
#define cs_get_user_autoswitch(%1) get_pdata_int(%1, OFFSET_AUTOSWITCH)
#define cs_get_user_shield(%1)       (get_pdata_int(%1, OFFSET_SHIELD) & HAS_SHIELD) ? 1 : 0

enum
{
    MODEL_NULL    = 0,
    MODEL_AUG     = 1,
    MODEL_AK47    = 2,
    MODEL_AWP     = 3,
    MODEL_MP5NAVY = 4,
    MODEL_P90     = 5,
    MODEL_GALIL   = 6,
    MODEL_M4A1    = 7,
    MODEL_SG550   = 8,
    MODEL_SG552   = 9,
    MODEL_SCOUT   = 10,
    MODEL_XM1014  = 11,
        MODEL_M3       = 12,
    MODEL_G3SG1   = 13,
    MODEL_M249    = 14,
    MODEL_FAMAS   = 15,
    MODEL_UMP45   = 16,
    MODEL_TMP     = 17,
    MODEL_MAC10   = 18
}

new g_weapons[][] =
{
    "weapon_p228",
    "weapon_scout",
    "weapon_hegrenade",
    "weapon_xm1014",
    "weapon_c4",
    "weapon_mac10",
    "weapon_aug",
    "weapon_smokegrenade",
    "weapon_elite",
    "weapon_fiveseven",
    "weapon_ump45",
    "weapon_sg550",
    "weapon_galil",
    "weapon_famas",
    "weapon_usp",
    "weapon_glock18",
    "weapon_awp",
    "weapon_mp5navy",
    "weapon_m249",
    "weapon_m3",
    "weapon_m4a1",
    "weapon_tmp",
    "weapon_g3sg1",
    "weapon_flashbang",
    "weapon_deagle",
    "weapon_sg552",
    "weapon_ak47",
    "weapon_knife",
    "weapon_p90"
}

new g_weaponclass[] = "backweapon"
new g_weaponmodel[] = "models/backweapons_wc/backweapons_wc.mdl"
new g_weaponent[MAX_PLAYERS+1]
new bot_limit,bool:bot_ham

public plugin_init()
{
    register_plugin("Back Weapons", "1.87", "hoboman313; cheap_suit")

    RegisterHam(Ham_Killed,           "player", "bacon_killed")
    RegisterHam(Ham_Spawn,            "player", "bacon_spawn_post", 1)
    RegisterHam(Ham_AddPlayerItem,    "player", "bacon_addplayeritem")
    RegisterHam(Ham_RemovePlayerItem, "player", "bacon_removeplayeritem")
    bot_limit=get_cvar_pointer("bot_quota")
    for(new i = 0; i < sizeof g_weapons; i++)
    {
        RegisterHam(Ham_Item_AttachToPlayer, g_weapons[i], "bacon_item_attachtoplayer_post", 1)
        RegisterHam(Ham_Item_Deploy,         g_weapons[i], "bacon_item_deploy_post",         1)
    }
}

public plugin_precache()
    precache_model(g_weaponmodel)

public client_putinserver(id)
{
    static infotarget
    if(!infotarget) infotarget = engfunc(EngFunc_AllocString, "info_target")

    g_weaponent[id] = engfunc(EngFunc_CreateNamedEntity, infotarget)
    if(pev_valid(g_weaponent[id]))
    {
        engfunc(EngFunc_SetModel, g_weaponent[id], g_weaponmodel)
        set_pev(g_weaponent[id], pev_classname, g_weaponclass)
        set_pev(g_weaponent[id], pev_movetype, MOVETYPE_FOLLOW)
        set_pev(g_weaponent[id], pev_effects, EF_NODRAW)
        set_pev(g_weaponent[id], pev_aiment, id)
    }
    if(is_user_bot(id)&&!bot_ham&&bot_limit)set_task(0.1,"reg_ham_bot",id)
}

public client_disconnect(id)
{
    if(g_weaponent[id] > 0 && pev_valid(g_weaponent[id]))
        engfunc(EngFunc_RemoveEntity, g_weaponent[id])

    g_weaponent[id] = 0
}

public reg_ham_bot(id)
{
    if(bot_ham||!is_user_connected(id)||!get_pcvar_num(bot_limit))return
    RegisterHamFromEntity(Ham_Killed,id,"bacon_killed")
    RegisterHamFromEntity(Ham_Spawn,id,"bacon_spawn_post",1)
    RegisterHamFromEntity(Ham_AddPlayerItem,id,"bacon_addplayeritem")
    RegisterHamFromEntity(Ham_RemovePlayerItem,id,"bacon_removeplayeritem")
    bot_ham=true;if(is_user_alive(id))bacon_spawn_post(id)
}

public bacon_killed(id, idattacker, shouldgib)
    fm_set_entity_visibility(g_weaponent[id], 0)

public bacon_addplayeritem(id, ent)
{
    static weaponid; weaponid = cs_get_weapon_type(ent)
    if(is_weapon_primary(weaponid) && pev_valid(g_weaponent[id]))
    {
        fm_set_entity_visibility(g_weaponent[id], 0)
        set_pev(g_weaponent[id], pev_body, get_weapon_model(weaponid))
    }
}

public bacon_removeplayeritem(id, ent)
{
    if(is_weapon_primary(cs_get_weapon_type(ent)) && pev_valid(g_weaponent[id]))
        fm_set_entity_visibility(g_weaponent[id], 0)
}

public bacon_spawn_post(id) if(is_user_alive(id))
{
    if(!cs_get_user_hasprim(id))
        fm_set_entity_visibility(g_weaponent[id], 0)
}

public bacon_item_attachtoplayer_post(ent, id) if(is_user_alive(id) && !cs_get_user_autoswitch(id))
{
    if(is_weapon_primary(cs_get_weapon_type(ent)) && pev_valid(g_weaponent[id]))
        fm_set_entity_visibility(g_weaponent[id], 1)
}

public bacon_item_deploy_post(ent)
{
    static id; id = pev(ent, pev_owner)
    if(is_user_alive(id))
    {
        static weapon; weapon = cs_get_weapon_type(ent)
        if(is_weapon_primary(weapon) || cs_get_user_shield(id))
            fm_set_entity_visibility(g_weaponent[id], 0)

        else if(cs_get_user_hasprim(id))
            fm_set_entity_visibility(g_weaponent[id], 1)
    }
}

stock get_weapon_model(weapon)
{
    switch(weapon)
    {
        case CSW_SCOUT:   return MODEL_SCOUT
        case CSW_XM1014:  return MODEL_XM1014
        case CSW_AUG:      return MODEL_AUG
        case CSW_UMP45:   return MODEL_UMP45
        case CSW_SG550:   return MODEL_SG550
        case CSW_GALIL:   return MODEL_GALIL
        case CSW_FAMAS:   return MODEL_FAMAS
        case CSW_AWP:     return MODEL_AWP
        case CSW_M3:     return MODEL_M3
        case CSW_MP5NAVY: return MODEL_MP5NAVY
        case CSW_M249:    return MODEL_M249
        case CSW_M4A1:    return MODEL_M4A1
        case CSW_G3SG1:   return MODEL_G3SG1
        case CSW_SG552:   return MODEL_SG552
        case CSW_AK47:    return MODEL_AK47
        case CSW_P90:     return MODEL_P90
        case CSW_MAC10:   return MODEL_MAC10   
        case CSW_TMP:     return MODEL_TMP
    }
    return 0
}

public plugin_natives()
{
    register_native("backweapons", "bacon_item_attachtoplayer_post")
}

stock fm_set_entity_visibility(index, visible = 1)
    set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)
Далее вставляю в начало другого плагина этот натив
native backweapons(ent, id)

И должно это оружие на спине выглядеть так как сама голограма здесь - но этого не происходит
Код:
public Enable_Chat_Model(id)
{
        if(!is_user_alive(id))
       return;

        Model_Killed()

    new i_Ent
    
    i_Ent = engfunc(EngFunc_CreateNamedEntity, g_InfoTarget)
    engfunc(EngFunc_SetModel, i_Ent, CHAT_MODEL_INTRO)
        set_user_rendering(id, kRenderFxDistort, 0, 0, 0, kRenderTransAdd, 127)
        set_user_godmode(id, 1)
    set_pev(i_Ent, pev_aiment, id)
    set_pev(i_Ent, pev_movetype, MOVETYPE_FOLLOW)
    g_PlayerModelChat[id] = i_Ent
}
Как всётаки правильно и что не так делаю?
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу