public string ShapeBaseTossPatch(coShapeBase thisobj) { if (!thisobj.isObject()) return string.Empty; coItem item = console.Call_Classname("ItemData", "CreateItem", new[] {"HealthKitPatch"}); item["istemp"] = true.AsString(); item["sourceObject"] = thisobj; item["static"] = false.AsString(); (( coSimSet)"MissionCleanup").pushToBack(item); Random r = new Random(); Point3F vec = new Point3F(-1 + (float) r.NextDouble()*2, -1*(float) r.NextDouble()*2, (float) r.NextDouble()); vec = vec.vecotrScale(10); Point3F eye = thisobj.getEyeVector(); float dot = new Point3F("0 0 1 ").vectorDot(eye); if (dot < 0) dot = -dot; vec = vec + new Point3F("0 0 8").vecotrScale(1 - dot); vec = vec + thisobj.getVelocity(); TransformF pos = new TransformF(thisobj.getWorldBox().minExtents); item.setTransform(pos); item.applyImpulse(pos.MPosition, vec); item.setCollisionTimeout(thisobj); item.call("schedulePop"); return item; }
public void ShapeBaseShapeBaseThrowObject(coShapeBase thisobj, coItem obj) { // Throw the given object in the direction the shape is looking. // The force value is hardcoded according to the current default // object mass and mission gravity (20m/s^2). float throwforce = (( coSimDataBlock)thisobj.getDataBlock())["throwForce"].AsFloat(); if (throwforce == 0) throwforce = 20; // Start with the shape's eye vector... Point3F eye = thisobj.getEyeVector(); Point3F vec = eye.vectorScale(throwforce); // Add a vertical component to give the object a better arc double verticalForce = throwforce / 2.0; float dot = Point3F.vectorDot(new Point3F("0 0 1"), eye); if (dot < 0) dot = dot * -1; vec = vec + Point3F.vectorScale(new Point3F(string.Format("0 0 {0}", verticalForce)), 1 - dot); vec = vec + thisobj.getVelocity(); // Set the object's position and initial velocity TransformF pos = new TransformF(Util.getBoxCenter(thisobj.getWorldBox())); obj.setTransform(pos); obj.applyImpulse(pos.MPosition, vec); // Since the object is thrown from the center of the shape, // the object needs to avoid colliding with it's thrower. obj.setCollisionTimeout(thisobj); if ((obj.getClassName() != "AITurretShape") && (obj.getClassName() != "ProximityMine")) obj.schedule(ItemPopTime.AsString(), "delete"); }