Beispiel #1
0
 /// <summary>
 /// </summary>
 /// <param name="message">
 /// </param>
 /// <param name="client">
 /// </param>
 private static void Reply(GenericCmdMessage message, ZoneClient client)
 {
     // Acknowledge action
     message.Identity = client.Character.Identity;
     message.Temp1    = 1;
     message.Unknown  = 0;
     client.SendCompressed(message);
 }
        /// <summary>
        /// </summary>
        /// <param name="dynel">
        /// </param>
        /// <param name="destination">
        /// </param>
        /// <param name="heading">
        /// </param>
        /// <param name="playfield">
        /// </param>
        public void Teleport(Dynel dynel, Coordinate destination, IQuaternion heading, Identity playfield)
        {
            // Prevent client from entering this again
            if (dynel.DoNotDoTimers)
            {
                return;
            }
            Thread.Sleep(200);
            int dynelId = dynel.Identity.Instance;

            // Disable sending stat changes and wait a bit to clear the queue
            dynel.DoNotDoTimers = true;
            Thread.Sleep(1000);

            // Teleport to another playfield
            TeleportMessageHandler.Default.Send(
                dynel as ICharacter,
                destination.coordinate,
                (Vector.Quaternion)heading,
                playfield);

            // Send packet, disconnect, and other playfield waits for connect

            DespawnMessage despawnMessage = DespawnMessageHandler.Default.Create(dynel.Identity);

            this.AnnounceOthers(despawnMessage, dynel.Identity);
            dynel.RawCoordinates = new Vector3()
            {
                X = destination.x, Y = destination.y, Z = destination.z
            };
            dynel.RawHeading = new Vector.Quaternion(heading.xf, heading.yf, heading.zf, heading.wf);

            // IMPORTANT!!
            // Dispose the character object, save new playfield data and then recreate it
            // else you would end up at weird coordinates in the same playfield

            // Save client object
            ZoneClient client = (ZoneClient)dynel.Controller.Client;

            // Set client=null so dynel can really dispose

            IPlayfield newPlayfield = this.server.PlayfieldById(playfield);

            Pool.Instance.GetObject <Playfield>(
                Identity.None,
                new Identity()
            {
                Type = playfield.Type, Instance = playfield.Instance
            });

            if (newPlayfield == null)
            {
                newPlayfield = new Playfield(this.server, playfield);
            }

            dynel.Playfield         = newPlayfield;
            dynel.Controller.Client = null;
            dynel.Dispose();

            LogUtil.Debug(DebugInfoDetail.Database, "Saving to pf " + playfield.Instance);

            // TODO: Get new server ip from chatengine (which has to log all zoneengine's playfields)
            // for now, just transmit our ip and port

            IPAddress tempIp;

            if (IPAddress.TryParse(Config.Instance.CurrentConfig.ZoneIP, out tempIp) == false)
            {
                IPHostEntry zoneHost = Dns.GetHostEntry(Config.Instance.CurrentConfig.ZoneIP);
                foreach (IPAddress ip in zoneHost.AddressList)
                {
                    if (ip.AddressFamily == AddressFamily.InterNetwork)
                    {
                        tempIp = ip;
                        break;
                    }
                }
            }

            var redirect = new ZoneRedirectionMessage
            {
                ServerIpAddress = tempIp,
                ServerPort      = (ushort)this.server.TcpEndPoint.Port
            };

            if (client != null)
            {
                client.SendCompressed(redirect);
            }
            // client.Server.DisconnectClient(client);
        }
        /// <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
            }
        }
Beispiel #4
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
            }
        }
Beispiel #5
0
        /// <summary>
        /// </summary>
        /// <param name="charID">
        /// </param>
        /// <param name="client">
        /// </param>
        public void Read(int charID, ZoneClient client)
        {
            // Don't edit anything in this region
            // unless you are 300% sure you know what you're doing

            // Character is created and read when Client connects in Client.cs->CreateCharacter
            // client.CreateCharacter(charID);
            client.Server.Info(
                client,
                "Client connected. ID: {0} IP: {1} Character name: {2}",
                client.Character.Identity.Instance,
                client.ClientAddress,
                client.Character.Name);

            // now we have to start sending packets like
            // character stats, inventory, playfield info
            // and so on. I will put some packets here just
            // to get us in game. We have to start moving
            // these packets somewhere else and make packet
            // builders instead of sending (half) hardcoded
            // packets.

            /* send chat server info to client */
            ChatServerInfo.Send(client);

            /* send playfield info to client */
            PlayfieldAnarchyF.Send(client);

            var sendSCFUs = new IMSendPlayerSCFUs {
                toClient = client
            };

            ((Playfield)client.Playfield).SendSCFUsToClient(sendSCFUs);

            /* set SocialStatus to 0 */
            client.Character.Stats[521].BaseValue = 0;

            // Stat.SendDirect(client, 521, 0, false);

            var identity = new Identity {
                Type = IdentityType.CanbeAffected, Instance = charID
            };

            /* Action 167 Animation and Stance Data maybe? */
            var message = new CharacterActionMessage
            {
                Identity   = identity,
                Action     = CharacterActionType.ChangeAnimationAndStance,
                Target     = Identity.None,
                Parameter1 = 0x00000000,
                Parameter2 = 0x00000001
            };

            client.SendCompressed(message);

            var gameTimeMessage = new GameTimeMessage
            {
                Identity = identity,
                Unknown1 = 30024.0f,
                Unknown3 = 185408,
                Unknown4 = 80183.3125f
            };

            client.SendCompressed(gameTimeMessage);

            /* set SocialStatus to 0 */
            // Stat.SendDirect(client, 521, 0, false);

            /* again */
            // Stat.SendDirect(client, 521, 0, false);

            /* visual */
            SimpleCharFullUpdate.SendToPlayfield(client);

            /* inventory, items and all that */
            FullCharacter.Send(client);

            var specials = new[]
            {
                new SpecialAttackInfo
                {
                    Unknown1 = 0x0000AAC0,
                    Unknown2 = 0x00023569,
                    Unknown3 = 0x00000064,
                    Unknown4 = "MAAT"
                },
                new SpecialAttackInfo
                {
                    Unknown1 = 0x0000A431,
                    Unknown2 = 0x0000A430,
                    Unknown3 = 0x00000090,
                    Unknown4 = "DIIT"
                },
                new SpecialAttackInfo
                {
                    Unknown1 = 0x00011294,
                    Unknown2 = 0x00011295,
                    Unknown3 = 0x0000008E,
                    Unknown4 = "BRAW"
                }
            };
            var specialAttackWeaponMessage = new SpecialAttackWeaponMessage {
                Identity = identity, Specials = specials
            };

            client.SendCompressed(specialAttackWeaponMessage);

            // done

            // Timers are allowed to update client stats now.
            client.Character.DoNotDoTimers = false;

            // spawn all active monsters to client
            // TODO: Implement NonPlayerCharacterHandler
            // NonPlayerCharacterHandler.SpawnMonstersInPlayfieldToClient(client, client.Character.PlayField);

            // TODO: Implement VendorHandler
            // if (VendorHandler.GetNumberofVendorsinPlayfield(client.Character.PlayField) > 0)
            // {
            // Shops
            // VendorHandler.GetVendorsInPF(client);
            // }

            // WeaponItemFullCharUpdate  Maybe the right location , First Check if weapons present usually in equipment
            // Packets.WeaponItemFullUpdate.Send(client, client.Character);

            // TODO: create a better alternative to ProcessTimers
            // client.Character.ProcessTimers(DateTime.Now + TimeSpan.FromMilliseconds(200));
            client.Character.CalculateSkills();

            AppearanceUpdate.AnnounceAppearanceUpdate((Character)client.Character);

            // done, so we call a hook.
            // Call all OnConnect script Methods
            Program.csc.CallMethod("OnConnect", (Character)client.Character);
        }
        /// <summary>
        /// </summary>
        /// <param name="charID">
        /// </param>
        /// <param name="client">
        /// </param>
        public void Read(int charID, ZoneClient client)
        {
            // Don't edit anything in this region
            // unless you are 300% sure you know what you're doing

            // Character is created and read when Client connects in Client.cs->CreateCharacter
            // client.CreateCharacter(charID);
            client.Server.Info(
                client,
                "Client connected. ID: {0} IP: {1} Character name: {2}",
                client.Character.Identity.Instance,
                client.ClientAddress,
                client.Character.Name);

            // now we have to start sending packets like
            // character stats, inventory, playfield info
            // and so on. I will put some packets here just
            // to get us in game. We have to start moving
            // these packets somewhere else and make packet
            // builders instead of sending (half) hardcoded
            // packets.

            /* send chat server info to client */
            ChatServerInfo.Send(client);

            /* send playfield info to client */
            PlayfieldAnarchyF.Send(client);

            var sendSCFUs = new IMSendPlayerSCFUs { toClient = client };
            ((Playfield)client.Playfield).SendSCFUsToClient(sendSCFUs);

            /* set SocialStatus to 0 */
            client.Character.Stats[521].BaseValue = 0;

            // Stat.SendDirect(client, 521, 0, false);

            var identity = new Identity { Type = IdentityType.CanbeAffected, Instance = charID };

            /* Action 167 Animation and Stance Data maybe? */
            var message = new CharacterActionMessage
                          {
                              Identity = identity,
                              Action = CharacterActionType.ChangeAnimationAndStance,
                              Target = Identity.None,
                              Parameter1 = 0x00000000,
                              Parameter2 = 0x00000001
                          };
            client.SendCompressed(message);

            var gameTimeMessage = new GameTimeMessage
                                  {
                                      Identity = identity,
                                      Unknown1 = 30024.0f,
                                      Unknown3 = 185408,
                                      Unknown4 = 80183.3125f
                                  };
            client.SendCompressed(gameTimeMessage);

            /* set SocialStatus to 0 */
            // Stat.SendDirect(client, 521, 0, false);

            /* again */
            // Stat.SendDirect(client, 521, 0, false);

            /* visual */
            SimpleCharFullUpdate.SendToPlayfield(client);

            /* inventory, items and all that */
            FullCharacter.Send(client);

            var specials = new[]
                           {
                               new SpecialAttackInfo
                               {
                                   Unknown1 = 0x0000AAC0,
                                   Unknown2 = 0x00023569,
                                   Unknown3 = 0x00000064,
                                   Unknown4 = "MAAT"
                               },
                               new SpecialAttackInfo
                               {
                                   Unknown1 = 0x0000A431,
                                   Unknown2 = 0x0000A430,
                                   Unknown3 = 0x00000090,
                                   Unknown4 = "DIIT"
                               },
                               new SpecialAttackInfo
                               {
                                   Unknown1 = 0x00011294,
                                   Unknown2 = 0x00011295,
                                   Unknown3 = 0x0000008E,
                                   Unknown4 = "BRAW"
                               }
                           };
            var specialAttackWeaponMessage = new SpecialAttackWeaponMessage { Identity = identity, Specials = specials };

            client.SendCompressed(specialAttackWeaponMessage);

            // done

            // Timers are allowed to update client stats now.
            client.Character.DoNotDoTimers = false;

            // spawn all active monsters to client
            // TODO: Implement NonPlayerCharacterHandler
            // NonPlayerCharacterHandler.SpawnMonstersInPlayfieldToClient(client, client.Character.PlayField);

            // TODO: Implement VendorHandler
            // if (VendorHandler.GetNumberofVendorsinPlayfield(client.Character.PlayField) > 0)
            // {
            // Shops
            // VendorHandler.GetVendorsInPF(client);
            // }

            // WeaponItemFullCharUpdate  Maybe the right location , First Check if weapons present usually in equipment
            // Packets.WeaponItemFullUpdate.Send(client, client.Character);

            // TODO: create a better alternative to ProcessTimers
            // client.Character.ProcessTimers(DateTime.Now + TimeSpan.FromMilliseconds(200));
            client.Character.CalculateSkills();

            AppearanceUpdate.AnnounceAppearanceUpdate((Character)client.Character);

            // done, so we call a hook.
            // Call all OnConnect script Methods
            Program.csc.CallMethod("OnConnect", (Character)client.Character);
        }
 /// <summary>
 /// </summary>
 /// <param name="message">
 /// </param>
 /// <param name="client">
 /// </param>
 private static void Reply(GenericCmdMessage message, ZoneClient client)
 {
     // Acknowledge action
     message.Identity = client.Character.Identity;
     message.Temp1 = 1;
     message.Unknown = 0;
     client.SendCompressed(message);
 }
        /// <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;
            }
        }
        /// <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;
            }
        }