//===================Настройки===================
new const g_szMenuCommand[] = "say /menu_sphere" // Команда, чтобы открыть меню настроек сферы
new const g_szFileSettings[] = "addons/amxmodx/configs/bio_spheresettings.ini" // Меню сохранённых координат сферы. ФАЙЛ НЕ УДАЛЯТЬ
new const g_szModelSpere[] = "models/biozm/aura/aura.mdl" // Модель сферы
new const Float:g_fMinSphere[] = {-95.0, -95.0, 0.0}
new const Float:g_fMaxSphere[] = {95.0, 95.0, 120.0}
//Растановка дыма относительно умершего зомби
new const Float:g_fOriginAddSprite[][] =
new const Float:g_fGasMin[] = {-80.0, -80.0, -50.0}
new const Float:g_fGasMax[] = {80.0, 80.0, 50.0}
new const Float:g_fColorGas[] = {255.0, 0.0, 0.0} // Цвет дыма
//Цвет свечения, отравлённого газом
//===============================================
new const g_szSphereClassName[] = "bio_sphere"
new const g_szGasClassName[] = "bio_gas_system"
new Float:g_fUserTimeHeal[33], g_iUserFirstZombie, g_iUserTimeGasDelay[33], Float:g_fTimeSphereDelay[33]
new Float:g_fOriginNew[3], Float:g_fAnglesNew[3]
engfunc(EngFunc_PrecacheModel, g_szModelSpere)
engfunc(EngFunc_PrecacheModel, "models/w_ak47.mdl")
engfunc(EngFunc_PrecacheModel, "sprites/gas_puff_01.spr")
register_plugin("[BIO] Sphere", "1.1", "Docaner (peace dads)")
register_event("HLTV", "Event_HLTV", "a", "1=0", "2=0")
RegisterHam(Ham_Killed, "player", "HM_PlayerKilled_Post", 1)
RegisterHam(Ham_Touch, "info_target", "HM_TargetTouch_Post", 1)
RegisterHam(Ham_Touch, "player", "HM_PlayerTouch_Post", 1)
register_clcmd(g_szMenuCommand, "Show_MenuSettings")
register_menucmd(register_menuid("Show_MenuSettings"), (1<<0|1<<1|1<<2|1<<9), "Handle_MenuSettings")
g_iMaxPlayers = get_maxplayers()
if(file_exists(g_szFileSettings))
new szBuffer[128], szLeft[34], szMapName[33], szNumbers[6][9], Float:fOrigin[3], Float:fAngles[3], iLine, iLen
get_mapname(szMapName, charsmax(szMapName))
while(read_file(g_szFileSettings, iLine++, szBuffer, charsmax(szBuffer), iLen))
strtok(szBuffer, szLeft, charsmax(szLeft), szBuffer, charsmax(szBuffer), ':')
if(!equal(szLeft, szMapName))
parse(szBuffer, szNumbers[0], charsmax(szNumbers[]), szNumbers[1], charsmax(szNumbers[]), szNumbers[2], charsmax(szNumbers[]),
szNumbers[3], charsmax(szNumbers[]), szNumbers[4], charsmax(szNumbers[]), szNumbers[5], charsmax(szNumbers[]))
fOrigin[0] = str_to_float(szNumbers[0])
fOrigin[1] = str_to_float(szNumbers[1])
fOrigin[2] = str_to_float(szNumbers[2])
fAngles[0] = str_to_float(szNumbers[3])
fAngles[1] = str_to_float(szNumbers[4])
fAngles[2] = str_to_float(szNumbers[5])
create_sphere(fOrigin, fAngles)
server_print("[SPHERE] Файл загрузки координат не найден ^"%s^" ", g_szFileSettings)
public client_disconnect(id)
if(g_iUserFirstZombie == id)
if(task_exists(id+TASKID_INFECTDELAY))
remove_task(id+TASKID_INFECTDELAY)
g_iUserTimeGasDelay[id] = 0
fm_set_rendering(id, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)
ClearBit(g_iBitUserMoneyPrize, id)
public event_infect(iVictim)
if(task_exists(iVictim+TASKID_INFECTDELAY))
remove_task(iVictim+TASKID_INFECTDELAY)
g_iUserTimeGasDelay[iVictim] = 0
fm_set_rendering(iVictim, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)
g_iUserFirstZombie = iVictim
for(new i = 1; i <= g_iMaxPlayers; i++)
if(!is_user_connected(i))
SetBit(g_iBitUserMoneyPrize, i)
if(!task_exists(i+TASKID_INFECTDELAY))
remove_task(i+TASKID_INFECTDELAY)
g_iUserTimeGasDelay[i] = 0
fm_set_rendering(i, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szGasClassName)))
set_pev(iEnt, pev_flags, FL_KILLME)
public HM_PlayerKilled_Post(iVictim)
if(task_exists(iVictim+TASKID_INFECTDELAY))
remove_task(iVictim+TASKID_INFECTDELAY)
g_iUserTimeGasDelay[iVictim] = 0
fm_set_rendering(iVictim, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 0)
if(g_iUserFirstZombie == iVictim && is_user_zombie(iVictim))
new Float:fOrigin[3], Float:fOriginWork[3]
pev(iVictim, pev_origin, fOrigin)
for(new i; i <= charsmax(g_fOriginAddSprite); i++)
xs_vec_add(fOrigin, g_fOriginAddSprite[i], fOriginWork)
public HM_TargetTouch_Post(iEnt, iTouched)
if(!pev_valid(iEnt) || !is_user_alive(iTouched))
if(pev(iEnt, pev_impulse) == IMPULSE_SPHERE)
if(IsSetBit(g_iBitUserMoneyPrize, iTouched))
fm_set_user_money(iTouched, fm_get_user_money(iTouched) + MONEY_PRIZE)
UTIL_SayText(iTouched, "!y[!gSPHERE!y] Вы получили !g%d$!y! Подходите каждый раунд к сфере, чтобы получить приз", MONEY_PRIZE)
ClearBit(g_iBitUserMoneyPrize, iTouched)
if(task_exists(iTouched+TASKID_INFECTDELAY))
UTIL_SayText(iTouched, "!y[!gSPHERE!y] Вы исцелены от инфекционного газа!")
remove_task(iTouched+TASKID_INFECTDELAY)
if(is_user_zombie(iTouched))
if(get_gametime() - g_fUserTimeHeal[iTouched] >= CD_HEAL_ZM)
pev(iTouched, pev_health, fHealth)
if(fHealth < MAX_HEAL_ZM)
set_pev(iTouched, pev_health, fHealth + HEAL_ZM > MAX_HEAL_ZM ? MAX_HEAL_ZM : fHealth + HEAL_ZM)
UTIL_ScreenFade(iTouched, (2<<12), (1<<12), 0x0000, 0, 255, 0, 100)
g_fUserTimeHeal[iTouched] = get_gametime()
if(get_gametime() - g_fUserTimeHeal[iTouched] >= CD_HEAL_HUMAN)
pev(iTouched, pev_health, fHealth)
if(fHealth < MAX_HEAL_HUMAN)
set_pev(iTouched, pev_health, fHealth + HEAL_HUMAN > MAX_HEAL_HUMAN ? MAX_HEAL_HUMAN : fHealth + HEAL_HUMAN)
UTIL_ScreenFade(iTouched, (2<<12), (1<<12), 0x0000, 0, 255, 0, 100)
g_fUserTimeHeal[iTouched] = get_gametime()
g_fTimeSphereDelay[iTouched] = get_gametime()
else if(pev(iEnt, pev_impulse) == IMPULSE_BOXGAS && !task_exists(TASKID_INFECTDELAY+iTouched) && !is_user_zombie(iTouched))
public HM_PlayerTouch_Post(iToucher, iTouched)
if(!is_user_alive(iTouched) || !is_user_alive(iTouched) || is_user_zombie(iTouched) ||
!task_exists(iToucher+TASKID_INFECTDELAY) || task_exists(iTouched+TASKID_INFECTDELAY))
if(get_gametime() - g_fTimeSphereDelay[id] >= 0.5)
g_iUserTimeGasDelay[id] = 1
task_InfectDelay(TASKID_INFECTDELAY+id)
fm_set_rendering(id, kRenderFxGlowShell, GAS_RED, GAS_GREEN, GAS_BLUE, kRenderNormal, 0)
UTIL_SayText(id, "!y[!gGAS!y] Вы отравлены инфекционным газом! Бегите к сфере, чтобы исцелиться!")
set_task(1.0, "task_InfectDelay", TASKID_INFECTDELAY+id, _, _, "b")
public task_InfectDelay(id)
if(!--g_iUserTimeGasDelay[id])
g_iUserTimeGasDelay[id] = DAMAGE_DELAY
pev(id, pev_health, fHealth)
if(fHealth - HP_DAMAGE_GAS > 0.0)
set_pev(id, pev_health, fHealth - HP_DAMAGE_GAS)
for(new i = 1; i <= g_iMaxPlayers; i++)
if(!is_user_alive(i) || fm_get_user_team(i) != 2) continue
ExecuteHamB(Ham_Killed, id, id, 0)
//ExecuteHamB(Ham_TakeDamage, id, g_iUserGasOwner, g_iUserGasOwner, HP_DAMAGE_GAS, DMG_SLASH)
UTIL_ScreenShake(id, (10<<12), (2<<12), (10<<12))
set_hudmessage(0, 255, 0, -1.0, 0.16, 0, 0.0, 0.9, 0.1, 0.1, -1)
show_hudmessage(id, "Вы инфицированы!!!^nБыстрее бегите к сфере")
public Show_MenuSettings(id)
if(~get_user_flags(id) & ADMIN_FLAGMENU)
UTIL_SayText(id, "!y[!gSPHERE!y] Доступ запрещён!")
new szMenu[256], iKeys = (1<<0|1<<1|1<<2|1<<9), iLen = formatex(szMenu, charsmax(szMenu), "\yМеню настроек сферы^n^n")
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[1] \wПоставить новую сферу^n")
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[2] \wВосстановить из последнего сохранения^n")
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[3] \wСохранить настройки^n^n^n^n^n^n^n")
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y[0] \wВыход")
return show_menu(id, iKeys, szMenu, -1, "Show_MenuSettings")
public Handle_MenuSettings(id, iKey)
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szSphereClassName)))
set_pev(iEnt, pev_flags, FL_KILLME)
fm_get_aiming_position(id, g_fOriginNew)
TraceDropToFloor(g_fOriginNew, 1000.0, g_fOriginNew)
AnglesToFloor(g_fOriginNew, g_fAnglesNew)
create_sphere(g_fOriginNew, g_fAnglesNew)
while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", g_szSphereClassName)))
pev(iEnt, pev_origin, g_fOriginNew)
pev(iEnt, pev_angles, g_fAnglesNew)
set_pev(iEnt, pev_flags, FL_KILLME)
if(!xs_vec_equal(g_fOriginNew, Float:{0.0, 0.0, 0.0}))
create_sphere(g_fOriginNew, g_fAnglesNew)
UTIL_SayText(id, "!y[!gSPHERE!y] Сохранение не найдено!")
g_fOriginNew = Float:{0.0, 0.0, 0.0}
g_fAnglesNew = Float:{0.0, 0.0, 0.0}
if(!xs_vec_equal(g_fOriginNew, Float:{0.0, 0.0, 0.0}))
new szBuffer[128], szLeft[35], szMapName[33], iLine, iLen, bool:bFind
get_mapname(szMapName, charsmax(szMapName))
while(read_file(g_szFileSettings, iLine++, szBuffer, charsmax(szBuffer), iLen))
strtok(szBuffer, szLeft, charsmax(szLeft), szBuffer, charsmax(szBuffer), ':')
if(!equal(szLeft, szMapName))
formatex(szBuffer, charsmax(szBuffer), "%s: %.3f %.3f %.3f %.3f %.3f %.3f", szMapName,
g_fOriginNew[0], g_fOriginNew[1], g_fOriginNew[2], g_fAnglesNew[0], g_fAnglesNew[1], g_fAnglesNew[2])
write_file(g_szFileSettings, szBuffer, bFind ? iLine - 1 : -1)
UTIL_SayText(id, "!y[!gSPHERE!y] Настройки сохранены!")
UTIL_SayText(id, "!y[!gSPHERE!y] На карте не найдена новая сфера!")
return Show_MenuSettings(id)
create_sphere(Float:fOrigin[3], Float:fAngles[3])
if(iszInfoTarget || (iszInfoTarget = engfunc(EngFunc_AllocString, "info_target")))
iEnt = engfunc(EngFunc_CreateNamedEntity, iszInfoTarget)
set_pev(iEnt, pev_impulse, IMPULSE_SPHERE)
set_pev(iEnt, pev_solid, SOLID_TRIGGER)
//set_pev(iEnt, pev_effects, EF_NODRAW)
set_pev(iEnt, pev_classname, g_szSphereClassName)
engfunc(EngFunc_SetModel, iEnt, g_szModelSpere)
engfunc(EngFunc_SetOrigin, iEnt, fOrigin)
engfunc(EngFunc_SetSize, iEnt, g_fMinSphere, g_fMaxSphere)
set_pev(iEnt, pev_angles, fAngles)
fm_set_rendering(iEnt, kRenderFxGlowShell, 0, 255, 0, kRenderTransAlpha, 10)
/*new Float:fMin[3], Float:fMax[3]
xs_vec_add(fOrigin, g_fMinSphere, fMin)
xs_vec_add(fOrigin, g_fMaxSphere, fMax)
CTREATE_BOX(fMin, fMax, 999, 255, 0, 0)*/
create_gas(Float:fOrigin[3])
if(iszEnvSprite || (iszEnvSprite = engfunc(EngFunc_AllocString, "env_sprite")))
iEnt = engfunc(EngFunc_CreateNamedEntity, iszEnvSprite)
set_pev(iEnt, pev_classname, g_szGasClassName)
engfunc(EngFunc_SetModel, iEnt, "sprites/gas_puff_01.spr")
engfunc(EngFunc_SetOrigin, iEnt, fOrigin)
engfunc(EngFunc_SetSize, iEnt, g_fMinSphere, g_fMaxSphere)
set_pev(iEnt, pev_scale, 2.5)
set_pev(iEnt, pev_rendermode, kRenderTransAlpha);
set_pev(iEnt, pev_renderamt, 255.0);
set_pev(iEnt, pev_rendercolor, g_fColorGas)
create_box_gas(Float:fOrigin[3])
if(iszInfoTarget || (iszInfoTarget = engfunc(EngFunc_AllocString, "info_target")))
iEnt = engfunc(EngFunc_CreateNamedEntity, iszInfoTarget)
set_pev(iEnt, pev_classname, g_szGasClassName)
set_pev(iEnt, pev_impulse, IMPULSE_BOXGAS)
set_pev(iEnt, pev_solid, SOLID_TRIGGER)
engfunc(EngFunc_SetModel, iEnt, "models/w_ak47.mdl")
engfunc(EngFunc_SetOrigin, iEnt, fOrigin)
engfunc(EngFunc_SetSize, iEnt, g_fGasMin, g_fGasMax)
set_pev(iEnt, pev_effects, EF_NODRAW)
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
set_pev(entity, pev_renderfx, fx)
set_pev(entity, pev_rendercolor, color)
set_pev(entity, pev_rendermode, render)
set_pev(entity, pev_renderamt, float(amount))
stock AnglesToFloor(Float:flOrigin[3], Float:fAngles[3])
new iTrace = create_tr2(), Float:flOrigin2[3]
engfunc(EngFunc_TraceLine, flOrigin, flOrigin2, IGNORE_MONSTERS, 0, iTrace)
get_tr2(iTrace, TR_vecPlaneNormal, fAngles)
vector_to_angle(fAngles, fAngles)
stock TraceDropToFloor(Float:flOriginStart[3], Float:flDistance, Float:flOriginResault[3])
new iTrace = create_tr2(), Float:flOriginEnd[3]
flOriginEnd = flOriginStart
flOriginEnd[2] -= flDistance
engfunc(EngFunc_TraceLine, flOriginStart, flOriginEnd, IGNORE_MONSTERS, 0, iTrace)
get_tr2(iTrace, TR_vecEndPos, flOriginResault)
stock UTIL_SayText(pPlayer, const szMessage[], any:...)
if(numargs() > 2) vformat(szBuffer, charsmax(szBuffer), szMessage, 3);
else copy(szBuffer, charsmax(szBuffer), szMessage);
while(replace(szBuffer, charsmax(szBuffer), "!y", "^1")) {}
while(replace(szBuffer, charsmax(szBuffer), "!t", "^3")) {}
while(replace(szBuffer, charsmax(szBuffer), "!g", "^4")) {}
for(new iPlayer = 1; iPlayer <= g_iMaxPlayers; iPlayer++)
if(!is_user_connected(iPlayer)) continue;
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, iPlayer);
engfunc(EngFunc_MessageBegin, MSG_ONE_UNRELIABLE, MsgId_SayText, {0.0, 0.0, 0.0}, pPlayer);
stock fm_get_aiming_position(pPlayer, Float:vecReturn[3])
new Float:vecOrigin[3], Float:vecViewOfs[3], Float:vecAngle[3], Float:vecForward[3];
pev(pPlayer, pev_origin, vecOrigin);
pev(pPlayer, pev_view_ofs, vecViewOfs);
xs_vec_add(vecOrigin, vecViewOfs, vecOrigin);
pev(pPlayer, pev_v_angle, vecAngle);
engfunc(EngFunc_MakeVectors, vecAngle);
global_get(glb_v_forward, vecForward);
xs_vec_mul_scalar(vecForward, 8192.0, vecForward);
xs_vec_add(vecOrigin, vecForward, vecForward);
engfunc(EngFunc_TraceLine, vecOrigin, vecForward, DONT_IGNORE_MONSTERS, pPlayer, 0);
get_tr2(0, TR_vecEndPos, vecReturn);
stock fm_set_user_money(id, iMoney, iHide = 1)
set_pdata_int(id, m_iAccount, iMoney);
message_begin(MSG_ONE, MsgId_Money, _, id);
stock UTIL_ScreenFade(pPlayer, iDuration, iHoldTime, iFlags, iRed, iGreen, iBlue, iAlpha, iReliable = 0)
message_begin(iReliable ? MSG_ALL : MSG_BROADCAST, MsgId_ScreenFade);
engfunc(EngFunc_MessageBegin, iReliable ? MSG_ONE : MSG_ONE_UNRELIABLE, MsgId_ScreenFade, {0.0, 0.0, 0.0}, pPlayer);
stock CTREATE_BOX(Float:fOriginMin[3], Float:fOriginMax[3], iLife, iRed, iGreen, iBlue)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
engfunc(EngFunc_WriteCoord, fOriginMin[0])
engfunc(EngFunc_WriteCoord, fOriginMin[1])
engfunc(EngFunc_WriteCoord, fOriginMin[2])
engfunc(EngFunc_WriteCoord, fOriginMax[0])
engfunc(EngFunc_WriteCoord, fOriginMax[1])
engfunc(EngFunc_WriteCoord, fOriginMax[2])
write_short(iLife) // in 0.1
stock CREATE_FIREFIELD(Float:fOrigin[3], iRadius, pSprite, iCount, iFlags, iTime)
message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
engfunc(EngFunc_WriteCoord, fOrigin[0])
engfunc(EngFunc_WriteCoord, fOrigin[1])
engfunc(EngFunc_WriteCoord, fOrigin[2])
write_byte(iTime) // SEC * 10
stock UTIL_ScreenShake(pPlayer, iAmplitude, iDuration, iFrequency, iReliable = 0)
engfunc(EngFunc_MessageBegin, iReliable ? MSG_ONE : MSG_ONE_UNRELIABLE, MsgId_ScreenShake, {0.0, 0.0, 0.0}, pPlayer);