Скриптер
Участник
Пользователь
- Сообщения
- 657
- Реакции
- 562
- Предупреждения
- 8
- Помог
- 9 раз(а)
Refresh,
C++:
// Copyright © 2024 Vaqtincha
#include <amxmodx>
#include <reapi>
public plugin_init()
{
register_plugin("buyZone", "0.1", "Vaqtincha")
RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip", .post = true)
register_clcmd("radio3", "CheckBuyZone")
}
public CheckBuyZone(pPlayer)
{
client_print(pPlayer, print_chat, "buyzone_custom ? %s", rg_user_in_buyzone_custom(pPlayer) ? "YES" : "NO")
client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
return PLUGIN_HANDLED
}
public CBasePlayer_OnSpawnEquip(const pPlayer, bool:addDefault, bool:equipGame)
{
client_print(pPlayer, print_chat, "buyzone_custom ? %s", rg_user_in_buyzone_custom(pPlayer) ? "YES" : "NO")
client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
}
// обычный штатный
stock bool:rg_user_in_buyzone_signal(const pPlayer)
{
new iSignals[UnifiedSignals]
get_member(pPlayer, m_signals, iSignals)
return bool:(SignalState:iSignals[US_State] & SIGNAL_BUY)
}
// свой новый
stock bool:rg_user_in_buyzone_custom(const pPlayer)
{
// нет необходимости OLD_CheckBuyZone. проблема возникает только на картах где есть триггер func_buyzone
// return bool:(get_member_game(m_bMapHasBuyZone) ? IsPlayerInBuyZOne(pPlayer) : OLD_CheckBuyZone(pPlayer))
//.....
// если есть триггер func_buyzone то свою вызываем а если нету то обычный штатный
return bool:(get_member_game(m_bMapHasBuyZone) ? IsPlayerInBuyZOne(pPlayer) : rg_user_in_buyzone_signal(pPlayer))
}
// он немного строгий. игрок должен находиться внутри байзоны полностью (по высоте не имеет значение)
// entity_intersects нам не подойдет
bool:IsPlayerInBuyZOne(const pPlayer)
{
new Float:player_absmax[3], Float:player_absmin[3]
new Float:buyzone_absmax[3], Float:buyzone_absmin[3]
get_entvar(pPlayer, var_absmin, player_absmin)
get_entvar(pPlayer, var_absmax, player_absmax)
new pBuyZone = NULLENT, buyzone_team, player_team = get_member(pPlayer, m_iTeam)
while ((pBuyZone = rg_find_ent_by_class(pBuyZone, "func_buyzone")))
{
buyzone_team = get_entvar(pBuyZone, var_team)
if (buyzone_team == any:TEAM_UNASSIGNED || buyzone_team == player_team)
{
get_entvar(pBuyZone, var_absmin, buyzone_absmin)
get_entvar(pBuyZone, var_absmax, buyzone_absmax)
if (buyzone_absmin[0] > player_absmin[0] || buyzone_absmin[1] > player_absmin[1])
return false
if (buyzone_absmax[0] < player_absmax[0] || buyzone_absmax[1] < player_absmax[1])
return false
}
}
return true
}
// в этом стоке нет необходимости . проблема возникает только на картах где есть триггер func_buyzone
stock bool:OLD_CheckBuyZone(const pPlayer)
{
new any:iTeam = get_member(pPlayer, m_iTeam)
if (!CanPlayerBuy(iTeam))
return false
new pszSpawnClass[32]
if (iTeam == TEAM_TERRORIST)
pszSpawnClass = "info_player_deathmatch"
else if (iTeam == TEAM_CT)
pszSpawnClass = "info_player_start"
if (pszSpawnClass[0])
{
new pSpot = NULLENT
new Float:player_origin[3], Float:spot_origin[3]
get_entvar(pPlayer, var_origin, player_origin)
while ((pSpot = rg_find_ent_by_class(pSpot, pszSpawnClass)))
{
get_entvar(pSpot, var_origin, spot_origin)
if (get_distance_f(spot_origin, player_origin) < 200.0)
{
return true
}
}
}
return false
}
// restrict by maprules
stock bool:CanPlayerBuy(any:iTeam)
{
if ((iTeam == TEAM_CT && get_member_game(m_bCTCantBuy)) || (iTeam == TEAM_TERRORIST && get_member_game(m_bTCantBuy)))
{
return false
}
return true
}
C++:
// Copyright © 2024 Vaqtincha
#include <amxmodx>
#include <reapi>
#include <hamsandwich>
public plugin_init()
{
register_plugin("buyZone", "0.1", "Vaqtincha")
RegisterHookChain(RG_CBasePlayer_OnSpawnEquip, "CBasePlayer_OnSpawnEquip", .post = true)
register_clcmd("radio3", "CheckBuyZone")
}
public CheckBuyZone(pPlayer)
{
client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
return PLUGIN_HANDLED
}
public CBasePlayer_OnSpawnEquip(const pPlayer, bool:addDefault, bool:equipGame)
{
// Тач происходит после спавна игрока. форсим тач
// нет необходимости проверки команды
new pBuyZone = NULLENT//, buyzone_team, player_team = get_member(pPlayer, m_iTeam)
while ((pBuyZone = rg_find_ent_by_class(pBuyZone, "func_buyzone")))
{
// buyzone_team = get_entvar(pBuyZone, var_team)
// if (buyzone_team == any:TEAM_UNASSIGNED || buyzone_team == player_team)
ExecuteHamB(Ham_Touch, pBuyZone, pPlayer)
}
client_print(pPlayer, print_chat, "buyzone_signal ? %s", rg_user_in_buyzone_signal(pPlayer) ? "YES" : "NO")
}
stock bool:rg_user_in_buyzone_signal(const pPlayer)
{
new iSignals[UnifiedSignals]
get_member(pPlayer, m_signals, iSignals)
// проблема только с триггером func_buyzone так что тут Signal проверяем после нашего насильного тача
return bool:(SignalState:iSignals[get_member_game(m_bMapHasBuyZone) ? US_Signal : US_State] & SIGNAL_BUY)
}
10 Апр 2024
и еще говнокодаЗато сколько опыта и эмоций