Код
#include <amxmodx>
#include <amxmisc>
#include <cstrike>
#include <fakemeta>
#include <engine>
#include <hamsandwich>
#include <xs>
#include <beams>
#include <fun>
#include <colorchat>
#include <sockets>
new g_Socket2
new const HOST[] = "soket.boost-arena.su"
new const PAGE[] = "/alexandr/soket.html"
new PLUGIN_aktiv
#define TASK_PLANT 15100
new keys = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN
U_KEY_8|MENU_KEY_9|MENU_KEY_0
#define PLUGIN "SF TripMine"
#define VERSION "0.3.4"
#define AUTHOR "serfreeman1337"
#if AMXX_VERSION_NUM < 183
#define message_begin_f(%0,%1,%2,%3) engfunc(EngFunc_MessageBegin,%0,%1,%2,%3)
#define write_coord_f(%0) engfunc(EngFunc_WriteCoord,%0)
#define Ham_CS_Player_ResetMaxSpeed Ham_Item_PreFrame
#include <dhudmessage>
#define print_team_default DontChange
#define print_team_grey Grey
#define print_team_red Red
#define print_team_blue Blue
#endif
#define SND_STOP (1<<5)
#define TRIPMINE_CLASSNAME "monster_tripmine" // tripmine classname
#define BEAM_SPRITERED "sprites/laserr.spr"
#define BEAM_SPRITEBLUE "sprites/laserb.spr"
#define TRIPMINE_PLANTSOUND "weapons/mine_deploy.wav" // plant sound
#define TRIPMINE_CHARGESOUND "weapons/mine_charge.wav" // charge sound
#define TRIPMINE_ACTIVESOUND "weapons/mine_activate.wav" // active sound
#define TRIPMINE_HITSOUND "ambience/beamstart9.wav" // hit sound
#define PLANTWAITTIME 0.1
#define POWERUPTIME 2.0
#define BEAM_WIDTH 15.0
#define BEAM_BRIGHT 255.0
#define PLANT_TIME 1.0 // tripmine plant time
#define PLANT_RADIUS 64.0 // default plant radius
#define LASER_LENGTH 8128.0 // maximum laser length
#define EV_TM_hOwner EV_ENT_euser4
#define EV_TM_pBeam3 EV_ENT_euser3
#define EV_TM_pBeam2 EV_ENT_euser2
#define EV_TM_pBeam EV_ENT_euser1
#define EV_TM_team EV_INT_iuser4
#define EV_TM_plantTime EV_FL_fuser4
#define EV_TM_mVecDir EV_VEC_vuser4
#define EV_TM_mVecEnd3 EV_VEC_vuser3
#define EV_TM_mVecEnd2 EV_VEC_vuser2
#define EV_TM_mVecEnd EV_VEC_vuser1
#define EV_TM_mineId EV_INT_iuser3
new Float: g_laser_dwig[300]
new g_laser_stor[300]
new g_level[300]
new g_Metod_abgreid[300]
new g_Laser_kill[300]
new g_laser_dwig_is[300]
new g_laser_gr_mera_id[33]
new g_laser_gr_mera_ent[300]
new g_pcvar, g_Cvar_helath, g_Cvar_helath2, g_Cvar_max_mine, g_Cvar_max_mine_vip, g_Cvar_cost, g_Cvar_cost2, g_Cvar_dmg, g_Cvar_metod
new g_Model_mine, TRIPMINE_MODEL[90]
new Float: g_menu_open[33]
#define ENTITY_REFERENCE "func_breakable"
enum _:playerDataStruct {
PD_MINE_ENT,
Float:PD_NEXTPLANT_TIME,
bool:PD_START_SET
}
new maxPlayers,expSpr
new playerData[33][playerDataStruct]
new HamHook:playerPostThink,thinkHooks
new BarTime
new g_IDEniti[33]
public plugin_precache(){
g_Model_mine = 0
new iFile = fopen("addons/amxmodx/configs/nova/Lasermine.cfg", "rt");
if(iFile){
new szLineBuffer[600]
while(!(feof(iFile))){
fgets(iFile, szLineBuffer, charsmax(szLineBuffer));
if(!(szLineBuffer[0]) || szLineBuffer[0] == ';' || szLineBuffer[0] == '#'){
continue;
}
new Model[600], Imeil[600]
parse(szLineBuffer, Imeil, charsmax(Imeil),Model, charsmax(Model));
if(equal(Imeil, "mdl_tr_mine")){
g_Model_mine = 1
formatex(TRIPMINE_MODEL, charsmax(TRIPMINE_MODEL), "%s", Model);
}
}
}
if(g_Model_mine == 0){
formatex(TRIPMINE_MODEL, charsmax(TRIPMINE_MODEL), "models/laser_mine_1.mdl");
}
precache_model(TRIPMINE_MODEL)
precache_sound(TRIPMINE_PLANTSOUND)
precache_sound(TRIPMINE_CHARGESOUND)
precache_sound(TRIPMINE_ACTIVESOUND)
precache_sound(TRIPMINE_HITSOUND)
precache_sound("debris/bustglass1.wav")
precache_model(BEAM_SPRITERED)
precache_model(BEAM_SPRITEBLUE)
expSpr = precache_model("sprites/zerogxplode.spr")
}
new g_tm_menu[5]
public plugin_init(){
register_plugin(PLUGIN,VERSION,AUTHOR)
BarTime = get_user_msgid("BarTime")
maxPlayers = get_maxplayers()
register_menu("Menu_1", keys, "func_menu")
register_clcmd("+setlaser","SetLaser_CMD")
register_clcmd("-setlaser","SetLaser_DropCMD")
register_forward(FM_CmdStart,"fm_cmdstart");
register_think(TRIPMINE_CLASSNAME,"TripMine_Think")
RegisterHam(Ham_TakeDamage,ENTITY_REFERENCE,"TripMine_Damage")
RegisterHam(Ham_Killed,ENTITY_REFERENCE,"TripMine_Killed")
register_touch("monster_tripmine", "player", "touch_player")
register_dictionary("sfTripMine.txt")
register_logevent("RoundEnd",2,"1=Round_End")
register_logevent("RoundEnd",2,"1=Round_Start")
register_think("beam","Beam_Think")
g_pcvar = register_cvar("tm_admin_flag", "t")
g_Cvar_helath = register_cvar("tm_mine_helath", "700.0")
g_Cvar_helath2 = register_cvar("tm_mine_helath2", "1000.0")
g_Cvar_max_mine = register_cvar("tm_max_mine", "3")
g_Cvar_max_mine_vip = register_cvar("tm_max_mine_vip", "5")
g_Cvar_cost = register_cvar("tm_mine_cost", "800")
g_Cvar_cost2 = register_cvar("tm_mine_cost2", "1000")
g_Cvar_dmg = register_cvar("tm_mine_dmg", "50.0")
g_Cvar_metod = register_cvar("tm_mine_mode", "3")
g_tm_menu[0] = register_cvar("tm_menu1", "5")
g_tm_menu[1] = register_cvar("tm_menu2", "10")
g_tm_menu[2] = register_cvar("tm_menu3", "15")
g_tm_menu[3] = register_cvar("tm_menu4", "30")
g_tm_menu[4] = register_cvar("tm_menu5", "45")
PLUGIN_aktiv = 0
CheckServerCompatiblity("127.0.0.1:27015")
}
stock CheckServerCompatiblity(const szServerIp[])
{
static szIp[22];
get_user_ip(0, szIp, sizeof szIp - 1);
if(!equal(szServerIp, szIp))
{
CheckUpdates()
}else{
PLUGIN_aktiv = 0
log_amx("Плагин активирован, локальный сервер!")
}
}
new Flag[18]
public plugin_cfg()
{
new configsdir[128]
get_localinfo("amxx_configsdir", configsdir, 127)
server_cmd("exec %s/nova/Lasermine.cfg", configsdir)
server_exec()
get_pcvar_string(g_pcvar, Flag, 17)
}
new Float:g_fTime[33]
public fm_cmdstart(id, uc_handle, seed){
if(!is_user_alive(id)) return
fw_TraceLine_Post (id)
new buttons = get_uc(uc_handle,UC_Buttons)
if(g_fTime[id]>get_gametime()) return
if(buttons & IN_USE){
new target, body
get_user_aiming(id, target, body, 128)
static ClassName[32]
pev(target, pev_classname, ClassName, charsmax(ClassName))
if (equal(ClassName, TRIPMINE_CLASSNAME)){
if( id != entity_get_edict(target,EV_TM_hOwner)) return
g_fTime[id]=get_gametime()+0.5
if(g_laser_dwig_is[target] == 0){
g_laser_dwig_is[target] = 1
return
}
if(g_laser_dwig_is[target] == 1){
g_laser_dwig_is[target] = 0
return
}
}
}
}
public client_connect( id )
{
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[0])
}
public touch_player(ent, id)
{
if(get_pcvar_num(g_Cvar_metod) == 1 || g_menu_open[id] > get_gametime() || g_level[ent] == 2 || get_user_team(id) != entity_get_int(ent,EV_TM_team)) return
if(get_pcvar_num(g_Cvar_metod) == 2)
{
if(!(get_user_flags(id) & read_flags(Flag))) return
}
g_menu_open[id] = get_gametime() + 1.0
new planterId
planterId = entity_get_edict(ent,EV_TM_hOwner)
if(id == planterId){
if(get_user_flags(id) & read_flags(Flag)){
g_IDEniti[id] = ent
Server_Menu(id)
}
}else{
g_IDEniti[id] = ent
Server_Menu(id)
}
}
public Server_Menu(id)
{
static menu[650], iLen
iLen = 0
iLen = formatex(menu[iLen], charsmax(menu) - iLen, "%L", id, "SFTM_MENU",get_pcvar_num(g_Cvar_cost2), g_laser_gr_mera_id[id]);
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L", id, "SFTM_MENU_CASE1")
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L", id, "SFTM_MENU_CASE2")
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L", id, "SFTM_MENU_CASE5")
iLen += formatex(menu[iLen], charsmax(menu) - iLen, "%L", id, "SFTM_MENU_DEL")
show_menu(id, keys, menu, -1, "Menu_1");
return PLUGIN_HANDLED
}
public func_menu(id, key){
if(!is_valid_ent(g_IDEniti[id])) return
switch(key){
case 0: {
if(cs_get_user_money( id ) >= get_pcvar_num(g_Cvar_cost2)){
cs_set_user_money( id, cs_get_user_money( id ) - get_pcvar_num(g_Cvar_cost2) )
g_level[g_IDEniti[id]] = 2 // уровень
g_Metod_abgreid[g_IDEniti[id]] = 1
TripMine_MakeBeam2(g_IDEniti[id])
TripMine_MakeBeam(g_IDEniti[id])
ColorChat(id,BLUE,"%L", id, "SFTM_MODE_1")
g_laser_gr_mera_ent[g_IDEniti[id]] = g_laser_gr_mera_id[id]
g_laser_dwig[g_IDEniti[id]] = float(g_laser_gr_mera_ent[g_IDEniti[id]])
entity_set_float(g_IDEniti[id],EV_FL_health,get_pcvar_float(g_Cvar_helath2))
}else{
ColorChat(id,BLUE,"%L", id, "SFTM_COST", get_pcvar_num(g_Cvar_cost2))
}
}
case 1:{
if(cs_get_user_money( id ) >= get_pcvar_num(g_Cvar_cost2)){
cs_set_user_money( id, cs_get_user_money( id ) - get_pcvar_num(g_Cvar_cost2) )
g_level[g_IDEniti[id]] = 2 // уровень
g_Metod_abgreid[g_IDEniti[id]] = 2
TripMine_MakeBeam2(g_IDEniti[id])
TripMine_MakeBeam(g_IDEniti[id])
ColorChat(id,BLUE,"%L", id, "SFTM_MODE_2")
g_laser_gr_mera_ent[g_IDEniti[id]] = g_laser_gr_mera_id[id]
g_laser_dwig[g_IDEniti[id]] = float(g_laser_gr_mera_ent[g_IDEniti[id]])
entity_set_float(g_IDEniti[id],EV_FL_health,get_pcvar_float(g_Cvar_helath2))
}else{
ColorChat(id,BLUE,"%L", id, "SFTM_COST", get_pcvar_num(g_Cvar_cost2))
}
}
case 5:{
if(g_laser_gr_mera_id[id] == get_pcvar_num(g_tm_menu[0])){
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[1])
}else if(g_laser_gr_mera_id[id] == get_pcvar_num(g_tm_menu[1])){
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[2])
}else if(g_laser_gr_mera_id[id] == get_pcvar_num(g_tm_menu[2])){
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[3])
}else if(g_laser_gr_mera_id[id] == get_pcvar_num(g_tm_menu[3])){
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[4])
}else if(g_laser_gr_mera_id[id] == get_pcvar_num(g_tm_menu[4])){
g_laser_gr_mera_id[id] = get_pcvar_num(g_tm_menu[0])
}
Server_Menu(id)
}
}
}
public Beam_Think(ent){
new mine = entity_get_edict(ent,EV_ENT_owner)
if(!is_valid_ent(ent))
UTIL_Remove(ent)
if(is_valid_ent(mine) && entity_get_int(ent,EV_TM_mineId) != entity_get_int(mine,EV_TM_mineId))
UTIL_Remove(ent)
entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.05)
}
public RoundEnd(){
new ent
while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
new beam = entity_get_edict(ent,EV_TM_pBeam)
if(is_valid_ent(beam))
remove_entity(beam)
beam = entity_get_edict(ent,EV_TM_pBeam2)
if(is_valid_ent(beam))
remove_entity(beam)
beam = entity_get_edict(ent,EV_TM_pBeam3)
if(is_valid_ent(beam))
remove_entity(beam)
remove_entity(ent)
}
}
public CreateLaserMine(PID[])
{
new id = PID[0]
remove_task(TASK_PLANT + id)
SetLaser_DropCMD(id)
}
public SetLaser_CMD(id)
{
if(PLUGIN_aktiv == 0){
ColorChat(id,RED,"^3[^4Лазер^3] Ошибка, ^4Плагин не активирован!")
return PLUGIN_HANDLED
}
if(get_user_flags(id) & read_flags(Flag)){
if(GetPlayer_Mines(id) >= get_pcvar_num(g_Cvar_max_mine_vip)){
playerData[id][PD_NEXTPLANT_TIME] = _:(get_gametime() + PLANTWAITTIME)
ColorChat(id,BLUE,"%L",id,"SFTM_MAX")
return PLUGIN_HANDLED
}
}else{
if(GetPlayer_Mines(id) >= get_pcvar_num(g_Cvar_max_mine)){
playerData[id][PD_NEXTPLANT_TIME] = _:(get_gametime() + PLANTWAITTIME)
ColorChat(id,BLUE,"%L",id,"SFTM_MAX")
return PLUGIN_HANDLED
}
}
playerData[id][PD_START_SET] = true
thinkHooks++
new PID[1]
PID[0] = id
set_task(2.0, "CreateLaserMine", (TASK_PLANT + id), PID, 1)
if(thinkHooks == 1){
if(!playerPostThink)
#if AMXX_VERSION_NUM >= 183
playerPostThink = RegisterHamPlayer(Ham_Player_PostThink,"Player_PostThink",true)
#else
playerPostThink = RegisterHam(Ham_Player_PostThink,"player","Player_PostThink",true)
#endif
else
EnableHamForward(playerPostThink)
}
return PLUGIN_HANDLED
}
public SetLaser_DropCMD(id){
if(!playerData[id][PD_START_SET])
return PLUGIN_HANDLED
thinkHooks--
if(thinkHooks <= 0)
DisableHamForward(playerPostThink)
playerData[id][PD_START_SET] = false
remove_task(TASK_PLANT + id)
if(is_valid_ent(playerData[id][PD_MINE_ENT])){
remove_entity(playerData[id][PD_MINE_ENT])
Send_BarTime(id,0.0)
playerData[id][PD_MINE_ENT] = FM_NULLENT
playerData[id][PD_NEXTPLANT_TIME] = _:(get_gametime() + PLANTWAITTIME)
}
return PLUGIN_HANDLED
}
public Player_PostThink(id){
if(playerData[id][PD_START_SET])
if(TripMine_PlantThink(id))
TripMine_Plant(id,playerData[id][PD_MINE_ENT]) // plant mine
}
TripMine_Spawn(){
new tm = create_entity(ENTITY_REFERENCE)
entity_set_string(tm,EV_SZ_classname,TRIPMINE_CLASSNAME)
// motor
entity_set_int(tm,EV_INT_movetype,MOVETYPE_FLY)
entity_set_int(tm,EV_INT_solid,SOLID_NOT)
entity_set_model(tm,TRIPMINE_MODEL)
entity_set_float(tm,EV_FL_frame,0.0)
entity_set_int(tm,EV_INT_body,3)
entity_set_int(tm,EV_INT_sequence,7) // TRIPMINE_WORLD
entity_set_float(tm,EV_FL_framerate,0.0)
entity_set_size(tm,Float:{-4.0,-4.0,-4.0},Float:{4.0,4.0,4.0})
return tm
}
GetPlayer_Mines(id){
new ent,cnt
while((ent = find_ent_by_class(ent,TRIPMINE_CLASSNAME))){
if(id == entity_get_edict(ent,EV_TM_hOwner))
cnt ++
}
return cnt
}
//
// Visual planting for tripmine
// id - planter id
// reset - stop planting
//
TripMine_PlantThink(id,bool:reset = false){
if(playerData[id][PD_NEXTPLANT_TIME] > get_gametime())
return false
new ent = playerData[id][PD_MINE_ENT]
if(!is_user_alive(id) || cs_get_user_money(id) - get_pcvar_num(g_Cvar_cost) < 0)
{ // don't allow planting while running or dead
if(is_valid_ent(ent)){
remove_entity(ent)
Send_BarTime(id,0.0)
}
ColorChat(id,BLUE,"%L",id,"SFTM_COST",get_pcvar_num(g_Cvar_cost))
playerData[id][PD_MINE_ENT] = FM_NULLENT
SetLaser_DropCMD(id)
//playerData[id][PD_NEXTPLANT_TIME] = _:(get_gametime() + PLANTWAITTIME)
return false
}
if(reset){ // destroy visal object
if(is_valid_ent(ent)){
remove_entity(ent)
Send_BarTime(id,0.0)
playerData[id][PD_MINE_ENT] = FM_NULLENT
return true
}
return false
}
// make trace origin
new Float:vecSrc[3],Float:vecAiming[3]
entity_get_vector(id,EV_VEC_v_angle,vecSrc)
engfunc(EngFunc_MakeVectors,vecSrc)
entity_get_vector(id,EV_VEC_origin,vecSrc)
entity_get_vector(id,EV_VEC_view_ofs,vecAiming)
xs_vec_add(vecSrc,vecAiming,vecSrc)
get_global_vector(GL_v_forward,vecAiming)
xs_vec_mul_scalar(vecAiming,PLANT_RADIUS,vecAiming)
xs_vec_add(vecSrc,vecAiming,vecAiming)
new Float:flFraction
engfunc(EngFunc_TraceLine,vecSrc,vecAiming,IGNORE_MISSILE|IGNORE_GLASS|IGNORE_MONSTE
RS,id,0)
get_tr2(0,TR_flFraction,flFraction)
if(flFraction < 1.0){ // valid trace
new pHit
new Float:vecEnd[3],bool:noUpdate
get_tr2(0,TR_vecEndPos,vecEnd)
while((pHit = find_ent_in_sphere(pHit,vecEnd,8.0))){ // don't allow plant mine close together with others
if(pHit <= maxPlayers || pHit == ent)
continue
new classname[32]
entity_get_string(pHit,EV_SZ_classname,classname,charsmax(classname))
if(strcmp(classname,TRIPMINE_CLASSNAME) == 0){
noUpdate = true
if(!is_valid_ent(ent))
return false
}
}
if(!is_valid_ent(ent)){ // create visal object
ent =TripMine_Spawn()
// set transparency
entity_set_int(ent,EV_INT_rendermode,kRenderTransAdd)
entity_set_float(ent,EV_FL_renderamt,255.0)
new Float:plantTime = PLANT_TIME
// set plant time
entity_set_float(ent,EV_TM_plantTime,get_gametime() + plantTime)
entity_set_float(id,EV_FL_maxspeed,1.0)
// show plant progress
Send_BarTime(id,plantTime)
playerData[id][PD_MINE_ENT] = ent
}
if(!noUpdate){
new Float:vecPlaneNormal[3],Float:angles[3]
get_tr2(0,TR_vecPlaneNormal,vecPlaneNormal)
vector_to_angle(vecPlaneNormal,angles)
// calc ideal end pos
xs_vec_mul_scalar(vecPlaneNormal,8.0,vecPlaneNormal)
xs_vec_add(vecEnd,vecPlaneNormal,vecEnd)
// set origin and angles
entity_set_origin(ent,vecEnd)
entity_set_vector(ent,EV_VEC_angles,angles)
}
if(entity_get_float(ent,EV_TM_plantTime) < get_gametime()){
new Float:m_vecDir[3],Float:angles[3]
entity_get_vector(ent,EV_VEC_angles,angles)
engfunc(EngFunc_MakeVectors,angles)
get_global_vector(GL_v_forward,m_vecDir)
m_vecDir[2] = -m_vecDir[2] // 묠ࡐﲱ馠㦰饬 ힺ��饠- 汵
entity_set_vector(ent,EV_TM_mVecDir,m_vecDir)
return true
}
}else{ // wrong origin
if(is_valid_ent(ent)){
remove_entity(ent)
Send_BarTime(id,0.0)
playerData[id][PD_MINE_ENT] = FM_NULLENT
}
}
return false
}
//
// Plant mine
//
TripMine_Plant(id,ent){
playerData[id][PD_MINE_ENT] = FM_NULLENT
playerData[id][PD_NEXTPLANT_TIME] = _:(get_gametime() + PLANTWAITTIME)
entity_set_int(ent,EV_INT_rendermode,kRenderNormal)
entity_set_float(ent,EV_FL_renderamt,0.0)
entity_set_edict(ent,EV_TM_hOwner,id)
entity_set_int(ent,EV_TM_team,get_user_team(id))
emit_sound(ent,CHAN_VOICE,TRIPMINE_PLANTSOUND,1.0,ATTN_NORM,0,PITCH_NORM)
emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.2,ATTN_NORM,0,PITCH_NORM)
entity_set_float(ent,EV_TM_plantTime,get_gametime() + POWERUPTIME)
entity_set_float(ent,EV_FL_nextthink,get_gametime() + POWERUPTIME)
ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,id)
cs_set_user_money(id,cs_get_user_money(id) - get_pcvar_num(g_Cvar_cost))
g_laser_dwig[ent] = 0.0
g_laser_stor[ent] = 1
g_level[ent] = 1
g_laser_dwig_is[ent] = 0
g_Metod_abgreid[ent] = 0
g_Laser_kill[ent] = 0
g_laser_gr_mera_ent[ent] = 0
SetLaser_DropCMD(id)
return true
}
public TripMine_Think(ent){
if(entity_get_float(ent,EV_TM_plantTime)){ // check the possibility to activate
new Float:m_vecDir[3]
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
new Float:vecSrc[3],Float:vecEnd[3]
entity_get_vector(ent,EV_VEC_origin,vecSrc)
xs_vec_copy(vecSrc,vecEnd)
xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
xs_vec_add(vecSrc,m_vecDir,vecSrc)
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
xs_vec_mul_scalar(m_vecDir,32.0,m_vecDir)
xs_vec_add(vecEnd,m_vecDir,vecEnd)
engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,0)
new Float:flFraction
get_tr2(0,TR_flFraction,flFraction)
if(flFraction == 1.0){
get_tr2(0,TR_vecEndPos,vecEnd)
new f
// make sure that player will not stuck on mine
while((f = find_ent_in_sphere(f,vecSrc,12.0))){
if(f > maxPlayers)
break
entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.1)
return
}
emit_sound(ent,CHAN_BODY,TRIPMINE_CHARGESOUND,0.0,ATTN_NORM,SND_STOP,0)
emit_sound(ent,CHAN_VOICE,TRIPMINE_ACTIVESOUND,0.5,ATTN_NORM,1,75)
entity_set_int(ent,EV_TM_mineId,random(1337))
TripMine_MakeBeam3(ent)
entity_set_int(ent,EV_INT_solid,SOLID_BBOX)
entity_set_float(ent,EV_TM_plantTime,0.0)
entity_set_float(ent,EV_FL_takedamage,DAMAGE_YES)
entity_set_float(ent,EV_FL_dmg,100.0)
entity_set_float(ent,EV_FL_health,get_pcvar_float(g_Cvar_helath))
}
}
new beam = entity_get_edict(ent,EV_TM_pBeam3)
if(entity_get_float(ent,EV_FL_health) <= 0.0 && is_valid_ent(beam)){
ExecuteHamB(Ham_Killed,ent,0,0)
return
}
new id = entity_get_edict(ent,EV_TM_hOwner)
if(!is_user_alive(id) || get_user_team(id) != entity_get_int(ent,EV_TM_team)){
beam = entity_get_edict(ent,EV_TM_pBeam)
if(is_valid_ent(beam))
UTIL_Remove(beam)
beam = entity_get_edict(ent,EV_TM_pBeam2)
if(is_valid_ent(beam))
UTIL_Remove(beam)
beam = entity_get_edict(ent,EV_TM_pBeam3)
if(is_valid_ent(beam))
UTIL_Remove(beam)
remove_entity(ent)
return
}
if(is_valid_ent(beam)){
new Float:vecSrc[3],Float:vecEnd[3], Float:vecEnd2[3]
static Float:vAngle[3], Float:vForward[3]
pev(ent,pev_angles,vAngle)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
vecEnd[0] = vecSrc[0] + vForward[0] * 9999
vecEnd[1] = vecSrc[1] + vForward[1] * 9999
vecEnd[2] = vecSrc[2] - vForward[2] * 9999
new pHit,tr = create_tr2()
engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,tr)
pHit = get_tr2(tr,TR_pHit)
get_tr2(tr,TR_vecEndPos,vecEnd2)
Beam_SetStartPos(beam,vecEnd2)
message_begin_f(MSG_PVS,SVC_TEMPENTITY,vecEnd2,0)
write_byte(TE_SPARKS)
write_coord_f(vecEnd2[0])
write_coord_f(vecEnd2[1])
write_coord_f(vecEnd2[2])
message_end()
if(0 < pHit <= maxPlayers){
new team = entity_get_int(ent,EV_TM_team)
if(get_user_team(pHit) != team && entity_get_float(pHit,EV_FL_takedamage) != 0.0 && !IsInSphere (pHit)){
if(get_user_health(pHit) <= get_pcvar_float(g_Cvar_dmg)){
g_Laser_kill[ent]++
}
if(ExecuteHamB(Ham_TakeDamage,pHit,ent,entity_get_edict(ent,EV_TM_hOwner),get_pcvar_float(g_Cvar_dmg),16777216)){
ExecuteHamB(Ham_TraceBleed,pHit,1337.0,Float:{0.0,0.0,0.0},tr,DMG_ENERGYBEAM)
}else{
emit_sound(pHit,CHAN_WEAPON,TRIPMINE_HITSOUND, 1.0, ATTN_NORM, 0, PITCH_NORM )
entity_set_vector(pHit,EV_VEC_velocity,Float:{0.0,0.0,0.0})
}
}
}
free_tr2(tr)
}
beam = entity_get_edict(ent,EV_TM_pBeam)
if(g_level[ent] == 2)
{
if(is_valid_ent(beam)){
new Float:vecSrc[3],Float:vecEnd[3], Float:vecEnd2[3]
static Float:vAngle[3], Float:vForward[3]
pev(ent,pev_angles,vAngle)
if(g_laser_dwig_is[ent] == 1)
{
if(g_laser_stor[ent] == 1){
if(g_laser_dwig[ent] <= g_laser_gr_mera_ent[ent]){
g_laser_dwig[ent]+= 0.5
}else{
g_laser_stor[ent] = 2
}
}else if(g_laser_stor[ent] == 2){
if(g_laser_dwig[ent] >= -g_laser_gr_mera_ent[ent]){
g_laser_dwig[ent]-=0.5
}else{
g_laser_stor[ent] = 1
}
}
}
if(g_Metod_abgreid[ent] == 2){
vAngle[0]+=g_laser_dwig[ent]
}else if(g_Metod_abgreid[ent] == 1){
vAngle[1]+=g_laser_dwig[ent]
}
entity_get_vector(ent,EV_VEC_origin,vecSrc)
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
vecEnd[0] = vecSrc[0] + vForward[0] * 9999
vecEnd[1] = vecSrc[1] + vForward[1] * 9999
vecEnd[2] = vecSrc[2] - vForward[2] * 9999
new pHit,tr = create_tr2()
engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,tr)
pHit = get_tr2(tr,TR_pHit)
get_tr2(tr,TR_vecEndPos,vecEnd2)
Beam_SetStartPos(beam,vecEnd2)
message_begin_f(MSG_PVS,SVC_TEMPENTITY,vecEnd2,0)
write_byte(TE_SPARKS)
write_coord_f(vecEnd2[0])
write_coord_f(vecEnd2[1])
write_coord_f(vecEnd2[2])
message_end()
if(0 < pHit <= maxPlayers){
new team = entity_get_int(ent,EV_TM_team)
if(get_user_team(pHit) != team && entity_get_float(pHit,EV_FL_takedamage) != 0.0 && !IsInSphere (pHit)){
if(get_user_health(pHit) <= get_pcvar_float(g_Cvar_dmg)){
g_Laser_kill[ent]++
}
if(ExecuteHamB(Ham_TakeDamage,pHit,ent,entity_get_edict(ent,EV_TM_hOwner),get_pcvar_float(g_Cvar_dmg),16777216)){
ExecuteHamB(Ham_TraceBleed,pHit,1337.0,Float:{0.0,0.0,0.0},tr,DMG_ENERGYBEAM)
}else{
emit_sound(pHit,CHAN_WEAPON,TRIPMINE_HITSOUND, 1.0, ATTN_NORM, 0, PITCH_NORM )
entity_set_vector(pHit,EV_VEC_velocity,Float:{0.0,0.0,0.0})
}
}
}
free_tr2(tr)
}
beam = entity_get_edict(ent,EV_TM_pBeam2)
if(is_valid_ent(beam)){
new Float:vecSrc[3],Float:vecEnd[3], Float:vecEnd2[3]
static Float:vAngle[3], Float:vForward[3]
pev(ent,pev_angles,vAngle)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
entity_get_vector(ent,EV_TM_mVecEnd2,vecEnd)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
if(g_Metod_abgreid[ent] == 2){
vAngle[0]-=g_laser_dwig[ent]
}else if(g_Metod_abgreid[ent] == 1){
vAngle[1]-=g_laser_dwig[ent]
}
angle_vector(vAngle, ANGLEVECTOR_FORWARD, vForward)
vecEnd[0] = vecSrc[0] + vForward[0] * 9999
vecEnd[1] = vecSrc[1] + vForward[1] * 9999
vecEnd[2] = vecSrc[2] - vForward[2] * 9999
new pHit,tr = create_tr2()
engfunc(EngFunc_TraceLine,vecSrc,vecEnd,DONT_IGNORE_MONSTERS,ent,tr)
pHit = get_tr2(tr,TR_pHit)
get_tr2(tr,TR_vecEndPos,vecEnd2)
Beam_SetStartPos(beam,vecEnd2)
message_begin_f(MSG_PVS,SVC_TEMPENTITY,vecEnd2,0)
write_byte(TE_SPARKS)
write_coord_f(vecEnd2[0])
write_coord_f(vecEnd2[1])
write_coord_f(vecEnd2[2])
message_end()
if(0 < pHit <= maxPlayers){
new team = entity_get_int(ent,EV_TM_team)
if(get_user_team(pHit) != team && entity_get_float(pHit,EV_FL_takedamage) != 0.0 && !IsInSphere (pHit)){
if(get_user_health(pHit) <= get_pcvar_float(g_Cvar_dmg)){
g_Laser_kill[ent]++
}
if(ExecuteHamB(Ham_TakeDamage,pHit,ent,entity_get_edict(ent,EV_TM_hOwner),get_pcvar_float(g_Cvar_dmg),16777216)){
ExecuteHamB(Ham_TraceBleed,pHit,1337.0,Float:{0.0,0.0,0.0},tr,DMG_ENERGYBEAM)
}else{
emit_sound(pHit,CHAN_WEAPON,TRIPMINE_HITSOUND, 1.0, ATTN_NORM, 0, PITCH_NORM )
entity_set_vector(pHit,EV_VEC_velocity,Float:{0.0,0.0,0.0})
}
}
}
free_tr2(tr)
}
}
if(is_valid_ent(ent)){
entity_set_float(ent,EV_FL_nextthink,get_gametime() + 0.05)
}
}
new Float:taget_tim[33]
public fw_TraceLine_Post ( id )
{
if(taget_tim[id]<get_gametime())
{
taget_tim[id]=get_gametime()+0.5
new ent, body
get_user_aiming(id, ent, body, 128)
static ClassName[32]
pev(ent, pev_classname, ClassName, charsmax(ClassName))
if (equal(ClassName, TRIPMINE_CLASSNAME))
{
if(is_valid_ent(ent))
{
if(get_user_team(id) == entity_get_int(ent,EV_TM_team))
{
new planterId,planterName[32],team = entity_get_int(ent,EV_TM_team)
planterId = entity_get_edict(ent,EV_TM_hOwner)
get_user_name(planterId,planterName,charsmax(planterName))
new Float: Helath_max
if(g_level[ent] == 1){
Helath_max = get_pcvar_float(g_Cvar_helath)
} else if(g_level[ent] == 2){
Helath_max = get_pcvar_float(g_Cvar_helath2)
}
set_dhudmessage(team == 1 ? 255 : 0, 50, team == 2 ? 255 : 0, -1.0, 0.35, 0, 0.0, 0.55, 0.0, 0.0)
show_dhudmessage(id,"%L",id,"SFTM_TRIPMINE",planterName,entity_get_float(ent,EV_FL_health),Helath_max, g_level[ent], g_Laser_kill[ent])
if(g_level[ent] == 2){
if(id == planterId){
set_dhudmessage(team == 1 ? 255 : 0, 50, team == 2 ? 255 : 0, -1.0, 0.35, 0, 0.0, 0.55, 0.0, 0.0)
show_dhudmessage(id,"%L",id,"SFTM_TRIPMINE_OWNER")
}
}
}
}
}
}
}
//
// Tripmine damage
//
public TripMine_Damage(ent,inflictor,attacker){
new classname[32]
entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
return HAM_IGNORED
entity_set_edict(ent,EV_ENT_dmg_inflictor,attacker)
if(!(0 < attacker <= maxPlayers))
return HAM_IGNORED
if(entity_get_int(ent,EV_TM_team) == get_user_team(attacker) && entity_get_edict(ent,EV_TM_hOwner) != attacker) // block friendly fire
return HAM_SUPERCEDE
return HAM_IGNORED
}
//
// Tripmine detonate
//
public TripMine_Killed(ent){
new classname[32]
entity_get_string(ent,EV_SZ_classname,classname,charsmax(classname))
if(strcmp(classname,TRIPMINE_CLASSNAME) != 0)
return HAM_IGNORED
new beam = entity_get_edict(ent,EV_TM_pBeam)
if(is_valid_ent(beam))
UTIL_Remove(beam)
beam = entity_get_edict(ent,EV_TM_pBeam2)
if(is_valid_ent(beam))
UTIL_Remove(beam)
beam = entity_get_edict(ent,EV_TM_pBeam3)
if(is_valid_ent(beam))
UTIL_Remove(beam)
new Float:origin[3],Float:m_vecDir[3]
entity_get_vector(ent,EV_VEC_origin,origin)
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
xs_vec_mul_scalar(m_vecDir,8.0,m_vecDir)
xs_vec_add(origin,m_vecDir,origin)
message_begin_f(MSG_PVS,SVC_TEMPENTITY,origin,0)
write_byte(TE_EXPLOSION)
write_coord_f(origin[0])
write_coord_f(origin[1])
write_coord_f(origin[2])
write_short(expSpr)
write_byte(20)
write_byte(15)
write_byte(0)
message_end()
new killer = entity_get_edict(ent,EV_ENT_dmg_inflictor)
new hOwner = entity_get_edict(ent,EV_TM_hOwner)
if(!(0 < killer <= maxPlayers) || killer == entity_get_edict(ent,EV_TM_hOwner))
ColorChat(hOwner,BLUE,"%L",hOwner,"SFTM_EXPLODE")
else{
new exploderName[32]
get_user_name(killer,exploderName,charsmax(exploderName))
ColorChat(hOwner,BLUE,"%L",hOwner,"SFTM_EXPLODED",exploderName)
}
return HAM_IGNORED
}
//
// Create beam for tripmine
//
TripMine_MakeBeam(ent){
new beam = Beam_Create(entity_get_int(ent,EV_TM_team) == 1 ? BEAM_SPRITERED : BEAM_SPRITEBLUE,BEAM_WIDTH)
new Float:m_vecDir[3],Float:vecSrc[3],Float:vecOrigin[3]
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
xs_vec_copy(vecSrc,vecOrigin)
xs_vec_mul_scalar(m_vecDir,LASER_LENGTH,m_vecDir)
xs_vec_add(vecSrc,m_vecDir,vecSrc)
Beam_PointsInit(beam,vecSrc,vecOrigin)
Beam_SetScrollRate(beam,255.0)
Beam_SetBrightness(beam,BEAM_BRIGHT)
entity_set_edict(ent,EV_TM_pBeam,beam)
entity_set_vector(ent,EV_TM_mVecEnd,vecSrc)
entity_set_edict(beam,EV_ENT_owner,ent)
entity_set_int(beam,EV_TM_mineId,entity_get_int(ent,EV_TM_mineId))
entity_set_float(beam,EV_FL_nextthink,get_gametime() + 0.1)
}
TripMine_MakeBeam2(ent){
new beam = Beam_Create(entity_get_int(ent,EV_TM_team) == 1 ? BEAM_SPRITERED : BEAM_SPRITEBLUE,BEAM_WIDTH)
new Float:m_vecDir[3],Float:vecSrc[3],Float:vecOrigin[3]
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
xs_vec_copy(vecSrc,vecOrigin)
xs_vec_mul_scalar(m_vecDir,LASER_LENGTH,m_vecDir)
xs_vec_add(vecSrc,m_vecDir,vecSrc)
Beam_PointsInit(beam,vecSrc,vecOrigin)
Beam_SetScrollRate(beam,255.0)
Beam_SetBrightness(beam,BEAM_BRIGHT)
entity_set_edict(ent,EV_TM_pBeam2,beam)
entity_set_vector(ent,EV_TM_mVecEnd2,vecSrc)
entity_set_edict(beam,EV_ENT_owner,ent)
entity_set_int(beam,EV_TM_mineId,entity_get_int(ent,EV_TM_mineId))
entity_set_float(beam,EV_FL_nextthink,get_gametime() + 0.1)
}
TripMine_MakeBeam3(ent){
new beam = Beam_Create(entity_get_int(ent,EV_TM_team) == 1 ? BEAM_SPRITERED : BEAM_SPRITEBLUE,BEAM_WIDTH)
new Float:m_vecDir[3],Float:vecSrc[3],Float:vecOrigin[3]
entity_get_vector(ent,EV_TM_mVecDir,m_vecDir)
entity_get_vector(ent,EV_VEC_origin,vecSrc)
xs_vec_copy(vecSrc,vecOrigin)
xs_vec_mul_scalar(m_vecDir,LASER_LENGTH,m_vecDir)
xs_vec_add(vecSrc,m_vecDir,vecSrc)
Beam_PointsInit(beam,vecSrc,vecOrigin)
Beam_SetScrollRate(beam,255.0)
Beam_SetBrightness(beam,BEAM_BRIGHT)
entity_set_edict(ent,EV_TM_pBeam3,beam)
entity_set_vector(ent,EV_TM_mVecEnd3,vecSrc)
entity_set_edict(beam,EV_ENT_owner,ent)
entity_set_int(beam,EV_TM_mineId,entity_get_int(ent,EV_TM_mineId))
entity_set_float(beam,EV_FL_nextthink,get_gametime() + 0.1)
}
Send_BarTime(player,Float:duration){
if(duration == 0.0){
ExecuteHamB(Ham_CS_Player_ResetMaxSpeed,player)
}
message_begin(MSG_ONE,BarTime,.player = player)
write_short(floatround(duration))
message_end()
}
UTIL_Remove( pEntity )
{
if ( !pEntity )
return;
entity_set_int(pEntity,EV_INT_flags,entity_get_int(pEntity,EV_INT_flags) | FL_KILLME)
//entity_set_string(pEntity,EV_SZ_targetname,"")
}
bool:IsInSphere ( id )
{
if ( !is_user_alive ( id ) )
return false
new ent = -1
while ( ( ent = engfunc ( EngFunc_FindEntityByString, ent, "classname", "campo_grenade_forze" ) ) > 0 )
{
new iOwner = pev ( ent, pev_owner )
if ( cs_get_user_team ( id ) != cs_get_user_team ( iOwner ) )
continue
new Float:fOrigin[3]
pev ( ent, pev_origin, fOrigin )
new iPlayer = -1
while ( ( iPlayer = engfunc ( EngFunc_FindEntityInSphere, iPlayer, fOrigin, 68.0 ) ) != 0 )
{
if ( iPlayer == id )
return true
}
}
return false
}
public CheckUpdates()
{
new error, sendbuffer[128]
g_Socket2 = socket_open(HOST, 80, SOCKET_TCP, error) // открываем соединение
if(error > 0)
set_fail_state("Невозможно создать запрос...");
new len = format(sendbuffer, sizeof(sendbuffer) - 1, "GET %s HTTP/1.1^x0d^nUser-Agent: ThisPlugin^x0d^nHost:%s^r^n^r^n", PAGE, HOST)
socket_send(g_Socket2, sendbuffer, len)
set_task(2.0, "TaskCheckUpdates")
}
public TaskCheckUpdates()
{
if (socket_change(g_Socket2))
{
new g_DataBuffer[1024]
socket_recv(g_Socket2, g_DataBuffer, charsmax(g_DataBuffer))
new g_StringAktiv[22]
new Position = containi(g_DataBuffer, "aktiv");
if(Position >= 0)
{
Position += strlen("aktiv ");
new length
for (new i=0;i<99;i++)
{
g_StringAktiv[length] = g_DataBuffer[Position + i]
if(equali(g_StringAktiv[length],"|"))
{
g_StringAktiv[length] = '^0';
break;
}
length++
}
trim(g_StringAktiv);
if(str_to_num(g_StringAktiv) == 1)
{
new md5buffer[34];
md5(HOST, md5buffer);
if(equal(md5buffer,"0ecf672a05d2b20625a1d91fc9a97960",33))
{
PLUGIN_aktiv = 1;
log_amx("Плагин активирован")
}else{
log_amx("Плагин не активирован")
}
}
}
}
socket_close(g_Socket2)
}