public override void Init(MyObjectBuilder_EntityBase objectBuilder) { SyncFlag = true; /// Wee need to get the character subtype, before passing init to base classes so the components can be properly initialized.. MyObjectBuilder_Character characterOb = (MyObjectBuilder_Character)objectBuilder; Render.ColorMaskHsv = characterOb.ColorMaskHSV; Vector3 colorMask = Render.ColorMaskHsv; /// This will retrieve definition and set the subtype for the character GetModelAndDefinition(characterOb, out m_characterModel, out m_characterDefinition, ref colorMask); base.UseNewAnimationSystem = m_characterDefinition.UseNewAnimationSystem; if (UseNewAnimationSystem) { //// Create default layer. //AnimationController.Controller.DeleteAllLayers(); //var animationLayer = AnimationController.Controller.CreateLayer("Body"); //// Build an animation node for each animation subtype. //// VRAGE TODO: this is just temporary for testing the new animation system //foreach (var animationNameSubType in m_characterDefinition.AnimationNameToSubtypeName) //{ // string animSubType = animationNameSubType.Value; // MyAnimationDefinition animationDefinition = null; // if (animationLayer.FindNode(animSubType) == null && TryGetAnimationDefinition(animSubType, out animationDefinition)) // { // MyModel modelAnimation = VRage.Game.Models.MyModels.GetModelOnlyAnimationData(animationDefinition.AnimationModel); // if (modelAnimation != null && animationDefinition.ClipIndex < modelAnimation.Animations.Clips.Count) // { // VRage.Animations.MyAnimationClip clip = modelAnimation.Animations.Clips[animationDefinition.ClipIndex]; // var animationState = new VRage.Animations.MyAnimationStateMachineNode(animSubType, clip); // animationLayer.AddNode(animationState); // } // } //} AnimationController.Clear(); MyStringHash animSubtypeNameHash = MyStringHash.GetOrCompute(m_characterDefinition.AnimationController); MyAnimationControllerDefinition animControllerDef = MyDefinitionManager.Static.GetDefinition<MyAnimationControllerDefinition>(animSubtypeNameHash); if (animControllerDef != null) { AnimationController.InitFromDefinition(animControllerDef); } } if (Render.ColorMaskHsv != colorMask) // color mask is set by definition of model Render.ColorMaskHsv = colorMask; /// Set the subtype from the definition characterOb.SubtypeName = m_characterDefinition.Id.SubtypeName; base.Init(objectBuilder); SyncObject.MarkPhysicsDirty(); m_currentAnimationChangeDelay = 0; SoundComp = new MyCharacterSoundComponent(); RadioBroadcaster.WantsToBeEnabled = characterOb.EnableBroadcasting && Definition.VisibleOnHud; Init(new StringBuilder(characterOb.DisplayName), m_characterDefinition.Model, null, null); NeedsUpdate = MyEntityUpdateEnum.EACH_FRAME | MyEntityUpdateEnum.EACH_10TH_FRAME | MyEntityUpdateEnum.EACH_100TH_FRAME; PositionComp.LocalAABB = new BoundingBox(-new Vector3(0.3f, 0.0f, 0.3f), new Vector3(0.3f, 1.8f, 0.3f)); m_currentLootingCounter = characterOb.LootingCounter; if (m_currentLootingCounter <= 0) UpdateCharacterPhysics(!characterOb.AIMode); m_currentMovementState = characterOb.MovementState; if (Physics != null && Physics.CharacterProxy != null) { switch (m_currentMovementState) { case MyCharacterMovementEnum.Falling: case MyCharacterMovementEnum.Flying: Physics.CharacterProxy.SetState(HkCharacterStateType.HK_CHARACTER_IN_AIR); break; case MyCharacterMovementEnum.Jump: Physics.CharacterProxy.SetState(HkCharacterStateType.HK_CHARACTER_JUMPING); break; case MyCharacterMovementEnum.Ladder: case MyCharacterMovementEnum.LadderDown: case MyCharacterMovementEnum.LadderUp: Physics.CharacterProxy.SetState(HkCharacterStateType.HK_CHARACTER_CLIMBING); break; default: Physics.CharacterProxy.SetState(HkCharacterStateType.HK_CHARACTER_ON_GROUND); break; } } InitAnimations(); ValidateBonesProperties(); CalculateTransforms(0); if (m_currentLootingCounter > 0) { InitDeadBodyPhysics(); if (m_currentMovementState != MyCharacterMovementEnum.Died) SetCurrentMovementState(MyCharacterMovementEnum.Died); SwitchAnimation(MyCharacterMovementEnum.Died, false); } InitInventory(characterOb); Physics.Enabled = true; SetHeadLocalXAngle(characterOb.HeadAngle.X); SetHeadLocalYAngle(characterOb.HeadAngle.Y); Render.InitLight(m_characterDefinition); Render.InitJetpackThrusts(m_characterDefinition); m_useAnimationForWeapon = MyPerGameSettings.CheckUseAnimationInsteadOfIK(); m_lightEnabled = characterOb.LightEnabled; Physics.LinearVelocity = characterOb.LinearVelocity; if (Physics.CharacterProxy != null) { Physics.CharacterProxy.ContactPointCallbackEnabled = true; Physics.CharacterProxy.ContactPointCallback += RigidBody_ContactPointCallback; } Render.UpdateLightProperties(m_currentLightPower); // Setup first person view for local player from previous state before die. IsInFirstPersonView = MySession.Static.Settings.Enable3rdPersonView == false || (m_localCharacterWasInThirdPerson != null ? characterOb.IsInFirstPersonView && !m_localCharacterWasInThirdPerson.Value : characterOb.IsInFirstPersonView); m_breath = new MyCharacterBreath(this); Debug.Assert(m_currentLootingCounter <= 0 || m_currentLootingCounter > 0); m_broadcastingNotification = new MyHudNotification(); m_notEnoughStatNotification = new MyHudNotification(MyCommonTexts.NotificationStatNotEnough, disappearTimeMs: 1000, font: MyFontEnum.Red, level: MyNotificationLevel.Important); if (InventoryAggregate != null) InventoryAggregate.Init(); UseDamageSystem = true; if (characterOb.EnabledComponents == null) { characterOb.EnabledComponents = new List<string>(); } foreach (var componentName in m_characterDefinition.EnabledComponents) { if (characterOb.EnabledComponents.All(x => x != componentName)) characterOb.EnabledComponents.Add(componentName); } foreach (var componentName in characterOb.EnabledComponents) { Tuple<Type, Type> componentType; if (MyCharacterComponentTypes.CharacterComponents.TryGetValue(MyStringId.GetOrCompute(componentName), out componentType)) { MyEntityComponentBase component = Activator.CreateInstance(componentType.Item1) as MyEntityComponentBase; Components.Add(componentType.Item2, component); } } if (m_characterDefinition.UsesAtmosphereDetector) { AtmosphereDetectorComp = new MyAtmosphereDetectorComponent(); AtmosphereDetectorComp.InitComponent(true, this); } bool hasGases = Definition.SuitResourceStorage.Count > 0; var sinkData = new List<MyResourceSinkInfo>(); var sourceData = new List<MyResourceSourceInfo>(); if (hasGases) { OxygenComponent = new MyCharacterOxygenComponent(); Components.Add(OxygenComponent); OxygenComponent.Init(characterOb); OxygenComponent.AppendSinkData(sinkData); OxygenComponent.AppendSourceData(sourceData); } m_suitBattery = new MyBattery(this); m_suitBattery.Init(characterOb.Battery, sinkData, sourceData); if (hasGases) { OxygenComponent.CharacterGasSink = m_suitBattery.ResourceSink; OxygenComponent.CharacterGasSource = m_suitBattery.ResourceSource; } sinkData.Clear(); sinkData.Add( new MyResourceSinkInfo { ResourceTypeId = MyResourceDistributorComponent.ElectricityId, MaxRequiredInput = MyEnergyConstants.REQUIRED_INPUT_LIFE_SUPPORT + MyEnergyConstants.REQUIRED_INPUT_CHARACTER_LIGHT, RequiredInputFunc = ComputeRequiredPower }); if (hasGases) { sinkData.Add(new MyResourceSinkInfo { ResourceTypeId = MyCharacterOxygenComponent.OxygenId, MaxRequiredInput = (OxygenComponent.OxygenCapacity + (!OxygenComponent.NeedsOxygenFromSuit ? Definition.OxygenConsumption : 0f)) * Definition.OxygenConsumptionMultiplier * VRage.Game.MyEngineConstants.UPDATE_STEPS_PER_SECOND / 100f, RequiredInputFunc = () => (OxygenComponent.HelmetEnabled ? Definition.OxygenConsumption : 0f) * Definition.OxygenConsumptionMultiplier * VRage.Game.MyEngineConstants.UPDATE_STEPS_PER_SECOND / 100f }); } SinkComp.Init( MyStringHash.GetOrCompute("Utility"), sinkData); SinkComp.CurrentInputChanged += delegate { SetPowerInput(SinkComp.CurrentInputByType(MyResourceDistributorComponent.ElectricityId)); }; SinkComp.TemporaryConnectedEntity = this; SuitRechargeDistributor = new MyResourceDistributorComponent(); SuitRechargeDistributor.AddSource(m_suitBattery.ResourceSource); SuitRechargeDistributor.AddSink(SinkComp); SinkComp.Update(); bool isJetpackAvailable = !MySession.Static.Battle; isJetpackAvailable = isJetpackAvailable && (m_characterDefinition.Jetpack != null); if (isJetpackAvailable) { JetpackComp = new MyCharacterJetpackComponent(); JetpackComp.Init(characterOb); } WeaponPosition = new MyCharacterWeaponPositionComponent(); Components.Add(WeaponPosition); WeaponPosition.Init(characterOb); InitWeapon(characterOb.HandWeapon); if (Definition.RagdollBonesMappings.Count > 0) CreateBodyCapsulesForHits(Definition.RagdollBonesMappings); else m_bodyCapsuleInfo.Clear(); PlayCharacterAnimation(Definition.InitialAnimation, MyBlendOption.Immediate, MyFrameOption.JustFirstFrame, 0.0f); m_savedHealth = characterOb.Health; m_savedPlayer = new Sandbox.Game.World.MyPlayer.PlayerId(characterOb.PlayerSteamId, characterOb.PlayerSerialId); NeedsUpdate |= MyEntityUpdateEnum.BEFORE_NEXT_FRAME; // TODO: Get rid of after after the character will be initialized properly from objectBuilder IsPromoted = characterOb.IsPromoted; m_previousLinearVelocity = characterOb.LinearVelocity; if (ControllerInfo.IsLocallyControlled()) { m_localHeadTransform.Value = new MyTransform(Vector3.Zero); m_localHeadTransformTool.Value = new MyTransform(Vector3.Zero); } CheckExistingStatComponent(); }
protected static void OnSyncCapacitySuccess(MyBattery battery, float remainingCapacity) { battery.SyncCapacitySuccess(remainingCapacity); }
public MySyncBattery(MyBattery battery) { m_battery = battery; }