if(this.solid == SOLID_BSP) // in case a misc_follow moved me, save the current origin first
this.dropped_origin = this.origin;
+ this.solid = SOLID_NOT; // before setorigin/_setmodel to prevent area grid linking
+
if(this.mdl_dead == "")
+ {
+ setorigin (this, this.origin); // unlink
this.effects |= EF_NODRAW;
+ }
else {
if (this.origin == '0 0 0') { // probably no origin brush, so don't spawn in the middle of the map..
floorZ = this.absmin.z;
ApplyMinMaxScaleAngles(this);
this.effects &= ~EF_NODRAW;
}
-
- this.solid = SOLID_NOT;
}
void func_breakable_look_restore(entity this)
{
+ this.solid = SOLID_BSP; // before _setmodel/setorigin to ensure area grid linking
+
_setmodel(this, this.mdl);
ApplyMinMaxScaleAngles(this);
this.effects &= ~EF_NODRAW;
if(this.mdl_dead != "") // only do this if we use mdl_dead, to behave better with misc_follow
setorigin(this, this.dropped_origin);
-
- this.solid = SOLID_BSP;
}
void func_breakable_behave_destroyed(entity this)
if (this.antiwall_flag == 1)
{
this.inactive = 1;
- this.solid = SOLID_NOT;
+ if (this.solid != SOLID_NOT)
+ {
+ this.solid = SOLID_NOT;
+ setorigin(this, this.origin); // unlink
+ }
}
else if (this.antiwall_flag == 2)
{
this.inactive = 0;
- this.solid = this.default_solid;
+ if (this.solid != this.default_solid)
+ {
+ this.solid = this.default_solid;
+ setorigin(this, this.origin); // link
+ }
}
g_clientmodel_setcolormaptoactivator(this, actor, trigger);
}
{
if(ent.geomtype && autocvar_physics_ode && checkextension("DP_PHYSICS_ODE")) set_movetype(ent, MOVETYPE_PHYSICS);
if(!ent.scale) ent.scale = ent.modelscale;
- SetBrushEntityModel(ent,true);
- ent.use = g_model_setcolormaptoactivator;
- InitializeEntity(ent, g_model_dropbyspawnflags, INITPRIO_DROPTOFLOOR);
+
if(!ent.solid) ent.solid = (sol);
else if(ent.solid < 0) ent.solid = SOLID_NOT;
+ SetBrushEntityModel(ent,true); // called after setting .solid to ensure correct area grid linking/unlinking
+
+ ent.use = g_model_setcolormaptoactivator;
+ InitializeEntity(ent, g_model_dropbyspawnflags, INITPRIO_DROPTOFLOOR);
}
void g_clientmodel_init(entity ent, float sol)
{
if(ent.geomtype && autocvar_physics_ode && checkextension("DP_PHYSICS_ODE")) set_movetype(ent, MOVETYPE_PHYSICS);
if(!ent.scale) ent.scale = ent.modelscale;
- SetBrushEntityModel(ent,true);
+
+ if(!ent.solid) ent.solid = (sol);
+ else if(ent.solid < 0) ent.solid = SOLID_NOT;
+ SetBrushEntityModel(ent,true); // called after setting .solid to ensure correct area grid linking/unlinking
+
ent.use = g_clientmodel_use;
setthink(ent, g_clientmodel_think);
ent.nextthink = time;
ent.oldorigin = ent.origin; // don't run an initial double update
InitializeEntity(ent, g_clientmodel_dropbyspawnflags, INITPRIO_DROPTOFLOOR);
- if(!ent.solid) ent.solid = (sol);
- else if(ent.solid < 0) ent.solid = SOLID_NOT;
if(!ent.bgmscriptsustain) ent.bgmscriptsustain = 1;
else if(ent.bgmscriptsustain < 0) ent.bgmscriptsustain = 0;
Net_LinkEntity(ent, true, 0, g_clientmodel_genericsendentity);