void OnLoginReceived(Packet.Login login, NetPeer peer) { try { ValidatePacket(login); } catch (ArgumentException ex) { Console.WriteLine(String.Format("Failed to validate packet in OnLoginReceived from {0}: {1}", peer.EndPoint, ex.ToString())); return; } if (_connectedPlayers.ContainsKey(login.userName)) { Console.WriteLine("Player {0} is already logged in.", login.userName); return; } Console.WriteLine("Player {0} logged in.", login.userName); _connectedPlayers[login.userName] = new PlayerState(login.userName, peer); ObjectSchema.Player player = _db.GetPlayer(login.userName); // Send player's initial state. peer.Send(Write(new Packet.LoginInitialPlayerState { userName = player.userName, xp = player.xp }), DeliveryMethod.ReliableOrdered); // Send player's inventory to them. SendInventoryToPlayer(_connectedPlayers[login.userName]); //Send Current time to player peer.Send(this.Write(new Packet.CurrentServerTime { time = GameTime.Instance().TickStartTime() }), DeliveryMethod.ReliableSequenced); // Send all mineable objects to player. List <ObjectSchema.Mineable> allMinables = _db.ReadAllObjects <ObjectSchema.Mineable>(ObjectSchema.ObjectTypes.IObjectType.MINEABLE); foreach (var mineable in allMinables) { peer.Send(this.Write(new Packet.PlaceMinableObject { mineable = mineable }), DeliveryMethod.ReliableSequenced); } List <ObjectSchema.Plantable> allPlantables = _db.ReadAllObjects <ObjectSchema.Plantable>(ObjectSchema.ObjectTypes.IObjectType.PLANTABLE); foreach (var plantable in allPlantables) { peer.Send(this.Write(new Packet.PlacePlantableObject { plantable = plantable }), DeliveryMethod.ReliableSequenced); } }
public void WritePlayer(ObjectSchema.Player player) { var idResult = _bucket.Increment("PlayerIdCounter"); if (!idResult.Success) { throw new Exception("Failed to get next increment for UserItemInventoryCounter."); } var document = new Document <dynamic> { Id = "player" + idResult.Value.ToString(), Content = player }; var upsert = _bucket.Upsert(document); if (!upsert.Success) { throw new Exception(String.Format("Upserting item failed for user {0}", player.userName)); } }
public ObjectSchema.Player GetPlayer(string userName) { var queryRequest = new QueryRequest() .Statement("SELECT meta(`FarmWorld`).id, * FROM `FarmWorld` WHERE userName=$1 AND type='PLAYER'") .AddPositionalParameter(userName); var result = _bucket.Query <dynamic>(queryRequest); if (!result.Success) { throw new Exception(String.Format("GetPlayer initial queryRequest failed: {0}", result.Status)); } if (result.Rows.Count > 1) { throw new Exception(String.Format("GetPlayer initial query returned more than 1 row for user {0}.", userName)); } if (result.Rows.Count == 0) // Write new empty player. { WritePlayer(new ObjectSchema.Player { userName = userName, xp = 0 }); return(new ObjectSchema.Player { userName = userName, xp = 0 }); } else { var ret = new ObjectSchema.Player { userName = userName, xp = 0 }; var document = result.Rows[0].Document; ret.FromJson(document.Content, ref ret); ret.id = document.Id; return(ret); } }