public override string ToString() { string Msg; if (Opponent != null) { Msg = Id.ToString() + ',' + Owner.Name + ',' + Opponent.Name + ',' + NumOfPlayers + ',' + Level + ',' + Category + ',' + Join.ToString() + ',' + Word + ';'; } else { Msg = Id.ToString() + ',' + Owner.Name + ',' + "" + ',' + NumOfPlayers + ',' + Level + ',' + Category + ',' + Join.ToString() + ',' + Word + ';'; } return(Msg); }
public void RUN() { CheckForIllegalCrossThreadCalls = false; // cross thread false //MessageBox.Show("TTT"); //this.m_listener = new TcpListener(7777); //this.m_listener.Start(); //m_listener = null; IPAddress locAddr = IPAddress.Parse(textBox_IP.Text);/* int port = 13000;*/ m_listener = new TcpListener(locAddr, Int32.Parse(textBox_PortNumber.Text)); //server = new TcpListener(IPAddress.Parse("127.0.0.1"), 13002); m_listener.Start(); if (!this.m_bClientOn) { this.Invoke(new MethodInvoker(delegate() { TextBox_ServerLog.Text = ("Server - Start\n"); TextBox_ServerLog.AppendText(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test" + "\n"); //저장 파일 폴더 System.IO.Directory.CreateDirectory(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test"); // 없다면 생성 되도록 함 if (this.m_file_writer == null) { this.m_file_writer = new StreamWriter(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test" + "\\member.txt", true); } m_file_writer.Flush(); m_file_writer.Close(); m_file_writer = null; this.m_file_reader = new StreamReader(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test" + "\\member.txt"); ////처음으로 돌립니다. //if (this.m_file_reader.Peek() < 0) this.m_file_reader.BaseStream.Seek(0, SeekOrigin.Begin); //리스트뷰에 넣기 int i = 1; while (m_file_reader.Peek() >= 0) { ListViewItem item = new ListViewItem(i.ToString()); foreach (string ohohstring in m_file_reader.ReadLine().Split(new char[] { ',' })) { item.SubItems.Add(ohohstring); } MemberList.Items.Add(item); i++; } this.m_file_reader.Close(); this.m_file_reader = null; //MessageBox.Show("멤버 파일을 모두 읽어 왔습니다."); //this.m_file_writer = File.AppendText("log.txt"); })); } //MessageBox.Show("저 여기서 기다리고 있씁니다."); TextBox_ServerLog.AppendText("Waiting for a connection...\n"); TcpClient client = m_listener.AcceptTcpClient(); if (client.Connected) { this.m_bClientOn = true; this.Invoke(new MethodInvoker(delegate() { TextBox_ServerLog.AppendText("Client Access!!\n"); })); m_networkstream = client.GetStream(); } //listening loop // 여기 무한 루프라서 안 되네 int nRead = 0; //MessageBox.Show("여기는 오니?"); while (this.m_bClientOn) { //MessageBox.Show("TTTTT"); try { nRead = 0; //MessageBox.Show("AAAA"); nRead = this.m_networkstream.Read(readBuffer, 0, 1024 * 1024 * 4); //여기서 멈춰있나 Packet packet = (Packet)Packet.Desserialize(this.readBuffer); //이거 까지 올려야되나 switch ((int)packet.Type) { case (int)PacketType.회원가입: { this.m_joinClass = (Join)Packet.Desserialize(this.readBuffer); int a = 0; this.Invoke(new MethodInvoker(delegate() { for (int i = 0; i < MemberList.Items.Count; i++) //같은거 확인하려고 했는데 안되네 { if (m_joinClass.m_strID.Equals(MemberList.Items[i].SubItems[1].Text)) { Join joinClass = new Join(); joinClass.Type = (int)PacketType.회원가입; joinClass.Data = 1; joinClass.str = "이미 사용중인 ID입니다."; Packet.Serialize(joinClass).CopyTo(this.sendBuffer, 0); this.Send(); a = 1; break; } } if (a != 1) { ListViewItem item; item = MemberList.Items.Add((MemberList.Items.Count + 1).ToString()); //오예 추가된다 기모띠 item.SubItems.Add(this.m_joinClass.m_strID); item.SubItems.Add(this.m_joinClass.m_strPassword); //회원 가입 완료 this.TextBox_ServerLog.AppendText(this.m_joinClass.m_strID + " >> Join\n"); if (this.m_file_writer == null) { this.m_file_writer = new StreamWriter(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test" + "\\member.txt", true); } System.IO.Directory.CreateDirectory(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test\\" + this.m_joinClass.m_strID); // 개인 폴더 생성 m_file_writer.WriteLine(this.m_joinClass.m_strID + "," + this.m_joinClass.m_strPassword); m_file_writer.Flush(); m_file_writer.Close(); m_file_writer = null; //System.IO.Directory.CreateDirectory(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test\\"+ this.m_joinClass.m_strID);// 없다면 생성 되도록 함 Join joinClass = new Join(); joinClass.Type = (int)PacketType.회원가입; joinClass.Data = 0; Packet.Serialize(joinClass).CopyTo(this.sendBuffer, 0); this.Send(); } })); break; } case (int)PacketType.로그인: { this.m_loginClass = (Login)Packet.Desserialize(this.readBuffer); int a = 0; this.Invoke(new MethodInvoker(delegate() { //MessageBox.Show(MemberList.Items.Count.ToString());//Test for (int i = 0; i < MemberList.Items.Count; i++) //가입 확인하고 로그인 시켜주자 { //MessageBox.Show(MemberList.Items[i].SubItems[1].Text); if (m_loginClass.m_strID.Equals(MemberList.Items[i].SubItems[1].Text)) //왜 이게 안되지?? { this.TextBox_ServerLog.AppendText(this.m_loginClass.m_strID + " >> Login\n"); Login loginClass = new Login(); loginClass.Type = (int)PacketType.로그인; loginClass.Data = 0; Packet.Serialize(loginClass).CopyTo(this.sendBuffer, 0); this.Send(); a = 1; break; } } if (a != 1) { a = 0; Login loginClass = new Login(); loginClass.Type = (int)PacketType.로그인; loginClass.Data = 1; loginClass.str = "ID 또는 PW가 잘못되었습니다.\n계정이 없다면 회원가입 버튼을 통해 계정을 만드십시오!"; Packet.Serialize(loginClass).CopyTo(this.sendBuffer, 0); this.Send(); } })); break; } case (int)PacketType.조회: { this.m_searchClass = (Search)Packet.Desserialize(this.readBuffer); int a = 0; this.Invoke(new MethodInvoker(delegate() { List <String> parts = new List <String>(); for (int i = 0; i < MemberList.Items.Count; i++) //같은거 확인하려고 했는데 안되네 { if (m_searchClass.m_strID.Equals(MemberList.Items[i].SubItems[1].Text)) { continue; } parts.Add(MemberList.Items[i].SubItems[1].Text); //MessageBox.Show(parts[i]); } Search searchClass = new Search(); searchClass.Type = (int)PacketType.조회; searchClass.Data = 0; searchClass.m_list = parts; Packet.Serialize(searchClass).CopyTo(this.sendBuffer, 0); this.Send(); //MessageBox.Show("보냈쪄"); })); break; } case (int)PacketType.업로드: { this.m_uploadClass = (Upload)Packet.Desserialize(this.readBuffer); int a = 0; this.Invoke(new MethodInvoker(delegate() { const string fileName = "Test#@@#.dat"; using (FileStream fileStream = new FileStream(fileName, FileMode.Create)) { for (int i = 0; i < m_uploadClass.m_byte.Length; i++) { fileStream.WriteByte(m_uploadClass.m_byte[i]); } Image img = System.Drawing.Image.FromStream(fileStream); img.Save(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test\\" + this.m_loginClass.m_strID + "\\" + m_uploadClass.m_filename); } MessageBox.Show("수신 완료\n경로 : " + Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test\\" + this.m_loginClass.m_strID + "\\" + m_uploadClass.m_filename); //if (this.m_file_writer == null) // this.m_file_writer = new StreamWriter(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test" + this.m_loginClass.m_strID + "\\" +"message.txt", true); ////System.IO.Directory.CreateDirectory(Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName + "\\test\\" + this.m_joinClass.m_strID);// 개인 폴더 생성 //m_file_writer.WriteLine(m_uploadClass.m_message); //m_file_writer.Flush(); //m_file_writer.Close(); //m_file_writer = null; //MessageBox.Show(); //Search searchClass = new Search(); //searchClass.Type = (int)PacketType.조회; //searchClass.Data = 0; //searchClass.m_list = parts; //Packet.Serialize(searchClass).CopyTo(this.sendBuffer, 0); //this.Send(); })); break; } } } catch { this.m_bClientOn = false; this.m_networkstream = null; break;//오 이러니까 되는거 같다. 개꿀 또 안되네 뭐지 } } }
public void ProcessPacket(int packetID, Player player) { switch ((PacketID)packetID) { case PacketID.entityUpdate: #region entity update var entityUpdate = new EntityUpdate(player.reader); string ACmessage = AntiCheat.Inspect(entityUpdate); if (ACmessage != "ok") { var kickMessage = new ChatMessage() { message = "illegal " + ACmessage }; kickMessage.Write(player.writer, true); Console.WriteLine(player.entityData.name + " kicked for illegal " + kickMessage.message); Thread.Sleep(100); //thread is about to run out anyway so np Kick(player); return; } if (entityUpdate.name != null) { Announce.Join(entityUpdate.name, player.entityData.name, players); } entityUpdate.entityFlags |= 1 << 5; //enable friendly fire flag for pvp if (!player.entityData.IsEmpty) { entityUpdate.Filter(player.entityData); } if (!entityUpdate.IsEmpty) { entityUpdate.Broadcast(players, 0); if (entityUpdate.HP == 0 && player.entityData.HP > 0) { Tomb.Show(player).Broadcast(players, 0); } else if (player.entityData.HP == 0 && entityUpdate.HP > 0) { Tomb.Hide(player).Broadcast(players, 0); } entityUpdate.Merge(player.entityData); } break; #endregion case PacketID.entityAction: #region action EntityAction entityAction = new EntityAction(player.reader); switch (entityAction.type) { case ActionType.talk: break; case ActionType.staticInteraction: //var staticEntity = new StaticEntity(); //staticEntity.chunkX = entityAction.chunkX; //staticEntity.chunkY = entityAction.chunkY; //staticEntity.id = entityAction.index; //staticEntity.type = 0; //staticEntity.position = player.entityData.position; //staticEntity.rotation = 0; //staticEntity.size.x = 2; //staticEntity.size.y = 1; //staticEntity.size.z = 1; //staticEntity.closed = 0; //staticEntity.time = 1000; //staticEntity.guid = player.entityData.guid; //var serverUpdate = new ServerUpdate(); //serverUpdate.statics.Add(staticEntity); //serverUpdate.Send(players, 0); break; case ActionType.pickup: //shouldn't occur since item drops are disabled break; case ActionType.drop: //send item back to dropper because dropping is disabled to prevent chatspam var pickup = new ServerUpdate.Pickup() { guid = player.entityData.guid, item = entityAction.item }; var serverUpdate6 = new ServerUpdate(); serverUpdate6.pickups.Add(pickup); serverUpdate6.Write(player.writer, true); break; case ActionType.callPet: var petItem = player.entityData.equipment[(int)Equipment.pet]; var pet = new EntityUpdate() { guid = 2000 + player.entityData.guid, position = player.entityData.position, hostility = (int)Hostility.pet, entityType = 28, appearance = player.entityData.appearance, HP = 999, parentOwner = 3000 + (long)player.entityData.guid, equipment = player.entityData.equipment, name = "doppelganger" }; pet.Broadcast(players, 0); pet = new EntityUpdate() { guid = 3000 + player.entityData.guid, position = player.entityData.position, hostility = (int)Hostility.pet, entityType = 28, mode = 106, appearance = player.entityData.appearance, HP = 999, parentOwner = (long)player.entityData.guid, equipment = player.entityData.equipment, name = "doppelganger" }; pet.Broadcast(players, 0); break; default: Console.WriteLine("unknown action (" + entityAction.type + ") by " + player.entityData.name); break; } break; #endregion case PacketID.hit: #region hit var hit = new Hit(player.reader); hit.damage *= 0.75f; if (players.ContainsKey(hit.target)) { var serverUpdate7 = new ServerUpdate(); serverUpdate7.hits.Add(hit); serverUpdate7.Broadcast(players, player.entityData.guid); } break; #endregion case PacketID.passiveProc: #region passiveProc var passiveProc = new PassiveProc(player.reader); var serverUpdate8 = new ServerUpdate(); serverUpdate8.passiveProcs.Add(passiveProc); serverUpdate8.Broadcast(players, player.entityData.guid); switch (passiveProc.type) { case ProcType.warFrenzy: case ProcType.camouflage: case ProcType.fireSpark: case ProcType.intuition: case ProcType.elusivenes: case ProcType.swiftness: //nothing particular yet break; case ProcType.manashield: var chatMessage6m = new ChatMessage() { message = string.Format("manashield: {0}", passiveProc.modifier), sender = 0 }; chatMessage6m.Write(player.writer, true); break; case ProcType.bulwalk: var chatMessage6b = new ChatMessage() { message = string.Format("bulwalk: {0}% dmg reduction", 1.0f - passiveProc.modifier), sender = 0 }; chatMessage6b.Write(player.writer, true); break; case ProcType.poison: if (players.ContainsKey(passiveProc.target)) //in case target is a tomb or sth { var poisonDmg = new Hit() { attacker = passiveProc.source, target = passiveProc.target, damage = passiveProc.modifier, position = players[passiveProc.target].entityData.position, type = DamageType.normal }; var poisonTick = new ServerUpdate(); poisonTick.hits.Add(poisonDmg); Poison(poisonTick, passiveProc.duration); } break; default: Console.WriteLine("unknown passiveProc.type: " + passiveProc.type); break; } break; #endregion case PacketID.shoot: #region shoot var shoot = new Shoot(player.reader); var serverUpdate9 = new ServerUpdate(); serverUpdate9.shoots.Add(shoot); serverUpdate9.Broadcast(players, player.entityData.guid); break; #endregion case PacketID.chat: #region chat var chatMessage = new ChatMessage(player.reader) { sender = player.entityData.guid }; if (chatMessage.message.StartsWith("/")) { string parameter = ""; string command = chatMessage.message.Substring(1); if (chatMessage.message.Contains(" ")) { int spaceIndex = command.IndexOf(" "); parameter = command.Substring(spaceIndex + 1); command = command.Substring(0, spaceIndex); } Command.TCP(command, parameter, player); //wip } else { chatMessage.Broadcast(players, 0); Console.ForegroundColor = ConsoleColor.Cyan; Console.Write("#" + player.entityData.guid + " " + player.entityData.name + ": "); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(chatMessage.message); } break; #endregion case PacketID.chunk: #region chunk var chunk = new Chunk(player.reader); break; #endregion case PacketID.sector: #region sector var sector = new Chunk(player.reader); break; #endregion case PacketID.version: #region version var version = new ProtocolVersion(player.reader); if (version.version != 3) { version.version = 3; version.Write(player.writer, true); player.tcp.Close(); } else { player.entityData.guid = guidCounter; guidCounter++; var join = new Join() { guid = player.entityData.guid, junk = new byte[0x1168] }; join.Write(player.writer, true); var mapSeed = new MapSeed() { seed = Database.mapseed }; mapSeed.Write(player.writer, true); foreach (Player p in players.Values) { p.entityData.Write(player.writer); } players.Add(player.entityData.guid, player); Task.Delay(10000).ContinueWith(t => Load_world_delayed(player)); //WIP, causes crash when player disconnects before executed } break; #endregion default: Console.WriteLine("unknown packet ID: " + packetID); //causes some console spam, but allows resyncing with the player without DC or crash break; } }
/* 서버 시작 */ public void ServerStart() { try { _port = Convert.ToInt32(txtPort.Text); _listener = new TcpListener(_port); _listener.Start(); _isStart = true; DirectoryInfo di = new DirectoryInfo(_storage); if (di.Exists == false) { di.Create(); } LoadMemberList(); this.Invoke(new MethodInvoker(delegate() { txtLog.AppendText("Server - Start\n"); txtLog.AppendText("Storage Path : C:\\Instagram_server\\\n"); txtLog.AppendText("waiting for client access...\n"); })); while (_isStart) { TcpClient client = _listener.AcceptTcpClient(); if (client.Connected) { _isConnect = true; this.Invoke(new MethodInvoker(delegate() { txtLog.AppendText("Client Access !!\n"); })); _networkstream = client.GetStream(); int nRead = 0; while (_isConnect) { try { nRead = 0; for (int i = 0; i < _readBuffer.Length; i += (1024 * 4)) { nRead = _networkstream.Read(_readBuffer, i, 1024 * 4); } } catch { _isConnect = false; _networkstream.Close(); _networkstream = null; } Packet packet = (Packet)Packet.Desserialize(_readBuffer); switch ((int)packet.Type) { case (int)PacketType.QUIT: { _isConnect = false; break; } case (int)PacketType.JOIN: { _isError = false; _joinMember = (Join)Packet.Desserialize(_readBuffer); _fileReader = new StreamReader(_storage + "member.txt"); while (_fileReader.Peek() >= 0) { if (_joinMember._id.Equals(_fileReader.ReadLine())) { Msg msg = new Msg(); msg._text = "이미 사용중인 ID 입니다."; msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); _isError = true; break; } _fileReader.ReadLine(); } _fileReader.Close(); _fileReader.Dispose(); _fileReader = null; if (_isError) { break; } else { _fileWriter = new StreamWriter(_storage + "member.txt", true); _fileWriter.WriteLine(_joinMember._id); _fileWriter.WriteLine(_joinMember._password); _fileWriter.Flush(); _fileWriter.Close(); _fileWriter.Dispose(); _fileWriter = null; this.Invoke(new MethodInvoker(delegate() { txtLog.AppendText(_joinMember._id + " >> Join\n"); })); LoadMemberList(); Msg msg = new Msg(); msg._text = "회원가입이 정상적으로 완료되었습니다 !"; msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); break; } } case (int)PacketType.LOGIN: { try { _isError = true; _loginMember = (Login)Packet.Desserialize(_readBuffer); _fileReader = new StreamReader(_storage + "member.txt"); while (_fileReader.Peek() >= 0) { if (_loginMember._id.Equals(_fileReader.ReadLine())) { if (_loginMember._password.Equals(_fileReader.ReadLine())) { _isError = false; break; } } else { _fileReader.ReadLine(); } } _fileReader.Close(); _fileReader.Dispose(); _fileReader = null; if (_isError) { Msg msg = new Msg(); msg._text = "ID 또는 PW가 잘못되었습니다.\n계정이 없다면 회원가입 버튼을 통해 계정을 만드십시오!"; msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); break; } else { DirectoryInfo memberDi = new DirectoryInfo(_storage + _loginMember._id); if (memberDi.Exists == false) { memberDi.Create(); } _loginMember._postnum = memberDi.GetFiles().Length / 2; Msg msg = new Msg(); msg._text = "LogIn"; msg._memo = _loginMember._postnum.ToString(); msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); this.Invoke(new MethodInvoker(delegate() { txtLog.AppendText(_loginMember._id + " >> LogIn\n"); })); Member memberList = new Member(); string otherMember; _fileReader = new StreamReader(_storage + "member.txt"); while (_fileReader.Peek() >= 0) { otherMember = _fileReader.ReadLine(); if (!_loginMember._id.Equals(otherMember)) { memberList._list += otherMember + "\n"; } _fileReader.ReadLine(); } memberList.Type = (int)PacketType.MEMBER; Packet.Serialize(memberList).CopyTo(_sendBuffer, 0); Send(); _fileReader.Close(); _fileReader.Dispose(); _fileReader = null; for (int i = 0; i < _loginMember._postnum; i++) { Post post = new Post(); Image image = (Image)(Image.FromFile(_storage + _loginMember._id + "\\" + i.ToString() + ".jpg").Clone()); _fileReader = new StreamReader(_storage + _loginMember._id + "\\" + i.ToString()); post._image = image; while (_fileReader.Peek() >= 0) { post._text += _fileReader.ReadLine(); } post.Type = (int)PacketType.MYPAGE; Packet.Serialize(post).CopyTo(_sendBuffer, 0); Send(); _fileReader.Close(); _fileReader.Dispose(); _fileReader = null; } break; } } catch { break; } } case (int)PacketType.POST: { _isError = false; try { _post = (Post)Packet.Desserialize(_readBuffer); Image image = (Image)_post._image; image.Save(_storage + _loginMember._id + "\\" + _loginMember._postnum + ".jpg"); _fileWriter = new StreamWriter(_storage + _loginMember._id + "\\" + _loginMember._postnum); _fileWriter.WriteLine(_post._text); Post post = new Post(); post._image = image; post._text = _post._text; post.Type = (int)PacketType.MYPAGE; Packet.Serialize(post).CopyTo(_sendBuffer, 0); Send(); _fileWriter.Flush(); _fileWriter.Close(); _fileWriter.Dispose(); _fileWriter = null; _loginMember._postnum++; } catch { _isError = true; } if (!_isError) { Msg msg = new Msg(); msg._text = "성공적으로 업로드하였습니다 ! 마이페이지에서 확인하십시오."; msg._memo = _loginMember._postnum.ToString(); msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); } else { Msg msg = new Msg(); msg._text = "업로드 실패"; msg.Type = (int)PacketType.MSG; Packet.Serialize(msg).CopyTo(_sendBuffer, 0); Send(); } break; } } } if (!_isConnect) { continue; } } else { _isConnect = false; _networkstream.Close(); _networkstream = null; } } } catch { ServerStop(); return; } }
Task On(Join x) => Send(x.Room, $"{Id} joined the room {x.Room} ...");