/// <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(); }
/// <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 }
/// <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(); }
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; } } }