public override void DoAction(IEventArgs args) { if (index < list.Count) { for (int i = 0; i < 20; i++) { ItemDrop drop = list[index++]; if (drop.cat == (int)ECategory.Vehicle) { VehicleEntityUtility.CreateNewVehicle(args.GameContext.vehicle, drop.id, args.GameContext.session.commonSession.EntityIdGenerator.GetNextEntityId(), GetGround(drop.pos)); break; } else { args.GameContext.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleObjectEntity((ECategory)drop.cat, drop.id, drop.count, GetGround(drop.pos)); } List <ItemDrop> extra = SingletonManager.Get <FreeItemDrop>().GetExtraItems(drop); foreach (ItemDrop e in extra) { args.GameContext.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleObjectEntity((ECategory)e.cat, e.id, e.count, GetGround(drop.pos)); } if (index >= list.Count) { break; } } } }
public void OnHitVehicle(PlayerEntity srcPlayer, VehicleEntity targetVehicle, IBulletEntity bulletEntity, RaycastHit hit) { if (srcPlayer.gamePlay.IsDead()) { return; } Collider collider = hit.collider; VehiclePartIndex partIndex; var hitBoxFactor = VehicleEntityUtility.GetHitFactor(targetVehicle, collider, out partIndex); var totalDamage = GetBulletDamage(bulletEntity, hitBoxFactor, Vector3.Distance(hit.point, bulletEntity.GunEmitPosition)); var gameData = targetVehicle.GetGameData(); gameData.DecreaseHp(partIndex, totalDamage, srcPlayer.entityKey.Value); srcPlayer.statisticsData.Statistics.TotalDamage += totalDamage; bulletEntity.IsValid = false; srcPlayer.statisticsData.Statistics.ShootingSuccCount++; _logger.DebugFormat("bullet from {0} hit vehicle {1}, part {2}", bulletEntity.OwnerEntityKey, targetVehicle.entityKey.Value, collider.name); ClientEffectFactory.AddHitVehicleEffectEvent(srcPlayer, targetVehicle.entityKey.Value, hit.point, hit.point - targetVehicle.position.Value, hit.normal); }
private float GetVehicleFactor(RaycastHit hit, VehicleEntity target, out VehiclePartIndex partIndex) { Collider collider = hit.collider; var hitBoxFactor = VehicleEntityUtility.GetHitFactor(target, collider, out partIndex); return(hitBoxFactor); }
public void CreateVehicles(IEntityIdGenerator idGenerator) { var vehicles = VehicleEntityUtility.CreateVehicles(_contexts.session.commonSession.RoomInfo.MapId, _contexts.vehicle, idGenerator); foreach (var vehicle in vehicles) { vehicle.isFlagOffline = true; } }
public override void DoAction(IEventArgs args) { UnitPosition up = pos.Select(args); Contexts con = args.GameContext; VehicleEntityUtility.CreateNewVehicle(con.vehicle, FreeUtil.ReplaceInt(carId, args), con.session.commonSession.EntityIdGenerator.GetNextEntityId(), map.position.UnityPositionUtil.ToVector3(up)); }
public void ExecuteCreateVehicle(Contexts contexts) { if (_vehicleCreateRequests.Count > 0) { var req = _vehicleCreateRequests.Dequeue(); var idGenerator = contexts.session.commonSession.EntityIdGenerator; for (int i = 0; i < req.Count; ++i) { var id = idGenerator.GetNextEntityId(); VehicleEntityUtility.CreateNewVehicle(contexts.vehicle, req.VehicleId, id, req.Position); } } }
private void CreateVehicleCmd(PlayerEntity player) { var controlledVehicle = PlayerVehicleUtility.GetControlledVehicle(player, _contexts.vehicle); if (controlledVehicle != null) { var vehicleCmd = VehicleEntityUtility.CreateVehicleCmd(_vehicleCmdGenerator, _contexts.vehicle, player, _simulationTimer.CurrentTime); if (vehicleCmd != null) { controlledVehicle.vehicleCmd.AddLatest(vehicleCmd); } } }
public void OnGamePlay() { if (!loadConfig && dropList.IsEmpty()) { foreach (MapConfigPoints.ID_Point point in MapConfigPoints.current.IDPints) { dropList.AddRange(SingletonManager.Get <FreeItemDrop>().GetDropItems(point.ID, _contexts.session.commonSession.RoomInfo.MapId)); } loadConfig = true; } if (loadConfig && dropList.IsEmpty()) { return; } if (_contexts.player.count > 0 && !loadComplete) { if (index >= dropList.Count) { loadComplete = true; return; } for (int i = 0; i < 20; i++) { ItemDrop drop = dropList[index++]; if (drop.cat == (int)ECategory.Vehicle) { VehicleEntityUtility.CreateNewVehicle(_contexts.vehicle, drop.id, _contexts.session.commonSession.EntityIdGenerator.GetNextEntityId(), GetGround(drop.pos)); break; } else { _contexts.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleObjectEntity((ECategory)drop.cat, drop.id, drop.count, GetGround(drop.pos)); List <ItemDrop> extra = SingletonManager.Get <FreeItemDrop>().GetExtraItems(drop); foreach (ItemDrop e in extra) { _contexts.session.entityFactoryObject.SceneObjectEntityFactory.CreateSimpleObjectEntity((ECategory)e.cat, e.id, e.count, GetGround(drop.pos)); } } } } }
private void DoExplosionDamangeToVehicle(VehicleEntity explodedVehicle, Collider collider, Vector3 explosionCenter) { var vehicle = VehicleEntityUtility.GetVehicleFromChildCollider(collider); if (vehicle == null || vehicle == explodedVehicle || _processedEntities.Contains(vehicle)) { return; } _processedEntities.Add(vehicle); var damage = CalcExplosionDamageToObject(explodedVehicle, vehicle, explosionCenter); var gameData = vehicle.GetGameData(); var indexArray = VehicleIndexHelper.GetAllPartIndexArray(); foreach (var index in indexArray) { gameData.DecreaseHp(index, damage); } //Debug.LogFormat("explosion damange vehicle id {0} damage {1}", vehicle.entityKey.Value.EntityId, damage); _logger.InfoFormat("explosion damange vehicle id {0} damage {1}", vehicle.entityKey.Value.EntityId, damage); }
public void CreateVehicles() { VehicleEntityUtility.CreateVehicles(_contexts.session.commonSession.RoomInfo.MapId, _contexts.vehicle, _contexts.session.commonSession.EntityIdGenerator); }
private static void ResolveOverlapWithVehicle(VehicleContext context, PlayerEntity player, ICharacterControllerContext controller, float deltaTime) { var gamePlay = player.gamePlay; if (gamePlay.IsLifeState(EPlayerLifeState.Alive) && !gamePlay.IsVehicleCollisionState(EVehicleCollisionState.None)) { var vehicle = context.GetEntityWithEntityKey(gamePlay.CollidedVehicleKey); if (vehicle != null && vehicle.hasGameObject) { var transform = vehicle.gameObject.UnityObjWrapper.Value.transform; var forward = transform.forward; var right = transform.right; var rootTransform = player.characterContoller.Value.transform; var playerPosition = rootTransform.position; var vehiclePosition = vehicle.gameObject.UnityObjWrapper.Value.transform.position; var deltaPosition = playerPosition - vehiclePosition; deltaPosition.y = 0; deltaPosition = deltaPosition.normalized; if (deltaPosition.sqrMagnitude < 1E-4f) { if (Mathf.Abs(forward.y) > 0.8) { deltaPosition = right; } else { deltaPosition = forward; } } var moveDirection = Mathf.Abs(forward.y) < 0.8 ? forward : right; var baseDirection = moveDirection; var maxDot = float.NegativeInfinity; //select the best overlap-resolve direction foreach (var angle in _resolveRotateAngle) { var direction = Quaternion.AngleAxis(angle, transform.up) * baseDirection; var dot = Vector3.Dot(direction, deltaPosition); if (dot > maxDot) { moveDirection = direction; maxDot = dot; } } //resolve overlap according to direction const int maxIterator = 2; var velcoity = vehicle.GetLinearVelocity().magnitude; var expectedDistance = velcoity * 0.333f; for (int i = 1; i <= maxIterator; ++i) { moveDirection.y = 0; moveDirection = moveDirection.normalized; //move forward to resolve overlap float resolveDist = 5.5f * i /*+ 0.1f*/; controller.Move(moveDirection * resolveDist, deltaTime); var position = rootTransform.position; if (VehicleEntityUtility.IsPlayerOverlapAtPosition(player, position, UnityLayers.VehicleLayerMask)) { rootTransform.position = playerPosition; continue; } //move backward to close vehicle var backDist = (playerPosition - rootTransform.position); // var backMag = backDist.magnitude; // if (backMag > expectedDistance) // { // var backNorm = backDist.normalized; // backMag = backMag - expectedDistance; // backDist = backMag * backNorm; // } if (backDist.sqrMagnitude > 1E-4f) { controller.Move(backDist, deltaTime); } break; } } gamePlay.CollidedVehicleKey = new EntityKey(); } }