예제 #1
0
    private void SendOnTrackedObjectChange(string tracker, string trackedName)
    {
        //get location type
        switch (trackedObjects[tracker].type)
        {
        case LOCATION_TYPE.SHIP:
            List <int>    sentToIDs = new List <int>();
            DB_Ship       ship      = mdb.FetchShipByName(tracker);
            TrackedObject tracked   = trackedObjects[trackedName];
            foreach (DB_Worker worker in mdb.FetchWorkersByShip(ship))
            {
                DB_Player player = mdb.FetchPlayerByID(worker.owner.Id.AsObjectId);
                //only send if the player has not already been sent to
                if (!sentToIDs.Contains(player.ActiveConnectionID))
                {
                    SendClient(player.ActiveConnectionID, player.ActiveHostID, new Net_OnTrackedObjectChange(trackedName, tracked.pos.x, tracked.pos.y, tracked.vel.x, tracked.vel.y));
                    sentToIDs.Add(player.ActiveConnectionID);
                }
            }
            break;

        case LOCATION_TYPE.COLONY:
        case LOCATION_TYPE.ASTEROID:
            Debug.Log("not implemented");
            break;

        case LOCATION_TYPE.NONE:
        default:
            Debug.Log(string.Format("[Sector Server]: Unexpected tracked location type ({0}).", trackedObjects[tracker].type));
            break;
        }
    }
예제 #2
0
    public MongoDBRef SpawnDefaultWorker(string workerName)
    {
        DB_Worker defaultWorker = new DB_Worker();

        defaultWorker.activity   = WORKER_ACTIVITY.IDLE;
        defaultWorker.workerName = workerName;

        //TODO: change default spawn location
        defaultWorker.location = GETNEXTAVAILABLESHIPDBREFERENCETESTTTT();

        //stats
        //**
        //TODO populate
        //**

        //appearance
        //**
        //TODO populate
        //**

        workerCollection.Insert(defaultWorker);

        //Add player reference to default spawn location
        //get location
        //TODO: make default spawn location a colony, not a ship (?)
        DB_Ship ship = FetchShipByID(defaultWorker.location.Id.AsObjectId);

        //get worker from db (for db ref)
        defaultWorker = FetchWorkerByName(workerName);
        //update location
        ship.workersOnBoard.Add(new MongoDBRef(COLLECTIONS.WORKERS, defaultWorker._id));
        updateShip(ship);

        return(new MongoDBRef("workers", workerCollection.FindOne(Query <DB_Worker> .EQ(w => w.workerName, workerName))._id));
    }
예제 #3
0
    public List <DB_Worker> FetchWorkersByShip(DB_Ship ship)
    {
        List <DB_Worker> workers = new List <DB_Worker>();

        ship.workersOnBoard.ForEach(delegate(MongoDBRef workerRef)
        {
            workers.Add(FetchWorkerByID(workerRef.Id.AsObjectId));
        });
        return(workers);
    }
예제 #4
0
    public void Init()
    {
        client = new MongoClient(MONGO_URI);
        server = client.GetServer();
        mdb    = server.GetDatabase(DB_NAME);

        //init collections(tables) here
        accountCollection = mdb.GetCollection <DB_Account>(COLLECTIONS.ACCOUNTS);
        playerCollection  = mdb.GetCollection <DB_Player>(COLLECTIONS.PLAYERS);
        workerCollection  = mdb.GetCollection <DB_Worker>(COLLECTIONS.WORKERS);
        shipCollection    = mdb.GetCollection <DB_Ship>(COLLECTIONS.SHIPS);

        Debug.Log("Initialized " + DB_NAME);

        //TODO remove this
        //setting ship0 to NONE, so player can request sail
        DB_Ship ship = FetchShipByName("ship0");

        ship.activity = SHIP_ACTIVITY.NONE;
        updateShip(ship);
        ship                   = FetchShipByName("ship1");
        ship.activity          = SHIP_ACTIVITY.NONE;
        updateShip(ship); ship = FetchShipByName("ship2");
        ship.activity          = SHIP_ACTIVITY.NONE;
        updateShip(ship);

        /*
         * for (int i = 0; i < 50; i++)
         * {
         *  DB_Ship ship2 = new DB_Ship();
         *  ship2.shipName = "ship" + i;
         *  ship2.sector = SECTOR_CODE.REDSECTOR;
         *  ship2.velX = 0;
         *  ship2.velY = 0;
         *  ship2.posX = i + 5;
         *  ship2.posY = 5;
         *  ship2.frame = 0;
         *  ship2.color1 = 1;
         *  ship2.color2 = 2;
         *  ship2.color3 = 3;
         *  ship2.activity = SHIP_ACTIVITY.NONE;
         *  ship2.workersOnBoard = new List<MongoDBRef>();
         *  shipCollection.Insert(ship2);
         * } */
    }
예제 #5
0
    //change a ship's status to traveling
    private void SetSailRequest(Net_SetSailRequest msg)
    {
        //get ship and requesting player refs
        DB_Player player = mdb.FetchPlayerByToken(msg.token);
        DB_Ship   ship   = mdb.FetchShipByName(msg.shipName);

        //verify the requestor is the owner
        if (ship.Owner.Id.AsObjectId.Equals(player._id))
        {
            //change ship activity
            ship.activity = SHIP_ACTIVITY.TRAVELING;
            mdb.updateShip(ship);

            //add ship to tracked objects
            TrackedObject newShip = new TrackedObject();
            newShip.pos  = new Vector2(ship.posX, ship.posY);
            newShip.vel  = new Vector2(ship.velX, ship.velY);
            newShip.type = LOCATION_TYPE.SHIP;
            trackedObjects.Add(ship.shipName, newShip);
            trackedByLocation.Add(ship.shipName, new List <string>());
        }
        //TODO or verify the player is a verified crew member or nation member
    }
예제 #6
0
    //send the image and type data of a mobile object
    private void TrackedObjectInitRequest(int connectionID, int recHostID, Net_TrackedObjectInitRequest msg)
    {
        //get type
        //ship
        DB_Ship ship = mdb.FetchShipByName(msg.locationName);

        if (ship != null)
        {
            //generate response
            Net_OnTrackedObjectInitRequest responseMsg = new Net_OnTrackedObjectInitRequest();
            responseMsg.locationName = msg.locationName;
            responseMsg.locationData = new byte[] { LOCATION_TYPE.SHIP, ship.frame, ship.color1, ship.color2, ship.color3 };

            //send response
            SendClient(connectionID, recHostID, responseMsg);
            return;
        }

        //asteroid
        //TODO

        //other
        //TODO
    }
예제 #7
0
    public bool CreateAccount(string username, string hashedPassword, string email)
    {
        //*********************************Account creation*********************************
        DB_Account account = new DB_Account();

        //validate email
        //TODO: send verification e-mail
        if (!Utility.IsEmail(email))
        {
            Debug.Log(string.Format("[Login Server]: Bad e-mail: ({0})", email));
            return(false);
        }
        if (FetchAccountByEmail(email) != null)
        {
            Debug.Log(string.Format("[Login Server]: E-mail taken: ({0})", email));
            return(false);
        }
        account.Email = email;

        //validate username
        if (!Utility.IsUsername(username))
        {
            Debug.Log(string.Format("[Login Server]: Bad username: ({0})", username));
            return(false);
        }
        account.Username = username;

        //TODO check password validity (don't delete me future Darren...)
        account.ShaPassword = hashedPassword;

        //get discriminator
        int discriminatorInt = 0;

        while (FetchAccountByUsernameAndDiscriminator(username + "#" + discriminatorInt.ToString().PadLeft(4, '0')) != null)
        {
            discriminatorInt++;
        }
        account.Discriminator = discriminatorInt.ToString().PadLeft(4, '0');

        //default to offline status
        account.Status = LoginStatus.Offline;

        //TODO: dynamically assign default sector
        account.Sector = SECTOR_CODE.REDSECTOR;

        account.CreatedOn = DateTime.Now;
        account.LastLogin = account.CreatedOn;
        //*********************************************************************************

        //*********************************Player creation*********************************
        DB_Player player = new DB_Player();

        player.Username      = account.Username;
        player.Discriminator = account.Discriminator;
        player.CreatedOn     = account.CreatedOn;
        player.LastLogin     = account.CreatedOn;

        //TODO: change up this worker generation so that we just call a createWorker(DB_Worker worker) method
        //assign default worker for new player
        //TODO: allow this worker to be customized (appearance/name)
        player.Workers = new List <MongoDBRef>();
        player.Workers.Add(SpawnDefaultWorker("DEFAULT WORKER NAME" + UnityEngine.Random.Range(0, 10000)));
        player.ActiveWorkerIndex = 0;
        //*********************************************************************************

        //now that all data is validated and set:
        //insert account
        accountCollection.Insert(account);
        //insert player
        playerCollection.Insert(player);

        //set default worker's owner ref
        //get player from db (for db ref)
        player = FetchPlayerByUsernameAndDiscriminator(account.Username + "#" + account.Discriminator);
        //get and update worker
        DB_Worker worker = FetchWorkerByID(player.Workers[player.ActiveWorkerIndex].Id.AsObjectId);

        worker.owner = new MongoDBRef(COLLECTIONS.PLAYERS, player._id);
        updateWorker(worker);

        //TODO: remove this TESTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
        //set default ship's owner ref
        //get and update ship
        DB_Ship ship = FetchShipByID(worker.location.Id.AsObjectId);

        ship.Owner = new MongoDBRef(COLLECTIONS.PLAYERS, player._id);
        updateShip(ship);

        return(true);
    }
예제 #8
0
    public void updateShip(DB_Ship shipUpdate)
    {
        IMongoQuery query = Query <DB_Ship> .EQ(s => s._id, shipUpdate._id);

        shipCollection.Update(query, Update <DB_Ship> .Replace(shipUpdate));
    }