Colisión con entidad.
#1
Información 
Hola, como puedo hacer para detectar si entre o salí de una entidad ejemplo la "aura shield", en realidad necesito es saber si la persona que estaba dentro salió. Por ahí leí un pos que decía que con un think a la entidad pero no supe usarlo.
Responder
#2
(13/01/2020, 02:10 PM)luxor xD escribió: Hola, como puedo hacer para detectar si entre o salí de una entidad ejemplo la "aura shield", en realidad necesito es saber si la persona que estaba dentro salió. Por ahí leí un pos que decía que con un think a la entidad pero no supe usarlo.

Una de dos, usas find_sphere(se usa en bubbles etc), o sino, un trigger, una entidad sin model.

(Un ejemplo)
https://amxmodx-es.com/Thread-Entity-Com...ble-SOLIDA
Responder
#3
Gracias revisare a ver que tal me va con eso.
Responder
#4
No logre mi cometido, logre que detectara la colisión y todo eso lo que no logro hacer y es lo que en realidad necesito es que una variable esté en true mientras esté dentro de la entidad y falso si no está dentro pero no logro hacerlo...
Responder
#5
(14/01/2020, 08:49 PM)luxor xD escribió: No logre mi cometido, logre que detectara la colisión y todo eso lo que no logro hacer y es lo que en realidad necesito es que una variable esté en true mientras esté dentro de la entidad y falso si no está dentro pero no logro hacerlo...

Pero es simple, toca, true, sino toca false.

Ahora si es una area redonda, find sphere, regulas el tamaño ylo mismo, si esta adentro true, y si esta fuera false.

Qué es lo que querés exactamente q no te sirve esto?
Responder
#6
Si pero no lo se hacer osea no se como ponerla en una sentencia que diga si salió porque me detecta es cuando entra trate de setear el false cuando tocará otra entidad ejemplo el suelo, pero entonces tendría que saltar y si saltó dentro del aura se pone false y luego true y se hace un bucle.

Necesito algo como un
if(entro)
Var = true
Else
If(Var == true)
Var = false
Responder
#7
https://forums.alliedmods.net/showpost.p...ostcount=6
o
https://www.amxmodx.org/api/engine/find_ent_in_sphere
[Imagen: 76561198095047868.png]
Responder
#8
(14/01/2020, 11:11 PM)luxor xD escribió: Si pero no lo se hacer osea no se como ponerla en una sentencia que diga si salió porque me detecta es cuando entra trate de setear el false cuando tocará otra entidad ejemplo el suelo, pero entonces tendría que saltar y si saltó dentro del aura se pone false y luego true y se hace un bucle.

Necesito algo como un
if(entro)
Var = true
Else
If(Var == true)
Var = false

Aver decime que mierda querés que haga ese aura shield y que seria y te hago el code, explicas para el qlo y no entiendo xdxd
Responder
#9
(14/01/2020, 11:40 PM)Skylar escribió: https://forums.alliedmods.net/showpost.p...ostcount=6
o
https://www.amxmodx.org/api/engine/find_ent_in_sphere
Gracias intentaré con este, creo que es lo que busco..

Quiero que cuando esté en el aura sea inmune al efecto de varios ítems ejemplo, bomba de infección, disparo de infección, veneno y eso...
Responder
#10
(15/01/2020, 02:00 PM)luxor xD escribió:
(14/01/2020, 11:40 PM)Skylar escribió: https://forums.alliedmods.net/showpost.p...ostcount=6
o
https://www.amxmodx.org/api/engine/find_ent_in_sphere
Gracias intentaré con este, creo que es lo que busco..

Quiero que cuando esté en el aura sea inmune al efecto de varios ítems ejemplo, bomba de infección, disparo de infección, veneno y eso...

Aver pasame una foto del model/aura o lo q sea... (pasame el link al mp asi te lo hago d1)
Responder
#11
No existe forma de detectar colisiones esféricas en goldsrc, en cambio:

Se puede hacer un método aproximado o calculado in-line.

Un método aproximado sería básicamente ajustar un tiempo en cada think posible de la entidad por cada jugador dentro de ella (en código, think sin delay de una entidad, cada player en su radio se le hace refresh a un timer)

Código PHP:
new g_flLastBubbleTouchTime[33]

SetLastBubbleTouchTime(iId) { g_flLastBubbleTouchTime[iId] = get_gametime(); }
bool:PlayerInsideBubble(iIdFloat:flDelta 0.1) { return (get_gametime() - g_flLastBubbleTouchTime[iId]) <= flDelta; } 

Un método directo o in-line sería anteponer en cada efecto que desees (explosión de bomba infección por ej) el check si es que está dentro de una entidad por frame. Hay bastantes formas de optimizar este proceso (ej: cachear los origins de todos los bubbles en el frame específico donde revienta una bomba, y preguntar player por player si su distancia a algún bubble cacheado está en el rango de su radio). Ya dejé la idea así que algún erudito que la programe por que me da tremenda paja Gran sonrisa
Responder
#12
Solo entendí una parte, osea que antes de setear la infección o el veneno, debo hacer un check si el jugador está dentro de un aura no?... y como podría verificar eso desde una función? Ya que por lo que veo el think funciona como un ciclo paralelo que se ejecuta siempre en todo el juego...
Responder
#13
pasa todo el codigo de tu aura
[Imagen: b_350_20_323957_202743_f19a15_111111.png]

Estudia siempre; el tiempo es oro, lo material se puede recuperar pero el tiempo no se puede recuperar.
(02/10/2016, 05:05 PM)meTaLiCroSS escribió: Siempre me gusta ayudar cuando alguien esta interesado realmente en ver que esta programando.
(08/08/2019, 05:32 PM)meTaLiCroSS escribió: grax x el dato cr4ck


Mis aportes

PLUGINS
MAPAS
Menú LANG [SF] Sistema de Frags
Say System (Admin Prefix)
Responder
#14
Ya viene integrado al código del zp 4.3, pero sacaré lo que tenga que ver con eso, disculpa si me tardo un poco.

AQUI ESTA ESTO.
Código PHP:
new g_aurashield_grenade[256// aura shield grenade entity
new g_aurashield_health[256// aura shield health

// Aura Shield Grenade Explosion
aurashield_explode(entityowner)
{
    
// Get origin
    
static Float:originF[3]
    
pev(entitypev_originoriginF)
    
    
// Make the explosion
    
create_blast4(originF)
    
    
// Owner killed or infected?
    
if (!is_user_valid_alive(owner) || g_class[owner] >= ZOMBIE)
    {
        
// Get rid of the grenade
        
engfunc(EngFunc_RemoveEntityentity)
        return;
    }
    
    
// Collisions
    
static victim
    victim 
= -1
    
    
while ((victim engfunc(EngFunc_FindEntityInSpherevictimoriginFNADE_EXPLOSION_RADIUS)) != 0)
    {
        
// Only effect alive non-spawnprotected zombies
        
if (!is_user_valid_alive(victim) || (g_class[victim] < ZOMBIE || g_class[victim] >= NEMESIS) || g_nodamage[victim])
            continue;
        
        
// Get victim origin
        
static Float:vic_origin[3]
        
pev(victimpev_originvic_origin)
        
        for (new 
03i++)
        {
            
vic_origin[i] -= originF[i]
            
vic_origin[i] *= 10.0 // don't change!!
        
}
        
        
// Can't stay into aurashield
        
set_pev(victimpev_velocityvic_origin)
    }
    
    
// Create entity
    
new ent create_entity("info_target")
    
    
// Set aurashield's owner and grenade entity
    
set_pev(entpev_ownerowner)
    
g_aurashield_grenade[ent] = entity
    
    
// Set origin
    
entity_set_vector(entEV_VEC_originoriginF)
    
    
// Set entity classname and model
    
entity_set_string(entEV_SZ_classname"forze_camp")
    
entity_set_model(entmodel_aura_forzecamp)
    
    
// Set entity health
    
g_aurashield_health[ent] = get_pcvar_num(cvar_aurashieldhealth)
    
    
// Set entity solid
    
entity_set_int(entEV_INT_solidSOLID_TRIGGER)
    
    
// Set entity size
    
static Float:mins[3] = {-90.0, -90.0, -90.0}
    static 
Float:maxs[3] = {90.090.090.0}
    
entity_set_size(entminsmaxs)
    
    
// Random glow color
    
static GlowColor[3]
    for (new 
03i++) GlowColor[i] = random_num(0255)
    
    
// Give it a glow
    
set_rendering(entkRenderFxGlowShellGlowColor[0], GlowColor[1], GlowColor[2], kRenderTransAlpha16)
}

// Remove Aura Shield & Chest Entity
remove_aurashield_chest(entaurashield)
{
    if (!
is_valid_ent(ent)) return;
    
    
// Only for aurashield
    
if (aurashield)
    {
        if (
is_valid_ent(g_aurashield_grenade[ent]))
        {
            
// Remove aura shield light
            
set_pev(g_aurashield_grenade[ent], pev_effectspev(entpev_effects) &~ EF_BRIGHTLIGHT)
    
            
// Remove grenade entity
            
engfunc(EngFunc_RemoveEntityg_aurashield_grenade[ent])
        }
    }
    
    
// Remove entity
    
engfunc(EngFunc_RemoveEntityent)
}

// Forward Touch
public fw_Touch(enttoucher)
{
    
// Get entity classname
    
static classname[15]
    
entity_get_string(entEV_SZ_classnameclassnamecharsmax(classname))
    
    
// Prevent server crash if entity's private data not initalized
    
if (pev_valid(ent) != PDATA_SAFE)
        return 
FMRES_IGNORED;
        
    
// Valid user alive?
    
if (!is_user_valid_alive(toucher)) return FMRES_IGNORED;
    
    
// Check entity type
    
if (equal(classname"weaponbox"))
    {
        
// Don't pickup weapons if zombie, survivor or wesker (+PODBot MM fix)
        
if (g_class[toucher] >= ZOMBIE || ((g_class[toucher] == SURVIVOR || g_class[toucher] == WESKER) && !g_isbot[toucher]))
            return 
FMRES_SUPERCEDE;
        
        
// Don't check weapon level
        
if (get_pcvar_num(cvar_randweapons) || get_user_flags(toucher) & g_access_flag[ACCESS_WEAPONS_FREE])
            return 
FMRES_IGNORED;
        
        
// Get weapon's id and name
        
static weaponidwname[32], wname2[32]
        
weaponid cs_get_weaponbox_id(ent)
        if (
weaponidget_weaponname(weaponidwnamecharsmax(wname))
        else return 
FMRES_IGNORED;
    
        
// Primary or secondary weapon
        
if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM)
        {
            for (new 
0WPN_MAXIDSi++)
            {
                
ArrayGetString(g_primary_itemsiwname2charsmax(wname))
                if (
equal(wnamewname2))
                {
                    
// Don't pickup weapons if don't have the required level
                    
if (g_level[toucher] == ArrayGetCell(g_primary_levelsi))
                        return 
FMRES_SUPERCEDE;
                    else
                        return 
FMRES_IGNORED;
                }
            }
        }
        else if ((
1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM)
        {
            for (new 
0ArraySize(g_secondary_items); i++)
            {
                
ArrayGetString(g_secondary_itemsiwname2charsmax(wname))
                if (
equal(wnamewname2))
                {
                    
// Don't pickup weapons if don't have the required level
                    
if (g_level[toucher] == ArrayGetCell(g_secondary_levelsi))
                        return 
FMRES_SUPERCEDE;
                    else
                        return 
FMRES_IGNORED;
                }
            }
        }
    }
    else if (
equal(classname"armoury_entity") || equal(classname"weapon_shield"))
    {
        
// Never pickup
        
return FMRES_SUPERCEDE;
    }
    else if (
equal(classname"forze_camp"))
    {
        
// Human/Nemesis/Alien/Zombie madness don't affect
        
if (g_class[toucher] < ZOMBIE || g_class[toucher] >= NEMESIS || g_nodamage[toucher])
            return 
FMRES_IGNORED;
    
        
// Get entity and toucher origin
        
static Float:ent_origin[3], Float:tou_origin[3]
        
pev(entpev_originent_origin)
        
pev(toucherpev_origintou_origin)
        
        for (new 
03i++)
        {
            
tou_origin[i] -= ent_origin[i]
            
tou_origin[i] *= 6.0
        
}
        
        
// Can't go into aurashield
        
set_pev(toucherpev_velocitytou_origin)
        
        
// Get aurashield damage cvar
        
static damagedamage get_pcvar_num(cvar_aurashielddamage)
        
        
// Instantly remove/Aura Shield received damage
        
if (g_aurashield_health[ent] - damage <= 0)
            
remove_aurashield_chest(ent1)
        else
            
g_aurashield_health[ent] -= damage
    
}
    else if (
equal(classname"chest"))
    {
        
// Instantly remove
        
remove_aurashield_chest(ent0)
        
        
// Give point random
        
new randompointpoints
        randompoint 
random_num(01)
        
points random_num(06)
    
        
g_points[toucher][randompoint] += points
        zp_colored_print
(toucher"^x04[ZA]^x01 Has recogido un cofre, obtienes ^x04%d Punto%s %s^x01!"pointspoints "s" ""randompoint == "Humano" "Zombie")
    }
    
    return 
FMRES_IGNORED;

Responder
#15
Lo que dice meTaLiCroSS traducido al castellano y cristiano

1. Tienes que crearte una macro para comparar tiempos (#define dentro_aura(%1) (x[%1]>=get_gametime())

2. Registrar el forward touch y dentro de él obtener el classname "forze_camp". Dentro de la sección tienes que permitir QUÉ equipo puede entrar en tu aura. Si entra x = get_gametime()+1.0.

3. Registrar una tarea global (esto te lo aconsejo para que no haga el bucle que te explico en el punto 4 dentro del playerThink, es innecesario y sobrecarga el servidor)

4. En el callback de esa función un bucle for(int i = 1; ...) para recorrer los jugadores y checkear dentro_aura(i)

Resumiendo, lo que hará todo esto es que si estas dentro de tu aura, en otras palabras, si estas TOCANDO el aura, estarás dentro si no la tocas estarás fuera.

Código PHP:
#include <amxmodx>
#include <cstrike>
#include <fakemeta>

new Float:x[33]
#define dentro_aura(%1) (x[%1] >= get_gametime())

public plugin_init() {
    
register_forward(FM_Touch"fw_Touch")
    
set_task(1.0"check_isplayerinaura"___"b")


public 
fw_Touch(enttoucher)
{
    if (
equal(classname ,"forze_camp")) {
        if ((
cs_get_user_team(toucher) == CS_TEAM_CT))
        {
            
x[toucher] = get_gametime()+1.0
            
return FMRES_IGNORED
        
}
    }
    return 
FMRES_IGNORED
}

public 
check_isplayerinaura()
{
    for (new 
1<= 32i++)
    {
        if (
dentro_aura(i))
        {
            
client_print(iprint_chat"Dentro del aura")
        }
        else
        {
            
client_print(iprint_chat"Fuera del aura")
        }
    }

Responder
#16
Muchas gracias, voy a probarlo Excitedeyes
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)