public void PerformTransaction(VM vm, bool testOnly, uint uid1, uint uid2, int amount, VMAsyncTransactionCallback callback)
        {
            Host.InBackground(() =>
            {
                using (var db = DAFactory.Get())
                {
                    var result = (testOnly)?db.Avatars.TestTransaction(uid1, uid2, amount, 0):db.Avatars.Transaction(uid1, uid2, amount, 0);
                    if (result == null)
                    {
                        result = new Database.DA.Avatars.DbTransactionResult()
                        {
                            success = false
                        }
                    }
                    ;

                    var finalAmount = amount;
                    callback(result.success, result.amount,
                             uid1, (uint)result.source_budget,
                             uid2, (uint)result.dest_budget);
                }
            });
        }
示例#2
0
        public void PerformTransaction(VM vm, bool testOnly, uint uid1, uint uid2, int amount, short type, short thread, VMAsyncTransactionCallback callback)
        {
            Host.InBackground(() =>
            {
                using (var db = DAFactory.Get())
                {
                    var result = (testOnly)?db.Avatars.TestTransaction(uid1, uid2, amount, 0):db.Avatars.Transaction(uid1, uid2, amount, type);
                    if (result == null)
                    {
                        result = new Database.DA.Avatars.DbTransactionResult()
                        {
                            success = false
                        }
                    }
                    ;

                    var finalAmount = amount;

                    //update client side budgets for avatars involved.
                    vm.SendCommand(new VMNetAsyncResponseCmd(thread, new VMTransferFundsState
                    {
                        Responded      = true,
                        Success        = result.success,
                        TransferAmount = result.amount,
                        UID1           = uid1,
                        Budget1        = (uint)result.source_budget,
                        UID2           = uid2,
                        Budget2        = (uint)result.dest_budget
                    }));

                    callback(result.success, result.amount,
                             uid1, (uint)result.source_budget,
                             uid2, (uint)result.dest_budget);
                }
            });
        }
示例#3
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);
                }
            });
        }