/// <summary> /// The parse function set. /// </summary> /// <param name="retlist"> /// The retlist. /// </param> private void ParseFunctionSet(List <AOEvents> retlist) { int eventNum = this.br.ReadInt32(); int num = this.br.Read3F1(); List <AOFunctions> list = new List <AOFunctions>(); int arg_2F_0 = 0; bool R; int num2 = num - 1; int num3 = arg_2F_0; while (true) { int arg_1C3_0 = num3; int num4 = num2; if (arg_1C3_0 > num4) { break; } AOFunctions func = new AOFunctions(); func.FunctionType = this.br.ReadInt32(); this.br.Skip(8); int num5 = this.br.ReadInt32(); // Reqs bool flag = num5 > 0; if (flag) { foreach (AORequirements ur in this.ReadReqs(num5)) { func.Requirements.Add(ur); } } func.TickCount = this.br.ReadInt32(); func.TickInterval = (uint)this.br.ReadInt32(); func.Target = this.br.ReadInt32(); this.br.Skip(4); R = false; foreach (object oo in this.ParseArgs(func.FunctionType, ref R)) { func.Arguments.Values.Add(oo); } list.Add(func); num3++; } AOEvents aoe = new AOEvents(); aoe.EventType = eventNum; foreach (AOFunctions ff in list) { aoe.Functions.Add(ff); } retlist.Add(aoe); }
/// <summary> /// /// </summary> /// <param name="MsgCategory"></param> /// <param name="MsgNum"></param> /// <returns></returns> /// #region Add Core Timer public void AddCoreTimer(int strain, DateTime time, AOFunctions aof) { AOTimers newCoretimer = new AOTimers(); newCoretimer.Function = aof; newCoretimer.Timestamp = time; newCoretimer.Strain = strain; this.CoreTimers.Add(newCoretimer); }
public AOFunctions CreateKnuBotFunction(int knubotAction) { AOFunctions aof = new AOFunctions(); aof.Arguments.Values.Add(knubotAction); aof.TickCount = 1; aof.TickInterval = 0; aof.FunctionType = this.FunctionNumber; return(aof); }
public AOFunctions CreateKnuBotFunction(int knubotAction) { AOFunctions aof = new AOFunctions(); aof.Arguments.Values.Add(knubotAction); aof.TickCount = 1; aof.TickInterval = 0; aof.FunctionType = 2; // KnuBotActionTimer aof.Target = this.Parent.Id; return(aof); }
public void Teleport(int x, int z, int y, int pf, uint delay) { AOFunctions aof = new AOFunctions(); aof.Target = this.TalkingTo.Id; aof.TickCount = 0; aof.TickInterval = 1; aof.FunctionType = Constants.FunctiontypeTeleport; aof.Arguments.Values.Add(x); aof.Arguments.Values.Add(y); aof.Arguments.Values.Add(z); aof.Arguments.Values.Add(pf); this.TalkingTo.AddTimer(20001, DateTime.Now + TimeSpan.FromMilliseconds(delay), aof, false); }
/// <summary> /// The parse shop hash. /// </summary> /// <param name="events"> /// The events. /// </param> private void ParseShopHash(List <AOEvents> events) { int eventNum = this.br.ReadInt32(); int num = this.br.Read3F1(); int arg_2D_0 = 1; int num2 = num; int num3 = arg_2D_0; AOEvents aoe = new AOEvents(); aoe.EventType = eventNum; checked { while (true) { int arg_151_0 = num3; int num4 = num2; if (arg_151_0 > num4) { break; } string text = this.br.ReadString(4); int num5 = this.br.ReadByte(); int num6 = this.br.ReadByte(); bool flag = num5 == 0 && num6 == 0; if (flag) { num5 = this.br.ReadInt16(); num6 = this.br.ReadInt16(); } int count = Math.Min(11, this.br.Buffer.Length - this.br.Ptr); this.br.Skip(count); AOFunctions aof = new AOFunctions(); aof.Arguments.Values.Add(text); aof.Arguments.Values.Add(num5); aof.Arguments.Values.Add(num6); aof.Target = 255; aof.TickCount = 1; aof.TickInterval = 0; aof.FunctionType = Constants.FunctiontypeShophash; aoe.Functions.Add(aof); num3++; } } events.Add(aoe); }
public override void CalcTrickle() { if ((this.Parent is Character) || (this.Parent is NonPlayerCharacterClass)) { Character character = (Character)this.Parent; // calculating Nano and Heal Delta and interval int healinterval = 29 - Math.Min(character.Stats.Stamina.Value / 30, 27); character.Stats.HealInterval.StatBaseValue = (uint)healinterval; // Healinterval character.PurgeTimer(0); AOFunctions aof = new AOFunctions(); character.AddTimer(0, DateTime.Now + TimeSpan.FromSeconds(healinterval * 1000), aof, true); int sitBonusInterval = 0; int healDelta = character.Stats.HealDelta.Value; if (character.MoveMode == MoveModes.Sit) { sitBonusInterval = 1000; int healDelta2 = healDelta >> 1; healDelta = healDelta + healDelta2; } character.PurgeTimer(0); AOTimers at = new AOTimers(); at.Strain = 0; at.Timestamp = DateTime.Now + TimeSpan.FromMilliseconds(character.Stats.HealInterval.Value * 1000 - sitBonusInterval); at.Function.Target = this.Parent.Id; // changed from ItemHandler.itemtarget_self; at.Function.TickCount = -2; at.Function.TickInterval = (uint)(character.Stats.HealInterval.Value * 1000 - sitBonusInterval); at.Function.FunctionType = Constants.FunctiontypeHit; at.Function.Arguments.Values.Add(27); at.Function.Arguments.Values.Add(healDelta); at.Function.Arguments.Values.Add(healDelta); at.Function.Arguments.Values.Add(0); character.Timers.Add(at); if (!this.Parent.Starting) { this.AffectStats(); } } }
/// <summary> /// Add a new Timer /// </summary> /// <param name="strain">Strain number</param> /// <param name="time">Time to spark AOFunction aof</param> /// <param name="aof">The function the timer triggers</param> public void AddTimer(int strain, DateTime time, ref AOFunctions aof) { AOTimers newtimer = new AOTimers(); newtimer.Function = aof; newtimer.Timestamp = time; newtimer.Strain = strain; lock (Timers) { Timers.Add(newtimer); } }
public void ApplyFunction(AOFunctions aof) { Program.FunctionC.CallFunction(aof.FunctionType, this, this, this, aof.Arguments.ToArray()); }
public bool CheckRequirements(Character ch, AOFunctions aof, bool checkAll) { Character reqtarget = null; bool requirementsMet = true; int childOperator = -1; // Starting value bool foundCharRelated = (aof.FunctionType == Constants.FunctiontypeHairMesh) || (aof.FunctionType == Constants.FunctiontypeBackMesh) || (aof.FunctionType == Constants.FunctiontypeTexture) || (aof.FunctionType == Constants.FunctiontypeAttractorMesh) || (aof.FunctionType == Constants.FunctiontypeCatMesh) || (aof.FunctionType == Constants.FunctiontypeChangeBodyMesh) || (aof.FunctionType == Constants.functiontype_shouldermesh) || (aof.FunctionType == Constants.FunctiontypeHeadMesh); foreach (AORequirements aor in aof.Requirements) { switch (aor.Target) { case Constants.ItemtargetUser: { reqtarget = ch; break; } case Constants.ItemtargetWearer: { reqtarget = ch; break; } case Constants.ItemtargetTarget: { // TODO: pass on target break; } case Constants.ItemtargetFightingtarget: { reqtarget = ch.FightingCharacter(); break; } case Constants.ItemtargetSelectedtarget: { reqtarget = ch.TargetCharacter(); break; } case Constants.ItemtargetSelf: { reqtarget = ch; break; } default: { reqtarget = null; break; } } if (reqtarget == null) { return false; // Target not found, cant check reqs -> FALSE } int statval = reqtarget.stats.StatValueByName(aor.Statnumber); bool reqresult = true; switch (aor.Operator) { case Constants.OperatorAnd: { reqresult = ((statval & aor.Value) != 0); break; } case Constants.OperatorOr: { reqresult = ((statval | aor.Value) != 0); break; } case Constants.OperatorEqualTo: { reqresult = (statval == aor.Value); break; } case Constants.OperatorLessThan: { reqresult = (statval < aor.Value); break; } case Constants.OperatorGreaterThan: { reqresult = (statval > aor.Value); break; } case Constants.OperatorUnequal: { reqresult = (statval != aor.Value); break; } case Constants.OperatorTrue: { reqresult = true; break; } case Constants.OperatorFalse: { reqresult = false; break; } case Constants.OperatorBitAnd: { reqresult = ((statval & aor.Value) != 0); break; } case Constants.OperatorBitOr: { reqresult = ((statval | aor.Value) != 0); break; } default: { // TRUE for now reqresult = true; break; } } switch (childOperator) { case Constants.OperatorAnd: { requirementsMet &= reqresult; break; } case Constants.OperatorOr: { requirementsMet &= reqresult; break; } case -1: { requirementsMet = reqresult; break; } default: break; } childOperator = aor.ChildOperator; } if (!checkAll) { if (foundCharRelated) { requirementsMet &= foundCharRelated; } else { requirementsMet = true; } } return requirementsMet; }
/// <summary> /// Add a new Timer /// </summary> /// <param name="strain">Strain number</param> /// <param name="time">Time to spark AOFunction aof</param> /// <param name="aof">The function the timer triggers</param> /// <param name="dolocalstats">process local stats?</param> public void AddTimer(int strain, DateTime time, AOFunctions aof, bool dolocalstats) { AOTimers newtimer = new AOTimers(); newtimer.Function = aof.ShallowCopy(); newtimer.Function.dolocalstats = dolocalstats; newtimer.Timestamp = time; newtimer.Strain = strain; lock (this.timers) { this.timers.Add(newtimer); } }
public static bool func_do(Character ch, AOFunctions func, bool dolocalstats, bool tosocialtab, int placement, bool doreqs) { int c; int r; Character chartarget = (Character)Misc.FindDynel.FindDynelByID(ch.Target.Type, ch.Target.Instance); Boolean reqs_met; Character ftarget = null; int statval; Boolean reqresult; if (ch != null) { for (c = 0; c < func.TickCount; c++) { reqs_met = true; int childop = -1; if (!doreqs) { for (r = 0; r < func.Requirements.Count; r++) { switch (func.Requirements[r].Target) { case itemtarget_user: ftarget = ch; break; case itemtarget_wearer: ftarget = ch; break; case itemtarget_target: ftarget = chartarget; break; case itemtarget_fightingtarget: // Fighting target break; case itemtarget_self: ftarget = ch; break; case itemtarget_selectedtarget: ftarget = chartarget; break; } if (ftarget == null) { reqs_met = false; return false; } statval = ftarget.Stats.Get(func.Requirements[r].Statnumber); switch (func.Requirements[r].Operator) { case operator_and: reqresult = ((statval & func.Requirements[r].Value) != 0); break; case operator_or: reqresult = ((statval | func.Requirements[r].Value) != 0); break; case operator_equalto: reqresult = (statval == func.Requirements[r].Value); break; case operator_lessthan: reqresult = (statval < func.Requirements[r].Value); break; case operator_greaterthan: reqresult = (statval > func.Requirements[r].Value); break; case operator_unequal: reqresult = (statval != func.Requirements[r].Value); break; case operator_true: reqresult = (statval != 0); break; case operator_false: reqresult = (statval == 0); break; case operator_bitand: reqresult = ((statval & func.Requirements[r].Value) != 0); break; case operator_bitor: reqresult = ((statval | func.Requirements[r].Value) != 0); break; default: reqresult = true; break; } switch (childop) { case operator_and: reqs_met &= reqresult; break; case operator_or: reqs_met |= reqresult; break; case -1: reqs_met = reqresult; break; default: break; } childop = func.Requirements[r].ChildOperator; } } if (!reqs_met) { return reqs_met; } switch (func.FunctionType) { // Set new Texture case ItemHandler.functiontype_texture: SqlWrapper ms = new SqlWrapper(); if (!tosocialtab) { ms.SqlUpdate("Update " + ch.getSQLTablefromDynelType() + " set Textures" + func.Arguments[1].ToString() + "=" + func.Arguments[0].ToString() + " WHERE ID=" + ch.ID.ToString()); AOTextures ao = new AOTextures((int)func.Arguments[1], (int)func.Arguments[0]); ch.Textures.Add(ao); } else { int texnum = Int32.Parse(func.Arguments[1].ToString()); int texval = Int32.Parse(func.Arguments[0].ToString()); if (ch.SocialTab.ContainsKey(texnum)) { ch.SocialTab[texnum] = texval; } else { ch.SocialTab.Add(texnum, texval); } ch.SaveSocialTab(); } break; // Set Headmesh case ItemHandler.functiontype_headmesh: if (!tosocialtab) { ch.Stats.HeadMesh.StatModifier = (Int32)((Int32)func.Arguments[1] - ch.Stats.HeadMesh.StatBaseValue); // Headmesh ch.MeshLayer.AddMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], 0); } else { if (ch.SocialTab.ContainsKey(ch.Stats.HeadMesh.StatNumber)) { ch.SocialTab[ch.Stats.HeadMesh.StatNumber] = (Int32)func.Arguments[0]; ch.SocialMeshLayer.AddMesh(0, (Int32)func.Arguments[0], (Int32)func.Arguments[1], 0); } else { ch.SocialTab.Add(ch.Stats.HeadMesh.StatNumber, (Int32)func.Arguments[0]); ch.SocialMeshLayer.AddMesh(0, (Int32)func.Arguments[0], (Int32)func.Arguments[1], 0); } ch.SaveSocialTab(); } break; // Set Shouldermesh case ItemHandler.functiontype_shouldermesh: if ((placement == 19) || (placement == 51)) { if (!tosocialtab) { ch.Stats.ShoulderMeshRight.Set((Int32)func.Arguments[1]); ch.Stats.ShoulderMeshLeft.Set((Int32)func.Arguments[1]); ch.MeshLayer.AddMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); ch.MeshLayer.AddMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.AddMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); ch.SocialMeshLayer.AddMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } } else { if (!tosocialtab) { if (placement == 20) { ch.Stats.ShoulderMeshLeft.Set((Int32)func.Arguments[1]); ch.MeshLayer.AddMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } if (placement == 22) { ch.Stats.ShoulderMeshLeft.Set((Int32)func.Arguments[1]); ch.MeshLayer.AddMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } } else { if (placement == 52) { ch.Stats.ShoulderMeshRight.Set((Int32)func.Arguments[1]); ch.SocialMeshLayer.AddMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } if (placement == 54) { ch.Stats.ShoulderMeshLeft.Set((Int32)func.Arguments[1]); ch.SocialMeshLayer.AddMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } } } break; // Set Backmesh case ItemHandler.functiontype_backmesh: if (!tosocialtab) { ch.Stats.BackMesh.Set((Int32)func.Arguments[0]); // Shouldermesh ch.MeshLayer.AddMesh(5, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.AddMesh(5, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } break; // Set Hairmesh case ItemHandler.functiontype_hairmesh: if (!tosocialtab) { ch.Stats.HairMesh.Set((Int32)func.Arguments[0]); // HairMesh ch.MeshLayer.AddMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.AddMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } break; case ItemHandler.functiontype_attractormesh: if (!tosocialtab) { ch.Stats.HairMesh.Set((Int32)func.Arguments[0]); // HairMesh ch.MeshLayer.AddMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.AddMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } break; case ItemHandler.functiontype_modify: // TODO: req check for OE if (dolocalstats) { if (!tosocialtab) { ch.Stats.SetModifier((Int32)func.Arguments[0], ch.Stats.GetModifier((Int32)func.Arguments[0]) + (Int32)func.Arguments[1]); } } break; case ItemHandler.functiontype_modifypercentage: // TODO: req check for OE if (dolocalstats) { if (!tosocialtab) { ch.Stats.SetPercentageModifier((Int32)func.Arguments[0], ch.Stats.GetPercentageModifier((Int32)func.Arguments[0]) + (Int32)func.Arguments[1]); } } break; case ItemHandler.functiontype_uploadnano: ch.UploadNano((Int32)func.Arguments[0]); Packets.UploadNanoupdate.Send(ch, 53019, (Int32)func.Arguments[0]); break; case ItemHandler.functiontype_shophash: // Do nothing, it's covered in break; default: break; } } } return false; }
public static bool func_do(Character ch, AOFunctions func, bool dolocalstats, bool tosocialtab, int placement) { return func_do(ch, func, dolocalstats, tosocialtab, placement, true); }
public static bool func_revert(Character ch, AOFunctions func, bool fromsocialtab, int placement) { int c; if (ch != null) { for (c = 0; c < func.TickCount; c++) { switch (func.FunctionType) { case ItemHandler.functiontype_texture: // Todo: check for second Arm item SqlWrapper ms = new SqlWrapper(); if (!fromsocialtab) { ms.SqlUpdate("Update " + ch.getSQLTablefromDynelType() + " set Textures" + func.Arguments[1].ToString() + "=0 WHERE ID=" + ch.ID.ToString() + " AND Textures" + func.Arguments[1].ToString() + "=" + func.Arguments[0].ToString()); int ct = ch.Textures.Count - 1; while (ct >= 0) { if (ch.Textures[ct].place == (int)func.Arguments[1]) { ch.Textures.RemoveAt(ct); break; } ct--; } } else { if (ch.SocialTab.ContainsKey((Int32)func.Arguments[1])) { ch.SocialTab[(Int32)func.Arguments[1]] = 0; } else { ch.SocialTab.Add((Int32)func.Arguments[1], 0); } } break; case ItemHandler.functiontype_headmesh: if (!fromsocialtab) { ch.Stats.HeadMesh.StatModifier = 0; ch.MeshLayer.RemoveMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.RemoveMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } // Reverting the Head modification break; case ItemHandler.functiontype_shouldermesh: // TODO: check for second shoulder item if (!fromsocialtab) { if (placement == 19) { ch.MeshLayer.RemoveMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); ch.MeshLayer.RemoveMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } if (placement == 20) // Right { ch.Stats.ShoulderMeshRight.Set(0); // Shouldermesh Right ch.MeshLayer.RemoveMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } if (placement == 22) // Left { ch.Stats.ShoulderMeshLeft.Set(0); // Shouldermesh Left ch.MeshLayer.RemoveMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } } else { if (placement == 52) // Right { ch.SocialMeshLayer.RemoveMesh(3, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } if (placement == 54) // Left { ch.SocialMeshLayer.RemoveMesh(4, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } } break; case ItemHandler.functiontype_backmesh: if (!fromsocialtab) { ch.Stats.BackMesh.Set(0); // Backmesh ch.MeshLayer.RemoveMesh(5, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { ch.SocialMeshLayer.RemoveMesh(5, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } break; case ItemHandler.functiontype_attractormesh: if (!fromsocialtab) { ch.Stats.HairMesh.Set(0); // Attractormesh ch.MeshLayer.RemoveMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } else { if (ch.SocialTab.ContainsKey(32)) { ch.SocialTab[32] = 0; } else { ch.SocialTab.Add(32, 0); } ch.SocialMeshLayer.RemoveMesh(0, (Int32)func.Arguments[1], (Int32)func.Arguments[0], Misc.MeshLayers.GetLayer(placement)); } break; default: break; } } } return false; }