public void SyncPlayersAsync() { foreach (var kv in objects) { var id = kv.Key; var data = kv.Value; var body = data.rb; var pos = body.Position; var vel = body.LinearVelocity; var ori = body.Orientation; var ang_vel = body.AngularVelocity; var pos_distance = VectorOps.Distance(data.last_pos, pos); var vel_distance = VectorOps.Distance(data.last_vel, vel); var ang_distance = VectorOps.Distance(data.last_ang_vel, vel); if (pos_distance > 0.1f || vel_distance > 0.1f || MatrixOps.CmpExact(data.last_ori, ori) || //TODO: Do some approximation ang_distance > 0.1f) { data.last_pos = body.Position; data.last_vel = body.LinearVelocity; data.last_ori = body.Orientation; data.last_ang_vel = body.AngularVelocity; var ev = new Event3D { ObjectTransformChanged = new Event3D_ObjectTransformChanged { Id = id, NewTransform = new Transform { Position = ArenaServiceConv.ToArenaData(pos), Velocity = ArenaServiceConv.ToArenaData(vel), Rotation = ArenaServiceConv.ToArenaData(ori), AngularVelocity = ArenaServiceConv.ToArenaData(ang_vel) } } }; send_to_all_players(ev); } } }
private void send_spawned_objects_to_player(Player player) { foreach (var kv in objects) { if (kv.Key >= startobject_high_edge) //Is a spawned object { var ev = new Event3D { ObjectNotification = new Event3D_ObjectNotification { Id = kv.Key, SpawnId = kv.Value.spawn_id, Spawn = false, Transform = ArenaServiceConv.ToArenaTransform(kv.Value.rb) } }; send_to_all_players(ev); } } }
/// <summary> /// Single threaded. /// </summary> /// <param name="spawnable_idx"></param> /// <returns></returns> protected KeyValuePair <int, RigidBody> SpawnObject(int spawnable_idx, JVector?pos = null, JVector?vel = null, JQuaternion?ori = null) { var rb = new RigidBody(spawnable_rigid_bodies[spawnable_idx].Shape); if (pos.HasValue) { rb.Position = pos.Value; } if (vel.HasValue) { rb.LinearVelocity = vel.Value; } if (ori.HasValue) { rb.Orientation = JMatrix.CreateFromQuaternion(ori.Value); } for (;;) { var id = random.Next(startobject_high_edge, int.MaxValue); if (!objects.ContainsKey(id)) { add_to_world(id, spawnable_idx, rb); var ev = new Event3D { ObjectNotification = new Event3D_ObjectNotification { Id = id, SpawnId = spawnable_idx, Spawn = true, Transform = ArenaServiceConv.ToArenaTransform(rb) } }; send_to_all_players(ev); return(new KeyValuePair <int, RigidBody>(id, rb)); } } }