diff options
author | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
---|---|---|
committer | WlodekM <[email protected]> | 2024-06-16 10:35:45 +0300 |
commit | abef6da56913f1c55528103e60a50451a39628b1 (patch) | |
tree | b3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/EntityComponents.h |
initial commit
Diffstat (limited to 'src/EntityComponents.h')
-rw-r--r-- | src/EntityComponents.h | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/EntityComponents.h b/src/EntityComponents.h new file mode 100644 index 0000000..30f2882 --- /dev/null +++ b/src/EntityComponents.h @@ -0,0 +1,135 @@ +#ifndef CC_ENTITY_COMPONENTS_H +#define CC_ENTITY_COMPONENTS_H +#include "Vectors.h" +#include "Constants.h" +/* Various components for entities. + Copyright 2014-2023 ClassiCube | Licensed under BSD-3 +*/ + +struct Entity; +struct LocationUpdate; +struct LocalPlayer; + +/* Entity component that performs model animation depending on movement speed and time */ +struct AnimatedComp { + float BobbingHor, BobbingVer, BobbingModel; + float WalkTime, Swing, BobStrength; + float WalkTimeO, WalkTimeN, SwingO, SwingN, BobStrengthO, BobStrengthN; + + float LeftLegX, LeftLegZ, RightLegX, RightLegZ; + float LeftArmX, LeftArmZ, RightArmX, RightArmZ; +}; + +void AnimatedComp_Init(struct AnimatedComp* anim); +void AnimatedComp_Update(struct Entity* entity, Vec3 oldPos, Vec3 newPos, float delta); +void AnimatedComp_GetCurrent(struct Entity* entity, float t); + +/* Entity component that performs tilt animation depending on movement speed and time */ +struct TiltComp { + float TiltX, TiltY, VelTiltStrength; + float VelTiltStrengthO, VelTiltStrengthN; +}; + +void TiltComp_Init(struct TiltComp* anim); +void TiltComp_Update(struct LocalPlayer* p, struct TiltComp* anim, float delta); +void TiltComp_GetCurrent(struct LocalPlayer* p, struct TiltComp* anim, float t); + +/* Entity component that performs management of hack states */ +struct HacksComp { + cc_bool IsOp; + cc_bool Floating; /* true if NoClip or Flying */ + /* Speed player move at, relative to normal speed, when the 'speeding' input binding is active */ + float SpeedMultiplier; + /* Whether blocks that the player places that intersect themselves, should cause the player to + be pushed back in the opposite direction of the placed block */ + cc_bool PushbackPlacing; + /* Whether the player should be able to step up whole blocks, instead of just slabs */ + cc_bool FullBlockStep; + /* Whether user has allowed hacks as an option. Note 'can use X' set by the server override this */ + cc_bool Enabled; + + cc_bool CanAnyHacks, CanUseThirdPerson, CanSpeed, CanFly; + cc_bool CanRespawn, CanNoclip, CanPushbackBlocks,CanSeeAllNames; + cc_bool CanDoubleJump, CanBePushed; + float BaseHorSpeed; + /* Max amount of jumps the player can perform */ + int MaxJumps; + + /* Whether the player should slide after letting go of movement buttons in noclip */ + cc_bool NoclipSlide; + /* Whether the player has allowed the usage of fast double jumping abilities */ + cc_bool WOMStyleHacks; + + cc_bool Noclip, Flying, FlyingUp, FlyingDown, Speeding, HalfSpeeding; + float MaxHorSpeed; + cc_string HacksFlags; + char __HacksFlagsBuffer[STRING_SIZE * 2]; +}; + +void HacksComp_Init(struct HacksComp* hacks); +cc_bool HacksComp_CanJumpHigher(struct HacksComp* hacks); +/* Determines hacks permissions based on flags, then calls HacksComp_Update */ +/* e.g. +ophax allows all hacks if op, -push disables entity pushing */ +void HacksComp_RecheckFlags(struct HacksComp* hacks); +/* Updates state based on permissions (e.g. Flying set to false if CanFly is false) */ +/* Raises UserEvents.HackPermsChanged */ +void HacksComp_Update(struct HacksComp* hacks); +void HacksComp_SetFlying(struct HacksComp* hacks, cc_bool flying); +void HacksComp_SetNoclip(struct HacksComp* hacks, cc_bool noclip); +float HacksComp_CalcSpeedFactor(struct HacksComp* hacks, cc_bool canSpeed); + +#define InterpComp_Layout int RotYCount; float RotYStates[15]; +/* Base entity component that performs interpolation of position and orientation */ +struct InterpComp { InterpComp_Layout }; + +void LocalInterpComp_SetLocation(struct InterpComp* interp, struct LocationUpdate* update, struct Entity* e); +void LocalInterpComp_AdvanceState(struct InterpComp* interp, struct Entity* e); + +/* Represents a network orientation state */ +struct NetInterpAngles { float Pitch, Yaw, RotX, RotZ; }; + +/* Entity component that performs interpolation for network players */ +struct NetInterpComp { + InterpComp_Layout + /* Last known position and orientation sent by the server */ + Vec3 CurPos; struct NetInterpAngles CurAngles; + /* Interpolated position and orientation state */ + int PositionsCount, AnglesCount; + Vec3 Positions[10]; struct NetInterpAngles Angles[10]; +}; + +void NetInterpComp_SetLocation(struct NetInterpComp* interp, struct LocationUpdate* update, struct Entity* e); +void NetInterpComp_AdvanceState(struct NetInterpComp* interp, struct Entity* e); + +/* Entity component that performs collision detection */ +struct CollisionsComp { + struct Entity* Entity; + cc_bool HitXMin, HitYMin, HitZMin, HitXMax, HitYMax, HitZMax, WasOn; + float StepSize; +}; +cc_bool Collisions_HitHorizontal(struct CollisionsComp* comp); +void Collisions_MoveAndWallSlide(struct CollisionsComp* comp); + +/* Entity component that performs collisions */ +struct PhysicsComp { + cc_bool UseLiquidGravity; /* used by BlockDefinitions */ + cc_bool CanLiquidJump, Jumping; + int MultiJumps; + struct Entity* Entity; + + float JumpVel, UserJumpVel, ServerJumpVel; + struct HacksComp* Hacks; + struct CollisionsComp* Collisions; +}; + +void PhysicsComp_Init(struct PhysicsComp* comp, struct Entity* entity); +void PhysicsComp_UpdateVelocityState(struct PhysicsComp* comp); +void PhysicsComp_DoNormalJump(struct PhysicsComp* comp); +void PhysicsComp_PhysicsTick(struct PhysicsComp* comp, Vec3 vel); +float PhysicsComp_CalcJumpVelocity(float jumpHeight); +double PhysicsComp_CalcMaxHeight(float u); +void PhysicsComp_DoEntityPush(struct Entity* entity); + +/* Entity component that plays block step sounds */ +void SoundComp_Tick(struct LocalPlayer* p, cc_bool wasOnGround); +#endif |