protected override void OnUpdate() { Entities.WithAll <Item>() .WithStructuralChanges() .ForEach((Entity entity, in OwnerPredictedState itemState, in TriggerPredictedState triggerState, in VelocityPredictedState velocityState) => { if (itemState.Owner != Entity.Null) { return; } if (velocityState.MotionType != MotionType.Dynamic) { return; } if (triggerState.TriggeredEntity == Entity.Null) { return; } var triggeredEntity = triggerState.TriggeredEntity; if (!EntityManager.HasComponent <TriggeredSetting>(triggeredEntity)) { return; } if (!EntityManager.HasComponent <Table>(triggeredEntity)) { return; } var slot = EntityManager.GetComponentData <SlotPredictedState>(triggeredEntity); if (slot.FilledIn == Entity.Null) { ItemAttachUtilities.ItemAttachToOwner(EntityManager, entity, triggeredEntity, Entity.Null); } else { if (!HasComponent <Plate>(slot.FilledIn)) { return; } //食物不能装盘返回 if (!HasComponent <CanDishOut>(entity)) { return; } characterDishOutSystem.DishOut(slot.FilledIn, entity, Entity.Null, quaternion.identity); } }).Run();
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithStructuralChanges() .ForEach((Entity entity, ref TriggerPredictedState triggerState, in SlotPredictedState slotState, in UserCommand command, in TransformPredictedState transformState, in VelocityPredictedState velocityState) => { if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } var worldTick = GetSingleton <WorldTime>().Tick; // FSLog.Info($"CharacterPickupGroundSystem:{pickupState.PickupedEntity},{triggerState.TriggeredEntity}"); //pickup item var pickupedEntity = slotState.FilledIn; var triggeredEntity = triggerState.TriggeredEntity; if (pickupedEntity == Entity.Null && triggeredEntity != Entity.Null) { if (!EntityManager.HasComponent <Item>(triggeredEntity)) { return; } FSLog.Info($"PickUpItem,command ,triggerState.TriggeredEntity:{triggeredEntity},worldTick:{worldTick}"); ItemAttachUtilities.ItemAttachToOwner(EntityManager, triggeredEntity, entity, Entity.Null); triggerState.TriggeredEntity = Entity.Null; } //putdown item else if (pickupedEntity != Entity.Null && triggeredEntity == Entity.Null) { FSLog.Info( $"PutDownItem,tick:{command.RenderTick},worldTick:{worldTick},velocityState.Linear:{velocityState.Linear}"); var ownerSlot = EntityManager.GetComponentData <SlotSetting>(entity); // var offset = EntityManager.GetComponentData<OffsetSetting>(pickupedEntity); ItemAttachUtilities.ItemDetachFromOwner(EntityManager, pickupedEntity, entity, transformState.Position + math.mul(transformState.Rotation, ownerSlot.Pos), transformState.Rotation, velocityState.Linear); } }).Run();
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithName("CharacterPickupSink") .WithStructuralChanges() .ForEach((Entity characterEntity, in TriggerPredictedState triggerState, in SlotPredictedState slotState, in UserCommand command) => { //未按键返回 if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } //已拾取物品返回 var pickupEntity = slotState.FilledIn; if (pickupEntity != Entity.Null) { return; } //没有触发返回 var triggerEntity = triggerState.TriggeredEntity; if (triggerEntity == Entity.Null) { return; } //触发的不是洗碗池返回 if (!EntityManager.HasComponent <TableSink>(triggerEntity)) { return; } //slot为空返回 var slot = EntityManager.GetComponentData <MultiSlotPredictedState>(triggerEntity); if (slot.Value.IsEmpty()) { return; } //拾取盘子 ItemAttachUtilities.ItemAttachToOwner(EntityManager, slot.Value.GetTail(), characterEntity, triggerEntity); }).Run();
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithName("CharacterServeSystem") .WithStructuralChanges() .ForEach((Entity entity, in SlotPredictedState slotState, in ServeSetting setting, in TriggerPredictedState triggerState, in UserCommand command) => { if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } var pickupedEntity = slotState.FilledIn; if (pickupedEntity == Entity.Null) { return; } var triggerEntity = triggerState.TriggeredEntity; if (triggerEntity == Entity.Null) { return; } if (!EntityManager.HasComponent <TableServe>(triggerEntity)) { return; } var slot = EntityManager.GetComponentData <SlotPredictedState>(triggerEntity); if (slot.FilledIn != Entity.Null) { return; } if (!EntityManager.HasComponent <Plate>(pickupedEntity)) { return; } ItemAttachUtilities.ItemAttachToOwner(EntityManager, pickupedEntity, triggerEntity, entity); }).Run();
protected override void OnUpdate() { var entity = GetSingletonEntity <SpawnItemArray>(); var requests = EntityManager.GetBuffer <SpawnItemRequest>(entity); // FSLog.Info($"Spwan item :{requests.Length}"); if (requests.Length == 0) { return; } var array = requests.ToNativeArray(Allocator.Temp); requests.Clear(); foreach (var t in array) { var spawnItem = t; if (spawnItem.DeferFrame > 0) { spawnItem.DeferFrame = spawnItem.DeferFrame - 1; requests.Add(spawnItem); continue; } FSLog.Info($"Spawn item:{spawnItem.Type}"); var e = ItemCreateUtilities.CreateItem(EntityManager, spawnItem.Type, spawnItem.OffPos, spawnItem.Owner); if (e == Entity.Null) { continue; } if (spawnItem.Owner == Entity.Null) { continue; } ItemAttachUtilities.ItemAttachToOwner(EntityManager, e, spawnItem.Owner, Entity.Null); } array.Dispose(); }
protected override void OnUpdate() { var entity = GetSingletonEntity <SpawnItemArray>(); var requests = EntityManager.GetBuffer <SpawnItemRequest>(entity); // FSLog.Info($"Spwan item :{requests.Length}"); if (requests.Length == 0) { return; } var array = requests.ToNativeArray(Allocator.Temp); requests.Clear(); var query = EntityManager.CreateEntityQuery(ComponentType.ReadOnly <PredictedItem>()); var predictedItemEntities = query.ToEntityArray(Allocator.TempJob); foreach (var t in array) { var spawnItem = t; if (spawnItem.DeferFrame > 0) { spawnItem.DeferFrame = spawnItem.DeferFrame - 1; requests.Add(spawnItem); continue; } //排除掉重返的request var isRepeatRequest = false; foreach (var predictedItemEntity in predictedItemEntities) { var predictedItem = EntityManager.GetComponentData <PredictedItem>(predictedItemEntity); var ownerState = EntityManager.GetComponentData <OwnerPredictedState>(predictedItemEntity); if (predictedItem.StartTick == spawnItem.StartTick && ownerState.Owner == spawnItem.Owner) { isRepeatRequest = true; ItemAttachUtilities.ItemAttachToOwner(EntityManager, predictedItemEntity, spawnItem.Owner, Entity.Null); break; } } if (isRepeatRequest) { continue; } FSLog.Info($"Spawn item:{spawnItem.Type}"); var e = ItemCreateUtilities.CreateItem(EntityManager, spawnItem.Type, spawnItem.OffPos, spawnItem.Owner); if (e == Entity.Null) { continue; } EntityManager.AddComponentData(e, new PredictedItem() { StartTick = spawnItem.StartTick }); EntityManager.AddComponentData(e, new UIObject()); if (spawnItem.Owner == Entity.Null) { continue; } ItemAttachUtilities.ItemAttachToOwner(EntityManager, e, spawnItem.Owner, Entity.Null); } predictedItemEntities.Dispose(); array.Dispose(); }
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithName("CharacterPickupTable") .WithStructuralChanges() .ForEach((Entity entity, in TriggerPredictedState triggerState, in SlotPredictedState slotState, in TransformPredictedState transformState, in UserCommand command) => { //未按键返回 if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } FSLog.Info($"CharacterPickupTable1"); //没有触发返回 var triggerEntity = triggerState.TriggeredEntity; if (triggerEntity == Entity.Null) { return; } //触发的不是Table返回 if (!EntityManager.HasComponent <Table>(triggerEntity)) { return; } var worldTick = GetSingleton <WorldTime>().Tick; var slot = EntityManager.GetComponentData <SlotPredictedState>(triggerEntity); var pickupEntity = slotState.FilledIn; FSLog.Info($"worldTick:{worldTick},CharacterPickupTableSystem Update," + $"PickupedEntity:{pickupEntity}," + $"triggerEntity:{triggerEntity},slot.FiltInEntity:{slot.FilledIn}"); if (pickupEntity == Entity.Null && slot.FilledIn != Entity.Null) { //the item is not sliced,can't pickup if (EntityManager.HasComponent <Unsliced>(slot.FilledIn) && EntityManager.HasComponent <ProgressPredictState>(slot.FilledIn)) { var itemSliceState = EntityManager.GetComponentData <ProgressPredictState>(slot.FilledIn); FSLog.Info($"PickUpItem,itemSliceState.CurSliceTick:{itemSliceState.CurTick}"); if (itemSliceState.CurTick > 0) { return; } } FSLog.Info($"PickUpItem,command tick:{command.RenderTick},worldTick:{worldTick}"); ItemAttachUtilities.ItemAttachToOwner(EntityManager, slot.FilledIn, entity, triggerEntity); } else if (pickupEntity != Entity.Null && slot.FilledIn == Entity.Null) { ItemAttachUtilities.ItemAttachToOwner(EntityManager, pickupEntity, triggerEntity, entity, float3.zero, transformState.Rotation); } }).Run();
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithName("CharacterPutDownPot") .WithStructuralChanges() .ForEach((Entity entity, in TriggerPredictedState triggerState, in SlotPredictedState slotState, in UserCommand command) => { //未按键返回 if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } //没有拾取返回 var pickupEntity = slotState.FilledIn; if (pickupEntity == Entity.Null) { return; } //拾取的道具不是unCooked返回 if (!EntityManager.HasComponent <Uncooked>(pickupEntity)) { return; } //没有触发返回 var triggerEntity = triggerState.TriggeredEntity; if (triggerEntity == Entity.Null) { return; } //触发的不是Table返回 if (!EntityManager.HasComponent <Table>(triggerEntity)) { return; } //Table上没有道具返回 var slot = EntityManager.GetComponentData <SlotPredictedState>(triggerEntity); if (slot.FilledIn == Entity.Null) { return; } //Table上不是锅返回 if (!EntityManager.HasComponent <Pot>(slot.FilledIn)) { return; } var potEntity = slot.FilledIn; var potSlotState = EntityManager.GetComponentData <SlotPredictedState>(potEntity); //锅已烧糊 if (EntityManager.HasComponent <Burnt>(potEntity)) { return; } //锅已满 if (potSlotState.FilledIn != Entity.Null) { return; } //锅设置为满 var potState = EntityManager.GetComponentData <PotPredictedState>(potEntity); potState.State = PotState.Full; EntityManager.SetComponentData(potEntity, potState); //放入锅里 ItemAttachUtilities.ItemAttachToOwner(EntityManager, pickupEntity, potEntity, entity); }).Run();
protected override void OnUpdate() { /* var flyingCount = flyingItemQuery.CalculateEntityCount(); * * var flyingPos = * new NativeArray<float3>(flyingCount, Allocator.TempJob, NativeArrayOptions.UninitializedMemory); * * var initialFlyingPosJobHandle = Entities * .WithName("InitialFlyingPosJobHandle") * .ForEach((int entityInQueryIndex, in TransformPredictedState transformState) => * { * flyingPos[entityInQueryIndex] = transformState.Position; * }) * .ScheduleParallel(Dependency); * * * //开始接飞来的食物 * Dependency = Entities * .WithAll<ServerEntity, Character>() * .WithName("CharacterPickupFlyingBegin") * .WithReadOnly(flyingPos) * .ForEach((Entity entity, * ref TransformPredictedState transformState, * in CharacterMoveSetting moveSetting, * in SlotPredictedState slotState) => * { * var pickupEntity = slotState.FilledIn; * * if (pickupEntity != Entity.Null) * return; * * var closestPos = float3.zero; * var closestDistance = 5.0f; * for (var i = 0; i < flyingPos.Length; i++) * { * var itemPos = flyingPos[i]; * var distance = math.distance(itemPos, transformState.Position); * * if (distance >= closestDistance) * continue; * * closestDistance = distance; * closestPos = itemPos; * } * * if (closestPos.Equals(float3.zero)) * return; * * var dir = math.normalize(closestPos - transformState.Position); * dir.y = 0; * var fromRotation = transformState.Rotation; * var toRotation = quaternion.LookRotationSafe(dir, math.up()); * * var angle = Quaternion.Angle(fromRotation, toRotation); * transformState.Rotation = Quaternion.RotateTowards(fromRotation, toRotation, * math.abs(angle - 180.0f) < float.Epsilon * ? -moveSetting.RotationVelocity * : moveSetting.RotationVelocity); * * }).ScheduleParallel(initialFlyingPosJobHandle); * * CompleteDependency();*/ //结束接飞来的食物 Entities .WithAll <ServerEntity, Character>() .WithName("CharacterPickupFlyingEnd") .WithStructuralChanges() .ForEach((Entity entity, ref TriggerPredictedState triggerState, ref TransformPredictedState transformState, in SlotPredictedState slotState) => { var pickupEntity = slotState.FilledIn; if (pickupEntity != Entity.Null || triggerState.TriggeredEntity == Entity.Null) { return; } if (!HasComponent <Flying>(triggerState.TriggeredEntity)) { return; } if (!HasComponent <Item>(triggerState.TriggeredEntity)) { return; } var item = GetComponent <OwnerPredictedState>(triggerState.TriggeredEntity); // FSLog.Info($"PickUpItem flying,PreOwner:{item.PreOwner},entity:{entity}"); if (item.PreOwner == Entity.Null || item.PreOwner == entity) { return; } // var worldTick = GetSingleton<WorldTime>().Tick; // FSLog.Info($"PickUpItem flying,command tick:{command.RenderTick},worldTick:{worldTick}"); var itemPos = GetComponent <TransformPredictedState>(triggerState.TriggeredEntity); var dir = math.normalize(itemPos.Position - transformState.Position); dir.y = 0; ItemAttachUtilities.ItemAttachToOwner(EntityManager, triggerState.TriggeredEntity, entity, Entity.Null); transformState.Rotation = quaternion.LookRotationSafe(dir, math.up()); triggerState.TriggeredEntity = Entity.Null; }).Run(); // flyingPos.Dispose(); }
protected override void OnUpdate() { Entities .WithAll <ServerEntity>() .WithName("CharacterPickupPlateRecycle") .WithStructuralChanges() .ForEach((Entity characterEntity, in TriggerPredictedState triggerState, in SlotPredictedState slotState, in UserCommand command) => { //未按键返回 if (!command.Buttons.IsSet(UserCommand.Button.Button1)) { return; } //已拾取物品返回 var pickupEntity = slotState.FilledIn; if (pickupEntity != Entity.Null) { return; } //没有触发返回 var triggerEntity = triggerState.TriggeredEntity; if (triggerEntity == Entity.Null) { return; } //触发的不是PlateRecycle返回 if (!EntityManager.HasComponent <TablePlateRecycle>(triggerEntity)) { return; } //slot为空返回 var slot = EntityManager.GetComponentData <MultiSlotPredictedState>(triggerEntity); if (slot.Value.IsEmpty()) { return; } //将盘子叠起来 var count = slot.Value.Count(); var prePlateEntity = Entity.Null; for (var i = 0; i < count; ++i) { slot = EntityManager.GetComponentData <MultiSlotPredictedState>(triggerEntity); var plateEntity = slot.Value.GetTail(); ItemAttachUtilities.ItemAttachToOwner(EntityManager, plateEntity, prePlateEntity == Entity.Null ? characterEntity : prePlateEntity, triggerEntity); prePlateEntity = plateEntity; } }).Run();