/// <summary> /// Saves a merchant into the DB /// </summary> public override void SaveIntoDatabase() { Mob merchant = null; if (InternalID != null) merchant = GameServer.Database.FindObjectByKey<Mob>(InternalID); if (merchant == null) merchant = new Mob(); merchant.Name = Name; merchant.Guild = GuildName; merchant.X = X; merchant.Y = Y; merchant.Z = Z; merchant.Heading = Heading; merchant.Speed = MaxSpeedBase; merchant.Region = CurrentRegionID; merchant.Realm = (byte)Realm; merchant.RoamingRange = RoamingRange; merchant.Model = Model; merchant.Size = Size; merchant.Level = Level; merchant.Gender = (byte)Gender; merchant.Flags = (uint)Flags; merchant.PathID = PathID; merchant.PackageID = PackageID; merchant.OwnerID = OwnerID; IOldAggressiveBrain aggroBrain = Brain as IOldAggressiveBrain; if (aggroBrain != null) { merchant.AggroLevel = aggroBrain.AggroLevel; merchant.AggroRange = aggroBrain.AggroRange; } merchant.ClassType = this.GetType().ToString(); merchant.EquipmentTemplateID = EquipmentTemplateID; if (m_tradeItems == null) { merchant.ItemsListTemplateID = null; } else { merchant.ItemsListTemplateID = m_tradeItems.ItemsListID; } if (InternalID == null) { GameServer.Database.AddObject(merchant); InternalID = merchant.ObjectId; } else { GameServer.Database.SaveObject(merchant); } }
/// <summary> /// Saves a mob into the db if it exists, it is /// updated, else it creates a new object in the DB /// </summary> public override void SaveIntoDatabase() { // do not allow saving in an instanced region if (CurrentRegion.IsInstance) { LoadedFromScript = true; return; } if (Brain != null && Brain is IControlledBrain) { // do not allow saving of controlled npc's return; } Mob mob = null; if (InternalID != null) { mob = GameServer.Database.FindObjectByKey<Mob>(InternalID); } if (mob == null) { if (LoadedFromScript == false) { mob = new Mob(); } else { return; } } mob.TranslationId = TranslationId; mob.Name = Name; mob.Suffix = Suffix; mob.Guild = GuildName; mob.ExamineArticle = ExamineArticle; mob.MessageArticle = MessageArticle; mob.X = X; mob.Y = Y; mob.Z = Z; mob.Heading = Heading; mob.Speed = MaxSpeedBase; mob.Region = CurrentRegionID; mob.Realm = (byte)Realm; mob.Model = Model; mob.Size = Size; mob.Level = Level; // Stats mob.Constitution = Constitution; mob.Dexterity = Dexterity; mob.Strength = Strength; mob.Quickness = Quickness; mob.Intelligence = Intelligence; mob.Piety = Piety; mob.Empathy = Empathy; mob.Charisma = Charisma; mob.ClassType = this.GetType().ToString(); mob.Flags = (uint)Flags; mob.Speed = MaxSpeedBase; mob.RespawnInterval = m_respawnInterval / 1000; mob.HouseNumber = HouseNumber; mob.RoamingRange = RoamingRange; if (Brain.GetType().FullName != typeof(StandardMobBrain).FullName) mob.Brain = Brain.GetType().FullName; IOldAggressiveBrain aggroBrain = Brain as IOldAggressiveBrain; if (aggroBrain != null) { mob.AggroLevel = aggroBrain.AggroLevel; mob.AggroRange = aggroBrain.AggroRange; } mob.EquipmentTemplateID = EquipmentTemplateID; if (m_faction != null) mob.FactionID = m_faction.ID; mob.MeleeDamageType = (int)MeleeDamageType; if (NPCTemplate != null) { mob.NPCTemplateID = NPCTemplate.TemplateId; } else { mob.NPCTemplateID = -1; } mob.Race = Race; mob.BodyType = BodyType; mob.PathID = PathID; mob.MaxDistance = m_maxdistance; mob.IsCloakHoodUp = m_isCloakHoodUp; mob.Gender = (byte)Gender; mob.VisibleWeaponSlots = this.m_visibleActiveWeaponSlots; mob.PackageID = PackageID; mob.OwnerID = OwnerID; if (InternalID == null) { GameServer.Database.AddObject(mob); InternalID = mob.ObjectId; } else { GameServer.Database.SaveObject(mob); } }
/// <summary> /// Loads the region from database /// </summary> /// <param name="mobObjs"></param> /// <param name="mobCount"></param> /// <param name="merchantCount"></param> /// <param name="itemCount"></param> /// <param name="bindCount"></param> public virtual void LoadFromDatabase(Mob[] mobObjs, ref long mobCount, ref long merchantCount, ref long itemCount, ref long bindCount) { if (!LoadObjects) return; Assembly gasm = Assembly.GetAssembly(typeof(GameServer)); var staticObjs = GameServer.Database.SelectObjects<WorldObject>("Region = " + ID); var bindPoints = GameServer.Database.SelectObjects<BindPoint>("Region = " + ID); int count = mobObjs.Length + staticObjs.Count; if (count > 0) PreAllocateRegionSpace(count + 100); int myItemCount = staticObjs.Count; int myMobCount = 0; int myMerchantCount = 0; int myBindCount = bindPoints.Count; string allErrors = string.Empty; if (mobObjs.Length > 0) { foreach (Mob mob in mobObjs) { GameNPC myMob = null; string error = string.Empty; // Default Classtype string classtype = ServerProperties.Properties.GAMENPC_DEFAULT_CLASSTYPE; // load template if any INpcTemplate template = null; if(mob.NPCTemplateID != -1) { template = NpcTemplateMgr.GetTemplate(mob.NPCTemplateID); } if (Properties.USE_NPCGUILDSCRIPTS && mob.Guild.Length > 0 && mob.Realm >= 0 && mob.Realm <= (int)eRealm._Last) { Type type = ScriptMgr.FindNPCGuildScriptClass(mob.Guild, (eRealm)mob.Realm); if (type != null) { try { myMob = (GameNPC)type.Assembly.CreateInstance(type.FullName); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("LoadFromDatabase", e); } } } if (myMob == null) { if(template != null && template.ClassType != null && template.ClassType.Length > 0 && template.ClassType != Mob.DEFAULT_NPC_CLASSTYPE && template.ReplaceMobValues) { classtype = template.ClassType; } else if (mob.ClassType != null && mob.ClassType.Length > 0 && mob.ClassType != Mob.DEFAULT_NPC_CLASSTYPE) { classtype = mob.ClassType; } try { myMob = (GameNPC)gasm.CreateInstance(classtype, false); } catch { error = classtype; } if (myMob == null) { foreach (Assembly asm in ScriptMgr.Scripts) { try { myMob = (GameNPC)asm.CreateInstance(classtype, false); error = string.Empty; } catch { error = classtype; } if (myMob != null) break; } if (myMob == null) { myMob = new GameNPC(); error = classtype; } } } if (!allErrors.Contains(error)) allErrors += " " + error + ","; if (myMob != null) { try { myMob.LoadFromDatabase(mob); if (myMob is GameMerchant) { myMerchantCount++; } else { myMobCount++; } } catch (Exception e) { if (log.IsErrorEnabled) log.Error("Failed: " + myMob.GetType().FullName + ":LoadFromDatabase(" + mob.GetType().FullName + ");", e); throw; } myMob.AddToWorld(); } } } if (staticObjs.Count > 0) { foreach (WorldObject item in staticObjs) { GameStaticItem myItem; if (!string.IsNullOrEmpty(item.ClassType)) { myItem = gasm.CreateInstance(item.ClassType, false) as GameStaticItem; if (myItem == null) { foreach (Assembly asm in ScriptMgr.Scripts) { try { myItem = (GameStaticItem)asm.CreateInstance(item.ClassType, false); } catch { } if (myItem != null) break; } if (myItem == null) myItem = new GameStaticItem(); } } else myItem = new GameStaticItem(); myItem.LoadFromDatabase(item); myItem.AddToWorld(); // if (!myItem.AddToWorld()) // log.ErrorFormat("Failed to add the item to the world: {0}", myItem.ToString()); } } foreach (BindPoint point in bindPoints) { AddArea(new Area.BindArea("bind point", point)); } if (myMobCount + myItemCount + myMerchantCount + myBindCount > 0) { if (log.IsInfoEnabled) log.Info(String.Format("Region: {0} ({1}) loaded {2} mobs, {3} merchants, {4} items {5} bindpoints, from DB ({6})", Description, ID, myMobCount, myMerchantCount, myItemCount, myBindCount, TimeManager.Name)); log.Debug("Used Memory: " + GC.GetTotalMemory(false) / 1024 / 1024 + "MB"); if (allErrors != string.Empty) log.Error("Error loading the following NPC ClassType(s), GameNPC used instead:" + allErrors.TrimEnd(',')); Thread.Sleep(0); // give up remaining thread time to other resources } Interlocked.Add(ref mobCount, myMobCount); Interlocked.Add(ref merchantCount, myMerchantCount); Interlocked.Add(ref itemCount, myItemCount); Interlocked.Add(ref bindCount, myBindCount); }
/// <summary> /// Override because mobs shouldn't respawn in Adventure wings. /// </summary> public override void LoadFromDatabase(Mob[] mobObjs, ref long mobCount, ref long merchantCount, ref long itemCount, ref long bindCount) { base.LoadFromDatabase(mobObjs, ref mobCount, ref merchantCount, ref itemCount, ref bindCount); // Set respawn to false foreach(GameNPC mob in GetMobsInsideInstance(true)) { mob.RespawnInterval = -1; } }
/// <summary> /// Load from Database override to clone objects from original Region. /// Loads Objects, Mobs, Areas from Database using "SkinID" /// </summary> public override void LoadFromDatabase(Mob[] mobObjs, ref long mobCount, ref long merchantCount, ref long itemCount, ref long bindCount) { if (!LoadObjects) return; Assembly gasm = Assembly.GetAssembly(typeof(GameServer)); var staticObjs = GameServer.Database.SelectObjects<WorldObject>("Region = " + Skin); var areaObjs = GameServer.Database.SelectObjects<DBArea>("Region = " + Skin); int count = mobObjs.Length + staticObjs.Count; if (count > 0) PreAllocateRegionSpace(count + 100); int myItemCount = staticObjs.Count; int myMobCount = 0; int myMerchantCount = 0; string allErrors = string.Empty; if (mobObjs.Length > 0) { foreach (Mob mob in mobObjs) { GameNPC myMob = null; string error = string.Empty; // Default Classtype string classtype = ServerProperties.Properties.GAMENPC_DEFAULT_CLASSTYPE; // load template if any INpcTemplate template = null; if(mob.NPCTemplateID != -1) { template = NpcTemplateMgr.GetTemplate(mob.NPCTemplateID); } if (mob.Guild.Length > 0 && mob.Realm >= 0 && mob.Realm <= (int)eRealm._Last) { Type type = ScriptMgr.FindNPCGuildScriptClass(mob.Guild, (eRealm)mob.Realm); if (type != null) { try { myMob = (GameNPC)type.Assembly.CreateInstance(type.FullName); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("LoadFromDatabase", e); } } } if (myMob == null) { if(template != null && template.ClassType != null && template.ClassType.Length > 0 && template.ClassType != Mob.DEFAULT_NPC_CLASSTYPE && template.ReplaceMobValues) { classtype = template.ClassType; } else if (mob.ClassType != null && mob.ClassType.Length > 0 && mob.ClassType != Mob.DEFAULT_NPC_CLASSTYPE) { classtype = mob.ClassType; } try { myMob = (GameNPC)gasm.CreateInstance(classtype, false); } catch { error = classtype; } if (myMob == null) { foreach (Assembly asm in ScriptMgr.Scripts) { try { myMob = (GameNPC)asm.CreateInstance(classtype, false); error = string.Empty; } catch { error = classtype; } if (myMob != null) break; } if (myMob == null) { myMob = new GameNPC(); error = classtype; } } } if (!allErrors.Contains(error)) allErrors += " " + error + ","; if (myMob != null) { try { Mob clone = (Mob)mob.Clone(); clone.AllowAdd = false; clone.AllowDelete = false; clone.Region = this.ID; myMob.LoadFromDatabase(clone); if (myMob is GameMerchant) { myMerchantCount++; } else { myMobCount++; } } catch (Exception e) { if (log.IsErrorEnabled) log.Error("Failed: " + myMob.GetType().FullName + ":LoadFromDatabase(" + mob.GetType().FullName + ");", e); throw; } myMob.AddToWorld(); } } } if (staticObjs.Count > 0) { foreach (WorldObject item in staticObjs) { WorldObject itemclone = (WorldObject)item.Clone(); itemclone.AllowAdd = false; itemclone.AllowDelete = false; itemclone.Region = this.ID; GameStaticItem myItem; if (!string.IsNullOrEmpty(itemclone.ClassType)) { myItem = gasm.CreateInstance(itemclone.ClassType, false) as GameStaticItem; if (myItem == null) { foreach (Assembly asm in ScriptMgr.Scripts) { try { myItem = (GameStaticItem)asm.CreateInstance(itemclone.ClassType, false); } catch { } if (myItem != null) break; } if (myItem == null) myItem = new GameStaticItem(); } } else myItem = new GameStaticItem(); myItem.AddToWorld(); } } int areaCnt = 0; // Add missing area foreach(DBArea area in areaObjs) { // Don't bind in instance. if(area.ClassType.Equals("DOL.GS.Area+BindArea")) continue; // clone DB object. DBArea newDBArea = ((DBArea)area.Clone()); newDBArea.AllowAdd = false; newDBArea.Region = this.ID; // Instantiate Area with cloned DB object and add to region try { AbstractArea newArea = (AbstractArea)gasm.CreateInstance(newDBArea.ClassType, false); newArea.LoadFromDatabase(newDBArea); newArea.Sound = newDBArea.Sound; newArea.CanBroadcast = newDBArea.CanBroadcast; newArea.CheckLOS = newDBArea.CheckLOS; this.AddArea(newArea); areaCnt++; } catch { log.Warn("area type " + area.ClassType + " cannot be created, skipping"); continue; } } if (myMobCount + myItemCount + myMerchantCount > 0) { if (log.IsInfoEnabled) log.Info(String.Format("AdventureWingInstance: {0} ({1}) loaded {2} mobs, {3} merchants, {4} items, {5}/{6} areas from DB ({7})", Description, ID, myMobCount, myMerchantCount, myItemCount, areaCnt, areaObjs.Count, TimeManager.Name)); log.Debug("Used Memory: " + GC.GetTotalMemory(false) / 1024 / 1024 + "MB"); if (allErrors != string.Empty) log.Error("Error loading the following NPC ClassType(s), GameNPC used instead:" + allErrors.TrimEnd(',')); Thread.Sleep(0); // give up remaining thread time to other resources } mobCount += myMobCount; merchantCount += myMerchantCount; itemCount += myItemCount; }