diff --git a/Campofinale/Game/Factory/Components/FComponentCache.cs b/Campofinale/Game/Factory/Components/FComponentCache.cs index 3b347f1..e76407d 100644 --- a/Campofinale/Game/Factory/Components/FComponentCache.cs +++ b/Campofinale/Game/Factory/Components/FComponentCache.cs @@ -61,7 +61,7 @@ namespace Campofinale.Game.Factory.Components public bool IsFull() { - int maxItems = items.Count * 100; + int maxItems = items.Count * 50; int count = 0; foreach (var item in items) { @@ -75,7 +75,7 @@ namespace Campofinale.Game.Factory.Components int remaining = count; foreach (var item in items) { - int space = 100-item.count; + int space = 50-item.count; if (item.id==id) { if (space >= remaining) diff --git a/Campofinale/Game/Factory/FactoryChapter.cs b/Campofinale/Game/Factory/FactoryChapter.cs index e25563b..7ce8b26 100644 --- a/Campofinale/Game/Factory/FactoryChapter.cs +++ b/Campofinale/Game/Factory/FactoryChapter.cs @@ -24,7 +24,7 @@ namespace Campofinale.Game.Factory ScFactorySyncChapter chapter = new() { ChapterId = chapterId, - Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds() / 1000, + Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(), Blackboard = new() { Power = new() @@ -40,11 +40,12 @@ namespace Campofinale.Game.Factory { LastDay = new() { - + }, Other = new() { - InPowerBuilding = 1 + InPowerBuilding = nodes.FindAll(n=>n.lastPowered==true).Count, + } }, PinBoard = new() @@ -75,7 +76,7 @@ namespace Campofinale.Game.Factory Current = 0, Max = sceneGrade.bandwidth, TravelPoleMax = sceneGrade.travelPoleLimit, - + BattleCurrent = 0, BattleMax = sceneGrade.battleBuildingLimit, }, @@ -152,10 +153,12 @@ namespace Campofinale.Game.Factory maps.Add(new ScdFactorySyncMap() { MapId = ResourceManager.strIdNumTable.chapter_map_id.dic[mapId], + Wires = { GetWires() - } + }, + }); return maps; } @@ -181,7 +184,8 @@ namespace Campofinale.Game.Factory { Index = i, FromComId = compA, - ToComId = compB + ToComId = compB, + }); addedConnections.Add(key); @@ -243,6 +247,9 @@ namespace Campofinale.Game.Factory case FactoryOpType.MoveItemBagToCache: MoveItemBagToCache(op, seq); break; + case FactoryOpType.MoveItemCacheToBag: + MoveItemCacheToBag(op, seq); + break; case FactoryOpType.ChangeProducerMode: ChangeProducerMode(op, seq); break; @@ -255,6 +262,9 @@ namespace Campofinale.Game.Factory case FactoryOpType.DismantleBoxConveyor: DismantleBoxConveyor(op, seq); break; + case FactoryOpType.UseHealTowerPoint: + //TODO + break; case FactoryOpType.SetTravelPoleDefaultNext: FactoryNode travelNode = GetNodeByCompId(op.SetTravelPoleDefaultNext.ComponentId); travelNode.GetComponent().defaultNext = op.SetTravelPoleDefaultNext.DefaultNext; @@ -283,7 +293,7 @@ namespace Campofinale.Game.Factory ScFactoryOpRet ret = new() { RetCode = FactoryOpRetCode.Fail, - + }; GetOwner().Send(ScMsgId.ScFactoryOpRet, ret, seq); } @@ -315,6 +325,49 @@ namespace Campofinale.Game.Factory GetOwner().Send(new PacketScFactoryOpRet(GetOwner(), 0, op), seq); } + public void MoveItemCacheToBag(CsFactoryOp op, ulong seq) + { + var move = op.MoveItemCacheToBag; + FComponentCache cacheComp = GetCompById(move.ComponentId); + if (cacheComp != null) + { + ItemCount cacheItem = cacheComp.items[move.CacheGridIndex]; + Item gridItem = null; + GetOwner().inventoryManager.items.bag.TryGetValue(move.GridIndex, out gridItem); + if (gridItem == null) + { + GetOwner().inventoryManager.items.bag.Add(move.GridIndex, new Item(ownerId,cacheItem.id,cacheItem.count)); + cacheItem.id = ""; + cacheItem.count = 0; + + } + else + { + if(gridItem.id == cacheItem.id) + { + int availableSpace = 50 - gridItem.amount; + if(cacheItem.count > availableSpace) + { + gridItem.amount += availableSpace; + cacheItem.count-= availableSpace; + } + else + { + gridItem.amount += cacheItem.count; + cacheItem.id = ""; + cacheItem.count = 0; + } + } + else + { + //TODO Swap + } + + } + } + GetOwner().inventoryManager.items.UpdateBagInventoryPacket(); + GetOwner().Send(new PacketScFactoryOpRet(GetOwner(), 0, op), seq); + } public void MoveItemBagToCache(CsFactoryOp op, ulong seq) { var move = op.MoveItemBagToCache; @@ -327,7 +380,7 @@ namespace Campofinale.Game.Factory { if(cacheComp.items[move.CacheGridIndex].id == "" || cacheComp.items[move.CacheGridIndex].id == gridItem.id) { - int canAdd = 100 - cacheComp.items[move.CacheGridIndex].count; + int canAdd = 50 - cacheComp.items[move.CacheGridIndex].count; if (canAdd >= gridItem.amount) { @@ -385,7 +438,7 @@ namespace Campofinale.Game.Factory { ChapterId = chapterId, MapId = nodeRem.mapId, - Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds() / 1000, + Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(), Wires = { GetWires() @@ -468,7 +521,7 @@ namespace Campofinale.Game.Factory { ChapterId = chapterId, MapId = GetNodeByCompId(nodeFrom.compId).mapId, - Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds() / 1000, + Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(), Wires = { GetWires() @@ -552,7 +605,6 @@ namespace Campofinale.Game.Factory public void PlaceConveyor(CsFactoryOp op, ulong seq) { var placeConveyor = op.PlaceConveyor; - Logger.Print($"'PlaceConveyor': {JsonConvert.SerializeObject(placeConveyor)}"); v++; uint nodeId = v; List points = new(); diff --git a/Campofinale/Game/Factory/FactoryManager.cs b/Campofinale/Game/Factory/FactoryManager.cs index e902f83..5d6eb69 100644 --- a/Campofinale/Game/Factory/FactoryManager.cs +++ b/Campofinale/Game/Factory/FactoryManager.cs @@ -72,6 +72,7 @@ namespace Campofinale.Game.Factory public void SendFactoryHsSync() { if (!player.Initialized) return; + if (player.GetCurrentChapter() == "") return; long curtimestamp = DateTime.UtcNow.ToUnixTimestampMilliseconds(); ScFactoryHsSync hs = new() diff --git a/Campofinale/Game/Factory/FactoryNode.cs b/Campofinale/Game/Factory/FactoryNode.cs index bd653fa..0b9c58e 100644 --- a/Campofinale/Game/Factory/FactoryNode.cs +++ b/Campofinale/Game/Factory/FactoryNode.cs @@ -78,6 +78,15 @@ namespace Campofinale.Game.Factory } } + public FactoryBuildingTable GetBuildingTable() + { + ResourceManager.factoryBuildingTable.TryGetValue(templateId, out FactoryBuildingTable table); + if (table == null) + { + table = new FactoryBuildingTable(); + } + return table; + } public void UpdatePortManager(FactoryChapter chapter,FComponentPortManager manager) { if (ResourceManager.factoryBuildingTable.TryGetValue(templateId, out FactoryBuildingTable table)) @@ -213,7 +222,6 @@ namespace Campofinale.Game.Factory conveyorComp.items.Add(i); i.tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(); conveyorComp.lastPopTms = i.tms; - Logger.Print("Spawning item in conveyor: " + conveyorComp.lastPopTms); return true; } else @@ -250,7 +258,6 @@ namespace Campofinale.Game.Factory if (originalPorts == null || originalPorts.Count == 0) return transformedPorts; - // Ottieni la posizione e rotazione base dall'oggetto FMesh mesh = GetMesh(); if (mesh.points.Count < 2) return transformedPorts; @@ -258,7 +265,6 @@ namespace Campofinale.Game.Factory Vector3f objectPosition = mesh.points[0]; float objectRotationY = direction.y % 360f; - // Ottieni le dimensioni originali FactoryBuildingTable table; if (!ResourceManager.factoryBuildingTable.TryGetValue(templateId, out table)) return transformedPorts; @@ -300,7 +306,6 @@ namespace Campofinale.Game.Factory transformedPort.trans.position = transformedPos; - // Rotazione della porta transformedPort.trans.rotation = new Vector3f( originalPort.trans.rotation.x, (originalPort.trans.rotation.y + objectRotationY) % 360f, @@ -381,6 +386,8 @@ namespace Campofinale.Game.Factory { InPower = InPower(), NeedInPower = true, + PowerCost= GetBuildingTable().bandwidth, + PowerCostShow= GetBuildingTable().bandwidth, }, NodeType = (int)nodeType, diff --git a/Campofinale/Game/SceneManager.cs b/Campofinale/Game/SceneManager.cs index 799dc2a..b185c34 100644 --- a/Campofinale/Game/SceneManager.cs +++ b/Campofinale/Game/SceneManager.cs @@ -27,8 +27,18 @@ namespace Campofinale.Game } public void Update() { - if (GetCurScene()!=null) - GetCurScene().UpdateShowEntities(); + if (GetCurScene() != null) + { + try + { + GetCurScene().UpdateShowEntities(); + } + catch(Exception e) + { + + } + } + } public Entity GetEntity(ulong guid) { diff --git a/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs b/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs index 6ca8531..121ea0e 100644 --- a/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs +++ b/Campofinale/Packets/Cs/HandleCsCharPotentialUnlock.cs @@ -15,6 +15,7 @@ namespace Campofinale.Packets.Cs Character character = session.chars.Find(c => c.guid == req.CharObjId); if (character != null) { + character.potential=req.Level; //TODO consume Item ID diff --git a/Campofinale/Packets/Cs/HandleCsGachaTenPullReq.cs b/Campofinale/Packets/Cs/HandleCsGachaTenPullReq.cs index 407d1b5..41e7f26 100644 --- a/Campofinale/Packets/Cs/HandleCsGachaTenPullReq.cs +++ b/Campofinale/Packets/Cs/HandleCsGachaTenPullReq.cs @@ -19,107 +19,6 @@ namespace Campofinale.Packets.Cs CsGachaTenPullReq req = packet.DecodeBody(); session.gachaManager.upSeqId = packet.csHead.UpSeqid; session.gachaManager.DoGacha(req.GachaPoolId, 10); - /* Random rng = new Random(); - List chars = new List(); - const double prob6Star = 0.008; // 0.8% - const double prob5Star = 0.08; // 8% - const double fiftyfifty = 0.50; // 50% - GachaCharPoolTable table = ResourceManager.gachaCharPoolTable[req.GachaPoolId]; - GachaCharPoolContentTable content = ResourceManager.gachaCharPoolContentTable[req.GachaPoolId]; - int sixstarcount = 0; - int fivestarcount = 0; - List fiveStars = content.list.FindAll(c => c.starLevel == 5); - List sixStars = content.list.FindAll(c => c.starLevel == 6); - int fiveStarGuaranteedIndex = new Random().Next(9); - for (int i=0; i < 10; i++) - { - double roll = rng.NextDouble(); - double fifty = rng.NextDouble(); - - if (roll < prob6Star) - { - sixstarcount++; - - if (table.upCharIds.Count > 0) - { - if (fifty >= fiftyfifty) - { - chars.Add(ResourceManager.characterTable[table.upCharIds[0]].charId); - } - else - { - chars.Add(sixStars[new Random().Next(sixStars.Count - 1)].charId); - } - - } - else - { - chars.Add(sixStars[new Random().Next(sixStars.Count - 1)].charId); - } - } - else if (roll < prob6Star + prob5Star || fiveStarGuaranteedIndex == i) - { - fivestarcount++; - if(table.upCharIds.Count > 1) - { - if(fifty >= fiftyfifty) - { - chars.Add(ResourceManager.characterTable[table.upCharIds[1]].charId); - } - else - { - chars.Add(fiveStars[new Random().Next(fiveStars.Count - 1)].charId); - } - - } - else - { - chars.Add(fiveStars[new Random().Next(fiveStars.Count-1)].charId); - } - - } - else - { - chars.Add(ResourceManager.characterTable.Values.ToList().FindAll(c=>c.rarity == 4)[new Random().Next(ResourceManager.characterTable.Values.ToList().FindAll(c => c.rarity == 4).Count - 1)].charId); - } - - } - ScGachaSyncPullResult result = new ScGachaSyncPullResult() - { - GachaPoolId=req.GachaPoolId, - GachaType=req.GachaType, - - OriResultIds = - { - }, - Star5GotCount= fivestarcount, - Star6GotCount= sixstarcount, - FinalResults = - { - - }, - UpGotCount= fivestarcount+ sixstarcount, - - }; - foreach(string ch in chars) - { - bool exist = session.chars.Find(c => c.id == ch) != null; - result.OriResultIds.Add(ch); - result.FinalResults.Add(new ScdGachaFinalResult() - { - IsNew= !exist, - ItemId=ch, - - }); - } - - - //session.Send(Packet.EncodePacket((int)CsMessageId.CsGachaTenPullReq, req)); - - session.Send(ScMessageId.ScGachaSyncPullResult, result); */ - // session.Send(CsMessageId.CsGachaEnd, new Empty()); - // session.Send(ScMessageId.ScGachaBegin, new Empty()); - } } diff --git a/Campofinale/Packets/Cs/HandleCsMoveObjectMove.cs b/Campofinale/Packets/Cs/HandleCsMoveObjectMove.cs index dafe2a2..276a787 100644 --- a/Campofinale/Packets/Cs/HandleCsMoveObjectMove.cs +++ b/Campofinale/Packets/Cs/HandleCsMoveObjectMove.cs @@ -12,6 +12,7 @@ namespace Campofinale.Packets.Cs public static void Handle(Player session, CsMsgId cmdId, Packet packet) { CsMoveObjectMove req = packet.DecodeBody(); + if (session.sceneLoadState != Player.SceneLoadState.OK) return; foreach (var moveInfo in req.MoveInfo) { diff --git a/Campofinale/Packets/Cs/HandleCsSceneRepatriate.cs b/Campofinale/Packets/Cs/HandleCsSceneRepatriate.cs index 75b40ad..d6e2917 100644 --- a/Campofinale/Packets/Cs/HandleCsSceneRepatriate.cs +++ b/Campofinale/Packets/Cs/HandleCsSceneRepatriate.cs @@ -1,5 +1,7 @@ using Campofinale.Network; +using Campofinale.Packets.Sc; using Campofinale.Protocol; +using Campofinale.Resource; namespace Campofinale.Packets.Cs { @@ -30,6 +32,7 @@ namespace Campofinale.Packets.Cs } // Not correctly fixed, need to find the issue - SuikoAkari // No idea how pass_through_data is used, it's not part of the packet sent by the official server + session.Send(new PacketScSelfSceneInfo(session, SelfInfoReasonType.SlrReviveRest)); session.Send(ScMsgId.ScSceneRepatriate, new ScSceneRepatriate() { SceneNumId = session.savedSaveZone.sceneNumId, diff --git a/Campofinale/Packets/Cs/HandleCsSceneRest.cs b/Campofinale/Packets/Cs/HandleCsSceneRest.cs index ad7f36e..00649a8 100644 --- a/Campofinale/Packets/Cs/HandleCsSceneRest.cs +++ b/Campofinale/Packets/Cs/HandleCsSceneRest.cs @@ -12,7 +12,7 @@ namespace Campofinale.Packets.Cs public static void Handle(Player session, CsMsgId cmdId, Packet packet) { CsSceneRest req = packet.DecodeBody(); - + if (session.sceneLoadState == Player.SceneLoadState.Loading) return; ScSceneRevival revival = new() { diff --git a/Campofinale/Packets/Cs/HandleCsSceneTeleport.cs b/Campofinale/Packets/Cs/HandleCsSceneTeleport.cs index b4c77b6..6a85ee1 100644 --- a/Campofinale/Packets/Cs/HandleCsSceneTeleport.cs +++ b/Campofinale/Packets/Cs/HandleCsSceneTeleport.cs @@ -1,6 +1,7 @@ using Campofinale.Network; using Campofinale.Protocol; using Campofinale.Utils; +using static Campofinale.Resource.ResourceManager; namespace Campofinale.Packets.Cs { @@ -15,7 +16,7 @@ namespace Campofinale.Packets.Cs if (session.curSceneNumId != req.SceneNumId) { session.EnterScene(req.SceneNumId, new Resource.ResourceManager.Vector3f(req.Position), new Resource.ResourceManager.Vector3f(req.Rotation)); - /* ScSceneTeleport t = new() + ScSceneTeleport t = new() { TeleportReason = req.TeleportReason, PassThroughData = req.PassThroughData, @@ -23,7 +24,7 @@ namespace Campofinale.Packets.Cs Rotation = req.Rotation, SceneNumId = req.SceneNumId, }; - session.Send(ScMsgId.ScSceneTeleport, t);*/ + session.Send(ScMsgId.ScSceneTeleport, t); } else { @@ -41,6 +42,9 @@ namespace Campofinale.Packets.Cs TpUuid= (ulong)id }; session.curSceneNumId = t.SceneNumId; + session.position = new Vector3f(req.Position); + session.rotation = new Vector3f(req.Rotation); + session.sceneLoadState = Player.SceneLoadState.Loading; session.Send(ScMsgId.ScSceneTeleport, t); } diff --git a/Campofinale/Packets/Cs/HandleCsSceneTeleportFinish.cs b/Campofinale/Packets/Cs/HandleCsSceneTeleportFinish.cs new file mode 100644 index 0000000..110a647 --- /dev/null +++ b/Campofinale/Packets/Cs/HandleCsSceneTeleportFinish.cs @@ -0,0 +1,19 @@ +using Campofinale.Network; +using Campofinale.Protocol; +using Campofinale.Utils; +using static Campofinale.Resource.ResourceManager; + +namespace Campofinale.Packets.Cs +{ + public class HandleCsSceneTeleportFinish + { + + [Server.Handler(CsMsgId.CsSceneTeleportFinish)] + public static void Handle(Player session, CsMsgId cmdId, Packet packet) + { + CsSceneTeleportFinish req = packet.DecodeBody(); + session.sceneLoadState=Player.SceneLoadState.OK; + } + + } +} diff --git a/Campofinale/Packets/Sc/PacketScFactoryModifyChapterNodes.cs b/Campofinale/Packets/Sc/PacketScFactoryModifyChapterNodes.cs index d34a9d9..85a3409 100644 --- a/Campofinale/Packets/Sc/PacketScFactoryModifyChapterNodes.cs +++ b/Campofinale/Packets/Sc/PacketScFactoryModifyChapterNodes.cs @@ -11,7 +11,7 @@ namespace Campofinale.Packets.Sc ScFactoryModifyChapterNodes edit = new() { ChapterId = chapterId, - Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds()/1000, + Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(), Nodes = { node.ToProto() @@ -24,7 +24,7 @@ namespace Campofinale.Packets.Sc ScFactoryModifyChapterNodes edit = new() { ChapterId = chapterId, - Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds() / 1000, + Tms = DateTime.UtcNow.ToUnixTimestampMilliseconds(), RemoveNodes = { nodeId diff --git a/Campofinale/Packets/Sc/PacketScFactoryOpRet.cs b/Campofinale/Packets/Sc/PacketScFactoryOpRet.cs index edec84a..d406b6f 100644 --- a/Campofinale/Packets/Sc/PacketScFactoryOpRet.cs +++ b/Campofinale/Packets/Sc/PacketScFactoryOpRet.cs @@ -78,6 +78,10 @@ namespace Campofinale.Packets.Sc }; } + if(op.OpType == FactoryOpType.MoveItemCacheToBag) + { + proto.MoveItemCacheToBag = new(); + } proto.Index=op.Index; SetData(ScMsgId.ScFactoryOpRet, proto); }