public void OnDisconnect() { try { CharacterTable.Update(this); if (this.myMap != null && this.Client != null && this.Client.GetState() == WorldState.STATE_IN_GAME) { this.DestroyFromMap(); } if (InventoryCache != null) { foreach (var item in InventoryCache.ItemsCache) { if (item.Value.SpeakingItem != null) { SpeakingTable.Add(item.Value.SpeakingItem); SpeakingTable.Cache.Remove(item.Value.SpeakingID); } InventoryItemTable.Items.Remove(item.Key); } } CharacterTable.DelCharacter(this); this.Client = null; } catch (Exception e) { Logger.Error(e); } }
public static void Initialize() { nextPlayerGuid = CharacterTable.getNextGuid(); nextPlayerGuid++; nextItemGuid = InventoryItemTable.getNextGuid(); nextItemGuid++; nextGuildId = GuildTable.getNextGuid(); nextGuildId++; nextMountId = MountTable.getNextGuid(); nextMountId++; nextSpeakingId = SpeakingTable.getNextGuid(); nextSpeakingId++; SpellTable.Load(); ExpFloorTable.Load(); MonsterTable.Load(); ItemTemplateTable.Load(); ItemTemplateTable.LoadItemActions(); ItemSetTable.Load(); DropTable.Load(); TitleTable.Load(); IObjectTemplateTable.Load(); AreaTable.Load(); AreaSubTable.Load(); MapTable.Load(); MapTable.LoadActions(); CellActionTable.Load(); MobGroupFixTable.Load(); BreedTable.Load(); NpcTemplateTable.Load(); NpcTemplateTable.LoadPlaces(); NpcQuestionTable.Load(); NpcReplyTable.Load(); ShopNpcTable.Initialize(); GuildTable.Load(); CharactersGuildTable.Load(); TaxCollectorTable.Load(); PrismeTable.Load(); BidHouseTable.Load(); BidHouseTable.LoadItems(); MountParkTable.Load(); StaticMountTable.Load(); MountTable.Load();//TODO Dynamic load of Character mount ZaapTable.Load(); ZaapiTable.Load(); var Timer = new System.Timers.Timer(1000 * 60 * 25); Timer.Elapsed += delegate(object sender, ElapsedEventArgs e) { Save(); }; Timer.Start(); }
/// <summary> /// Sauvegarde les changements effectués. /// </summary> public static bool Save() { try { lock (mySyncSave) { long StartTime = Environment.TickCount; Logger.Info("World saving ..."); // Execution des requetes lock (mySaveQueue) while (mySaveQueue.Count != 0) { mySaveQueue.Dequeue()(); } lock (GuildTable.Cache) foreach (var Guild in GuildTable.Cache.Values) { Guild.SaveChanges(); GuildTable.Update(Guild); } lock (CharacterTable.myCharacterById) foreach (var Character in CharacterTable.myCharacterById.Values.Where(x => x.myInitialized)) { CharacterTable.Update(Character); } lock (SpeakingTable.Cache) foreach (var Speaking in SpeakingTable.Cache.Values) { SpeakingTable.Add(Speaking); } lock (AreaTable.Cache) foreach (var area in AreaTable.Cache.Values) { AreaTable.Update(area); } lock (AreaSubTable.Cache) foreach (var subarea in AreaSubTable.Cache.Values) { AreaSubTable.Save(subarea); } lock (BidHouseTable.Cache) { var BHI = new List <BidHouseItem>(); foreach (var BH in BidHouseTable.Cache.Values) { BHI.AddRange(BH.getAllEntry()); } BidHouseTable.Update(BHI); } Logger.Info("World saved in " + (Environment.TickCount - StartTime) + "ms"); return(true); } } catch (Exception ex) { Logger.Error("DatabaseEntities::Save() " + ex.ToString()); return(false); } }
public void MoveItem(int Guid, ItemSlotEnum Slot, bool Packet, int Quantity = 1) { var Item = this.get(Guid); // Item inexistant if (Item == null) { return; } // Meme endroit ? if (Item.Slot == Slot) { return; } // Veu equiper un item if (Slot > ItemSlotEnum.SLOT_INVENTAIRE && Slot <= ItemSlotEnum.SLOT_BOUCLIER) { if (Item.Template.Type == 113) { if (this.GetItemInSlot(Slot) == null) { this.Player.Send(new TextInformationMessage(TextInformationTypeEnum.ERREUR, 161)); return; } if (Item.Quantity > 1) { if (Quantity > Item.Quantity) { Quantity = Item.Quantity; } int newQ = Item.Quantity - Quantity; if (newQ > 0) { InventoryItemTable.TryCreateItem(Item.TemplateID, this.Player, newQ, -1, Item.GetStats().ToItemStats()); UpdateObjectquantity(Item, Quantity); } } var EquipedItemB = this.GetItemInSlot(Slot); var SpeakingTestItem = SpeakingTable.Cache.Values.FirstOrDefault(x => x != null && x.LinkedItem == Item.ID && x.Associated == 0); if (SpeakingTestItem != null) { EquipedItemB.SpeakingID = SpeakingTestItem.ID; SpeakingTestItem.Stats = EquipedItemB.GetStats().ToItemStats(); SpeakingTestItem.LinkedItem = EquipedItemB.ID; SpeakingTestItem.Associated = 1; remove(Item.ID); Player.Send(new ObjectRemoveMessage(Item.ID)); Player.Send(new ObjectRefreshMessage(EquipedItemB)); Player.myMap.SendToMap(new ObjectActualiseMessage(Player)); if (Player.Client.GetFight() != null) { Player.Client.GetFight().SendToFight(new ObjectActualiseMessage(Player)); } return; } var ID = DatabaseCache.nextSpeakingId++; String Date = DateTime.Now.Month + "" + DateTime.Now.Day; String InterDate = (DateTime.Now.Month + 3) + "" + DateTime.Now.Day; String Time = DateTime.Now.Hour + "" + DateTime.Now.Minute; Speaking newItem = new Speaking(ID, DateTime.Now.Year, int.Parse(Date), int.Parse(Time), 1, 1, EquipedItemB.Template.Type, EquipedItemB.ID, 0, DateTime.Now.Year, int.Parse(InterDate), int.Parse(Time), DateTime.Now.Year, int.Parse(Date), int.Parse(Time), 1, Item.TemplateID, Item.ID, EquipedItemB.GetStats().ToItemStats()); SpeakingTable.New(newItem); EquipedItemB.SpeakingID = ID; remove(Item.ID); Player.Send(new ObjectRemoveMessage(Item.ID)); Player.Send(new ObjectRefreshMessage(EquipedItemB)); Player.myMap.SendToMap(new ObjectActualiseMessage(Player)); if (Player.Client.GetFight() != null) { Player.Client.GetFight().SendToFight(new ObjectActualiseMessage(Player)); } return; } // Il peu placer l'item dans le slot desiré ? if (!ItemTemplateModel.CanPlaceInSlot(ItemTemplateTable.GetTemplate(Item.TemplateID).ItemType, Slot)) { return; } // Level requis if (ItemTemplateTable.GetTemplate(Item.TemplateID).Level > Player.Level) { if (Packet) { Player.Send(new ObjectMoveFailMessage(ObjectMoveFailReasonEnum.REASON_LEVEL_REQUIRED)); } return; } if (!ItemTemplateTable.GetTemplate(Item.TemplateID).Criterions.Equals("") && !ConditionParser.validConditions(this.Player, ItemTemplateTable.GetTemplate(Item.TemplateID).Criterions)) { this.Player.Send(new ImMessage("119|43")); return; } var EquipedItem = this.GetItemInSlot(Slot); // Si item deja equipé dans le slot if (EquipedItem != null) { // Deplacement dans l'inventaire Player.GetStats().UnMerge(EquipedItem.GetStats()); this.Player.Life -= EquipedItem.GetStats().GetTotal(EffectEnum.AddVitalite); EquipedItem.Position = -1; Player.Send(new ObjectMoveSucessMessage(EquipedItem.ID, -1)); } // Template deja equipé if (this.HasTemplateEquiped(Item.TemplateID)) { if (Packet) { Player.Send(new ObjectMoveFailMessage(ObjectMoveFailReasonEnum.REASON_ALREADY_EQUIPED)); } return; } /*var simlarItem = this.getSimilarInventoryItem(Item); * if (simlarItem != null) * { * this.UpdateObjectquantity(simlarItem, simlarItem.Quantity + Item.Quantity); * remove(Item.ID); * InventoryItemTable.removeItem(Item.ID); * Player.Send(new ObjectRemoveMessage(Item.ID)); * * } * else*/ if (Item.Quantity > 1) { var NewItem = InventoryItemTable.TryCreateItem(Item.TemplateID, this.Player, 1, (short)Slot, Item.Effects); this.UpdateObjectquantity(Item, Item.Quantity - 1); } else { // On modifi la position et fusionne les stats Item.Position = (short)Slot; Player.Send(new ObjectMoveSucessMessage(Item.ID, (short)Slot)); Player.Send(new ObjectMoveSucessMessage(Item.ID, (short)Item.Position)); } if (GetItemInSlot(ItemSlotEnum.SLOT_ARME) != null) { Player.Send(new ObjectTaskMessage(-1)); } Player.GetStats().Merge(Item.GetStats()); this.Player.Life += Item.GetStats().GetTotal(EffectEnum.AddVitalite); this.Player.Life += Item.GetStats().GetTotal(EffectEnum.AddVie); if (Packet) { Player.Client.Send(new AccountStatsMessage(Player)); Player.myMap.SendToMap(new ObjectActualiseMessage(Player)); if (Player.Client.GetFight() != null) { Player.Client.GetFight().SendToFight(new ObjectActualiseMessage(Player)); } } } else { var NeedActualise = false; // Si l'item est equipé, on deduit les stats if (Item.Slot > ItemSlotEnum.SLOT_INVENTAIRE && Item.Slot < ItemSlotEnum.SLOT_BOUCLIER) { // Retire les stats Player.GetStats().UnMerge(Item.GetStats()); this.Player.Life -= Item.GetStats().GetTotal(EffectEnum.AddVitalite); this.Player.Life -= Item.GetStats().GetTotal(EffectEnum.AddVie); if (Player.Life <= 0) { Player.Life = 1; } if (Packet) { Player.Client.Send(new AccountStatsMessage(this.Player)); NeedActualise = true; } } // On tente de fusionner if (!this.TryMergeItem(Item.TemplateID, Item.Effects, Slot, Item.Quantity, Item)) { Item.Position = (short)Slot; if (Packet) { Player.Send(new ObjectMoveSucessMessage(Item.ID, (short)Item.Position)); } } if (NeedActualise) { Player.myMap.SendToMap(new ObjectActualiseMessage(Player)); if (Player.Client.GetFight() != null) { Player.Client.GetFight().SendToFight(new ObjectActualiseMessage(Player)); } } } onMoveItem(Item); }