public MapObjectDeferred(Texture2D texture, MapObject parent) : base(new Position3D(parent.Position.X, parent.Position.Y, (int)parent.Z)) { _texture = texture; Vertices = getVerticesFromBuffer(); SortZ = parent.SortZ; SortThreshold = parent.SortThreshold; SortTiebreaker = parent.SortTiebreaker; }
static void onTargetingButton(MapObject worldObject) { if (worldObject == null) return; // If isTargeting is true, then the target cursor is active and we are waiting for the player to target something. // If not, then we are just clicking the mouse and we need to find out if something is under the mouse cursor. switch (_TargettingType) { case TargetTypes.Object: // Select Object _world.PickType = PickTypes.PickStatics | PickTypes.PickObjects; mouseTargetingEventObject(worldObject); break; case TargetTypes.Position: // Select X, Y, Z _world.PickType = PickTypes.PickStatics | PickTypes.PickObjects; mouseTargetingEventObject(worldObject); // mouseTargetingEventXYZ(mouseOverObject); break; case TargetTypes.MultiPlacement: // select X, Y, Z mouseTargetingEventXYZ(worldObject); break; default: throw new Exception("Unknown targetting type!"); } }
static void onInteractButton(InputEventM e) { MapObject overObject = (e.EventType == MouseEvent.DragBegin) ? _dragObject : _world.MouseOverObject; Vector2 overObjectOffset = (e.EventType == MouseEvent.DragBegin) ? _dragOffset : _world.MouseOverObjectPoint; if (e.EventType == MouseEvent.Down) { _dragObject = overObject; _dragOffset = overObjectOffset; } if (overObject == null) return; if (isTargeting && e.EventType == MouseEvent.Click) { // Special case: targeting onTargetingButton(overObject); } else if (_ui.Cursor.IsHolding && e.EventType == MouseEvent.Up) { // Special case: if we're holding anything, drop it. checkDropItem(); } else { // standard interaction actions ... if (overObject is MapObjectGround) { // we can't interact with ground tiles. } else if (overObject is MapObjectStatic) { // clicking a static should pop up the name of the static. if (e.EventType == MouseEvent.Click) { } } else if (overObject is MapObjectItem) { Item entity = (Item)overObject.OwnerEntity; // single click = tool tip // double click = use / open // click and drag = pick up switch (e.EventType) { case MouseEvent.Click: // tool tip Interaction.SingleClick(entity); break; case MouseEvent.DoubleClick: Interaction.DoubleClick(entity); break; case MouseEvent.DragBegin: Interaction.PickUpItem(entity, (int)overObjectOffset.X, (int)overObjectOffset.Y); break; } } else if (overObject is MapObjectMobile) { Mobile entity = (Mobile)overObject.OwnerEntity; // single click = tool tip; if npc = request context sensitive menu // double click = set last target; if is human open paper doll; if ridable ride; if self and riding, dismount; // click and drag = pull off status bar switch (e.EventType) { case MouseEvent.Click: // tool tip Interaction.SingleClick(entity); if (ClientVars.EngineVars.WarMode) UltimaClient.Send(new AttackRequestPacket(entity.Serial)); else UltimaClient.Send(new RequestContextMenuPacket(entity.Serial)); break; case MouseEvent.DoubleClick: Interaction.DoubleClick(entity); ClientVars.EngineVars.LastTarget = entity.Serial; break; case MouseEvent.DragBegin: // pull off status bar break; } } else if (overObject is MapObjectCorpse) { Corpse entity = (Corpse)overObject.OwnerEntity; // click and drag = nothing // single click = tool tip // double click = open loot window. } else if (overObject is MapObjectText) { // clicking on text should somehow indicate the person speaking. } else { throw new Exception("Unknown object type in onInteractButtonDown()"); } } e.Handled = true; }
static void mouseTargetingEventXYZ(MapObject selectedObject) { // Send the targetting event back to the server! int modelNumber = 0; Type type = selectedObject.GetType(); if (type == typeof(MapObjectStatic)) { modelNumber = selectedObject.ItemID; } else { modelNumber = 0; } // Send the target ... UltimaClient.Send(new TargetXYZPacket((short)selectedObject.Position.X, (short)selectedObject.Position.Y, (short)selectedObject.Z, (ushort)modelNumber)); // ... and clear our targeting cursor. clearTargeting(); }
static void mouseTargetingEventObject(MapObject selectedObject) { // If we are passed a null object, keep targeting. if (selectedObject == null) return; Serial serial = selectedObject.OwnerSerial; // Send the targetting event back to the server if (serial.IsValid) { UltimaClient.Send(new TargetObjectPacket(serial)); } else { int modelNumber = 0; Type type = selectedObject.GetType(); if (type == typeof(MapObjectStatic)) { modelNumber = selectedObject.ItemID; } else { modelNumber = 0; } UltimaClient.Send(new TargetXYZPacket((short)selectedObject.Position.X, (short)selectedObject.Position.Y, (short)selectedObject.Z, (ushort)modelNumber)); } // Clear our target cursor. clearTargeting(); }
static void createHoverLabel(MapObject mapObject) { if (mapObject.OwnerSerial.IsValid) { // this object is an entity of some kind. createHoverLabel(mapObject.OwnerSerial); } else if (mapObject is MapObjectStatic) { // since statics have no entity object, we can't easily create a label for them at the moment. // surely this will be fixed. } }
public void AddMapObject(MapObject[] items) { for (int i = 0; i < items.Length; i++) { AddMapObject(items[i]); } }
public void AddMapObject(MapObject item) { m_Objects.Add(item); _NeedsSorting = true; if (item is MapObjectDeferred) _HasDeferredObjects = true; }
private bool matchNames(MapObject m1, MapObject m2) { if (Data.TileData.ItemData[m1.ItemID & 0x3FFF].Name == Data.TileData.ItemData[m2.ItemID & 0x3FFF].Name) { return true; } return false; }
// Check if under a roof. public void IsUnder(int originZ, out MapObject underItem, out MapObject underTerrain) { underItem = null; underTerrain = null; List<MapObject> iObjects = this.Items; for (int i = iObjects.Count - 1; i >= 0; i--) { if (iObjects[i].Z <= originZ) continue; if (iObjects[i] is MapObjectStatic) { Data.ItemData iData = Data.TileData.ItemData[((MapObjectStatic)iObjects[i]).ItemID & 0x3FFF]; if (iData.Roof || iData.Surface || iData.Wall) { if (underItem == null || iObjects[i].Z < underItem.Z) underItem = iObjects[i]; } } else if (iObjects[i] is MapObjectGround && iObjects[i].Z >= originZ + 20) { underTerrain = iObjects[i]; } } }