private void WhenRspUpdateChunk(NetMessageStream msg) { int chunkX = msg.ReadData <int>(); int chunkY = msg.ReadData <int>(); // 청크 생성 this.GameBoard.Board.CreateChunkAt(chunkX, chunkY); // 청크 데이터 얻기 int chunkSize = this.GameBoard.Board.ChunkSize; for (int x = 0; x < chunkSize; ++x) { int tileX = chunkX * chunkSize + x; for (int y = 0; y < chunkSize; ++y) { int tileY = chunkY * chunkSize + y; var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); tile.ReadFromStream(msg); tile.Visible = true; } } }
private void WhenNtfSetTilePower(NetMessageStream msg) { int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); int newPower = msg.ReadData <int>(); // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(tileX, tileY)) { // 힘 동기화 this.GameBoard.SetPowerAt(tileX, tileY, newPower); } // 타일 Power 변경 알림 if (m_addTilePowerCallback != null) { m_addTilePowerCallback(tileX, tileY, newPower); m_addTilePowerCallback = null; } // 이벤트 발생 this.EventDirector.StartEvent((int)BoardEvents.PowerUpTerritory, tileX, tileY, ""); }
private void WhenRspMyAllCompanyProductList(NetMessageStream msg) { this.MyCompanyProductList.Clear(); int count = msg.ReadData <int>(); for (int i = 0; i < count; ++i) { string company = msg.ReadData <string>(); int productCount = msg.ReadData <int>(); List <string> productList = null; if (this.MyCompanyProductList.ContainsKey(company)) { productList = this.MyCompanyProductList[company]; } else { productList = new List <string>(); this.MyCompanyProductList.Add(company, productList); } for (int t = 0; t < productCount; ++t) { productList.Add(msg.ReadData <string>()); } } }
private void WhenNtfDestroyCompany(NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); string companyName = msg.ReadData <string>(); // 자신의 회사이면 if (this.UserDataDirector.Me.Companies.Any((name) => name == companyName)) { // 건물 개수 갱신 this.UserDataDirector.AddMyCompanySiteCount(companyName, -1); } // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.BoardDirector.GameBoard.TileExistsAndVisibleAt(tileX, tileY)) { // 동기화 this.BoardDirector.GameBoard.DestroyCompany(tileX, tileY); } // 이벤트 발생 this.EventDirector.StartEvent((int)CompanyEvents.DestroyCompany, tileX, tileY, userName, new object[] { companyName }); }
//##################################################################################### // 수신된 메세지 처리 private void WhenNtfReceiveMail(NetMessageStream msg) { int readFlag = msg.ReadData <int>(); string fromUser = msg.ReadData <string>(); string toUser = msg.ReadData <string>(); string sendingDate = msg.ReadData <string>(); string message = msg.ReadData <string>(); // 수신함에 추가 Mail mail = new Mail() { Read = (readFlag != 0), From = fromUser, To = toUser, SendingDate = sendingDate, Message = message, }; m_mailbox.Insert(0, mail); if (m_receiveMailCallback != null) { m_receiveMailCallback(mail); } // 이벤트 발생 this.EventDirector.StartEvent((int)CommunicationEvents.ReceiveMail, fromUser, new object[] { mail }); }
private void WhenRspAllTerritory(NetMessageStream msg) { int chunkX = msg.ReadData <int>(); int chunkY = msg.ReadData <int>(); int chunkPosX = chunkX * this.GameBoard.Board.ChunkSize; int chunkPosY = chunkY * this.GameBoard.Board.ChunkSize; while (!msg.EndOfStream) { int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); tileX += chunkPosX; tileY += chunkPosY; // NOTE: 없는 타일이면 자동으로 생성됨. var tile = this.GameBoard.Board.GetItemAt(tileX, tileY); // 시야에 보이는 타일로 설정 tile.Visible = true; // 동기화 tile.Owner = this.SignDirector.LoginName; tile.ReadFromStreamExceptOwner(msg); } }
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 void WhenRspUserColor(NetMessageStream msg) { string userName = msg.ReadData <string>(); int colorRgb = msg.ReadData <int>(); if (m_userColorMap.ContainsKey(userName)) { m_userColorMap[userName] = Color.FromArgb(colorRgb); } else { m_userColorMap.Add(userName, Color.FromArgb(colorRgb)); } if (m_userColorCallback != null) { m_userColorCallback(userName, Color.FromArgb(colorRgb)); --m_userColorCallbackCount; if (m_userColorCallbackCount <= 0) { m_userColorCallbackCount = 0; m_userColorCallback = null; } } }
public void WhenNtfBuyProduct(NetMessageStream msg) { string companyName = msg.ReadData <string>().Trim(); string productName = msg.ReadData <string>().Trim(); int price = msg.ReadData <int>(); // 제품 상점 목록에서 제거 for (int i = 0; i < this.ProductStore.Count; ++i) { var product = this.ProductStore[i]; if (product.Seller == companyName && product.Name == productName && product.Price == product.Price) { this.ProductStore.RemoveAt(i); break; } } // 이벤트 발생 this.EventDirector.StartEvent((int)CompanyEvents.BuyProduct, 0, 0, companyName, new object[] { productName, price }); }
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 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 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); }
public void WhenNtfBuyTech(NetMessageStream msg) { string companyName = msg.ReadData <string>().Trim(); string techName = msg.ReadData <string>().Trim(); int price = msg.ReadData <int>(); // 기술 상점 목록에서 제거 for (int i = 0; i < this.TechStore.Count; ++i) { var tech = this.TechStore[i]; if (tech.Seller == companyName && tech.Name == techName && tech.Price == tech.Price) { this.TechStore.RemoveAt(i); break; } } // 이벤트 발생 this.EventDirector.StartEvent((int)CompanyEvents.BuyTech, 0, 0, companyName, new object[] { techName, price }); }
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 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); }
private void WhenNtfSendPower(NetMessageStream msg) { int sendingPower = msg.ReadData <int>(); int fromX = msg.ReadData <int>(); int fromY = msg.ReadData <int>(); int fromTilesPower = msg.ReadData <int>(); string fromTilesOwner = msg.ReadData <string>(); int toX = msg.ReadData <int>(); int toY = msg.ReadData <int>(); int toTilesPower = msg.ReadData <int>(); string toTilesOwner = msg.ReadData <string>(); // 변경사항 동기화 // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(fromX, fromY)) { // 동기화 this.GameBoard.SetPowerAt(fromX, fromY, fromTilesPower); } // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(toX, toY)) { // 동기화 this.GameBoard.SetPowerAt(toX, toY, toTilesPower); } // 이벤트 발생 this.EventDirector.StartEvent((int)BoardEvents.SendPower, fromX, fromY, fromTilesOwner, new object[] { toTilesOwner, sendingPower }); }
private void WhenNtfCountryBuilt(NetMessageStream msg) { bool success = (msg.ReadData <int>() != 0); if (success) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); int beginningMoney = msg.ReadData <int>(); // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(tileX, tileY)) { // 동기화 this.GameBoard.SetOwnerAt(tileX, tileY, userName); this.GameBoard.SetPowerAt(tileX, tileY, beginningMoney); } // 자신의 건국인데 if (this.SignDirector.LoginName == userName) { // 보드에 해당 지역이 존재하지 않으면 if (!this.GameBoard.Board.ContainsItemAt(tileX, tileY)) { // 해당 지역의 정보를 요청 this.UpdateChunkContainsTileAt(tileX, tileY); } // 건국 알림 if (m_buildCountryCallback != null) { m_buildCountryCallback(success, tileX, tileY); m_buildCountryCallback = null; } } // 이벤트 발생 this.EventDirector.StartEvent((int)BoardEvents.BuildCountry, tileX, tileY, userName); } else { // 건국 실패 알림 if (m_buildCountryCallback != null) { m_buildCountryCallback(success, 0, 0); m_buildCountryCallback = null; } } }
private void WhenNtfUserEnd(NetMessageStream msg) { string endUserName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 이벤트 발생 this.EventDirector.StartEvent((int)BoardEvents.EndUser, tileX, tileY, endUserName); }
private void WhenNtfConvertAllResource(NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); int powerGet = msg.ReadData <int>(); // 이벤트 발생 this.EventDirector.StartEvent((int)BoardEvents.ConvertAllResource, tileX, tileY, userName, new object[] { powerGet }); }
//##################################################################################### // 수신된 메세지 처리 private void WhenRspRegisterCompany(NetMessageStream msg) { RegisterCompanyResults result = (RegisterCompanyResults)msg.ReadData <int>(); string name = msg.ReadData <string>(); if (m_registerCompanyCallback != null) { m_registerCompanyCallback(result); m_registerCompanyCallback = null; } }
private void WhenNtfDestroyChip(NetMessageStream msg) { int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(tileX, tileY)) { // 동기화 this.GameBoard.DestroyChip(tileX, tileY); } }
private void WhenRspNewTerritory(NetMessageStream msg) { int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 새 영토 위치 알림 if (m_requestNewTerritoryCallback != null) { m_requestNewTerritoryCallback(tileX, tileY); m_requestNewTerritoryCallback = null; } }
//##################################################################################### // 수신된 메세지 처리 private void WhenRspCountryLocation(NetMessageStream msg) { int exist = msg.ReadData <int>(); int x = msg.ReadData <int>(); int y = msg.ReadData <int>(); // 국가 위치 알림 if (m_requestCountryLocationCallback != null) { m_requestCountryLocationCallback((exist != 0), x, y); m_requestCountryLocationCallback = null; } }
public void ReadFromStream(NetMessageStream stream) { this.Parameters.Clear(); this.Name = stream.ReadData <string>(); int paramCount = stream.ReadData <int>(); for (int i = 0; i < paramCount; ++i) { this.Parameters.Add(stream.ReadData <string>()); } }
private void WhenNtfCheckUser(NetMessageStream msg) { int data = msg.ReadData <int>(); this.WhenCheckUser(data); }
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 void WhenNtfDestroyFactory(NetMessageStream msg) { string userName = msg.ReadData <string>(); int tileX = msg.ReadData <int>(); int tileY = msg.ReadData <int>(); // 공장 동기화 // 클라측 보드에 존재하는 지역이고 시야 내의 타일이면 if (this.GameBoard.TileExistsAndVisibleAt(tileX, tileY)) { // 동기화 this.GameBoard.DestroyFactory(tileX, tileY); } }
private NetMessage WhenReqMyAllCompanyName(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) { // 회사 이름 전송 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 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 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); }