Hello, I have a problem with a modification that I made to a plugin that modifies the spawns of the players, my problem is that 2 players or even 3 spawn in the same position and it causes the players to die automatically, I don't know how to work much with entities or anything like that, let's see if you can help me fix this issue of not spawning several at the same point
Код:
#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <cstrike>
#define REQUIRED_ADMIN_LEVEL ADMIN_BAN // ADMIN_LEVEL_C
#define PLUGINNAME "Map Spawns Editor"
#define VERSION "1.0.22"
#define AUTHOR "iG_os"
// CS default MDL and SPR
#define T_MDL "models/player/leet/leet.mdl"
#define CT_MDL "models/player/gign/gign.mdl"
#define LINE_SPR "sprites/laserbeam.spr"
#define CHECKTIMER 0.8
#define CHECKTASKID 666
#define RESETENTITYTASKID 777
#define SAFEp2p 85 // point to point safe distance
#define SAFEp2w 40 // point to wall safe distance
#define EDIT_CLASSNAME "Map_Spawns_Editor"
#define SPAWN_PRESENT_OFFSET 10
#define SPAWN_ABOVE_OFFSET 115
// store filename
new g_SpawnFile[256], g_DieFile[256], g_EntFile[256]
new g_MainMenuID = -1 // Menu Handel ID
new bool:g_DeathCheck_end = false
new bool:g_LoadSuccessed = false
new bool:g_LoadInit = false
new bool:g_CheckDistance = true
new bool:g_AbovePlayer = false
new g_OffSet = SPAWN_PRESENT_OFFSET
new g_Editing
new g_SpawnT, g_EditT
new g_SpawnCT,g_EditCT
new Laser_Spr
new g_BeamColors[4][3]={{255,0,0},{0,255,0},{200,200,0},{0,0,255}}
public plugin_init()
{
register_plugin(PLUGINNAME, VERSION, AUTHOR)
register_dictionary("map_spawns_editor.txt")
g_LoadInit = true // disabled pfn_keyvalue using
Spawns_Count()
new string[16]
format(string,15,"T(%d) CT(%d)",g_SpawnT,g_SpawnCT)
register_cvar("map_spawns",string,FCVAR_SERVER) // spawns info for HLSW display
register_event("TextMsg", "event_restartgame", "a", "2&#Game_C","2&#Game_w")
register_event("DeathMsg", "event_death", "a")
register_event("HLTV", "event_newround", "a", "1=0", "2=0")
/*register_clcmd("amx_spawn_editor", "editor_onoff", REQUIRED_ADMIN_LEVEL, "- 1/0 switch editor function on/off")
register_clcmd("amx_editor_menu", "editor_menu", REQUIRED_ADMIN_LEVEL, "- open editor menu")*/
register_clcmd("swap_spawns", "swap_spawns");
}
public plugin_natives()
{
register_native("pug_spawn", "native_spawn")
}
public native_spawn()
{
swap_spawns()
}
public editor_onoff(id, level, cid)
{
if (!cmd_access(id,level,cid,1)) return PLUGIN_HANDLED
if (g_Editing && g_Editing!=id){
client_print(id,print_chat,"* %L",id,"MSG_ALREADY_INUSE")
return PLUGIN_HANDLED
}
new arg[2]
read_argv(1,arg,2)
if (equal(arg,"1",1) && !g_Editing){
g_Editing = id
Clear_AllEdit(0)
Load_SpawnFlie(0)
//Spawns_To_Edit()
client_print(0,print_chat,">> %L - %L",id,"MENU_TITLE",id,"ON")
}else if (equal(arg,"0",1)){
g_Editing = 0
Clear_AllEdit(0)
if (task_exists(id+CHECKTASKID)) remove_task(id+CHECKTASKID)
client_print(0,print_chat,">> %L - %L",id,"MENU_TITLE",id,"OFF")
}
return PLUGIN_HANDLED
}
public editor_menu(id,level,cid)
{
if (!cmd_access(id,level,cid,1))
return PLUGIN_HANDLED
if (!g_Editing){
client_print(id,print_chat,"* %L",id,"MSG_FUNCTION_DISABLED")
return PLUGIN_HANDLED
}
if (g_Editing!=id){
client_print(id,print_chat,"* %L",id,"MSG_ALREADY_INUSE")
return PLUGIN_HANDLED
}
new tempString[101]
format(tempString,100,"%L",id,"MENU_TITLE")
g_MainMenuID = menu_create(tempString, "m_MainHandler")
new callbackMenu = menu_makecallback("c_Main")
// page 1
menu_additem(g_MainMenuID, "[Spawns Info]","1", 1, callbackMenu)
menu_addblank(g_MainMenuID, 0)
menu_additem(g_MainMenuID, "[Add spawn locate: present/above player]","2", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_ADD_SPAWN","T")
menu_additem(g_MainMenuID, tempString,"3", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_ADD_SPAWN","CT")
menu_additem(g_MainMenuID, tempString,"4", 0, callbackMenu)
menu_addblank(g_MainMenuID, 0)
format(tempString,100,"\y%L",id,"MENU_TURN_LEFT")
menu_additem(g_MainMenuID, tempString,"5", 0, callbackMenu)
format(tempString,100,"\y%L",id,"MENU_TURN_RIGHT")
menu_additem(g_MainMenuID, tempString,"6", 0, callbackMenu)
menu_addblank(g_MainMenuID, 0)
format(tempString,100,"%L",id,"MENU_SAVE_ALL_SPAWNS")
menu_additem(g_MainMenuID, tempString,"7", 0, callbackMenu)
menu_addblank(g_MainMenuID, 0)
// page 1 end
// page 2
menu_additem(g_MainMenuID, "[Spawns Info]","11", 1, callbackMenu)
menu_addblank(g_MainMenuID, 0)
menu_additem(g_MainMenuID, "[Safe range check on/off]","12", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_CLEAR_SPAWN")
menu_additem(g_MainMenuID, tempString,"13", 0, callbackMenu)
menu_addblank(g_MainMenuID, 0)
format(tempString,100,"%L",id,"MENU_CLEAR_ALL_T_SPAWNS")
menu_additem(g_MainMenuID, tempString,"14", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_CLEAR_ALL_CT_SPAWNS")
menu_additem(g_MainMenuID, tempString,"15", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_DEL_SPAWNS_FILE")
menu_additem(g_MainMenuID, tempString,"16", 0, callbackMenu)
format(tempString,100,"%L",id,"MENU_EXPORT_FOR_RIPENT")
menu_additem(g_MainMenuID, tempString,"17", 0, callbackMenu)
menu_addblank(g_MainMenuID, 0)
// page 2 end
format(tempString,100,"%L",id,"MENU_EXIT")
menu_setprop(g_MainMenuID, MPROP_EXITNAME, tempString)
format(tempString,100,"%L",id,"MENU_NEXT")
menu_setprop(g_MainMenuID, MPROP_NEXTNAME, tempString)
format(tempString,100,"%L",id,"MENU_BACK")
menu_setprop(g_MainMenuID, MPROP_BACKNAME, tempString)
menu_setprop(g_MainMenuID, MPROP_EXIT, MEXIT_ALL)
menu_display (id,g_MainMenuID,0)
client_cmd(id,"spk buttons/button9")
set_task(CHECKTIMER,"check_Task",id+CHECKTASKID,_,_,"b")
return PLUGIN_HANDLED
}
public c_Main(id, menu, item)
{
if (item < 0) return PLUGIN_CONTINUE
new cmd[6], fItem[256], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, cmd, 5, iName, 63, callback)
new num = str_to_num(cmd)
if (num==1 || num==11){
if (g_EditT!=g_SpawnT || g_EditCT!=g_SpawnCT)
format(fItem,255,"%L ( T=%d + CT=%d ) ^n0.\y %L \r( T=%d + CT=%d ) ^n>> %L", id, "MENU_ORIGIN_SPAWNS",g_SpawnT,g_SpawnCT, id,"MENU_EDIT_SPAWNS", g_EditT,g_EditCT, id,"MENU_NOTICE_SAVE")
else format(fItem,255,"%L ( T=%d + CT=%d ) ^n0.\y %L ( T=%d + CT=%d )", id, "MENU_ORIGIN_SPAWNS",g_SpawnT,g_SpawnCT, id,"MENU_EDIT_SPAWNS", g_EditT,g_EditCT)
menu_item_setname(menu, item, fItem )
return ITEM_DISABLED
}
switch (num){
case 2:{
if (g_AbovePlayer)
format(fItem,255,"\y%L ->\r %L",id,"MENU_ADD_LOCATION",id,"MENU_LOCATION_ABOVE")
else format(fItem,255,"\y%L ->\r %L",id,"MENU_ADD_LOCATION",id,"MENU_LOCATION_CURRENT")
menu_item_setname(menu, item, fItem )
}
case 12:{
if (g_CheckDistance)
format(fItem,255,"\y%L ->\r %L",id,"MENU_SAFE_CHECK",id,"ON")
else format(fItem,255,"\y%L ->\r %L",id,"MENU_SAFE_CHECK",id,"OFF")
menu_item_setname(menu, item, fItem )
}
}
return ITEM_ENABLED
}
public m_MainHandler(id, menu, item)
{
if (item==MENU_EXIT || !g_Editing){
if (task_exists(id+CHECKTASKID)) remove_task(id+CHECKTASKID)
menu_destroy(g_MainMenuID)
return PLUGIN_HANDLED
}
new cmd[6], iName[64]
new access, callback
menu_item_getinfo(menu, item, access, cmd,5, iName, 63, callback)
new iChoice = str_to_num(cmd)
switch(iChoice)
{
case 2:{ // Location Set
if (g_AbovePlayer){
g_OffSet = SPAWN_PRESENT_OFFSET
g_AbovePlayer = false
}else{
g_OffSet = SPAWN_ABOVE_OFFSET
g_AbovePlayer = true
}
client_cmd(id,"spk buttons/button3")
}
case 3:{ // Add T Spawn
if (g_CheckDistance && !SafeRangeCheck(id,g_OffSet)){
client_cmd(id,"spk buttons/button2")
client_print(0,print_chat,">> %L",id,"MSG_CHECK_FAULT")
}
else if (CreateEditEntity(1,id,g_OffSet)==1){
g_EditT++
client_cmd(id,"spk buttons/button9")
client_print(0,print_chat,">> %L",id,"MENU_ADD_SPAWN","T")
}
}
case 4:{ // Add CT Spawn
if (g_CheckDistance && !SafeRangeCheck(id,g_OffSet)){
client_cmd(id,"spk buttons/button2")
client_print(0,print_chat,">> %L",id,"MSG_CHECK_FAULT")
}
else if (CreateEditEntity(2,id,g_OffSet)==2){
g_EditCT++
client_cmd(id,"spk buttons/button9")
client_print(0,print_chat,">> %L",id,"MENU_ADD_SPAWN","CT")
}
}
case 5:{ // Spawn Turn Left
new entity = Get_Edit_Point_By_Aim(id)
if (entity && is_valid_ent(entity)){
Entity_Turn_angle(entity,10)
client_cmd(id,"spk buttons/blip1")
}else{
client_cmd(id,"spk buttons/button2")
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
}
}
case 6:{ // Spawn Turn Right
new entity = Get_Edit_Point_By_Aim(id)
if (entity && is_valid_ent(entity)){
Entity_Turn_angle(entity,-10)
client_cmd(id,"spk buttons/blip1")
}else{
client_cmd(id,"spk buttons/button2")
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
}
}
case 7:{ // Save All Spawn To File
if (Save_SpawnsFile()){
Load_SpawnFlie(0)
client_cmd(id,"spk buttons/blip2")
client_print(0,print_chat,">> %L (T=%d,CT=%d)",id,"MSG_SAVE_SPAWNSFLIE",g_EditT,g_EditCT)
}else
client_print(0,print_chat,">> %L",id,"ERROR_SAVE_SPAWNSFLIE")
}
case 12:{ // Safe Range Check
g_CheckDistance = g_CheckDistance ? false:true
client_cmd(id,"spk buttons/button3")
}
case 13:{ // Clear a Spawn
new entity = Get_Edit_Point_By_Aim(id)
if (entity && is_valid_ent(entity)){
new team = entity_get_int(entity,EV_INT_iuser2)
remove_entity(entity)
client_cmd(id,"spk buttons/button3")
if (team==1){
g_EditT--
client_print(0,print_chat,">> %L",id,"MSG_CLEAR_SPAWN","T")
}else{
g_EditCT--
client_print(0,print_chat,">> %L",id,"MSG_CLEAR_SPAWN","CT")
}
}else{
client_cmd(id,"spk buttons/button2")
client_print(0,print_chat,">> %L",id,"ERROR_POINT_NOTFOUND")
}
}
case 14:{ // Clear All T Spawn
Clear_AllEdit(1)
client_cmd(id,"spk buttons/blip2")
client_print(0,print_chat,">> %L",id,"MENU_CLEAR_ALL_T_SPAWNS")
}
case 15:{ // Clear All CT Spawn
Clear_AllEdit(2)
client_cmd(id,"spk buttons/blip2")
client_print(0,print_chat,">> %L",id,"MENU_CLEAR_ALL_CT_SPAWNS")
}
case 16:{ // Del Spawns Flie
if (file_exists(g_SpawnFile)){
delete_file(g_SpawnFile)
client_cmd(id,"spk buttons/blip2")
client_print(0,print_chat,">> %L",id,"MSG_DEL_SPAWNSFILE")
}
}
case 17:{ // Expotr Spawn To ENT Format
if (Export_RipentFormatFile()){
client_cmd(id,"spk buttons/blip2")
client_print(0,print_chat,">> %L [%s] (T=%d,CT=%d)",id,"MSG_EXOPRT_SPAWNSFLIE",g_EntFile,g_EditT,g_EditCT)
}
}
}
if (iChoice>=11 && iChoice<=17) // go back to second page is using
menu_display (id, g_MainMenuID, 1)
else menu_display (id, g_MainMenuID, 0)
return PLUGIN_CONTINUE
}
public plugin_precache()
{
new configdir[128]
get_configsdir(configdir, 127 )
new spawndir[256]
format(spawndir,255,"%s/spawns",configdir)
if (!dir_exists(spawndir)){
if (mkdir(spawndir)==0){ // Create a dir,if it's not exist
log_amx("Create [%s] dir successfully finished.",spawndir)
}else{
log_error(AMX_ERR_NOTFOUND,"Couldn't create [%s] dir,plugin stoped.",spawndir)
pause("ad")
return PLUGIN_CONTINUE
}
}
precache_model(T_MDL)
precache_model(CT_MDL)
Laser_Spr = precache_model(LINE_SPR)
new MapName[32]
get_mapname(MapName, 31)
//store spawns point data in this file
format(g_SpawnFile, 255, "%s/%s_spawns.cfg",spawndir, MapName)
//when restart game some bad spawn point will make user die,store data in this file,it's useful.
format(g_DieFile, 255, "%s/%s_spawns_die.cfg",spawndir, MapName)
//export spawns data to this file for ripent.exe format,it's useful for import to bsp for ripent.exe
format(g_EntFile, 255, "%s/%s_ent.txt",spawndir, MapName)
if (Load_SpawnFlie(1)) //load spawn file and create player spawn points
g_LoadSuccessed = true
else
g_LoadSuccessed = false
return PLUGIN_CONTINUE
}
//load spawns from file, Return 0 when didn't load anything.
stock Load_SpawnFlie(type) //createEntity = 1 create an entity when load a point
{
if (file_exists(g_SpawnFile))
{
new ent_T, ent_CT
new temp_ent_T, temp_ent_CT;
new Data[128], len, line = 0
new team[8], p_origin[3][8], p_angles[3][8]
new Float:origin[3], Float:angles[3]
while((line = read_file(g_SpawnFile , line , Data , 127 , len) ) != 0 )
{
if (strlen(Data)<2) continue
parse(Data, team,7, p_origin[0],7, p_origin[1],7, p_origin[2],7, p_angles[0],7, p_angles[1],7, p_angles[2],7)
origin[0] = str_to_float(p_origin[0]); origin[1] = str_to_float(p_origin[1]); origin[2] = str_to_float(p_origin[2]);
angles[0] = str_to_float(p_angles[0]); angles[1] = str_to_float(p_angles[1]); angles[2] = str_to_float(p_angles[2]);
if (equali(team, "T"))
{
if (type == 1)
{
temp_ent_T = create_entity("info_target");
CreateEditEntity(1, temp_ent_T, 0);
remove_entity(temp_ent_T);
}
do
ent_T = find_ent_by_class(ent_T, EDIT_CLASSNAME);
while (ent_T && entity_get_int(ent_T, EV_INT_iuser2) != 1)
if (ent_T > 0)
{
entity_set_int(ent_T,EV_INT_iuser1,1) // mark that create by map spawns editor
entity_set_origin(ent_T,origin)
entity_set_vector(ent_T, EV_VEC_angles, angles)
entity_set_int(ent_T, EV_INT_effects, type == 1 ? EF_NODRAW : 0);
}
}
else if (equali(team,"CT"))
{
if (type == 1)
{
temp_ent_CT = create_entity("info_target");
CreateEditEntity(2, temp_ent_CT, 0);
remove_entity(temp_ent_CT);
}
do
ent_CT = find_ent_by_class(ent_CT, EDIT_CLASSNAME);
while (ent_CT && entity_get_int(ent_CT, EV_INT_iuser2) != 2)
if (ent_CT > 0)
{
entity_set_int(ent_CT,EV_INT_iuser1,1) // mark that create by map spawns editor
entity_set_origin(ent_CT,origin)
entity_set_vector(ent_CT, EV_VEC_angles, angles)
entity_set_int(ent_CT, EV_INT_effects, type == 1 ? EF_NODRAW : 0);
}
}
}
return 1
}
return 0
}
// pfn_keyvalue..Execure after plugin_precache and before plugin_init
/*
public pfn_keyvalue(entid)
{ // when load custom spawns file successed,we are del all spawns by map originate create
if (g_LoadSuccessed && !g_LoadInit){
new classname[32], key[32], value[32]
copy_keyvalue(classname, 31, key, 31, value, 31)
if (equal(classname, "info_player_deathmatch") || equal(classname, "info_player_start")){
if (is_valid_ent(entid) && entity_get_int(entid,EV_INT_iuser1)!=1) //filter out custom spawns
remove_entity(entid)
}
}
return PLUGIN_CONTINUE
}
*/
public event_restartgame()
{
if (g_Editing && file_exists(g_DieFile))
delete_file(g_DieFile)
g_DeathCheck_end = false
if (g_Editing){
Clear_AllEdit(0)
Load_SpawnFlie(0)
//Spawns_To_Edit()
}
return PLUGIN_CONTINUE
}
// Remove & save bad spawn point where force user die.
public event_death()
{
if (!g_DeathCheck_end){
new string[12]
read_data(4,string,11)
if (equal(string,"worldspawn")){
new id = read_data(2)
if (g_Editing){
new entList[1],team
find_sphere_class(id,EDIT_CLASSNAME, 30.0, entList, 1)
if (entList[0]){
team = entity_get_int(entList[0],EV_INT_iuser2) // team mark
if (team==1){
client_print(0,print_chat,">> %L",id,"MSG_AUTO_REMOVE_SPAWN","T")
g_EditT--
}else{
client_print(0,print_chat,">> %L",id,"MSG_AUTO_REMOVE_SPAWN","CT")
g_EditCT--
}
remove_entity(entList[0])
return PLUGIN_CONTINUE
}
}else{
new team = get_user_team(id)
if (team==1) Point_WriteToFlie(g_DieFile,1,id,1)
else if (team==2) Point_WriteToFlie(g_DieFile,2,id,1)
}
}
}
return PLUGIN_CONTINUE
}
public event_newround()
set_task(3.0,"deathCheck_end")
public deathCheck_end()
g_DeathCheck_end = true
// create a edit point
stock CreateEditEntity(team,iEnt,offset)
{
new Float:fOrigin[3],Float:fAngles[3]
entity_get_vector(iEnt, EV_VEC_origin, fOrigin)
entity_get_vector(iEnt, EV_VEC_angles, fAngles)
fOrigin[2] += float(offset) //offset Z
new entity = cs_create_entity(team == 1 ? "info_player_deathmatch" : "info_player_start")
if (entity){
cs_set_ent_class(entity, EDIT_CLASSNAME);
//entity_set_string(entity, EV_SZ_classname, EDIT_CLASSNAME)
entity_set_model(entity,(team==1) ? T_MDL:CT_MDL)
entity_set_origin(entity, fOrigin)
entity_set_vector(entity, EV_VEC_angles, fAngles)
entity_set_int(entity, EV_INT_sequence, 4)
entity_set_int(entity,EV_INT_iuser2,team) // team mark
return team
}
return 0
}
// clear up all edit points
stock Clear_AllEdit(team)
{
new entity
switch (team)
{
case 0:
{
while ((entity = cs_find_ent_by_class(entity, EDIT_CLASSNAME)))
{
if (file_exists(g_SpawnFile))
entity_set_int(entity, EV_INT_effects, EF_NODRAW);
else
remove_entity(entity);
}
//remove_entity(entity)
g_EditT = 0
g_EditCT = 0
}
case 1:
{
while ((entity = find_ent_by_class(entity, EDIT_CLASSNAME)))
{
if (file_exists(g_SpawnFile))
{
if (entity_get_int(entity,EV_INT_iuser2)==1)
entity_set_int(entity, EV_INT_effects, EF_NODRAW);
}
else
remove_entity(entity);
}
//remove_entity(entity)
g_EditT = 0
}
case 2:
{
while ((entity = find_ent_by_class(entity, EDIT_CLASSNAME)))
{
if (file_exists(g_SpawnFile))
{
if (entity_get_int(entity,EV_INT_iuser2)==2)
entity_set_int(entity, EV_INT_effects, EF_NODRAW);
}
else
remove_entity(entity);
//remove_entity(entity)
g_EditCT = 0
}
}
}
}
// convert origin spawns to edit points
stock Spawns_To_Edit()
{
new entity
g_EditT = 0
while ((entity = find_ent_by_class(entity, "info_player_deathmatch"))){
CreateEditEntity(1,entity,0)
g_EditT++
}
entity = 0
g_EditCT = 0
while ((entity = find_ent_by_class(entity, "info_player_start"))){
CreateEditEntity(2,entity,0)
g_EditCT++
}
}
stock Spawns_Count()
{
new entity
g_SpawnT = 0
while ((entity = find_ent_by_class(entity, "info_player_deathmatch")))
g_SpawnT++
entity = 0
g_SpawnCT = 0
while ((entity = find_ent_by_class(entity, "info_player_start")))
g_SpawnCT++
}
public check_Task(taskid){
SafeRangeCheck(taskid-CHECKTASKID,SPAWN_PRESENT_OFFSET)
Get_Edit_Point_By_Aim(taskid-CHECKTASKID)
}
// reset entity sequence
public reset_entity_stats(param){
new entity = param - RESETENTITYTASKID
if (is_valid_ent(entity)){
entity_set_float(entity, EV_FL_animtime, 0.0)
entity_set_float(entity, EV_FL_framerate, 0.0)
entity_set_int(entity, EV_INT_sequence, 4)
}
}
// set entity vangle[1]+turn
stock Entity_Turn_angle(entity,turn){
if (is_valid_ent(entity)){
new Float:fAngles[3]
entity_get_vector(entity, EV_VEC_angles, fAngles)
fAngles[1] += turn
if (fAngles[1]>=360) fAngles[1] -= 360
if (fAngles[1]<0) fAngles[1] += 360
entity_set_vector(entity, EV_VEC_angles, fAngles)
}
}
// check edit point or wall distance to id
stock SafeRangeCheck(id,offset)
{
new safepostion = 1
new Float:fOrigin[3],Float:fAngles[3],Float:inFrontPoint[3],Float:HitPoint[3]
entity_get_vector(id, EV_VEC_origin, fOrigin)
fOrigin[2] += offset // hight offset,same as Edit Point offset
entity_get_vector(id, EV_VEC_angles, fAngles)
for (new i=0;i<360;i+=10)
{
fAngles[1] = float(i)
// get the id infront point for trace_line
Vector_By_Angle(fOrigin,fAngles, SAFEp2w * 2.0, 1, inFrontPoint)
// check id nearby wall
trace_line(-1,fOrigin,inFrontPoint,HitPoint)
new distance = floatround(vector_distance(fOrigin, HitPoint))
if (distance<SAFEp2w){ // unsafe distance to wall
Make_TE_BEAMPOINTS(id,0,fOrigin,HitPoint,2,255)
safepostion = 0
}
else if (distance < SAFEp2w * 1.5)
Make_TE_BEAMPOINTS(id,2,fOrigin,HitPoint,2,255)
}
// check id nearby Edit Points
new entList[10],Float:vDistance
new Float:entity_origin[3]
find_sphere_class(0,EDIT_CLASSNAME, SAFEp2p * 1.5, entList, 9, fOrigin)
for(new i=0;i<10;i++){
if (entList[i]){
entity_get_vector(entList[i], EV_VEC_origin, entity_origin)
vDistance = vector_distance(fOrigin,entity_origin)
if (vDistance < SAFEp2p){ // unsafe location to Edit Points
Make_TE_BEAMPOINTS(id,0,fOrigin,entity_origin,5,255)
entity_set_int(entList[i], EV_INT_sequence, 64)
safepostion = 0
if (task_exists(entList[i]+RESETENTITYTASKID))
remove_task(entList[i]+RESETENTITYTASKID)
set_task(CHECKTIMER+0.1,"reset_entity_stats",entList[i]+RESETENTITYTASKID)
} else Make_TE_BEAMPOINTS(id,1,fOrigin,entity_origin,5,255)
}
}
return safepostion
}
stock Get_Edit_Point_By_Aim(id)
{
new entList[1],team
new Float:fOrigin[3],Float:vAngles[3],Float:vecReturn[3]
entity_get_vector(id, EV_VEC_origin, fOrigin)
fOrigin[2] += 10 // offset Z of id
entity_get_vector(id, EV_VEC_v_angle, vAngles)
for(new Float:i=0.0;i<=1000.0;i+=20.0)
{
Vector_By_Angle(fOrigin,vAngles,i,1,vecReturn)
//Make_TE_BEAMPOINTS(id,3,fOrigin,vecReturn,5,255)
//client_print(0,print_chat,"fOrigin={%d,%d,%d},vecReturn={%d,%d,%d}",floatround(fOrigin[0]),floatround(fOrigin[1]),floatround(fOrigin[2]),floatround(vecReturn[0]),floatround(vecReturn[1]),floatround(vecReturn[2]))
find_sphere_class(0,EDIT_CLASSNAME, 20.0, entList, 1, vecReturn)
if (entList[0]){
// let entity have anim.
entity_set_float(entList[0], EV_FL_animtime, 1.0)
entity_set_float(entList[0], EV_FL_framerate, 1.0)
team = entity_get_int(entList[0],EV_INT_iuser2)
client_print(id,print_center,"%L #%d",id,"MSG_AIM_SPAWN",(team==1) ? "T":"CT",entList[0])
if (task_exists(entList[0]+RESETENTITYTASKID))
remove_task(entList[0]+RESETENTITYTASKID)
set_task(CHECKTIMER+0.1,"reset_entity_stats",entList[0]+RESETENTITYTASKID)
break
}
}
return entList[0] // return entity if be found
}
/* FRU define in vector.inc
#define ANGLEVECTOR_FORWARD 1
#define ANGLEVECTOR_RIGHT 2
#define ANGLEVECTOR_UP 3
*/
stock Vector_By_Angle(Float:fOrigin[3],Float:vAngles[3], Float:multiplier, FRU, Float:vecReturn[3])
{
angle_vector(vAngles, FRU, vecReturn)
vecReturn[0] = vecReturn[0] * multiplier + fOrigin[0]
vecReturn[1] = vecReturn[1] * multiplier + fOrigin[1]
vecReturn[2] = vecReturn[2] * multiplier + fOrigin[2]
}
// draw laserBeam
stock Make_TE_BEAMPOINTS(id,color,Float:Vec1[3],Float:Vec2[3],width,brightness){
message_begin(MSG_ONE_UNRELIABLE ,SVC_TEMPENTITY,{0,0,0},id)
write_byte(TE_BEAMPOINTS) // TE_BEAMPOINTS = 0
write_coord(floatround(Vec1[0])) // start position
write_coord(floatround(Vec1[1]))
write_coord(floatround(Vec1[2]))
write_coord(floatround(Vec2[0])) // end position
write_coord(floatround(Vec2[1]))
write_coord(floatround(Vec2[2]))
write_short(Laser_Spr) // sprite index
write_byte(1) // starting frame
write_byte(0) // frame rate in 0.1's
write_byte(4) // life in 0.1's
write_byte(width) // line width in 0.1's
write_byte(0) // noise amplitude in 0.01's
write_byte(g_BeamColors[color][0])
write_byte(g_BeamColors[color][1])
write_byte(g_BeamColors[color][2])
write_byte(brightness) // brightness)
write_byte(0) // scroll speed in 0.1's
message_end()
}
stock Save_SpawnsFile()
{
if (file_exists(g_SpawnFile))
delete_file(g_SpawnFile)
new mapname[32],line[128]
get_mapname(mapname,31)
format(line,127,"/* %s T=%d,CT=%d */ Map Spawns Editor Format File",mapname,g_EditT,g_EditCT)
write_file(g_SpawnFile, line, -1)
new entity,team
while ((entity = find_ent_by_class(entity, EDIT_CLASSNAME))){
team = entity_get_int(entity,EV_INT_iuser2)
Point_WriteToFlie(g_SpawnFile,team,entity,1)
}
return 1
}
stock Export_RipentFormatFile()
{
if (file_exists(g_EntFile))
delete_file(g_EntFile)
new entity,team
while ((entity = find_ent_by_class(entity, EDIT_CLASSNAME))){
team = entity_get_int(entity,EV_INT_iuser2)
Point_WriteToFlie(g_EntFile,team,entity,2)
}
return 1
}
// store one entity data to file
stock Point_WriteToFlie(Flie[],team,entity,saveformat)
{
new line[128],sTeam[32]
new nOrigin[3],nAngles[3]
new Float:fOrigin[3],Float:fAngles[3]
entity_get_vector(entity, EV_VEC_origin, fOrigin)
entity_get_vector(entity, EV_VEC_angles, fAngles)
FVecIVec(fOrigin,nOrigin)
FVecIVec(fAngles,nAngles)
if (nAngles[1]>=360) nAngles[1] -= 360
if (nAngles[1]<0) nAngles[1] += 360
if (saveformat==1){ // write for plugin using format
if (team==1) sTeam = "T"
else sTeam = "CT"
format(line, 127, "%s %d %d %d %d %d %d", sTeam, nOrigin[0], nOrigin[1], nOrigin[2], 0, nAngles[1], 0)
write_file(Flie, line, -1)
}
else if (saveformat==2){ // write for ripent.exe format
if (team==1) sTeam = "info_player_deathmatch"
else sTeam = "info_player_start"
format(line, 127,"{^n ^"classname^" ^"%s^"",sTeam)
write_file(Flie, line , -1)
format(line, 127, " ^"origin^" ^"%d %d %d^"", nOrigin[0], nOrigin[1], nOrigin[2])
write_file(Flie, line, -1)
format(line, 127, " ^"angle^" ^"0 %d 0^"^n}^n", nAngles[1])
write_file(Flie, line, -1)
}
}
//////////////////////////////////////////////////////////
/* export spawns data to txt file for ripent.exe format */
/*
{ //(T)
"classname" "info_player_deathmatch"
"origin" "-384 1056 108"
"angle" "0 180 0"
}
{ //(CT)
"classname" "info_player_start"
"origin" "-128 -832 104"
"angle" "0 270 0"
}
*/
//////////////////////////////////////////////////////////
public swap_spawns()
{
SwapSpawns()
}
SwapSpawns()
{
static bool:bRestoreSpawns;
new iSpawn;
{
iSpawn = 0;
while ((iSpawn = cs_find_ent_by_class(iSpawn, EDIT_CLASSNAME)) != 0)
{
if (entity_get_int(iSpawn, EV_INT_iuser2) != (bRestoreSpawns ? 3 : 1))
continue;
cs_set_ent_class(iSpawn, "info_player_deathmatch");
}
iSpawn = 0;
while ((iSpawn = cs_find_ent_by_class(iSpawn, "info_player_deathmatch")) != 0)
{
if (entity_get_int(iSpawn, EV_INT_iuser2) == (bRestoreSpawns ? 3 : 1))
continue;
cs_set_ent_class(iSpawn, EDIT_CLASSNAME);
entity_set_int(iSpawn, EV_INT_iuser2, bRestoreSpawns ? 1 : 3);
}
}
{
iSpawn = 0;
while ((iSpawn = cs_find_ent_by_class(iSpawn, EDIT_CLASSNAME)) != 0)
{
if (entity_get_int(iSpawn, EV_INT_iuser2) != (bRestoreSpawns ? 4 : 2))
continue;
cs_set_ent_class(iSpawn, "info_player_start");
}
iSpawn = 0;
while ((iSpawn = cs_find_ent_by_class(iSpawn, "info_player_start")) != 0)
{
if (entity_get_int(iSpawn, EV_INT_iuser2) == (bRestoreSpawns ? 4 : 2))
continue;
cs_set_ent_class(iSpawn, EDIT_CLASSNAME);
entity_set_int(iSpawn, EV_INT_iuser2, bRestoreSpawns ? 2 : 4);
}
}
bRestoreSpawns = !bRestoreSpawns;
}