Что касается подбора, то там надо слот оружия менять во время тача и восстанавливать после. На практике это не применял, но если нужно, могу попробовать сделать код.
Что касается ограничений покупки, то её скорее всего нет. Там банально срабатывает дроп. Блочишь дроп в момент покупки, вот только как это сделать по человечески, я пока не соображу:
Сам дроп начинается здесь:
Код
void DropPrimary(CBasePlayer *pPlayer)
{
if (pPlayer->HasShield())
{
pPlayer->DropShield(true);
return;
}
while (pPlayer->m_rgpPlayerItems[WPNSLOT_PRIMARY])
pPlayer->DropPlayerItem(STRING(pPlayer->m_rgpPlayerItems[WPNSLOT_PRIMARY]->pev->classname));
}
void DropPistol(CBasePlayer *pPlayer)
{
if (pPlayer->HasShield())
pPlayer->DrawnShiled();
while (pPlayer->m_rgpPlayerItems[WPNSLOT_SECONDARY])
pPlayer->DropPlayerItem(STRING(pPlayer->m_rgpPlayerItems[WPNSLOT_SECONDARY]->pev->classname));
}
И сам код дропа:
Код
void CBasePlayer::DropPlayerItem(const char *pszItemName)
{
if (!strlen(pszItemName))
pszItemName = NULL;
if (m_bIsVIP)
{
ClientPrint(pev, HUD_PRINTCENTER, "#Weapon_Cannot_Be_Dropped");
return;
}
if (!pszItemName && HasShield() == true)
DropShield(true);
for (int i = 0; i < MAX_ITEM_TYPES; i++)
{
CBasePlayerItem *pWeapon = m_rgpPlayerItems[i];
while (pWeapon)
{
if (pszItemName)
{
if (!strcmp(pszItemName, STRING(pWeapon->pev->classname)))
break;
}
else if (pWeapon == m_pActiveItem)
break;
pWeapon = pWeapon->m_pNext;
}
if (pWeapon)
{
if (!pWeapon->CanDrop())
{
ClientPrint(pev, HUD_PRINTCENTER, "#Weapon_Cannot_Be_Dropped");
continue;
}
g_pGameRules->GetNextBestWeapon(this, pWeapon);
UTIL_MakeVectors(pev->angles);
pev->weapons &= ~(1 << pWeapon->m_iId);
if (pWeapon->iItemSlot() == WPNSLOT_PRIMARY)
m_bHasPrimary = false;
if (!strcmp(STRING(pWeapon->pev->classname), "weapon_c4"))
{
m_bHasC4 = false;
pev->body = 0;
SetBombIcon(FALSE);
pWeapon->m_pPlayer->SetProgressBarTime(0);
if (!g_pGameRules->m_fTeamCount)
{
UTIL_LogPrintf("\"%s<%i><%s><TERRORIST>\" triggered \"Dropped_The_Bomb\"\n", STRING(pev->netname), GETPLAYERUSERID(edict()), GETPLAYERAUTHID(edict()));
g_pGameRules->m_bBombDropped = TRUE;
CBaseEntity *pEntity = NULL;
while ((pEntity = UTIL_FindEntityByClassname(pEntity, "player")) != NULL)
{
if (FNullEnt(pEntity->edict()))
break;
if (!pEntity->IsPlayer())
continue;
if (pEntity->pev->flags != FL_DORMANT)
{
CBasePlayer *pOther = GetClassPtr((CBasePlayer *)pEntity->pev);
if (pOther->pev->deadflag == DEAD_NO && pOther->m_iTeam == TEAM_TERRORIST)
{
ClientPrint(pOther->pev, HUD_PRINTCENTER, "#Game_bomb_drop", STRING(pev->netname));
MESSAGE_BEGIN(MSG_ONE, gmsgBombDrop, NULL, pOther->pev);
WRITE_COORD(pev->origin.x);
WRITE_COORD(pev->origin.y);
WRITE_COORD(pev->origin.z);
WRITE_BYTE(0);
MESSAGE_END();
}
}
}
}
}
CWeaponBox *pWeaponBox = (CWeaponBox *)Create("weaponbox", pev->origin + gpGlobals->v_forward * 10, pev->angles, edict());
pWeaponBox->pev->angles.x = 0;
pWeaponBox->pev->angles.z = 0;
pWeaponBox->SetThink(&CWeaponBox::Kill);
pWeaponBox->pev->nextthink = gpGlobals->time + 300;
pWeaponBox->PackWeapon(pWeapon);
pWeaponBox->pev->velocity = gpGlobals->v_forward * 300 + gpGlobals->v_forward * 100;
if (pWeapon->iFlags() & ITEM_FLAG_EXHAUSTIBLE)
{
int iAmmoIndex = GetAmmoIndex(pWeapon->pszAmmo1());
if (iAmmoIndex != -1)
{
pWeaponBox->PackAmmo(MAKE_STRING(pWeapon->pszAmmo1()), m_rgAmmo[iAmmoIndex] > 0);
m_rgAmmo[iAmmoIndex] = 0;
}
}
const char *modelname = GetCSModelName(pWeapon->m_iId);
if (modelname)
SET_MODEL(ENT(pWeaponBox->pev), modelname);
return;
}
}
}
Можно блочить ДО DropPlayerItem, поигравшись с m_rgpPlayerItems, правда игры с ним могут быть немного опасны
можно блочить внутри DropPlayerItem, допустим, подсунув игроку випа на момент выдачи:
if (m_bIsVIP)
{
ClientPrint(pev, HUD_PRINTCENTER, "#Weapon_Cannot_Be_Dropped");
return;
}
и заблочить мессагу. Костыльно конечно, но сработает.