From 76cdc787999489f9f108a52b3ffaf678990d12a6 Mon Sep 17 00:00:00 2001 From: voron00 Date: Tue, 24 Oct 2017 11:13:48 +0300 Subject: [PATCH] add bulletHitEffect() --- functions.hpp | 257 ++++++++++++++++++++++++++++++++++++++++++++++++++ gsc.cpp | 1 + gsc_utils.cpp | 24 +++++ gsc_utils.hpp | 1 + 4 files changed, 283 insertions(+) diff --git a/functions.hpp b/functions.hpp index 3b0ec81..1f6d949 100644 --- a/functions.hpp +++ b/functions.hpp @@ -421,6 +421,236 @@ typedef struct scr_method_s int developer; } scr_method_t; +typedef enum +{ + EV_NONE = 0, + EV_FOOTSTEP_RUN_DEFAULT, + EV_FOOTSTEP_RUN_BARK, + EV_FOOTSTEP_RUN_BRICK, + EV_FOOTSTEP_RUN_CARPET, + EV_FOOTSTEP_RUN_CLOTH, + EV_FOOTSTEP_RUN_CONCRETE, + EV_FOOTSTEP_RUN_DIRT, + EV_FOOTSTEP_RUN_FLESH, + EV_FOOTSTEP_RUN_FOLIAGE, + EV_FOOTSTEP_RUN_GLASS, + EV_FOOTSTEP_RUN_GRASS, + EV_FOOTSTEP_RUN_GRAVEL, + EV_FOOTSTEP_RUN_ICE, + EV_FOOTSTEP_RUN_METAL, + EV_FOOTSTEP_RUN_MUD, + EV_FOOTSTEP_RUN_PAPER, + EV_FOOTSTEP_RUN_PLASTER, + EV_FOOTSTEP_RUN_ROCK, + EV_FOOTSTEP_RUN_SAND, + EV_FOOTSTEP_RUN_SNOW, + EV_FOOTSTEP_RUN_WATER, + EV_FOOTSTEP_RUN_WOOD, + EV_FOOTSTEP_RUN_ASPHALT, + EV_FOOTSTEP_WALK_DEFAULT, + EV_FOOTSTEP_WALK_BARK, + EV_FOOTSTEP_WALK_BRICK, + EV_FOOTSTEP_WALK_CARPET, + EV_FOOTSTEP_WALK_CLOTH, + EV_FOOTSTEP_WALK_CONCRETE, + EV_FOOTSTEP_WALK_DIRT, + EV_FOOTSTEP_WALK_FLESH, + EV_FOOTSTEP_WALK_FOLIAGE, + EV_FOOTSTEP_WALK_GLASS, + EV_FOOTSTEP_WALK_GRASS, + EV_FOOTSTEP_WALK_GRAVEL, + EV_FOOTSTEP_WALK_ICE, + EV_FOOTSTEP_WALK_METAL, + EV_FOOTSTEP_WALK_MUD, + EV_FOOTSTEP_WALK_PAPER, + EV_FOOTSTEP_WALK_PLASTER, + EV_FOOTSTEP_WALK_ROCK, + EV_FOOTSTEP_WALK_SAND, + EV_FOOTSTEP_WALK_SNOW, + EV_FOOTSTEP_WALK_WATER, + EV_FOOTSTEP_WALK_WOOD, + EV_FOOTSTEP_WALK_ASPHALT, + EV_FOOTSTEP_PRONE_DEFAULT, + EV_FOOTSTEP_PRONE_BARK, + EV_FOOTSTEP_PRONE_BRICK, + EV_FOOTSTEP_PRONE_CARPET, + EV_FOOTSTEP_PRONE_CLOTH, + EV_FOOTSTEP_PRONE_CONCRETE, + EV_FOOTSTEP_PRONE_DIRT, + EV_FOOTSTEP_PRONE_FLESH, + EV_FOOTSTEP_PRONE_FOLIAGE, + EV_FOOTSTEP_PRONE_GLASS, + EV_FOOTSTEP_PRONE_GRASS, + EV_FOOTSTEP_PRONE_GRAVEL, + EV_FOOTSTEP_PRONE_ICE, + EV_FOOTSTEP_PRONE_METAL, + EV_FOOTSTEP_PRONE_MUD, + EV_FOOTSTEP_PRONE_PAPER, + EV_FOOTSTEP_PRONE_PLASTER, + EV_FOOTSTEP_PRONE_ROCK, + EV_FOOTSTEP_PRONE_SAND, + EV_FOOTSTEP_PRONE_SNOW, + EV_FOOTSTEP_PRONE_WATER, + EV_FOOTSTEP_PRONE_WOOD, + EV_FOOTSTEP_PRONE_ASPHALT, + EV_JUMP_DEFAULT, + EV_JUMP_BARK, + EV_JUMP_BRICK, + EV_JUMP_CARPET, + EV_JUMP_CLOTH, + EV_JUMP_CONCRETE, + EV_JUMP_DIRT, + EV_JUMP_FLESH, + EV_JUMP_FOLIAGE, + EV_JUMP_GLASS, + EV_JUMP_GRASS, + EV_JUMP_GRAVEL, + EV_JUMP_ICE, + EV_JUMP_METAL, + EV_JUMP_MUD, + EV_JUMP_PAPER, + EV_JUMP_PLASTER, + EV_JUMP_ROCK, + EV_JUMP_SAND, + EV_JUMP_SNOW, + EV_JUMP_WATER, + EV_JUMP_WOOD, + EV_JUMP_ASPHALT, + EV_LANDING_DEFAULT, + EV_LANDING_BARK, + EV_LANDING_BRICK, + EV_LANDING_CARPET, + EV_LANDING_CLOTH, + EV_LANDING_CONCRETE, + EV_LANDING_DIRT, + EV_LANDING_FLESH, + EV_LANDING_FOLIAGE, + EV_LANDING_GLASS, + EV_LANDING_GRASS, + EV_LANDING_GRAVEL, + EV_LANDING_ICE, + EV_LANDING_METAL, + EV_LANDING_MUD, + EV_LANDING_PAPER, + EV_LANDING_PLASTER, + EV_LANDING_ROCK, + EV_LANDING_SAND, + EV_LANDING_SNOW, + EV_LANDING_WATER, + EV_LANDING_WOOD, + EV_LANDING_ASPHALT, + EV_LANDING_PAIN_DEFAULT, + EV_LANDING_PAIN_BARK, + EV_LANDING_PAIN_BRICK, + EV_LANDING_PAIN_CARPET, + EV_LANDING_PAIN_CLOTH, + EV_LANDING_PAIN_CONCRETE, + EV_LANDING_PAIN_DIRT, + EV_LANDING_PAIN_FLESH, + EV_LANDING_PAIN_FOLIAGE, + EV_LANDING_PAIN_GLASS, + EV_LANDING_PAIN_GRASS, + EV_LANDING_PAIN_GRAVEL, + EV_LANDING_PAIN_ICE, + EV_LANDING_PAIN_METAL, + EV_LANDING_PAIN_MUD, + EV_LANDING_PAIN_PAPER, + EV_LANDING_PAIN_PLASTER, + EV_LANDING_PAIN_ROCK, + EV_LANDING_PAIN_SAND, + EV_LANDING_PAIN_SNOW, + EV_LANDING_PAIN_WATER, + EV_LANDING_PAIN_WOOD, + EV_LANDING_PAIN_ASPHALT, + EV_FOLIAGE_SOUND, + EV_STANCE_FORCE_STAND, + EV_STANCE_FORCE_CROUCH, + EV_STANCE_FORCE_PRONE, + EV_STEP_VIEW, + EV_ITEM_PICKUP, + EV_AMMO_PICKUP, + EV_NOAMMO, + EV_EMPTYCLIP, + EV_EMPTY_OFFHAND, + EV_RESET_ADS, + EV_RELOAD, + EV_RELOAD_FROM_EMPTY, + EV_RELOAD_START, + EV_RELOAD_END, + EV_RAISE_WEAPON, + EV_PUTAWAY_WEAPON, + EV_WEAPON_ALT, + EV_PULLBACK_WEAPON, + EV_FIRE_WEAPON, + EV_FIRE_WEAPONB, + EV_FIRE_WEAPON_LASTSHOT, + EV_RECHAMBER_WEAPON, + EV_EJECT_BRASS, + EV_MELEE_SWIPE, + EV_FIRE_MELEE, + EV_PREP_OFFHAND, + EV_USE_OFFHAND, + EV_SWITCH_OFFHAND, + EV_BINOCULAR_ENTER, + EV_BINOCULAR_EXIT, + EV_BINOCULAR_FIRE, + EV_BINOCULAR_RELEASE, + EV_BINOCULAR_DROP, + EV_MELEE_HIT, + EV_MELEE_MISS, + EV_FIRE_WEAPON_MG42, + EV_FIRE_QUADBARREL_1, + EV_FIRE_QUADBARREL_2, + EV_BULLET_TRACER, + EV_SOUND_ALIAS, + EV_SOUND_ALIAS_AS_MASTER, + EV_BULLET_HIT_SMALL, + EV_BULLET_HIT_LARGE, + EV_SHOTGUN_HIT, + EV_BULLET_HIT_AP, + EV_BULLET_HIT_CLIENT_SMALL, + EV_BULLET_HIT_CLIENT_LARGE, + EV_GRENADE_BOUNCE, + EV_GRENADE_EXPLODE, + EV_ROCKET_EXPLODE, + EV_ROCKET_EXPLODE_NOMARKS, + EV_CUSTOM_EXPLODE, + EV_CUSTOM_EXPLODE_NOMARKS, + EV_BULLET, + EV_PLAY_FX, + EV_PLAY_FX_ON_TAG, + EV_EARTHQUAKE, + EV_GRENADE_SUICIDE, + EV_OBITUARY +} entity_event_t; + +typedef enum +{ + TRACE_HITTYPE_NONE = 0x0, + TRACE_HITTYPE_ENTITY = 0x1, + TRACE_HITTYPE_DYNENT_MODEL = 0x2, + TRACE_HITTYPE_DYNENT_BRUSH = 0x3, + TRACE_HITTYPE_GLASS = 0x4 +} TraceHitType; + +typedef struct trace_s +{ + float fraction; + vec3_t normal; + int surfaceFlags; + int contents; + const char *material; + TraceHitType hitType; + u_int16_t hitId; + u_int16_t modelIndex; + u_int16_t partName; + u_int16_t partGroup; + byte allsolid; + byte startsolid; + byte walkable; + byte padding; +} trace_t; + typedef xfunction_t (*Scr_GetFunction_t)(const char** v_function, int* v_developer); #if COD_VERSION == COD2_1_0 static const Scr_GetFunction_t Scr_GetFunction = (Scr_GetFunction_t)0x08115824; @@ -943,4 +1173,31 @@ static const Scr_AddArray_t Scr_AddArray = (Scr_AddArray_t)0x08085298; static const Scr_AddArray_t Scr_AddArray = (Scr_AddArray_t)0x08085364; #endif +typedef int (*G_TempEntity_t)(vec3_t origin, int event); +#if COD_VERSION == COD2_1_0 +static const G_TempEntity_t G_TempEntity = (G_TempEntity_t)0x0811CB34; +#elif COD_VERSION == COD2_1_2 +static const G_TempEntity_t G_TempEntity = (G_TempEntity_t)0x0811EE68; +#elif COD_VERSION == COD2_1_3 +static const G_TempEntity_t G_TempEntity = (G_TempEntity_t)0x0811EFC4; +#endif + +typedef int (*DirToByte_t)(vec3_t dir); +#if COD_VERSION == COD2_1_0 +static const DirToByte_t DirToByte = (DirToByte_t)0x080A1C2A; +#elif COD_VERSION == COD2_1_2 +static const DirToByte_t DirToByte = (DirToByte_t)0x080A3E4A; +#elif COD_VERSION == COD2_1_3 +static const DirToByte_t DirToByte = (DirToByte_t)0x080A3F8E; +#endif + +typedef void (*G_LocationalTrace_t)(trace_t *results, const vec3_t start, const vec3_t end, int passEntityNum, int contentmask); +#if COD_VERSION == COD2_1_0 +static const G_LocationalTrace_t G_LocationalTrace = (G_LocationalTrace_t)0x08108134; +#elif COD_VERSION == COD2_1_2 +static const G_LocationalTrace_t G_LocationalTrace = (G_LocationalTrace_t)0x0810A470; +#elif COD_VERSION == COD2_1_3 +static const G_LocationalTrace_t G_LocationalTrace = (G_LocationalTrace_t)0x0810A5CC; +#endif + #endif diff --git a/gsc.cpp b/gsc.cpp index 0d1b86e..1770aae 100644 --- a/gsc.cpp +++ b/gsc.cpp @@ -232,6 +232,7 @@ scr_function_t scriptFunctions[] = {"sqrt", gsc_utils_sqrt, 0}, {"sqrtInv", gsc_utils_sqrtInv, 0}, {"getlasttestclientnumber", gsc_utils_getlasttestclientnumber, 0}, + {"bullethiteffect", gsc_utils_bullethiteffect, 0}, #endif #if COMPILE_WEAPONS == 1 diff --git a/gsc_utils.cpp b/gsc_utils.cpp index 5688309..822881c 100644 --- a/gsc_utils.cpp +++ b/gsc_utils.cpp @@ -760,4 +760,28 @@ void gsc_utils_getlasttestclientnumber() stackPushInt(*(int *)offset); } +void gsc_utils_bullethiteffect() +{ + vec3_t origin; + vec3_t normal; + + if ( ! stackGetParams("vv", &origin, &normal)) + { + stackError("gsc_utils_bullethiteffect() one or more arguments is undefined or has a wrong type"); + stackPushUndefined(); + return; + } + + int entity = G_TempEntity(origin, EV_SHOTGUN_HIT); + *(int *)(entity + 160) = DirToByte(normal); + + trace_t trace; + + vec3_t end_origin = { origin[0] - (normal[0] * 10), origin[1] - (normal[1] * 10), origin[2] - (normal[2] * 10) }; + G_LocationalTrace(&trace, origin, end_origin, 1023, 1); + *(int *)(entity + 136) = trace.surfaceFlags >> 20; + + stackPushInt(1); +} + #endif diff --git a/gsc_utils.hpp b/gsc_utils.hpp index c58781d..6819383 100644 --- a/gsc_utils.hpp +++ b/gsc_utils.hpp @@ -38,6 +38,7 @@ void gsc_get_configstring(); void gsc_set_configstring(); void gsc_make_localized_string(); void gsc_utils_getlasttestclientnumber(); +void gsc_utils_bullethiteffect(); void gsc_utils_fopen(); void gsc_utils_fread(); void gsc_utils_fwrite();