public override IPacketWriter BuildForceSpeed(float modifier, SpeedType type = SpeedType.Run) { global::Opcodes opcode; switch (type) { case SpeedType.Fly: opcode = global::Opcodes.SMSG_FORCE_FLIGHT_SPEED_CHANGE; break; case SpeedType.Swim: opcode = global::Opcodes.SMSG_FORCE_SWIM_SPEED_CHANGE; break; default: opcode = global::Opcodes.SMSG_FORCE_SPEED_CHANGE; break; } PacketWriter writer = new PacketWriter(Sandbox.Instance.Opcodes[opcode], opcode.ToString()); writer.WritePackedGUID(Guid); writer.Write(2); return(this.BuildForceSpeed(writer, modifier)); }
public override void Teleport(float x, float y, float z, float o, uint map, ref IWorldManager manager) { IsTeleporting = true; bool mapchange = Location.Map != map; if (!mapchange) { PacketWriter movementStatus = new PacketWriter(Sandbox.Instance.Opcodes[global::Opcodes.MSG_MOVE_TELEPORT_ACK], "MSG_MOVE_TELEPORT_ACK"); movementStatus.WritePackedGUID(Guid); movementStatus.WriteUInt64(0); movementStatus.WriteUInt32(0); movementStatus.WriteFloat(x); movementStatus.WriteFloat(y); movementStatus.WriteFloat(z); movementStatus.WriteFloat(o); movementStatus.WriteFloat(0); manager.Send(movementStatus); } else { // Loading screen PacketWriter transferPending = new PacketWriter(Sandbox.Instance.Opcodes[global::Opcodes.SMSG_TRANSFER_PENDING], "SMSG_TRANSFER_PENDING"); transferPending.WriteUInt32(map); manager.Send(transferPending); // New world transfer PacketWriter newWorld = new PacketWriter(Sandbox.Instance.Opcodes[global::Opcodes.SMSG_NEW_WORLD], "SMSG_NEW_WORLD"); newWorld.WriteUInt32(map); newWorld.WriteFloat(x); newWorld.WriteFloat(y); newWorld.WriteFloat(z); newWorld.WriteFloat(o); manager.Send(newWorld); IsFlying = false; } System.Threading.Thread.Sleep(150); // Pause to factor unsent packets Location = new Location(x, y, z, o, map); manager.Send(BuildUpdate()); // retain flight manager.Send(BuildFly(IsFlying)); if (mapchange) { // send timesync PacketWriter timesyncreq = new PacketWriter(Sandbox.Instance.Opcodes[global::Opcodes.SMSG_TIME_SYNC_REQ], "SMSG_TIME_SYNC_REQ"); timesyncreq.Write(0); manager.Send(timesyncreq); } IsTeleporting = false; }
public override IPacketWriter BuildFly(bool mode) { IsFlying = mode; var opcode = mode ? global::Opcodes.SMSG_MOVE_SET_CAN_FLY : global::Opcodes.SMSG_MOVE_UNSET_CAN_FLY; PacketWriter writer = new PacketWriter(Sandbox.Instance.Opcodes[opcode], opcode.ToString()); writer.WritePackedGUID(Guid); writer.Write(2); return(writer); }
public override IPacketWriter BuildUpdate() { MaskSize = ((int)Fields.MAX + 31) / 32; FieldData.Clear(); MaskArray = new byte[MaskSize * 4]; PacketWriter writer = new PacketWriter(Sandbox.Instance.Opcodes[global::Opcodes.SMSG_UPDATE_OBJECT], "SMSG_UPDATE_OBJECT"); writer.WriteUInt32(1); // Number of transactions writer.WriteUInt8(0); writer.WriteUInt8(3); // UpdateType writer.WritePackedGUID(Guid); writer.WriteUInt8(4); // ObjectType, 4 = Player writer.WriteUInt8(0x71); // UpdateFlags writer.WriteUInt32(0x2000); // MovementFlagMask writer.WriteUInt32((uint)Environment.TickCount); writer.WriteFloat(Location.X); // x writer.WriteFloat(Location.Y); // y writer.WriteFloat(Location.Z); // z writer.WriteFloat(Location.O); // w (o) writer.WriteInt32(0); // falltime writer.WriteFloat(0); writer.WriteFloat(1); writer.WriteFloat(0); writer.WriteFloat(0); writer.WriteFloat(2.5f); // WalkSpeed writer.WriteFloat(7.0f); // RunSpeed writer.WriteFloat(2.5f); // Backwards WalkSpeed writer.WriteFloat(4.7222f); // SwimSpeed writer.WriteFloat(4.7222f); // Backwards SwimSpeed writer.WriteFloat(7.0f); // FlySpeed writer.WriteFloat(4.7222f); // Backwards FlySpeed writer.WriteFloat(3.14f); // TurnSpeed writer.Write(1); SetField(Fields.OBJECT_FIELD_GUID, Guid); SetField(Fields.OBJECT_FIELD_TYPE, (uint)0x19); SetField(Fields.OBJECT_FIELD_ENTRY, 0); SetField(Fields.OBJECT_FIELD_SCALE_X, Scale); SetField(Fields.OBJECT_FIELD_PADDING, 0); SetField(Fields.UNIT_FIELD_TARGET, (ulong)0); SetField(Fields.UNIT_FIELD_HEALTH, Health); SetField(Fields.UNIT_FIELD_POWER2, 0); SetField(Fields.UNIT_FIELD_MAXHEALTH, Health); SetField(Fields.UNIT_FIELD_MAXPOWER2, Rage); SetField(Fields.UNIT_FIELD_LEVEL, Level); SetField(Fields.UNIT_FIELD_FACTIONTEMPLATE, this.GetFactionTemplate()); SetField(Fields.UNIT_FIELD_BYTES_0, ToUInt32(Race, Class, Gender, PowerType)); SetField(Fields.UNIT_FIELD_STAT0, Strength); SetField(Fields.UNIT_FIELD_STAT1, Agility); SetField(Fields.UNIT_FIELD_STAT2, Stamina); SetField(Fields.UNIT_FIELD_STAT3, Intellect); SetField(Fields.UNIT_FIELD_STAT4, Spirit); SetField(Fields.UNIT_FIELD_FLAGS, 8); SetField(Fields.UNIT_FIELD_BASE_MANA, Mana); SetField(Fields.UNIT_FIELD_DISPLAYID, DisplayId); SetField(Fields.UNIT_FIELD_MOUNTDISPLAYID, MountDisplayId); SetField(Fields.UNIT_FIELD_BYTES_1, ToUInt32((byte)StandState)); SetField(Fields.UNIT_FIELD_BYTES_2, 0); SetField(Fields.PLAYER_BYTES, ToUInt32(Skin, Face, HairStyle, HairColor)); SetField(Fields.PLAYER_BYTES_2, ToUInt32(FacialHair, b4: RestedState)); SetField(Fields.PLAYER_BYTES_3, ToUInt32(Gender)); SetField(Fields.PLAYER_XP, 47); SetField(Fields.PLAYER_NEXT_LEVEL_XP, 200); SetField(Fields.PLAYER_FLAGS, 0); SetField(Fields.UNIT_FIELD_ATTACK_POWER, 1); SetField(Fields.UNIT_FIELD_ATTACK_POWER_MODS, 0); SetField(Fields.UNIT_FIELD_RANGED_ATTACK_POWER, 1); SetField(Fields.UNIT_FIELD_RANGED_ATTACK_POWER_MODS, 0); for (int i = 0; i < 64; i++) { SetField(Fields.PLAYER_EXPLORED_ZONES_1 + i, 0xFFFFFFFF); } // FillInPartialObjectData writer.WriteUInt8(MaskSize); // UpdateMaskBlocks writer.Write(MaskArray); foreach (var kvp in FieldData) { writer.Write(kvp.Value); // Data } return(writer); }