public void ServerCmdcarUnmountObj(coGameConnection client, coPlayer obj) { obj.unmount(); obj.setControlObject(obj); TransformF ejectpos = obj.getTransform(); ejectpos += new TransformF(0, 0, 5); obj.setTransform(ejectpos); coVehicle mvehicle = obj["mVehicle"]; Point3F ejectvel = mvehicle.getVelocity(); ejectvel += new Point3F(0, 0, 10); ejectvel = ejectvel.vectorScale(((coSimDataBlock) (obj.getDataBlock()))["mass"].AsFloat()); obj.applyImpulse(ejectpos.MPosition, ejectvel); }
public void ArmorDoDismount(string datablock, string player, string sforced) { bool forced = sforced.AsBool(); string vehicle = console.GetVarString(string.Format("{0}.mVehicle", player)); if ((!SceneObject.isMounted(player)) || (!console.isObject(vehicle))) return; Point3F vvel = ShapeBase.getVelocity(vehicle); string vdb = console.getDatablock(vehicle).ToString(CultureInfo.InvariantCulture); int maxDismountSpeed = console.GetVarInt(string.Format("{0}.maxDismountSpeed", vdb)); if ((vvel.len() <= maxDismountSpeed) || (forced)) { TransformF pos = SceneObject.getTransform(player); TransformF rot = pos; TransformF oldpos = pos.copy(); List<Point3F> vecs = new List<Point3F>(); vecs.Add(new Point3F(-1, 0, 0)); vecs.Add(new Point3F(0, 0, 1)); vecs.Add(new Point3F(0, 0, -1)); vecs.Add(new Point3F(1, 0, 0)); vecs.Add(new Point3F(0, -1, 0)); vecs.Add(new Point3F(0, 0, 0)); Point3F impulsevec = new Point3F(0, 0, 0); TransformF r = math.MatrixMulVector(SceneObject.getTransform(player), vecs[0]); vecs[0] = r.MPosition; pos.MPosition.x = 0; pos.MPosition.y = 0; pos.MPosition.z = 0; const int numofAttempts = 5; int success = -1; for (int i = 0; i < numofAttempts; i++) { Point3F vectorscale = vecs[i].vectorScale(3); pos = oldpos + new TransformF(vectorscale); if (!Player.checkDismountPoint(player, oldpos.MPosition, pos.MPosition)) continue; success = i; impulsevec = vecs[i].copy(); break; } if ((forced) && (success == -1)) pos = oldpos.copy(); console.SetVar(string.Format("{0}.mountVehicle", player), false); SimObject.schedule(player, "4000", "mountVehicles", "true"); SceneObject.unmount(player); SceneObject.setTransform(player, new TransformF(pos.MPosition.x, pos.MPosition.y, pos.MPosition.z, rot.MOrientation.x, rot.MOrientation.y, rot.MOrientation.z, rot.MAngle)); Point3F velo = impulsevec.vectorScale(console.GetVarFloat(console.getDatablock(player) + ".mass")); velo.z = 1; ShapeBase.applyImpulse(player, pos.MPosition, velo); Point3F vel = ShapeBase.getVelocity(player); float vec = Point3F.vectorDot(vel, vel.normalizeSafe()); if (vec > 50) { float scale = 50/vec; ShapeBase.setVelocity(player, vel.vectorScale(scale)); } } else { MessageClient(console.GetVarString(player + ".client"), "msgUnmount", @"\c2Cannot exit %1 while moving.", console.GetVarString(vdb + ".nameTag")); } }
public void ServerCmdcarUnmountObj(string client, string obj) { SceneObject.unmount(obj); Player.setControlObject(obj, obj); TransformF ejectpos = SceneObject.getTransform(obj); ejectpos += new TransformF(0, 0, 5); SceneObject.setTransform(obj, ejectpos); string mvehicle = console.GetVarString(string.Format("{0}.mVehicle", obj)); Point3F ejectvel = ShapeBase.getVelocity(mvehicle); ejectvel += new Point3F(0, 0, 10); ejectvel = ejectvel.vectorScale((console.GetVarString(string.Format("{0}.mass", console.getDatablock(obj)))).AsFloat()); ShapeBase.applyImpulse(obj, ejectpos.MPosition, ejectvel); }
public void ArmorDoDismount(coPlayerData datablock, coPlayer player, bool forced) { coVehicle vehicle = player["mVehicle"]; if (!vehicle.isObject()) return; if (!player.isMounted()) return; Point3F vvel = vehicle.getVelocity(); coVehicleData vdb = vehicle.getDataBlock(); int maxDismountSpeed = vdb["maxDismountSpeed"].AsInt(); if ((vvel.len() <= maxDismountSpeed) || (forced)) { TransformF pos = player.getTransform(); TransformF rot = pos; TransformF oldpos = pos.copy(); List<Point3F> vecs = new List<Point3F> { new Point3F(-1, 0, 0), new Point3F(0, 0, 1), new Point3F(0, 0, -1), new Point3F(1, 0, 0), new Point3F(0, -1, 0), new Point3F(0, 0, 0) }; Point3F impulsevec = new Point3F(0, 0, 0); TransformF r = math.MatrixMulVector(player.getTransform(), vecs[0]); vecs[0] = r.MPosition; pos.MPosition.x = 0; pos.MPosition.y = 0; pos.MPosition.z = 0; const int numofAttempts = 5; int success = -1; for (int i = 0; i < numofAttempts; i++) { Point3F vectorscale = vecs[i].vectorScale(3); pos = oldpos + new TransformF(vectorscale); if (!player.checkDismountPoint(oldpos.MPosition, pos.MPosition)) continue; success = i; impulsevec = vecs[i].copy(); break; } if ((forced) && (success == -1)) pos = oldpos.copy(); player["mountVehicle"] = false.AsString(); player.schedule("4000", "mountVehicles", "true"); player.unmount(); player.setTransform(new TransformF(pos.MPosition.x, pos.MPosition.y, pos.MPosition.z, rot.MOrientation.x, rot.MOrientation.y, rot.MOrientation.z, rot.MAngle)); Point3F velo = impulsevec.vectorScale(player["mass"].AsFloat()); velo.z = 1; player.applyImpulse(pos.MPosition, velo); Point3F vel = player.getVelocity(); float vec = Point3F.vectorDot(vel, vel.normalizeSafe()); if (vec > 50) { float scale = 50 / vec; player.setVelocity(vel.vectorScale(scale)); } } else { MessageClient(player["client"], "msgUnmount", @"\c2Cannot exit %1 while moving.", console.GetVarString(vdb + ".nameTag")); } }