/// <summary> /// The callback function that will remove this bag after some time /// </summary> protected override void OnTick() { GameStaticItem item = (GameStaticItem)m_actionSource; //remove this object from the world after some time item.Delete(); }
/// <summary> /// Send Game Static Item depending on last refresh time /// </summary> /// <param name="player"></param> /// <param name="nowTicks"></param> private static void UpdatePlayerItems(GamePlayer player, long nowTicks) { // Get All Static Item in Range var objs = player.GetItemsInRadius(WorldMgr.OBJ_UPDATE_DISTANCE).Cast <GameStaticItem>().Where(i => i != null && i.IsVisibleTo(player)).ToArray(); try { // Clean Cache foreach (var objEntry in player.Client.GameObjectUpdateArray) { var objKey = objEntry.Key; GameObject obj = WorldMgr.GetRegion(objKey.Item1).GetObject(objKey.Item2); // We have a Static Item in cache that is not in vincinity if (obj is GameStaticItem && !objs.Contains((GameStaticItem)obj) && (nowTicks - objEntry.Value) >= GetPlayerItemUpdateInterval) { long dummy; player.Client.GameObjectUpdateArray.TryRemove(objKey, out dummy); } } } catch (Exception e) { if (log.IsErrorEnabled) { log.ErrorFormat("Error while Cleaning Static Item cache for Player : {0}, Exception : {1}", player.Name, e); } } try { // Now Send remaining objects foreach (GameStaticItem lobj in objs) { GameStaticItem staticObj = lobj; // Get last update time long lastUpdate; if (player.Client.GameObjectUpdateArray.TryGetValue(new Tuple <ushort, ushort>(staticObj.CurrentRegionID, (ushort)staticObj.ObjectID), out lastUpdate)) { // This Static Object Needs Update if ((nowTicks - lastUpdate) >= GetPlayerItemUpdateInterval) { player.Client.Out.SendObjectCreate(staticObj); } } else { // Not in cache, Object entering in range, sending update will add it to cache player.Client.Out.SendObjectCreate(staticObj); } } } catch (Exception e) { if (log.IsErrorEnabled) { log.ErrorFormat("Error while updating Static Item for Player : {0}, Exception : {1}", player.Name, e); } } }
/// <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` = @Region", new QueryParameter("@Region", Skin)); var areaObjs = GameServer.Database.SelectObjects <DBArea>("`Region` = @Region", new QueryParameter("@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 (!string.IsNullOrWhiteSpace(mob.ClassType) && 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 = 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 = 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 = 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; 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($"AdventureWingInstance: {Description} ({ID}) loaded {myMobCount} mobs, {myMerchantCount} merchants, {myItemCount} items, {areaCnt}/{areaObjs.Count} areas from DB ({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; }
public ItemDistEntry(GameStaticItem o, int distance) { Item = o; Distance = distance; }
/// <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> /// 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; }