Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
13/01/2020, 02:10 PM
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.
Mensajes: 1,342
Temas: 21
Registro en: Jun 2015
Reputación:
9
13/01/2020, 07:24 PM
(Última modificación: 13/01/2020, 07:26 PM por Pan Bimbo (?. Edited 3 times in total.)
(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
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
Gracias revisare a ver que tal me va con eso.
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
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...
Mensajes: 1,342
Temas: 21
Registro en: Jun 2015
Reputación:
9
(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?
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
14/01/2020, 11:11 PM
(Última modificación: 14/01/2020, 11:15 PM por luxor xD. Edited 1 time in total.)
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
Mensajes: 3,238
Temas: 47
Registro en: Feb 2015
Reputación:
34
Mensajes: 1,342
Temas: 21
Registro en: Jun 2015
Reputación:
9
(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
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
15/01/2020, 02:00 PM
(Última modificación: 15/01/2020, 02:02 PM por luxor xD. Edited 1 time in total.)
(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...
Mensajes: 1,342
Temas: 21
Registro en: Jun 2015
Reputación:
9
15/01/2020, 10:22 PM
(Última modificación: 15/01/2020, 10:23 PM por Pan Bimbo (?. Edited 1 time in total.)
(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)
Mensajes: 3,466
Temas: 18
Registro en: Oct 2013
Reputación:
54
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(iId, Float: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
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
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...
Mensajes: 4,247
Temas: 94
Registro en: Mar 2014
Reputación:
58
pasa todo el codigo de tu aura
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
PLUGINSMAPAS
Menú LANG
[SF] Sistema de Frags
Say System (Admin Prefix)
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
17/01/2020, 04:45 PM
(Última modificación: 17/01/2020, 04:55 PM por luxor xD. Edited 2 times in total.)
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(entity, owner) { // Get origin static Float:originF[3] pev(entity, pev_origin, originF) // 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_RemoveEntity, entity) return; } // Collisions static victim victim = -1 while ((victim = engfunc(EngFunc_FindEntityInSphere, victim, originF, NADE_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(victim, pev_origin, vic_origin) for (new i = 0; i < 3; i++) { vic_origin[i] -= originF[i] vic_origin[i] *= 10.0 // don't change!! } // Can't stay into aurashield set_pev(victim, pev_velocity, vic_origin) } // Create entity new ent = create_entity("info_target") // Set aurashield's owner and grenade entity set_pev(ent, pev_owner, owner) g_aurashield_grenade[ent] = entity // Set origin entity_set_vector(ent, EV_VEC_origin, originF) // Set entity classname and model entity_set_string(ent, EV_SZ_classname, "forze_camp") entity_set_model(ent, model_aura_forzecamp) // Set entity health g_aurashield_health[ent] = get_pcvar_num(cvar_aurashieldhealth) // Set entity solid entity_set_int(ent, EV_INT_solid, SOLID_TRIGGER) // Set entity size static Float:mins[3] = {-90.0, -90.0, -90.0} static Float:maxs[3] = {90.0, 90.0, 90.0} entity_set_size(ent, mins, maxs) // Random glow color static GlowColor[3] for (new i = 0; i < 3; i++) GlowColor[i] = random_num(0, 255) // Give it a glow set_rendering(ent, kRenderFxGlowShell, GlowColor[0], GlowColor[1], GlowColor[2], kRenderTransAlpha, 16) }
// Remove Aura Shield & Chest Entity remove_aurashield_chest(ent, aurashield) { 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_effects, pev(ent, pev_effects) &~ EF_BRIGHTLIGHT) // Remove grenade entity engfunc(EngFunc_RemoveEntity, g_aurashield_grenade[ent]) } } // Remove entity engfunc(EngFunc_RemoveEntity, ent) }
// Forward Touch public fw_Touch(ent, toucher) { // Get entity classname static classname[15] entity_get_string(ent, EV_SZ_classname, classname, charsmax(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 weaponid, wname[32], wname2[32] weaponid = cs_get_weaponbox_id(ent) if (weaponid) get_weaponname(weaponid, wname, charsmax(wname)) else return FMRES_IGNORED; // Primary or secondary weapon if ((1<<weaponid) & PRIMARY_WEAPONS_BIT_SUM) { for (new i = 0; i < WPN_MAXIDS; i++) { ArrayGetString(g_primary_items, i, wname2, charsmax(wname)) if (equal(wname, wname2)) { // Don't pickup weapons if don't have the required level if (g_level[toucher] == ArrayGetCell(g_primary_levels, i)) return FMRES_SUPERCEDE; else return FMRES_IGNORED; } } } else if ((1<<weaponid) & SECONDARY_WEAPONS_BIT_SUM) { for (new i = 0; i < ArraySize(g_secondary_items); i++) { ArrayGetString(g_secondary_items, i, wname2, charsmax(wname)) if (equal(wname, wname2)) { // Don't pickup weapons if don't have the required level if (g_level[toucher] == ArrayGetCell(g_secondary_levels, i)) 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(ent, pev_origin, ent_origin) pev(toucher, pev_origin, tou_origin) for (new i = 0; i < 3; i++) { tou_origin[i] -= ent_origin[i] tou_origin[i] *= 6.0 } // Can't go into aurashield set_pev(toucher, pev_velocity, tou_origin) // Get aurashield damage cvar static damage; damage = get_pcvar_num(cvar_aurashielddamage) // Instantly remove/Aura Shield received damage if (g_aurashield_health[ent] - damage <= 0) remove_aurashield_chest(ent, 1) else g_aurashield_health[ent] -= damage } else if (equal(classname, "chest")) { // Instantly remove remove_aurashield_chest(ent, 0) // Give point random new randompoint, points randompoint = random_num(0, 1) points = random_num(0, 6) g_points[toucher][randompoint] += points zp_colored_print(toucher, "^x04[ZA]^x01 Has recogido un cofre, obtienes ^x04%d Punto%s %s^x01!", points, points > 1 ? "s" : "", randompoint == 0 ? "Humano" : "Zombie") } return FMRES_IGNORED; }
Mensajes: 115
Temas: 32
Registro en: Jan 2014
Reputación:
0
18/01/2020, 12:13 AM
(Última modificación: 18/01/2020, 01:31 PM por kryder11. Edited 19 times in total.)
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(ent, toucher) { 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 i = 1; i <= 32; i++) { if (dentro_aura(i)) { client_print(i, print_chat, "Dentro del aura") } else { client_print(i, print_chat, "Fuera del aura") } } }
Mensajes: 369
Temas: 64
Registro en: Feb 2017
Reputación:
2
Muchas gracias, voy a probarlo
|