Exemple #1
0
        /// <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);
        }
Exemple #2
0
        /// <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);
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        /// <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();
                }
            }
        }
Exemple #8
0
 /// <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);
     }
 }
Exemple #9
0
        /// <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);
        }
Exemple #10
0
 public void ApplyFunction(AOFunctions aof)
 {
     Program.FunctionC.CallFunction(aof.FunctionType, this, this, this, aof.Arguments.ToArray());
 }
Exemple #11
0
        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;
        }
Exemple #12
0
 /// <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;
            }