FL_DUCKING nie wychwytuje tego co chce
Mixtaz
19.10.2023
Próbuje zmodyfikować odrzut gdy gracz w pozycji kucaka zostaje ostrzelany z dowolnej broni. Wprowadziłem kod, który działa ale wykonuje się tylko w momencie gdy gracz wywoła komende będąc na kucaka, inaczej nie przynosi skutku. Poniżej wklejam kod z trzech relewantnych części kodu:
Hook łapiący oddawanie strzału
public bacon_traceattack_player(victim, attacker, Float:damage, Float:direction[3], tracehandle, damagetype) { if(!g_gamestarted) return HAM_SUPERCEDE if(!get_pcvar_num(cvar_knockback) || !(damagetype & DMG_BULLET)) return HAM_IGNORED if(!is_user_connected(attacker) || !g_zombie[victim]) return HAM_IGNORED if(g_kbReduction[victim] == 1.0) return HAM_IGNORED static kbpower kbpower = g_weapon_knockback[get_user_weapon(attacker)] if(kbpower != -1) { static flags flags = pev(victim, pev_flags) if(get_pcvar_num(cvar_knockback_duck) && (isDucking(victim) && (flags & FL_ONGROUND))) return HAM_IGNORED static Float:origins[2][3] pev(victim, pev_origin, origins[0]) pev(attacker, pev_origin, origins[1]) if(get_distance_f(origins[0], origins[1]) <= get_pcvar_float(cvar_knockback_dist)) { static Float:velocity[3] pev(victim, pev_velocity, velocity) static Float:tempvec tempvec = velocity[2] xs_vec_mul_scalar(direction, damage, direction) if(g_kbReduction[victim] == 0.0) xs_vec_mul_scalar(direction, g_knockbackpower[kbpower], direction) else xs_vec_mul_scalar(direction, g_kbReduction[victim]*g_knockbackpower[kbpower], direction) xs_vec_add(direction, velocity, velocity) velocity[2] = tempvec set_pev(victim, pev_velocity, velocity) return HAM_HANDLED } } return HAM_IGNORED }
Funkcja mająca na celu redukcje odrzutu (knockbacku):
public set_user_kbimmunity(id, Float:fReduction, bool:bUserCrouched) { if(bUserCrouched == true) { if(isDucking(id)) g_kbReduction[id] = fReduction; } else g_kbReduction[id] = fReduction; }
Makrodefinicja isDucking:
#define isDucking(%1) (pev(%1, pev_flags) & FL_DUCKING)
deklaracja zmiennej: new Float:g_kbReduction[33];
Jedyny pomysł jaki przychodzi i do głowy to stworzenie enuma, dołączenie go do tablicy i sprawdzanie stanu na jego podstawie.. Ale jak to później wykorzystać jako natyw? Czy może z obecną strukturą zmiennej da się to zrobić?
Robiin
19.10.2023
Za słowa pokroju "relewantny" powinieneś kumpel dostać klapsa od kolegi.
Z zombie plague 4.3:
// Get whether the victim is in a crouch state static ducking ducking = pev(victim, pev_flags) & (FL_DUCKING | FL_ONGROUND) == (FL_DUCKING | FL_ONGROUND) // Zombie knockback when ducking disabled if (ducking && get_pcvar_float(cvar_knockbackducking) == 0.0) return HAM_IGNORED;
W evencie:
RegisterHamFromEntity(Ham_TraceAttack, id, "fw_TraceAttack")
public fw_TraceAttack(victim, attacker, Float:damage, Float:direction[3], tracehandle, damage_type)
A na przykład leap zombie (w tym samym silniku) jest sprawdzany w prethinku przez pobranie przycisków (IN_DUCK)
Użytkownik Robiin edytował ten post 19.10.2023 17:49
Mixtaz
20.10.2023
Niestety @Robiin ale Twój post okazał sie być mało relewantny do mojego problemu
To co ja chce zrobić to za pomocą tej tablicy przechowującej id gracza (tu: g_kbReduction[id]) przekazać go w natywie do innego pluginu. Konkretniej to chcę, aby ta umiejka była dostępna jako jeden z przedmiotów w sklepie. Czyli z biohazard.amxx -> sklep.amxx basically.
Mój kod wyżej działa, ale rejestruje stan gracza czy jest w kucku czy nie, w momencie zakupu. A nie podczas trwania całej umiejętności.. Jedyny pomysł na jaki wpadłem to zrobienie enuma STATE = { STAND, DUCK }, modyfikacja wspomnianej tablicy do: g_kbReduction[33][STATE] i jazda z tym. Ale nie wiem czy to jedyne rozwiązanie.
Mimo to, masz plusa za chęć i próbe pomocy kolego.
PANDA_2zl
20.10.2023
Event
/* * Description: - * Params: (const this) */ RG_CBasePlayer_DuckNatywy
/* * Description: - * Member type: qboolean * Get params: get_pmove(member); * Set params: set_pmove(const PlayerMove:var, value); */ pm_bInDuck /* * Description: - * Member type: int * Get params: get_entvar(index, EntVars:var); * Set params: set_entvar(index, EntVars:var, value); */ var_bInDuckAlbo też bawić z tymi rzeczami z cssdk_const reapi
#define FL_DUCKING (1<<14) // Player flag -- Player is fully crouched #define PFLAG_DUCKING (1<<3) // In the process of ducking, but totally squatted yet