public static void RegisterHandler(PacketId packetId, PacketHandler handler) { if (packetHandlers.ContainsKey(packetId)) throw new Exception("Duplicate packet handler"); packetHandlers[packetId] = handler; }
public int Send <T>(int node, PacketId id, IPacket <T> packet) { int sendSize = 0; if (m_sessionTcp != null) { // 모듈에서 사용하는 헤더 정보 생성. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = packet.GetData(); byte[] data = new byte[headerData.Length + packetData.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, data, 0, headerSize); Buffer.BlockCopy(packetData, 0, data, headerSize, packetData.Length); //string str = "Send Packet[" + id + "]"; sendSize = m_sessionTcp.Send(node, data, data.Length); } return(sendSize); }
// ---------------------------------------------------------------- // // 패킷 수신 함수]. // 동기 대기 패킷 수신. public void OnReceiveSyncPacket(int node, PacketId id, byte[] data) { Debug.Log("[CLIENT]OnReceiveSyncPacket"); GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo sync = packet.GetPacket(); GlobalParam.get().seed = sync.seed; // 초기 장비를 보존한다. for (int i = 0; i < sync.items.Length; ++i) { CharEquipment equip = sync.items[i]; GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType; this.select_done_players[equip.globalId] = true; Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType); } // 응답이 있는 쿼리를 검색. string account_id = this.player.control.getAccountID(); QuerySelectFinish query = QueryManager.get().findQuery <QuerySelectFinish>(x => x.account_id == account_id); if (query != null) { Debug.Log("[CLIENT]QuerySelectDone done"); query.set_done(true); query.set_success(true); } Debug.Log("[CLIENT]Recv seed:" + sync.seed); }
void OnReceiveStartSession(int node, PacketId id, byte[] data) { Debug.Log("ReceiveStartSession"); #if UNUSE_MATCHING_SERVER SessionData response = new SessionData(); { int memberNum = NetConfig.PLAYER_MAX; string hostname = Dns.GetHostName(); IPAddress[] adrList = Dns.GetHostAddresses(hostname); response.endPoints = new EndPointData[memberNum]; response.result = MatchingResult.Success; response.playerId = GlobalParam.get().global_account_id; response.members = memberNum; for (int i = 0; i < memberNum; ++i) { response.endPoints[i] = new EndPointData(); response.endPoints[i].ipAddress = adrList[0].ToString(); response.endPoints[i].port = NetConfig.GAME_PORT; } } #else SessionPacket packet = new SessionPacket(data); SessionData response = packet.GetPacket(); #endif playerId = response.playerId; SetSessionMembers(response.result, response.members, response.endPoints); matchingState = State.MatchingEnded; }
public void OnReceivePrizeResultPacket(int node, PacketId id, byte[] data) { PrizeResultPacket packet = new PrizeResultPacket(data); PrizeResultData result = packet.GetPacket(); Debug.Log("[CLIENT] ReceivePrizeResultPacket"); for (int i = 0; i < result.cakeDataNum; ++i) { this.cake_counts[i] = result.cakeNum[i]; Debug.Log("[CLIENT] Cake num[" + i + "]:" + result.cakeNum[i]); } chrBehaviorLocal local_player = PartyControl.get().getLocalPlayer(); QueryCakeCount query = QueryManager.get().findQuery <QueryCakeCount>(x => x.account_id == local_player.getAcountID()); if (query != null) { Debug.Log("[CLIENT]QueryCakeCount done"); query.set_done(true); query.set_success(true); } }
internal unsafe void SendPayload(IMessage message, PacketId packetId, IPlugin plugin = null, Channel channel = null) { NetworkPayloadWriter temp = message.WritePacket(message, this); message.RawSize = temp.Length - HEADER_SIZE; SendPayload(temp, messageHandler.GetMessageId(message.GetType()), packetId, plugin, channel); }
/// <summary>Creates a new packet with a given ID. Used for sending.</summary> /// <param name="packetId">The packet ID.</param> protected Packet(PacketId packetId) { buffer = new List <byte>(); // Intitialize buffer readPos = 0; // Set readPos to 0 Write(packetId); // Write packet id to the buffer }
public void SendReliableToAll(PacketId id, byte[] data) { if (m_tcp != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] pdata = new byte[headerData.Length + data.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, pdata, 0, headerSize); Buffer.BlockCopy(data, 0, pdata, headerSize, data.Length); string str = "Send reliable packet[" + header.packetId + "]"; int sendSize = m_tcp.Send(pdata, pdata.Length); if (sendSize < 0) { // 송신 오류. } } }
public int Send(PacketId id, byte[] data) { int sendSize = 0; if (m_tcp != null) { // 모듈에서 사용할 헤더 정보를 생성합니다. PacketHeader header = new PacketHeader(); HeaderSerializer serializer = new HeaderSerializer(); header.packetId = id; byte[] headerData = null; if (serializer.Serialize(header) == true) { headerData = serializer.GetSerializedData(); } byte[] packetData = new byte[headerData.Length + data.Length]; int headerSize = Marshal.SizeOf(typeof(PacketHeader)); Buffer.BlockCopy(headerData, 0, packetData, 0, headerSize); Buffer.BlockCopy(data, 0, packetData, headerSize, data.Length); sendSize = m_tcp.Send(data, data.Length); } return(sendSize); }
protected static void WriteInternal(BinaryWriter writer, PacketId id, byte[] bodyData) { writer.Write((short)id); writer.Write((byte)0); writer.Write(bodyData.Length); writer.Write(bodyData); }
public void OnReceiveQuickAttackPacket(int node, PacketId id, byte[] data) { if (m_isHost) { // 호스트의 몬스터는 실행 완료. return; } // 패킷에서 파라미터를 추출해서 ↓의 코드 스니펫을 호출한다. GameObject go = GameObject.FindGameObjectWithTag("Boss"); if (go != null) { chrControllerEnemyBoss bossController = go.GetComponent <chrControllerEnemyBoss>(); if (bossController != null) { BossQuickPacket packet = new BossQuickPacket(data); BossQuickAttack attack = packet.GetPacket(); string targetName = attack.target; float attackPower = attack.power; Debug.Log("Receive boss range attack[Ramge:" + targetName + " Power:" + attackPower + "]"); dbwin.console().print("Receive boss range attack[Ramge:" + targetName + " Power:" + attackPower + "]"); bossController.cmdBossQuickAttack(targetName, attackPower); } } }
public static NetWriter CreatePacket(PacketId packetId) { var p = _packets[(int)packetId]; p.Clear(_packetClearStartBits); return(p); }
// ================================================================ // // // 하급 몬스터 관계 조작 명령 패킷 수신. // public void OnReceiveMonsterDataPacket(int node, PacketId id, byte[] data) { if (m_isHost) { // 호스트의 몬스터는 발생 완료. return; } MonsterPacket packet = new MonsterPacket(data); MonsterData monster = packet.GetPacket(); //Debug.Log("[CLIENT] Receive monster data packet:" + monster.lairId + " - " + monster.monsterId); var lairs = enemies.FindAll(x => (x.behavior as chrBehaviorEnemy_Lair) != null); foreach (var lair in lairs) { if (lair.name == monster.lairId) { QuerySpawn query = new QuerySpawn(lair.name, monster.monsterId); query.set_done(true); query.set_success(true); QueryManager.get().registerQuery(query); } } }
public Type GetPacketType(PacketId id) { Type type = GetPacketTypeOrNull(id); if (type == null) throw new InvalidOperationException("Packet id is missing: " + id); return type; }
public IPacket CreatePacket(PacketId id, byte[] body) { var pck = CreatePacket(id); using (var ms = new MemoryStream(body)) pck.Read(ms); return pck; }
public Packet(PacketId packetId, List <object> args) { PacketId = packetId; Data = new List <object>(args); ShouldInvokeSynchronously = bool.Parse(args[1].ToString()); args.RemoveRange(0, 2); }
/// <summary> /// Initializes a new instance of the <see cref="GAF.Net.PacketHeader"/> class. /// </summary> /// <param name="packetId">Packet identifier.</param> /// <param name="objectId">Object identifier.</param> /// <param name="dataLength">Data length.</param> public PacketHeader(PacketId packetId, Guid objectId, int dataLength) { // get the byte representation of the header elements PacketId = packetId; ObjectId = objectId; DataLength = dataLength; }
public void OnReceiveRangeAttackPacket(int node, PacketId id, byte[] data) { if (m_isHost) { // 호스트의 몬스터는 실행 완료. return; } // 패킷에서 파라미터를 추출해서 ↓의 코드 스니펫을 호출한다. GameObject go = GameObject.FindGameObjectWithTag("Boss"); if (go != null) { chrControllerEnemyBoss bossController = go.GetComponent <chrControllerEnemyBoss>(); if (bossController != null) { BossRangePacket packet = new BossRangePacket(data); BossRangeAttack attack = packet.GetPacket(); float attackPower = attack.power; float attackRange = attack.range; Debug.Log("Receive boss quick attack[Power:" + attackPower + " Ramge:" + attackRange + "]"); bossController.cmdBossRangeAttack(attackPower, attackRange); } } }
public void OnReceiveAttackPacket(int node, PacketId id, byte[] data) { AttackPacket packet = new AttackPacket(data); AttackData attack = packet.GetPacket(); //Debug.Log("[CLIENT] Receive Attack packet:" + attack.characterId); chrController controller = findPlayer(attack.characterId); if (controller == null) { return; } // 캐릭터 좌표 보간. chrBehaviorNet behavior = controller.behavior as chrBehaviorNet; if (behavior != null) { if (attack.attackKind == 0) { behavior.cmdShotAttack(); } else { behavior.cmdMeleeAttack(); } } }
// 대미지양 통지 정보 수신 함수. public void OnReceiveDamageNotifyPacket(int node, PacketId id, byte[] data) { DamageNotifyPacket packet = new DamageNotifyPacket(data); DamageData damage = packet.GetPacket(); #if false string avator_name = ""; AccountData account_data = AccountManager.get().getAccountData(damage.attacker); avator_name = account_data.avator_id; string log = "ReceiveDamageNotifyPacket:" + damage.target + "(" + damage.attacker + ") Damage:" + damage.damage; Debug.Log(log); #endif chrBehaviorEnemy behavior = findCharacter <chrBehaviorEnemy>(damage.target); if (behavior == null) { return; } //log = "Cause damage:" + avator_name + " -> " + damage.target + " Damage:" + damage.damage; //Debug.Log(log); // 캐릭터의 대미지를 반영. behavior.control.causeDamage(damage.damage, damage.attacker, false); }
// HP 통지 정보 수신 함수. public void OnReceiveHitPointPacket(int node, PacketId id, byte[] data) { HitPointPacket packet = new HitPointPacket(data); HpData hpData = packet.GetPacket(); //Debug.Log("[CLIENT] Receive hitpoint packet:" + hpData.characterId); chrBehaviorBase behavior = findCharacter <chrBehaviorBase>(hpData.characterId); if (behavior == null) { return; } chrController controller = behavior.control; if (controller == null) { return; } if (controller.global_index < 0) { return; } //string log = "[CLIENT] Set HP:" + hpData.characterId + " HP:" + hpData.hp; //Debug.Log(log); // 캐릭터의 HP 반영. controller.setHitPoint(hpData.hp); }
public Packet(PacketId packetId, bool shouldInvokeSynchronously) { PacketId = packetId; ShouldInvokeSynchronously = shouldInvokeSynchronously; Data.Add((int)PacketId); Data.Add(ShouldInvokeSynchronously); }
public void OnReceiveReflectionPacket(int node, PacketId id, byte[] data) { if (network_ != null) { Debug.Log("[SERVER]OnReceiveReflectionData from node:" + node); network_.SendReliableToAll(id, data); } }
// 캐릭터 정보 패킷 획득 함수 public void OnReceiveCharacterPacket(PacketId id, byte[] data) { CharacterPacket packet = new CharacterPacket(data); CharacterData character = packet.GetPacket(); // Debug.Log(character.ToString() + " 수신완료."); //remotePlayers[character.playerIndex] = character; }
/// <summary> /// Sends a packet. /// </summary> /// <param name="p">The packet to send</param> /// <param name="Stream">The stream to send it on.</param> public static void Send(Packet p, ModUpdaterNetworkStream Stream) { if (Stream.Disposed) { return; } while (busy) { ; } busy = true; try { PacketId id = GetPacketId(p); Stream.WriteNetworkByte((byte)id); //Write timestamp Stream.WriteLong(new UnixTime().Value); //Write packet. p.Write(Stream); lastSent = p; MinecraftModUpdater.Logger.Log(Logger.Level.Debug, string.Format("Sent packet {0}", id.ToString())); } catch (Exception e) { MinecraftModUpdater.Logger.Log(e); MinecraftModUpdater.Logger.Log(e); } busy = false; }
public static NetOutgoingMessage CreateMessage(this NetClient client, PacketId packetId, int initialCapacity) { var message = client.CreateMessage(initialCapacity + 4); message.Write((uint)packetId); return(message); }
public static void OnPacket(Client client, BallPosition ballPosition) { PacketId packid = PacketManager.me.typeIdSets[typeof(BallPosition)]; ClientPool.xx[ballPosition.BallIndex] = ballPosition.X; Console.WriteLine("BallId:" + ballPosition.BallIndex + " X:" + ballPosition.X); }
public static NetOutgoingMessage CreateMessage(this NetClient client, PacketId packetId) { var message = client.CreateMessage(); message.Write((uint)packetId); return(message); }
public static NetOutgoingMessage CreateMessage(this NetServer server, PacketId packetId, int initialCapacity) { var message = server.CreateMessage(initialCapacity + 4); message.Write((uint)packetId); return(message); }
public static NetOutgoingMessage CreateMessage(this NetServer server, PacketId packetId) { var message = server.CreateMessage(); message.Write((uint)packetId); return(message); }
public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data) { ItemUsePacket packet = new ItemUsePacket(data); ItemUseData useData = packet.GetPacket(); Debug.Log("Receive UseItemPacket:" + useData.userId + " -> " + useData.targetId + " (" + useData.itemCategory + ")"); chrController user = CharacterRoot.getInstance().findPlayer(useData.userId); AccountData account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id); if (user != null && account_data.avator_id != useData.userId) { Debug.Log("use item. favor:" + useData.itemFavor); Item.Favor favor = new Item.Favor(); favor.category = (Item.CATEGORY)useData.itemCategory; this.useItem(-1, favor, useData.userId, useData.targetId, false); } else { Debug.Log("Receive packet is already done."); } }
public void EnqueuePacket(Client client, PacketId packetId, byte[] data) { if (this.registeredPacketHandlerActions.TryGetValue(packetId, out var handlers)) { foreach (var handler in handlers) { try { handler(client, data); } catch (Exception e) { this.logger.LogError($"Enqueueing packet ({packetId}) failed.\n{e.Message}\n{e.StackTrace}"); } } } else { this.logger.LogWarning($"Received unregistered packet {packetId}"); } if (this.registeredQueueHandlers.ContainsKey(packetId)) { foreach (IQueueHandler queueHandler in this.registeredQueueHandlers[packetId]) { queueHandler.EnqueuePacket(client, packetId, data); this.logger.LogWarning($"Use of deprecated queue handler {packetId} {queueHandler}"); } } }
private protected override void ParsePacket(PacketId packetId, object[] args, EndPointId endPointId, SocketInfo socketInfo) { switch (packetId) { case PacketId.DircetInterfaceInitiating: DircetInterfaceInitiatingPacket initiatingPacket = new DircetInterfaceInitiatingPacket(args.ToList()); EndPoint eP; EndPointId clientId = initiatingPacket.EndPointId; lock (clients) { if (clients.TryGetValue(clientId, out eP)) { eP.UdpPort = socketInfo.Port; clients[clientId] = eP; } else { PrintWarning("UDP NOT init for: " + clientId); } } clientsBeforeSync.Remove(clientId); OnClientEventHandlerSynchronizedEvent?.Invoke(clientId); break; case PacketId.BeginSynchronization: Synchronize(endPointId, new EndPoint(socketInfo.Ip, socketInfo.Port)); break; default: base.ParsePacket(packetId, args, endPointId, socketInfo); break; } }
public unsafe void QueuePacket(IMessage message, PacketId packetId, IPlugin plugin, Channel channel) { lock (AddQueueLock) { if (sizeCounter > MaxPacketQueueSize) { while (packetQueue.Count > 0) { SendQueue(); } } NetworkPayloadWriter temp = message.WritePacket(message, conn); message.RawSize = temp.Length - conn.HEADER_SIZE; byte[] packet = temp.GetPayload(); lock (packetQueue) { packetQueue.Enqueue(new PacketQueueInfo(packet, packetId, plugin, channel, conn.messageHandler.GetMessageId(message.GetType()))); sizeCounter += packet.Length; } if (!threadRunning) { threadRunning = true; ThreadPool.QueueUserWorkItem((object obj) => WorkerThread()); } arSizeUpdate.Set(); } }
//====================================================== public void OnReceiveHitPointPacket(int node, PacketId id, byte[] data) { // 패킷 수신 HitPointPacket packet = new HitPointPacket(data); HpData hpData = packet.GetPacket(); // 송신한 플레이어 구별 GameObject netplayer = findPlayer(hpData.characterId); // 캐릭터 hp 감소 netplayer.GetComponent<NetPlayerCtrl>().hp = hpData.hp; }
public void OnReceiveCharacterPacket(int node, PacketId id, byte[] data) { // 패킷 수신 CharacterDataPacket packet = new CharacterDataPacket(data); CharacterData characterData = packet.GetPacket(); // 송신한 플레이어 구별 GameObject netplayer = findPlayer(characterData.characterId); // 캐릭터 좌표 보간 if (netplayer != null) { netplayer.GetComponent<NetPlayerCtrl>().CalcCoordinates(characterData.index, characterData.coordinates); } }
public void OnReceiveAttackPacket(int node, PacketId id, byte[] data) { // 패킷 수신 AttackPacket packet = new AttackPacket(data); AttackData attackData = packet.GetPacket(); Debug.Log("fireAngle:" + attackData.fireAngle); Debug.Log("fireForce:" + attackData.fireForce); // 송신한 플레이어 구별 GameObject netplayer = findPlayer(attackData.characterId); // 해당 플레이어에게 좌표 전달 if(netplayer != null) { netplayer.GetComponent<NetFireCtrl>().SetFirePos(attackData.fireCoord); netplayer.GetComponent<NetFireCtrl>().SetFireAngle(attackData.fireAngle); netplayer.GetComponent<NetFireCtrl>().SetFireForce(attackData.fireForce); } }
// ================================================================ // public void OnReceiveGameSyncPacket(int node, PacketId id, byte[] data) { GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo info = packet.GetPacket(); Debug.Log("[SERVER] Receive Init packet"); // 게임서버에서 난수 동기화 작업 TimeSpan ts = new TimeSpan(DateTime.Now.Ticks); double seconds = ts.TotalSeconds; info.seed = (int)((long)seconds - (long)(seconds / 1000.0) * 1000); Debug.Log("Seed: " + info.seed); // 세션 관리 정보와 플레이어 글로벌 ID를 연결 info.members = new CharacterID[NetConfig.PLAYER_MAX]; for(int i = 0; i < NetConfig.PLAYER_MAX; i++) { info.members[i].globalId = i; if (!m_nodes.ContainsKey(node)) { m_nodes.Add(node, info.members[i].globalId); } } }
void OnReceiveSearchRoom(int node, PacketId id, byte[] data) { Debug.Log("ReceiveSearchRoom"); SearchRoomPacket packet = new SearchRoomPacket(data); SearchRoomResponse response = packet.GetPacket(); string str = "Created room num:" + response.roomNum; Debug.Log(str); SearchRoomResponse(response.roomNum, response.rooms); }
void ReadPacket( byte opcode ) { reader.Remove( 1 ); // remove opcode lastOpcode = (PacketId)opcode; switch( (PacketId)opcode ) { case PacketId.Handshake: { byte protocolVer = reader.ReadUInt8(); ServerName = reader.ReadAsciiString(); ServerMotd = reader.ReadAsciiString(); game.LocalPlayer.SetUserType( reader.ReadUInt8() ); receivedFirstPosition = false; game.LocalPlayer.ParseHackFlags( ServerName, ServerMotd ); } break; case PacketId.Ping: break; case PacketId.LevelInitialise: { game.Map.Reset(); game.SetNewScreen( new LoadingMapScreen( game, ServerName, ServerMotd ) ); if( ServerMotd.Contains( "cfg=" ) ) { ReadWomConfigurationAsync(); } receivedFirstPosition = false; gzipHeader = new GZipHeaderReader(); // Workaround because built in mono stream assumes that the end of stream // has been reached the first time a read call returns 0. (MS.NET doesn't) #if __MonoCS__ gzipStream = new DeflateStream( gzippedMap, true ); #else gzipStream = new DeflateStream( gzippedMap, CompressionMode.Decompress ); if( OpenTK.Configuration.RunningOnMono ) { Utils.LogWarning( "You are running on Mono, but this build does not support the Mono workaround." ); Utils.LogWarning( "You should either download the Mono compatible build or define '__MonoCS__' when targeting Mono. " + "(The Mono compiler already defines this by default)" ); Utils.LogWarning( "You will likely experience an 'Internal error (no progress possible) ReadInternal' exception when decompressing the map." ); } #endif mapSizeIndex = 0; mapIndex = 0; receiveStart = DateTime.UtcNow; } break; case PacketId.LevelDataChunk: { int usedLength = reader.ReadInt16(); gzippedMap.Position = 0; gzippedMap.SetLength( usedLength ); if( gzipHeader.done || gzipHeader.ReadHeader( gzippedMap ) ) { if( mapSizeIndex < 4 ) { mapSizeIndex += gzipStream.Read( mapSize, mapSizeIndex, 4 - mapSizeIndex ); } if( mapSizeIndex == 4 ) { if( map == null ) { int size = mapSize[0] << 24 | mapSize[1] << 16 | mapSize[2] << 8 | mapSize[3]; map = new byte[size]; } mapIndex += gzipStream.Read( map, mapIndex, map.Length - mapIndex ); } } reader.Remove( 1024 ); byte progress = reader.ReadUInt8(); game.Events.RaiseMapLoading( progress ); } break; case PacketId.LevelFinalise: { game.SetNewScreen( new NormalScreen( game ) ); int mapWidth = reader.ReadInt16(); int mapHeight = reader.ReadInt16(); int mapLength = reader.ReadInt16(); double loadingMs = ( DateTime.UtcNow - receiveStart ).TotalMilliseconds; Utils.LogDebug( "map loading took:" + loadingMs ); game.Map.UseRawMap( map, mapWidth, mapHeight, mapLength ); game.Events.RaiseOnNewMapLoaded(); map = null; gzipStream.Close(); if( sendWomId && !sentWomId ) { SendChat( "/womid WoMClient-2.0.7" ); sentWomId = true; } gzipStream = null; GC.Collect( 0 ); } break; case PacketId.SetBlock: { int x = reader.ReadInt16(); int y = reader.ReadInt16(); int z = reader.ReadInt16(); byte type = reader.ReadUInt8(); if( !game.Map.IsNotLoaded ) game.UpdateBlock( x, y, z, type ); else Utils.LogWarning( "Server tried to update a block while still sending us the map!" ); } break; case PacketId.AddEntity: { byte entityId = reader.ReadUInt8(); string name = reader.ReadAsciiString(); AddEntity( entityId, name, name, true ); } break; case PacketId.EntityTeleport: { byte entityId = reader.ReadUInt8(); ReadAbsoluteLocation( entityId, true ); } break; case PacketId.RelPosAndOrientationUpdate: ReadRelativeLocation(); break; case PacketId.RelPosUpdate: ReadRelativePosition(); break; case PacketId.OrientationUpdate: ReadOrientation(); break; case PacketId.RemoveEntity: { byte entityId = reader.ReadUInt8(); Player player = game.Players[entityId]; if( entityId != 0xFF && player != null ) { game.Events.RaiseEntityRemoved( entityId ); player.Despawn(); game.Players[entityId] = null; } } break; case PacketId.Message: { byte messageType = reader.ReadUInt8(); string text = reader.ReadChatString( ref messageType, useMessageTypes ); game.Chat.Add( text, (CpeMessage)messageType ); } break; case PacketId.Kick: { string reason = reader.ReadAsciiString(); game.Disconnect( "&eLost connection to the server", reason ); Dispose(); } break; case PacketId.SetPermission: { game.LocalPlayer.SetUserType( reader.ReadUInt8() ); } break; case PacketId.CpeExtInfo: { string appName = reader.ReadAsciiString(); Utils.LogDebug( "Server identified itself as: " + appName ); cpeServerExtensionsCount = reader.ReadInt16(); } break; case PacketId.CpeExtEntry: { string extName = reader.ReadAsciiString(); int extVersion = reader.ReadInt32(); Utils.LogDebug( "cpe ext: " + extName + " , " + extVersion ); if( extName == "HeldBlock" ) { sendHeldBlock = true; } else if( extName == "MessageTypes" ) { useMessageTypes = true; } else if( extName == "ExtPlayerList" ) { UsingExtPlayerList = true; } else if( extName == "PlayerClick" ) { UsingPlayerClick = true; } else if( extName == "EnvMapAppearance" && extVersion == 2 ) { usingTexturePack = true; } cpeServerExtensionsCount--; if( cpeServerExtensionsCount == 0 ) { MakeExtInfo( Utils.AppName, clientExtensions.Length ); SendPacket(); for( int i = 0; i < clientExtensions.Length; i++ ) { string name = clientExtensions[i]; int version = (name == "ExtPlayerList" || name == "EnvMapApperance") ? 2 : 1; MakeExtEntry( name, version ); SendPacket(); } } } break; case PacketId.CpeSetClickDistance: { game.LocalPlayer.ReachDistance = reader.ReadInt16() / 32f; } break; case PacketId.CpeCustomBlockSupportLevel: { byte supportLevel = reader.ReadUInt8(); MakeCustomBlockSupportLevel( 1 ); SendPacket(); if( supportLevel == 1 ) { for( int i = (int)Block.CobblestoneSlab; i <= (int)Block.StoneBrick; i++ ) { game.Inventory.CanPlace[i] = true; game.Inventory.CanDelete[i] = true; } game.Events.RaiseBlockPermissionsChanged(); } else { Utils.LogWarning( "Server's block support level is {0}, this client only supports level 1.", supportLevel ); Utils.LogWarning( "You won't be able to see or use blocks from levels above level 1" ); } } break; case PacketId.CpeHoldThis: { byte blockType = reader.ReadUInt8(); bool canChange = reader.ReadUInt8() == 0; game.Inventory.CanChangeHeldBlock = true; game.Inventory.HeldBlock = (Block)blockType; game.Inventory.CanChangeHeldBlock = canChange; } break; case PacketId.CpeExtAddPlayerName: { short nameId = reader.ReadInt16(); string playerName = Utils.StripColours( reader.ReadAsciiString() ); string listName = reader.ReadAsciiString(); string groupName = reader.ReadAsciiString(); byte groupRank = reader.ReadUInt8(); if( nameId >= 0 && nameId <= 255 ) { CpeListInfo oldInfo = game.CpePlayersList[nameId]; CpeListInfo info = new CpeListInfo( (byte)nameId, playerName, listName, groupName, groupRank ); game.CpePlayersList[nameId] = info; if( oldInfo != null ) { game.Events.RaiseCpeListInfoChanged( (byte)nameId ); } else { game.Events.RaiseCpeListInfoAdded( (byte)nameId ); } } } break; case PacketId.CpeExtAddEntity: { byte entityId = reader.ReadUInt8(); string displayName = reader.ReadAsciiString(); string skinName = reader.ReadAsciiString(); AddEntity( entityId, displayName, skinName, false ); } break; case PacketId.CpeExtRemovePlayerName: { short nameId = reader.ReadInt16(); if( nameId >= 0 && nameId <= 255 ) { game.Events.RaiseCpeListInfoRemoved( (byte)nameId ); game.CpePlayersList[nameId] = null; } } break; case PacketId.CpeMakeSelection: { byte selectionId = reader.ReadUInt8(); string label = reader.ReadAsciiString(); short startX = reader.ReadInt16(); short startY = reader.ReadInt16(); short startZ = reader.ReadInt16(); short endX = reader.ReadInt16(); short endY = reader.ReadInt16(); short endZ = reader.ReadInt16(); byte r = (byte)reader.ReadInt16(); byte g = (byte)reader.ReadInt16(); byte b = (byte)reader.ReadInt16(); byte a = (byte)reader.ReadInt16(); Vector3I p1 = Vector3I.Min( startX, startY, startZ, endX, endY, endZ ); Vector3I p2 = Vector3I.Max( startX, startY, startZ, endX, endY, endZ ); FastColour col = new FastColour( r, g, b, a ); game.SelectionManager.AddSelection( selectionId, p1, p2, col ); } break; case PacketId.CpeRemoveSelection: { byte selectionId = reader.ReadUInt8(); game.SelectionManager.RemoveSelection( selectionId ); } break; case PacketId.CpeEnvColours: { byte variable = reader.ReadUInt8(); short red = reader.ReadInt16(); short green = reader.ReadInt16(); short blue = reader.ReadInt16(); bool invalid = red < 0 || red > 255 || green < 0 || green > 255 || blue < 0 || blue > 255; FastColour col = new FastColour( red, green, blue ); if( variable == 0 ) { // sky colour game.Map.SetSkyColour( invalid ? Map.DefaultSkyColour : col ); } else if( variable == 1 ) { // clouds colour game.Map.SetCloudsColour( invalid ? Map.DefaultCloudsColour : col ); } else if( variable == 2 ) { // fog colour game.Map.SetFogColour( invalid ? Map.DefaultFogColour : col ); } else if( variable == 3 ) { // ambient light (shadow light) game.Map.SetShadowlight( invalid ? Map.DefaultShadowlight : col ); } else if( variable == 4 ) { // diffuse light (sun light) game.Map.SetSunlight( invalid ? Map.DefaultSunlight : col ); } } break; case PacketId.CpeSetBlockPermission: { byte blockId = reader.ReadUInt8(); bool canPlace = reader.ReadUInt8() != 0; bool canDelete = reader.ReadUInt8() != 0; Inventory inv = game.Inventory; if( blockId == 0 ) { for( int i = 1; i < BlockInfo.CpeBlocksCount; i++ ) { inv.CanPlace.SetNotOverridable( canPlace, i ); inv.CanDelete.SetNotOverridable( canDelete, i ); } } else { inv.CanPlace.SetNotOverridable( canPlace, blockId ); inv.CanDelete.SetNotOverridable( canDelete, blockId ); } game.Events.RaiseBlockPermissionsChanged(); } break; case PacketId.CpeChangeModel: { byte playerId = reader.ReadUInt8(); string modelName = reader.ReadAsciiString().ToLowerInvariant(); Player player = game.Players[playerId]; if( player != null ) { player.SetModel( modelName ); } } break; case PacketId.CpeEnvSetMapApperance: { string url = reader.ReadAsciiString(); byte sideBlock = reader.ReadUInt8(); byte edgeBlock = reader.ReadUInt8(); short waterLevel = reader.ReadInt16(); game.Map.SetWaterLevel( waterLevel ); game.Map.SetEdgeBlock( (Block)edgeBlock ); game.Map.SetSidesBlock( (Block)sideBlock ); if( url == String.Empty ) { TexturePackExtractor extractor = new TexturePackExtractor(); extractor.Extract( game.defaultTexPack, game ); } else { game.Animations.Dispose(); if( usingTexturePack ) game.AsyncDownloader.DownloadData( url, true, "texturePack" ); else game.AsyncDownloader.DownloadImage( url, true, "terrain" ); } Utils.LogDebug( "Image url: " + url ); } break; case PacketId.CpeEnvWeatherType: game.Map.SetWeather( (Weather)reader.ReadUInt8() ); break; case PacketId.CpeHackControl: { game.LocalPlayer.CanFly = reader.ReadUInt8() != 0; game.LocalPlayer.CanNoclip = reader.ReadUInt8() != 0; game.LocalPlayer.CanSpeed = reader.ReadUInt8() != 0; game.LocalPlayer.CanRespawn = reader.ReadUInt8() != 0; game.CanUseThirdPersonCamera = reader.ReadUInt8() != 0; if( !game.CanUseThirdPersonCamera ) { game.SetCamera( false ); } float jumpHeight = reader.ReadInt16() / 32f; if( jumpHeight < 0 ) jumpHeight = 1.4f; game.LocalPlayer.CalculateJumpVelocity( jumpHeight ); } break; case PacketId.CpeExtAddEntity2: { byte entityId = reader.ReadUInt8(); string displayName = reader.ReadAsciiString(); string skinName = reader.ReadAsciiString(); AddEntity( entityId, displayName, skinName, true ); } break; case PacketId.CpeDefineBlock: case PacketId.CpeDefineLiquid: { byte block = reader.ReadUInt8(); BlockInfo info = game.BlockInfo; info.ResetBlockInfo( block ); info.Name[block] = reader.ReadAsciiString(); info.CollideType[block] = (BlockCollideType)reader.ReadUInt8(); // TODO: Liquid collide type not properly supported. info.SpeedMultiplier[block] = (float)Math.Pow( 2, (reader.ReadUInt8() - 128) / 64f ); info.SetTop( reader.ReadUInt8(), (Block)block ); info.SetSide( reader.ReadUInt8(), (Block)block ); info.SetBottom( reader.ReadUInt8(), (Block)block ); reader.ReadUInt8(); // opacity hint, but we ignore this. info.BlocksLight[block] = reader.ReadUInt8() == 0; reader.ReadUInt8(); // walk sound, but we ignore this. info.EmitsLight[block] = reader.ReadUInt8() != 0; if( opcode == (byte)PacketId.CpeDefineBlock ) { byte shape = reader.ReadUInt8(); if( shape == 1 ) info.Height[block] = 1; else if( shape == 2 ) info.Height[block] = 0.5f; // TODO: upside down slab not properly supported else if( shape == 3 ) info.Height[block] = 0.5f; else if( shape == 4 ) info.IsSprite[block] = true; byte blockDraw = reader.ReadUInt8(); if( blockDraw == 0 ) info.IsOpaque[block] = true; else if( blockDraw == 1 ) info.IsTransparent[block] = true; else if( blockDraw == 2 ) info.IsTranslucent[block] = true; else if( blockDraw == 3 ) info.IsTranslucent[block] = true; Console.WriteLine( block + " : " + shape + "," + blockDraw ); } else { byte fogDensity = reader.ReadUInt8(); info.FogDensity[block] = fogDensity == 0 ? 0 : (fogDensity + 1) / 128f; info.FogColour[block] = new FastColour( reader.ReadUInt8(), reader.ReadUInt8(), reader.ReadUInt8() ); } info.SetupCullingCache(); } break; case PacketId.CpeRemoveBlockDefinition: game.BlockInfo.ResetBlockInfo( reader.ReadUInt8() ); break; default: throw new NotImplementedException( "Unsupported packet:" + (PacketId)opcode ); } }
public void OnReceiveUseItemPacket(int node, PacketId id, byte[] data) { ItemUsePacket packet = new ItemUsePacket(data); ItemUseData useData = packet.GetPacket(); Debug.Log ("Receive UseItemPacket:" + useData.userId + " -> " + useData.targetId + " (" + useData.itemCategory + ")"); chrController user = CharacterRoot.getInstance().findPlayer(useData.userId); AccountData account_data = AccountManager.get().getAccountData(GlobalParam.getInstance().global_account_id); if (user != null && account_data.avator_id != useData.userId) { Debug.Log("use item. favor:" + useData.itemFavor); Item.Favor favor = new Item.Favor(); favor.category = (Item.CATEGORY) useData.itemCategory; this.useItem(-1, favor, useData.userId, useData.targetId, false); } else { Debug.Log("Receive packet is already done."); } }
/// <summary> /// Registers a packet handler. This is NOT needed for an EncryptionStatus packet. /// </summary> /// <param name="id">The packet id.</param> /// <param name="handler">The handler for the packet.</param> public void RegisterPacketHandler(PacketId id, PacketEvent handler) { lock (eventLock) { try { EventHandler.Add(id, handler); } catch (Exception e) { throw e; } } }
// ================================================================ // // 아이템 정보 패킷 취득 함수. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버 상태와 동기화. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // 응답이 있는 쿼리를 탐색. QueryItemPick query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 리모트 캐릭터가 가지게 한다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // 아이템 획득 상태 변경. this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있다. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 획득. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템획득 쿼리 발행. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
public void OnReceiveItemPacket(PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); PickupState state = (PickupState) item.state; string log = "[SERVER] ReceiveItemData " + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); switch (state) { case PickupState.PickingUp: MediatePickupItem(item.itemId, item.ownerId); break; case PickupState.Dropping: MediateDropItem(item.itemId, item.ownerId); break; default: break; } }
/// <summary> /// Un-registers the packet handler for a packet. /// </summary> /// <param name="id">The packet id to un-register.</param> public void RemovePacketHandler(PacketId id) { lock (eventLock) { try { EventHandler.Remove(id); } catch (Exception e) { throw e; } } }
// // 패킷 수신 처리. // void OnReceiveMatchingResponse(int node, PacketId id, byte[] data) { MatchingResponsePacket packet = new MatchingResponsePacket(data); MatchingResponse response = packet.GetPacket(); string str = "ReceiveMatchingResponse:" + response.request; Debug.Log(str); switch (response.request) { case MatchingRequestId.CreateRoom: CreateRoomResponse(response.result, response.roomId); break; case MatchingRequestId.JoinRoom: JoinRoomResponse(response.result, response.roomId) ; break; default: Debug.Log("Unknown request."); break; } }
// ================================================================ // // ?꾩씠???뺣낫 ?⑦궥 痍⑤뱷 ?⑥닔. public void OnReceiveItemPacket(int node, PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // ?쒕쾭 ?곹깭? ?숆린?? ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.getInstance().item_table.ContainsKey(istate.item_id)) { GlobalParam.getInstance().item_table.Remove(istate.item_id); } GlobalParam.getInstance().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket [" + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId + "]"; Debug.Log(log); dbwin.console().print(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); dbwin.console().print("Receive item pick."); // ?묐떟???덈뒗 荑쇰━瑜??먯깋. QueryItemPick query_pick = QueryManager.get().findQuery<QueryItemPick>(x => x.target == item.itemId); bool remote_pick = true; if (query_pick != null) { string account_name = PartyControl.get().getLocalPlayer().getAcountID(); if (item.ownerId == account_name) { Debug.Log("Receive item pick local:" + item.ownerId); dbwin.console().print("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); dbwin.console().print("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { Debug.Log("Remote pick item:" + item.ownerId); dbwin.console().print("Remote pick item:" + item.ownerId); // 由щえ??罹먮┃?곌? 媛吏寃??쒕떎. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠???띾뱷 荑쇰━ 諛쒗뻾. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } // ?꾩씠???띾뱷 ?곹깭 蹂寃? this.setItemState(item.itemId, ItemController.State.Picked, item.ownerId); } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // ?묐떟???덈뒗 荑쇰━瑜?寃?? QueryItemDrop query_drop = QueryManager.get().findQuery<QueryItemDrop>(x => x.target == item.itemId); bool remote_drop = true; if (query_drop != null) { // ?붿껌??????묐떟???덈떎. string account_name = AccountManager.get().getAccountData(GlobalParam.get().global_account_id).avator_id; if (item.ownerId == account_name) { // ?먯떊???띾뱷. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // ?곷?媛 ?띾뱷. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 由щえ??罹먮┃?곌? ?띾뱷. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // ?꾩씠?쒗쉷??荑쇰━ 諛쒗뻾. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); remote.cmdItemDrop(item.itemId, false); } } } else { Debug.Log("Receive item error."); } }
public PacketBuilder(Packet p) { Buffer.BlockCopy(p.Data, 0, _buffer, 0, p.Data.Length); _id = p.Id; }
public PacketBuilder(PacketId id) { _id = id; }
public Packet(PacketId id) { Id = id; }
public void Parse(Encoder s) { packetType = s.Read<PacketType>(); reserved1 = s.ReadByte(); reserved2 = s.ReadByte(); reserved3 = s.ReadByte(); packetId = s.Read<PacketId>(); reserved = s.ReadUshort(); dataSize = s.ReadUint(); switch (packetId) { case PacketId.StartSession: data = new PSessionStarted(); data.Parse(s); break; case PacketId.ProductData: data = new PProductData(); data.Parse(s); break; case PacketId.ProtocolArray: data = new PProtocolArray(); data.Parse(s); break; case PacketId.RecordCount: data = new PRecords(); data.Parse(s); break; case PacketId.TrackData: data = new PTrkData(); data.Parse(s); break; case PacketId.TrackHeader: data = new PTrackHeader(); data.Parse(s); break; case PacketId.TransferComplete: data = new PXferComplete(); data.Parse(s); break; case PacketId.CourseTrackData: data = new PTrkData(); data.Parse(s); break; } }
// ================================================================ // public void OnReceiveGoingOutPacket(PacketId id, byte[] data) { GoingOutPacket packet = new GoingOutPacket(data); GoingOutData go = packet.GetPacket(); Debug.Log("OnReceiveGoingOutPacket"); if (GlobalParam.get().account_name == go.characterId) { // 자신은 이미 행동이 끝났으므로 처리하지 않습니다. return; } if (GlobalParam.get().is_in_my_home) { // 자신의 정원에 있습니다.. if (go.goingOut) { // 친구가 찾아왔습니다. this.step.set_next(STEP.WELCOME); GlobalParam.get().is_remote_in_my_home = true; } else { // 친구가 돌아갑니다. this.step.set_next(STEP.BYEBYE); GlobalParam.get().is_remote_in_my_home = false; } } else { // 친구 정원에 있습니다. if (go.goingOut) { // 친구가 갑니다. this.step.set_next(STEP.BYEBYE); GlobalParam.get().is_remote_in_my_home = true; } else { // 친구가 돌아옵니다. this.step.set_next(STEP.WELCOME); GlobalParam.get().is_remote_in_my_home = false; } } }
public Packet(PacketId id,byte[] bytes) { Id = id; Data = bytes; }
public IPacket CreatePacket(PacketId id) { return (IPacket)Activator.CreateInstance(GetPacketType(id)); }
public Type GetPacketTypeOrNull(PacketId id) { Type type; return IdToType.TryGetValue(id, out type) ? type : null; }
// ---------------------------------------------------------------- // // 패킷 수신 함수]. // 동기 대기 패킷 수신. public void OnReceiveSyncPacket(int node, PacketId id, byte[] data) { Debug.Log("[CLIENT]OnReceiveSyncPacket"); GameSyncPacket packet = new GameSyncPacket(data); GameSyncInfo sync = packet.GetPacket(); GlobalParam.get().seed = sync.seed; // 초기 장비를 보존한다. for (int i = 0; i < sync.items.Length; ++i) { CharEquipment equip = sync.items[i]; GlobalParam.get().shot_type[equip.globalId] = (SHOT_TYPE)equip.shotType; this.select_done_players[equip.globalId] = true; Debug.Log("[CLIENT] AccountID:" + equip.globalId + " ShotType:" + equip.shotType); } // 응답이 있는 쿼리를 검색. string account_id = this.player.control.getAccountID(); QuerySelectFinish query = QueryManager.get().findQuery<QuerySelectFinish>(x => x.account_id == account_id); if (query != null) { Debug.Log("[CLIENT]QuerySelectDone done"); query.set_done(true); query.set_success(true); } Debug.Log("[CLIENT]Recv seed:" + sync.seed); }
void ReadPacket( byte opcode ) { reader.Remove( 1 ); // remove opcode lastOpcode = (PacketId)opcode; Action handler; if( opcode >= maxHandledPacket || (handler = handlers[opcode]) == null) throw new NotImplementedException( "Unsupported packet:" + (PacketId)opcode ); handler(); }
public void OnReceiveReflectionData(PacketId id, byte[] data) { Debug.Log("[SERVER]OnReceiveReflectionData"); network_.SendReliableToAll(id, data); }
// 아이템 정보 패킷 획득 함수. public void OnReceiveItemPacket(PacketId id, byte[] data) { ItemPacket packet = new ItemPacket(data); ItemData item = packet.GetPacket(); // 서버의 상태와 동기화합니다. ItemState istate = new ItemState(); istate.item_id = item.itemId; ItemController.State state = (ItemController.State)item.state; istate.state = (state == ItemController.State.Dropped)? ItemController.State.None : state; istate.owner = item.ownerId; if (GlobalParam.get().item_table.ContainsKey(item.itemId)) { GlobalParam.get().item_table.Remove(istate.item_id); } GlobalParam.get().item_table.Add(istate.item_id, istate); string log = "[CLIENT] Receive itempacket. " + "itemId:" + item.itemId + " state:" + state.ToString() + " ownerId:" + item.ownerId; Debug.Log(log); if (state == ItemController.State.Picked) { Debug.Log("Receive item pick."); // 응답이 있는 쿼리를 검색. QueryItemPick query_pick = null; foreach(var query in this.queries) { QueryItemPick pick = query as QueryItemPick; if (pick != null && pick.target == item.itemId) { query_pick = pick; break; } } bool remote_pick = true; if (query_pick != null) { if (item.ownerId == GlobalParam.get().account_name) { Debug.Log("Receive item pick local:" + item.ownerId); item_query_done(query_pick, true); remote_pick = false; } else { Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_pick, false); } } if (remote_pick == true) { // 리모트 캐릭터가 취득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. QueryItemPick query = remote.cmdItemQueryPick(item.itemId, false, true); if (query != null) { item_query_done(query, true); } } } } else if (state == ItemController.State.Dropped) { Debug.Log("Receive item drop."); // 응답이 있는 쿼리를 검색. QueryItemDrop query_drop = null; foreach(var query in this.queries) { QueryItemDrop drop = query as QueryItemDrop; if (drop != null && drop.target == item.itemId) { query_drop = drop; break; } } bool remote_drop = true; if (query_drop != null) { // 요청에 대한 응답이 있을 때. if (item.ownerId == GlobalParam.get().account_name) { // 자신이 획득. Debug.Log("Receive item drop local:" + item.ownerId); item_query_done(query_drop, true); remote_drop = false; } else { // 상대가 획득. Debug.Log("Receive item pick remote:" + item.ownerId); item_query_done(query_drop, false); } } if (remote_drop == true) { // 리모트 캐릭터가 회득하게 합니다. chrController remote = CharacterRoot.getInstance().findPlayer(item.ownerId); if (remote) { // 아이템 획득 쿼리 발행. Debug.Log ("QuetyitemDrop:cmdItemQueryDrop"); QueryItemDrop query = remote.cmdItemQueryDrop(false); if (query != null) { query.is_drop_done = true; item_query_done(query, true); } } } } else { Debug.Log("Receive item error."); } }