/** * Fire a railgun slug. * @param p q2jgame.Player * @param start q2java.Vec3 * @param forward q2java.Vec3 * @param damage int * @param kick int */ public static void fireRail(GameObject p, Point3f start, Vector3f aimDir, int damage, int kick) { TraceResults tr = null; NativeEntity ignore; int mask; boolean water; Point3f from = new Point3f(start); Point3f end = new Point3f(); end.scaleAdd(8192, aimDir, start); ignore = p.fEntity; water = false; mask = Engine.MASK_SHOT | Engine.CONTENTS_SLIME | Engine.CONTENTS_LAVA; while (ignore != null) { tr = Engine.trace(from, end, ignore, mask); if ((tr.fContents & (Engine.CONTENTS_SLIME | Engine.CONTENTS_LAVA)) != 0) { mask &= ~(Engine.CONTENTS_SLIME | Engine.CONTENTS_LAVA); water = true; } else { /* if ((tr.ent->svflags & SVF_MONSTER) || (tr.ent->client)) ignore = tr.ent; else */ ignore = null; if ((tr.fEntity.getReference() != p) && (tr.fEntity.getReference() instanceof GameObject)) ((GameObject)tr.fEntity.getReference()).damage(p, p, aimDir, tr.fEndPos, tr.fPlaneNormal, damage, kick, 0, Engine.TE_NONE, "railgun"); } from.set(tr.fEndPos); } // send gun puff / flash Engine.writeByte(Engine.SVC_TEMP_ENTITY); Engine.writeByte(Engine.TE_RAILTRAIL); Engine.writePosition(start); Engine.writePosition(tr.fEndPos); Engine.multicast(p.fEntity.getOrigin(), Engine.MULTICAST_PHS); if (water) { Engine.writeByte(Engine.SVC_TEMP_ENTITY); Engine.writeByte(Engine.TE_RAILTRAIL); Engine.writePosition(start); Engine.writePosition(tr.fEndPos); Engine.multicast(tr.fEndPos, Engine.MULTICAST_PHS); } }