AlliedModders

AlliedModders (https://forums.alliedmods.net/index.php)
-   Scripting Help (https://forums.alliedmods.net/forumdisplay.php?f=11)
-   -   How to create circle (https://forums.alliedmods.net/showthread.php?t=318829)

Natsheh 09-23-2019 00:50

How to create circle
 
Is it possible to create a circle and detect whether the player pass through it if yes then how?

edon1337 09-23-2019 03:08

Re: How to create circle
 
Yes, check my CSBR mod. You'd have to compare the 2D length of the circle's radius against player.

Natsheh 09-23-2019 13:44

Re: How to create circle
 
i was trying to achieve this way using an entity touch but seems entity hitboxes are not supportive of a circle :'(

Natsheh 09-23-2019 14:26

Re: How to create circle
 
Quote:

Originally Posted by edon1337 (Post 2667914)
Yes, check my CSBR mod. You'd have to compare the 2D length of the circle's radius against player.

my problem is quite harder because the circle i want to create in multiple angles.

fysiks 09-23-2019 23:13

Re: How to create circle
 
Quote:

Originally Posted by Natsheh (Post 2667957)
my problem is quite harder because the circle i want to create has multiple angles.

Circles have angles?

Natsheh 09-24-2019 01:10

Re: How to create circle
 
Lmao I didn't think this through typing it, I mean I want create a circle in multiple directions and check if the player is in it lets say it's more like player inside cylinder I want to give width to that circle/cylinder I'm using this equation to detect how far the player from the circle in different axis (PlayerOriginX - circleCenterX )^2 + floatsqroot((PlayerOriginY - circleCenterY)^2)) < Radius

I'll post what I have tried after I come back from work.

Smilex_Gamer 09-24-2019 11:06

Re: How to create circle
 
Quote:

Originally Posted by Natsheh (Post 2667975)
Lmao I didn't think this through typing it, I mean I want create a circle in multiple directions and check if the player is in it lets say it's more like player inside cylinder I want to give width to that circle/cylinder I'm using this equation to detect how far the player from the circle in different axis (PlayerOriginX - circleCenterX )^2 + floatsqroot((PlayerOriginY - circleCenterY)^2)) < Radius

I'll post what I have tried after I come back from work.

First: A circle is 2D. A cylinder is 3D.
Maybe you're trying to know if a player is inside a sphere.
If that's so, the formula to know if something is inside that sphere is this one: (x - SphereCenterX)^2 + (y - SphereCenterY)^2 + (z - SphereCenterZ)^2 < Radius^2
If it's a circle, then it's: (x - CircleCenterX)^2 + (y - CircleCenterY)^2 < Radius^2

P.S: The only thing you got wrong in your formula was the radius that wasn't square rooted.
P.S.S: Of course, because Goldsource is a 3D game engine, your circle you create has a Z origin, so you should use the first formula in my comment.

Natsheh 09-24-2019 12:48

Re: How to create circle
 
thanks for replying, actually i did add the sqroot to the equation infact here's the full code...

PHP Code:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>

#define PLUGIN "Health circle"
#define VERSION "1.0"
#define AUTHOR "Natsheh"

new g_sprite;

#define X 0
#define Y 1
#define Z 2

public plugin_precache() g_sprite precache_model("sprites/laserbeam.spr");

public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_clcmd("amx_health_circle""handler_command"ADMIN_KICK"<rad> <width> <axis x> <axis y> <axis z>");
    
register_clcmd("amx_delete_health_circle""handler_command2"ADMIN_KICK"remove health circle nearby!");
    
register_think("health_circle""brain_work");
}

public 
handler_command2(idlevelcid)
{
    if(!
cmd_access(idlevelcid1)) return 1;
    
    new 
ent = -1target_circle 0Float:wanted_distance 250.0Float:fOrigin[3], Float:fOrigin2[3], Float:z;
    
pev(idpev_originfOrigin);
    while( (
ent find_ent_by_class(ent"health_circle")) > )
    {
        
pev(entpev_originfOrigin2);
        if( (
z=get_distance_f(fOriginfOrigin2)) <= wanted_distance )
        {
            
target_circle entwanted_distance z;
        }
    }
    
    if(
target_circle 0)
    {
        
set_entity_flags(target_circleFL_KILLMEtrue);
        
console_print(id"The health circle nearby was removed!");
    }
    else
    {
        
console_print(id"No health circles were found!");
    }
    return 
1;
}

public 
handler_command(idlevelcid)
{
    if(!
cmd_access(idlevelcid2)) return 1;
    
    new 
szRadius[5], szWidth[5], szAngle_X[5], szAngle_Y[5], szAngle_Z[5];
    
read_argv(1szRadiuscharsmax(szRadius));
    
read_argv(2szWidthcharsmax(szWidth));
    
read_argv(3szAngle_Xcharsmax(szAngle_X));
    
read_argv(4szAngle_Ycharsmax(szAngle_Y));
    
read_argv(5szAngle_Zcharsmax(szAngle_Z));
    
    
remove_quotes(szRadius);
    
remove_quotes(szWidth);
    
remove_quotes(szAngle_X);
    
remove_quotes(szAngle_Y);
    
remove_quotes(szAngle_Z);
    
    new 
ent create_entity("info_target");
    
    if(
ent 0)
    {
        
entity_set_string(entEV_SZ_classname"health_circle");
        
        new 
Float:fAngles[3];
        
        
entity_get_vector(idEV_VEC_originfAngles);
        
entity_set_origin(entfAngles);
        
        
entity_set_int(entEV_INT_iuser4str_to_num(szWidth));
        
entity_set_float(entEV_FL_fuser4floatstr(szRadius));
        
        
fAngles[0] = floatstr(szAngle_X);
        
fAngles[1] = floatstr(szAngle_Y);
        
fAngles[2] = floatstr(szAngle_Z);
        
entity_set_vector(entEV_VEC_anglesfAngles);
        
        
entity_set_int(entEV_INT_solidSOLID_TRIGGER);
        
entity_set_float(entEV_FL_nextthinkget_gametime() + 0.1);
        
console_print(id"Health circle has been created!");
    }
    else
    {
        
console_print(id"Failed to create the health circle!");
    }
    
    return 
1;
}

public 
brain_work(id)
{
    static 
Float:fAngles[3], Float:fRadius[3], Float:fOrigin[3], Float:fWidth;
    
pev(idpev_anglesfAngles);
    
pev(idpev_originfOrigin)
    
fWidth float(pev(idpev_iuser4));
    
pev(idpev_fuser4fRadius[X]);
    
fRadius[Y] = 0.0;
    
fRadius[Z] = 0.0;
    
    static 
g_aPlayers[32], Float:fPos[3], pnumiFloat:z1Float:x1Float:c1c1 fRadius[X];
    
get_players(g_aPlayerspnum"ach");
    for(
0pnumi++)
    {
        
pev(g_aPlayers[i], pev_originfPos);
        
        
fPos[X] = fRadius[X] * floatcos(fAngles[Y],degrees) - floatsin(fAngles[Y],degrees) * fRadius[Y];
        
fPos[Y] = fRadius[X] * floatsin(fAngles[Y],degrees) + floatcos(fAngles[Y],degrees) * fRadius[Y];
        
fPos[Z] = 0.0
        xs_vec_copy
(fPosfRadius);
        
        
fPos[X] = fRadius[X] * floatcos(fAngles[X],degrees) + fRadius[Y] * floatsin(fAngles[X],degrees);
        
fPos[Y] = fRadius[Y];
        
fPos[Z] = -fRadius[X] * floatsin(fAngles[X],degrees) + fRadius[Z] * floatcos(fAngles[X],degrees);
        
xs_vec_copy(fPosfRadius);
        
        
/*x1=floatsqroot(floatpower((fPos[X] - fOrigin[X]),2.0) + floatpower((fPos[Y] - fOrigin[Y]),2.0));
        z1=floatsqroot(floatpower((fPos[X] - fOrigin[X]),2.0) + floatpower((fPos[Z] - fOrigin[Z]),2.0));
        c1=floatsqroot(floatpower((fPos[Y] - fOrigin[Y]),2.0) + floatpower((fPos[Z] - fOrigin[Z]),2.0));
        if(x1 < fRadius[X] && floatabs(fPos[Z] - fOrigin[Z]) <= fRadius[X] ||
        z1 < fRadius[Y] && floatabs(fPos[Y] - fOrigin[Y]) <= fRadius[Y] ||
        c1 < fRadius[X] && floatabs(fPos[X] - fOrigin[X]) <= fRadius[Z] )
        { 
            client_print(0, print_chat, "------> player in circle <---------- ");
        }*/
        
        
client_print(0print_chat"--------------------- ");
        
client_print(0print_chat"Z1: %.1f X1: %.1f C1: %.1f "floatsqroot(z1), floatsqroot(x1), floatsqroot(c1));
        
        const 
iDivides 32
        
static Float:AngleMulScalarAngleMulScalar = (360.0 iDivides);
        static 
Float:fTemp[3], Float:fAngle[3], i,
        
Float:fVector1[3] = { 0.00.00.0 }, Float:fVector2[3] = { 0.00.00.0 }, Float:fStart1[3], Float:fStart2[3];
        
        
xs_vec_set(fAngle0.00.00.0);
        
xs_vec_normalize(fRadiusfAngle);
        
vector_to_angle(fAnglefAngle);
        for(
0<= iDividesi++)
        {
            if(
0)
            {
                
xs_vec_copy(fVector1fStart1);
                
xs_vec_copy(fVector2fStart2);
            }
            
            
angle_vector(fAngleANGLEVECTOR_RIGHTfTemp);
            
xs_vec_mul_scalar(fTempfloatabs(c1), fVector1);
            
xs_vec_mul_scalar(fTemp, -floatabs(c1), fVector2);
            
            
xs_vec_add(fOriginfVector1fVector1);
            
xs_vec_add(fOriginfVector2fVector2);
            
            
xs_vec_mul_scalar(fTempAngleMulScalarfTemp);
            
vector_to_angle(fTempfTemp);
            
fAngle[X] += fTemp[X];
            
fAngle[Y] += fTemp[Y];
            
fAngle[Z] += fTemp[Z];
            if(
0)
            {
                
createline(fStart1fVector1)
                
createline(fStart2fVector2)
            }
        }
        
        
client_print(0print_chat"Rad %.1f | %.1f | %.1f"fRadius[0], fRadius[1], fRadius[2]);
    }
    
    
entity_set_float(idEV_FL_nextthinkget_gametime() + 1.0);



Smilex_Gamer 09-24-2019 13:43

Re: How to create circle
 
Quote:

Originally Posted by Natsheh (Post 2668015)
thanks for replying, actually i did add the sqroot to the equation infact here's the full code...

PHP Code:

/* Plugin generated by AMXX-Studio */

#include <amxmodx>
#include <amxmisc>
#include <engine>
#include <fakemeta>

#define PLUGIN "Health circle"
#define VERSION "1.0"
#define AUTHOR "Natsheh"

new g_sprite;

#define X 0
#define Y 1
#define Z 2

public plugin_precache() g_sprite precache_model("sprites/laserbeam.spr");

public 
plugin_init() {
    
register_plugin(PLUGINVERSIONAUTHOR)
    
    
register_clcmd("amx_health_circle""handler_command"ADMIN_KICK"<rad> <width> <axis x> <axis y> <axis z>");
    
register_clcmd("amx_delete_health_circle""handler_command2"ADMIN_KICK"remove health circle nearby!");
    
register_think("health_circle""brain_work");
}

public 
handler_command2(idlevelcid)
{
    if(!
cmd_access(idlevelcid1)) return 1;
    
    new 
ent = -1target_circle 0Float:wanted_distance 250.0Float:fOrigin[3], Float:fOrigin2[3], Float:z;
    
pev(idpev_originfOrigin);
    while( (
ent find_ent_by_class(ent"health_circle")) > )
    {
        
pev(entpev_originfOrigin2);
        if( (
z=get_distance_f(fOriginfOrigin2)) <= wanted_distance )
        {
            
target_circle entwanted_distance z;
        }
    }
    
    if(
target_circle 0)
    {
        
set_entity_flags(target_circleFL_KILLMEtrue);
        
console_print(id"The health circle nearby was removed!");
    }
    else
    {
        
console_print(id"No health circles were found!");
    }
    return 
1;
}

public 
handler_command(idlevelcid)
{
    if(!
cmd_access(idlevelcid2)) return 1;
    
    new 
szRadius[5], szWidth[5], szAngle_X[5], szAngle_Y[5], szAngle_Z[5];
    
read_argv(1szRadiuscharsmax(szRadius));
    
read_argv(2szWidthcharsmax(szWidth));
    
read_argv(3szAngle_Xcharsmax(szAngle_X));
    
read_argv(4szAngle_Ycharsmax(szAngle_Y));
    
read_argv(5szAngle_Zcharsmax(szAngle_Z));
    
    
remove_quotes(szRadius);
    
remove_quotes(szWidth);
    
remove_quotes(szAngle_X);
    
remove_quotes(szAngle_Y);
    
remove_quotes(szAngle_Z);
    
    new 
ent create_entity("info_target");
    
    if(
ent 0)
    {
        
entity_set_string(entEV_SZ_classname"health_circle");
        
        new 
Float:fAngles[3];
        
        
entity_get_vector(idEV_VEC_originfAngles);
        
entity_set_origin(entfAngles);
        
        
entity_set_int(entEV_INT_iuser4str_to_num(szWidth));
        
entity_set_float(entEV_FL_fuser4floatstr(szRadius));
        
        
fAngles[0] = floatstr(szAngle_X);
        
fAngles[1] = floatstr(szAngle_Y);
        
fAngles[2] = floatstr(szAngle_Z);
        
entity_set_vector(entEV_VEC_anglesfAngles);
        
        
entity_set_int(entEV_INT_solidSOLID_TRIGGER);
        
entity_set_float(entEV_FL_nextthinkget_gametime() + 0.1);
        
console_print(id"Health circle has been created!");
    }
    else
    {
        
console_print(id"Failed to create the health circle!");
    }
    
    return 
1;
}

public 
brain_work(id)
{
    static 
widthFloat:fAngles[3], Float:fRadius[3], Float:fOrigin[3], Float:fWidth[3];
    
pev(idpev_anglesfAngles);
    
pev(idpev_originfOrigin)
    
width pev(idpev_iuser4);
    
pev(idpev_fuser4fRadius[0]);
    
fRadius[1] = fRadius[0];
    
fRadius[2] = fRadius[0];

    static 
g_aPlayers[32], Float:fPos[3], pnumiFloat:z1Float:x1Float:c1;
    
get_players(g_aPlayerspnum"ach");
    for(
0pnumi++)
    {
        
pev(g_aPlayers[i], pev_originfPos);

        
fRadius[X] *= floatcos(fAngles[X], degrees);
        
fRadius[Y] *= floatsin(fAngles[Y], degrees);
        
fRadius[Z] *= floatcos(fAngles[Z], degrees);
        
fWidth[X] = float(width) * floatsin(fAngles[X], degrees);
        
fWidth[Y] = float(width) * floatcos(fAngles[Y], degrees);
        
fWidth[Z] = float(width) * floatsin(fAngles[Y], degrees);
        if(
        (
z1=((fPos[X] - fOrigin[X]) ^ 2.0) + ((fPos[Z] - fOrigin[Z]) ^ 2.0)) - fWidth[X] <= floatpower(fRadius[X],2.0) + fWidth[X]  &&
        (
x1=((fPos[X] - fOrigin[X]) ^ 2.0) + ((fPos[Y] - fOrigin[Y]) ^ 2.0)) - fWidth[Y] <= floatpower(fRadius[Y],2.0) + fWidth[Y] &&
        (
c1=((fPos[Y] - fOrigin[Y]) ^ 2.0) + ((fPos[Z] - fOrigin[Z]) ^ 2.0)) - fWidth[Z] <= floatpower(fRadius[X],2.0) + fWidth[Z])
        { 
            
client_print(0print_chat"------> player in circle <---------- ");
        }
        
        
client_print(0print_chat"--------------------- ");
        
client_print(0print_chat"Z1: %.1f X1: %.1f C1: %.1f "z1x1c1);
        
        
        
message_begin(MSG_ALLSVC_TEMPENTITY)
        
write_byte(TE_BEAMPOINTS)
        
engfunc(EngFunc_WriteCoordfOrigin[X] + fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[Y] + fRadius[Y])
        
engfunc(EngFunc_WriteCoordfOrigin[Z] + fRadius[Z])
        
engfunc(EngFunc_WriteCoordfOrigin[X] - fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[Y] - fRadius[Y])
        
engfunc(EngFunc_WriteCoordfOrigin[Z] - fRadius[Z])
        
write_short(g_sprite
        
write_byte(1
        
write_byte(10
        
write_byte(10
        
write_byte(10
        
write_byte(1
        
write_byte(255)
        
write_byte(0)
        
write_byte(0)
        
write_byte(255)
        
write_byte(1)
        
message_end()
        
        
message_begin(MSG_ALLSVC_TEMPENTITY)
        
write_byte(TE_BEAMPOINTS)
        
engfunc(EngFunc_WriteCoordfOrigin[0] + fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[1] + fRadius[Z])
        
engfunc(EngFunc_WriteCoordfOrigin[2] + fRadius[Y])
        
engfunc(EngFunc_WriteCoordfOrigin[0] - fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[1] - fRadius[Z])
        
engfunc(EngFunc_WriteCoordfOrigin[2] - fRadius[Y])
        
write_short(g_sprite
        
write_byte(1
        
write_byte(10
        
write_byte(10
        
write_byte(10
        
write_byte(1
        
write_byte(0)
        
write_byte(255)
        
write_byte(0)
        
write_byte(255)
        
write_byte(1)
        
message_end()
        
        
message_begin(MSG_ALLSVC_TEMPENTITY)
        
write_byte(TE_BEAMPOINTS)
        
engfunc(EngFunc_WriteCoordfOrigin[0] + fRadius[Y])
        
engfunc(EngFunc_WriteCoordfOrigin[1] + fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[2] + fRadius[Z])
        
engfunc(EngFunc_WriteCoordfOrigin[0] - fRadius[Y])
        
engfunc(EngFunc_WriteCoordfOrigin[1] - fRadius[X])
        
engfunc(EngFunc_WriteCoordfOrigin[2] - fRadius[Z])
        
write_short(g_sprite
        
write_byte(1
        
write_byte(10
        
write_byte(10
        
write_byte(10
        
write_byte(1
        
write_byte(0)
        
write_byte(0)
        
write_byte(255)
        
write_byte(255)
        
write_byte(1)
        
message_end()
        
        
client_print(0print_chat"Rad %.1f | %.1f | %.1f"fRadius[0], fRadius[1], fRadius[2]);
    }
    
    
entity_set_float(idEV_FL_nextthinkget_gametime() + 1.0);



Humm.. what does that do? I tried to understand it but stopped in the middle of brain_work(id).

E1_531G 09-24-2019 13:50

Re: How to create circle
 
You call it "health circe" but you are doing sphere math, so these should help:
https://www.amxmodx.org/api/engine/find_ent_in_sphere
https://www.amxmodx.org/api/engine/find_sphere_class


All times are GMT -4. The time now is 18:08.

Powered by vBulletin®
Copyright ©2000 - 2024, vBulletin Solutions, Inc.