#include #include #include #include #include #define BACKPACK_TOUCH_SND "items/guncock1.wav" #define CTF_MODEL "models/ctf.mdl" #define CTF_BACKPACK_MODEL "models/backpack.mdl" #define CTF_BASE "item_ctf_base" #define CTF_FLAG "item_ctf_flag" #define CTF_BACKPACK "item_ctf_backpack" #define CTF_RED_SPAWN "info_ctf_red_spawn" #define CTF_BLUE_SPAWN "info_ctf_blue_spawn" new cv_flag_return_time,cv_respawn_time,cv_backpack_respawn_time new g_flag_carrier[33] new g_respawn_timer[33] new g_flago_status[3] enum _:FLAG_STATUS{ FLAG_ON_BASE, FLAG_CARRIED, FLAG_DROPPED } new g_statusicon,bool:blink_stat[3] public plugin_precache(){ precache_model(CTF_MODEL) precache_model(CTF_BACKPACK_MODEL) precache_sound(BACKPACK_TOUCH_SND) } public plugin_init(){ register_plugin("Half-Life Capture The Flag","Development","[LF] | Dr.Freeman") cv_flag_return_time = register_cvar("hlctf_flag_returntime","12.0") cv_respawn_time = register_cvar("hlctf_respaw_time","3") cv_backpack_respawn_time = register_cvar("hlctf_backpack_respawn_time","10.0") g_statusicon = engfunc(EngFunc_RegUserMsg,"StatusIcon",-1) // Cool thing, thanks KORD RegisterHam(Ham_Spawn,"player","fw_PlayerSpawn",1) RegisterHam(Ham_Killed,"player","fw_PlayerKilled",1) register_clcmd("test","test") register_touch(CTF_FLAG,"player","fw_FlagTouch") register_touch(CTF_BASE,"player","fw_BaseTouch") register_touch(CTF_BACKPACK,"player","fw_BackPackTouch") register_think(CTF_FLAG,"fw_FlagThink") register_think(CTF_BACKPACK,"fw_BackPackThink") register_clcmd("spectate","fw_SpectateFwd") set_task(1.0,"fw_IconDraw",.flags="b") } public test(id){ new origin[3],Float:angle[3] get_user_origin(id,origin,3) server_print("--> %d %d %d",origin[0],origin[1],origin[2]) pev(id,pev_angles,angle) server_print("--> %.0f %.0f %.0f",angle[0],angle[1],angle[2]) } public plugin_cfg(){ new path[256] get_localinfo("amxx_configsdir",path,255) formatex(path,255,"%s/ctf/",path) if(!dir_exists(path)) mkdir(path) new map[96] get_mapname(map,31) formatex(path,255,"%s%s.ini",path,map) new file = fopen(path,"rt") new classname[32],sorig[20],steam[20],sangle[20] new Float:origin[3],Float:angle[3] if(file){ while(!feof(file)){ fgets(file,map,95) trim(map) if (map[0]&&!equali(map,";",1)){ parse(map,classname,31,sorig,19,sangle,19,steam,19) ParseVec(sorig,19,origin) ParseVec(sangle,19,angle) new ent = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) if(equal(classname,CTF_BASE)){ engfunc(EngFunc_SetModel,ent,CTF_MODEL) set_pev(ent,pev_sequence,2) set_pev(ent,pev_iuser1,get_lolmanlazor(steam)) set_pev(ent,pev_movetype,MOVETYPE_TOSS) new flag = engfunc(EngFunc_CreateNamedEntity,engfunc(EngFunc_AllocString,"info_target")) set_pev(flag,pev_classname,CTF_FLAG) engfunc(EngFunc_SetModel,flag,CTF_MODEL) set_pev(flag,pev_body,get_lolmanlazor(steam)==1?2:1) set_pev(flag,pev_iuser1,get_lolmanlazor(steam)) set_pev(flag,pev_iuser2,ent) set_pev(flag,pev_sequence,1) engfunc(EngFunc_SetOrigin,flag,origin) set_pev(flag,pev_movetype,MOVETYPE_TOSS) // да ладно? без movetype не работает touch форвард set_pev(flag,pev_angles,angle) set_pev(flag,pev_solid,SOLID_TRIGGER) }else if(equal(classname,CTF_BACKPACK)){ engfunc(EngFunc_SetModel,ent,CTF_BACKPACK_MODEL) set_pev(ent,pev_movetype,MOVETYPE_FLY) } set_pev(ent,pev_classname,classname) set_pev(ent,pev_iuser1,get_lolmanlazor(steam)) engfunc(EngFunc_SetOrigin,ent,origin) set_pev(ent,pev_angles,angle) set_pev(ent,pev_solid,SOLID_TRIGGER) } } fclose(file) } } public fw_PlayerSpawn(id){ new spawnent = get_spawn_ent(get_user_team(id)) if(!spawnent) return HAM_IGNORED new Float:origin[3],Float:angle[3] pev(spawnent,pev_origin,origin) engfunc(EngFunc_SetOrigin,id,origin) pev(spawnent,pev_angles,angle) set_pev(id,pev_angles,angle) return HAM_IGNORED } public fw_PlayerKilled(id){ if(g_flag_carrier[id]){ set_pev(g_flag_carrier[id],pev_movetype,MOVETYPE_TOSS) set_pev(g_flag_carrier[id],pev_aiment,0) set_pev(g_flag_carrier[id],pev_solid,SOLID_TRIGGER) set_pev(g_flag_carrier[id],pev_iuser3,FLAG_DROPPED) g_flago_status[pev(g_flag_carrier[id],pev_iuser1)] = FLAG_DROPPED new Float:vel[3] velocity_by_aim(id,100+fm_get_speed(id),vel) set_pev(g_flag_carrier[id],pev_velocity,vel) set_task(get_pcvar_float(cv_flag_return_time),"fw_AutoReturn",g_flag_carrier[id]) g_flag_carrier[id] = 0 } if(!get_pcvar_num(cv_respawn_time)) return g_respawn_timer[id] = get_pcvar_num(cv_respawn_time) hl_set_user_spectator(id) set_task(0.0,"fw_Respawner",id) } public fw_SpectateFwd(id) return PLUGIN_HANDLED public fw_Respawner(id){ if(!g_respawn_timer[id]){ hl_set_user_spectator(id,false) return } set_hudmessage(0, 255, 0, -1.0, 0.6, 2, 0.5, 1.0, 0.0, 1.0, 1) show_hudmessage(id,"%d seconds till respawn",g_respawn_timer[id]) g_respawn_timer[id]-- set_task(1.0,"fw_Respawner",id) } public fw_FlagTouch(flag,id){ if(get_user_team(id)==pev(flag,pev_iuser1)&&!pev(flag,pev_iuser3)){ return PLUGIN_HANDLED } else if(get_user_team(id)==pev(flag,pev_iuser1)&&pev(flag,pev_iuser3)==FLAG_DROPPED){ fw_ReturnFlag(id,flag) return PLUGIN_HANDLED } fw_GetFlag(id,flag) return PLUGIN_CONTINUE } public fw_BaseTouch(base,id){ if(get_user_team(id)==pev(base,pev_iuser1)&&g_flag_carrier[id]&&!pev(base,pev_iuser2)){ fw_ReturnFlag(-1,g_flag_carrier[id]) new name[32],tid get_user_name(id,name,31) tid = get_user_team(id) for(new i=1;i!=get_playersnum();++i){ if(i==id){ set_hudmessage(255,255,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"You captured the ENEMY flag!") client_cmd(i,"speak ^"deeoo you(e80) captured(e90) the(s15 e80) (e100) enemy flag^"") continue } if(get_user_team(i)==tid){ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"%s captured the ENEMY flag!",name) client_cmd(i,"speak ^"deeoo Your(e90) team(e80) captured(e90) the(s15 e80) flag^"") }else{ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"%s captured the YOUR flag!",name) client_cmd(i,"speak ^"deeoo the enemy team captured(e90) the(s15 e80) flag^"") } } g_flag_carrier[id] = 0 }else if(pev(base,pev_iuser2)&&get_user_team(id)==pev(base,pev_iuser1)&&g_flag_carrier[id]){ set_hudmessage(255,255,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(id,"Your flag is MISSING!^n^nHide until it is returned!") } } public fw_AutoReturn(ent){ if(pev(ent,pev_iuser3)==FLAG_DROPPED) fw_ReturnFlag(0,ent) } public fw_GetFlag(grabber,flag){ if(g_flag_carrier[grabber]) return set_pev(flag,pev_sequence,0) set_pev(flag,pev_movetype,MOVETYPE_FOLLOW) set_pev(flag,pev_aiment,grabber) set_pev(flag,pev_solid,SOLID_NOT) set_pev(flag,pev_iuser3,FLAG_CARRIED) set_pev(flag,pev_nextthink,get_gametime()+0.2) set_pev(pev(flag,pev_iuser2),pev_iuser2,1) g_flago_status[pev(flag,pev_iuser1)] = FLAG_CARRIED g_flag_carrier[grabber] = flag new name[32] get_user_name(grabber,name,31) new tid = get_user_team(grabber) for(new i=1;i!=get_playersnum();++i){ if(i==grabber){ set_task(0.1,"carrier_hud",grabber) client_cmd(i,"speak ^"buzwarn you(e80) have(e90) the(s15 e80) enemy flag^"") continue } if(get_user_team(i)==tid){ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"%s GOT the ENEMY flag!",name) client_cmd(i,"speak ^"buzwarn Your team has the(s15 e80) enemy flag^"") }else{ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"%s has TAKEN your flag!",name) client_cmd(i,"speak ^"buzwarn The enemy has(s5) your flag^"") } } fw_IconBlink(pev(flag,pev_iuser1)) remove_task(flag) } public carrier_hud(id){ if(!g_flag_carrier[id]) return set_hudmessage(255, 255, 0, -1.0, 0.2, 2, 0.1, 0.5, 0.01, 2.0, 2) show_hudmessage(id,"You've got the enemy flag!") set_task(0.1,"carrier_hud",id) } public fw_ReturnFlag(returner,flag){ new base = pev(flag,pev_iuser2) set_pev(flag,pev_movetype,MOVETYPE_TOSS) set_pev(flag,pev_aiment,0) set_pev(flag,pev_solid,SOLID_TRIGGER) set_pev(flag,pev_sequence,1) new Float:origin[3] pev(base,pev_origin,origin) engfunc(EngFunc_SetOrigin,flag,origin) pev(base,pev_angles,origin) set_pev(base,pev_iuser2,0) set_pev(flag,pev_angles,origin) set_pev(flag,pev_iuser3,FLAG_ON_BASE) g_flago_status[pev(flag,pev_iuser1)] = FLAG_ON_BASE new tid = pev(flag,pev_iuser1) for(new i=1;i!=get_playersnum();++i){ if(get_user_team(i)==tid){ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"Your FLAG was RETURNED!!") }else{ set_hudmessage(255,0,0,-1.0, 0.3, 0, 0.0, 3.0, 0.1, 1.0, 4) show_hudmessage(i,"The ENEMY flag was RETURNED!") } } } public fw_IconDraw(){ engfunc(EngFunc_MessageBegin,MSG_ALL,g_statusicon,{0.0, 0.0, 0.0},0) write_byte(1) write_string("dmg_rad") write_byte(255) write_byte(g_flago_status[2]==2?255:0) write_byte(0) message_end() engfunc(EngFunc_MessageBegin,MSG_ALL,g_statusicon,{0.0, 0.0, 0.0},0) write_byte(1) write_string("dmg_shock") write_byte(0) write_byte(g_flago_status[1]==2?255:128) write_byte(255) message_end() } public fw_IconBlink(tid){ if(g_flago_status[tid]!=1) return if(blink_stat[tid]){ engfunc(EngFunc_MessageBegin,MSG_ALL,g_statusicon,{0.0, 0.0, 0.0},0) write_byte(1) write_string(tid==2?"dmg_rad":"dmg_shock") write_byte(tid==2?255:0) write_byte(255) write_byte(tid==1?255:0) message_end() blink_stat[tid] = false }else{ engfunc(EngFunc_MessageBegin,MSG_ALL,g_statusicon,{0.0, 0.0, 0.0},0) write_byte(1) write_string(tid==2?"dmg_rad":"dmg_shock") write_byte(tid==2?255:0) write_byte(0) write_byte(tid==1?255:0) message_end() blink_stat[tid] = true } set_task(0.1,"fw_IconBlink",tid) } public fw_FlagThink(flag){ if(!pev(flag,pev_iuser3)) return new origin[3] pev(flag,pev_origin,origin) message_begin(MSG_BROADCAST,SVC_TEMPENTITY,_,0) write_byte(TE_DLIGHT) engfunc(EngFunc_WriteCoord,origin[0]) engfunc(EngFunc_WriteCoord,origin[1]) engfunc(EngFunc_WriteCoord,origin[2] + (pev(flag,pev_iuser3)==FLAG_DROPPED?32:-16)) write_byte(12) write_byte(pev(flag,pev_iuser1)==2?100:0) write_byte(0) write_byte(pev(flag,pev_iuser1)==1?155:0) write_byte(5) write_byte(1) message_end() set_pev(flag,pev_nextthink,get_gametime()+0.2) } public fw_BackPackTouch(backpack,id){ if(pev(backpack,pev_iuser2)) return if(pev(backpack,pev_iuser1)&&get_user_team(id)!=pev(backpack,pev_iuser1)){ set_hudmessage(0, 255, 0, -1.0, 0.6, 2, 0.5, 1.0, 0.0, 1.0, 1) show_hudmessage(id,"Your team can't use this item") return } emit_sound(id,CHAN_STATIC,BACKPACK_TOUCH_SND,1.0,ATTN_NORM,0,PITCH_NORM) set_pev(backpack,pev_nextthink,get_gametime()+get_pcvar_float(cv_backpack_respawn_time)) set_pev(backpack,pev_iuser2,1) fw_BackPackRefil(id) fm_set_entity_visibility(backpack,0) } public fw_BackPackThink(backpack){ emit_sound(backpack,CHAN_STATIC,"items/suitchargeok1.wav",1.0,ATTN_NORM,0,PITCH_HIGH) fm_set_entity_visibility(backpack,1) set_pev(backpack,pev_iuser2,0) } public fw_BackPackRefil(id){ new Float:chance = random_float(0.0,1.0) new hp = hl_get_user_health(id) new ap = hl_get_user_armor(id) if(chance<0.3){ if(hp+15>100) hl_set_user_health(id,100) else hl_set_user_health(id,hp+15) if(ap+10>100) hl_set_user_armor(id,100) else hl_set_user_armor(id,ap+10) fm_give_item(id,"ammo_9mmclip") fm_give_item(id,"ammo_9mmclip") fm_give_item(id,"ammo_9mmclip") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"weapon_357") fm_give_item(id,"ammo_357") fm_give_item(id,"ammo_gaussclip") fm_give_item(id,"ammo_gaussclip") }else if(chance<0.5){ if(ap+15>100) hl_set_user_armor(id,100) else hl_set_user_armor(id,ap+15) fm_give_item(id,"weapon_9mmAR") fm_give_item(id,"weapon_shotgun") fm_give_item(id,"weapon_357") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"ammo_357") }else if(chance<0.7){ if(ap+15>100) hl_set_user_armor(id,100) else hl_set_user_armor(id,ap+15) fm_give_item(id,"weapon_shotgun") fm_give_item(id,"ammo_argrenade") fm_give_item(id,"weapon_rpg") fm_give_item(id,"ammo_rpgclip") fm_give_item(id,"ammo_rpgclip") fm_give_item(id,"ammo_rpgclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"weapon_handgrenade") }else if(chance<0.85){ if(hp+10>100) hl_set_user_health(id,100) else hl_set_user_health(id,hp+10) if(ap+15>100) hl_set_user_armor(id,100) else hl_set_user_armor(id,ap+15) fm_give_item(id,"weapon_gauss") fm_give_item(id,"ammo_gaussclip") fm_give_item(id,"ammo_rpgclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"weapon_handgrenade") fm_give_item(id,"ammo_argrenade") }else{ if(hp+15>100) hl_set_user_health(id,100) else hl_set_user_health(id,hp+15) if(ap+15>100) hl_set_user_armor(id,100) else hl_set_user_armor(id,ap+15) fm_give_item(id,"ammo_357") fm_give_item(id,"ammo_357") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_9mmarclip") fm_give_item(id,"ammo_rpgclip") fm_give_item(id,"ammo_gaussclip") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"ammo_gaussclip") fm_give_item(id,"ammo_buckshot") fm_give_item(id,"weapon_tripmine") } } get_spawn_ent(teamid){ new ent, alert, i do { for (i = random_num(1, 10); i > 0; i-- ) ent = engfunc(EngFunc_FindEntityByString,ent,"classname",teamid==1?CTF_BLUE_SPAWN:CTF_RED_SPAWN) if (alert ++ > 10) return 0; } while (!IsSpawnPointValid(ent)) return ent } bool: IsSpawnPointValid(const resp_ent) { new ent = FM_NULLENT; new Float: origin[3]; pev(resp_ent, pev_origin, origin); while((ent= engfunc(EngFunc_FindEntityInSphere, ent, origin, 10.0))) return ExecuteHam(Ham_IsPlayer,ent)?false:true return false } // Parse Vector Function by KORD_12.7 ParseVec(szString[], iStringLen, Float: Vector[3]){ new i; new szTemp[32]; arrayset(_:Vector, 0, 3); while (szString[0] != 0 && strtok(szString, szTemp, charsmax(szTemp), szString, iStringLen, ' ', 1)) { Vector[i++] = str_to_float(szTemp); } } get_lolmanlazor(name[]){ if(equal(name,"blue")) return 1 if(equal(name,"red")) return 2 return 0 }