internal void WriteInitial(Packet pPacket) { pPacket.WriteUInt(0); pPacket.WriteByte(0x00); pPacket.WriteUShort((ushort)mCards.Count); foreach (PlayerCard card in mCards.Values) { pPacket.WriteUShort(ItemData.ReduceCardIdentifier(card.CardIdentifier)); pPacket.WriteByte(card.Level); } }
internal void WriteInitial(Packet pPacket) { pPacket.WriteUShort((ushort)mSkills.Count); foreach (PlayerSkill skill in mSkills.Values) skill.WriteGeneral(pPacket); List<PlayerSkill> cooldowns = new List<PlayerSkill>(mSkills.Values); cooldowns.RemoveAll(s => s.Cooldown == 0); pPacket.WriteUShort((ushort)cooldowns.Count); foreach (PlayerSkill cooldown in cooldowns) { pPacket.WriteInt(cooldown.SkillIdentifier); pPacket.WriteUShort(cooldown.Cooldown); } }
internal void WriteInitial(Packet pPacket) { List<PlayerQuest> active = new List<PlayerQuest>(mQuests.Values); active.RemoveAll(q => q.Completed != 0); pPacket.WriteUShort((ushort)active.Count); foreach (PlayerQuest quest in active) { pPacket.WriteUShort(quest.QuestIdentifier); pPacket.WriteString(quest.State); } List<PlayerQuest> completed = new List<PlayerQuest>(mQuests.Values); completed.RemoveAll(q => q.Completed == 0); pPacket.WriteUShort((ushort)completed.Count); foreach (PlayerQuest quest in completed) { pPacket.WriteInt(quest.QuestIdentifier); pPacket.WriteLong(quest.Completed); } }
public static void Action(Client pClient, Packet pPacket) { int uniqueIdentifier; short moveIdentifier; bool isUsingAbility; byte usingAbility; Coordinates projectileTarget; if (!pPacket.ReadInt(out uniqueIdentifier) || !pPacket.ReadShort(out moveIdentifier) || !pPacket.ReadBool(out isUsingAbility) || !pPacket.ReadByte(out usingAbility) || !pPacket.ReadCoordinates(out projectileTarget) || !pPacket.ReadSkip(5)) { pClient.Disconnect(); return; } Mob mob = pClient.Player.Map.GetMob(uniqueIdentifier); if (mob == null || mob.Controller != pClient.Player) return; int rewindOffset = pPacket.Cursor; Coordinates unknownPosition; if (!pPacket.ReadCoordinates(out unknownPosition) || !pClient.Player.Map.ReadMovement(mob, pPacket)) { pClient.Disconnect(); return; } Packet packet = new Packet(EOpcode.SMSG_MOB_ACTION_CONFIRM); packet.WriteInt(uniqueIdentifier); packet.WriteShort(moveIdentifier); packet.WriteBool(isUsingAbility); packet.WriteUShort((ushort)mob.Mana); packet.WriteByte(0x00); // Ability Identifier packet.WriteByte(0x00); // Ability Level pClient.SendPacket(packet); pPacket.Rewind(rewindOffset); packet = new Packet(EOpcode.SMSG_MOB_ACTION); packet.WriteInt(uniqueIdentifier); packet.WriteBool(isUsingAbility); packet.WriteByte(usingAbility); packet.WriteCoordinates(projectileTarget); packet.WriteBytes(pPacket.InnerBuffer, pPacket.Cursor, pPacket.Remaining); pClient.Player.Map.SendPacketToAllExcept(packet, pClient.Player); pClient.Player.Map.UpdateMobControllers(true); }
internal void SendControl(bool pTakeControl) { if (mController != null) { Packet packet = new Packet(EOpcode.SMSG_MOB_CONTROL); packet.WriteBool(pTakeControl); packet.WriteInt(UniqueIdentifier); if (pTakeControl) { packet.WriteByte(0x05); packet.WriteInt(mData.MobIdentifier); WriteStatus(packet); packet.WriteCoordinates(mPosition); packet.WriteByte((byte)(0x02 | (FacingLeft ? 0x01 : 0x00))); packet.WriteUShort(mFoothold); packet.WriteUShort(mData.Foothold); packet.WriteBool(false); packet.WriteByte(0xFF); packet.WriteInt(0); } mController.SendPacket(packet); } }
private static void WritePlayer(Packet pPacket, DatabaseQuery pQuery) { pPacket.WriteInt((int)pQuery["identifier"]); pPacket.WritePaddedString((string)pQuery["name"], 13); pPacket.WriteByte((byte)pQuery["gender"]); pPacket.WriteByte((byte)pQuery["skin"]); pPacket.WriteInt((int)pQuery["eyes_identifier"]); pPacket.WriteInt((int)pQuery["hair_identifier"]); pPacket.WriteSkip(24); pPacket.WriteByte((byte)pQuery["level"]); pPacket.WriteUShort((ushort)pQuery["job"]); pPacket.WriteUShort((ushort)pQuery["strength"]); pPacket.WriteUShort((ushort)pQuery["dexterity"]); pPacket.WriteUShort((ushort)pQuery["intellect"]); pPacket.WriteUShort((ushort)pQuery["luck"]); pPacket.WriteUShort((ushort)pQuery["health"]); pPacket.WriteUShort((ushort)pQuery["max_health"]); pPacket.WriteUShort((ushort)pQuery["mana"]); pPacket.WriteUShort((ushort)pQuery["max_mana"]); pPacket.WriteUShort((ushort)pQuery["ability_points"]); pPacket.WriteUShort((ushort)pQuery["skill_points"]); pPacket.WriteInt((int)pQuery["experience"]); pPacket.WriteUShort((ushort)pQuery["fame"]); pPacket.WriteSkip(4); pPacket.WriteInt((int)pQuery["map_identifier"]); pPacket.WriteByte((byte)pQuery["map_spawn"]); pPacket.WriteSkip(4); pPacket.WriteByte((byte)pQuery["gender"]); pPacket.WriteByte((byte)pQuery["skin"]); pPacket.WriteInt((int)pQuery["eyes_identifier"]); pPacket.WriteBool(true); pPacket.WriteInt((int)pQuery["hair_identifier"]); SortedDictionary<byte, Doublet<int, int>> equipment = new SortedDictionary<byte, Doublet<int, int>>(); using (DatabaseQuery queryEquipment = Database.Query("SELECT inventory_slot,item_identifier FROM player_item WHERE player_identifier=@player_identifier AND inventory_type=0 AND inventory_slot<0", new MySqlParameter("@player_identifier", (int)pQuery["identifier"]))) { while (queryEquipment.NextRow()) { short slot = (short)(-((short)queryEquipment["inventory_slot"])); if (slot > 100) slot -= 100; Doublet<int, int> pair = equipment.GetOrDefault((byte)slot, null); if (pair == null) { pair = new Doublet<int, int>((int)queryEquipment["item_identifier"], 0); equipment.Add((byte)slot, pair); } else if ((short)queryEquipment["inventory_slot"] < -100) { pair.Second = pair.First; pair.First = (int)queryEquipment["item_identifier"]; } else pair.Second = (int)queryEquipment["item_identifier"]; } } foreach (KeyValuePair<byte, Doublet<int, int>> pair in equipment) { pPacket.WriteByte(pair.Key); if (pair.Key == 11 && pair.Value.Second > 0) pPacket.WriteInt(pair.Value.Second); else pPacket.WriteInt(pair.Value.First); } pPacket.WriteByte(0xFF); foreach (KeyValuePair<byte, Doublet<int, int>> pair in equipment) { if (pair.Key != 11 && pair.Value.Second > 0) { pPacket.WriteByte(pair.Key); pPacket.WriteInt(pair.Value.Second); } } pPacket.WriteByte(0xFF); Doublet<int, int> cashWeapon = equipment.GetOrDefault((byte)11, null); pPacket.WriteInt(cashWeapon == null ? 0 : cashWeapon.First); pPacket.WriteSkip(12); pPacket.WriteBool(false); }
private static void SendChannelConnect(Client pClient, int pPlayerIdentifier) { Packet packet = new Packet(EOpcode.SMSG_CHANNEL_CONNECT); packet.WriteByte(0x00); packet.WriteByte(0x00); packet.WriteBytes(IPAddress.Parse(Config.Instance.Channel.ExternalAddress).GetAddressBytes()); packet.WriteUShort(Config.Instance.Channel.Listener.Port); packet.WriteInt(pPlayerIdentifier); packet.WriteSkip(5); pClient.SendPacket(packet); }
public void WriteGeneral(Packet pPacket, bool pRealSlot) { if (mInventorySlot != 0) { if (pRealSlot) pPacket.WriteShort(mInventorySlot); else { byte slot = (byte)Math.Abs(mInventorySlot); if (slot > 100) slot -= 100; pPacket.WriteByte(slot); } } pPacket.WriteByte((byte)(mInventoryType == EInventoryType.Equipment ? 0x01 : 0x02)); pPacket.WriteInt(mItemIdentifier); pPacket.WriteByte(0x00); pPacket.WriteLong(0); if (mInventoryType == EInventoryType.Equipment) { pPacket.WriteByte(mUnusedScrollSlots); pPacket.WriteByte(mUsedScrollSlots); pPacket.WriteUShort(mStrength); pPacket.WriteUShort(mDexterity); pPacket.WriteUShort(mIntellect); pPacket.WriteUShort(mLuck); pPacket.WriteUShort(mHealth); pPacket.WriteUShort(mMana); pPacket.WriteUShort(mWeaponAttack); pPacket.WriteUShort(mMagicAttack); pPacket.WriteUShort(mWeaponDefense); pPacket.WriteUShort(mMagicDefense); pPacket.WriteUShort(mAccuracy); pPacket.WriteUShort(mAvoidance); pPacket.WriteUShort(mHands); pPacket.WriteUShort(mSpeed); pPacket.WriteUShort(mJump); pPacket.WriteString(mOwner); pPacket.WriteUShort(mFlags); pPacket.WriteByte(0x00); pPacket.WriteByte(0x00); pPacket.WriteUShort(0); pPacket.WriteUShort(0); pPacket.WriteUInt(0); pPacket.WriteLong(-1); pPacket.WriteLong(0); // 0040E0FD3B374F01 pPacket.WriteInt(-1); } else { pPacket.WriteUShort(mQuantity); pPacket.WriteString(mOwner); pPacket.WriteUShort(mFlags); if (ItemData.IsRechargeable(ItemData.GetType(mItemIdentifier))) pPacket.WriteLong(0); } }
internal void SendNPCDetails(Player pPlayer) { int index = 0; foreach (NPC npc in mNPCs) { Packet packet = new Packet(EOpcode.SMSG_NPC_DETAILS); packet.WriteInt(index + 0x64); packet.WriteInt(npc.Data.NPCIdentifier); packet.WriteShort(npc.Data.X); packet.WriteShort(npc.Data.Y); packet.WriteBool((npc.Data.Flags & MapData.MapNPCData.EMapNPCFlags.FacesLeft) != MapData.MapNPCData.EMapNPCFlags.None); packet.WriteUShort(npc.Data.Foothold); packet.WriteShort(npc.Data.MinClickX); packet.WriteShort(npc.Data.MaxClickX); packet.WriteBool(true); pPlayer.SendPacket(packet); packet = new Packet(EOpcode.SMSG_NPC_CONTROL); packet.WriteBool(true); packet.WriteInt(index + 0x64); packet.WriteInt(npc.Data.NPCIdentifier); packet.WriteShort(npc.Data.X); packet.WriteShort(npc.Data.Y); packet.WriteBool((npc.Data.Flags & MapData.MapNPCData.EMapNPCFlags.FacesLeft) != MapData.MapNPCData.EMapNPCFlags.None); packet.WriteUShort(npc.Data.Foothold); packet.WriteShort(npc.Data.MinClickX); packet.WriteShort(npc.Data.MaxClickX); packet.WriteBool(true); pPlayer.SendPacket(packet); ++index; } }
internal void SendMobDetails(Player pPlayer) { foreach (Mob mob in mMobs) { Packet packet = new Packet(EOpcode.SMSG_MOB_DETAILS); packet.WriteInt(mob.UniqueIdentifier); packet.WriteByte(0x00); packet.WriteInt(mob.Data.MobIdentifier); mob.WriteStatus(packet); packet.WriteCoordinates(mob.Position); byte bits = 0x02; if (mob.FacingLeft) bits |= 0x01; packet.WriteByte(bits); packet.WriteUShort(mob.Foothold); packet.WriteUShort(mob.Data.Foothold); packet.WriteSByte(-1); packet.WriteSByte(0); packet.WriteInt(0); pPlayer.SendPacket(packet); } }
internal void SendMapChange() { Packet packet = new Packet(EOpcode.SMSG_MAP_CHANGE); packet.WriteInt(0); packet.WriteInt(2); packet.WriteInt(mMap.Data.Identifier); packet.WriteByte(mSpawn); packet.WriteUShort(mHealth); packet.WriteByte(0x00); packet.WriteLong(DateTime.Now.Ticks); mClient.SendPacket(packet); }
internal void SendInitialMapChange() { Packet packet = new Packet(EOpcode.SMSG_MAP_CHANGE); packet.WriteUInt(0); packet.WriteByte(0x01); packet.WriteByte(0x01); packet.WriteUShort(0); packet.WriteInt(mRandom.Next()); packet.WriteInt(mRandom.Next()); packet.WriteInt(mRandom.Next()); packet.WriteInt(-1); packet.WriteInt(-1); packet.WriteInt(mIdentifier); packet.WritePaddedString(mName, 13); packet.WriteByte(mGender); packet.WriteByte(mSkin); packet.WriteInt(mEyesIdentifier); packet.WriteInt(mHairIdentifier); packet.WriteSkip(24); packet.WriteByte(mLevel); packet.WriteUShort(mJob); packet.WriteUShort(mStrength); packet.WriteUShort(mDexterity); packet.WriteUShort(mIntellect); packet.WriteUShort(mLuck); packet.WriteUShort(mHealth); packet.WriteUShort(mMaxHealth); packet.WriteUShort(mMana); packet.WriteUShort(mMaxMana); packet.WriteUShort(mAbilityPoints); packet.WriteUShort(mSkillPoints); packet.WriteInt(mExperience); packet.WriteUShort(mFame); packet.WriteUInt(0); packet.WriteInt(mMap.Data.Identifier); packet.WriteByte(mSpawn); packet.WriteUInt(0); packet.WriteByte(mBuddies.MaxBuddies); mItems.WriteInitial(packet); mSkills.WriteInitial(packet); mQuests.WriteInitial(packet); packet.WriteUInt(0); packet.WriteUInt(0); mTeleports.WriteInitial(packet); mCards.WriteInitial(packet); packet.WriteUInt(0); packet.WriteUShort(0); packet.WriteLong(DateTime.Now.ToBinary()); mClient.SendPacket(packet); }
internal Packet GetPlayerDetails() { Packet packet = new Packet(EOpcode.SMSG_PLAYER_DETAILS); packet.WriteInt(mIdentifier); packet.WriteString(mName); packet.WriteString(""); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteUInt(0); packet.WriteByte(0xF8); packet.WriteByte(0x03); packet.WriteUShort(0); byte[] types = mBuffs.MapTypes; packet.WriteBytes(types, PlayerBuffs.BUFF_BYTE_5, 4); packet.WriteBytes(types, PlayerBuffs.BUFF_BYTE_1, 4); for (byte index = 0; index < PlayerBuffs.BUFF_ENTRY_ORDER.Length; ++index) { byte entryIndex = PlayerBuffs.BUFF_ENTRY_ORDER[index]; if (types[entryIndex] != 0) { foreach (KeyValuePair<byte, PlayerBuffs.MapValue> kv in mBuffs.MapValues[entryIndex]) { if (kv.Value.Debuff) { if (!(kv.Key == 0x01 && entryIndex == PlayerBuffs.BUFF_BYTE_5)) { packet.WriteUShort(kv.Value.SkillIdentifier); packet.WriteShort(kv.Value.Value); } } else if (kv.Value.Use) { if (entryIndex == PlayerBuffs.BUFF_BYTE_3) { if (kv.Key == 0x20) packet.WriteByte((byte)(mBuffs.Combo + 1)); else if (kv.Key == 0x40) packet.WriteInt(mBuffs.ChargeSkillIdentifier); } else if (entryIndex == PlayerBuffs.BUFF_BYTE_5) packet.WriteShort(kv.Value.Value); else packet.WriteByte((byte)kv.Value.Value); } } } } packet.WriteUShort(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteInt(mBuffs.MountIdentifier); packet.WriteInt(mBuffs.MountSkillIdentifier); packet.WriteUInt(1065638850); packet.WriteByte(0x00); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUInt(0); packet.WriteByte(0x00); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(1065638850); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteUShort(mJob); WriteAppearance(packet); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteCoordinates(mPosition); packet.WriteByte(0x00); packet.WriteUShort(0); packet.WriteByte(0x00); packet.WriteByte(0x00); packet.WriteUShort(1); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUInt(0); packet.WriteUShort(0); return packet; }