Ejemplo n.º 1
0
        /// <summary>
        /// load component from db object
        /// </summary>
        public virtual void LoadFromDatabase(DBKeepComponent component, AbstractGameKeep keep)
        {
            Region myregion = WorldMgr.GetRegion((ushort)keep.Region);

            if (myregion == null)
            {
                return;
            }
            Keep = keep;
            //this.DBKeepComponent = component;
            base.LoadFromDatabase(component);
            //this x and y is for get object in radius
            double angle = keep.Heading * ((Math.PI * 2) / 360);             // angle*2pi/360;

            X = (int)(keep.X + ((sbyte)component.X * 148 * Math.Cos(angle) + (sbyte)component.Y * 148 * Math.Sin(angle)));
            Y = (int)(keep.Y - ((sbyte)component.Y * 148 * Math.Cos(angle) - (sbyte)component.X * 148 * Math.Sin(angle)));
            Z = keep.Z;
            // and this one for packet sent
            ComponentX       = component.X;
            ComponentY       = component.Y;
            ComponentHeading = (ushort)component.Heading;
            //need check to be sure for heading
            angle = (component.Heading * 90 + keep.Heading);
            if (angle > 360)
            {
                angle -= 360;
            }
            Heading        = (ushort)(angle / 0.08789);
            Name           = keep.Name;
            Model          = INVISIBLE_MODEL;
            Skin           = component.Skin;
            m_oldMaxHealth = MaxHealth;
            Health         = MaxHealth;
            //			this.Health = component.Health;
            m_oldHealthPercent = HealthPercent;
            CurrentRegion      = myregion;
            ID       = component.ID;
            SaveInDB = false;
            IsRaized = false;
            LoadPositions();
            AddToWorld();
            FillPositions();
            RepairedHealth = MaxHealth;
            m_CreateInfo   = component.CreateInfo;
            StartHealthRegeneration();
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Remove a component and delete it from the database
        /// </summary>
        public virtual void Remove()
        {
            Delete();
            DBKeepComponent obj = null;

            if (this.InternalID != null)
            {
                obj = GameServer.Database.FindObjectByKey <DBKeepComponent>(this.InternalID);
            }
            if (obj != null)
            {
                GameServer.Database.DeleteObject(obj);
            }

            log.Warn("Keep Component deleted from database: " + obj.ID);
            //todo find a packet to remove the keep
        }
Ejemplo n.º 3
0
        /// <summary>
        /// save component in DB
        /// </summary>
        public override void SaveIntoDatabase()
        {
            DBKeepComponent obj = null;
            bool            New = false;

            if (InternalID != null)
            {
                obj = GameServer.Database.FindObjectByKey <DBKeepComponent>(InternalID);
            }

            if (obj == null)
            {
                obj = new DBKeepComponent();
                New = true;
            }

            obj.KeepID     = AbstractKeep.KeepID;
            obj.Heading    = ComponentHeading;
            obj.Health     = Health;
            obj.X          = ComponentX;
            obj.Y          = ComponentY;
            obj.ID         = ID;
            obj.Skin       = Skin;
            obj.CreateInfo = m_CreateInfo;

            if (New)
            {
                GameServer.Database.AddObject(obj);
                InternalID = obj.ObjectId;
                log.DebugFormat("Added new component {0} for keep ID {1}, skin {2}, health {3}", ID, AbstractKeep.KeepID, Skin, Health);
            }
            else
            {
                GameServer.Database.SaveObject(obj);
            }

            base.SaveIntoDatabase();
        }
Ejemplo n.º 4
0
        public void OnCommand(GameClient client, string[] args)
        {
            if (args.Length == 1)
            {
                DisplaySyntax(client);
                return;
            }

            AbstractGameKeep myKeep = GameServer.KeepManager.GetKeepCloseToSpot(client.Player.CurrentRegionID, client.Player, WorldMgr.OBJ_UPDATE_DISTANCE);

            if (myKeep == null)
            {
                DisplayMessage(client, "You are not near a keep.");
            }

            switch (args[1])
            {
            case "create":
            {
                if (args.Length < 3)
                {
                    int i = 0;
                    foreach (string str in Enum.GetNames(typeof(GameKeepComponent.eComponentSkin)))
                    {
                        client.Out.SendMessage("#" + i + ": " + str, eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        i++;
                    }

                    DisplaySyntax(client);
                    return;
                }

                if (myKeep == null)
                {
                    DisplaySyntax(client);
                    return;
                }

                int skin = 0;
                try
                {
                    skin = Convert.ToInt32(args[2]);
                }
                catch
                {
                    int i = 0;
                    foreach (string str in Enum.GetNames(typeof(GameKeepComponent.eComponentSkin)))
                    {
                        client.Out.SendMessage("#" + i + ": " + str, eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        i++;
                    }

                    DisplaySyntax(client);
                    return;
                }

                if (args.Length >= 4)
                {
                    int keepid = 0;
                    try
                    {
                        keepid = Convert.ToInt32(args[3]);
                        myKeep = GameServer.KeepManager.GetKeepByID(keepid);
                    }
                    catch
                    {
                        DisplaySyntax(client);
                        return;
                    }
                }

                GameKeepComponent component = new GameKeepComponent();
                component.X = client.Player.X;
                component.Y = client.Player.Y;
                component.Z = client.Player.Z;
                component.ComponentHeading = (client.Player.Heading - myKeep.Heading) / 1024;
                component.Heading          = (ushort)(component.ComponentHeading * 1024 + myKeep.Heading);
                component.Keep             = myKeep;

                // todo good formula
                // component.ComponentX = (component.X - myKeep.X) / 148;
                // component.ComponentY = (component.Y - myKeep.Y) / 148;
                double angle = myKeep.Heading * ((Math.PI * 2) / 360);         // angle*2pi/360;

                // component.ComponentX = (int)((148 * Math.Sin(angle) * myKeep.X - 148 * Math.Sin(angle) * client.Player.X + client.Player.Y - myKeep.Y)
                //    / (148 * Math.Sin(angle) - 148 * 148 * 2 * Math.Sin(angle) * Math.Cos(angle)));
                // component.ComponentY = (int)((myKeep.Y - client.Player.Y + 148 * Math.Sin(angle) * component.ComponentX) / (148 * Math.Cos(angle)));
                component.ComponentX = CalcCX(client.Player, myKeep, angle);
                component.ComponentY = CalcCY(client.Player, myKeep, angle);

                /*
                 * x = (component.X-myKeep.X)/148 = a*cos(t) - b*sin(t)
                 * y = (component.Y-myKeep.Y)/148 = a*sin(t) + b*cos(t)
                 * a = sqrt((x+b*sin(t))^2 + (y-b*cos(t))^2)
                 * a = sqrt(x²+y²+b² +2*x*b*sin(t)-2*y*b*cos(t))
                 * b = sqrt((x-a*cos(t))^2 + (y-a*sin(t))^2)
                 * b = sqrt(x²+y²+a²-2*x*a*cos(t)-2*y*a*sin(t))
                 * 0 = 2x²+2y²-2*x*a*cos(t)-2*y*a*sin(t)+2*x*sqrt(x²+y²+a²-2*x*a*cos(t)-2*y*a*sin(t))*sin(t)-2*y*sqrt(x²+y²+a²-2*x*a*cos(t)-2*y*a*sin(t))*cos(t)
                 * pfff
                 * so must find an other way to find it....
                 */
                component.Name          = myKeep.Name;
                component.Model         = INVISIBLE_MODEL;
                component.Skin          = skin;
                component.Level         = (byte)myKeep.Level;
                component.CurrentRegion = client.Player.CurrentRegion;
                component.Health        = component.MaxHealth;
                component.ID            = myKeep.KeepComponents.Count;
                component.AbstractKeep.KeepComponents.Add(component);
                component.SaveInDB = true;
                component.AddToWorld();
                component.SaveIntoDatabase();
                client.Out.SendKeepInfo(myKeep);
                client.Out.SendKeepComponentInfo(component);
                client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.KeepComponents.Create.KCCreated"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            break;

            case "move":
            {
                GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;

                component.X = client.Player.X;
                component.Y = client.Player.Y;
                component.Z = client.Player.Z;
                component.ComponentHeading = (client.Player.Heading - myKeep.Heading) / 1024;
                component.Heading          = (ushort)(component.ComponentHeading * 1024 + myKeep.Heading);
                component.Keep             = myKeep;

                // todo good formula
                // component.ComponentX = (component.X - myKeep.X) / 148;
                // component.ComponentY = (myKeep.Y - component.Y) / 148;
                double angle = myKeep.Heading * ((Math.PI * 2) / 360);         // angle*2pi/360;

                // component.ComponentX = (int)((148 * Math.Sin(angle) * myKeep.X - 148 * Math.Sin(angle) * client.Player.X + client.Player.Y - myKeep.Y)
                //    / (148 * Math.Sin(angle) - 148 * 148 * 2 * Math.Sin(angle) * Math.Cos(angle)));
                // component.ComponentY = (int)((myKeep.Y - client.Player.Y + 148 * Math.Sin(angle) * component.ComponentX) / (148 * Math.Cos(angle)));
                component.ComponentX = CalcCX(client.Player, myKeep, angle);
                component.ComponentY = CalcCY(client.Player, myKeep, angle);

                client.Out.SendKeepInfo(myKeep);
                client.Out.SendKeepComponentInfo(component);
                client.Out.SendKeepComponentDetailUpdate(component);
                client.Out.SendMessage("Component moved.  Use /keepcomponent save to save, or reload to reload the original position.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            break;

            case "rotate":
            {
                try
                {
                    ushort amount = Convert.ToUInt16(args[2]);

                    if (amount > 3)
                    {
                        amount = 3;
                    }

                    GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;

                    component.ComponentHeading = amount;
                    component.Heading          = (ushort)(component.ComponentHeading * 1024 + myKeep.Heading);

                    client.Out.SendKeepInfo(myKeep);
                    client.Out.SendKeepComponentInfo(component);
                    client.Out.SendKeepComponentDetailUpdate(component);
                    client.Out.SendMessage("Component rotated.  Use /keepcomponent save to save, or reload to reload the original position.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                }
                catch
                {
                    DisplayMessage(client, "/keepcomponent rotate [0 - 3]");
                }
            }

            break;

            case "skin":
            {
                if (args.Length < 3)
                {
                    int i = 0;
                    foreach (string str in Enum.GetNames(typeof(GameKeepComponent.eComponentSkin)))
                    {
                        client.Out.SendMessage("#" + i + ": " + str, eChatType.CT_System, eChatLoc.CL_SystemWindow);
                        i++;
                    }

                    DisplaySyntax(client);
                    return;
                }

                int skin = 0;
                try
                {
                    skin = Convert.ToInt32(args[2]);
                }
                catch
                {
                    DisplaySyntax(client);
                    return;
                }

                GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;
                if (component == null)
                {
                    DisplaySyntax(client);
                    return;
                }

                component.Skin = skin;
                foreach (GameClient cli in WorldMgr.GetClientsOfRegion(client.Player.CurrentRegionID))
                {
                    cli.Out.SendKeepComponentInfo(component);
                    cli.Out.SendKeepComponentDetailUpdate(component);
                }

                // client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.KeepComponents.Skin.YChangeSkin"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
                client.Out.SendMessage("Component skin updated.  Use /keepcomponent save to save, or reload to reload the original skin.", eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            break;

            case "delete":
            {
                GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;
                if (component == null)
                {
                    DisplaySyntax(client);
                    return;
                }

                component.RemoveFromWorld();
                component.Delete();
                component.DeleteFromDatabase();
                client.Out.SendMessage(LanguageMgr.GetTranslation(client.Account.Language, "GMCommands.KeepComponents.Delete.YDeleteKC"), eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            break;

            case "save":
            {
                GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;
                if (component == null)
                {
                    DisplaySyntax(client);
                    return;
                }

                component.SaveIntoDatabase();
                client.Out.SendMessage(
                    string.Format(
                        "Saved ComponentID: {0}, KeepID: {1}, Skin: {2}, Health: {3}%",
                        component.ID,
                        component.Keep == null ? "0" : component.Keep.KeepID.ToString(),
                        component.Skin,
                        component.HealthPercent), eChatType.CT_System, eChatLoc.CL_SystemWindow);
            }

            break;

            case "reload":
            {
                GameKeepComponent component = client.Player.TargetObject as GameKeepComponent;
                if (component == null)
                {
                    DisplaySyntax(client);
                    return;
                }

                DBKeepComponent dbcomponent = GameServer.Database.SelectObjects <DBKeepComponent>("`KeepID` = @KeepID AND `ID` = @ID", new [] { new QueryParameter("@KeepID", component.Keep.KeepID), new QueryParameter("@ID", component.ID) }).FirstOrDefault();
                component.ComponentX       = dbcomponent.X;
                component.ComponentY       = dbcomponent.Y;
                component.ComponentHeading = dbcomponent.Heading;
                component.Skin             = dbcomponent.Skin;

                foreach (GameClient cli in WorldMgr.GetClientsOfRegion(client.Player.CurrentRegionID))
                {
                    cli.Out.SendKeepComponentInfo(component);
                    cli.Out.SendKeepComponentDetailUpdate(component);
                }

                client.Out.SendMessage("Component Reloaded", eChatType.CT_System, eChatLoc.CL_SystemWindow);
                break;
            }

            default:
            {
                DisplaySyntax(client);
                return;
            }
            }
        }