/// <summary> /// </summary> /// <param name="buffer"> /// </param> /// <returns> /// </returns> public static List <StatelData> ParseStatels(byte[] buffer) { List <StatelData> statels = new List <StatelData>(500); MemoryStream ms = new MemoryStream(buffer); BinaryReader br = new BinaryReader(ms); int count = br.ReadInt32(); while (count > 0) { int bufLen = br.ReadInt32(); byte[] buf2 = br.ReadBytes(bufLen); MemoryStream ms2 = new MemoryStream(buf2); StatelData sd = StatelDataExtractor.ReadFromStream(ms2); ms2.Close(); if (sd.Events.Count == 0) { // Getting the events from the template item if no events are provided in the RDB record if (ItemLoader.ItemList.ContainsKey(sd.TemplateId)) { ItemTemplate template = ItemLoader.ItemList[sd.TemplateId]; if (template.Events.Count > 0) { sd.Events = template.Events; } } } statels.Add(sd); count--; } return(statels); }
public static void SpawnEmptyVendorFromTemplate(StatelData statelData, IPlayfield playfield, int instance) { Identity pfIdentity = new Identity() { Type = IdentityType.Playfield, Instance = statelData.PlayfieldId }; Identity freeIdentity = new Identity() { Type = IdentityType.VendingMachine, Instance = Pool.Instance.GetFreeInstance <Vendor>( 0x70000000, IdentityType.VendingMachine) }; Vendor v = new Vendor(pfIdentity, freeIdentity, statelData.TemplateId); v.OriginalIdentity = statelData.Identity; v.RawCoordinates = new Vector3(statelData.X, statelData.Y, statelData.Z); v.Heading = new Quaternion( statelData.HeadingX, statelData.HeadingY, statelData.HeadingZ, statelData.HeadingW); v.Playfield = playfield; }
public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { Vendor v = Pool.Instance.GetObject <Vendor>(character.Playfield.Identity, target); if (v != null) { int pfid = character.Playfield.Identity.Instance; StatelData sd = PlayfieldLoader.PFData[pfid].Statels.FirstOrDefault(x => x.Identity.Equals(v.OriginalIdentity)); if (sd != null) { int instance = (((sd.Identity.Instance) >> 16) & 0xff | (character.Playfield.Identity.Instance << 16)); DBVendor dbv = new DBVendor(); dbv.Id = instance; dbv.Playfield = pfid; dbv.X = sd.X; dbv.Y = sd.Y; dbv.Z = sd.Z; dbv.HeadingX = sd.HeadingX; dbv.HeadingY = sd.HeadingY; dbv.HeadingZ = sd.HeadingZ; dbv.HeadingW = sd.HeadingW; dbv.Name = "New shop, please fill me"; dbv.TemplateId = sd.TemplateId; dbv.Hash = ""; VendorDao.Instance.Delete(dbv.Id); VendorDao.Instance.Add(dbv, dontUseId: false); } } }
public override bool Execute( INamedEntity self, IEntity caller, IInstancedEntity target, MessagePackObject[] arguments) { ICharacter character = (ICharacter)self; int statelId = (int)((uint)0xC0000000 | arguments[1].AsInt32() | (arguments[2].AsInt32() << 16)); character.Stats[StatIds.externaldoorinstance].BaseValue = 0; character.Stats[StatIds.externalplayfieldinstance].BaseValue = 0; if (arguments[1].AsInt32() > 0) { StatelData sd = PlayfieldLoader.PFData[arguments[1].AsInt32()].GetDoor(statelId); if (sd == null) { throw new Exception( "Statel " + arguments[3].AsInt32().ToString("X") + " not found? Check the rdb dammit"); } Vector3 v = new Vector3(sd.X, sd.Y, sd.Z); Quaternion q = new Quaternion(sd.HeadingX, sd.HeadingY, sd.HeadingZ, sd.HeadingW); Quaternion.Normalize(q); Vector3 n = (Vector3)q.RotateVector3(Vector3.AxisZ); v.x += n.x * 2.5; v.z += n.z * 2.5; character.Playfield.Teleport( (Dynel)character, new Coordinate(v), q, new Identity() { Type = (IdentityType)arguments[0].AsInt32(), Instance = arguments[1].AsInt32() }); } return(true); self.Stats[StatIds.externalplayfieldinstance].Value = 0; self.Stats[StatIds.externaldoorinstance].Value = 0; self.Playfield.Teleport( (Dynel)self, new Coordinate(100, 10, 100), ((ICharacter)self).Heading, new Identity() { Type = (IdentityType)arguments[0].AsInt32(), Instance = arguments[1].AsInt32() }); return(true); }
public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { if ((character.Stats[StatIds.externaldoorinstance].Value == 0) || (character.Stats[StatIds.externalplayfieldinstance].Value == 0)) { ChatTextMessageHandler.Default.Create(character, "Please enter a proxyfied playfield first."); } Coordinate tempCoordinate = character.Coordinates(); PlayfieldData pfData = PlayfieldLoader.PFData[character.Playfield.Identity.Instance]; StatelData o = null; foreach (StatelData s in pfData.Statels) { if (o == null) { o = s; } else { if (Coordinate.Distance2D(tempCoordinate, s.Coord()) < Coordinate.Distance2D(tempCoordinate, o.Coord())) { o = s; } } } if (o == null) { ChatTextMessageHandler.Default.Create( character, "No statel on this playfield... Very odd, where exactly are you???"); } else { DBTeleport tel = new DBTeleport(); tel.playfield = character.Stats[StatIds.externalplayfieldinstance].Value; tel.statelType = 0xc748; // Door only for now tel.statelInstance = character.Stats[StatIds.externaldoorinstance].BaseValue; tel.destinationPlayfield = o.PlayfieldId; tel.destinationType = (int)o.Identity.Type; tel.destinationInstance = BitConverter.ToUInt32(BitConverter.GetBytes(o.Identity.Instance), 0); var temp = TeleportDao.Instance.GetWhere(new { tel.playfield, tel.statelType, tel.statelInstance }); foreach (var t in temp) { TeleportDao.Instance.Delete(t.Id); } TeleportDao.Instance.Add(tel); character.Playfield.Publish( ChatTextMessageHandler.Default.CreateIM(character, "Proxy saved")); } }
public bool UseStatel(Identity identity, EventType eventType = EventType.OnUse) { if (PlayfieldLoader.PFData.ContainsKey(this.Character.Playfield.Identity.Instance)) { StatelData sd = PlayfieldLoader.PFData[this.Character.Playfield.Identity.Instance].Statels.FirstOrDefault( x => (x.Identity.Type == identity.Type) && (x.Identity.Instance == identity.Instance)); if (sd != null) { this.SendChatText("Found Statel with " + sd.Events.Count + " events"); Event onUse = sd.Events.FirstOrDefault(x => x.EventType == eventType); if (onUse != null) { onUse.Perform(this.Character, sd); } } } return(true); }
public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { uint upfId = character.Stats[StatIds.externalplayfieldinstance].BaseValue; uint udoor = character.Stats[StatIds.externaldoorinstance].BaseValue; int pfId = (int)upfId; int door = BitConverter.ToInt32(BitConverter.GetBytes(udoor), 0); StatelData sd = PlayfieldLoader.PFData[pfId].GetDoor(door); if (sd == null) { LogUtil.Debug(DebugInfoDetail.Error, "No statel found"); return; } character.Playfield.Teleport( (Dynel)character, new Coordinate(sd.X, sd.Y, sd.Z), character.Heading, new Identity() { Type = IdentityType.Playfield, Instance = pfId }); }
public override bool Execute( INamedEntity self, IEntity caller, IInstancedEntity target, MessagePackObject[] arguments) { uint externalDoorInstance = self.Stats[StatIds.externaldoorinstance].BaseValue; int externalPlayfieldId = self.Stats[StatIds.externalplayfieldinstance].Value; StatelData door = PlayfieldLoader.PFData[externalPlayfieldId].Statels.FirstOrDefault( x => (uint)x.Identity.Instance == externalDoorInstance && (x.Identity.Type == IdentityType.Door /*|| x.Identity.Type==IdentityType.MissionEntrance*/)); if (door != null) { Vector3 v = new Vector3(door.X, door.Y, door.Z); Quaternion q = new Quaternion(door.HeadingX, door.HeadingY, door.HeadingZ, door.HeadingW); Quaternion.Normalize(q); Vector3 n = (Vector3)q.RotateVector3(Vector3.AxisZ); v.x += n.x * 2.5; v.z += n.z * 2.5; self.Playfield.Teleport( (Dynel)self, new Coordinate(v), q, new Identity() { Type = IdentityType.Playfield, Instance = externalPlayfieldId }); } return(door != null); }
/// <summary> /// </summary> /// <param name="stream"> /// </param> /// <returns> /// </returns> public static StatelData ReadFromStream(Stream stream) { StatelData statel = new StatelData(); FlatIdentity fi = new FlatIdentity(); fi.ReadFromStream(stream); statel.Identity = fi.Id; // Skip 4, is always 1? stream.ReadByte(); stream.ReadByte(); stream.ReadByte(); stream.ReadByte(); PFCoordHeading pfc = new PFCoordHeading(); pfc.ReadFromStream(stream); statel.X = pfc.Coordinate.X; statel.Y = pfc.Coordinate.Y; statel.Z = pfc.Coordinate.Z; statel.HeadingX = pfc.Heading.X; statel.HeadingY = pfc.Heading.Y; statel.HeadingZ = pfc.Heading.Z; statel.HeadingW = pfc.Heading.W; statel.PlayfieldId = pfc.PlayfieldIdentity; BinaryReader br = new BinaryReader(stream); br.ReadInt32(); statel.TemplateId = br.ReadInt32(); int len2 = br.ReadInt32(); byte[] HighLow = br.ReadBytes(len2); MemoryStream ms = new MemoryStream(HighLow); BinaryReader br2 = new BinaryReader(ms); br2.ReadBytes(8); int C1 = IPAddress.NetworkToHostOrder(br2.ReadInt32()); Debug.Assert(C1 % 0x3f1 == 0, "Wrong 3f1 encountered... stop please"); int evcount = IPAddress.NetworkToHostOrder(br2.ReadInt32()); while (evcount > 0) { int dataType = IPAddress.NetworkToHostOrder(br2.ReadInt32()); switch (dataType) { case 2: HLFlatEvent flatEvent = new HLFlatEvent(); flatEvent.ReadFromStream(ms); statel.Events.Add(flatEvent.ToEvents()); break; default: // Console.WriteLine("DataType " + dataType + " found... stop please"); break; } evcount--; } return(statel); }
/// <summary> /// </summary> /// <param name="fname"> /// </param> /// <returns> /// </returns> public static int CacheAllPlayfieldData(string fname) { PFData = new Dictionary <int, PlayfieldData>(); MessagePackZip.UncompressData <PlayfieldData>(fname).ForEach(x => PFData.Add(x.PlayfieldId, x)); Console.WriteLine("Tweaking in some Statel functions"); // Now lets do some tweaking foreach (PlayfieldData pfd in PFData.Values) { foreach (StatelData sd in pfd.Statels) { bool foundproxyteleport = false; int playfieldid = 0; int doorinstance = 0; foreach (Event ev in sd.Events) { foreach (Function f in ev.Functions) { if (f.FunctionType == (int)FunctionType.TeleportProxy) { foundproxyteleport = true; playfieldid = f.Arguments.Values[1].AsInt32(); doorinstance = (int) ((uint)0xC0000000 | f.Arguments.Values[1].AsInt32() | (f.Arguments.Values[2].AsInt32() << 16)); DBTeleport teleporter = TeleportDao.Instance.GetWhere(new { statelInstance = (uint)sd.Identity.Instance }) .FirstOrDefault(); if (teleporter != null) { doorinstance = (int)teleporter.destinationInstance; f.Arguments.Values[2] = new MessagePackObject(((doorinstance >> 16) & 0xff)); } break; } if (f.FunctionType == (int)FunctionType.TeleportProxy2) { playfieldid = f.Arguments.Values[1].AsInt32(); doorinstance = (int) ((uint)0xC0000000 | f.Arguments.Values[1].AsInt32() | (f.Arguments.Values[2].AsInt32() << 16)); DBTeleport teleporter = TeleportDao.Instance.GetWhere(new { statelInstance = (uint)sd.Identity.Instance }) .FirstOrDefault(); if (teleporter != null) { doorinstance = (int)teleporter.destinationInstance; f.Arguments.Values[2] = new MessagePackObject(((doorinstance >> 16) & 0xff)); } } } if (foundproxyteleport) { break; } } if (ItemLoader.ItemList.ContainsKey(sd.TemplateId)) { if (ItemLoader.ItemList[sd.TemplateId].WantsCollision() && !ItemLoader.ItemList[sd.TemplateId].StatelCollisionDisabled() && (sd.Events.All(x => x.EventType != EventType.OnCollide)) && sd.Events.Any(x => x.EventType == EventType.OnUse)) { Event ev = sd.Events.First(x => x.EventType == EventType.OnUse).Copy(); ev.EventType = EventType.OnCollide; sd.Events.Add(ev); } } if (foundproxyteleport) { if (PFData.ContainsKey(playfieldid)) { StatelData internalDoor = PFData[playfieldid].GetDoor(doorinstance); if (internalDoor != null) { if (internalDoor.Events.All(x => x.EventType != EventType.OnEnter)) { Event ev = new Event(); ev.EventType = EventType.OnEnter; ev.Functions.Add( new Function() { FunctionType = (int)FunctionType.ExitProxyPlayfield }); internalDoor.Events.Add(ev); } } } } } } return(PFData.Count); }
/// <summary> /// </summary> /// <param name="character"> /// </param> /// <param name="target"> /// </param> /// <param name="args"> /// </param> public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { List <MessageBody> replies = new List <MessageBody>(); string reply = "Looking up for statel in playfield " + character.Playfield.Identity.Instance; replies.Add(ChatTextMessageHandler.Default.Create(character, reply)); StatelData o = null; StaticDynel o2 = null; Vendor o3 = null; Coordinate tempCoordinate = character.Coordinates(); if (!PlayfieldLoader.PFData.ContainsKey(character.Playfield.Identity.Instance)) { reply = "Could not find data for playfield " + character.Playfield.Identity.Instance; replies.Add(ChatTextMessageHandler.Default.Create(character, reply)); } else { if (target.Equals(Identity.None)) { PlayfieldData pfData = PlayfieldLoader.PFData[character.Playfield.Identity.Instance]; foreach (StatelData s in pfData.Statels) { if (o == null) { o = s; } else { if (Coordinate.Distance2D(tempCoordinate, s.Coord()) < Coordinate.Distance2D(tempCoordinate, o.Coord())) { o = s; } } } foreach (StaticDynel sd in Pool.Instance.GetAll <StaticDynel>(character.Playfield.Identity)) { if (o2 == null) { o2 = sd; } else { if (Coordinate.Distance2D(tempCoordinate, sd.Coordinate) < Coordinate.Distance2D(tempCoordinate, o2.Coordinate)) { o2 = sd; } } } } else { o = PlayfieldLoader.PFData[character.Playfield.Identity.Instance].Statels.FirstOrDefault( x => x.Identity == target); o2 = Pool.Instance.GetAll <StaticDynel>(character.Playfield.Identity) .FirstOrDefault(x => x.Identity == target); o3 = Pool.Instance.GetAll <Vendor>(character.Playfield.Identity) .FirstOrDefault(x => x.Identity == target); } if ((o == null) && (o2 == null) && (o3 == null)) { replies.Add( ChatTextMessageHandler.Default.Create( character, "No statel/static dynel on this playfield... Very odd, where exactly are you???")); } else { if (o3 != null) { replies.Add( ChatTextMessageHandler.Default.Create( character, o3.Identity.Type.ToString() + " " + ((int)o3.Identity.Type).ToString("X8") + ":" + o3.Identity.Instance.ToString("X8"))); replies.Add( ChatTextMessageHandler.Default.Create(character, "Item Template Id: " + o3.Template.ID)); foreach (Event se in o3.Events) { replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString())); } } else if (((o != null) && (o2 == null)) || ((o != null) && (Coordinate.Distance2D(tempCoordinate, o.Coord()) < Coordinate.Distance2D(tempCoordinate, o2.Coordinate)))) { replies.Add( ChatTextMessageHandler.Default.Create( character, o.Identity.Type.ToString() + " " + ((int)o.Identity.Type).ToString("X8") + ":" + o.Identity.Instance.ToString("X8"))); replies.Add( ChatTextMessageHandler.Default.Create(character, "Item Template Id: " + o.TemplateId)); foreach (Event se in o.Events) { replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString())); } } else { replies.Add(ChatTextMessageHandler.Default.Create(character, o2.Identity.ToString() + " " + o2.Identity.ToString())); replies.Add(ChatTextMessageHandler.Default.Create(character, "Item template Id: " + o2.Stats[(int)StatIds.acgitemtemplateid].ToString())); foreach (Event se in o2.Events) { replies.Add(ChatTextMessageHandler.Default.Create(character, se.ToString())); } } } } character.Playfield.Publish(Bulk.CreateIM(character.Controller.Client, replies.ToArray())); }
/// <summary> /// </summary> /// <param name="message"> /// </param> /// <param name="client"> /// </param> /// <exception cref="NullReferenceException"> /// </exception> public static void Read(GenericCmdMessage message, ZoneClient client) { switch (message.Action) { case GenericCmdAction.Get: break; case GenericCmdAction.Drop: break; case GenericCmdAction.Use: if (message.Target.Type == IdentityType.Inventory) { Item item = null; try { item = client.Character.BaseInventory.GetItemInContainer( (int)message.Target.Type, message.Target.Instance); } catch (Exception) { } if (item == null) { throw new NullReferenceException( "No item found at " + message.Target.Type + "/" + message.Target.Instance); } TemplateAction.Send(client, item, (int)message.Target.Type, message.Target.Instance); if (ItemLoader.ItemList[item.HighID].IsConsumable()) { item.MultipleCount--; if (item.MultipleCount == 0) { client.Character.BaseInventory.RemoveItem( (int)message.Target.Type, message.Target.Instance); DeleteItem.Send(client, (int)message.Target.Type, message.Target.Instance); } } item.PerformAction(client.Character, EventType.OnUse, message.Target.Instance); Reply(message, client); } else { string s = "Generic Command received:\r\nAction: " + message.Action.ToString() + "(" + ((int)message.Action).ToString() + ")\r\nTarget: " + message.Target.Type + " " + ((int)message.Target.Type).ToString("X8") + ":" + message.Target.Instance.ToString("X8"); if (PlayfieldLoader.PFData.ContainsKey(client.Character.Playfield.Identity.Instance)) { StatelData sd = PlayfieldLoader.PFData[client.Playfield.Identity.Instance].Statels.FirstOrDefault( x => (x.StatelIdentity.Type == message.Target.Type) && (x.StatelIdentity.Instance == message.Target.Instance)); if (sd != null) { s = s + "\r\nFound Statel with " + sd.Events.Count + " events"; Events onUse = sd.Events.FirstOrDefault(x => x.EventType == (int)EventType.OnUse); if (onUse != null) { onUse.Perform(client.Character, client.Character); } } } client.Character.Send(new ChatTextMessage() { Identity = client.Character.Identity, Text = s }); } break; } }
/// <summary> /// </summary> /// <param name="character"> /// </param> /// <param name="target"> /// </param> /// <param name="args"> /// </param> public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { List <MessageBody> replies = new List <MessageBody>(); string reply = "Looking up for statel in playfield " + character.Playfield.Identity.Instance; replies.Add(ChatText.Create(character, reply)); StatelData o = null; if (!PlayfieldLoader.PFData.ContainsKey(character.Playfield.Identity.Instance)) { reply = "Could not find data for playfield " + character.Playfield.Identity.Instance; replies.Add(ChatText.Create(character, reply)); } else { PlayfieldData pfData = PlayfieldLoader.PFData[character.Playfield.Identity.Instance]; foreach (StatelData s in pfData.Statels) { if (o == null) { o = s; } else { if (Coordinate.Distance2D(character.Coordinates, s.Coord()) < Coordinate.Distance2D(character.Coordinates, o.Coord())) { o = s; } } } if (o == null) { replies.Add( ChatText.Create(character, "No statel on this playfield... Very odd, where exactly are you???")); } else { replies.Add( ChatText.Create( character, o.StatelIdentity.Type.ToString() + " " + ((int)o.StatelIdentity.Type).ToString("X8") + ":" + o.StatelIdentity.Instance.ToString("X8"))); replies.Add(ChatText.Create(character, "Item Template Id: " + o.TemplateId)); foreach (Events se in o.Events) { replies.Add( ChatText.Create( character, "Event: " + se.EventType.ToString() + " # of Functions: " + se.Functions.Count.ToString())); foreach (Functions sf in se.Functions) { string Fargs = string.Empty; foreach (MessagePackObject obj in sf.Arguments.Values) { if (Fargs.Length > 0) { Fargs = Fargs + ", "; } Fargs = Fargs + obj.ToString(); } replies.Add( ChatText.Create( character, " Fn: " + ((FunctionType)sf.FunctionType).ToString() + "(" + sf.FunctionType.ToString() + "), # of Args: " + sf.Arguments.Values.Count.ToString())); replies.Add(ChatText.Create(character, " Args: " + Fargs)); foreach (Requirements sfr in sf.Requirements) { string req; req = "Attr: " + sfr.Statnumber.ToString() + " Value: " + sfr.Value.ToString() + " Target: " + sfr.Target.ToString() + " Op: " + sfr.Operator.ToString(); replies.Add(ChatText.Create(character, req)); } } } } } character.Playfield.Publish(Bulk.CreateIM(character.Client, replies.ToArray())); }
public override void ExecuteCommand(ICharacter character, Identity target, string[] args) { var proxies = TeleportDao.Instance.GetAll(); List <StatelData> statels = new List <StatelData>(); Function lastFound = null; foreach (PlayfieldData pf in PlayfieldLoader.PFData.Values) { bool isProxy = false; foreach (StatelData sd in pf.Statels) { lastFound = null; isProxy = false; if (sd.Events.Count > 0) { foreach (Event e in sd.Events) { foreach (Function f in e.Functions) { if (f.FunctionType == (int)FunctionType.TeleportProxy) { isProxy = true; lastFound = f; if (f.Arguments.Values[1].AsInt32() < 0) { lastFound = null; isProxy = false; } break; } } if (isProxy) { break; } } } if (isProxy) { if ( !proxies.Any( x => (x.statelType == (int)sd.Identity.Type) && (x.statelInstance == (uint)sd.Identity.Instance) && (x.playfield == sd.PlayfieldId))) { PlayfieldData dest = PlayfieldLoader.PFData[lastFound.Arguments.Values[1].AsInt32()]; if (dest.Statels.Count(x => x.Identity.Type == IdentityType.Door) == 1) { StatelData sddest = dest.Statels.First(x => x.Identity.Type == IdentityType.Door); DBTeleport tel = new DBTeleport(); tel.playfield = sd.PlayfieldId; tel.statelType = 0xc748; // Door only for now tel.statelInstance = (uint)sd.Identity.Instance; tel.destinationPlayfield = sddest.PlayfieldId; tel.destinationType = (int)sddest.Identity.Type; tel.destinationInstance = BitConverter.ToUInt32(BitConverter.GetBytes(sddest.Identity.Instance), 0); var temp = TeleportDao.Instance.GetWhere(new { tel.playfield, tel.statelType, tel.statelInstance }); foreach (var t in temp) { TeleportDao.Instance.Delete(t.Id); } TeleportDao.Instance.Add(tel); isProxy = false; } } } if (isProxy) { // Check against proxies already found if ( !proxies.Any( x => (x.statelType == (int)sd.Identity.Type) && (x.statelInstance == (uint)sd.Identity.Instance) && (x.playfield == sd.PlayfieldId))) { PlayfieldData dest = PlayfieldLoader.PFData[lastFound.Arguments.Values[1].AsInt32()]; StatelData door1 = null; if (dest.Statels.Count(x => x.Identity.Type == IdentityType.Door) > 0) { door1 = dest.Statels.First(x => x.Identity.Type == IdentityType.Door); LogUtil.Debug(DebugInfoDetail.Error, sd.PlayfieldId + " " + sd.Identity.ToString(true)); character.Stats[StatIds.externaldoorinstance].BaseValue = (uint)sd.Identity.Instance; character.Stats[StatIds.externalplayfieldinstance].BaseValue = (uint)sd.PlayfieldId; character.Playfield.Teleport( (Dynel)character, new Coordinate(door1.X, door1.Y + 1.0f, door1.Z), character.Heading, new Identity() { Type = (IdentityType)lastFound.Arguments.Values[0].AsInt32(), Instance = door1.PlayfieldId }); return; } LogUtil.Debug(DebugInfoDetail.Error, sd.PlayfieldId + " " + sd.Identity.ToString(true)); character.Stats[StatIds.externaldoorinstance].BaseValue = 0; character.Stats[StatIds.externalplayfieldinstance].BaseValue = 0; character.Playfield.Teleport( (Dynel)character, new Coordinate(sd.X, sd.Y, sd.Z), character.Heading, new Identity() { Type = IdentityType.Playfield, Instance = sd.PlayfieldId }); return; } } } } }