Compare commits
3 Commits
39854c0740
...
8b15c59ecd
Author | SHA1 | Date |
---|---|---|
Marco Cawthorne | 8b15c59ecd | |
Marco Cawthorne | 5f126516c6 | |
Marco Cawthorne | 1b6cb974ed |
|
@ -292,7 +292,9 @@ void
|
|||
func_breakable::Explode(void)
|
||||
{
|
||||
vector rp = WorldSpaceCenter();
|
||||
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], GetSurfaceData(SURFDATA_MATERIAL));
|
||||
vector vecDir = vectoangles(rp - g_dmg_vecLocation);
|
||||
|
||||
BreakModel_Spawn(absmin, absmax, [0,0,0], m_flExplodeMag, vlen(size) / 10, GetPropData(PROPINFO_BREAKMODEL));
|
||||
FX_Explosion(rp);
|
||||
Damage_Radius(rp, this, m_flExplodeMag, m_flExplodeRad, TRUE, 0);
|
||||
UseTargets(this, TRIG_TOGGLE, 0.0f); /* delay... ignored. */
|
||||
|
@ -343,7 +345,8 @@ func_breakable::Death(void)
|
|||
if (m_flExplodeMag) {
|
||||
ScheduleThink(Explode, random(0.0f, 0.5f));
|
||||
} else {
|
||||
FX_BreakModel(vlen(size) / 10, absmin, absmax, [0,0,0], GetSurfaceData(SURFDATA_MATERIAL));
|
||||
vector vecDir = vectoangles(WorldSpaceCenter() - g_dmg_vecLocation);
|
||||
BreakModel_Spawn(absmin, absmax, vecDir, g_dmg_iDamage * 2.5, vlen(size) / 10, GetPropData(PROPINFO_BREAKMODEL));
|
||||
Disappear();
|
||||
SetTakedamage(DAMAGE_NO);
|
||||
UseTargets(eActivator, TRIG_TOGGLE, 0.0f);
|
||||
|
|
|
@ -417,6 +417,7 @@ NSGameRules::DamageRadius(vector org, entity attacker, float dmg, float r, int c
|
|||
new_dmg = rint(dmg * diff);
|
||||
|
||||
if (diff > 0) {
|
||||
g_dmg_vecLocation = org;
|
||||
DamageApply(e, attacker, new_dmg, w, DMG_EXPLODE);
|
||||
|
||||
/* approximate, feel free to tweak */
|
||||
|
|
|
@ -21,11 +21,13 @@ NSTraceAttack::_ApplyDamage(void)
|
|||
if (m_eMultiTarget == __NULL__)
|
||||
return;
|
||||
|
||||
if (trace_ent.iBleeds == 1) {
|
||||
/* the location _could_ be more accurate... */
|
||||
if (m_eMultiTarget.iBleeds == 1) {
|
||||
FX_Blood(trace_endpos, [0.5,0,0]);
|
||||
}
|
||||
|
||||
trace_surface_id = m_iMultiBody;
|
||||
g_dmg_vecLocation = trace_endpos;
|
||||
Damage_Apply(m_eMultiTarget, m_eOwner, m_iMultiValue, m_iWeapon, DMG_BULLET);
|
||||
m_eMultiTarget = __NULL__;
|
||||
m_iMultiValue = 0;
|
||||
|
|
|
@ -139,6 +139,7 @@ int g_dmg_iRealDamage;
|
|||
bodyType_t g_dmg_iHitBody;
|
||||
int g_dmg_iFlags;
|
||||
int g_dmg_iWeapon;
|
||||
vector g_dmg_vecLocation;
|
||||
|
||||
var bool g_ents_initialized = FALSE;
|
||||
|
||||
|
|
|
@ -1079,7 +1079,7 @@ NSClientPlayer::Footsteps_Update(void)
|
|||
step_time = time + 0.35;
|
||||
|
||||
//tracebox(origin, PHY_HULL_MIN, PHY_HULL_MAX, origin + [0,0,-48], MOVE_NORMAL, target);
|
||||
traceline(origin + view_ofs, origin + [0,0,-48], FALSE, this);
|
||||
traceline(origin + view_ofs, origin + [0,0,-48], MOVE_NORMAL, this);
|
||||
tex_name = getsurfacetexture(trace_ent, getsurfacenearpoint(trace_ent, trace_endpos));
|
||||
|
||||
if (!(GetFlags() & FL_ONGROUND) && (!GetFlags() & FL_ONLADDER)) {
|
||||
|
|
|
@ -123,7 +123,6 @@ int g_breakmodel_count;
|
|||
var hashtable g_hashbreakmodel;
|
||||
|
||||
void BreakModel_Spawn(vector pos, vector dir, vector spread, float speed, int count, string type);
|
||||
void BreakModel_SpawnUnit(vector pos, vector dir, vector spread, float speed, string type);
|
||||
|
||||
/* necessary API functions */
|
||||
//void BreakModel_Init(void);
|
||||
|
|
|
@ -470,7 +470,7 @@ BreakModel_Spawn(vector smins, vector smaxs, vector dir, float speed, int count,
|
|||
index = (int)hash_get(g_hashbreakmodel, type, -1);
|
||||
|
||||
if (index < 0) {
|
||||
crossprint(sprintf("^1 BreakModel_Spawn: type %s is not defined\n", type));
|
||||
crossprint(sprintf("^1BreakModel_Spawn: type %s is not defined\n", type));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -481,8 +481,10 @@ BreakModel_Spawn(vector smins, vector smaxs, vector dir, float speed, int count,
|
|||
vector endpos;
|
||||
string mname;
|
||||
float fadetime;
|
||||
entity gib;
|
||||
NSRenderableEntity gib;
|
||||
int r;
|
||||
int p;
|
||||
int bodygroup = 0;
|
||||
|
||||
/* pick a model between 0 and num) */
|
||||
r = floor(random(0, modelcount));
|
||||
|
@ -490,81 +492,37 @@ BreakModel_Spawn(vector smins, vector smaxs, vector dir, float speed, int count,
|
|||
/* two entries, always have to skip by 2 */
|
||||
mname = argv((r * 2));
|
||||
fadetime = stof(argv((r * 2) + 1));
|
||||
p = tokenizebyseparator(mname, "#");
|
||||
|
||||
/* special char # detected to designate model submodel count */
|
||||
if (p == 2) {
|
||||
mname = argv(0);
|
||||
bodygroup = (int)floor(random(0, stof(argv(1)) + 1));
|
||||
}
|
||||
|
||||
endpos[0] = smins[0] + ( random() * ( smaxs[0] - smins[0] ) );
|
||||
endpos[1] = smins[1] + ( random() * ( smaxs[1] - smins[1] ) );
|
||||
endpos[2] = smins[2] + ( random() * ( smaxs[2] - smins[2] ) );
|
||||
|
||||
gib = spawn();
|
||||
setmodel(gib, mname);
|
||||
setsize(gib, [0,0,0], [0,0,0]);
|
||||
setorigin(gib, endpos);
|
||||
gib = spawn(NSRenderableEntity);
|
||||
gib.SetModel(mname);
|
||||
gib.SetBody(bodygroup);
|
||||
gib.SetSize([0,0,0], [0,0,0]);
|
||||
gib.SetOrigin(endpos);
|
||||
makevectors(dir);
|
||||
gib.velocity = (v_forward * speed) * 0.75;
|
||||
gib.velocity[0] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.velocity[1] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.velocity[2] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.avelocity = vectoangles(gib.velocity);
|
||||
gib.movetype = MOVETYPE_BOUNCE;
|
||||
gib.think = Util_Destroy;
|
||||
gib.nextthink = time + fadetime;
|
||||
gib.SetAngularVelocity(vectoangles(gib.velocity));
|
||||
gib.SetMovetype(MOVETYPE_BOUNCE);
|
||||
gib.ScheduleThink(Util_Destroy, fadetime);
|
||||
|
||||
#ifdef CLIENT
|
||||
gib.drawmask = MASK_ENGINE;
|
||||
#endif
|
||||
|
||||
/* re-calculate the tokenization */
|
||||
x = tokenize(g_breakmodel[index].data);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
BreakModel_SpawnUnit(vector smins, vector smaxs, vector dir, float speed, string type)
|
||||
{
|
||||
int index;
|
||||
index = (int)hash_get(g_hashbreakmodel, type, -1);
|
||||
|
||||
if (index < 0) {
|
||||
crossprint(sprintf("^1 BreakModel_Spawn: type %s is not defined\n", type));
|
||||
return;
|
||||
}
|
||||
|
||||
float x = tokenize(g_breakmodel[index].data);
|
||||
int modelcount = x / 2;
|
||||
|
||||
for (int i = 0; i < modelcount; i++) {
|
||||
vector endpos;
|
||||
string mname;
|
||||
float fadetime;
|
||||
entity gib;
|
||||
int r;
|
||||
|
||||
/* pick a model between 0 and num) */
|
||||
r = i;
|
||||
|
||||
/* two entries, always have to skip by 2 */
|
||||
mname = argv((r * 2));
|
||||
fadetime = stof(argv((r * 2) + 1));
|
||||
|
||||
endpos[0] = smins[0] + ( random() * ( smaxs[0] - smins[0] ) );
|
||||
endpos[1] = smins[1] + ( random() * ( smaxs[1] - smins[1] ) );
|
||||
endpos[2] = smins[2] + ( random() * ( smaxs[2] - smins[2] ) );
|
||||
|
||||
gib = spawn();
|
||||
setmodel(gib, mname);
|
||||
setsize(gib, [0,0,0], [0,0,0]);
|
||||
setorigin(gib, endpos);
|
||||
makevectors(dir);
|
||||
gib.velocity = (v_forward * speed) * 0.75;
|
||||
gib.velocity[0] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.velocity[1] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.velocity[2] += (random() - 0.5) * (speed * 0.25);
|
||||
gib.avelocity = vectoangles(gib.velocity);
|
||||
gib.movetype = MOVETYPE_BOUNCE;
|
||||
gib.think = Util_Destroy;
|
||||
gib.nextthink = time + fadetime;
|
||||
|
||||
#ifdef CLIENT
|
||||
gib.drawmask = MASK_ENGINE;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in New Issue