private NetMessage WhenReqDestroyCompany(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); // 유저가 존재하고 // 해당 타일이 존재하고 if (user != null && this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 회사 타일이면 if (tile != null && tile.IsCompanyTile) { // 폐쇄 this.DestroyCompany(userName, tileX, tileY); } } } return(null); }
private NetMessage WhenReqAllSellingTech(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { foreach (var item in m_techStore) { // 해당 기술 구매가 허가된 유저라면 if (item.TargetUser.Length <= 0 || item.TargetUser == user.Name) { // 정보 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(item.Seller); writer.WriteData(item.Name); writer.WriteData(item.Price); client.Sender.SendMessage(writer.CreateMessage((int)MessageTypes.Ntf_SellTech)); } } } return(null); }
private NetMessage WhenReqAllUserInfo(ServerVisitor client, NetMessageStream msg) { var accounts = this.UserDirector.Accounts; if (accounts.Length > 0) { NetMessageStream writer = null; writer = new NetMessageStream(); writer.WriteData(1); client.Sender.SendMessage(writer.CreateMessage((int)MessageTypes.Rsp_AllUserInfo)); foreach (var account in accounts) { writer = new NetMessageStream(); writer.WriteData(0); writer.WriteData(account.UserColor.ToArgb()); writer.WriteData(account.Name); writer.WriteData(account.AreaCount); writer.WriteData(account.Resource); writer.WriteData((account == accounts.Last()) ? 1 : 0); client.Sender.SendMessage(writer.CreateMessage((int)MessageTypes.Rsp_AllUserInfo)); } } return(null); }
private NetMessage WhenReqMailbox(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); if (user != null) { var mailbox = user.Mailbox; for (int i = mailbox.Count - 1; i >= 0; --i) { this.NtfReceiveMailTo(client, mailbox[i]); } } } return(null); }
private NetMessage WhenReqLogout(ServerVisitor client, NetMessageStream msg) { this.RemoveLoginUser(client.ID); return(null); }
private NetMessage WhenReqAttackTerritory(ServerVisitor client, NetMessageStream msg) { // 클릭속도 제한 m_attackLimiter.Set(client.ID, GameValues.MinAttackDelay); if (m_attackLimiter.Tick(client.ID)) { m_attackLimiter.Update(client.ID); string attackerName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 유저 인증하고 // 해당 지역이 있으면 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == attackerName && this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { // 공격/점령 this.AttackTerritory(attackerName, tileX, tileY, client); } } return(null); }
private NetMessage WhenReqReadMail(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int index = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); if (user != null) { var mailbox = user.Mailbox; if (index >= 0 && index < mailbox.Count) { mailbox[index].Read = true; } } } return(null); }
private NetMessage WhenReqBuildCountry(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); const int beginningMoney = 100; // 로그 Utility.Logger.GetInstance().Log(string.Format("\"{0}\"님이 건국을 요청했습니다.", userName)); // 유저 인증하고 // 해당 지역이 있고 // 유저가 아무런 땅도 가지지 않은게 맞으면 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName && this.GameBoard.Board.ContainsItemAt(tileX, tileY) && this.UserDirector.GetAccount(userName).AreaCount <= 0) { var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 주인없는 땅이면 if (tile.HaveOwner == false) { // 건국 this.GameBoard.SetOwnerAt(tileX, tileY, userName); this.GameBoard.SetPowerAt(tileX, tileY, beginningMoney); // 계정의 영토크기 정보 갱신 this.UserDirector.GetAccount(userName).AreaCount = 1; // 건국 알림 NetMessageStream writer = new NetMessageStream(); writer.WriteData <int>(1); // 성공여부 writer.WriteData(userName); writer.WriteData(tileX); writer.WriteData(tileY); writer.WriteData(beginningMoney); this.NoticeDelegate(writer.CreateMessage((int)MessageTypes.Ntf_CountryBuilt)); return(null); } } // 건국 실패 알림 NetMessageStream failWriter = new NetMessageStream(); failWriter.WriteData <int>(0); return(failWriter.CreateMessage((int)MessageTypes.Ntf_CountryBuilt)); }
private NetMessage WhenReqDiscardProduct(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string companyName = msg.ReadData <string>().Trim(); int productIndex = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); var company = this.FindCompanyByName(companyName); // 유저가 존재하고 // 존재하는 회사가 유저의 소유이고 // 제품 번호가 유효하면 if (user != null && company != null && company.Owner == user.Name && productIndex >= 0 && productIndex < company.ProductList.Count) { // 회사에서 제품 폐기 company.RemoveProductAt(productIndex); // 제품 폐기 알림 return(this.GetDiscardProductNotice(companyName, productIndex)); } } return(null); }
private NetMessage WhenReqMyAllCompanyName(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadString(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); if (user != null) { // 회사 이름 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(user.Companies.Count); foreach (string companyName in user.Companies) { writer.WriteData(companyName); } return(writer.CreateMessage((int)MessageTypes.Rsp_MyAllCompanyName)); } } return(null); }
//##################################################################################### // 수신된 메세지 처리 private NetMessage WhenReqNotice(ServerVisitor client, NetMessageStream msg) { NetMessageStream writer = new NetMessageStream(); writer.WriteData(this.Notice); return(writer.CreateMessage((int)MessageTypes.Ntf_Notice)); }
private NetMessage WhenReqProduceProduct(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string companyName = msg.ReadData <string>().Trim(); string techName = msg.ReadData <string>().Trim(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); var company = this.FindCompanyByName(companyName); // 유저가 존재하고 // 존재하는 회사가 유저의 소유이고 // 기술 이름이 유효하고 if (user != null && company != null && company.Owner == user.Name && techName.Length > 0) { Chip techChip = company.GetTech(techName); if (techChip != null) { int produceFee = techChip.Program.Count * GameValues.ProduceFeePerProgramLine; int maxProductCount = this.GetCompanySiteCount(companyName) * GameValues.CompanyProductSizePerSite; // 생산비가 충분하고 // 여유공간이 있으면 if (user.Resource >= produceFee && company.ProductList.Count < maxProductCount) { // 생산비 차감 user.Resource -= produceFee; // 회사 창고에 생산품 추가 company.AddProduct(techChip.Clone()); // 생산 알림 NetMessageStream writer = new NetMessageStream(); writer.WriteData(companyName); writer.WriteData(techName); return(writer.CreateMessage((int)MessageTypes.Rsp_ProduceProduct)); } } } } return(null); }
//##################################################################################### protected void NtfReceiveMailTo(ServerVisitor targetClient, Mail mail) { NetMessageStream writer = new NetMessageStream(); writer.WriteData <int>(mail.Read ? 1 : 0); writer.WriteData(mail.From); writer.WriteData(mail.To); writer.WriteData(mail.SendingDate); writer.WriteData(mail.Message); targetClient.Sender.SendMessage(writer.CreateMessage((int)MessageTypes.Ntf_ReceiveMail)); }
private NetMessage WhenReqTechProgram(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string companyName = msg.ReadData <string>().Trim(); string techName = msg.ReadData <string>().Trim(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); var company = this.FindCompanyByName(companyName); // 유저가 존재하고 // 존재하는 회사가 유저의 소유이고 // 기술 이름이 유효하고 if (user != null && company != null && company.Owner == user.Name && techName.Length > 0) { Chip techChip = company.GetTech(techName); // 해당 기술이 회사에 존재하면 if (techChip != null) { var program = techChip.Program; // 기술 프로그램 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(companyName); writer.WriteData(techName); writer.WriteData(program.Count); foreach (var cmd in program) { cmd.WriteToStream(writer); } return(writer.CreateMessage((int)MessageTypes.Rsp_TechProgram)); } } } return(null); }
private NetMessage WhenReqMyAllCompanySiteCount(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadString(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); if (user != null) { // 자기 회사별 건물 개수 계산 var wholeCompanySiteCount = this.CompanyDirector.CompanySiteCount; Dictionary <string, int> myCompanySiteCount = new Dictionary <string, int>(); var myCompanies = user.Companies; foreach (string myCompany in myCompanies) { if (wholeCompanySiteCount.ContainsKey(myCompany)) { myCompanySiteCount.Add(myCompany, wholeCompanySiteCount[myCompany]); } } // 회사별 건물 개수 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(myCompanySiteCount.Count); foreach (var company_count in myCompanySiteCount) { writer.WriteData(company_count.Key); writer.WriteData(company_count.Value); } return(writer.CreateMessage((int)MessageTypes.Rsp_MyAllCompanySiteCount)); } } return(null); }
private NetMessage WhenReqConvertAllResource(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { this.ConvertResource(user.Name, tileX, tileY, true); } return(null); }
//##################################################################################### // 수신된 메세지 처리 private NetMessage WhenReqSendMail(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string targetName = msg.ReadData <string>(); string date = msg.ReadData <string>(); string message = msg.ReadData <string>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { var targetUser = this.UserDirector.GetAccount(targetName); if (targetUser != null) { Mail mail = new Mail() { Read = false, From = userName, To = targetName, SendingDate = date, Message = message, }; // 메일함에 추가 targetUser.Mailbox.Insert(0, mail); // 메일함의 크기가 너무 크면 오래된 메일부터 지움. if (targetUser.Mailbox.Count > this.MaxMailboxSize) { targetUser.Mailbox.RemoveRange(this.MaxMailboxSize, targetUser.Mailbox.Count - this.MaxMailboxSize); } // 메일 수신 알림 this.NtfReceiveMailTo(targetName, mail); } } return(null); }
private NetMessage WhenReqNewTerritory(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); // 적당한 영토 고름 int tileX, tileY; this.GameBoard.CreateRandomTerritory(out tileX, out tileY); // 영토 위치 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(tileX); writer.WriteData(tileY); return(writer.CreateMessage((int)MessageTypes.Rsp_NewTerritory)); }
private NetMessage WhenReqEditTileSign(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); string sign = msg.ReadData <string>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { this.EditSign(userName, tileX, tileY, sign); } return(null); }
//##################################################################################### // 수신된 메세지 처리 private NetMessage WhenReqCountryLocation(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); // 국가 위치 찾기 int x, y; bool exist = this.GameBoard.FindCountryLocation(userName, out x, out y); // 국가 위치 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData <int>(exist ? 1 : 0); writer.WriteData(x); writer.WriteData(y); return(writer.CreateMessage((int)MessageTypes.Rsp_CountryLocation)); }
private NetMessage WhenReqMyAllCompanyProductList(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadString(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); if (user != null) { var companies = user.Companies; // 회사별 제품 정보 전송 NetMessageStream writer = new NetMessageStream(); writer.WriteData(companies.Count); for (int i = 0; i < companies.Count; ++i) { var company = this.CompanyDirector.FindCompanyByName(companies[i]); var productList = company.ProductList; writer.WriteData(companies[i]); writer.WriteData(productList.Count); foreach (var chip in productList) { writer.WriteData(chip.Name); } } return(writer.CreateMessage((int)MessageTypes.Rsp_MyAllCompanyProductList)); } } return(null); }
//##################################################################################### // 수신된 메세지 처리 private NetMessage WhenReqUserColor(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadString(); var user = this.UserDirector.GetAccount(userName); if (user != null) { NetMessageStream writer = new NetMessageStream(); writer.WriteData(userName); writer.WriteData(user.UserColor.ToArgb()); return(writer.CreateMessage((int)MessageTypes.Rsp_UserColor)); } return(null); }
private NetMessage WhenReqDestroyFactory(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { // 해당 타일이 존재하고 if (this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 타일의 주인이 맞고 // 공장타일이면 if (tile.Owner == userName && tile.IsFactoryTile) { // 공장 폐쇄 this.GameBoard.DestroyFactory(tileX, tileY); // 공장 폐쇄 알림 NetMessageStream writer = new NetMessageStream(); writer.WriteData(userName); writer.WriteData(tileX); writer.WriteData(tileY); this.NoticeToUsersInVision(writer.CreateMessage((int)MessageTypes.Ntf_DestroyFactory), tileX, tileY); } } } return(null); }
private NetMessage WhenReqSendPower(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int fromX = msg.ReadData <int>(); int fromY = msg.ReadData <int>(); int toX = msg.ReadData <int>(); int toY = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { // 힘 보내기 this.SendPower(user.Name, fromX, fromY, toX, toY); } return(null); }
private NetMessage WhenReqAddTilePower(ServerVisitor client, NetMessageStream msg) { // 클릭속도 제한 m_addPowerLimiter.Set(client.ID, GameValues.MinAddPowerDelay); if (m_addPowerLimiter.Tick(client.ID)) { m_addPowerLimiter.Update(client.ID); string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); const int deltaPower = 1; // 클라이언트가 userName을 변조해서 보낸것인지 확인한다음 문제없고 // 요청받은 타일이 서버에 존재하면 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName && this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 유저의 소유 타일이 맞으면 if (tile.Owner == userName) { // GameBoard 갱신 this.GameBoard.AddPowerAt(tileX, tileY, deltaPower); // 타일 Power 변경 통보 this.NtfSetPower(tileX, tileY, tile.Power); } } } return(null); }
private NetMessage WhenReqChunk(ServerVisitor client, NetMessageStream msg) { int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); int chunkX, chunkY; this.GameBoard.Board.GetChunkPosContainsItemAt(tileX, tileY, out chunkX, out chunkY); var chunk = this.GameBoard.Board.GetChunkContainsItemAt(tileX, tileY); if (chunk != null) { // 청크 데이터 얻기 NetMessageStream writer = new NetMessageStream(); writer.WriteData(chunkX); writer.WriteData(chunkY); for (int x = 0; x < chunk.GetLength(0); ++x) { for (int y = 0; y < chunk.GetLength(1); ++y) { var tile = chunk[x, y]; tile.WriteToStream(writer); } } // 청크 데이터 전송 return(writer.CreateMessage((int)MessageTypes.Rsp_Chunk)); } return(null); }
private NetMessage WhenReqDiscardTech(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string companyName = msg.ReadData <string>().Trim(); string techName = msg.ReadData <string>().Trim(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); var company = this.FindCompanyByName(companyName); // 유저가 존재하고 // 존재하는 회사가 유저의 소유이고 // 기술 이름이 유효하면 if (user != null && company != null && company.Owner == user.Name && techName.Length > 0) { // 회사에서 기술 제거 company.RemoveTech(techName); // 기술 폐기 알림 NetMessageStream writer = new NetMessageStream(); writer.WriteData(companyName); writer.WriteData(techName); return(writer.CreateMessage((int)MessageTypes.Rsp_DiscardTech)); } } return(null); }
private NetMessage WhenReqSetScreen(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int left = msg.ReadData <int>(); int top = msg.ReadData <int>(); int width = msg.ReadData <int>(); int height = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { Rectangle rect = new Rectangle(left, top, width, height); if (m_userScreen.ContainsKey(user.Name) == false) { m_userScreen.Add(user.Name, new Rectangle(0, 0, 0, 0)); } // 이전 화면영역 정보와 다르면 if (m_userScreen[user.Name] != rect) { // 새로 보이는 곳의 정보 전달 this.SyncChangedTiles(client, user.Name, rect); // 갱신 m_userScreen[user.Name] = rect; } } return(null); }
private NetMessage WhenReqDestroyChip(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { // 해당 타일이 존재하고 if (this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 타일의 주인이 맞고 // 칩 타일이면 if (tile.Owner == userName && tile.IsChipTile) { // 칩 제거 this.CompanyDirector.RemoveChip(tileX, tileY); this.GameBoard.DestroyChip(tileX, tileY); // 칩 제거 알림 this.NoticeDestroyChip(tileX, tileY); } } } return(null); }
private NetMessage WhenReqSellTech(ServerVisitor client, NetMessageStream msg) { string userName = msg.ReadData <string>(); string companyName = msg.ReadData <string>().Trim(); string techName = msg.ReadData <string>().Trim(); int price = msg.ReadData <int>(); string targetUser = msg.ReadData <string>(); // 인증 var user = this.UserDirector.GetLoginUser(client.ID); if (user != null && user.Name == userName) { user = this.UserDirector.GetAccount(user.Name); var company = this.FindCompanyByName(companyName); // 유저가 존재하고 // 존재하는 회사가 유저의 소유이고 // 기술 이름이 유효하고 if (user != null && company != null && company.Owner == user.Name && techName.Length > 0) { Chip techChip = company.GetTech(techName); // 해당 기술이 회사에 존재하면 if (techChip != null) { // 판매 허가 및 기술 상점에 추가 SellingTech sellingTech = new SellingTech() { Name = techChip.Name, Price = price, Seller = company.Name, TargetUser = targetUser, Item = techChip.Clone(), }; m_techStore.Add(sellingTech); // 기술 판매 알림 NetMessageStream writer = new NetMessageStream(); writer.WriteData(company.Name); writer.WriteData(techChip.Name); writer.WriteData(price); // 따로 허가된 유저가 있으면 if (targetUser.Length > 0) { // 판매자와 그 유저에게만 알림 this.NoticeWhereDelegate(new string[] { targetUser, user.Name }, writer.CreateMessage((int)MessageTypes.Ntf_SellTech)); } else { // 전체공개이면 그냥 모두에게 알림 this.NoticeDelegate(writer.CreateMessage((int)MessageTypes.Ntf_SellTech)); } } } } return(null); }