#include <amxmodx>
#include <amxmisc>
#include <fakemeta_util>
#define NUMLINES 10 // Tyle lini bedzie miala 1 "linia" rushu
enum PluginCvars {
Enable = 0,
PunishType,
CustomLineColor,
LineColorR,
LineColorG,
LineColorB
};
enum PluginArrays {
Array:LinePoints = 0,
Array:LineHeight,
Array:NextRefresh
};
new const g_szClassName[64] = "rush_entity"
new const g_szRushMenuCommands[][] =
{
"say /rushmenu",
"say_team /rushmenu",
"say /antyrush",
"say_team /antyrush",
"rushmenu",
"antyrush"
};
new g_sprBeamSprite;
new g_cvarPluginConfig[PluginCvars];
new Float:g_fTempOrigin[33][2][3];
new Array:g_aPluginArrays[PluginArrays];
public plugin_init() {
register_plugin("Simple AntyRush", "0.1", "MarWit")
g_cvarPluginConfig[Enable] = register_cvar("ar_enable", "1");
g_cvarPluginConfig[PunishType] = register_cvar("ar_punishtype", "1");
g_cvarPluginConfig[CustomLineColor] = register_cvar("ar_customcolor", "0");
g_cvarPluginConfig[LineColorR] = register_cvar("ar_color_r", "25")
g_cvarPluginConfig[LineColorG] = register_cvar("ar_color_g", "25")
g_cvarPluginConfig[LineColorB] = register_cvar("ar_color_b", "255")
if(!get_pcvar_num(g_cvarPluginConfig[Enable]))
return PLUGIN_HANDLED_MAIN
for(new i=0; i<sizeof(g_szRushMenuCommands); i++)
register_clcmd(g_szRushMenuCommands[i], "cmdMenu", ADMIN_IMMUNITY)
g_aPluginArrays[LinePoints] = ArrayCreate(6, 1);
g_aPluginArrays[LineHeight] = ArrayCreate(NUMLINES, 1)
g_aPluginArrays[NextRefresh] = ArrayCreate(1, 1);
register_forward(FM_Think, "fwd_Think")
LoadMapConfig()
return PLUGIN_CONTINUE
}
public plugin_precache()
g_sprBeamSprite = precache_model("sprites/dot.spr")
public LoadMapConfig()
{
new szFile[128], szBuffer[128], szArgs[6][10];
new Float:fBuffer[6];
get_configsdir(szFile, charsmax(szFile))
get_mapname(szBuffer, charsmax(szBuffer))
format(szFile, charsmax(szFile), "%s/AntyRush/%s.ini", szFile, szBuffer)
new iFile = fopen(szFile, "rt")
if(ArraySize(g_aPluginArrays[LinePoints]))
{
log_amx("%d", ArraySize(g_aPluginArrays[LinePoints]))
log_amx("%d", ArraySize(g_aPluginArrays[LineHeight]))
log_amx("%d", ArraySize(g_aPluginArrays[NextRefresh]))
ArrayClear(g_aPluginArrays[LinePoints])
ArrayClear(g_aPluginArrays[LineHeight])
ArrayClear(g_aPluginArrays[NextRefresh])
}
while(!feof(iFile))
{
fgets(iFile, szBuffer, charsmax(szBuffer))
if(equali(szBuffer, ""))
continue;
replace_all(szBuffer, charsmax(szBuffer), ",", " ")
parse(szBuffer, szArgs[0], 9, szArgs[1], 9, szArgs[2], 9, szArgs[3], 9, szArgs[4], 9, szArgs[5], 9)
for(new i=0; i<5; i++)
fBuffer[i] = str_to_float(szArgs[i])
ArrayPushArray(g_aPluginArrays[LinePoints], fBuffer);
}
fclose(iFile)
MakeRushEntity()
}
public SaveMapConfig(const bool:bDeleteConfig)
{
new szFile[128], szBuffer[1024];
new Float:fBuffer[6];
get_configsdir(szFile, charsmax(szFile))
get_mapname(szBuffer, charsmax(szBuffer))
format(szFile, charsmax(szFile), "%s/AntyRush/%s.ini", szFile, szBuffer)
new iFile = fopen(szFile, "wt")
if(bDeleteConfig)
{
fclose(iFile);
LoadMapConfig()
return;
}
for(new i=0; i<ArraySize(g_aPluginArrays[LinePoints]); i++)
{
ArrayGetArray(g_aPluginArrays[LinePoints], i, fBuffer)
if(fBuffer[0] == 0.0 && fBuffer[3] == 0.0)
continue;
format(szBuffer, charsmax(szBuffer), "%f,%f,%f,%f,%f,%f^n", fBuffer[0], fBuffer[1], fBuffer[2], fBuffer[3], fBuffer[4], fBuffer[5])
fputs(iFile, szBuffer)
}
fclose(iFile)
LoadMapConfig()
}
public MakeRushEntity()
{
new iEnt = -1, iTr;
new Float:fEnd[2][3], Float:fLinePoint[2][3], Float:fBuffer[6];
new Float:fHeights[NUMLINES]
while((iEnt = fm_find_ent_by_class(-1, g_szClassName)) != 0)
engfunc(EngFunc_RemoveEntity, iEnt)
for(new i=0; i<ArraySize(g_aPluginArrays[LinePoints]); i++)
{
iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target"))
set_pev(iEnt, pev_classname, g_szClassName)
set_pev(iEnt, pev_owner, i)
ArrayGetArray(g_aPluginArrays[LinePoints], i, fBuffer)
for(new i=0; i<2; i++)
{
fLinePoint[0][i] = fBuffer[i]
fLinePoint[1][i] = fBuffer[i+3]
}
fEnd[0][0] = ( fLinePoint[0][0] + fLinePoint[1][0] ) / 2.0
fEnd[0][1] = ( fLinePoint[0][1] + fLinePoint[1][1] ) / 2.0
fEnd[0][2] = ( fLinePoint[0][2] + fLinePoint[1][2] ) / 2.0
fEnd[1] = fEnd[0]
fEnd[1][2] += 400.0
engfunc(EngFunc_TraceLine, fEnd[0], fEnd[1], IGNORE_MONSTERS, iEnt, iTr)
get_tr2(iTr, TR_vecEndPos, fLinePoint[0])
free_tr2(iTr)
fEnd[1] = fEnd[0]
fEnd[1][2] -= 400.0
engfunc(EngFunc_TraceLine, fEnd[0], fEnd[1], IGNORE_MONSTERS, iEnt, iTr)
get_tr2(iTr, TR_vecEndPos, fLinePoint[1])
free_tr2(iTr)
fHeights[NUMLINES-1] = fLinePoint[0][2] - fLinePoint[1][2]
fHeights[NUMLINES-1] /= NUMLINES.0
fHeights[0] = fLinePoint[1][2]
for(new iNum = 1; iNum<NUMLINES-1; iNum++)
fHeights[iNum] = fHeights[iNum-1] + fHeights[NUMLINES-1]
ArrayPushArray(g_aPluginArrays[LineHeight], fHeights)
ArrayPushCell(g_aPluginArrays[NextRefresh], 0.0)
set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
dllfunc(DLLFunc_Think, iEnt)
}
}
public fwd_Think(iEnt)
{
new szClassName[64]
pev(iEnt, pev_classname, szClassName, 63)
if(!(equal(szClassName, g_szClassName)))
return FMRES_IGNORED
new iRushNum = pev(iEnt, pev_owner)
set_pev(iEnt, pev_nextthink, get_gametime() + 0.1)
new iTr, iHit;
new Float:fOrigin[2][3], Float:fBuffer[6], Float:fHeights[NUMLINES];
ArrayGetArray(g_aPluginArrays[LinePoints], iRushNum, fBuffer)
ArrayGetArray(g_aPluginArrays[LineHeight], iRushNum, fHeights)
for(new i=0; i<2; i++)
{
fOrigin[0][i] = fBuffer[i]
fOrigin[1][i] = fBuffer[i+3]
}
for(new i=0; i<NUMLINES-1; i++)
{
fOrigin[0][2] = fHeights[i]
fOrigin[1][2] = fHeights[i]
engfunc(EngFunc_TraceLine, fOrigin[0], fOrigin[1], DONT_IGNORE_MONSTERS, iEnt, iTr);
iHit = get_tr2(iTr, TR_pHit)
free_tr2(iTr)
if(pev_valid(iHit) && pev(iHit, pev_flags) & ( FL_CLIENT | FL_FAKECLIENT | FL_MONSTER ))
PunishPlayer(iHit)
}
if(ArrayGetCell(g_aPluginArrays[NextRefresh], iRushNum) >= get_gametime())
return FMRES_IGNORED
for(new i=0; i<NUMLINES-1; i++)
{
message_begin(MSG_BROADCAST, SVC_TEMPENTITY, {0, 0, 0}, 0)
write_byte(0)
engfunc(EngFunc_WriteCoord, fBuffer[0])
engfunc(EngFunc_WriteCoord, fBuffer[1])
engfunc(EngFunc_WriteCoord, fHeights[i])
engfunc(EngFunc_WriteCoord, fBuffer[3])
engfunc(EngFunc_WriteCoord, fBuffer[4])
engfunc(EngFunc_WriteCoord, fHeights[i])
write_short(g_sprBeamSprite)
write_byte(1) // framestart
write_byte(1) // framerate
write_byte(13) // life in 0.1's
write_byte(5) // width
write_byte(0) // noise
if(get_pcvar_num(g_cvarPluginConfig[CustomLineColor]) == 0)
{
write_byte(0) // red
write_byte(0) // green
write_byte(255) // blue
} else {
write_byte(get_pcvar_num(g_cvarPluginConfig[LineColorR]))
write_byte(get_pcvar_num(g_cvarPluginConfig[LineColorG]))
write_byte(get_pcvar_num(g_cvarPluginConfig[LineColorB]))
}
write_byte(125) // brightness
write_byte(0) // speed
message_end()
}
ArraySetCell(g_aPluginArrays[NextRefresh], iRushNum, get_gametime() + 1.0)
return FMRES_IGNORED
}
public PunishPlayer(id)
{
switch(get_pcvar_num(g_cvarPluginConfig[PunishType]))
{
case 0: user_kill(id); // Kill
case 1: { // Reflect Player
new Float:fVelocity[3];
velocity_by_aim(id, 400, fVelocity);
fVelocity[0] *= -1.0
fVelocity[1] *= -1.0
fVelocity[2] = 0.0
set_pev(id, pev_velocity, fVelocity)
}
case 2: { // Strip weapons
fm_strip_user_weapons(id);
fm_give_item(id, "weapon_knife")
}
default: return;
}
}
public cmdMenu(id, level, cid)
{
if(!cmd_access(id, level, cid, 1))
return PLUGIN_HANDLED
new iMenu = menu_create("Ustaw Strefe", "cmdMenu_Handle")
menu_additem(iMenu, "Stworz")
menu_additem(iMenu, "Zapisz")
menu_additem(iMenu, "Przeladuj")
menu_additem(iMenu, "Usun")
menu_display(id, iMenu)
return PLUGIN_HANDLED
}
public cmdMenu_Handle(id, menu, item)
{
switch(item)
{
case 0: AreaConfigMenu(id)
case 1: SaveMapConfig(false)
case 2: LoadMapConfig()
case 3: {
SaveMapConfig(true)
}
}
return PLUGIN_CONTINUE
}
public AreaConfigMenu(id)
{
new iMenu = menu_create("Rush Menu", "AreaConfigMenu_handle")
menu_additem(iMenu, "Create 1st Point")
menu_additem(iMenu, "Create 2st Point")
menu_additem(iMenu, "Save & Reload")
menu_setprop(iMenu, MPROP_EXITNAME, "Cancel")
menu_display(id, iMenu)
}
public AreaConfigMenu_handle(id, menu, item)
{
if(item == MENU_EXIT)
{
for(new i=0; i<2; i++)
{
g_fTempOrigin[id][0][i] = 0.0
g_fTempOrigin[id][1][i] = 0.0
}
menu_destroy(menu)
return PLUGIN_CONTINUE
}
switch(item)
{
case 0: {
new Float:fStart[3], Float:fEnd[3];
pev(id, pev_origin, fStart);
pev(id, pev_view_ofs, fEnd);
xs_vec_add(fStart, fEnd, fStart);
pev(id, pev_v_angle, fEnd);
angle_vector(fEnd, ANGLEVECTOR_FORWARD, fEnd);
xs_vec_mul_scalar(fEnd, 99999.0, fEnd);
xs_vec_add(fStart, fEnd, fEnd);
new iTr = create_tr2()
engfunc(EngFunc_TraceLine, fStart, fEnd, IGNORE_MONSTERS, id, iTr)
get_tr2(iTr, TR_vecEndPos, fEnd)
free_tr2(iTr)
g_fTempOrigin[id][0] = fEnd
}
case 1: {
new Float:fStart[3], Float:fEnd[3];
pev(id, pev_origin, fStart);
pev(id, pev_view_ofs, fEnd);
xs_vec_add(fStart, fEnd, fStart);
pev(id, pev_v_angle, fEnd);
angle_vector(fEnd, ANGLEVECTOR_FORWARD, fEnd);
xs_vec_mul_scalar(fEnd, 99999.0, fEnd);
xs_vec_add(fStart, fEnd, fEnd);
new iTr = create_tr2()
engfunc(EngFunc_TraceLine, fStart, fEnd, IGNORE_MONSTERS, id, iTr)
get_tr2(iTr, TR_vecEndPos, fEnd)
free_tr2(iTr)
g_fTempOrigin[id][1] = fEnd
}
case 2: {
new Float:fBuffer[6];
for(new i=0; i<5; i++)
fBuffer[i] = g_fTempOrigin[id][i > 2 ? 1 : 0][i > 2 ? i-3 : i]
ArrayPushArray(g_aPluginArrays[LinePoints], fBuffer);
SaveMapConfig(false)
}
}
menu_display(id, menu)
return PLUGIN_CONTINUE
}