#define SUB_OwnerCheck() (other && (other == self.owner))
+void RemoveGrapplingHook(entity pl);
float WarpZone_Projectile_Touch_ImpactFilter_Callback()
{
if(SUB_OwnerCheck())
return TRUE;
if(SUB_NoImpactCheck())
{
- remove(self);
+ if(self.classname == "grapplinghook")
+ RemoveGrapplingHook(self.realowner);
+ else
+ remove(self);
return TRUE;
}
if(trace_ent && trace_ent.solid > SOLID_TRIGGER)
e.think = defer_think;
e.nextthink = time + fdelay;
}
+
+.string aiment_classname;
+.float aiment_deadflag;
+void SetMovetypeFollow(entity ent, entity e)
+{
+ // FIXME this may not be warpzone aware
+ ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
+ ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
+ ent.aiment = e; // make the hole follow bmodel
+ ent.punchangle = e.angles; // the original angles of bmodel
+ ent.view_ofs = ent.origin - e.origin; // relative origin
+ ent.v_angle = ent.angles - e.angles; // relative angles
+ ent.aiment_classname = strzone(e.classname);
+ ent.aiment_deadflag = e.deadflag;
+}
+void UnsetMovetypeFollow(entity ent)
+{
+ ent.movetype = MOVETYPE_FLY;
+ PROJECTILE_MAKETRIGGER(ent);
+ ent.aiment = world;
+}
+float LostMovetypeFollow(entity ent)
+{
+/*
+ if(ent.movetype != MOVETYPE_FOLLOW)
+ if(ent.aiment)
+ error("???");
+*/
+ if(ent.aiment)
+ {
+ if(ent.aiment.classname != ent.aiment_classname)
+ return 1;
+ if(ent.aiment.deadflag != ent.aiment_deadflag)
+ return 1;
+ }
+ return 0;
+}
+
+float isPushable(entity e)
+{
+ if(e.iscreature)
+ return TRUE;
+ switch(e.classname)
+ {
+ case "body":
+ case "corpse":
+ case "droppedweapon":
+ case "keepawayball":
+ case "nexball_basketball":
+ case "nexball_football":
+ return TRUE;
+ case "bullet":
+ return FALSE;
+ }
+ if (e.projectiledeathtype)
+ return TRUE;
+ return FALSE;
+}