private MessageDataFiller DynelFiller(StaticDynel dynel) { return(x => { try { x.Coordinate = new Vector3(dynel.Coordinate.x, dynel.Coordinate.y, dynel.Coordinate.z); x.Heading = new Quaternion() { X = dynel.Heading.X, Y = dynel.Heading.Y, Z = dynel.Heading.Z, W = dynel.Heading.W }; x.Identity = dynel.Identity; x.Owner = Identity.None; x.Playfield = dynel.Parent.Instance; x.Unknown1 = new Identity() { Type = (IdentityType)1000015, Instance = 0 }; x.Unknown2 = 0; x.Unknown3 = 111; x.MsgVersion = 0xb; x.Unknown = 0; List <GameTuple <CharacterStat, UInt32> > temp = new List <GameTuple <CharacterStat, uint> >(); foreach (KeyValuePair <int, int> stat in dynel.Stats) { temp.Add( new GameTuple <CharacterStat, uint>() { Value1 = (CharacterStat)stat.Key, Value2 = (uint)stat.Value }); } x.Stats = temp.ToArray(); x.Name = ""; } catch (Exception e) { LogUtil.Debug(DebugInfoDetail.Error, e.Message + e.StackTrace); } }); }
private void LoadStaticDynels(Identity playfieldIdentity) { IEnumerable <DBStaticDynel> dynels = StaticDynelDao.Instance.GetWhere(new { Playfield = playfieldIdentity.Instance }); foreach (DBStaticDynel sd in dynels) { List <GameTuple <CharacterStat, uint> > tempStats = MessagePackZip.DeserializeData <GameTuple <CharacterStat, uint> >(sd.stats.ToArray()); if (tempStats.Any(x => x.Value1 == (CharacterStat)StatIds.acgitemtemplateid)) { int id = (int)tempStats.First(x => x.Value1 == (CharacterStat)StatIds.acgitemtemplateid).Value2; StaticDynel sdy = new StaticDynel( this.Identity, new Identity() { Type = (IdentityType)sd.Type, Instance = sd.Instance }, ItemLoader.ItemList[id]); foreach (GameTuple <CharacterStat, uint> stat in tempStats) { if (sdy.Stats.ContainsKey((int)stat.Value1)) { sdy.Stats[(int)stat.Value1] = (int)stat.Value2; continue; } sdy.Stats.Add((int)stat.Value1, (int)stat.Value2); } sdy.Coordinate = new Coordinate(sd.X, sd.Y, sd.Z); sdy.Heading = new Quaternion() { X = sd.HeadingX, Y = sd.HeadingY, Z = sd.HeadingZ, W = sd.HeadingW }; } } }
/// <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> protected override void Read(GenericCmdMessage message, IZoneClient client) { switch (message.Action) { case GenericCmdAction.Get: break; case GenericCmdAction.Drop: break; case GenericCmdAction.Use: if (message.Target[0].Type == IdentityType.Inventory) { client.Controller.UseItem(message.Target[0]); // Acknowledge action this.Acknowledge(client.Controller.Character, message); } else { if (Pool.Instance.Contains(message.Target[0])) { // TODO: Call OnUse of the targets controller // Static dynels first IEventHolder temp = null; try { temp = Pool.Instance.GetObject <IEventHolder>( client.Controller.Character.Playfield.Identity, message.Target[0]); } catch (Exception) { } if (temp != null) { var entity = temp as IEntity; if (entity != null) { Event ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnUse); if (ev != null) { ev.Perform(client.Controller.Character, entity); this.Acknowledge(client.Controller.Character, message); } else { ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnTrade); if (ev != null) { ev.Perform(client.Controller.Character, entity); TemporaryBag tempBag = new TemporaryBag( client.Controller.Character.Identity, new Identity() { Type = IdentityType.TempBag, Instance = Pool.Instance.GetFreeInstance <TemporaryBag>( 0, IdentityType.TempBag) }, client.Controller.Character.Identity, message.Target[0]); client.Controller.Character.ShoppingBag = tempBag; TradeMessageHandler.Default.Send(client.Controller.Character, tempBag); this.Acknowledge(client.Controller.Character, message); } } } } } else { // Use statel (doors, grid terminals etc) #if DEBUG string s = string.Format( "Generic Command received:\r\nAction: {0} ({1}){2}Target: {3} {4}", message.Action, (int)message.Action, Environment.NewLine, message.Target[0].Type, message.Target[0].ToString(true)); ChatTextMessageHandler.Default.Send(client.Controller.Character, s); #endif client.Controller.UseStatel(message.Target[0]); } } break; case GenericCmdAction.UseItemOnItem: IItem item = Pool.Instance.GetObject <IInventoryPage>( new Identity() { Type = (IdentityType)client.Controller.Character.Identity.Instance, Instance = (int)message.Target[0].Type })[message.Target[0].Instance]; client.Controller.Character.Stats[StatIds.secondaryitemtemplate].Value = item.LowID; //client.Controller.Character.Stats[StatIds.secondaryitemtype] if (Pool.Instance.Contains(message.Target[1])) { StaticDynel temp = Pool.Instance.GetObject <StaticDynel>( client.Controller.Character.Playfield.Identity, message.Target[1]); if (temp != null) { Event ev = temp.Events.FirstOrDefault(x => x.EventType == EventType.OnUseItemOn); if (ev != null) { ev.Perform(client.Controller.Character, temp); } } } else { client.Controller.UseStatel(message.Target[1], EventType.OnUseItemOn); } break; } }
public void Send(ICharacter character, StaticDynel dynel) { this.Send(character, this.DynelFiller(dynel)); }