public override bool OnAim(Ray3 aim, ComponentMiner componentMiner, AimState state) { IInventory inventory = componentMiner.Inventory; if (inventory != null) { int activeSlotIndex = inventory.ActiveSlotIndex; if (activeSlotIndex >= 0) { int slotValue = inventory.GetSlotValue(activeSlotIndex); int slotCount = inventory.GetSlotCount(activeSlotIndex); int num = Terrain.ExtractContents(slotValue); int data = Terrain.ExtractData(slotValue); if (num == 191 && slotCount > 0) { if (!m_aimStartTimes.TryGetValue(componentMiner, out double value)) { value = m_subsystemTime.GameTime; m_aimStartTimes[componentMiner] = value; } float num2 = (float)(m_subsystemTime.GameTime - value); float num3 = (float)MathUtils.Remainder(m_subsystemTime.GameTime, 1000.0); Vector3 v = ((componentMiner.ComponentCreature.ComponentBody.IsSneaking ? 0.02f : 0.04f) + 0.25f * MathUtils.Saturate((num2 - 2.1f) / 5f)) * new Vector3 { X = SimplexNoise.OctavedNoise(num3, 2f, 3, 2f, 0.5f), Y = SimplexNoise.OctavedNoise(num3 + 100f, 2f, 3, 2f, 0.5f), Z = SimplexNoise.OctavedNoise(num3 + 200f, 2f, 3, 2f, 0.5f) }; aim.Direction = Vector3.Normalize(aim.Direction + v); switch (state) { case AimState.InProgress: { if (num2 >= 9f) { componentMiner.ComponentCreature.ComponentCreatureSounds.PlayMoanSound(); return(true); } ComponentFirstPersonModel componentFirstPersonModel = componentMiner.Entity.FindComponent <ComponentFirstPersonModel>(); if (componentFirstPersonModel != null) { componentMiner.ComponentPlayer?.ComponentAimingSights.ShowAimingSights(aim.Position, aim.Direction); componentFirstPersonModel.ItemOffsetOrder = new Vector3(-0.1f, 0.15f, 0f); componentFirstPersonModel.ItemRotationOrder = new Vector3(0f, -0.7f, 0f); } componentMiner.ComponentCreature.ComponentCreatureModel.AimHandAngleOrder = 1.2f; componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemOffsetOrder = new Vector3(0f, 0f, 0f); componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemRotationOrder = new Vector3(0f, -0.2f, 0f); if (m_subsystemTime.PeriodicGameTimeEvent(0.10000000149011612, 0.0)) { int draw2 = MathUtils.Min(BowBlock.GetDraw(data) + 1, 15); inventory.RemoveSlotItems(activeSlotIndex, 1); inventory.AddSlotItems(activeSlotIndex, Terrain.MakeBlockValue(num, 0, BowBlock.SetDraw(data, draw2)), 1); } break; } case AimState.Cancelled: inventory.RemoveSlotItems(activeSlotIndex, 1); inventory.AddSlotItems(activeSlotIndex, Terrain.MakeBlockValue(num, 0, BowBlock.SetDraw(data, 0)), 1); m_aimStartTimes.Remove(componentMiner); break; case AimState.Completed: { int draw = BowBlock.GetDraw(data); ArrowBlock.ArrowType?arrowType = BowBlock.GetArrowType(data); if (arrowType.HasValue) { Vector3 vector = componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition + componentMiner.ComponentCreature.ComponentBody.Matrix.Right * 0.3f - componentMiner.ComponentCreature.ComponentBody.Matrix.Up * 0.2f; Vector3 vector2 = Vector3.Normalize(vector + aim.Direction * 10f - vector); float num4 = MathUtils.Lerp(0f, 28f, MathUtils.Pow((float)draw / 15f, 0.75f)); if (componentMiner.ComponentPlayer != null) { num4 *= 0.5f * (componentMiner.ComponentPlayer.ComponentLevel.StrengthFactor - 1f) + 1f; } Vector3 vector3 = Vector3.Zero; if (arrowType == ArrowBlock.ArrowType.WoodenArrow) { vector3 = new Vector3(0.025f, 0.025f, 0.025f); } if (arrowType == ArrowBlock.ArrowType.StoneArrow) { vector3 = new Vector3(0.01f, 0.01f, 0.01f); } int value2 = Terrain.MakeBlockValue(192, 0, ArrowBlock.SetArrowType(0, arrowType.Value)); Vector3 vector4 = Vector3.Normalize(Vector3.Cross(vector2, Vector3.UnitY)); Vector3 v2 = Vector3.Normalize(Vector3.Cross(vector2, vector4)); Vector3 v3 = m_random.Float(0f - vector3.X, vector3.X) * vector4 + m_random.Float(0f - vector3.Y, vector3.Y) * v2 + m_random.Float(0f - vector3.Z, vector3.Z) * vector2; if (m_subsystemProjectiles.FireProjectile(value2, vector, (vector2 + v3) * num4, Vector3.Zero, componentMiner.ComponentCreature) != null) { data = BowBlock.SetArrowType(data, null); m_subsystemAudio.PlaySound("Audio/Bow", 1f, m_random.Float(-0.1f, 0.1f), vector, 3f, autoDelay: true); } } else { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Load an arrow first", Color.White, blinking: true, playNotificationSound: false); } inventory.RemoveSlotItems(activeSlotIndex, 1); int value3 = Terrain.MakeBlockValue(num, 0, BowBlock.SetDraw(data, 0)); inventory.AddSlotItems(activeSlotIndex, value3, 1); int damageCount = 0; if (draw >= 15) { damageCount = 2; } else if (draw >= 4) { damageCount = 1; } componentMiner.DamageActiveTool(damageCount); m_aimStartTimes.Remove(componentMiner); break; } } } } } return(false); }
public void Update(float dt) { CollisionVelocityChange = Vector3.Zero; Velocity += m_totalImpulse; m_totalImpulse = Vector3.Zero; if (m_parentBody != null || m_velocity.LengthSquared() > 9.99999944E-11f || m_directMove != Vector3.Zero) { m_stoppedTime = 0f; } else { m_stoppedTime += dt; if (m_stoppedTime > 0.5f && !Time.PeriodicEvent(0.25, 0.0)) { return; } } Vector3 position = base.Position; TerrainChunk chunkAtCell = m_subsystemTerrain.Terrain.GetChunkAtCell(Terrain.ToCell(position.X), Terrain.ToCell(position.Z)); if (chunkAtCell == null || chunkAtCell.State <= TerrainChunkState.InvalidContents4) { Velocity = Vector3.Zero; return; } m_bodiesCollisionBoxes.Clear(); FindBodiesCollisionBoxes(position, m_bodiesCollisionBoxes); m_movingBlocksCollisionBoxes.Clear(); FindMovingBlocksCollisionBoxes(position, m_movingBlocksCollisionBoxes); if (!MoveToFreeSpace()) { ComponentHealth componentHealth = base.Entity.FindComponent <ComponentHealth>(); if (componentHealth != null) { componentHealth.Injure(1f, null, ignoreInvulnerability: true, "Crushed"); } else { base.Project.RemoveEntity(base.Entity, disposeEntity: true); } return; } if (IsGravityEnabled) { m_velocity.Y -= 10f * dt; if (ImmersionFactor > 0f) { float num = ImmersionFactor * (1f + 0.03f * MathUtils.Sin((float)MathUtils.Remainder(2.0 * m_subsystemTime.GameTime, 6.2831854820251465))); m_velocity.Y += 10f * (1f / Density * num) * dt; } } float num2 = MathUtils.Saturate(AirDrag.X * dt); float num3 = MathUtils.Saturate(AirDrag.Y * dt); m_velocity.X *= 1f - num2; m_velocity.Y *= 1f - num3; m_velocity.Z *= 1f - num2; if (IsWaterDragEnabled && ImmersionFactor > 0f && ImmersionFluidBlock != null) { Vector2?vector = m_subsystemFluidBlockBehavior.CalculateFlowSpeed(Terrain.ToCell(position.X), Terrain.ToCell(position.Y), Terrain.ToCell(position.Z)); Vector3 vector2 = vector.HasValue ? new Vector3(vector.Value.X, 0f, vector.Value.Y) : Vector3.Zero; float num4 = 1f; if (ImmersionFluidBlock.FrictionFactor != 1f) { num4 = ((SimplexNoise.Noise((float)MathUtils.Remainder(6.0 * Time.FrameStartTime + (double)(GetHashCode() % 1000), 1000.0)) > 0.5f) ? ImmersionFluidBlock.FrictionFactor : 1f); } float f = MathUtils.Saturate(WaterDrag.X * num4 * ImmersionFactor * dt); float f2 = MathUtils.Saturate(WaterDrag.Y * num4 * dt); m_velocity.X = MathUtils.Lerp(m_velocity.X, vector2.X, f); m_velocity.Y = MathUtils.Lerp(m_velocity.Y, vector2.Y, f2); m_velocity.Z = MathUtils.Lerp(m_velocity.Z, vector2.Z, f); if (m_parentBody == null && vector.HasValue && !StandingOnValue.HasValue) { if (WaterTurnSpeed > 0f) { float s = MathUtils.Saturate(MathUtils.Lerp(1f, 0f, m_velocity.Length())); Vector2 vector3 = Vector2.Normalize(vector.Value) * s; base.Rotation *= Quaternion.CreateFromAxisAngle(Vector3.UnitY, WaterTurnSpeed * (-1f * vector3.X + 0.71f * vector3.Y) * dt); } if (WaterSwayAngle > 0f) { base.Rotation *= Quaternion.CreateFromAxisAngle(Vector3.UnitX, WaterSwayAngle * (float)MathUtils.Sin((double)(200f / Mass) * m_subsystemTime.GameTime)); } } } if (m_parentBody != null) { Vector3 v = Vector3.Transform(ParentBodyPositionOffset, m_parentBody.Rotation) + m_parentBody.Position - position; m_velocity = ((dt > 0f) ? (v / dt) : Vector3.Zero); base.Rotation = ParentBodyRotationOffset * m_parentBody.Rotation; } StandingOnValue = null; StandingOnBody = null; StandingOnVelocity = Vector3.Zero; Vector3 velocity = m_velocity; float num5 = m_velocity.Length(); if (num5 > 0f) { float x = 0.45f * MathUtils.Min(BoxSize.X, BoxSize.Y, BoxSize.Z) / num5; float num6 = dt; while (num6 > 0f) { float num7 = MathUtils.Min(num6, x); MoveWithCollision(num7, m_velocity * num7 + m_directMove); m_directMove = Vector3.Zero; num6 -= num7; } } CollisionVelocityChange = m_velocity - velocity; if (IsGroundDragEnabled && StandingOnValue.HasValue) { m_velocity = Vector3.Lerp(m_velocity, StandingOnVelocity, 6f * dt); } if (!StandingOnValue.HasValue) { IsSneaking = false; } UpdateImmersionData(); if (ImmersionFluidBlock is WaterBlock && ImmersionDepth > 0.3f && !m_fluidEffectsPlayed) { m_fluidEffectsPlayed = true; m_subsystemAudio.PlayRandomSound("Audio/WaterFallIn", m_random.Float(0.75f, 1f), m_random.Float(-0.3f, 0f), position, 4f, autoDelay: true); m_subsystemParticles.AddParticleSystem(new WaterSplashParticleSystem(m_subsystemTerrain, position, (BoundingBox.Max - BoundingBox.Min).Length() > 0.8f)); } else if (ImmersionFluidBlock is MagmaBlock && ImmersionDepth > 0f && !m_fluidEffectsPlayed) { m_fluidEffectsPlayed = true; m_subsystemAudio.PlaySound("Audio/SizzleLong", 1f, 0f, position, 4f, autoDelay: true); m_subsystemParticles.AddParticleSystem(new MagmaSplashParticleSystem(m_subsystemTerrain, position, (BoundingBox.Max - BoundingBox.Min).Length() > 0.8f)); } else if (ImmersionFluidBlock == null) { m_fluidEffectsPlayed = false; } }
public override void Animate() { Vector3 position = m_componentCreature.ComponentBody.Position; Vector3 vector = m_componentCreature.ComponentBody.Rotation.ToYawPitchRoll(); if (m_componentCreature.ComponentHealth.Health > 0f) { float num = 0f; float num2 = 0f; float num3 = 0f; float num4 = 0f; float num5 = 0f; if (base.MovementAnimationPhase != 0f && (m_componentCreature.ComponentBody.StandingOnValue.HasValue || m_componentCreature.ComponentBody.ImmersionFactor > 0f)) { if (m_gait == Gait.Canter) { float num6 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0f)); float num7 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.25f)); float num8 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.15f)); float num9 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.4f)); num = m_walkFrontLegsAngle * m_canterLegsAngleFactor * num6; num2 = m_walkFrontLegsAngle * m_canterLegsAngleFactor * num7; num3 = m_walkHindLegsAngle * m_canterLegsAngleFactor * num8; num4 = m_walkHindLegsAngle * m_canterLegsAngleFactor * num9; num5 = MathUtils.DegToRad(8f) * MathUtils.Sin((float)Math.PI * 2f * base.MovementAnimationPhase); } else if (m_gait == Gait.Trot) { float num10 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0f)); float num11 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.5f)); float num12 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.5f)); float num13 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0f)); num = m_walkFrontLegsAngle * num10; num2 = m_walkFrontLegsAngle * num11; num3 = m_walkHindLegsAngle * num12; num4 = m_walkHindLegsAngle * num13; num5 = MathUtils.DegToRad(3f) * MathUtils.Sin((float)Math.PI * 4f * base.MovementAnimationPhase); } else { float num14 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0f)); float num15 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.5f)); float num16 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.25f)); float num17 = MathUtils.Sin((float)Math.PI * 2f * (base.MovementAnimationPhase + 0.75f)); num = m_walkFrontLegsAngle * num14; num2 = m_walkFrontLegsAngle * num15; num3 = m_walkHindLegsAngle * num16; num4 = m_walkHindLegsAngle * num17; num5 = MathUtils.DegToRad(3f) * MathUtils.Sin((float)Math.PI * 4f * base.MovementAnimationPhase); } } float num18 = MathUtils.Min(12f * m_subsystemTime.GameTimeDelta, 1f); m_legAngle1 += num18 * (num - m_legAngle1); m_legAngle2 += num18 * (num2 - m_legAngle2); m_legAngle3 += num18 * (num3 - m_legAngle3); m_legAngle4 += num18 * (num4 - m_legAngle4); m_headAngleY += num18 * (num5 - m_headAngleY); Vector2 vector2 = m_componentCreature.ComponentLocomotion.LookAngles; vector2.Y += m_headAngleY; vector2.X = MathUtils.Clamp(vector2.X, 0f - MathUtils.DegToRad(65f), MathUtils.DegToRad(65f)); vector2.Y = MathUtils.Clamp(vector2.Y, 0f - MathUtils.DegToRad(55f), MathUtils.DegToRad(55f)); Vector2 vector3 = Vector2.Zero; if (m_neckBone != null) { vector3 = 0.6f * vector2; vector2 = 0.4f * vector2; } if (m_feedFactor > 0f) { float y = 0f - MathUtils.DegToRad(25f + 45f * SimplexNoise.OctavedNoise((float)m_subsystemTime.GameTime, 3f, 2, 2f, 0.75f)); vector2 = Vector2.Lerp(v2: new Vector2(0f, y), v1: vector2, f: m_feedFactor); if (m_moveLegWhenFeeding) { float x = MathUtils.DegToRad(20f) + MathUtils.PowSign(SimplexNoise.OctavedNoise((float)m_subsystemTime.GameTime, 1f, 1, 1f, 1f) - 0.5f, 0.33f) / 0.5f * MathUtils.DegToRad(25f) * (float)MathUtils.Sin(17.0 * m_subsystemTime.GameTime); num2 = MathUtils.Lerp(num2, x, m_feedFactor); } } if (m_buttFactor != 0f) { float y2 = (0f - MathUtils.DegToRad(40f)) * MathUtils.Sin((float)Math.PI * 2f * MathUtils.Sigmoid(m_buttPhase, 4f)); vector2 = Vector2.Lerp(v2: new Vector2(0f, y2), v1: vector2, f: m_buttFactor); } SetBoneTransform(m_bodyBone.Index, Matrix.CreateRotationY(vector.X) * Matrix.CreateTranslation(position.X, position.Y + base.Bob, position.Z)); SetBoneTransform(m_headBone.Index, Matrix.CreateRotationX(vector2.Y) * Matrix.CreateRotationZ(0f - vector2.X)); if (m_neckBone != null) { SetBoneTransform(m_neckBone.Index, Matrix.CreateRotationX(vector3.Y) * Matrix.CreateRotationZ(0f - vector3.X)); } SetBoneTransform(m_leg1Bone.Index, Matrix.CreateRotationX(m_legAngle1)); SetBoneTransform(m_leg2Bone.Index, Matrix.CreateRotationX(m_legAngle2)); SetBoneTransform(m_leg3Bone.Index, Matrix.CreateRotationX(m_legAngle3)); SetBoneTransform(m_leg4Bone.Index, Matrix.CreateRotationX(m_legAngle4)); } else { float num19 = 1f - base.DeathPhase; float num20 = (Vector3.Dot(m_componentFrame.Matrix.Right, base.DeathCauseOffset) > 0f) ? 1 : (-1); float num21 = m_componentCreature.ComponentBody.BoundingBox.Max.Y - m_componentCreature.ComponentBody.BoundingBox.Min.Y; SetBoneTransform(m_bodyBone.Index, Matrix.CreateTranslation(-0.5f * num21 * Vector3.UnitY * base.DeathPhase) * Matrix.CreateFromYawPitchRoll(vector.X, 0f, (float)Math.PI / 2f * base.DeathPhase * num20) * Matrix.CreateTranslation(0.2f * num21 * Vector3.UnitY * base.DeathPhase) * Matrix.CreateTranslation(position)); SetBoneTransform(m_headBone.Index, Matrix.CreateRotationX(MathUtils.DegToRad(50f) * base.DeathPhase)); if (m_neckBone != null) { SetBoneTransform(m_neckBone.Index, Matrix.Identity); } SetBoneTransform(m_leg1Bone.Index, Matrix.CreateRotationX(m_legAngle1 * num19)); SetBoneTransform(m_leg2Bone.Index, Matrix.CreateRotationX(m_legAngle2 * num19)); SetBoneTransform(m_leg3Bone.Index, Matrix.CreateRotationX(m_legAngle3 * num19)); SetBoneTransform(m_leg4Bone.Index, Matrix.CreateRotationX(m_legAngle4 * num19)); } base.Animate(); }
public override void OnChunkInitialized(TerrainChunk chunk) { if (!(Utils.SubsystemTerrain.TerrainContentsGenerator is TerrainContentsGenerator generator) || chunk.IsLoaded) { return; } int x = chunk.Coords.X - 1; int y = chunk.Coords.Y - 1; const int f1 = 0x63721054, f2 = 0x04317562, f3 = 0x52473601, f4 = 0x61234057, f5 = 0x07142563, f6 = 0x53721604, f7 = 0x64317052, f8 = 0x02473561, f9 = 0x51234607, fa = 0x67142053, fb = 0x03721564, fc = 0x54317602, fd = 0x62473051, fe = 0x01234567, ff = 0x57142603; Random random; for (int i = x; i < x + 2; i++) { int k, ix16 = i << 4; for (int j = y; j < y + 2; j++) { random = new Random(generator.m_seed + i + (f1 ^ f4 ^ f5 ^ f7 ^ fa ^ fc ^ fd) * j); int jx16 = j << 4; float num2 = generator.CalculateMountainRangeFactor(ix16, jx16); const int index = BasaltBlock.Index, index2 = BasaltBlock.Index; for (k = 1 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i ^ fe, j ^ ff, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(SmallBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 30), jx16 | (random.Int() & 15), index2 | (int)BrushType.Au << 15); } for (k = 1 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + 713, j + f3, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(SmallBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 30), jx16 | (random.Int() & 15), index2 | (int)BrushType.Ag << 15); } for (k = 1 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + f2, j + 396, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(PtBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 15), jx16 | (random.Int() & 15), index2 | (int)BrushType.Pt << 15); } for (k = 3 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + f6, j + 131, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | (int)BrushType.Pb << 15); } for (k = (int)(0.5f + 2f * num2 * SimplexNoise.OctavedNoise(i + 432, j + f9, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(BBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 15), jx16 | (random.Int() & 15), index | (int)BrushType.Hg << 15); } for (k = 3 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + 711, j + fb, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(BBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 40), jx16 | (random.Int() & 15), index | (int)BrushType.Sn << 15); } for (k = 2 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + f8, j + 272, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | (int)BrushType.Ti << 15); } for (k = 2 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + fa, j + fc, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(BBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | (int)BrushType.Cr << 15); } for (k = 2 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + f3, j + f6, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | (int)BrushType.Ni << 15); } for (k = 20 + (int)(8f * num2 * SimplexNoise.OctavedNoise(i + fa ^ f5 + f1, j + fc - f9, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintMaskSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | 65536 << 14); } for (k = 9 + (int)(8f * num2 * SimplexNoise.OctavedNoise(i + f5 ^ f8 + f1, j + f9 - fc, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintMaskSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 50), jx16 | (random.Int() & 15), index | 32768 << 14); } for (k = 1 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + fc, j + f9, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(SmallBrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(2, 20), jx16 | (random.Int() & 15), index2 | (int)BrushType.U << 15); } for (k = 3 + (int)(2f * num2 * SimplexNoise.OctavedNoise(i + f3, j + f1, 0.33f, 1, 1f, 1f)); k-- != 0;) { chunk.PaintFastSelective(ABrushes[random.Int() & 15].Cells, ix16 | (random.Int() & 15), random.UniformInt(45, 70), jx16 | (random.Int() & 15), 3 | (int)BrushType.P << 15); } if (generator.CalculateOceanShoreDistance(ix16, y << 4) < -90f) { int n = TerrainChunk.CalculateCellIndex(random.Int() & 15, 35, random.Int() & 15); for (k = 0; k < 45; k++) { if (Terrain.ExtractContents(chunk.GetCellValueFast(n + k)) == WaterBlock.Index && BlocksManager.Blocks[Terrain.ExtractContents(chunk.GetCellValueFast(n + k - 1))].IsCollidable) { chunk.SetCellValueFast(n + k, IceBlock.Index | 32 << 14); break; } } } } random = new Random(generator.m_seed ^ (x << 16 | y)); if ((random.Int() & 1) != 0) { chunk.PaintSelective(OilPocketCells[random.Int() & 15], x << 16 | (random.Int() & 15), random.UniformInt(40, 70), y << 16 | (random.Int() & 15), 3); } } }
public override bool OnAim(Ray3 aim, ComponentMiner componentMiner, AimState state) { IInventory inventory = componentMiner.Inventory; if (inventory != null) { int activeSlotIndex = inventory.ActiveSlotIndex; if (activeSlotIndex >= 0) { int slotValue = inventory.GetSlotValue(activeSlotIndex); int slotCount = inventory.GetSlotCount(activeSlotIndex); int num = Terrain.ExtractContents(slotValue); int data = Terrain.ExtractData(slotValue); int num2 = slotValue; int num3 = 0; if (num == 212 && slotCount > 0) { if (!m_aimStartTimes.TryGetValue(componentMiner, out double value)) { value = m_subsystemTime.GameTime; m_aimStartTimes[componentMiner] = value; } float num4 = (float)(m_subsystemTime.GameTime - value); float num5 = (float)MathUtils.Remainder(m_subsystemTime.GameTime, 1000.0); Vector3 v = ((componentMiner.ComponentCreature.ComponentBody.IsSneaking ? 0.01f : 0.03f) + 0.2f * MathUtils.Saturate((num4 - 2.5f) / 6f)) * new Vector3 { X = SimplexNoise.OctavedNoise(num5, 2f, 3, 2f, 0.5f), Y = SimplexNoise.OctavedNoise(num5 + 100f, 2f, 3, 2f, 0.5f), Z = SimplexNoise.OctavedNoise(num5 + 200f, 2f, 3, 2f, 0.5f) }; aim.Direction = Vector3.Normalize(aim.Direction + v); switch (state) { case AimState.InProgress: { if (num4 >= 10f) { componentMiner.ComponentCreature.ComponentCreatureSounds.PlayMoanSound(); return(true); } if (num4 > 0.5f && !MusketBlock.GetHammerState(Terrain.ExtractData(num2))) { num2 = Terrain.MakeBlockValue(num, 0, MusketBlock.SetHammerState(Terrain.ExtractData(num2), state: true)); m_subsystemAudio.PlaySound("Audio/HammerCock", 1f, m_random.Float(-0.1f, 0.1f), 0f, 0f); } ComponentFirstPersonModel componentFirstPersonModel = componentMiner.Entity.FindComponent <ComponentFirstPersonModel>(); if (componentFirstPersonModel != null) { componentMiner.ComponentPlayer?.ComponentAimingSights.ShowAimingSights(aim.Position, aim.Direction); componentFirstPersonModel.ItemOffsetOrder = new Vector3(-0.21f, 0.15f, 0.08f); componentFirstPersonModel.ItemRotationOrder = new Vector3(-0.7f, 0f, 0f); } componentMiner.ComponentCreature.ComponentCreatureModel.AimHandAngleOrder = 1.4f; componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemOffsetOrder = new Vector3(-0.08f, -0.08f, 0.07f); componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemRotationOrder = new Vector3(-1.7f, 0f, 0f); break; } case AimState.Cancelled: if (MusketBlock.GetHammerState(Terrain.ExtractData(num2))) { num2 = Terrain.MakeBlockValue(num, 0, MusketBlock.SetHammerState(Terrain.ExtractData(num2), state: false)); m_subsystemAudio.PlaySound("Audio/HammerUncock", 1f, m_random.Float(-0.1f, 0.1f), 0f, 0f); } m_aimStartTimes.Remove(componentMiner); break; case AimState.Completed: { bool flag = false; int value2 = 0; int num6 = 0; float s = 0f; Vector3 vector = Vector3.Zero; MusketBlock.LoadState loadState = MusketBlock.GetLoadState(data); BulletBlock.BulletType?bulletType = MusketBlock.GetBulletType(data); if (MusketBlock.GetHammerState(Terrain.ExtractData(num2))) { switch (loadState) { case MusketBlock.LoadState.Empty: componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Load gunpowder first", Color.White, blinking: true, playNotificationSound: false); break; case MusketBlock.LoadState.Gunpowder: case MusketBlock.LoadState.Wad: flag = true; componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("No bullet, blind shot fired", Color.White, blinking: true, playNotificationSound: false); break; case MusketBlock.LoadState.Loaded: flag = true; if (bulletType == BulletBlock.BulletType.Buckshot) { value2 = Terrain.MakeBlockValue(214, 0, BulletBlock.SetBulletType(0, BulletBlock.BulletType.BuckshotBall)); num6 = 8; vector = new Vector3(0.04f, 0.04f, 0.25f); s = 80f; } else if (bulletType == BulletBlock.BulletType.BuckshotBall) { value2 = Terrain.MakeBlockValue(214, 0, BulletBlock.SetBulletType(0, BulletBlock.BulletType.BuckshotBall)); num6 = 1; vector = new Vector3(0.06f, 0.06f, 0f); s = 60f; } else if (bulletType.HasValue) { value2 = Terrain.MakeBlockValue(214, 0, BulletBlock.SetBulletType(0, bulletType.Value)); num6 = 1; s = 120f; } break; } } if (flag) { if (componentMiner.ComponentCreature.ComponentBody.ImmersionFactor > 0.4f) { m_subsystemAudio.PlaySound("Audio/MusketMisfire", 1f, m_random.Float(-0.1f, 0.1f), componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition, 3f, autoDelay: true); } else { Vector3 vector2 = componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition + componentMiner.ComponentCreature.ComponentBody.Matrix.Right * 0.3f - componentMiner.ComponentCreature.ComponentBody.Matrix.Up * 0.2f; Vector3 vector3 = Vector3.Normalize(vector2 + aim.Direction * 10f - vector2); Vector3 vector4 = Vector3.Normalize(Vector3.Cross(vector3, Vector3.UnitY)); Vector3 v2 = Vector3.Normalize(Vector3.Cross(vector3, vector4)); for (int i = 0; i < num6; i++) { Vector3 v3 = m_random.Float(0f - vector.X, vector.X) * vector4 + m_random.Float(0f - vector.Y, vector.Y) * v2 + m_random.Float(0f - vector.Z, vector.Z) * vector3; Projectile projectile = m_subsystemProjectiles.FireProjectile(value2, vector2, s * (vector3 + v3), Vector3.Zero, componentMiner.ComponentCreature); if (projectile != null) { projectile.ProjectileStoppedAction = ProjectileStoppedAction.Disappear; } } m_subsystemAudio.PlaySound("Audio/MusketFire", 1f, m_random.Float(-0.1f, 0.1f), componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition, 10f, autoDelay: true); m_subsystemParticles.AddParticleSystem(new GunSmokeParticleSystem(m_subsystemTerrain, vector2 + 0.3f * vector3, vector3)); m_subsystemNoise.MakeNoise(vector2, 1f, 40f); componentMiner.ComponentCreature.ComponentBody.ApplyImpulse(-4f * vector3); } num2 = Terrain.MakeBlockValue(Terrain.ExtractContents(num2), 0, MusketBlock.SetLoadState(Terrain.ExtractData(num2), MusketBlock.LoadState.Empty)); num3 = 1; } if (MusketBlock.GetHammerState(Terrain.ExtractData(num2))) { num2 = Terrain.MakeBlockValue(Terrain.ExtractContents(num2), 0, MusketBlock.SetHammerState(Terrain.ExtractData(num2), state: false)); m_subsystemAudio.PlaySound("Audio/HammerRelease", 1f, m_random.Float(-0.1f, 0.1f), 0f, 0f); } m_aimStartTimes.Remove(componentMiner); break; } } } if (num2 != slotValue) { inventory.RemoveSlotItems(activeSlotIndex, 1); inventory.AddSlotItems(activeSlotIndex, num2, 1); } if (num3 > 0) { componentMiner.DamageActiveTool(num3); } } } return(false); }
public override bool OnAim(Ray3 aim, ComponentMiner componentMiner, AimState state) { IInventory inventory = componentMiner.Inventory; if (inventory != null) { int activeSlotIndex = inventory.ActiveSlotIndex; if (activeSlotIndex >= 0) { int slotValue = inventory.GetSlotValue(activeSlotIndex); int slotCount = inventory.GetSlotCount(activeSlotIndex); int num = Terrain.ExtractContents(slotValue); int data = Terrain.ExtractData(slotValue); if (num == 200 && slotCount > 0) { int draw = CrossbowBlock.GetDraw(data); if (!m_aimStartTimes.TryGetValue(componentMiner, out double value)) { value = m_subsystemTime.GameTime; m_aimStartTimes[componentMiner] = value; } float num2 = (float)(m_subsystemTime.GameTime - value); float num3 = (float)MathUtils.Remainder(m_subsystemTime.GameTime, 1000.0); Vector3 v = ((componentMiner.ComponentCreature.ComponentBody.IsSneaking ? 0.01f : 0.03f) + 0.15f * MathUtils.Saturate((num2 - 2.5f) / 6f)) * new Vector3 { X = SimplexNoise.OctavedNoise(num3, 2f, 3, 2f, 0.5f), Y = SimplexNoise.OctavedNoise(num3 + 100f, 2f, 3, 2f, 0.5f), Z = SimplexNoise.OctavedNoise(num3 + 200f, 2f, 3, 2f, 0.5f) }; aim.Direction = Vector3.Normalize(aim.Direction + v); switch (state) { case AimState.InProgress: { if (num2 >= 10f) { componentMiner.ComponentCreature.ComponentCreatureSounds.PlayMoanSound(); return(true); } ComponentFirstPersonModel componentFirstPersonModel = componentMiner.Entity.FindComponent <ComponentFirstPersonModel>(); if (componentFirstPersonModel != null) { componentMiner.ComponentPlayer?.ComponentAimingSights.ShowAimingSights(aim.Position, aim.Direction); componentFirstPersonModel.ItemOffsetOrder = new Vector3(-0.22f, 0.15f, 0.1f); componentFirstPersonModel.ItemRotationOrder = new Vector3(-0.7f, 0f, 0f); } componentMiner.ComponentCreature.ComponentCreatureModel.AimHandAngleOrder = 1.3f; componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemOffsetOrder = new Vector3(-0.08f, -0.1f, 0.07f); componentMiner.ComponentCreature.ComponentCreatureModel.InHandItemRotationOrder = new Vector3(-1.55f, 0f, 0f); break; } case AimState.Cancelled: m_aimStartTimes.Remove(componentMiner); break; case AimState.Completed: { ArrowBlock.ArrowType?arrowType = CrossbowBlock.GetArrowType(data); if (draw != 15) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Draw the crossbow first", Color.White, blinking: true, playNotificationSound: false); } else if (!arrowType.HasValue) { componentMiner.ComponentPlayer?.ComponentGui.DisplaySmallMessage("Load a bolt first", Color.White, blinking: true, playNotificationSound: false); } else { Vector3 vector = componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition + componentMiner.ComponentCreature.ComponentBody.Matrix.Right * 0.3f - componentMiner.ComponentCreature.ComponentBody.Matrix.Up * 0.2f; Vector3 v2 = Vector3.Normalize(vector + aim.Direction * 10f - vector); int value2 = Terrain.MakeBlockValue(192, 0, ArrowBlock.SetArrowType(0, arrowType.Value)); float s = 38f; if (m_subsystemProjectiles.FireProjectile(value2, vector, s * v2, Vector3.Zero, componentMiner.ComponentCreature) != null) { data = CrossbowBlock.SetArrowType(data, null); m_subsystemAudio.PlaySound("Audio/Bow", 1f, m_random.Float(-0.1f, 0.1f), componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition, 3f, 0.05f); } } inventory.RemoveSlotItems(activeSlotIndex, 1); int value3 = Terrain.MakeBlockValue(num, 0, CrossbowBlock.SetDraw(data, 0)); inventory.AddSlotItems(activeSlotIndex, value3, 1); if (draw > 0) { componentMiner.DamageActiveTool(1); m_subsystemAudio.PlaySound("Audio/CrossbowBoing", 1f, m_random.Float(-0.1f, 0.1f), componentMiner.ComponentCreature.ComponentCreatureModel.EyePosition, 3f, 0f); } m_aimStartTimes.Remove(componentMiner); break; } } } } } return(false); }