diff --git a/src/Perpetuum/Modules/DrillerModule.cs b/src/Perpetuum/Modules/DrillerModule.cs index 2c091b19b..7a86e7ebe 100644 --- a/src/Perpetuum/Modules/DrillerModule.cs +++ b/src/Perpetuum/Modules/DrillerModule.cs @@ -2,6 +2,7 @@ using Perpetuum.EntityFramework; using Perpetuum.ExportedTypes; using Perpetuum.Items; +using Perpetuum.Log; using Perpetuum.Modules.ModuleProperties; using Perpetuum.Players; using Perpetuum.Services.MissionEngine.MissionTargets; @@ -160,6 +161,9 @@ public virtual void DoExtractMinerals(IZone zone) extractedMaterials .AddRange(RareMaterialHandler.GenerateRareMaterials(materialInfo.EntityDefault.Definition)); CreateBeam(terrainLock.Location, BeamState.AlignToTerrain); + + List<(string resourceName, int quantity)> resourceStats = new List<(string resourceName, int quantity)>(); + using (TransactionScope scope = Db.CreateTransaction()) { Debug.Assert(ParentRobot != null, "ParentRobot != null"); @@ -173,13 +177,6 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer Debug.Assert(player != null, "player != null"); foreach (ItemInfo material in extractedMaterials) { - Db.Query() - .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@resource_name", material.EntityDefault.Name) - .SetParameter("@quantity", material.Quantity) - .ExecuteNonQuery(); - Item item = (Item)Factory.CreateWithRandomEID(material.Definition); item.Owner = Owner; @@ -195,6 +192,8 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer drilledQuantity, terrainLock.Location)); player.Zone?.MiningLogHandler.EnqueueMiningLog(drilledMineralDefinition, drilledQuantity); + + resourceStats.Add((material.EntityDefault.Name, material.Quantity)); } //save container @@ -204,6 +203,23 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer scope.Complete(); } + foreach (var (resourceName, quantity) in resourceStats) + { + try + { + Db.Query() + .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@resource_name", resourceName) + .SetParameter("@quantity", quantity) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } + } + GenerateHeat(EffectType.effect_excavator); } diff --git a/src/Perpetuum/Modules/HarvesterModule.cs b/src/Perpetuum/Modules/HarvesterModule.cs index 898c05e1d..de89c8f7b 100644 --- a/src/Perpetuum/Modules/HarvesterModule.cs +++ b/src/Perpetuum/Modules/HarvesterModule.cs @@ -2,6 +2,7 @@ using Perpetuum.EntityFramework; using Perpetuum.ExportedTypes; using Perpetuum.Items; +using Perpetuum.Log; using Perpetuum.Modules.ModuleProperties; using Perpetuum.Players; using Perpetuum.Services.MissionEngine.MissionTargets; @@ -104,6 +105,9 @@ public virtual void DoHarvesting(IZone zone) { TerrainLock terrainLock = GetLock().ThrowIfNotType(ErrorCodes.InvalidLockType); CreateBeam(terrainLock.Location, BeamState.AlignToTerrain); + + List<(string resourceName, int quantity)> resourceStats = new List<(string resourceName, int quantity)>(); + using (TransactionScope scope = Db.CreateTransaction()) { using (new TerrainUpdateMonitor(zone)) @@ -130,13 +134,6 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer foreach (ItemInfo extractedMaterial in harvestedPlants) { - Db.Query() - .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@resource_name", extractedMaterial.EntityDefault.Name) - .SetParameter("@quantity", extractedMaterial.Quantity) - .ExecuteNonQuery(); - Item item = (Item)Factory.CreateWithRandomEID(extractedMaterial.Definition); item.Owner = Owner; item.Quantity = extractedMaterial.Quantity; @@ -145,6 +142,8 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer int extractedQuantity = extractedMaterial.Quantity; player.MissionHandler.EnqueueMissionEventInfo(new HarvestPlantEventInfo(player, extractedHarvestDefinition, extractedQuantity, terrainLock.Location)); player.Zone?.HarvestLogHandler.EnqueueHarvestLog(extractedHarvestDefinition, extractedQuantity); + + resourceStats.Add((extractedMaterial.EntityDefault.Name, extractedMaterial.Quantity)); } container.Save(); @@ -154,6 +153,23 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer } } + foreach (var (resourceName, quantity) in resourceStats) + { + try + { + Db.Query() + .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@resource_name", resourceName) + .SetParameter("@quantity", quantity) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } + } + GenerateHeat(EffectType.effect_excavator); } } diff --git a/src/Perpetuum/Modules/LargeDrillerModule.cs b/src/Perpetuum/Modules/LargeDrillerModule.cs index a07b08dbb..53ff7653a 100644 --- a/src/Perpetuum/Modules/LargeDrillerModule.cs +++ b/src/Perpetuum/Modules/LargeDrillerModule.cs @@ -2,6 +2,7 @@ using Perpetuum.EntityFramework; using Perpetuum.ExportedTypes; using Perpetuum.Items; +using Perpetuum.Log; using Perpetuum.Players; using Perpetuum.Services.MissionEngine.MissionTargets; using Perpetuum.Zones; @@ -45,6 +46,8 @@ public override void DoExtractMinerals(IZone zone) int emptyTilesCounter = 0; + List<(string resourceName, int quantity)> resourceStats = new List<(string resourceName, int quantity)>(); + // make it parallel foreach (Position position in mineralPositions) { @@ -72,13 +75,6 @@ public override void DoExtractMinerals(IZone zone) Debug.Assert(player != null, "player != null"); foreach (ItemInfo material in extractedMaterials) { - Db.Query() - .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@resource_name", material.EntityDefault.Name) - .SetParameter("@quantity", material.Quantity) - .ExecuteNonQuery(); - Item item = (Item)Factory.CreateWithRandomEID(material.Definition); item.Owner = Owner; item.Quantity = material.Quantity; @@ -93,6 +89,8 @@ public override void DoExtractMinerals(IZone zone) drilledQuantity, position)); player.Zone?.MiningLogHandler.EnqueueMiningLog(drilledMineralDefinition, drilledQuantity); + + resourceStats.Add((material.EntityDefault.Name, material.Quantity)); } //save container @@ -102,7 +100,22 @@ public override void DoExtractMinerals(IZone zone) scope.Complete(); } - + foreach (var (resourceName, quantity) in resourceStats) + { + try + { + Db.Query() + .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@resource_name", resourceName) + .SetParameter("@quantity", quantity) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } + } } GenerateHeat(EffectType.effect_excavator, 6); diff --git a/src/Perpetuum/Modules/LargeHarvesterModule.cs b/src/Perpetuum/Modules/LargeHarvesterModule.cs index 10045ab18..e2d1bb6f7 100644 --- a/src/Perpetuum/Modules/LargeHarvesterModule.cs +++ b/src/Perpetuum/Modules/LargeHarvesterModule.cs @@ -2,6 +2,7 @@ using Perpetuum.EntityFramework; using Perpetuum.ExportedTypes; using Perpetuum.Items; +using Perpetuum.Log; using Perpetuum.Players; using Perpetuum.Services.MissionEngine.MissionTargets; using Perpetuum.Zones; @@ -33,6 +34,8 @@ public override void DoHarvesting(IZone zone) int emptyTilesCounter = 0; + List<(string resourceName, int quantity)> resourceStats = new List<(string resourceName, int quantity)>(); + // make it parallel foreach (Position position in mineralPositions) { @@ -72,13 +75,6 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer foreach (ItemInfo extractedMaterial in harvestedPlants) { - Db.Query() - .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@resource_name", extractedMaterial.EntityDefault.Name) - .SetParameter("@quantity", extractedMaterial.Quantity) - .ExecuteNonQuery(); - Item item = (Item)Factory.CreateWithRandomEID(extractedMaterial.Definition); item.Owner = Owner; item.Quantity = extractedMaterial.Quantity; @@ -87,6 +83,8 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer int extractedQuantity = extractedMaterial.Quantity; player.MissionHandler.EnqueueMissionEventInfo(new HarvestPlantEventInfo(player, extractedHarvestDefinition, extractedQuantity, position)); player.Zone?.HarvestLogHandler.EnqueueHarvestLog(extractedHarvestDefinition, extractedQuantity); + + resourceStats.Add((extractedMaterial.EntityDefault.Name, extractedMaterial.Quantity)); } container.Save(); @@ -97,6 +95,23 @@ remoteControlledCreature.CommandRobot is Player ownerPlayer } } + foreach (var (resourceName, quantity) in resourceStats) + { + try + { + Db.Query() + .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@resource_name", resourceName) + .SetParameter("@quantity", quantity) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } + } + GenerateHeat(EffectType.effect_excavator, 6); } } diff --git a/src/Perpetuum/Players/Player.cs b/src/Perpetuum/Players/Player.cs index 50599485d..71b1b1911 100644 --- a/src/Perpetuum/Players/Player.cs +++ b/src/Perpetuum/Players/Player.cs @@ -1092,10 +1092,9 @@ private void HandlePlayerDead(IZone zone, Unit killer) PlayerDeathLogger.Log.Write(zone, this, killer); - bool wasInsured = InsuranceHelper.CheckInsuranceOnDeath(Eid, Definition); - - if (!Session.AccessLevel.IsAdminOrGm() && !IsBlessed) + if (!Session.AccessLevel.IsAdminOrGm() && !IsBlessed || (!IsBlessed && LootHelper.Roll(0.05))) { + bool wasInsured = InsuranceHelper.CheckInsuranceOnDeath(Eid, Definition); DieAndDropLoot(zone, killer, character, dockingBase, wasInsured); } else @@ -1147,7 +1146,7 @@ private void ResurrectAndLoseCargo(IZone zone, Character character, DockingBase Repository.Delete(item); } - foreach (Module module in Modules.Where(m => LootHelper.Roll(0.1))) + foreach (Module module in Modules.Where(m => LootHelper.Roll(0.25))) { module.Parent = robotInventory.Eid; Repository.Delete(module); diff --git a/src/Perpetuum/Services/Looting/LootContainer.cs b/src/Perpetuum/Services/Looting/LootContainer.cs index 638deca36..d70020bc5 100644 --- a/src/Perpetuum/Services/Looting/LootContainer.cs +++ b/src/Perpetuum/Services/Looting/LootContainer.cs @@ -6,6 +6,7 @@ using Perpetuum.ExportedTypes; using Perpetuum.Groups.Gangs; using Perpetuum.Items; +using Perpetuum.Log; using Perpetuum.Players; using Perpetuum.Players.ExtensionMethods; using Perpetuum.Robots; @@ -602,18 +603,26 @@ public LootContainer Build(IZone zone, Position position) .Where(x => x.ItemInfo.EntityDefault.CategoryFlags.IsCategory(CategoryFlags.cf_reactor_plasma)) .GroupBy(x => x.ItemInfo.EntityDefault.Name); - foreach (IGrouping plasma in plasmaByType) + using (TransactionScope scope = Db.CreateTransaction()) { - using (TransactionScope scope = Db.CreateTransaction()) + foreach (IGrouping plasma in plasmaByType) { - Db.Query() - .CommandText("exec sp_RecordPlasmaGathered @gathered_on, @plasma_type, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@plasma_type", plasma.Key) - .SetParameter("@quantity", plasma.Sum(x => x.ItemInfo.Quantity)) - .ExecuteNonQuery(); - scope.Complete(); + try + { + Db.Query() + .CommandText("exec sp_RecordPlasmaGathered @gathered_on, @plasma_type, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@plasma_type", plasma.Key) + .SetParameter("@quantity", plasma.Sum(x => x.ItemInfo.Quantity)) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } } + + scope.Complete(); } IEnumerable> fragmentsByType = container @@ -621,21 +630,30 @@ public LootContainer Build(IZone zone, Position position) .Where(x => x.ItemInfo.EntityDefault.CategoryFlags.IsAny(new CategoryFlags[] { CategoryFlags.cf_robotshards, CategoryFlags.cf_research_kits, CategoryFlags.cf_reactor_cores })) .GroupBy(x => x.ItemInfo.EntityDefault.Name); - foreach (IGrouping fragment in fragmentsByType) + using (TransactionScope scope = Db.CreateTransaction()) { - using (TransactionScope scope = Db.CreateTransaction()) + foreach (IGrouping fragment in fragmentsByType) { - Db.Query() - .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") - .SetParameter("@gathered_on", DateTime.UtcNow) - .SetParameter("@resource_name", fragment.Key) - .SetParameter("@quantity", fragment.Sum(x => x.ItemInfo.Quantity)) - .ExecuteNonQuery(); - scope.Complete(); + try + { + Db.Query() + .CommandText("exec sp_RecordResourceGathered @gathered_on, @resource_name, @quantity") + .SetParameter("@gathered_on", DateTime.UtcNow) + .SetParameter("@resource_name", fragment.Key) + .SetParameter("@quantity", fragment.Sum(x => x.ItemInfo.Quantity)) + .ExecuteNonQuery(); + } + catch (Exception ex) + { + Logger.Error(ex.Message); + } } + + scope.Complete(); } zone.UnitService.AddUserUnit(container, position); + return container; } } diff --git a/src/Perpetuum/Services/MarketEngine/MarketAutoOrdersManager.cs b/src/Perpetuum/Services/MarketEngine/MarketAutoOrdersManager.cs index 5fd4ddc73..1e2af67dc 100644 --- a/src/Perpetuum/Services/MarketEngine/MarketAutoOrdersManager.cs +++ b/src/Perpetuum/Services/MarketEngine/MarketAutoOrdersManager.cs @@ -27,12 +27,26 @@ public void Update(TimeSpan time) private void Init() { + _timers.Add(new TimerAction(ConsolidateStatistics, TimeSpan.FromMinutes(15))); _timers.Add(new TimerAction(RecalculatePricesAndRenewOrders, TimeSpan.FromDays(1))); // Debug purposes, do not uncomment + //_timers.Add(new TimerAction(ConsolidateStatistics, TimeSpan.FromMinutes(1))); //_timers.Add(new TimerAction(RecalculatePricesAndRenewOrders, TimeSpan.FromMinutes(1))); } + private void ConsolidateStatistics() + { + using (TransactionScope scope = Db.CreateTransaction()) + { + _ = Db.Query() + .CommandText("exec consolidate_statistics") + .ExecuteNonQuery(); + + scope.Complete(); + } + } + private void RecalculatePricesAndRenewOrders() { using (TransactionScope scope = Db.CreateTransaction()) diff --git a/src/Perpetuum/Services/MarketEngine/MarketOrderRepository.cs b/src/Perpetuum/Services/MarketEngine/MarketOrderRepository.cs index afd6c042f..317e9e98b 100644 --- a/src/Perpetuum/Services/MarketEngine/MarketOrderRepository.cs +++ b/src/Perpetuum/Services/MarketEngine/MarketOrderRepository.cs @@ -1,13 +1,13 @@ -using System; +using Perpetuum.Accounting.Characters; +using Perpetuum.Data; +using System; using System.Collections.Generic; using System.Data; using System.Linq; -using Perpetuum.Accounting.Characters; -using Perpetuum.Data; namespace Perpetuum.Services.MarketEngine { - public interface IMarketOrderRepository : IRepository + public interface IMarketOrderRepository : IRepository { void UpdatePrice(MarketOrder order); void UpdateQuantity(MarketOrder order); @@ -77,7 +77,7 @@ public void Delete(MarketOrder order) public void UpdatePrice(MarketOrder order) { - var expireDate = order.submitted.AddHours(order.duration); + var expireDate = DateTime.Now.AddHours(order.duration);//order.submitted.AddHours(order.duration); var durationRemains = (int)expireDate.Subtract(DateTime.Now).TotalHours; Db.Query().CommandText("update marketitems set price=@price,submitted=@now,duration=@dleft where marketitemid=@ID") @@ -185,12 +185,12 @@ public IEnumerable GetOrdersOnCorporationLeave(Character character) { const string cmd = ORDER_SELECT + @"where submittereid=@characterEID and formembersof is not null"; - return + return Db.Query().CommandText(cmd) .SetParameter("@characterEID", character.Eid) .Execute() .Select(CreateMarketOrderFromRecord); - + } public IEnumerable GetByDefinition(int itemDefinition, long forMembersOf, Market market) @@ -254,16 +254,16 @@ private MarketOrder CreateMarketOrderFromRecord(IDataRecord record) if (record == null) return null; var order = _marketOrderFactory(); - order.id = record.GetValue("marketitemid"); - order.marketEID = record.GetValue("marketeid"); - order.itemEid = record.GetValue("itemeid"); + order.id = record.GetValue("marketitemid"); + order.marketEID = record.GetValue("marketeid"); + order.itemEid = record.GetValue("itemeid"); order.itemDefinition = record.GetValue("itemdefinition"); - order.submitterEID = record.GetValue("submittereid"); - order.submitted = record.GetValue("submitted"); - order.duration = record.GetValue("duration"); - order.isSell = record.GetValue("isSell"); - order.price = record.GetValue("price"); - order.quantity = record.GetValue("quantity"); + order.submitterEID = record.GetValue("submittereid"); + order.submitted = record.GetValue("submitted"); + order.duration = record.GetValue("duration"); + order.isSell = record.GetValue("isSell"); + order.price = record.GetValue("price"); + order.quantity = record.GetValue("quantity"); order.useCorporationWallet = record.GetValue("usecorporationwallet"); order.isVendorItem = record.GetValue("isvendoritem"); order.forMembersOf = record.GetValue("formembersof");