public ServerPacket BuildObjectCreate() { var player = Guid.IsPlayer() ? this as Player : null; var objectCreate = new ServerPacket(0x18, PacketHeaderFlags.EncryptedChecksum); var objectCreateFragment = new ServerPacketFragment(0x0A, FragmentOpcode.ObjectCreate); objectCreateFragment.Payload.Write(Guid.Full); // TODO: model information objectCreateFragment.Payload.Write((byte)0x11); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Write((byte)0); objectCreateFragment.Payload.Align(); PhysicsDescriptionFlag flags = PhysicsDescriptionFlag.CSetup | PhysicsDescriptionFlag.MTable | PhysicsDescriptionFlag.Stable | PhysicsDescriptionFlag.Petable | PhysicsDescriptionFlag.Position; objectCreateFragment.Payload.Write((uint)flags); objectCreateFragment.Payload.Write((uint)(PhysicsState.IgnoreCollision | PhysicsState.Gravity | PhysicsState.Hidden | PhysicsState.EdgeSlide)); /*if ((flags & PhysicsDescriptionFlag.Movement) != 0) * { * }*/ /*if ((flags & PhysicsDescriptionFlag.AnimationFrame) != 0) * { * }*/ if ((flags & PhysicsDescriptionFlag.Position) != 0) { Position.Write(objectCreateFragment.Payload); } // TODO: if ((flags & PhysicsDescriptionFlag.MTable) != 0) { objectCreateFragment.Payload.Write(0x09000001u); } if ((flags & PhysicsDescriptionFlag.Stable) != 0) { objectCreateFragment.Payload.Write(0x20000001u); } if ((flags & PhysicsDescriptionFlag.Petable) != 0) { objectCreateFragment.Payload.Write(0x34000004u); } if ((flags & PhysicsDescriptionFlag.CSetup) != 0) { objectCreateFragment.Payload.Write(0x02000001u); } /*if ((flags & PhysicsDescriptionFlag.Parent) != 0) * { * }*/ /*if ((flags & PhysicsDescriptionFlag.Children) != 0) * { * }*/ if ((flags & PhysicsDescriptionFlag.ObjScale) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Friction) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Elastcity) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Translucency) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Velocity) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Acceleration) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.Omega) != 0) { objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); objectCreateFragment.Payload.Write(0.0f); } if ((flags & PhysicsDescriptionFlag.DefaultScript) != 0) { objectCreateFragment.Payload.Write(0u); } if ((flags & PhysicsDescriptionFlag.DefaultScriptIntensity) != 0) { objectCreateFragment.Payload.Write(0.0f); } objectCreateFragment.Payload.Write((ushort)MovementIndex); objectCreateFragment.Payload.Write((ushort)1); objectCreateFragment.Payload.Write((ushort)(player != null ? player.PortalIndex : 0)); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)TeleportIndex); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)0); objectCreateFragment.Payload.Write((ushort)(player != null ? player.LoginIndex : 0)); objectCreateFragment.Payload.Align(); var weenieHeaderFlags = WeenieHeaderFlag.ItemCapacity | WeenieHeaderFlag.ContainerCapacity | WeenieHeaderFlag.Useability | WeenieHeaderFlag.BlipColour | WeenieHeaderFlag.Radar; objectCreateFragment.Payload.Write((uint)weenieHeaderFlags); objectCreateFragment.Payload.WriteString16L(Name); objectCreateFragment.Payload.Write((ushort)1); objectCreateFragment.Payload.Write((ushort)0x1036); objectCreateFragment.Payload.Write((uint)Type); objectCreateFragment.Payload.Write((uint)DescriptionFlags); if ((DescriptionFlags & ObjectDescriptionFlag.AdditionFlags) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.PuralName) != 0) { objectCreateFragment.Payload.WriteString16L(""); } if ((weenieHeaderFlags & WeenieHeaderFlag.ItemCapacity) != 0) { objectCreateFragment.Payload.Write((byte)102); } if ((weenieHeaderFlags & WeenieHeaderFlag.ContainerCapacity) != 0) { objectCreateFragment.Payload.Write((byte)7); } if ((weenieHeaderFlags & WeenieHeaderFlag.AmmoType) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Value) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Useability) != 0) { objectCreateFragment.Payload.Write(1u); } if ((weenieHeaderFlags & WeenieHeaderFlag.UseRadius) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((weenieHeaderFlags & WeenieHeaderFlag.TargetType) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.UiEffects) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.CombatUse) != 0) { objectCreateFragment.Payload.Write((byte)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Struture) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.MaxStructure) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.StackSize) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.MaxStackSize) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Container) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Wielder) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.ValidLocations) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Location) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Priority) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.BlipColour) != 0) { objectCreateFragment.Payload.Write((byte)9); } if ((weenieHeaderFlags & WeenieHeaderFlag.Radar) != 0) { objectCreateFragment.Payload.Write((byte)4); } if ((weenieHeaderFlags & WeenieHeaderFlag.Script) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Workmanship) != 0) { objectCreateFragment.Payload.Write(0.0f); } if ((weenieHeaderFlags & WeenieHeaderFlag.Burden) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.Spell) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.HouseOwner) != 0) { objectCreateFragment.Payload.Write(0u); } /*if ((weenieHeaderFlags & WeenieHeaderFlag.HouseRestrictions) != 0) * { * }*/ if ((weenieHeaderFlags & WeenieHeaderFlag.HookItemTypes) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.Monarch) != 0) { objectCreateFragment.Payload.Write(0u); } if ((weenieHeaderFlags & WeenieHeaderFlag.HookType) != 0) { objectCreateFragment.Payload.Write((ushort)0); } if ((weenieHeaderFlags & WeenieHeaderFlag.IconOverlay) != 0) { objectCreateFragment.Payload.Write((ushort)0); } /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.IconUnderlay) != 0) * objectCreateFragment.Payload.Write((ushort)0);*/ if ((weenieHeaderFlags & WeenieHeaderFlag.Material) != 0) { objectCreateFragment.Payload.Write(0u); } /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.Cooldown) != 0) * objectCreateFragment.Payload.Write(0u);*/ /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.CooldownDuration) != 0) * objectCreateFragment.Payload.Write(0.0d);*/ /*if ((weenieHeaderFlags2 & WeenieHeaderFlag2.PetOwner) != 0) * objectCreateFragment.Payload.Write(0u);*/ objectCreateFragment.Payload.Align(); objectCreate.Fragments.Add(objectCreateFragment); return(objectCreate); }
public static void HandleDebugEchoFlags(Session session, params string[] parameters) { try { if (parameters?.Length == 2) { var debugOutput = ""; switch (parameters[0].ToLower()) { case "descriptionflags": ObjectDescriptionFlag objectDescFlag = new ObjectDescriptionFlag(); objectDescFlag = (ObjectDescriptionFlag)Convert.ToUInt32(parameters[1]); debugOutput = $"{objectDescFlag.GetType().Name} = {objectDescFlag.ToString()}" + " (" + (uint)objectDescFlag + ")"; break; case "weenieflags": WeenieHeaderFlag weenieHdr = new WeenieHeaderFlag(); weenieHdr = (WeenieHeaderFlag)Convert.ToUInt32(parameters[1]); debugOutput = $"{weenieHdr.GetType().Name} = {weenieHdr.ToString()}" + " (" + (uint)weenieHdr + ")"; break; case "weenieflags2": WeenieHeaderFlag2 weenieHdr2 = new WeenieHeaderFlag2(); weenieHdr2 = (WeenieHeaderFlag2)Convert.ToUInt32(parameters[1]); debugOutput = $"{weenieHdr2.GetType().Name} = {weenieHdr2.ToString()}" + " (" + (uint)weenieHdr2 + ")"; break; case "positionflag": UpdatePositionFlag posFlag = new UpdatePositionFlag(); posFlag = (UpdatePositionFlag)Convert.ToUInt32(parameters[1]); debugOutput = $"{posFlag.GetType().Name} = {posFlag.ToString()}" + " (" + (uint)posFlag + ")"; break; case "type": ItemType objectType = new ItemType(); objectType = (ItemType)Convert.ToUInt32(parameters[1]); debugOutput = $"{objectType.GetType().Name} = {objectType.ToString()}" + " (" + (uint)objectType + ")"; break; case "containertype": ContainerType contType = new ContainerType(); contType = (ContainerType)Convert.ToUInt32(parameters[1]); debugOutput = $"{contType.GetType().Name} = {contType.ToString()}" + " (" + (uint)contType + ")"; break; case "usable": Usable usableType = new Usable(); usableType = (Usable)Convert.ToInt64(parameters[1]); debugOutput = $"{usableType.GetType().Name} = {usableType.ToString()}" + " (" + (Int64)usableType + ")"; break; case "radarbehavior": RadarBehavior radarBeh = new RadarBehavior(); radarBeh = (RadarBehavior)Convert.ToUInt32(parameters[1]); debugOutput = $"{radarBeh.GetType().Name} = {radarBeh.ToString()}" + " (" + (uint)radarBeh + ")"; break; case "physicsdescriptionflags": PhysicsDescriptionFlag physicsDescFlag = new PhysicsDescriptionFlag(); physicsDescFlag = (PhysicsDescriptionFlag)Convert.ToUInt32(parameters[1]); debugOutput = $"{physicsDescFlag.GetType().Name} = {physicsDescFlag.ToString()}" + " (" + (uint)physicsDescFlag + ")"; break; case "physicsstate": PhysicsState physState = new PhysicsState(); physState = (PhysicsState)Convert.ToUInt32(parameters[1]); debugOutput = $"{physState.GetType().Name} = {physState.ToString()}" + " (" + (uint)physState + ")"; break; case "validlocations": EquipMask locFlags = new EquipMask(); locFlags = (EquipMask)Convert.ToUInt32(parameters[1]); debugOutput = $"{locFlags.GetType().Name} = {locFlags.ToString()}" + " (" + (uint)locFlags + ")"; break; case "currentwieldedlocation": EquipMask locFlags2 = new EquipMask(); locFlags2 = (EquipMask)Convert.ToUInt32(parameters[1]); debugOutput = $"{locFlags2.GetType().Name} = {locFlags2.ToString()}" + " (" + (uint)locFlags2 + ")"; break; case "priority": CoverageMask covMask = new CoverageMask(); covMask = (CoverageMask)Convert.ToUInt32(parameters[1]); debugOutput = $"{covMask.GetType().Name} = {covMask.ToString()}" + " (" + (uint)covMask + ")"; break; case "radarcolor": RadarColor radarBlipColor = new RadarColor(); radarBlipColor = (RadarColor)Convert.ToUInt32(parameters[1]); debugOutput = $"{radarBlipColor.GetType().Name} = {radarBlipColor.ToString()}" + " (" + (uint)radarBlipColor + ")"; break; default: debugOutput = "No valid type to test"; break; } if (session == null) { Console.WriteLine(debugOutput.Replace(", ", " | ")); } else { session.Network.EnqueueSend(new GameMessageSystemChat(debugOutput, ChatMessageType.System)); } } } catch (Exception) { string debugOutput = "Exception Error, check input and try again"; if (session == null) { Console.WriteLine(debugOutput.Replace(", ", " | ")); } else { session.Network.EnqueueSend(new GameMessageSystemChat(debugOutput, ChatMessageType.System)); } } }
// todo: return bytes of data for network write ? ? public void Serialize(WorldObject wo, BinaryWriter writer) { if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Velocity) > 0 && this.Velocity == null) { // velocity is null, but the flag wants to include it. unset the flag. PhysicsDescriptionFlag ^= PhysicsDescriptionFlag.Velocity; } writer.Write((uint)PhysicsDescriptionFlag); writer.Write((uint)PhysicsState); if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Movement) != 0) { if (currentMotionState != null) { var movementData = currentMotionState.GetPayload(wo.Guid, wo.Sequences); writer.Write(movementData.Length); // number of bytes in movement object writer.Write(movementData); uint autonomous = currentMotionState.IsAutonomous ? (ushort)1 : (ushort)0; writer.Write(autonomous); } else // create a new current motion state and send it. { currentMotionState = new UniversalMotion(MotionStance.Standing); var movementData = currentMotionState.GetPayload(wo.Guid, wo.Sequences); writer.Write(movementData.Length); writer.Write(movementData); uint autonomous = currentMotionState.IsAutonomous ? (ushort)1 : (ushort)0; writer.Write(autonomous); } } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.AnimationFrame) != 0) { writer.Write((uint)AnimationFrame); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Position) != 0) { Position.Serialize(writer); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.MTable) != 0) { writer.Write((uint)MTableResourceId); } // stable_id = BYTE1(v12) & 8 ) = 8 if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Stable) != 0) { writer.Write((uint)Stable); } // setup id if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Petable) != 0) { writer.Write((uint)Petable); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.CSetup) != 0) { writer.Write((uint)CSetup); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Children) != 0) { writer.Write((uint)ItemsEquipedCount); foreach (EquippedItem child in children) { writer.Write((uint)child.Guid); writer.Write((uint)child.EquipMask); } } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.ObjScale) != 0) { writer.Write(ObjScale); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Friction) != 0) { writer.Write(Friction); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Elasticity) != 0) { writer.Write(Elastcity); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Translucency) != 0) { writer.Write(Translucency); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Velocity) != 0) { Velocity.Serialize(writer); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Acceleration) != 0) { Acceleration.Serialize(writer); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.Omega) != 0) { Omega.Serialize(writer); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.DefaultScript) != 0) { writer.Write((uint)DefaultScript); } if ((PhysicsDescriptionFlag & PhysicsDescriptionFlag.DefaultScriptIntensity) != 0) { writer.Write((float)DefaultScriptIntensity); } // TODO: There are 9 of these - but we need to research the correct sequence. I know that the last one is instance (totalLogins) Og II writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectPosition)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectMovement)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectState)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectVector)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectTeleport)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectServerControl)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectForcePosition)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectVisualDesc)); writer.Write(sequences.GetCurrentSequence(SequenceType.ObjectInstance)); writer.Align(); }