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; } }
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)); }
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); }
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); * } */ }
//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 }
//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 }
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); }
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)); }