public static EnterWorld read(BinaryReader binaryReader) { EnterWorld newObj = new EnterWorld(); newObj.gid = binaryReader.ReadUInt32(); newObj.account = PStringChar.read(binaryReader); return(newObj); }
public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters) { var operation = new EnterWorld(peer.Protocol, request); if (!operation.IsValid) { return new OperationResponse(request.OperationCode) { ReturnCode = (int)ErrorCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() }; } MmoWorld world = MmoWorld.Instance; var actor = new MmoActor(peer, world, interestArea); var avatar = new MmoItem(world, operation.Position, operation.Rotation, operation.Properties, actor, operation.Username, (byte)ItemType.Avatar); while (world.ItemCache.AddItem(avatar) == false) { Item otherAvatarItem; if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem)) { avatar.Dispose(); actor.Dispose(); interestArea.Dispose(); ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters); // request continued later, no response here return null; } } // init avatar actor.AddItem(avatar); actor.Avatar = avatar; ((Peer)peer).SetCurrentOperationHandler(actor); // set return values var responseObject = new EnterWorldResponse { }; // send response; use item channel to ensure that this event arrives before any move or subscribe events var response = new OperationResponse(request.OperationCode, responseObject); sendParameters.ChannelId = Settings.ItemEventChannel; peer.SendOperationResponse(response, sendParameters); avatar.Spawn(operation.Position); // response already sent return null; }
public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters) { try { var operation = new EnterWorld(peer.Protocol, request); if (!operation.IsValid) { return(new OperationResponse(request.OperationCode) { ReturnCode = (int)ReturnCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() }); } MmoWorld world; if (MmoWorldCache.Instance(application).TryGet(operation.WorldName, out world) == false) { return(operation.GetOperationResponse((int)ReturnCode.WorldNotFound, "WorldNotFound", new System.Collections.Hashtable())); } var interestArea = new MmoClientInterestArea(peer, operation.InterestAreaId, world) { ViewDistanceEnter = operation.ViewDistanceEnter.ToVector(true), ViewDistanceExit = operation.ViewDistanceExit.ToVector(true) }; PlayerCharacter character = new PlayerCharacter(); character.SetCharacterId(operation.CharacterId); character.SetModel(operation.Model); character.SetName(operation.Name); character.SetRace((Race)operation.Race); character.SetWorkshop((Workshop)operation.Workshop); character.Login = operation.Login; Type[] components = new Type[] { typeof(MmoActor), typeof(AIState), typeof(PlayerCharacterObject), typeof(RaceableObject), typeof(MmoMessageComponent), typeof(PlayerShip), typeof(ShipWeapon), typeof(PlayerSkills), typeof(PlayerBonuses), typeof(PlayerLoaderObject), typeof(ShipBasedDamagableObject), typeof(PlayerTarget), typeof(ShipEnergyBlock), typeof(PlayerShipMovable), typeof(PassiveBonusesComponent), typeof(PlayerTimedEffects), typeof(PetManager), typeof(PlayerEventSubscriber), typeof(ContractManager), typeof(AchievmentComponent), typeof(QuestManager) //typeof(QuestManager), //typeof(DialogManager) }; Dictionary <byte, object> tags = new Dictionary <byte, object> { { (byte)PlayerTags.GameRefId, operation.GameRefId }, { (byte)PlayerTags.CharacterId, character.CharacterId }, { (byte)PlayerTags.Race, character.Race }, { (byte)PlayerTags.Workshop, character.Workshop }, { (byte)PlayerTags.Name, (character.Name != null) ? character.Name : string.Empty }, { (byte)PlayerTags.Model, character.Model }, { (byte)PlayerTags.Login, operation.Login } }; //var actor = new MmoActor(peer, world, interestArea, operation.GameRefId, character, application); log.InfoFormat("before creating player item = {0}", operation.GameRefId); var avatar = new MmoItem(peer, interestArea, world, application, operation.Position, operation.Rotation, operation.Properties, operation.GameRefId, tags, 1f, 0, components); avatar.GetComponent <MmoActor>().SetApplication(application); log.InfoFormat("init player item at position = {0}", operation.Position.ToVector3()); log.InfoFormat("Before Start() player"); avatar.GetComponent <DamagableObject>().SetIgnoreDamageAtStart(true); avatar.GetComponent <DamagableObject>().SetIgnoreDamageInterval(30); avatar.Update(0); log.InfoFormat("Before Load() player"); log.InfoFormat("calling load on avatar [dy]"); avatar.GetComponent <PlayerLoaderObject>().Load(); while (world.ItemCache.AddItem(avatar) == false) { Item otherAvatarItem; if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem)) { avatar.Dispose(); avatar.GetComponent <MmoActor>().Dispose(); interestArea.Dispose(); ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters); return(null); } } log.Info("After adding player to world"); //actor.AddItem(avatar); //actor.Avatar = avatar; //actor.Initialize(); //actor.Target.ResetTarget(); ((Peer)peer).SetCurrentOperationHandler(avatar.GetComponent <MmoActor>()); log.Info("Set player item operation handler to Actor"); var responseObject = new EnterWorldResponse { BottomRightCorner = world.Area.Max.ToFloatArray(3), TopLeftCorner = world.Area.Min.ToFloatArray(3), TileDimensions = world.TileDimensions.ToFloatArray(3), WorldName = world.Name, Content = world.GetInfo(), ItemId = avatar.Id, components = avatar.componentIds, size = avatar.size, subZone = avatar.subZone //startAtStation = operation.EnterAtStation }; log.InfoFormat("Components = {0} sended to player back", avatar.componentIds.Length); var response = new OperationResponse(request.OperationCode, responseObject); sendParameters.ChannelId = Settings.ItemEventChannel; peer.SendOperationResponse(response, sendParameters); log.Info("World entered response sended back"); lock (interestArea.SyncRoot) { interestArea.AttachToItem(avatar); interestArea.UpdateInterestManagement(); } avatar.Spawn(operation.Position); log.Info("Avatar Spawn fire...."); return(null); } catch (Exception ex) { CL.Out(LogFilter.PLAYER, ex.Message); CL.Out(LogFilter.PLAYER, ex.StackTrace); } return(null); }
public override bool acceptMessageData(BinaryReader messageDataReader, TreeView outputTreeView) { bool handled = true; PacketOpcode opcode = Util.readOpcode(messageDataReader); switch (opcode) { case PacketOpcode.CLIENT_REQUEST_ENTER_GAME_EVENT: case PacketOpcode.Evt_Admin__GetServerVersion_ID: { EmptyMessage message = new EmptyMessage(opcode); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.CHARACTER_GENERATION_VERIFICATION_RESPONSE_EVENT: { CharGenVerificationResponse message = CharGenVerificationResponse.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.CHARACTER_EXIT_GAME_EVENT: { LogOff message = LogOff.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } // TODO: CHARACTER_PREVIEW_EVENT case PacketOpcode.CHARACTER_DELETE_EVENT: { CharacterDelete message = CharacterDelete.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.CHARACTER_CREATE_EVENT: { CharacterCreate message = CharacterCreate.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.CHARACTER_ENTER_GAME_EVENT: { EnterWorld message = EnterWorld.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.CONTROL_FORCE_OBJDESC_SEND_EVENT: { ForceObjdesc message = ForceObjdesc.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.Evt_Admin__Friends_ID: { Friends message = Friends.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.Evt_Admin__AdminRestoreCharacter_ID: { AdminRestoreCharacter message = AdminRestoreCharacter.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } case PacketOpcode.ACCOUNT_BOOTED_EVENT: { AccountBootedEvent message = AccountBootedEvent.read(messageDataReader); message.contributeToTreeView(outputTreeView); break; } default: { handled = false; break; } } return(handled); }
/// <summary> /// Expects operation <see cref = "EnterWorld" /> and creates a new <see cref = "MmoActor" /> with a new <see cref = "MmoItem" /> as avatar and a new <see cref = "MmoClientInterestArea" />. /// The <see cref = "MmoActor" /> becomes the new <see cref = "Peer.CurrentOperationHandler">operation handler</see>. /// If another <see cref = "MmoActor" /> with the same name exists he is disconnected. /// An <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.Ok" /> is published on success. /// </summary> /// <param name = "peer"> /// The client peer. /// </param> /// <param name = "request"> /// The request. /// </param> /// <param name = "sendParameters"> /// The send Parameters. /// </param> /// <returns> /// Null or an <see cref = "OperationResponse" /> with error code <see cref = "ReturnCode.WorldNotFound" />. /// </returns> public OperationResponse OperationEnterWorld(PeerBase peer, OperationRequest request, SendParameters sendParameters) { var operation = new EnterWorld(peer.Protocol, request); if (!operation.IsValid) { return(new OperationResponse(request.OperationCode) { ReturnCode = (int)ReturnCode.InvalidOperationParameter, DebugMessage = operation.GetErrorMessage() }); } MmoWorld world; if (MmoWorldCache.Instance.TryGet(operation.WorldName, out world) == false) { return(operation.GetOperationResponse((int)ReturnCode.WorldNotFound, "WorldNotFound")); } var interestArea = new MmoClientInterestArea(peer, operation.InterestAreaId, world) { ViewDistanceEnter = operation.ViewDistanceEnter.ToVector(), ViewDistanceExit = operation.ViewDistanceExit.ToVector() }; var actor = new MmoActor(peer, world, interestArea); var avatar = new MmoItem(world, operation.Position, operation.Rotation, operation.Properties, actor, operation.Username, (byte)ItemType.Avatar); while (world.ItemCache.AddItem(avatar) == false) { Item otherAvatarItem; if (world.ItemCache.TryGetItem(avatar.Type, avatar.Id, out otherAvatarItem)) { avatar.Dispose(); actor.Dispose(); interestArea.Dispose(); ((Peer)((MmoItem)otherAvatarItem).Owner.Peer).DisconnectByOtherPeer(this, request, sendParameters); // request continued later, no response here return(null); } } // init avatar actor.AddItem(avatar); actor.Avatar = avatar; ((Peer)peer).SetCurrentOperationHandler(actor); // set return values var responseObject = new EnterWorldResponse { BottomRightCorner = world.Area.Max.ToFloatArray(2), TopLeftCorner = world.Area.Min.ToFloatArray(2), TileDimensions = world.TileDimensions.ToFloatArray(2), WorldName = world.Name }; // send response; use item channel to ensure that this event arrives before any move or subscribe events var response = new OperationResponse(request.OperationCode, responseObject); sendParameters.ChannelId = Settings.ItemEventChannel; peer.SendOperationResponse(response, sendParameters); lock (interestArea.SyncRoot) { interestArea.AttachToItem(avatar); interestArea.UpdateInterestManagement(); } avatar.Spawn(operation.Position); world.Radar.AddItem(avatar, operation.Position); // response already sent return(null); }
public static void handlePacket(GameClient client, byte[] buff) { byte id = buff[0]; string cninfo = "handlepacket: request " + id.ToString("x2") + " size " + buff.Length; string str = "header: " + buff[0].ToString("x2") + "\n"; foreach (byte b in buff) { str += b.ToString("x2") + " "; } Console.WriteLine(str); //File.WriteAllText("header_" + buff[0].ToString("x2")+".txt", str); GameServerNetworkRequest msg = null; switch (id) { case 0x00: msg = new ProtocolVersion(client, buff); break; case 0x08: msg = new AuthLogin(client, buff); break; case 0x09: msg = new Logout(client, buff); break; case 0x0b: msg = new CharacterCreate(client, buff); break; //case 0x0c: // msg = new CharacterDelete(client, buff); // break; case 0x0d: msg = new CharacterSelected(client, buff); break; case 0x0e: msg = new NewCharacter(client, buff); break; //case 0x62: // msg = new CharacterRestore(client, buff); // break; //case 0x68: // msg = new RequestPledgeCrest(client, buff); // break; //case 0x0c: // msg = new CharacterCreate(client, buff); // break; //case 0x00: // msg = new ProtocolVersion(client, buff); // break; //case 0x09: // msg = new RequestSetPledgeCrest(client, buff); // break; case 0x01: msg = new MoveBackwardToLocation(client, buff); break; case 0x03: msg = new EnterWorld(client, buff); break; case 0x0f: msg = new RequestItemList(client, buff); break; case 0x11: msg = new RequestUnEquipItem(client, buff); break; case 0x14: msg = new RequestUseItem(client, buff); break; case 0x1A: msg = new RequestStartTrade(client, buff); break; case 0x16: msg = new RequestAddTradeItem(client, buff); break; case 0x17: msg = new RequestTradeDone(client, buff); break; case 0x04: msg = new RequestAction(client, buff); break; case 0x20: msg = new RequestLinkHtml(client, buff); break; case 0x21: msg = new RequestBypassToServer(client, buff); break; case 0x26: msg = new RequestWithdrawalPledge(client, buff); break; case 0x8c: msg = new RequestGetItemFromPet(client, buff); break; case 0x1b: msg = new RequestSocialAction(client, buff); break; case 0x1e: msg = new RequestSellItem(client, buff); break; case 0x2f: msg = new RequestMagicSkillUse(client, buff); break; case 0x30: msg = new Appearing(client, buff); break; case 0x3B: msg = new RequestWarehouseDeposit(client, buff); break; case 0x32: msg = new RequestWarehouseWithdraw(client, buff); break; case 0x33: msg = new RequestShortCutReg(client, buff); break; case 0x35: msg = new RequestShortCutDel(client, buff); break; case 0x1f: msg = new RequestBuyItem(client, buff); break; case 0x29: msg = new RequestJoinParty(client, buff); break; case 0x2a: msg = new RequestAnswerJoinParty(client, buff); break; case 0x2b: msg = new RequestWithDrawalParty(client, buff); break; case 0x2c: msg = new RequestOustPartyMember(client, buff); break; case 0x36: msg = new CannotMoveAnymore(client, buff); break; case 0x37: msg = new RequestTargetCanceld(client, buff); break; case 0x38: msg = new Say2(client, buff); break; case 0x42: msg = new RequestGetOnVehicle(client, buff); break; case 0x43: msg = new RequestGetOffVehicle(client, buff); break; case 0x44: msg = new AnswerTradeRequest(client, buff); break; case 0x45: msg = new RequestActionUse(client, buff); break; case 0x46: msg = new RequestRestart(client, buff); break; case 0x48: msg = new ValidatePosition(client, buff); break; case 0x4a: msg = new StartRotating(client, buff); break; case 0x4b: msg = new FinishRotating(client, buff); break; case 0x57: msg = new RequestShowBoard(client, buff); break; case 0x58: msg = new RequestEnchantItem(client, buff); break; case 0x59: msg = new RequestDestroyItem(client, buff); break; case 0x64: msg = new RequestQuestAbort(client, buff); break; case 0x66: msg = new RequestPledgeInfo(client, buff); break; case 0xcd: msg = new RequestShowMiniMap(client, buff); break; case 0x6D: msg = new RequestSendMsnChatLog(client, buff); break; case 0xcf: msg = new RequestRecordInfo(client, buff); break; case 0x73: msg = new RequestAcquireSkillInfo(client, buff); break; case 0x74: msg = new SendBypassBuildCmd(client, buff); break; case 0x75: msg = new RequestMoveToLocationInVehicle(client, buff); break; case 0x7C: msg = new RequestAcquireSkill(client, buff); break; case 0x7D: msg = new RequestRestartPoint(client, buff); break; case 0x80: msg = new RequestPartyMatchList(client, buff); break; case 0x85: msg = new RequestTutorialLinkHtml(client, buff); break; case 0x86: msg = new RequestTutorialPassCmdToServer(client, buff); break; // case 0x87: // msg = new RequestTutorialQuestionMark(); // break; case 0x93: msg = new RequestChangePetName(client, buff); break; case 0x94: msg = new RequestPetUseItem(client, buff); break; case 0x95: msg = new RequestGiveItemToPet(client, buff); break; case 0xB0: msg = new MultiSellChoose(client, buff); break; case 0xB1: msg = new NetPingResponse(client, buff); break; case 0xaa: msg = new BypassUserCmd(client, buff); break; case 0xB5: msg = new RequestRecipeBookOpen(client, buff); break; case 0xB6: msg = new RequestRecipeBookDestroy(client, buff); break; case 0xB7: msg = new RequestRecipeItemMakeInfo(client, buff); break; case 0xB8: msg = new RequestRecipeItemMakeSelf(client, buff); break; case 0xC1: msg = new ObserverReturn(client, buff); break; case 0xC7: msg = new RequestWearItem(client, buff); break; case 0xD0: byte id2 = buff[1]; cninfo = "handlepacket: request unk id2 " + id2.ToString("x2") + " size " + buff.Length; switch (id2) { case 8: msg = new RequestManorList(client, buff); break; case 0x11: msg = new RequestExSetPledgeCrestLarge(client, buff); break; case 5: msg = new RequestAutoSoulShot(client, buff); break; case 0x16: msg = new RequestPledgeMemberInfo(client, buff); break; case 0x1E: msg = new RequestExRqItemLink(client, buff); break; case 0x24: msg = new RequestSaveInventoryOrder(client, buff); break; case 0x22: msg = new RequestCursedWeaponList(client, buff); break; case 0x4B: msg = new RequestDispel(client, buff); break; case 0x4C: msg = new RequestExTryToPutEnchantTargetItem(client, buff); break; case 0x4D: msg = new RequestExTryToPutEnchantSupportItem(client, buff); break; case 0x4E: msg = new RequestExCancelEnchantItem(client, buff); break; //case 0x51: // byte id3 = buff[3]; // cninfo = "handlepacket: request unk id3 " + id3.ToString("x2") + " size " + buff.Length; // switch (id3) // { // case 0: // msg = new RequestBookMarkSlotInfo(client, buff); // break; // case 1: // msg = new RequestSaveBookMarkSlot(client, buff); // break; // case 2: // msg = new RequestModifyBookMarkSlot(client, buff); // break; // case 3: // msg = new RequestDeleteBookMarkSlot(client, buff); // break; // case 4: // msg = new RequestTeleportBookMark(client, buff); // break; // } // break; case 0x58: msg = new RequestDominionInfo(client, buff); break; case 0x65: msg = new RequestPostItemList(client, buff); break; case 0x67: msg = new RequestReceivedPostList(client, buff); break; case 0x69: msg = new RequestReceivedPost(client, buff); break; case 0x6C: msg = new RequestSentPostList(client, buff); break; case 0x6E: msg = new RequestSentPost(client, buff); break; case 0x76: msg = new RequestBuySellUIClose(client, buff); break; case 0x78: msg = new RequestPartyLootModification(client, buff); break; case 0x79: msg = new AnswerPartyLootModification(client, buff); break; case 0x7F: msg = new RequestBR_GamePoint(client, buff); break; case 0x80: msg = new RequestBR_ProductList(client, buff); break; case 0x81: msg = new RequestBR_ProductInfo(client, buff); break; case 0x82: msg = new RequestBR_BuyProduct(client, buff); break; case 0x83: msg = new RequestBR_RecentProductList(client, buff); break; case 0x84: msg = new RequestBR_MinigameLoadScores(client, buff); break; case 0x85: msg = new RequestBR_MinigameInsertScore(client, buff); break; default: // out_debug(2, buff); break; } break; default: // out_debug(1, buff); break; } // Console.WriteLine(cninfo + ", " + cnt); if (msg == null) { Console.WriteLine(cninfo + ", " + cnt); // out_debug(0, buff); // cnt++; return; } if (msg.Client.IsTerminated) { return; } new Thread(new ThreadStart(msg.run)).Start(); }