diff --git a/packages/models/weapons/assault/md3.cfg b/packages/models/weapons/assault/md3.cfg index 07716038..d8b71a43 100644 --- a/packages/models/weapons/assault/md3.cfg +++ b/packages/models/weapons/assault/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 8 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 75 +md3emit tag_muzzle HUDMUZZLEFLASH 50 75 diff --git a/packages/models/weapons/assault/world/md2.cfg b/packages/models/weapons/assault/world/md2.cfg index a1a3070e..c2c50a13 100644 --- a/packages/models/weapons/assault/world/md2.cfg +++ b/packages/models/weapons/assault/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 75 +md2emit tag_muzzle MUZZLEFLASH 50 75 diff --git a/packages/models/weapons/carbine/md3.cfg b/packages/models/weapons/carbine/md3.cfg index f9111a21..37d0d167 100644 --- a/packages/models/weapons/carbine/md3.cfg +++ b/packages/models/weapons/carbine/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 50 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 50 +md3emit tag_muzzle HUDMUZZLEFLASH 50 50 diff --git a/packages/models/weapons/carbine/world/md2.cfg b/packages/models/weapons/carbine/world/md2.cfg index 46cfd068..d094a1aa 100644 --- a/packages/models/weapons/carbine/world/md2.cfg +++ b/packages/models/weapons/carbine/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 50 +md2emit tag_muzzle MUZZLEFLASH 50 50 diff --git a/packages/models/weapons/pistol/md3.cfg b/packages/models/weapons/pistol/md3.cfg index 4e30d76b..ea903096 100644 --- a/packages/models/weapons/pistol/md3.cfg +++ b/packages/models/weapons/pistol/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 8 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 25 +md3emit tag_muzzle HUDMUZZLEFLASH 50 25 diff --git a/packages/models/weapons/pistol/world/md2.cfg b/packages/models/weapons/pistol/world/md2.cfg index 30bdea3d..a3f98b50 100644 --- a/packages/models/weapons/pistol/world/md2.cfg +++ b/packages/models/weapons/pistol/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 25 +md2emit tag_muzzle MUZZLEFLASH 50 25 diff --git a/packages/models/weapons/shotgun/md3.cfg b/packages/models/weapons/shotgun/md3.cfg index 14b858e0..62ee5b09 100644 --- a/packages/models/weapons/shotgun/md3.cfg +++ b/packages/models/weapons/shotgun/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 25 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 75 +md3emit tag_muzzle HUDMUZZLEFLASH 50 75 diff --git a/packages/models/weapons/shotgun/world/md2.cfg b/packages/models/weapons/shotgun/world/md2.cfg index a1a3070e..c2c50a13 100644 --- a/packages/models/weapons/shotgun/world/md2.cfg +++ b/packages/models/weapons/shotgun/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 75 +md2emit tag_muzzle MUZZLEFLASH 50 75 diff --git a/packages/models/weapons/sniper/md3.cfg b/packages/models/weapons/sniper/md3.cfg index 1cf72c3e..22e8103a 100644 --- a/packages/models/weapons/sniper/md3.cfg +++ b/packages/models/weapons/sniper/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 50 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 100 +md3emit tag_muzzle HUDMUZZLEFLASH 50 100 diff --git a/packages/models/weapons/sniper/world/md2.cfg b/packages/models/weapons/sniper/world/md2.cfg index 20ff4f36..20bda7fa 100644 --- a/packages/models/weapons/sniper/world/md2.cfg +++ b/packages/models/weapons/sniper/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 100 +md2emit tag_muzzle MUZZLEFLASH 50 100 diff --git a/packages/models/weapons/subgun/md3.cfg b/packages/models/weapons/subgun/md3.cfg index c7210427..a068f966 100644 --- a/packages/models/weapons/subgun/md3.cfg +++ b/packages/models/weapons/subgun/md3.cfg @@ -4,4 +4,4 @@ md3skin hands ../knife/skin_hands.jpg md3anim "gun idle" 0 1 md3anim "gun shoot" 8 8 md3anim "gun reload" 0 1 -md3emit tag_muzzle 10 50 55 +md3emit tag_muzzle HUDMUZZLEFLASH 50 55 diff --git a/packages/models/weapons/subgun/world/md2.cfg b/packages/models/weapons/subgun/world/md2.cfg index db792557..9f7bf5fb 100644 --- a/packages/models/weapons/subgun/world/md2.cfg +++ b/packages/models/weapons/subgun/world/md2.cfg @@ -3,5 +3,5 @@ mdltrans 2 2 24 mdlshadowdist 32 md2tag tag_muzzle X -md2emit tag_muzzle 11 50 55 +md2emit tag_muzzle MUZZLEFLASH 50 55 diff --git a/source/src/bot/botmanager.cpp b/source/src/bot/botmanager.cpp index 1a360c70..b2dd9f41 100644 --- a/source/src/bot/botmanager.cpp +++ b/source/src/bot/botmanager.cpp @@ -286,7 +286,7 @@ void CBotManager::RenderBots() { if (bots[i] && (bots[i] != m_pBotToView)) { - renderclient(bots[i]); + renderclientp(bots[i]); } } } diff --git a/source/src/md2.h b/source/src/md2.h index 1f369921..f96456a0 100644 --- a/source/src/md2.h +++ b/source/src/md2.h @@ -282,6 +282,7 @@ void md2anim(char *anim, int *frame, int *range, float *speed) if(num<0) { conoutf("could not find animation %s", anim); flagmapconfigerror(LWW_MODELERR); return; } loadingmd2->parts.last()->setanim(num, *frame, *range, *speed); } +COMMAND(md2anim, "siif"); void md2tag(char *name, char *vert1, char *vert2, char *vert3, char *vert4) { @@ -321,14 +322,14 @@ void md2tag(char *name, char *vert1, char *vert2, char *vert3, char *vert4) } if(!mdl.gentag(name, indexes, numverts)) { conoutf("could not generate tag %s", name); flagmapconfigerror(LWW_MODELERR); return; } } +COMMAND(md2tag, "sssss"); -void md2emit(char *tag, int *type, int *arg1, int *arg2) +void md2emit(char *tag, char *_type, int *arg1, int *arg2) { if(!loadingmd2 || loadingmd2->parts.empty()) { conoutf("not loading an md2"); flagmapconfigerror(LWW_MODELERR); return; }; + int type = getlistindex(_type, particletypenames, true, -1); + if(type < 0 || type >= MAXPARTYPES) { conoutf("unknown particle type %s", _type); flagmapconfigerror(LWW_MODELERR); return; }; md2::part &mdl = *loadingmd2->parts.last(); - if(!mdl.addemitter(tag, *type, *arg1, *arg2)) { conoutf("could not find tag %s", tag); flagmapconfigerror(LWW_MODELERR); return; } + if(!mdl.addemitter(tag, type, *arg1, *arg2)) { conoutf("could not find tag %s", tag); flagmapconfigerror(LWW_MODELERR); return; } } - -COMMAND(md2anim, "siif"); -COMMAND(md2tag, "sssss"); -COMMAND(md2emit, "siii"); +COMMAND(md2emit, "ssii"); diff --git a/source/src/md3.h b/source/src/md3.h index 067a4be6..076be876 100644 --- a/source/src/md3.h +++ b/source/src/md3.h @@ -262,6 +262,7 @@ void md3load(char *model) mdl.index = loadingmd3->parts.length()-1; if(!mdl.load(path(filename))) { conoutf("could not load %s", filename); flagmapconfigerror(LWW_MODELERR); } // ignore failure } +COMMAND(md3load, "s"); void md3skin(char *objname, char *skin) { @@ -287,6 +288,7 @@ void md3skin(char *objname, char *skin) flagmapconfigerror(LWW_MODELERR); } } +COMMAND(md3skin, "ss"); void md3anim(char *anim, int *startframe, int *range, float *speed) { @@ -295,6 +297,7 @@ void md3anim(char *anim, int *startframe, int *range, float *speed) if(num<0) { conoutf("could not find animation %s", anim); flagmapconfigerror(LWW_MODELERR); return; }; loadingmd3->parts.last()->setanim(num, *startframe, *range, *speed); } +COMMAND(md3anim, "siif"); void md3link(int *parent, int *child, char *tagname) { @@ -302,16 +305,14 @@ void md3link(int *parent, int *child, char *tagname) if(!loadingmd3->parts.inrange(*parent) || !loadingmd3->parts.inrange(*child)) { conoutf("no models loaded to link"); flagmapconfigerror(LWW_MODELERR); return; } if(!loadingmd3->parts[*parent]->link(loadingmd3->parts[*child], tagname)) { conoutf("could not link model %s", loadingmd3->loadname); flagmapconfigerror(LWW_MODELERR); } } +COMMAND(md3link, "iis"); -void md3emit(char *tag, int *type, int *arg1, int *arg2) +void md3emit(char *tag, char *_type, int *arg1, int *arg2) { if(!loadingmd3 || loadingmd3->parts.empty()) { conoutf("not loading an md3"); flagmapconfigerror(LWW_MODELERR); return; }; + int type = getlistindex(_type, particletypenames, true, -1); + if(type < 0 || type >= MAXPARTYPES) { conoutf("unknown particle type %s", _type); flagmapconfigerror(LWW_MODELERR); return; }; md3::part &mdl = *loadingmd3->parts.last(); - if(!mdl.addemitter(tag, *type, *arg1, *arg2)) { conoutf("could not find tag %s", tag); flagmapconfigerror(LWW_MODELERR); return; } + if(!mdl.addemitter(tag, type, *arg1, *arg2)) { conoutf("could not find tag %s", tag); flagmapconfigerror(LWW_MODELERR); return; } } - -COMMAND(md3load, "s"); -COMMAND(md3skin, "ss"); -COMMAND(md3anim, "siif"); -COMMAND(md3link, "iis"); -COMMAND(md3emit, "siii"); +COMMAND(md3emit, "ssii"); diff --git a/source/src/protos.h b/source/src/protos.h index 8ef2ecc4..c43951f6 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -818,7 +818,8 @@ enum PART_EMODEL, PART_ECARROT, PART_ELADDER, - PART_EFLAG + PART_EFLAG, + MAXPARTYPES }; extern void particleinit(); @@ -832,8 +833,8 @@ extern void particle_fireball(int type, const vec &o); extern void addshotline(dynent *d, const vec &from, const vec &to); extern bool addbullethole(dynent *d, const vec &from, const vec &to, float radius = 1, bool noisy = true); extern bool addscorchmark(vec &o, float radius = 7); - extern void render_particles(int time, int typemask = ~0); +extern const char *particletypenames[MAXPARTYPES + 1]; // worldio enum { LWW_ENTATTROVERFLOW = 0x1, LWW_DECODEERR = 0x10, LWW_WORLDERROR = 0x100, LWW_MISSINGMEDIA = 0x1000, LWW_CONFIGERR = 0x10000, LWW_MODELERR = 0x100000, LWW_SCRIPTERR = 0x1000000 }; @@ -907,7 +908,7 @@ extern void preload_entmodels(); extern void preload_hudguns(); extern bool preload_mapmodels(bool trydl = false); extern void renderclients(); -extern void renderclient(playerent *d); +extern void renderclientp(playerent *d); extern void renderclient(playerent *d, const char *mdlname, const char *vwepname, int tex = 0); extern void updateclientname(playerent *d); extern void updatemapmodeldependencies(); diff --git a/source/src/rendermodel.cpp b/source/src/rendermodel.cpp index 5dfb1672..b952f106 100644 --- a/source/src/rendermodel.cpp +++ b/source/src/rendermodel.cpp @@ -1063,7 +1063,7 @@ void updateclientname(playerent *d) d->skin_rvsf = getclientskin(d->name, "_rvsf"); } -void renderclient(playerent *d) +void renderclientp(playerent *d) { if(!d) return; int team = team_base(d->team); @@ -1079,10 +1079,10 @@ void renderclient(playerent *d) formatstring(skin)("%s/custom/%s.jpg", skinbase, cs); else { - if(!m_teammode || !teamdisplaymode) formatstring(skin)("%s/%s/%02i.jpg", skinbase, teamname, skinid); + if(!m_teammode || !teamdisplaymode) formatstring(skin)("%s/%s/%02d.jpg", skinbase, teamname, skinid); else switch(teamdisplaymode) { - case 1: formatstring(skin)("%s/%s/%02i_%svest.jpg", skinbase, teamname, skinid, team ? "blue" : "red"); break; + case 1: formatstring(skin)("%s/%s/%02d_%svest.jpg", skinbase, teamname, skinid, team ? "blue" : "red"); break; case 2: default: formatstring(skin)("%s/%s/%s.jpg", skinbase, teamname, team ? "blue" : "red"); break; } } @@ -1095,8 +1095,8 @@ void renderclient(playerent *d) void renderclients() { playerent *d; - loopv(players) if((d = players[i]) && d->state!=CS_SPAWNING && d->state!=CS_SPECTATE && (!player1->isspectating() || player1->spectatemode != SM_FOLLOW1ST || player1->followplayercn != i)) renderclient(d); - if(player1->state==CS_DEAD || (reflecting && !refracting)) renderclient(player1); + loopv(players) if((d = players[i]) && d->state!=CS_SPAWNING && d->state!=CS_SPECTATE && (!player1->isspectating() || player1->spectatemode != SM_FOLLOW1ST || player1->followplayercn != i)) renderclientp(d); + if(player1->state==CS_DEAD || (reflecting && !refracting)) renderclientp(player1); } void loadallmapmodels() // try to find all mapmodels in packages/models/mapmodels diff --git a/source/src/renderparticles.cpp b/source/src/renderparticles.cpp index efb37a96..845b0436 100644 --- a/source/src/renderparticles.cpp +++ b/source/src/renderparticles.cpp @@ -184,8 +184,6 @@ void cleanupexplosion() } } -#define MAXPARTYPES 20 - struct particle { vec o, d; int fade, type; int millis; particle *next; }; particle *parlist[MAXPARTYPES], *parempty = NULL; @@ -248,7 +246,10 @@ void newparticle(const vec &o, const vec &d, int fade, int type) parlist[type] = p; } -static struct parttype { int type; float r, g, b; int gr, tex; float sz; } parttypes[] = +const char *particletypenames[MAXPARTYPES + 1] = { "SPARK", "SMOKE", "ECLOSEST", "BLOOD", "DEMOTRACK", "FIREBALL", "SHOTLINE", "BULLETHOLE", "BLOODSTAIN", "SCORCH", // 0..9 + "HUDMUZZLEFLASH", "MUZZLEFLASH", "ELIGHT", "ESPAWN", "EAMMO", "EPICKUP", "EMODEL", "ECARROT", "ELADDER", "EFLAG", "" }; // 10..19 + +static struct parttype { int type; float r, g, b; int gr, tex; float sz; } parttypes[MAXPARTYPES] = { { PT_PART, 0.4f, 0.4f, 0.4f, 2, 0, 0.06f }, // yellow: sparks { PT_PART, 1.0f, 1.0f, 1.0f, 20, 1, 0.15f }, // grey: small smoke