179 lines
No EOL
9.1 KiB
C++
179 lines
No EOL
9.1 KiB
C++
#ifndef __FXEFFECTS_H_
|
|
#define __FXEFFECTS_H_
|
|
|
|
#include "..\ghoul\ighoul.h"
|
|
#include "q_shared.h"
|
|
#include "q_sh_fx.h"
|
|
#include "game.h"
|
|
|
|
extern game_import_t gi;
|
|
|
|
// For use on FX_MakeDecalBelow
|
|
typedef enum
|
|
{
|
|
FXDECAL_BLOODPOOL = 0,
|
|
FXDECAL_SCORCHMARK,
|
|
FXDECAL_OOZE,
|
|
FXDECAL_PIPELEFT,
|
|
FXDECAL_PUDDLE,
|
|
FXDECAL_WHITESCORCH,
|
|
FXDECAL_SINKPIPE,
|
|
FXDECAL_MAX,
|
|
};
|
|
|
|
void WriteDirExp(vec3_t val);
|
|
|
|
void FX_Init(void);
|
|
|
|
void FX_SetEvent_Data(edict_t *ent, int eventType, int data);
|
|
void FX_SetEvent(edict_t *ent, int eventType);
|
|
void FX_ClearEvent(edict_t *ent);
|
|
|
|
|
|
void FXMSG_WriteRelativePos(edict_t *ent, vec3_t endpos, vec3_t normal, struct mtexinfo_s *surf);
|
|
void FXMSG_WriteRelativePosTR(trace_t &tr);
|
|
void FXMSG_WriteRelativePos_Dir(vec3_t pos, vec3_t dir, edict_t *ignore);
|
|
void FXMSG_WriteRelativePos_TestGround(vec3_t pos, edict_t *ignore);
|
|
|
|
void FX_MakeBarrelExplode(vec3_t pos, edict_t *source);
|
|
void FX_MakeBloodSpray(vec3_t pos, vec3_t splatDir, int vel, int amount, edict_t *source);
|
|
void FX_MakeDecalBelow(vec3_t pos, int type, unsigned int lLifeTime);
|
|
void FX_MakeSparks(vec3_t pos, vec3_t dir, int type);
|
|
void FX_MakeGumballs(vec3_t pos, vec3_t dir, int type);
|
|
void FX_MakeGlob(vec3_t pos, short color, int size);
|
|
void FX_MakeExtinguisherExplode(edict_t *ent, vec3_t dirVel);//, trace_t tr);
|
|
void FX_MakeDustPuff(vec3_t pos);
|
|
void FX_MakeElectricArc(vec3_t pos, int len, vec3_t dir);
|
|
void FX_MakeBulletWhiz(edict_t *ent, vec3_t offset, vec3_t dir, int power, int len);
|
|
void FX_MakeWallDamage(trace_t &tr, vec3_t dir, int size, int markType,int debris);
|
|
void FX_MakeSkyLightning(void);
|
|
void FX_MakeRocketExplosion(edict_t *ent, vec3_t point, int size, vec3_t normal, struct mtexinfo_s *surf);
|
|
void FX_MakeGrenadeExplosion(edict_t *ent, vec3_t point, int size);
|
|
void FX_ThrowDebris(vec3_t origin,vec3_t norm, byte numchunks, byte scale, byte skin,byte x_max,byte y_max,byte z_max, byte surfType);
|
|
void FX_ThrowGlass(vec3_t origin, byte numchunks);
|
|
void FX_C4Explosion(edict_t *ent);
|
|
void FX_Flashpack(vec3_t pos);
|
|
void FX_NeuralPulse(vec3_t pos);
|
|
void FX_MakeAutoGunMuzzleFlash(edict_t *self);
|
|
void FX_StrikeWall(vec3_t spot, byte wallType);
|
|
void FX_BubbleTrail(vec3_t start, vec3_t end);
|
|
void FX_SmokeBurst(vec3_t pos, float size);
|
|
void FX_MakeLine(vec3_t start, vec3_t end, paletteRGBA_t color, int lifetime = 1, int mcastType = MULTICAST_ALL);
|
|
void FX_WallSparks(vec3_t pos, vec3_t dir, float size);
|
|
void FX_Bleed(edict_t *ent, GhoulID boltID, int amount);
|
|
void FX_BloodCloud(edict_t *ent, GhoulID boltID, int amount);
|
|
void FX_HeadExplosion(edict_t *ent, GhoulID boltID);
|
|
void FX_BloodJet(edict_t *ent, vec3_t spot, vec3_t jetDir);
|
|
void FX_HeliGun(edict_t *ent, IGhoulInst *heli, IGhoulInst *muzzle, GhoulID heliToMuzzleBolt, GhoulID muzEnd);
|
|
void FX_WhiteBurn(edict_t *ent);
|
|
void FX_EnemyShot(edict_t *ent, IGhoulInst *gun, byte weapID);
|
|
void FX_WhiteBlast(vec3_t org);
|
|
void FX_MinimiTrail(edict_t *ent);
|
|
void FX_Explosion(vec3_t pos, byte size);
|
|
void FX_VehicleExplosion(vec3_t pos, byte size);
|
|
void FX_SmokePuff(vec3_t pos,byte red,byte green,byte blue,byte alpha);
|
|
void FX_LittleExplosion(vec3_t pos, byte size, byte bSound);
|
|
void FX_MediumExplosion(vec3_t pos, byte size, byte bSound);
|
|
void FX_LargeExplosion(vec3_t pos, byte size, byte bSound);
|
|
void FX_MakeRing(vec3_t pos, short size);
|
|
void FX_PaperCloud(vec3_t vPos, byte nCount/*0 generates random num of papers*/);
|
|
void FX_SodaCans(vec3_t vPos, vec3_t vDir, byte nSpeed, byte nCount/*0 generates random num of cans*/);
|
|
void FX_MakeCoins(vec3_t pos, vec3_t dir, int type);
|
|
void FX_FloorSpace(edict_t *ent);
|
|
void FX_DropDustBits(vec3_t spot, int amount);
|
|
void FX_MakeRicochet(vec3_t vPos);
|
|
void FX_PhoneHit(vec3_t vPos);
|
|
void FX_TrashcanHit(vec3_t vPos);
|
|
void FX_HandleDMShotEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx);
|
|
void FX_HandleDMShotHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx);
|
|
void FX_HandleDMShotBigHitEffects(vec3_t start, vec3_t dir, vec3_t end, edict_t *shooter, int tracerfx, IGhoulInst *gun, int muzzlefx);
|
|
void FX_HandleDMMuzzleFlash(vec3_t start, vec3_t dir, edict_t *shooter, IGhoulInst *gun, int muzzlefx);
|
|
|
|
void FXA_SetRotate(edict_t *targ, vec3_t angVel, IGhoulInst *bolton, IGhoulInst *bolt2 = 0, IGhoulInst *bolt3 = 0, IGhoulInst *bolt4 = 0);
|
|
eft_rotate_t *FXA_GetRotate(edict_t *targ);
|
|
void FXA_RemoveRotate(edict_t *targ);
|
|
|
|
void FXA_SetFadeOut(edict_t *targ, float duration);
|
|
void FXA_SetFadeIn(edict_t *targ, float duration);
|
|
int FXA_CheckFade(edict_t *targ); // Returns false if the object should be removed.
|
|
|
|
|
|
|
|
class CFXSender
|
|
{
|
|
private:
|
|
int sendFlags;
|
|
int flags;
|
|
|
|
short scale;
|
|
byte numElements;
|
|
vec3_t pos2;
|
|
vec3_t dir;
|
|
vec3_t min;
|
|
vec3_t max;
|
|
short lifeTime;
|
|
byte radius;
|
|
|
|
void clear(void);
|
|
void sendData(vec3_t source, multicast_t castType, edict_t *ignoreClient);
|
|
int findEffectID(int effectID, edict_t *ent, GhoulID bolt = 0);
|
|
int findEffectID(char *name, edict_t *ent, GhoulID bolt = 0)
|
|
{findEffectID(gi.effectindex(name), ent, bolt);}
|
|
|
|
public:
|
|
CFXSender(void){flags = 0;}
|
|
// data transmission
|
|
void setScale(float val){assert(val > -256); assert(val < 256); scale = val * 128; flags |= EFF_SCALE;}
|
|
void setNumElements(float val){assert(val >= 0);assert(val < 256); numElements = val; flags |= EFF_NUMELEMS;}
|
|
void setPos2(vec3_t in){VectorCopy(in, pos2); flags |= EFF_POS2;}
|
|
void setDir(vec3_t in){VectorCopy(in, dir); flags |= EFF_DIR;}
|
|
void setMin(vec3_t in){VectorCopy(in, min); flags |= EFF_MIN;}
|
|
void setMax(vec3_t in){VectorCopy(in, max); flags |= EFF_MAX;}
|
|
void setLifetime(float val){assert(val > -256); assert(val < 256); lifeTime = val * 128; flags |= EFF_LIFETIME;}
|
|
void setRadius(float val){assert(val >= 0); assert(val < 256); radius = val; flags |= EFF_RADIUS;}
|
|
void setPos2AsWallEndPoint(void){sendFlags |= EFAT_POSTOWALL;}
|
|
|
|
// burst effects
|
|
void exec(int effectID, vec3_t pos, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0);
|
|
void exec(int effectID, edict_t *ent, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0);
|
|
void exec(int effectID, edict_t *ent, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0);
|
|
void execWithInst(int effectID, edict_t *ent, IGhoulInst *inst, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0);
|
|
void execFromRandomBolt(int effectID, edict_t *ent, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0);
|
|
|
|
void exec(char *name, vec3_t pos, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0)
|
|
{exec(gi.effectindex(name), pos, castType, ignoreClient);}
|
|
void exec(char *name, edict_t *ent, multicast_t castType = MULTICAST_PHS, edict_t *ignoreClient = 0)
|
|
{exec(gi.effectindex(name), ent, castType, ignoreClient);}
|
|
void exec(char *name, edict_t *ent, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0)
|
|
{exec(gi.effectindex(name), ent, bolt, castType, usesAltAxis, ignoreClient);}
|
|
void execWithInst(char *name, edict_t *ent, IGhoulInst *inst, GhoulID bolt, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0)
|
|
{execWithInst(gi.effectindex(name), ent, inst, bolt, castType, usesAltAxis, ignoreClient);}
|
|
void execFromRandomBolt(char *name, edict_t *ent, multicast_t castType = MULTICAST_PHS, int usesAltAxis = 0, edict_t *ignoreClient = 0)
|
|
{execFromRandomBolt(gi.effectindex(name), ent, castType, usesAltAxis, ignoreClient);}
|
|
// continual stuff
|
|
void execContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0, float size = 0);
|
|
void execContinualEffectFromRandomBolt(int effectID, edict_t *ent, float size = 0);
|
|
void stopContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0);
|
|
void editContinualEffect(int effectID, edict_t *ent, GhoulID bolt = 0, float newSize = 0);
|
|
void clearContinualEffects(edict_t *ent);
|
|
float getEffectSizeVal(int effectID, edict_t *ent, GhoulID bolt = 0);
|
|
int hasEffect(int effectID, edict_t *ent, GhoulID bolt = 0);
|
|
|
|
void execContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0, float size = 0)
|
|
{execContinualEffect(gi.effectindex(name), ent, bolt, size);}
|
|
void execContinualEffectFromRandomBolt(char *name, edict_t *ent, float size = 0)
|
|
{execContinualEffectFromRandomBolt(gi.effectindex(name), ent, size);}
|
|
void stopContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0)
|
|
{stopContinualEffect(gi.effectindex(name), ent, bolt);}
|
|
void editContinualEffect(char *name, edict_t *ent, GhoulID bolt = 0, float newSize = 0)
|
|
{editContinualEffect(gi.effectindex(name), ent, bolt, newSize);}
|
|
float getEffectSizeVal(char *name, edict_t *ent, GhoulID bolt = 0)
|
|
{return getEffectSizeVal(gi.effectindex(name), ent, bolt);}
|
|
int hasEffect(char *name, edict_t *ent, GhoulID bolt = 0)
|
|
{return hasEffect(gi.effectindex(name), ent, bolt);}
|
|
|
|
};
|
|
|
|
extern CFXSender fxRunner;
|
|
|
|
#endif |