예제 #1
0
        /// <summary>
        /// </summary>
        /// <param name="message">
        /// </param>
        /// <param name="client">
        /// </param>
        public static void Read(OrgClientMessage message, ZoneClient client)
        {
            switch ((byte)message.Command)
            {
            case 1:
            {
                // org create

                /* client wants to create organization
                 * name of org is message.CommandArgs
                 */

                if (OrganizationDao.CreateOrganization(
                        message.CommandArgs,
                        DateTime.UtcNow,
                        client.Character.Identity.Instance))
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(client.Character, "You have created the guild: " + message.CommandArgs));

                    int orgID = OrganizationDao.GetOrganizationId(message.CommandArgs);

                    // Make sure the order of these next two lines is not swapped -NV
                    client.Character.Stats[StatIds.clanlevel].Value = 0;
                    client.Character.Stats[StatIds.clan].Value      = orgID;
                    break;
                }
                else
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(client.Character, "This guild already <font color=#DC143C>exists</font>"));
                    break;
                }
            }

            case 2:

                // org ranks
                // Displays Org Rank Structure.
                /* Select governingform from DB, Roll through display from GovForm */
                if (client.Character.Stats[StatIds.clan].BaseValue == 0)
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(client.Character, "You're not in an organization!"));
                    break;
                }

                int governingForm =
                    OrganizationDao.GetGovernmentForm((int)client.Character.Stats[StatIds.clan].BaseValue);

                client.Character.Playfield.Publish(
                    ChatText.CreateIM(client.Character, "Current Rank Structure: " + GetRankList(governingForm)));
                break;

            case 3:

                // org contract
                break;

            case 4:
                Console.WriteLine("Case 4 Started");
                break;

            case 5:
            {
                IInstancedEntity tPlayer = null;
                if ((tPlayer = client.Playfield.FindByIdentity(message.Target)) != null)
                {
                    string orgDescription = string.Empty,
                           orgObjective = string.Empty,
                           orgHistory = string.Empty,
                           orgLeaderName = string.Empty;
                    int orgGoverningForm = 0, orgLeaderID = 0;

                    DBOrganization orgData =
                        OrganizationDao.GetOrganizationData((int)tPlayer.Stats[StatIds.clan].BaseValue);

                    if (orgData != null)
                    {
                        orgDescription   = orgData.Description;
                        orgObjective     = orgData.Objective;
                        orgHistory       = orgData.History;
                        orgGoverningForm = orgData.GovernmentForm;
                        orgLeaderID      = orgData.LeaderID;
                    }

                    orgLeaderName = CharacterDao.GetCharacterNameById(orgLeaderID);

                    string textGovForm = null;
                    if (orgGoverningForm == 0)
                    {
                        textGovForm = "Department";
                    }
                    else if (orgGoverningForm == 1)
                    {
                        textGovForm = "Faction";
                    }
                    else if (orgGoverningForm == 2)
                    {
                        textGovForm = "Republic";
                    }
                    else if (orgGoverningForm == 3)
                    {
                        textGovForm = "Monarchy";
                    }
                    else if (orgGoverningForm == 4)
                    {
                        textGovForm = "Anarchism";
                    }
                    else if (orgGoverningForm == 5)
                    {
                        textGovForm = "Feudalism";
                    }
                    else
                    {
                        textGovForm = "Department";
                    }

                    string orgRank = GetRank(orgGoverningForm, tPlayer.Stats[StatIds.clanlevel].BaseValue);

                    var infoMessage = new OrgInfoMessage
                    {
                        Identity     = tPlayer.Identity,
                        Unknown      = 0x00,
                        Unknown1     = 0x00000000,
                        Unknown2     = 0x00000000,
                        Organization =
                            new Identity
                        {
                            Type     = IdentityType.Organization,
                            Instance =
                                (int)
                                tPlayer.Stats[StatIds.clan]
                                .BaseValue
                        },

                        // TODO: Possible NULL here
                        OrganizationName =
                            (tPlayer as Character).OrganizationName,
                        Description   = orgDescription,
                        Objective     = orgObjective,
                        GoverningForm = textGovForm,
                        LeaderName    = orgLeaderName,
                        Rank          = orgRank,
                        Unknown3      = new object[0]
                    };

                    client.SendCompressed(infoMessage);
                }
            }

            break;

            case 6:

                // Add Org Bank to prez
                DBOrganization orgDisband =
                    OrganizationDao.GetOrganizationData((int)client.Character.Stats[StatIds.clan].BaseValue);
                client.Character.Stats[StatIds.cash].BaseValue += (uint)orgDisband.Bank;

                // Clear stat 5 (Clan) from all chars where value=orgId
                StatDao.DisbandOrganization((int)client.Character.Stats[StatIds.clan].BaseValue);
                break;

            case 7:

                // org startvote <"text"> <duration(minutes)> <entries>
                // arguments (<text> <duration> and <entries>) are in CmdStr
                break;

            case 8:

                // org vote info
                break;

            case 9:

                // <entry> is CmdStr
                break;

            case 10:
            {
                // some arg in CmdByte. No idea what it is

                // create the target namespace t_promote
                Character toPromote     = null;
                int       targetOldRank = -1;
                int       targetNewRank;
                toPromote = client.Playfield.FindByIdentity <Character>(message.Target);
                if (toPromote != null)
                {
                    // First we check if target is in the same org as you
                    if (toPromote.Stats[StatIds.clan].BaseValue != client.Character.Stats[StatIds.clan].BaseValue)
                    {
                        // not in same org

                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(client.Character, "Target is not in your organization!"));
                        break;
                    }

                    // Target is in same org, are you eligible to promote?  Promoter Rank has to be TargetRank-2 or == 0
                    if ((client.Character.Stats[StatIds.clanlevel].Value
                         == (toPromote.Stats[StatIds.clanlevel].Value - 2)) ||
                        (client.Character.Stats[StatIds.clanlevel].Value == 0))
                    {
                        // Promoter is eligible. Start the process

                        // First we get the details about the org itself
                        DBOrganization orgPromote =
                            OrganizationDao.GetOrganizationData((int)client.Character.Stats[StatIds.clan].BaseValue);

                        int    promoteGovForm = -1;
                        string promotedToRank = string.Empty;

                        if (orgPromote != null)
                        {
                            // Check if new rank == 0, if so, demote promoter
                            if ((targetOldRank - 1) == 0)
                            {
                                /* This is a bit more complex.  Here we need to promote new president first
                                 * then we go about demoting old president
                                 * finally we set the new leader in Sql
                                 * Reset OrgName to set changes
                                 */

                                OrganizationDao.SetNewPrez(orgPromote.ID, toPromote.Identity.Instance);
                                toPromote.Stats[StatIds.clanlevel].Value        = 0;
                                client.Character.Stats[StatIds.clanlevel].Value = 1;

                                client.Character.Playfield.Publish(
                                    ChatText.CreateIM(
                                        client.Character,
                                        "You've passed leadership of the organization to: "
                                        + (toPromote as Character).Name));
                                client.Character.Playfield.Publish(
                                    ChatText.CreateIM(
                                        toPromote,
                                        "You've been promoted to the rank of " + promotedToRank + " by "
                                        + client.Character.Name));
                            }
                            else
                            {
                                // Just Promote
                                targetOldRank  = toPromote.Stats[StatIds.clanlevel].Value;
                                targetNewRank  = targetOldRank - 1;
                                promotedToRank = GetRank(promoteGovForm, (uint)targetNewRank);
                                toPromote.Stats[StatIds.clanlevel].Value = targetNewRank;
                                client.Character.Playfield.Publish(
                                    ChatText.CreateIM(
                                        client.Character,
                                        "You've promoted " + (toPromote as Character).Name + " to " + promotedToRank));
                                client.Character.Playfield.Publish(
                                    ChatText.CreateIM(
                                        toPromote,
                                        "You've been promoted to the rank of " + promotedToRank + " by "
                                        + client.Character.Name));
                            }
                        }
                        else
                        {
                            client.Character.Playfield.Publish(
                                ChatText.CreateIM(client.Character, "Organization does not exist?"));
                        }
                    }
                    else
                    {
                        // Promoter not eligible to promote
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(
                                client.Character,
                                "Your Rank is not high enough to promote " + (toPromote as Character).Name));
                    }
                }

                break;
            }

            case 11:

                // demote target player
                // create the target namespace t_demote
                Character toDemote        = null;
                int       targetCurRank   = -1;
                int       targetNewerRank = -1;
                toDemote = client.Character.Playfield.FindByIdentity <Character>(message.Target);
                if (toDemote != null)
                {
                    // First we check if target is in the same org as you
                    if (toDemote.Stats[StatIds.clan].BaseValue != client.Character.Stats[StatIds.clan].BaseValue)
                    {
                        // not in same org
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(client.Character, "Target is not in your organization!"));
                        break;
                    }

                    // Target is in same org, are you eligible to demote?  Promoter Rank has to be TargetRank-2 or == 0
                    if ((client.Character.Stats[StatIds.clanlevel].Value
                         <= (toDemote.Stats[StatIds.clanlevel].Value - 2)) ||
                        (client.Character.Stats[StatIds.clanlevel].Value == 0))
                    {
                        // Promoter is eligible. Start the process

                        // First we get the details about the org itself
                        DBOrganization orgDemote =
                            OrganizationDao.GetOrganizationData((int)client.Character.Stats[StatIds.clan].BaseValue);
                        int    demoteGovForm = -1;
                        string demotedToRank = string.Empty;
                        if (orgDemote == null)
                        {
                            client.Character.Playfield.Publish(
                                ChatText.CreateIM(client.Character, "Organization does not exist?"));
                            break;
                        }

                        // Check whether new rank would be lower than lowest for current govform
                        if ((targetCurRank + 1) > GetLowestRank(orgDemote.GovernmentForm))
                        {
                            client.Character.Playfield.Publish(
                                ChatText.CreateIM(client.Character, "You can't demote character any lower!"));
                            break;
                        }

                        targetCurRank   = toDemote.Stats[StatIds.clanlevel].Value;
                        targetNewerRank = targetCurRank + 1;
                        demotedToRank   = GetRank(demoteGovForm, (uint)targetNewerRank);
                        toDemote.Stats[StatIds.clanlevel].Value = targetNewerRank;
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(
                                client.Character,
                                "You've demoted " + (toDemote as Character).Name + " to " + demotedToRank));
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(
                                toDemote,
                                "You've been demoted to the rank of " + demotedToRank + " by "
                                + client.Character.Name));
                        break;
                    }
                    else
                    {
                        // Promoter not eligible to promote
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(
                                client.Character,
                                "Your Rank is not high enough to demote " + (toDemote as Character).Name));
                        break;
                    }
                }

                break;

            case 12:
                Console.WriteLine("Case 12 Started");
                break;

            case 13:

                // kick <name> from org
                // <name> is CmdStr

                // create the t_player Client namespace, using CmdStr to find character id, in replacement of target.Instance
                uint        kickedFrom = client.Character.Stats[StatIds.clan].BaseValue;
                DBCharacter kickChar   = CharacterDao.GetByCharName(message.CommandArgs);
                if (kickChar == null)
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(
                            client.Character,
                            "No character with name " + message.CommandArgs + " exists."));
                    break;
                }

                int kickeeId = kickChar.Id;

                Character targetPlayer =
                    client.Playfield.FindByIdentity <Character>(
                        new Identity()
                {
                    Type = IdentityType.CanbeAffected, Instance = kickeeId
                });

                if (targetPlayer != null)
                {
                    // Check if CmdStr is actually part of the org

                    uint kickeeOrgId = targetPlayer.Stats[StatIds.clan].BaseValue;
                    if (kickeeOrgId != client.Character.Stats[StatIds.clan].BaseValue)
                    {
                        // Not part of Org. break out.
                        client.Character.Playfield.Publish(
                            ChatText.CreateIM(
                                client.Character,
                                message.CommandArgs + "is not a member of your organization!"));
                        break;
                    }

                    // They are part of the org, so begin the processing...
                    // First we check if the player is online...
                    int onlineStatus = OnlineDao.IsOnline(client.Character.Identity.Instance).Online;

                    if (onlineStatus == 0)
                    {
                        // Player isn't online. Org Kicks are processed in a different method
                        // TODO: Offline Org KICK
                        // StatDao.SetStat(targetPlayer.Identity, )
                        break;
                    }

                    // Player is online. Start the kick.
                    string kickedFromName = targetPlayer.OrganizationName;
                    targetPlayer[StatIds.clanlevel].Value = 0;
                    targetPlayer[StatIds.clan].Value      = 0;

                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(
                            targetPlayer,
                            "You've been kicked from the organization " + kickedFromName));
                }

                // TODO: Offline Org KICK
                break;

            case 14:
            {
                Character tPlayer = client.Playfield.FindByIdentity <Character>(message.Target);
                if (tPlayer != null)
                {
                    var inviteMessage = new OrgInviteMessage
                    {
                        Identity     = tPlayer.Identity,
                        Unknown      = 0x00,
                        Unknown1     = 0x00000000,
                        Unknown2     = 0x00000000,
                        Organization =
                            new Identity
                        {
                            Type     = IdentityType.Organization,
                            Instance =
                                (int)
                                client.Character.Stats[
                                    (int)StatIds.clan].Value
                        },
                        OrganizationName = client.Character.OrganizationName,
                        Unknown3         = 0x00000000
                    };

                    tPlayer.Client.SendCompressed(inviteMessage);
                }
            }

            break;



            case 15:
            {
                // target.Instance holds the OrgID of the Org wishing to be joined.
                int orgIdtoJoin = message.Target.Instance;
                int gov_form    = OrganizationDao.GetGovernmentForm(orgIdtoJoin);

                // Make sure the order of these next two lines is not swapped -NV
                client.Character.Stats[StatIds.clanlevel].Value = GetLowestRank(gov_form);
                client.Character.Stats[StatIds.clan].Value      = orgIdtoJoin;
            }

            break;



                #region /org leave

            case 16:

                // org leave
                // TODO: Disband org if it was leader that left org. -Suiv-
                // I don't think a Disband happens if leader leaves. I don't think leader -can- leave without passing lead to another
                // Something worth testing on Testlive perhaps ~Chaz
                // Just because something happens on TL, doesnt mean its a good idea. Really tbh id prefer it if you had to explicitly type /org disband to disband rather than /org leave doing it... -NV
                // Agreeing with NV.  Org Leader can't leave without passing lead on.  org disband requires /org disband to specifically be issued, with a Yes/No box.

                int govern_form = OrganizationDao.GetGovernmentForm(client.Character.Stats[StatIds.clan].Value);

                if ((client.Character.Stats[StatIds.clanlevel].Value == 0) && (govern_form != 4))
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(
                            client.Character,
                            "Organization Leader cannot leave organization without Disbanding or Passing Leadership!"));
                }
                else
                {
                    int    oldOrgId = client.Character.Stats[StatIds.clan].Value;
                    string orgName  = OrganizationDao.GetOrganizationData(oldOrgId).Name;
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(client.Character, "You left the organization " + orgName + "."));
                }

                break;

                #endregion

                #region /org tax | /org tax <tax>

            case 17:

                // gets or sets org tax
                // <tax> is CmdStr
                // if no <tax>, then just send chat text with current tax info
                if (message.CommandArgs == null)
                {
                    client.Character.Playfield.Publish(
                        ChatText.CreateIM(client.Character, "The current organization tax rate is: "));
                    break;
                }
                else
                {
                    break;
                }

                #endregion

                #region /org bank

            case 18:
            {
                /*
                 *      // org bank
                 *      dt = ms.ReadDatatable("SELECT * FROM organizations WHERE ID=" + client.Character.OrgId);
                 *      if (dt.Rows.Count > 0)
                 *      {
                 *          var bank_credits = (UInt64)dt.Rows[0]["Bank"];
                 *          client.SendChatText("Your bank has " + bank_credits + " credits in its account");
                 *      }
                 */
            }

            break;

                #endregion

                #region /org bank add <cash>

            case 19:
            {
                /*
                 *      if (client.Character.OrgId == 0)
                 *      {
                 *          client.SendChatText("You are not in an organisation.");
                 *
                 *          break;
                 *      }
                 *
                 *      // org bank add <cash>
                 *      var minuscredits_fromplayer = Convert.ToInt32(message.CommandArgs);
                 *      var characters_credits = client.Character.Stats.Cash.Value;
                 *
                 *      if (characters_credits < minuscredits_fromplayer)
                 *      {
                 *          client.SendChatText("You do not have enough Credits");
                 *      }
                 *      else
                 *      {
                 *          var total_Creditsspent = characters_credits - minuscredits_fromplayer;
                 *          client.Character.Stats.Cash.Set(total_Creditsspent);
                 *
                 *          ms.SqlUpdate(
                 *              "UPDATE `organizations` SET `Bank` = `Bank` + " + minuscredits_fromplayer
                 + " WHERE `ID` = " + client.Character.OrgId);
                 +          client.SendChatText("You have donated " + minuscredits_fromplayer + " to the organization");
                 +      }*/
            }

            break;

                #endregion

                #region /org bank remove <cash>

            case 20:

                /*
                 * // org bank remove <cash>
                 * // <cash> is CmdStr
                 * // player wants to take credits from org bank
                 * // only leader can do that
                 * if ((client.Character.Stats.ClanLevel.Value != 0) || (client.Character.OrgId == 0))
                 * {
                 *  client.SendChatText("You're not the leader of an Organization");
                 *  break;
                 * }
                 *
                 * var removeCredits = Convert.ToInt32(message.CommandArgs);
                 * long orgBank = 0;
                 * dt = ms.ReadDatatable("SELECT Bank FROM organizations WHERE ID = " + client.Character.OrgId);
                 * if (dt.Rows.Count > 0)
                 * {
                 *  orgBank = (Int64)dt.Rows[0][0];
                 * }
                 *
                 * if (removeCredits > orgBank)
                 * {
                 *  client.SendChatText("Not enough credits in Organization Bank!");
                 *  break;
                 * }
                 * else
                 * {
                 *  var neworgbank = orgBank - removeCredits;
                 *  var existingcreds = 0;
                 *  existingcreds = client.Character.Stats.Cash.Value;
                 *  var newcreds = existingcreds + removeCredits;
                 *  ms.SqlUpdate(
                 *      "UPDATE organizations SET Bank = " + neworgbank + " WHERE ID = " + client.Character.OrgId);
                 *  client.Character.Stats.Cash.Set(newcreds);
                 *  client.SendChatText("You've removed " + removeCredits + " credits from the organization bank");
                 * }
                 */
                break;

                #endregion

                #region /org bank paymembers <cash>

            case 21:

                // <cash> is CmdStr
                // give <cash> credits to every org member
                // credits are taken from org bank
                // only leader can do it
                break;

                #endregion

                #region /org debt

            case 22:

                // send player text about how big is his/her tax debt to org
                break;

                #endregion

                #region /org history <text>

            case 23:
            {
                /*
                 *      if (client.Character.Stats.ClanLevel.Value == 0)
                 *      {
                 *          // org history <history text>
                 *          ms.SqlUpdate(
                 *              "UPDATE organizations SET history = '" + message.CommandArgs + "' WHERE ID = '"
                 + client.Character.OrgId + "'");
                 +          client.SendChatText("History Updated");
                 +      }
                 +      else
                 +      {
                 +          client.SendChatText("You must be the Organization Leader to perform this command!");
                 +      }*/
            }

            break;

                #endregion

                #region /org objective <text>

            case 24:
            {
                /*
                 *      if (client.Character.Stats.ClanLevel.Value == 0)
                 *      {
                 *          // org objective <objective text>
                 *          ms.SqlUpdate(
                 *              "UPDATE organizations SET objective = '" + message.CommandArgs + "' WHERE ID = '"
                 + client.Character.OrgId + "'");
                 +          client.SendChatText("Objective Updated");
                 +      }
                 +      else
                 +      {
                 +          client.SendChatText("You must be the Organization Leader to perform this command!");
                 +      }*/
            }

            break;

                #endregion

                #region /org description <text>

            case 25:
            {
                /*
                 *      if (client.Character.Stats.ClanLevel.Value == 0)
                 *      {
                 *          // org description <description text>
                 *          ms.SqlUpdate(
                 *              "UPDATE organizations SET description = '" + message.CommandArgs + "' WHERE ID = '"
                 + client.Character.OrgId + "'");
                 +          client.SendChatText("Description Updated");
                 +      }
                 +      else
                 +      {
                 +          client.SendChatText("You must be the Organization Leader to perform this command!");
                 +      }*/
            }

            break;

                #endregion

                #region /org name <text>

            case 26:
            {
                // org name <name>

                /* Renames Organization
                 * Checks for Existing Orgs with similar name to stop crash
                 * Chaz
                 */
                /*
                 *      if (client.Character.Stats.ClanLevel.Value == 0)
                 *      {
                 *          var SqlQuery26 = "SELECT * FROM organizations WHERE Name LIKE '" + message.CommandArgs
                 + "' LIMIT 1";
                 +          string CurrentOrg = null;
                 +          dt = ms.ReadDatatable(SqlQuery26);
                 +          if (dt.Rows.Count > 0)
                 +          {
                 +              CurrentOrg = (string)dt.Rows[0]["Name"];
                 +          }
                 +
                 +          if (CurrentOrg == null)
                 +          {
                 +              var SqlQuery27 = "UPDATE organizations SET Name = '" + message.CommandArgs
                 + "' WHERE ID = '" + client.Character.OrgId + "'";
                 +              ms.SqlUpdate(SqlQuery27);
                 +              client.SendChatText("Organization Name Changed to: " + message.CommandArgs);
                 +
                 +              // Forces reloading of org name and the like
                 +              // XXXX TODO: Make it reload for all other members in the org
                 +              client.Character.OrgId = client.Character.OrgId;
                 +              break;
                 +          }
                 +          else
                 +          {
                 +              client.SendChatText("An Organization already exists with that name");
                 +              break;
                 +          }
                 +      }
                 +      else
                 +      {
                 +          client.SendChatText("You must be the organization leader to perform this command!");
                 +      }*/

                break;
            }

                #endregion

                #region /org governingform <text>

            case 27:
            {
                // org governingform <form>

                /* Current Governing Forms:
                 * Department, Faction, Republic, Monarchy, Anarchism, Feudalism
                 */
                /*
                 *      // Check on whether your President or not
                 *      if (client.Character.Stats.ClanLevel.Value == 0)
                 *      {
                 *          // first we drop the case on the input, just to be sure.
                 *          var GovFormNum = -1;
                 *          if (message.CommandArgs == null)
                 *          {
                 *              // list gov forms
                 *              client.SendChatText(
                 *                  "List of Accepted Governing Forms is: department, faction, republic, monarchy, anarchism, feudalism");
                 *              break;
                 *          }
                 *
                 *          // was correct input passed?
                 *          switch (message.CommandArgs.ToLower())
                 *          {
                 *              case "department":
                 *                  GovFormNum = 0;
                 *                  break;
                 *              case "faction":
                 *                  GovFormNum = 1;
                 *                  break;
                 *              case "republic":
                 *                  GovFormNum = 2;
                 *                  break;
                 *              case "monarchy":
                 *                  GovFormNum = 3;
                 *                  break;
                 *              case "anarchism":
                 *                  GovFormNum = 4;
                 *                  break;
                 *              case "feudalism":
                 *                  GovFormNum = 5;
                 *                  break;
                 *              default:
                 *                  client.SendChatText(message.CommandArgs + " Is an invalid Governing Form!");
                 *                  client.SendChatText(
                 *                      "Accepted Governing Forms are: department, faction, republic, monarchy, anarchism, feudalism");
                 *                  break;
                 *          }
                 *
                 *          if (GovFormNum != -1)
                 *          {
                 *              ms.SqlUpdate(
                 *                  "UPDATE organizations SET GovernmentForm = '" + GovFormNum + "' WHERE ID = '"
                 + client.Character.OrgId + "'");
                 +              foreach (var currentCharId in OrgMisc.GetOrgMembers(client.Character.OrgId, true))
                 +              {
                 +                  client.Character.Stats.ClanLevel.Set(GetLowestRank(GovFormNum));
                 +              }
                 +
                 +              client.SendChatText("Governing Form is now: " + message.CommandArgs);
                 +              break;
                 +          }
                 +      }
                 +      else
                 +      {
                 +          // Haha! You're not the org leader!
                 +          client.SendChatText("You must be the Org Leader to perform this command");
                 +          break;
                 +      }*/
            }

            break;

                #endregion

                #region /org stopvote <text>

            case 28:

                // <text> is CmdStr
                break;

                #endregion

                #region unknown command

            default:
                break;

                #endregion
            }
        }
        /// <summary>
        /// </summary>
        /// <param name="packet">
        /// </param>
        /// <param name="client">
        /// </param>
        public static void Read(CharacterActionMessage packet, ZoneClient client)
        {
            var   actionNum = (int)packet.Action;
            int   unknown1  = packet.Unknown1;
            int   args1     = packet.Parameter1;
            int   args2     = packet.Parameter2;
            short unknown2  = packet.Unknown2;

            switch (actionNum)
            {
            case 19:
            {
                // Cast nano
                // CastNanoSpell
                var msg = new CastNanoSpellMessage
                {
                    Identity = client.Character.Identity,
                    Unknown  = 0x00,
                    NanoId   = args2,
                    Target   = packet.Target,
                    Unknown1 = 0x00000000,
                    Caster   = client.Character.Identity
                };

                client.Character.Playfield.Announce(msg);

                // TODO: This has to be delayed (Casting attack speed) and needs to move to some other part
                // TODO: Check nanoskill requirements
                // TODO: Lower current nano points/check if enough nano points

                // CharacterAction 107
                var characterAction107 = new CharacterActionMessage
                {
                    Identity   = client.Character.Identity,
                    Unknown    = 0x00,
                    Action     = CharacterActionType.FinishNanoCasting,
                    Unknown1   = 0x00000000,
                    Target     = Identity.None,
                    Parameter1 = 1,
                    Parameter2 = args2,
                    Unknown2   = 0x0000
                };

                client.Character.Playfield.Announce(characterAction107);

                // CharacterAction 98
                var characterAction98 = new CharacterActionMessage
                {
                    Identity = packet.Target,
                    Unknown  = 0x00,
                    Action   = CharacterActionType.SetNanoDuration,
                    Unknown1 = 0x00000000,
                    Target   =
                        new Identity
                    {
                        Type =
                            IdentityType
                            .NanoProgram,
                        Instance = args2
                    },
                    Parameter1 = client.Character.Identity.Instance,
                    Parameter2 = 0x249F0,                             // duration?
                    // Algorithman: Yes, it's duration
                    Unknown2 = 0x0000
                };

                client.Character.Playfield.Announce(characterAction98);
            }

            break;

            /* this is here to prevent server crash that is caused by
             * search action if server doesn't reply if something is
             * found or not */
            case 66:
            {
                // If action == search
                /* Msg 110:136744723 = "No hidden objects found." */
                // TODO: SEARCH!!
                SendFeedback.Send(client, 110, 136744723);
            }

            break;

            case 105:
            {
                // If action == Info Request
                IInstancedEntity tPlayer = client.Playfield.FindByIdentity(packet.Target);
                var tChar = tPlayer as Character;
                if (tChar != null)
                {
                    uint   LegacyScore = tChar.Stats[StatIds.pvp_rating].BaseValue;
                    string LegacyTitle = null;
                    if (LegacyScore < 1400)
                    {
                        LegacyTitle = string.Empty;
                    }
                    else if (LegacyScore < 1500)
                    {
                        LegacyTitle = "Freshman";
                    }
                    else if (LegacyScore < 1600)
                    {
                        LegacyTitle = "Rookie";
                    }
                    else if (LegacyScore < 1700)
                    {
                        LegacyTitle = "Apprentice";
                    }
                    else if (LegacyScore < 1800)
                    {
                        LegacyTitle = "Novice";
                    }
                    else if (LegacyScore < 1900)
                    {
                        LegacyTitle = "Neophyte";
                    }
                    else if (LegacyScore < 2000)
                    {
                        LegacyTitle = "Experienced";
                    }
                    else if (LegacyScore < 2100)
                    {
                        LegacyTitle = "Expert";
                    }
                    else if (LegacyScore < 2300)
                    {
                        LegacyTitle = "Master";
                    }
                    else if (LegacyScore < 2500)
                    {
                        LegacyTitle = "Champion";
                    }
                    else
                    {
                        LegacyTitle = "Grand Master";
                    }

                    int orgGoverningForm = 0;
                    try
                    {
                        orgGoverningForm = OrganizationDao.GetGovernmentForm(tChar.Stats[StatIds.clan].Value);
                    }
                    catch (Exception)
                    {
                    }

                    // Uses methods in ZoneEngine\PacketHandlers\OrgClient.cs

                    /* Known packetFlags--
                     * 0x40 - No org | 0x41 - Org | 0x43 - Org and towers | 0x47 - Org, towers, player has personal towers | 0x50 - No pvp data shown
                     * Bitflags--
                     * Bit0 = hasOrg, Bit1 = orgTowers, Bit2 = personalTowers, Bit3 = (Int32) time until supression changes (Byte) type of supression level?, Bit4 = noPvpDataShown, Bit5 = hasFaction, Bit6 = ?, Bit 7 = null.
                     */

                    int?           orgId;
                    string         orgRank;
                    InfoPacketType type;
                    if (tPlayer.Stats[StatIds.clan].BaseValue == 0)
                    {
                        type    = InfoPacketType.Character;
                        orgId   = null;
                        orgRank = null;
                    }
                    else
                    {
                        type  = InfoPacketType.CharacterOrg;
                        orgId = (int?)tPlayer.Stats[StatIds.clan].BaseValue;
                        if (client.Character.Stats[StatIds.clan].BaseValue == tPlayer.Stats[StatIds.clan].BaseValue)
                        {
                            orgRank = OrgClient.GetRank(
                                orgGoverningForm,
                                tPlayer.Stats[StatIds.clanlevel].BaseValue);
                        }
                        else
                        {
                            orgRank = string.Empty;
                        }
                    }

                    var info = new CharacterInfoPacket
                    {
                        Unknown1   = 0x01,
                        Profession =
                            (Profession)tPlayer.Stats[StatIds.profession].Value,
                        Level            = (byte)tPlayer.Stats[StatIds.level].Value,
                        TitleLevel       = (byte)tPlayer.Stats[StatIds.titlelevel].Value,
                        VisualProfession =
                            (Profession)tPlayer.Stats[StatIds.visualflags].Value,
                        SideXp           = 0,
                        Health           = tPlayer.Stats[StatIds.health].Value,
                        MaxHealth        = tPlayer.Stats[StatIds.life].Value,
                        BreedHostility   = 0x00000000,
                        OrganizationId   = orgId,
                        FirstName        = tChar.FirstName,
                        LastName         = tChar.LastName,
                        LegacyTitle      = LegacyTitle,
                        Unknown2         = 0x0000,
                        OrganizationRank = orgRank,
                        TowerFields      = null,
                        CityPlayfieldId  = 0x00000000,
                        Towers           = null,
                        InvadersKilled   =
                            tPlayer.Stats[StatIds.invaderskilled].Value,
                        KilledByInvaders =
                            tPlayer.Stats[StatIds.killedbyinvaders].Value,
                        AiLevel                = tPlayer.Stats[StatIds.alienlevel].Value,
                        PvpDuelWins            = tPlayer.Stats[StatIds.pvpduelkills].Value,
                        PvpDuelLoses           = tPlayer.Stats[StatIds.pvpdueldeaths].Value,
                        PvpProfessionDuelLoses =
                            tPlayer.Stats[StatIds.pvpprofessiondueldeaths].Value,
                        PvpSoloKills =
                            tPlayer.Stats[StatIds.pvprankedsolokills].Value,
                        PvpTeamKills =
                            tPlayer.Stats[StatIds.pvprankedteamkills].Value,
                        PvpSoloScore = tPlayer.Stats[StatIds.pvpsoloscore].Value,
                        PvpTeamScore = tPlayer.Stats[StatIds.pvpteamscore].Value,
                        PvpDuelScore = tPlayer.Stats[StatIds.pvpduelscore].Value
                    };

                    var infoPacketMessage = new InfoPacketMessage
                    {
                        Identity = tPlayer.Identity,
                        Unknown  = 0x00,
                        Type     = type,
                        Info     = info
                    };

                    client.SendCompressed(infoPacketMessage);
                }
                else
                {
                    // TODO: NPC's

                    /*
                     *              var npc =
                     *                  (NonPlayerCharacterClass)
                     *                  FindDynel.FindDynelById(packet.Target);
                     *              if (npc != null)
                     *              {
                     *                  var infoPacket = new PacketWriter();
                     *
                     *                  // Start packet header
                     *                  infoPacket.PushByte(0xDF);
                     *                  infoPacket.PushByte(0xDF);
                     *                  infoPacket.PushShort(10);
                     *                  infoPacket.PushShort(1);
                     *                  infoPacket.PushShort(0);
                     *                  infoPacket.PushInt(3086); // sender (server ID)
                     *                  infoPacket.PushInt(client.Character.Id.Instance); // receiver
                     *                  infoPacket.PushInt(0x4D38242E); // packet ID
                     *                  infoPacket.PushIdentity(npc.Id); // affected identity
                     *                  infoPacket.PushByte(0); // ?
                     *
                     *                  // End packet header
                     *                  infoPacket.PushByte(0x50); // npc's just have 0x50
                     *                  infoPacket.PushByte(1); // esi_001?
                     *                  infoPacket.PushByte((byte)npc.Stats.Profession.Value); // Profession
                     *                  infoPacket.PushByte((byte)npc.Stats.Level.Value); // Level
                     *                  infoPacket.PushByte((byte)npc.Stats.TitleLevel.Value); // Titlelevel
                     *                  infoPacket.PushByte((byte)npc.Stats.VisualProfession.Value); // Visual Profession
                     *
                     *                  infoPacket.PushShort(0); // no idea for npc's
                     *                  infoPacket.PushUInt(npc.Stats.Health.Value); // Current Health (Health)
                     *                  infoPacket.PushUInt(npc.Stats.Life.Value); // Max Health (Life)
                     *                  infoPacket.PushInt(0); // BreedHostility?
                     *                  infoPacket.PushUInt(0); // org ID
                     *                  infoPacket.PushShort(0);
                     *                  infoPacket.PushShort(0);
                     *                  infoPacket.PushShort(0);
                     *                  infoPacket.PushShort(0);
                     *                  infoPacket.PushInt(0x499602d2);
                     *                  infoPacket.PushInt(0x499602d2);
                     *                  infoPacket.PushInt(0x499602d2);
                     *                  var infoPacketA = infoPacket.Finish();
                     *                  client.SendCompressed(infoPacketA);
                     *              }*/
                }
            }

            break;

            case 120:
            {
                // If action == Logout
                // Start 30 second logout timer if client is not a GM (statid 215)
                if (client.Character.Stats[StatIds.gmlevel].Value == 0)
                {
                    ((Character)client.Character).StartLogoutTimer();
                }
                else
                {
                    // If client is a GM, disconnect without timer
                    client.Character.Dispose();
                }
            }

            break;

            case 121:
            {
                // If action == Stop Logout
                // Stop current logout timer and send stop logout packet
                ((Character)client.Character).StopLogoutTimer();
                client.Character.UpdateMoveType((byte)client.Character.PreviousMoveMode);
                client.Playfield.Announce(packet);

                // client.CancelLogOut();
            }

            break;

            case 87:
            {
                // If action == Stand
                client.Character.UpdateMoveType(37);
                client.Playfield.Announce(packet);

                if (client.Character.InLogoutTimerPeriod())
                {
                    client.Playfield.Send(
                        client,
                        new CharacterActionMessage()
                        {
                            Action   = CharacterActionType.StopLogout,
                            Identity = client.Character.Identity
                        });
                    ((Character)client.Character).StopLogoutTimer();
                }

                // Send stand up packet, and cancel timer/send stop logout packet if timer is enabled
                // client.StandCancelLogout();
            }

            break;

            case 22:
            {
                // Kick Team Member
            }

            break;

            case 24:
            {
                // Leave Team

                /*
                 *              var team = new TeamClass();
                 *              team.LeaveTeam(client);
                 */
            }

            break;

            case 25:
            {
                // Transfer Team Leadership
            }

            break;

            case 26:
            {
                // Team Join Request
                // Send Team Invite Request To Target Player

                /*
                 *              var team = new TeamClass();
                 *              team.SendTeamRequest(client, packet.Target);
                 */
            }

            break;

            case 28:
            {
                /*
                 *              // Request Reply
                 *              // Check if positive or negative response
                 *
                 *              // if positive
                 *              var team = new TeamClass();
                 *              var teamID = TeamClass.GenerateNewTeamId(client, packet.Target);
                 *
                 *              // Destination Client 0 = Sender, 1 = Reciever
                 *
                 *              // Reciever Packets
                 *              ///////////////////
                 *
                 *              // CharAction 15
                 *              team.TeamRequestReply(client, packet.Target);
                 *
                 *              // CharAction 23
                 *              team.TeamRequestReplyCharacterAction23(client, packet.Target);
                 *
                 *              // TeamMember Packet
                 *              team.TeamReplyPacketTeamMember(1, client, packet.Target, "Member1");
                 *
                 *              // TeamMemberInfo Packet
                 *              team.TeamReplyPacketTeamMemberInfo(1, client, packet.Target);
                 *
                 *              // TeamMember Packet
                 *              team.TeamReplyPacketTeamMember(1, client, packet.Target, "Member2");
                 *
                 *              // Sender Packets
                 *              /////////////////
                 *
                 *              // TeamMember Packet
                 *              team.TeamReplyPacketTeamMember(0, client, packet.Target, "Member1");
                 *
                 *              // TeamMemberInfo Packet
                 *              team.TeamReplyPacketTeamMemberInfo(0, client, packet.Target);
                 *
                 *              // TeamMember Packet
                 *              team.TeamReplyPacketTeamMember(0, client, packet.Target, "Member2");
                 */
            }

            break;

            case 0x70:     // Remove/Delete item
                ItemDao.RemoveItem(
                    (int)packet.Target.Type,
                    client.Character.Identity.Instance,
                    packet.Target.Instance);
                client.Character.BaseInventory.RemoveItem((int)packet.Target.Type, packet.Target.Instance);
                client.SendCompressed(packet);
                break;

            case 0x34:     // Split?
                IItem it = client.Character.BaseInventory.Pages[(int)packet.Target.Type][packet.Target.Instance];
                it.MultipleCount -= args2;
                Item newItem = new Item(it.Quality, it.LowID, it.HighID);
                newItem.MultipleCount = args2;

                client.Character.BaseInventory.Pages[(int)packet.Target.Type].Add(
                    client.Character.BaseInventory.Pages[(int)packet.Target.Type].FindFreeSlot(),
                    newItem);
                client.Character.BaseInventory.Pages[(int)packet.Target.Type].Write();
                break;

            case 0x35:
                client.Character.BaseInventory.Pages[(int)packet.Target.Type][packet.Target.Instance].MultipleCount
                    += client.Character.BaseInventory.Pages[(int)packet.Target.Type][args2].MultipleCount;
                client.Character.BaseInventory.Pages[(int)packet.Target.Type].Remove(args2);
                client.Character.BaseInventory.Pages[(int)packet.Target.Type].Write();
                client.SendCompressed(packet);
                break;

            // ###################################################################################
            // Spandexpants: This is all i have done so far as to make sneak turn on and off,
            // currently i cannot find a missing packet or link which tells the server the player
            // has stopped sneaking, hidden packet or something, will come back to later.
            // ###################################################################################

            // Sneak Packet Received
            case 163:
            {
                // TODO: IF SNEAKING IS ALLOWED RUN THIS CODE.
                // Send Action 162 : Enable Sneak
                var sneak = new CharacterActionMessage
                {
                    Identity   = client.Character.Identity,
                    Unknown    = 0x00,
                    Action     = CharacterActionType.StartedSneaking,
                    Unknown1   = 0x00000000,
                    Target     = Identity.None,
                    Parameter1 = 0,
                    Parameter2 = 0,
                    Unknown2   = 0x0000
                };

                client.SendCompressed(sneak);

                // End of Enable sneak
                // TODO: IF SNEAKING IS NOT ALLOWED SEND REJECTION PACKET
            }

            break;

            case 81:
            {
                Identity item1 = packet.Target;
                var      item2 = new Identity {
                    Type = (IdentityType)args1, Instance = args2
                };

                client.Character.TradeSkillSource = new TradeSkillInfo(0, (int)item1.Type, item1.Instance);
                client.Character.TradeSkillTarget = new TradeSkillInfo(1, (int)item2.Type, item2.Instance);
                TradeSkillReceiver.TradeSkillBuildPressed(client, 300);

                break;
            }

            case 166:
            {
                client.Character.Stats[StatIds.visualflags].Value = args2;

                // client.SendChatText("Setting Visual Flag to "+unknown3.ToString());
                AppearanceUpdate.AnnounceAppearanceUpdate((Character)client.Character);
                break;
            }

            case 0xdc:
                TradeSkillReceiver.TradeSkillSourceChanged(client, args1, args2);
                break;

            case 0xdd:
                TradeSkillReceiver.TradeSkillTargetChanged(client, args1, args2);
                break;

            case 0xde:
                TradeSkillReceiver.TradeSkillBuildPressed(client, packet.Target.Instance);
                break;

            default:
            {
                client.Playfield.Announce(packet);
            }

            break;
            }
        }