Ejemplo n.º 1
0
        public void MoveToInventory(VM vm, VMMultitileGroup obj, VMAsyncInventorySaveCallback callback, bool runSync)
        {
            var  objectPID = obj.BaseObject.PersistID;
            var  objb      = obj.BaseObject;
            uint guid      = objb.Object.OBJ.GUID;

            if (objb.MasterDefinition != null)
            {
                guid = objb.MasterDefinition.GUID;
            }
            var isNew   = objectPID == 0;
            var state   = new VMStandaloneObjectMarshal(obj);
            var dbState = GenerateObjectPersist(obj);

            dbState.lot_id = null; //we're removing this object from the lot

            if (runSync)
            {
                SaveInventoryState(isNew, objectPID, state, dbState, guid, callback, true);
            }
            else
            {
                Host.InBackground(() =>
                {
                    SaveInventoryState(isNew, objectPID, state, dbState, guid, callback, false);
                });
            }
        }
Ejemplo n.º 2
0
 public void ForceInInventory(VM vm, uint objectPID, VMAsyncInventorySaveCallback callback)
 {
     if (objectPID == 0)
     {
         callback(false, objectPID);
         return; //non-persist objects cannot be moved to inventory!
     }
     Host.InBackground(() =>
     {
         using (var db = DAFactory.Get())
         {
             callback(db.Objects.SetInLot(objectPID, null), objectPID);
         }
     });
 }
Ejemplo n.º 3
0
        public void UpdateObjectPersist(VM vm, VMMultitileGroup obj, VMAsyncInventorySaveCallback callback)
        {
            var objectPID = obj.BaseObject.PersistID;
            var dbState   = GenerateObjectPersist(obj);

            Host.InBackground(() =>
            {
                using (var db = DAFactory.Get())
                {
                    //todo: race where inventory object could potentially be placed on the lot before the old instance of it is deleted
                    //probably just block objects with same persist id from being placed.
                    db.Objects.UpdatePersistState(objectPID, dbState);
                    callback(true, objectPID);
                }
            });
        }
Ejemplo n.º 4
0
        public void PurchaseFromOwner(VM vm, VMMultitileGroup obj, uint purchaserPID, VMAsyncInventorySaveCallback callback, VMAsyncTransactionCallback tcallback)
        {
            var  objectPID = obj.BaseObject.PersistID;
            var  objb      = obj.BaseObject;
            uint guid      = objb.Object.OBJ.GUID;

            if (objb.MasterDefinition != null)
            {
                guid = objb.MasterDefinition.GUID;
            }
            var isNew     = objectPID == 0;
            var state     = new VMStandaloneObjectMarshal(obj);
            var dbState   = GenerateObjectPersist(obj);
            var salePrice = obj.SalePrice;
            var owner     = ((VMTSOObjectState)objb.TSOState).OwnerID;

            //object will stay on lot for now.

            Host.InBackground(() =>
            {
                using (var da = DAFactory.Get())
                {
                    SaveInventoryState(isNew, objectPID, state, dbState, guid, (bool success, uint objPID) =>
                    {
                        if (success)
                        {
                            //todo: transaction-ify this whole thing? might need a large scale rollback...
                            var tresult = da.Avatars.Transaction(purchaserPID, owner, salePrice, 0);
                            if (tresult == null)
                            {
                                tresult = new Database.DA.Avatars.DbTransactionResult()
                                {
                                    success = false
                                }
                            }
                            ;

                            //update the budgets of the respective characters.
                            var finalAmount = salePrice;
                            tcallback(tresult.success, tresult.amount,
                                      purchaserPID, (uint)tresult.source_budget,
                                      owner, (uint)tresult.dest_budget);

                            if (tresult.success)
                            {
                                dbState.owner_id = purchaserPID;
                                dbState.lot_id   = null;
                                da.Objects.UpdatePersistState(objPID, dbState); //perform the final object transfer. todo: logging
                                callback(true, objPID);
                            }
                            else
                            {
                                callback(false, objPID);
                            }
                        }
                        else
                        {
                            callback(false, objPID);
                        }
                    }, true);
                }
            });
        }
Ejemplo n.º 5
0
 public void MoveToInventory(VM vm, VMMultitileGroup obj, VMAsyncInventorySaveCallback callback)
 {
     MoveToInventory(vm, obj, callback, false);
 }
Ejemplo n.º 6
0
        private void SaveInventoryState(bool isNew, uint objectPID, VMStandaloneObjectMarshal state, DbObject dbState, uint guid, VMAsyncInventorySaveCallback callback, bool runSync)
        {
            try
            {
                if (isNew)
                {
                    try
                    {
                        using (var db = DAFactory.Get())
                        {
                            dbState.type     = guid;
                            dbState.shard_id = Context.ShardId;
                            var id = db.Objects.Create(dbState);
                            dbState.object_id = id;
                            objectPID         = id;
                        }
                    }
                    catch (Exception) { callback(false, objectPID); }
                }
                var objStr = objectPID.ToString("x8");
                //make sure this exists
                Directory.CreateDirectory(Path.Combine(Config.SimNFS, "Objects/" + objStr + "/"));
                byte[] data;
                using (var stream = new MemoryStream())
                {
                    var writer = new BinaryWriter(stream);
                    state.SerializeInto(writer);
                    data = stream.ToArray();
                }
                var file = File.Open(Path.Combine(Config.SimNFS, "Objects/" + objStr + "/inventoryState.fsoo"), FileMode.Create);

                if (runSync)
                {
                    file.Write(data, 0, data.Length);
                    using (var db = DAFactory.Get())
                    {
                        //todo: race where inventory object could potentially be placed on the lot before the old instance of it is deleted
                        //probably just block objects with same persist id from being placed.
                        db.Objects.UpdatePersistState(objectPID, dbState);
                        callback(true, objectPID);
                    }
                    file.Close();
                }
                else
                {
                    file.WriteAsync(data, 0, data.Length).ContinueWith((x) =>
                    {
                        using (var db = DAFactory.Get())
                        {
                            db.Objects.UpdatePersistState(objectPID, dbState);
                            callback(true, objectPID);
                        }
                        file.Close();
                    });
                }
            }
            catch (Exception e)
            {
                //todo: specific types of exception that can be thrown here? instead of just catching em all
                LOG.Error(e, "Failed to save inventory state for object " + objectPID.ToString("x8") + "!");
                callback(false, objectPID);
            }
        }
Ejemplo n.º 7
0
 public void UpdateObjectPersist(VM vm, VMMultitileGroup obj, VMAsyncInventorySaveCallback callback)
 {
 }
Ejemplo n.º 8
0
 public void ForceInInventory(VM vm, uint objectPID, VMAsyncInventorySaveCallback callback)
 {
     //todo: nice stub for this using database?
 }
Ejemplo n.º 9
0
 public void PurchaseFromOwner(VM vm, VMMultitileGroup obj, uint purchaserPID, VMAsyncInventorySaveCallback callback, VMAsyncTransactionCallback tcallback)
 {
     callback(true, obj.BaseObject.PersistID);
     //todo: nice stub for this using database?
 }
Ejemplo n.º 10
0
 public void MoveToInventory(VM vm, VMMultitileGroup obj, VMAsyncInventorySaveCallback callback)
 {
     callback(true, obj.BaseObject.PersistID);
     //todo: nice stub for this using database?
 }