예제 #1
0
        public void TestLockable()
        {
            SpacegameServer.Core.Core Instance = SpacegameServer.Core.Core.Instance;


            SpacegameServer.Core.User x = Mock.MockUserAndAdd(Instance);

            int shipId1 = (int)Instance.identities.shipLock.getNext();
            int shipId2 = (int)Instance.identities.shipLock.getNext();

            SpacegameServer.Core.Ship Ship1, Ship2;
            Ship1 = new SpacegameServer.Core.Ship(shipId1);
            Ship2 = new SpacegameServer.Core.Ship(shipId2);

            SpacegameServer.Core.Colony Colony1;
            Colony1 = new SpacegameServer.Core.Colony(1);

            //Object can only be locked once
            Assert.IsTrue(Ship1.setLock());
            Assert.IsFalse(Ship1.setLock());

            //LockAll of Ships can only be set once
            Assert.IsTrue(SpacegameServer.Core.Ship.setLockAll());
            Assert.IsFalse(SpacegameServer.Core.Ship.setLockAll());

            //ships can't be lcoked anymore, colonies can
            Assert.IsFalse(Ship1.setLock());
            Assert.IsFalse(Ship2.setLock());
            Assert.IsTrue(Colony1.setLock());
            Ship1.removeLock();
            Colony1.removeLock();

            //after removing LockAll, all is lockable again
            SpacegameServer.Core.Ship.removeLockAll();
            Assert.IsTrue(Ship1.setLock());
            Assert.IsTrue(Ship2.setLock());
            Assert.IsTrue(Colony1.setLock());
        }
예제 #2
0
        public static bool build(int userId, int colonyId, ref string xml)
        {
            SpacegameServer.Core.Core core = SpacegameServer.Core.Core.Instance;

            // lock colony
            Colony colony = core.colonies[colonyId];

            if (colony == null)
            {
                return(false);
            }

            for (int i = 0; i < 10; i++)
            {
                bool colonyLocked = false;

                colonyLocked = colony.setLock();

                if (colonyLocked)
                {
                    //userId may have been changed by another thread, so check it again after locking
                    if (colony.userId != userId)
                    {
                        colony.removeLock();
                        return(false);
                    }
                    Core.Instance.dataConnection.buildModules(userId, colonyId, ref xml);

                    // get colony data (goods, later population (colony ships))
                    Core.Instance.dataConnection.getColonyStock(core, colony);


                    //release the ressources and return true
                    colony.removeLock();

                    BC.XMLGroups.Colonize bCCol = new BC.XMLGroups.Colonize();
                    bCCol.Colony = colony;
                    BC.BusinessConnector.Serialize <BC.XMLGroups.Colonize>(bCCol, ref xml);

                    return(true);
                }
                else
                {
                    Thread.Sleep(Lockable.rnd.Next(0, 50));
                }
            }

            return(true);
        }
예제 #3
0
        public bool build(int _shipTemplateId, int _userId, int _colonyId, bool _fastBuild, ref string _xml)
        {
            // lock colony
            Colony colony = core.colonies[_colonyId];

            if (colony == null)
            {
                return(false);
            }

            for (int i = 0; i < 10; i++)
            {
                bool colonyLocked = false;

                colonyLocked = colony.setLock();

                if (colonyLocked)
                {
                    //userId may have been changed by another thread, so check it again after locking
                    if (colony.userId != _userId)
                    {
                        colony.removeLock();
                        return(false);
                    }
                    int newShipId = 0;
                    Core.Instance.dataConnection.buildShip(_shipTemplateId, _userId, _colonyId, _fastBuild, ref _xml, ref newShipId);

                    //get new ship data
                    Core.Instance.dataConnection.getShips(core, newShipId, null);
                    Core.Instance.dataConnection.getShipModules(core, core.ships[newShipId], false);

                    // get colony data (goods, later population (colony ships))
                    Core.Instance.dataConnection.getColonyStock(core, colony);

                    //release the ressources and return true
                    colony.removeLock();
                    return(true);
                }
                else
                {
                    Thread.Sleep(Lockable.rnd.Next(0, 50));
                }
            }

            return(true);
        }