• Страница 1 из 1
  • 1
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Выдача Щита ([ Добавить ])
Выдача Щита
Дата: Вторник, 09.10.2018, 13:37 | Сообщение # 1
  • MayroN
  • Репутация:
  • Сообщений:
  • Удаленные
Добавляю в stock shield

Код

  stock zl_weapon_check(const weapon_name[]) {
    static const WeaponName[][] = {
        "p228",
        "scout",
        "hegrenade",
        "xm1014",
        "mac10",
        "aug",
        "smokegrenade",
        "elite",
        "fiveseven",
        "ump45",
        "sg550",
        "galil",
        "famas",
        "usp",
        "glock18",
        "awp",
        "mp5navy",
        "m249",
        "m3",
        "m4a1",
        "tmp",
        "g3sg1",
        "flashbang",
        "deagle",
        "sg552",
        "ak47",
        "knife",
        "shield",
        "p90"
    }
    new i
    for(i = 0; i < sizeof WeaponName; ++i) {
        if(equal(weapon_name, WeaponName[i]))
            return 1
    }
    return 0
}[/i]

Сама функция выдачи из обьекта


Код
public supply_touch(s, p) {
    if(!pev_valid(s) || !is_user_alive(p))
        return
    
    if(ArraySize(szWeaponID) == 0) {
    } else {
        switch(random(1)) {
            case 0: {
                new i, id[20], name[256]    
                i = random(ArraySize(szWeaponID))
                ArrayGetString(szWeaponID, i, id, 14)
                ArrayGetString(szWeaponName, i, name, 14)
                        if(get_pcvar_num(fadeon))
                    screen_fade(p)
                format(id, charsmax(id), "weapon_%s", id)

                    new iWeaponId = get_weaponid(id);

                    if (user_has_weapon(p, iWeaponId))
                    cs_set_user_bpammo(p, iWeaponId, cs_get_user_bpammo(p, iWeaponId) + 1)
                    else
                    ham_give_item(p, id)
                    client_cmd(p,"spk %s",box_sound)
                zl_colorchat(p, "!n%L", LANG_PLAYER, "SUPPLY_WEAPON", name)                
            }
        }
    }
    zl_remove_entity(s)
    SupplyCount--
}


При выдачи игра зависает наглухо...

+ ко всему етому удалось кое что узнать

Оказываеться,сама проблема в

Код
ham_give_item

Пишут на оленях

// restore shield after all the other weapons are there
if(oldShield[id]) fm_give_item(id,"weapon_shield");
 // ham_give_item crashes


Вообщем нужно через fm_give_item
Перестроить етот сток,ну или можно попробовать просто через give_item
Подскажите пожалуйста

Код
stock ham_give_item(id, weapon[] ) {
    if (!is_user_alive(id) || pev_valid(id) != 2)
        return 0
                
    new wEnt = create_entity( weapon )
    
    if(!pev_valid(wEnt))
        return 0
    
    new ItemSlot = ExecuteHamB(Ham_Item_ItemSlot, wEnt)
        
    new iItem, szWeaponName[32]
    iItem = get_pdata_cbase(id, 367 + ItemSlot, 5);
    
    if (iItem > 0 && pev_valid(iItem) == 2) {
        pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
        engclient_cmd(id, "drop", szWeaponName)
    }
        
        
    set_pev(wEnt, pev_spawnflags, SF_NORESPAWN);
    dllfunc(DLLFunc_Spawn, wEnt)
    
    if(!ExecuteHamB( Ham_AddPlayerItem, id, wEnt )) {
        if(pev_valid( wEnt ))
            set_pev(wEnt, pev_flags, pev( wEnt, pev_flags ) | FL_KILLME)
        
        return 0;
    }
    
    ExecuteHamB(Ham_Item_AttachToPlayer, wEnt, id )
    
    engclient_cmd(id, weapon)
    
    new AmmoIndex
    AmmoIndex = get_pdata_int(get_pdata_cbase(id, 373, 5), 49, 4)
    
    if (AmmoIndex > 10) {
        set_pdata_int(id, 376 + AmmoIndex, 1, 5)
    } else {
        set_pdata_int(id, 376 + AmmoIndex, 100, 5)
    }    
    return 1;
}
Сообщение отредактировал MayroN - Вторник, 09.10.2018, 13:51
Дата: Вторник, 09.10.2018, 16:57 | Сообщение # 2
Скриптер
Мастер
Offline
  • Quin
  • Репутация: 56
  • Сообщений:121
  • Разработчик
  • Статус пользователя
Увидеть бы плагин полностью. Неизвестно как вы записываете оружия в массив. Своего CSW_* у weapon_shield нет.
Так же name[256] слишком большой размер для массива, не находите? Достаточно 20 и то он используется только для weapon_smokegrenade.
Проблема находиться в Ham_Item_ItemSlot. Боюсь что (168238736) слота не существует в CS (выдавало каждый раз разное).
Полный лог с выдачей сначала USP, затем SHIELD:

Код
L 10/09/2018 - 16:53:29: ham_give_item вызван для (8): weapon_usp
L 10/09/2018 - 16:53:29: wEnt = 181
L 10/09/2018 - 16:53:29: wEnt создан, продолжаем...
L 10/09/2018 - 16:53:29: wEnt (181) имеет (2) ItemSlot
L 10/09/2018 - 16:53:29: wEnt (181) имеет (174) iItem
L 10/09/2018 - 16:53:29: wEnt (181) не одно в данном слоте, выброшен (weapon_glock18) iItem
L 10/09/2018 - 16:53:29: wEnt (181) заспавнено один раз
L 10/09/2018 - 16:53:29: wEnt (181) добавлен игроку (8)
L 10/09/2018 - 16:53:29: wEnt (181) имеет ammoindex (6)
L 10/09/2018 - 16:53:29: ham_give_item вызван для (8): weapon_shield
L 10/09/2018 - 16:53:29: wEnt = 183
L 10/09/2018 - 16:53:29: wEnt создан, продолжаем...
L 10/09/2018 - 16:53:29: wEnt (183) имеет (168238736) ItemSlot <= после получения и происходит краш сервера.
Метод поиска проблемы топорный, но рабочий. Сделайте лог после каждой вызванной функции и пишите данные в лог.

Т.е. проблема именно в

Код
new iItem, szWeaponName[32]
   iItem = get_pdata_cbase(id, 367 + ItemSlot, 5);

UPD
Как понял Hamsandwich не может выдать weapon_shield. Даже после скипа кода указанного выше падает при выдачи через ham
Сообщение отредактировал Quin - Вторник, 09.10.2018, 17:24
Дата: Вторник, 09.10.2018, 22:39 | Сообщение # 3
  • MayroN
  • Репутация:
  • Сообщений:
  • Удаленные
Quin

Вот полный код плагина.Сюда неполучаеться скинуть - слишком большой код

https://dropmefiles.com/ZRSo6

Да ХАМ не даст выдачу.Пробовать нужно чрез ФМ.Ето предположительно.

Буду ждать вашых результатов ибо то ,что Вы написали - я незнаю как сделать
Дата: Среда, 10.10.2018, 14:22 | Сообщение # 4
Скриптер
Мастер
Offline
  • Quin
  • Репутация: 56
  • Сообщений:121
  • Разработчик
  • Статус пользователя
Просто после проверки на живого и его валидность сравниваете строки полученную weapon и weapon_shield. Если они совпадают используйте fm_give_item
Дата: Суббота, 13.10.2018, 15:42 | Сообщение # 5
  • MayroN
  • Репутация:
  • Сообщений:
  • Удаленные
Quin,
Вы можете написать как должно быть?
Дата: Суббота, 13.10.2018, 16:51 | Сообщение # 6
Скриптер
Мастер
Offline
  • Quin
  • Репутация: 56
  • Сообщений:121
  • Разработчик
  • Статус пользователя
Цитата MayroN ()
Вы можете написать как должно быть?

Код
stock ham_give_item(id, weapon[] ) {
    if (!is_user_alive(id) || pev_valid(id) != 2)
        return 0

   if ( !strcmp( weapon, "weapon_shield" ) )
   {
      fm_give_item( id, weapon );
      return 1;
   }
                
    new wEnt = create_entity( weapon )
    
    if(!pev_valid(wEnt))
        return 0
    
    new ItemSlot = ExecuteHamB(Ham_Item_ItemSlot, wEnt)
        
    new iItem, szWeaponName[32]
    iItem = get_pdata_cbase(id, 367 + ItemSlot, 5);
    
    if (iItem > 0 && pev_valid(iItem) == 2) {
        pev(iItem, pev_classname, szWeaponName, charsmax(szWeaponName))
        engclient_cmd(id, "drop", szWeaponName)
    }

    set_pev(wEnt, pev_spawnflags, SF_NORESPAWN);
    dllfunc(DLLFunc_Spawn, wEnt)
    
    if(!ExecuteHamB( Ham_AddPlayerItem, id, wEnt )) {
        if(pev_valid( wEnt ))
            set_pev(wEnt, pev_flags, pev( wEnt, pev_flags ) | FL_KILLME)
        
        return 0;
    }
    
    ExecuteHamB(Ham_Item_AttachToPlayer, wEnt, id )
    
    engclient_cmd(id, weapon)
    
    new AmmoIndex
    AmmoIndex = get_pdata_int(get_pdata_cbase(id, 373, 5), 49, 4)
    
    if (AmmoIndex > 10) {
        set_pdata_int(id, 376 + AmmoIndex, 1, 5)
    } else {
        set_pdata_int(id, 376 + AmmoIndex, 100, 5)
    }    
    return 1;
}

fm_give_item уже сами найдете (fakemeta_util.inc).
Форум » Counter-Strike 1.6 » Сервер Counter-Strike 1.6 » Помощь по скриптингу » Выдача Щита ([ Добавить ])
  • Страница 1 из 1
  • 1
Поиск:
(threadpage)